From f9b5183aa88ebcc4f3db2dbe30bc8659390cb6dc Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 25 Dec 2023 10:36:28 +0800 Subject: [PATCH] Support evaluateJavascript --- .../java/com/fongmi/android/tv/bean/Rule.java | 6 +++ .../android/tv/ui/custom/CustomWebView.java | 40 ++++++++++++------- .../com/fongmi/android/tv/utils/Sniffer.java | 7 ++++ 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Rule.java b/app/src/main/java/com/fongmi/android/tv/bean/Rule.java index 34668ee36..a4b09b30b 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Rule.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Rule.java @@ -21,6 +21,8 @@ public class Rule { private List hosts; @SerializedName("regex") private List regex; + @SerializedName("script") + private List script; public static Rule create(String name) { return new Rule(name); @@ -48,6 +50,10 @@ public class Rule { return regex == null ? Collections.emptyList() : regex; } + public List getScript() { + return script == null ? Collections.emptyList() : script; + } + @Override public boolean equals(@Nullable Object obj) { if (this == obj) return true; diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java index 2e590c123..45da19d6a 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.Context; import android.graphics.Bitmap; +import android.net.Uri; import android.net.http.SslError; import android.text.TextUtils; import android.view.ViewGroup; @@ -27,6 +28,7 @@ import com.github.catvod.crawler.Spider; import com.google.common.net.HttpHeaders; import java.io.ByteArrayInputStream; +import java.util.List; import java.util.Map; public class CustomWebView extends WebView { @@ -87,9 +89,9 @@ public class CustomWebView extends WebView { String url = request.getUrl().toString(); String host = request.getUrl().getHost(); if (TextUtils.isEmpty(host) || ApiConfig.get().getAds().contains(host)) return empty; - if (host.equals("challenges.cloudflare.com")) App.post(() -> showDialog()); + if (url.contains("challenges.cloudflare.com/cdn-cgi/")) App.post(() -> showDialog()); Map headers = request.getRequestHeaders(); - if (isVideoFormat(headers, url)) post(headers, url); + if (isVideoFormat(headers, url)) interrupt(headers, url); return super.shouldInterceptRequest(view, request); } @@ -99,6 +101,12 @@ public class CustomWebView extends WebView { if (dialog != null) hideDialog(); } + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + evaluate(Sniffer.getScript(Uri.parse(url))); + } + @Override @SuppressLint("WebViewClientOnReceivedSslError") public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { @@ -112,6 +120,21 @@ public class CustomWebView extends WebView { }; } + private void showDialog() { + if (dialog != null) return; + if (getParent() != null) ((ViewGroup) getParent()).removeView(this); + dialog = new AlertDialog.Builder(App.activity()).setView(this).show(); + } + + private void hideDialog() { + if (dialog != null) dialog.dismiss(); + dialog = null; + } + + private void evaluate(List script) { + if (script.size() > 0) evaluateJavascript(script.get(0), value -> evaluate(script.subList(1, script.size()))); + } + private boolean isVideoFormat(Map headers, String url) { try { Site site = ApiConfig.get().getSite(key); @@ -123,23 +146,12 @@ public class CustomWebView extends WebView { } } - private void post(Map headers, String url) { + private void interrupt(Map headers, String url) { String cookie = CookieManager.getInstance().getCookie(url); if (cookie != null) headers.put(HttpHeaders.COOKIE, cookie); onParseSuccess(headers, url); } - private void showDialog() { - if (dialog != null) return; - if (getParent() != null) ((ViewGroup) getParent()).removeView(this); - dialog = new AlertDialog.Builder(App.activity()).setView(this).show(); - } - - private void hideDialog() { - if (dialog != null) dialog.dismiss(); - dialog = null; - } - private void onParseSuccess(Map headers, String url) { if (callback != null) callback.onParseSuccess(headers, url, from); App.post(() -> stop(false)); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java index 42104c066..8f67d149d 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java @@ -67,4 +67,11 @@ public class Sniffer { for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (Util.containOrMatch(hosts, host)) return rule.getRegex(); return Collections.emptyList(); } + + public static List getScript(Uri uri) { + if (uri.getHost() == null) return Collections.emptyList(); + String hosts = TextUtils.join(",", Arrays.asList(UrlUtil.host(uri), UrlUtil.host(uri.getQueryParameter("url")))); + for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (Util.containOrMatch(hosts, host)) return rule.getScript(); + return Collections.emptyList(); + } }