254 lines
9.6 KiB
Java
254 lines
9.6 KiB
Java
package com.info.sn.utils;
|
||
|
||
import android.content.Context;
|
||
import android.os.Build;
|
||
import android.text.TextUtils;
|
||
import android.util.Log;
|
||
import android.webkit.WebSettings;
|
||
|
||
import java.io.IOException;
|
||
import java.net.URI;
|
||
import java.util.ArrayList;
|
||
import java.util.Arrays;
|
||
import java.util.HashSet;
|
||
import java.util.function.Predicate;
|
||
import java.util.regex.Matcher;
|
||
import java.util.regex.Pattern;
|
||
|
||
import io.reactivex.Observable;
|
||
import io.reactivex.ObservableEmitter;
|
||
import io.reactivex.ObservableOnSubscribe;
|
||
import io.reactivex.Observer;
|
||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||
import io.reactivex.disposables.Disposable;
|
||
import io.reactivex.schedulers.Schedulers;
|
||
import okhttp3.Call;
|
||
import okhttp3.OkHttpClient;
|
||
import okhttp3.Request;
|
||
import okhttp3.Response;
|
||
|
||
public class URLUtils {
|
||
private static String TAG = URLUtils.class.getSimpleName();
|
||
private Context mContext;
|
||
private HashSet<String> baseURLList = new HashSet<>();
|
||
private HashSet<String> nohttpURLList = new HashSet<>();
|
||
|
||
public URLUtils(Context context) {
|
||
this.mContext = context;
|
||
}
|
||
|
||
public void setBrowserList() {
|
||
String whiteList = JGYUtils.getString(mContext.getContentResolver(), "DeselectBrowserArray");
|
||
String homePage = JGYUtils.getString(mContext.getContentResolver(), "homepagURL");
|
||
Log.e(TAG, "setBrowserList old: " + whiteList);
|
||
|
||
HashSet<String> URLList = new HashSet<>();
|
||
if (!TextUtils.isEmpty(whiteList)){
|
||
URLList.addAll(Arrays.asList(whiteList.split(",")));
|
||
}
|
||
URLList.add("https://xdf.gankao.com");
|
||
URLList.add("https://www.gankao.com");
|
||
if (!TextUtils.isEmpty(homePage)) {
|
||
if (!URLList.contains(homePage)) {
|
||
URLList.add(homePage);
|
||
}
|
||
}
|
||
URLList.removeIf(new Predicate<String>() {
|
||
@Override
|
||
public boolean test(String s) {
|
||
return TextUtils.isEmpty(s.trim());
|
||
}
|
||
});
|
||
Log.e(TAG, "setBrowserList: " + URLList);
|
||
Observable.create(new ObservableOnSubscribe<String>() {
|
||
@Override
|
||
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
|
||
baseURLList.clear();
|
||
baseURLList.addAll(URLList);
|
||
for (String url : URLList) {
|
||
if (TextUtils.isEmpty(url.trim())){
|
||
continue;
|
||
}
|
||
if (url.startsWith("http://")) {
|
||
String noHttp = url.substring(7);
|
||
if (!baseURLList.contains(noHttp)) {
|
||
baseURLList.add(noHttp);
|
||
}
|
||
emitter.onNext(getOkHttpURL(url));
|
||
} else if (url.startsWith("https://")) {
|
||
String noHttps = url.substring(8);
|
||
if (!baseURLList.contains(noHttps)) {
|
||
baseURLList.add(noHttps);
|
||
}
|
||
emitter.onNext(getOkHttpURL(url));
|
||
} else {
|
||
baseURLList.add("http://" + url);
|
||
emitter.onNext(getOkHttpURL("http://" + url));
|
||
baseURLList.add("https://" + url);
|
||
emitter.onNext(getOkHttpURL("https://" + url));
|
||
}
|
||
Log.e(TAG, "subscribe: " + url);
|
||
}
|
||
emitter.onComplete();
|
||
}
|
||
}).subscribeOn(Schedulers.io())
|
||
.observeOn(AndroidSchedulers.mainThread())
|
||
.subscribe(new Observer<String>() {
|
||
@Override
|
||
public void onSubscribe(Disposable d) {
|
||
|
||
}
|
||
|
||
@Override
|
||
public void onNext(String s) {
|
||
Log.e(TAG, "onNext: " + s);
|
||
if (!baseURLList.contains(s)) {
|
||
baseURLList.add(s);
|
||
}
|
||
if (s.startsWith("http://")) {
|
||
String noHttp = s.substring(7);
|
||
Log.e(TAG, "onNext: noHttp: " + noHttp);
|
||
if (!baseURLList.contains(noHttp)) {
|
||
baseURLList.add(noHttp);
|
||
}
|
||
}
|
||
if (s.startsWith("https://")) {
|
||
String noHttps = s.substring(8);
|
||
Log.e(TAG, "onNext: noHttps: " + noHttps);
|
||
if (!baseURLList.contains(noHttps)) {
|
||
baseURLList.add(noHttps);
|
||
}
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onError(Throwable e) {
|
||
Log.e(TAG, "onError: " + e.getMessage());
|
||
}
|
||
|
||
@Override
|
||
public void onComplete() {
|
||
Log.e(TAG, "onComplete: ");
|
||
StringBuilder stringBuilder = new StringBuilder();
|
||
for (String s : baseURLList) {
|
||
if (stringBuilder.length() > 0) {
|
||
stringBuilder.append(",");
|
||
}
|
||
stringBuilder.append(s);
|
||
}
|
||
String DeselectBrowserArray = stringBuilder.toString();
|
||
boolean write = JGYUtils.putString(mContext.getContentResolver(), "DeselectBrowserArray", DeselectBrowserArray);
|
||
Log.e(TAG, "onComplete: " + "white list: " + DeselectBrowserArray);
|
||
Log.e(TAG, "onComplete: " + "write :" + write);
|
||
}
|
||
});
|
||
}
|
||
|
||
private String getOkHttpURL(String URL) {
|
||
OkHttpClient okHttpClient = new OkHttpClient();
|
||
final Request request = new Request.Builder()
|
||
.url(URL)
|
||
.removeHeader("User-Agent")
|
||
.addHeader("User-Agent", getUserAgent())
|
||
.get()//默认就是GET请求,可以不写
|
||
.build();
|
||
Call call = okHttpClient.newCall(request);
|
||
// call.enqueue(new Callback() {
|
||
// @Override
|
||
// public void onFailure(Call call, IOException e) {
|
||
// Log.e(TAG, "onFailure: ");
|
||
// }
|
||
//
|
||
// @Override
|
||
// public void onResponse(Call call, Response response) throws IOException {
|
||
// Log.e(TAG, "onResponse: " + getIP(response.request().url().uri()));
|
||
// }
|
||
// });
|
||
try {
|
||
Response response = call.execute();
|
||
if (response.isSuccessful()) {
|
||
Log.e(TAG, "getOkHttpURL: " + response.request().url().toString());
|
||
return getIP(response.request().url().uri()).toString();
|
||
} else {
|
||
return "";
|
||
}
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
Log.e(TAG, "getOkHttpURL: " + e.getMessage());
|
||
return "";
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Gets ip.
|
||
* 通过url获取到域名
|
||
*
|
||
* @param url the url
|
||
* @return the ip
|
||
*/
|
||
public String getIP(String url) {
|
||
//使用正则表达式过滤,
|
||
String re = "((http|ftp|https)://)(([a-zA-Z0-9._-]+)|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))(([a-zA-Z]{2,6})|(:[0-9]{1,4})?)";
|
||
String str = "";
|
||
// 编译正则表达式
|
||
Pattern pattern = Pattern.compile(re);
|
||
// 忽略大小写的写法
|
||
// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
|
||
Matcher matcher = pattern.matcher(url);
|
||
//若url==http://127.0.0.1:9040或www.baidu.com的,正则表达式表示匹配
|
||
if (matcher.matches()) {
|
||
str = url;
|
||
} else {
|
||
String[] split2 = url.split(re);
|
||
if (split2.length > 1) {
|
||
String substring = url.substring(0, url.length() - split2[1].length());
|
||
str = substring;
|
||
} else {
|
||
str = split2[0];
|
||
}
|
||
}
|
||
return str;
|
||
}
|
||
|
||
private URI getIP(URI uri) {
|
||
URI effectiveURI = null;
|
||
try {
|
||
// URI(String scheme, String userInfo, String host, int port, String
|
||
// path, String query,String fragment)
|
||
effectiveURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null);
|
||
} catch (Throwable var4) {
|
||
effectiveURI = null;
|
||
}
|
||
return effectiveURI;
|
||
}
|
||
|
||
/**
|
||
* @return 获取浏览器的UA
|
||
*/
|
||
private String getUserAgent() {
|
||
String userAgent = "";
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||
try {
|
||
userAgent = WebSettings.getDefaultUserAgent(mContext);
|
||
//需要hook webview
|
||
} catch (Exception e) {
|
||
Log.e(TAG, "getUserAgent: " + e.getMessage());
|
||
userAgent = System.getProperty("http.agent");
|
||
}
|
||
} else {
|
||
userAgent = System.getProperty("http.agent");
|
||
}
|
||
StringBuffer sb = new StringBuffer();
|
||
for (int i = 0, length = userAgent.length(); i < length; i++) {
|
||
char c = userAgent.charAt(i);
|
||
if (c <= '\u001f' || c >= '\u007f') {
|
||
sb.append(String.format("\\u%04x", (int) c));
|
||
} else {
|
||
sb.append(c);
|
||
}
|
||
}
|
||
// Log.e(TAG, "getUserAgent: " + sb.toString());
|
||
return sb.toString();
|
||
}
|
||
}
|