From acd8a217e1bb84d823c615acbfb4dd9eb0f555d3 Mon Sep 17 00:00:00 2001 From: jun <215613905@qq.com> Date: Sat, 19 Apr 2025 15:07:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E5=88=99rules=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=85=BC=E5=AE=B9script{"name":=20"=E5=89=A7=E5=9C=88=E5=9C=88?= =?UTF-8?q?","hosts":=20["jqqzx"],"script":=20["document.getElementById('p?= =?UTF-8?q?layleft').children[0].contentWindow.document.getElementById('st?= =?UTF-8?q?art').click()"]}=20=E4=BC=98=E5=8C=96=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=8E=86=E5=8F=B2;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/github/tvbox/osc/api/ApiConfig.java | 16 ++++++++ .../osc/player/controller/VodController.java | 38 ++++++++++++++++++ .../osc/ui/activity/FastSearchActivity.java | 39 +++++-------------- .../tvbox/osc/ui/activity/PlayActivity.java | 23 +++-------- .../tvbox/osc/ui/activity/SearchActivity.java | 8 +--- .../tvbox/osc/ui/fragment/PlayFragment.java | 30 ++++---------- .../github/tvbox/osc/util/HistoryHelper.java | 21 ++++++++-- .../tvbox/osc/util/VideoParseRuler.java | 25 +++++++++++- 8 files changed, 120 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java index 80813e10..be58fb88 100644 --- a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java @@ -549,6 +549,7 @@ public class ApiConfig { VideoParseRuler.clearRule(); for(JsonElement oneHostRule : infoJson.getAsJsonArray("rules")) { JsonObject obj = (JsonObject) oneHostRule; + //嗅探过滤规则 if (obj.has("host")) { String host = obj.get("host").getAsString(); if (obj.has("rule")) { @@ -574,6 +575,7 @@ public class ApiConfig { } } } + //广告过滤规则 if (obj.has("hosts") && obj.has("regex")) { ArrayList rule = new ArrayList<>(); ArrayList ads = new ArrayList<>(); @@ -590,6 +592,20 @@ public class ApiConfig { VideoParseRuler.addHostRegex(host, ads); } } + //嗅探脚本规则 如 click + if (obj.has("hosts") && obj.has("script")) { + ArrayList scripts = new ArrayList<>(); + JsonArray scriptArray = obj.getAsJsonArray("script"); + for (JsonElement one : scriptArray) { + String script = one.getAsString(); + scripts.add(script); + } + JsonArray array = obj.getAsJsonArray("hosts"); + for (JsonElement one : array) { + String host = one.getAsString(); + VideoParseRuler.addHostScript(host, scripts); + } + } } } diff --git a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java index d1204c6f..78aaafa2 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java +++ b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java @@ -4,11 +4,13 @@ import android.app.Activity; import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.ActivityInfo; +import android.os.Build; import android.os.Handler; import android.os.Message; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import android.webkit.WebView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; @@ -23,6 +25,7 @@ import com.github.tvbox.osc.R; import com.github.tvbox.osc.api.ApiConfig; import com.github.tvbox.osc.bean.IJKCode; import com.github.tvbox.osc.bean.ParseBean; +import com.github.tvbox.osc.bean.SourceBean; import com.github.tvbox.osc.server.ControlManager; import com.github.tvbox.osc.server.RemoteServer; import com.github.tvbox.osc.subtitle.widget.SimpleSubtitleView; @@ -36,6 +39,7 @@ import com.github.tvbox.osc.util.M3u8; import com.github.tvbox.osc.util.PlayerHelper; import com.github.tvbox.osc.util.ScreenUtils; import com.github.tvbox.osc.util.SubtitleHelper; +import com.github.tvbox.osc.util.VideoParseRuler; import com.lzy.okgo.OkGo; import com.lzy.okgo.callback.AbsCallback; import com.lzy.okgo.model.HttpHeaders; @@ -48,6 +52,7 @@ import org.jetbrains.annotations.NotNull; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.xwalk.core.XWalkView; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; @@ -1362,4 +1367,37 @@ public class VodController extends BaseController { } return url; } + + public void evaluateScript(SourceBean sourceBean,String url, WebView web_view, XWalkView xWalk_view){ + String clickSelector = sourceBean.getClickSelector().trim(); + clickSelector=clickSelector.isEmpty()?VideoParseRuler.getHostScript(url):clickSelector; + if (!clickSelector.isEmpty()) { + String selector; + if (clickSelector.contains(";") && !clickSelector.endsWith(";")) { + String[] parts = clickSelector.split(";", 2); + if (!url.contains(parts[0])) { + return; + } + selector = parts[1].trim(); + } else { + selector = clickSelector.trim(); + } + // 构造点击的 JS 代码 + String js = selector; +// if(!selector.contains("click()"))js+=".click();"; + LOG.i("echo-javascript:" + js); + if(web_view!=null){ + //4.4以上才支持这种写法 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + web_view.evaluateJavascript(js, null); + } else { + web_view.loadUrl("javascript:" + js); + } + } + if(xWalk_view!=null){ + //4.0+开始全部支持这种写法 + xWalk_view.evaluateJavascript(js, null); + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/FastSearchActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/FastSearchActivity.java index 16ca403f..7c26c14e 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/FastSearchActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/FastSearchActivity.java @@ -26,11 +26,10 @@ import com.github.tvbox.osc.ui.adapter.FastListAdapter; import com.github.tvbox.osc.ui.adapter.FastSearchAdapter; import com.github.tvbox.osc.ui.adapter.SearchWordAdapter; import com.github.tvbox.osc.util.FastClickCheckUtil; -import com.github.tvbox.osc.util.HawkConfig; +import com.github.tvbox.osc.util.HistoryHelper; import com.github.tvbox.osc.util.SearchHelper; import com.github.tvbox.osc.viewmodel.SourceViewModel; import com.lzy.okgo.OkGo; -import com.orhanobut.hawk.Hawk; import com.owen.tvrecyclerview.widget.TvRecyclerView; import com.owen.tvrecyclerview.widget.V7GridLayoutManager; import com.owen.tvrecyclerview.widget.V7LinearLayoutManager; @@ -60,12 +59,7 @@ public class FastSearchActivity extends BaseActivity { private TvRecyclerView mGridViewWord; private TvRecyclerView mGridViewWordFenci; SourceViewModel sourceViewModel; - // private EditText etSearch; -// private TextView tvSearch; -// private TextView tvClear; -// private SearchKeyboard keyboard; -// private TextView tvAddress; -// private ImageView ivQRCode; + private SearchWordAdapter searchWordAdapter; private FastSearchAdapter searchAdapter; private FastSearchAdapter searchAdapterFilter; @@ -75,10 +69,10 @@ public class FastSearchActivity extends BaseActivity { private boolean isFilterMode = false; private String searchFilterKey = ""; // 过滤的key private HashMap> resultVods; // 搜索结果 - private List quickSearchWord = new ArrayList<>(); + private final List quickSearchWord = new ArrayList<>(); private HashMap mCheckSources = null; - private View.OnFocusChangeListener focusChangeListener = new View.OnFocusChangeListener() { + private final View.OnFocusChangeListener focusChangeListener = new View.OnFocusChangeListener() { @Override public void onFocusChange(View itemView, boolean hasFocus) { try { @@ -141,13 +135,6 @@ public class FastSearchActivity extends BaseActivity { spListAdapter = new FastListAdapter(); mGridViewWord.setAdapter(spListAdapter); - -// mGridViewWord.setFocusable(true); -// mGridViewWord.setOnFocusChangeListener(new View.OnFocusChangeListener() { -// @Override -// public void onFocusChange(View itemView, boolean hasFocus) {} -// }); - mGridViewWord.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() { @Override public void onChildViewAttachedToWindow(@NonNull View child) { @@ -157,9 +144,6 @@ public class FastSearchActivity extends BaseActivity { if (t.getText() == "全部") { t.requestFocus(); } -// if (child.isFocusable() && null == child.getOnFocusChangeListener()) { -// child.setOnFocusChangeListener(focusChangeListener); -// } } @Override @@ -254,7 +238,7 @@ public class FastSearchActivity extends BaseActivity { } private void filterResult(String spName) { - if (spName == "全部") { + if (spName.equals("全部")) { mGridView.setVisibility(View.VISIBLE); mGridViewFilter.setVisibility(View.GONE); return; @@ -372,18 +356,13 @@ public class FastSearchActivity extends BaseActivity { spNames.clear(); //写入历史记录 - ArrayList history = Hawk.get(HawkConfig.SEARCH_HISTORY, new ArrayList()); - if (!history.contains(title)) - history.add(0, title); - if (history.size() > 10) - history.remove(10); - Hawk.put(HawkConfig.SEARCH_HISTORY, history); + HistoryHelper.setSearchHistory(title); searchResult(); } private ExecutorService searchExecutorService = null; - private AtomicInteger allRunCount = new AtomicInteger(0); + private final AtomicInteger allRunCount = new AtomicInteger(0); private void searchResult() { try { @@ -471,7 +450,7 @@ public class FastSearchActivity extends BaseActivity { for(String one : arr) { if (name.contains(one)) matchNum++; } - return matchNum == arr.length ? true : false; + return matchNum == arr.length; } private void searchData(AbsXml absXml) { @@ -503,7 +482,7 @@ public class FastSearchActivity extends BaseActivity { int count = allRunCount.decrementAndGet(); if (count <= 0) { - if (searchAdapter.getData().size() <= 0) { + if (searchAdapter.getData().size() == 0) { showEmpty(); } cancel(); diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java index fdd665c7..0b007319 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java @@ -1616,24 +1616,9 @@ public class PlayActivity extends BaseActivity { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view,url); - String click=sourceBean.getClickSelector().trim(); LOG.i("echo-onPageFinished url:" + url); - if(!click.isEmpty()){ - String selector; - if(click.contains(";") && !click.endsWith(";")){ - if(!url.contains(click.split(";")[0]))return; - selector=click.split(";")[1]; - }else { - selector=click; - } - String js = selector; - if(!selector.contains("click()"))js+=".click();"; - LOG.i("echo-javascript:" + js); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - view.evaluateJavascript(js, null); - } else { - view.loadUrl("javascript:" + js); - } + if(!url.equals("about:blank")){ + mController.evaluateScript(sourceBean,url,view,null); } } @@ -1800,6 +1785,10 @@ public class PlayActivity extends BaseActivity { @Override public void onLoadFinished(XWalkView view, String url) { super.onLoadFinished(view, url); + LOG.i("echo-onPageFinished url:" + url); + if(!url.equals("about:blank")){ + mController.evaluateScript(sourceBean,url,null,view); + } } @Override diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java index 51b20bbd..f783a9b9 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java @@ -35,6 +35,7 @@ import com.github.tvbox.osc.ui.dialog.SearchCheckboxDialog; import com.github.tvbox.osc.ui.tv.widget.SearchKeyboard; import com.github.tvbox.osc.util.FastClickCheckUtil; import com.github.tvbox.osc.util.HawkConfig; +import com.github.tvbox.osc.util.HistoryHelper; import com.github.tvbox.osc.util.SearchHelper; import com.github.tvbox.osc.viewmodel.SourceViewModel; import com.google.gson.Gson; @@ -477,12 +478,7 @@ public class SearchActivity extends BaseActivity { etSearch.setText(title); //写入历史记录 - ArrayList history = Hawk.get(HawkConfig.SEARCH_HISTORY, new ArrayList()); - if (!history.contains(title)) - history.add(0, title); - if (history.size() > 10) - history.remove(10); - Hawk.put(HawkConfig.SEARCH_HISTORY, history); + HistoryHelper.setSearchHistory(title); this.searchTitle = title; diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java index 712892ee..e3d224b3 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java @@ -1430,7 +1430,7 @@ public class PlayFragment extends BaseLazyFragment { XWalkUtils.tryUseXWalk(mContext, new XWalkUtils.XWalkState() { @Override public void success() { - initWebView(!sourceBean.getClickSelector().isEmpty()); + initWebView(false); loadUrl(url); } @@ -1687,29 +1687,9 @@ public class PlayFragment extends BaseLazyFragment { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); - String clickSelector = sourceBean.getClickSelector().trim(); LOG.i("echo-onPageFinished url:" + url); - if (!clickSelector.isEmpty()) { - String selector; - if (clickSelector.contains(";") && !clickSelector.endsWith(";")) { - String[] parts = clickSelector.split(";", 2); - if (!url.contains(parts[0])) { - return; - } - selector = parts[1].trim(); - } else { - selector = clickSelector.trim(); - } -// selector="document.getElementById('playleft').children[0].contentWindow.document.getElementById('start')"; - // 构造点击的 JS 代码 - String js = selector; - if(!selector.contains("click()"))js+=".click();"; - LOG.i("echo-javascript:" + js); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - view.evaluateJavascript(js, null); - } else { - view.loadUrl("javascript:" + js); - } + if(!url.equals("about:blank")){ + mController.evaluateScript(sourceBean,url,view,null); } } @@ -1878,6 +1858,10 @@ public class PlayFragment extends BaseLazyFragment { @Override public void onLoadFinished(XWalkView view, String url) { super.onLoadFinished(view, url); + LOG.i("echo-onLoadFinished url:" + url); + if(!url.equals("about:blank")){ + mController.evaluateScript(sourceBean,url,null,view); + } } @Override diff --git a/app/src/main/java/com/github/tvbox/osc/util/HistoryHelper.java b/app/src/main/java/com/github/tvbox/osc/util/HistoryHelper.java index c98e781e..71b9eb92 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/HistoryHelper.java +++ b/app/src/main/java/com/github/tvbox/osc/util/HistoryHelper.java @@ -1,14 +1,17 @@ package com.github.tvbox.osc.util; +import com.orhanobut.hawk.Hawk; +import java.util.ArrayList; + public class HistoryHelper { - private static Integer[] hisNumArray = {30,50,100}; + private static final Integer[] hisNumArray = {30,50,100}; - public static final String getHistoryNumName(int index){ + public static String getHistoryNumName(int index){ Integer value = getHisNum(index); return value + "条"; } - public static final int getHisNum(int index){ + public static int getHisNum(int index){ Integer value = null; if(index>=0 && index < hisNumArray.length){ value = hisNumArray[index]; @@ -17,4 +20,16 @@ public class HistoryHelper { } return value; } + + public static void setSearchHistory(String title){ + // 读取历史记录 + ArrayList history = Hawk.get(HawkConfig.SEARCH_HISTORY, new ArrayList()); + history.remove(title); + history.add(0, title); + // 保证最多只保留 15 条,超过的就删除最后一条 + if (history.size() > 15) { + history.remove(history.size() - 1); + } + Hawk.put(HawkConfig.SEARCH_HISTORY, history); + } } diff --git a/app/src/main/java/com/github/tvbox/osc/util/VideoParseRuler.java b/app/src/main/java/com/github/tvbox/osc/util/VideoParseRuler.java index ffe279d8..4a12efc4 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/VideoParseRuler.java +++ b/app/src/main/java/com/github/tvbox/osc/util/VideoParseRuler.java @@ -5,6 +5,8 @@ import static com.github.tvbox.osc.util.RegexUtils.getPattern; import android.net.Uri; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.regex.Pattern; public class VideoParseRuler { @@ -12,11 +14,13 @@ public class VideoParseRuler { private static final HashMap>> HOSTS_RULE = new HashMap<>(); private static final HashMap>> HOSTS_FILTER = new HashMap<>(); private static final HashMap> HOSTS_REGEX = new HashMap<>(); + private static final HashMap> HOSTS_SCRIPT = new HashMap<>(); public static void clearRule() { HOSTS_RULE.clear(); HOSTS_FILTER.clear(); HOSTS_REGEX.clear(); + HOSTS_SCRIPT.clear(); } public static void addHostRule(String host, ArrayList rule) { @@ -159,6 +163,25 @@ public class VideoParseRuler { return isFilter; } + public static void addHostScript(String host, ArrayList script) { + if (script == null || script.size() == 0) return; + ArrayList temp = new ArrayList<>(); + if (HOSTS_SCRIPT.get(host) != null && HOSTS_SCRIPT.get(host).size() > 0) temp = HOSTS_SCRIPT.get(host); + assert temp != null; + temp.addAll(script); + HOSTS_SCRIPT.put(host, temp); + } - + public static String getHostScript(String url) { + for (Map.Entry> entry : HOSTS_SCRIPT.entrySet()) { + String host = entry.getKey(); + if (url.contains(host)) { + List list = entry.getValue(); + if (list != null && !list.isEmpty()) { + return list.get(0); + } + } + } + return ""; + } }