Files
FLYSN/app/src/main/java/com/info/sn/utils/URLUtils.java
tongtongstudio 88f65afb48 version:1.8.5
date:2021-12-03 15:42:13
fix:
add:准备移植到老人平板项目
2021-12-03 15:43:25 +08:00

355 lines
15 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.info.sn.utils;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.WebSettings;
import androidx.annotation.RequiresApi;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
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;
}
@RequiresApi(api = Build.VERSION_CODES.O)
public void setBrowserList() {
String oldwhiteList = JGYUtils.getString(mContext.getContentResolver(), "DeselectBrowserArray");
String oldHomePage = JGYUtils.getString(mContext.getContentResolver(), "homepagURL");
Log.e(TAG, "setBrowserList old: " + oldwhiteList);
if (TextUtils.isEmpty(oldwhiteList) && TextUtils.isEmpty(oldHomePage)) {
Log.e(TAG, "getBrowserWhiteList: " + "oldwhiteList is empty");
Settings.System.putString(mContext.getContentResolver(), "DeselectBrowserArray", "Invalid");
} else {
HashSet<String> URLList = new HashSet<>();
if (!TextUtils.isEmpty(oldwhiteList)) {
URLList.addAll(Arrays.asList(oldwhiteList.split(",")));
}
URLList.add("https://xdf.gankao.com");
URLList.add("https://www.gankao.com");
if (!TextUtils.isEmpty(oldHomePage) && !URLList.contains(oldHomePage)) {
URLList.add(oldHomePage);
}
URLList.removeIf(s -> TextUtils.isEmpty(s.trim()));
if (URLList.size() == 0) {
Log.e(TAG, "setBrowserWhiteList: URLList set is empty , set Invalid");
Settings.System.putString(mContext.getContentResolver(), "DeselectBrowserArray", "Invalid");
return;
}
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) {
Log.e(TAG, "subscribe: " + url);
if (TextUtils.isEmpty(url.trim())) {
continue;
}
if (haveDomain(url)) {
nohttpURLList.add("m." + getDomain(url));
}
if (!url.startsWith("http")) {
nohttpURLList.add(url);
String httpsUrl = "https://" + url;
String httpUrl = "http://" + url;
emitter.onNext(getOkHttpURL(httpsUrl));
emitter.onNext(getOkHttpURL(httpUrl));
baseURLList.add(httpsUrl);
String pattern = "(http|https)://(www.)?(\\w+(\\.)?)+";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(httpsUrl);
while (m.find()) {
Log.e(TAG, "matcher1: " + m.group());
baseURLList.add(m.group());
}
} else {
if (url.endsWith("/")) {
baseURLList.add(url.substring(0, url.length() - 1));
}
//临时
if (baseURLList.size() != 0) {
Settings.System.putString(mContext.getContentResolver(), "DeselectBrowserArray", String.join(",", baseURLList));
}
Log.e(TAG, "subscribe: baseURLList: " + baseURLList);
Log.e(TAG, "subscribe: DeselectBrowserArray: " + Settings.System.getString(mContext.getContentResolver(), "DeselectBrowserArray"));
String pattern = "[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\\.?";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(url);
if (m.find()) {
nohttpURLList.add(m.group());
Log.e(TAG, "matcher2: " + m.group());
String httpsUrl = "https://" + m.group();
String httpUrl = "http://" + m.group();
emitter.onNext(getOkHttpURL(httpsUrl));
emitter.onNext(getOkHttpURL(httpUrl));
}
}
}
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) && !TextUtils.isEmpty(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: ");
baseURLList.addAll(nohttpURLList);
baseURLList.removeIf(TextUtils::isEmpty);
String DeselectBrowserArray = String.join(",", baseURLList);
boolean write = Settings.System.putString(mContext.getContentResolver(), "DeselectBrowserArray", DeselectBrowserArray);
Log.e(TAG, "onComplete: " + "white list: " + DeselectBrowserArray);
Log.e(TAG, "onComplete: " + "write :" + write);
}
});
}
}
private HashSet<String> blackList = new HashSet<>();
private HashSet<String> blackIPList = new HashSet<>();
public void setBrowserBlackList() {
String qch_webblack_url = Settings.System.getString(mContext.getContentResolver(), "qch_webblack_url");
Log.e(TAG, "setBrowserBlackList: qch_webblack_url = " + qch_webblack_url);
if (TextUtils.isEmpty(qch_webblack_url)) {
Settings.System.putString(mContext.getContentResolver(), "qch_webblack_url", "Invalid");
} else {
String black_ip = (String) SPUtils.get(mContext, "black_ip", "");
if (!TextUtils.isEmpty(black_ip)) {
blackIPList = new HashSet<>(Arrays.asList(black_ip.split(",")));
}
blackIPList.removeIf(TextUtils::isEmpty);
HashSet<String> URLList = new HashSet<>(Arrays.asList(qch_webblack_url.trim().split(",")));
for (String url : URLList) {
if (TextUtils.isEmpty(url)) {
continue;
}
Log.e(TAG, "setBrowserBlackList: url: " + url);
if (qch_webblack_url.startsWith("http://")) {
blackList.add(url);
blackList.add(url.replace("http://", "https://"));
} else if (qch_webblack_url.startsWith("https://")) {
blackList.add(url);
blackList.add(url.replace("https://", "http://"));
} else {
blackList.add("http://" + url);
blackList.add("https://" + url);
}
}
blackList.addAll(blackIPList);
blackList.removeIf(TextUtils::isEmpty);
Log.e(TAG, "setBrowserBlackList: blackList: " + blackList);
boolean write = Settings.System.putString(mContext.getContentResolver(), "qch_webblack_url", String.join(",", blackList));
Log.e(TAG, "setBrowserBlackList: write: " + write);
}
}
private String getOkHttpURL(String URL) {
if (!URL.startsWith("http")) {
return "";
}
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.SECONDS)
.writeTimeout(1, TimeUnit.SECONDS)
.readTimeout(1, TimeUnit.SECONDS)
.build();
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 "";
}
}
//https://blog.csdn.net/yong472727322/article/details/73321935
//https://blog.csdn.net/liehuo123/article/details/81509486?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-1&spm=1001.2101.3001.4242
//https://www.cnblogs.com/breakdown/archive/2012/09/17/2689101.html
/**
* 获取主机名
*
* @param url 网址
* @return
*/
//https://blog.csdn.net/smallnetvisitor/article/details/84516347
public String getDomain(String url) {
String regexStr = "(?<=//|)((\\w)+(\\.cn|\\.com.cn|\\.org.cn|\\.com|\\.net|\\.org|\\.cc|\\.biz|\\.uk|\\.info|\\.in|\\.eu))+";
Pattern p = Pattern.compile(regexStr);
Matcher m = p.matcher(url);
String domainVal = "";
if (m.find()) {
domainVal = m.group();
}
return domainVal;
}
public boolean haveDomain(String url) {
String regexStr = "(?<=//|)((\\w)+(\\.cn|\\.com.cn|\\.org.cn|\\.com|\\.net|\\.org|\\.cc|\\.biz|\\.uk|\\.info|\\.in|\\.eu))+";
Pattern p = Pattern.compile(regexStr);
Matcher m = p.matcher(url);
return m.find();
}
/**
* 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();
}
}