Support js proxy

pull/137/head
FongMi 2 years ago
parent 43445f5eb6
commit e574ba90f7
  1. 13
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  2. 8
      app/src/main/java/com/fongmi/android/tv/api/JarLoader.java
  3. 17
      app/src/main/java/com/fongmi/android/tv/api/JsLoader.java
  4. 8
      app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java
  5. 2
      drpy/src/main/java/com/hiker/drpy/Parser.java
  6. 25
      drpy/src/main/java/com/hiker/drpy/Spider.java

@ -237,12 +237,19 @@ public class ApiConfig {
else return new SpiderNull();
}
public void setJar(String key) {
jarLoader.setJar(key);
public void setRecent(Site site) {
boolean js = site.getApi().contains(".js");
boolean csp = site.getApi().startsWith("csp_");
if (js) jsLoader.setRecent(site.getKey());
if (csp) jarLoader.setRecent(site.getJar());
}
public Object[] proxyLocal(Map<?, ?> param) {
return jarLoader.proxyInvoke(param);
if (param.containsKey("do") && param.get("do").equals("js")) {
return jsLoader.proxyInvoke(param);
} else {
return jarLoader.proxyInvoke(param);
}
}
public JSONObject jsonExt(String key, LinkedHashMap<String, String> jxs, String url) throws Exception {

@ -25,7 +25,7 @@ public class JarLoader {
private final ConcurrentHashMap<String, DexClassLoader> loaders;
private final ConcurrentHashMap<String, Method> methods;
private final ConcurrentHashMap<String, Spider> spiders;
private String jar;
private String recent;
public JarLoader() {
this.loaders = new ConcurrentHashMap<>();
@ -39,8 +39,8 @@ public class JarLoader {
this.spiders.clear();
}
public void setJar(String jar) {
this.jar = jar;
public void setRecent(String recent) {
this.recent = recent;
}
private void load(String key, File file) throws Throwable {
@ -116,7 +116,7 @@ public class JarLoader {
public Object[] proxyInvoke(Map<?, ?> params) {
try {
Method method = methods.get(Utils.getMd5(jar));
Method method = methods.get(Utils.getMd5(recent));
if (method != null) return (Object[]) method.invoke(null, params);
else return null;
} catch (Exception e) {

@ -4,11 +4,13 @@ import com.fongmi.android.tv.App;
import com.hiker.drpy.Loader;
import com.hiker.drpy.Spider;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class JsLoader {
private final ConcurrentHashMap<String, Spider> spiders;
private String recent;
public JsLoader() {
spiders = new ConcurrentHashMap<>();
@ -20,6 +22,10 @@ public class JsLoader {
this.spiders.clear();
}
public void setRecent(String recent) {
this.recent = recent;
}
private void init() {
try {
Loader.init(App.get());
@ -40,4 +46,15 @@ public class JsLoader {
return new Spider();
}
}
public Object[] proxyInvoke(Map<?, ?> params) {
try {
Spider spider = spiders.get(recent);
if (spider != null) return spider.doProxy(params);
else return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

@ -57,7 +57,7 @@ public class SiteViewModel extends ViewModel {
Spider spider = ApiConfig.get().getCSP(site);
String homeContent = spider.homeContent(true);
SpiderDebug.log(homeContent);
ApiConfig.get().setJar(site.getJar());
ApiConfig.get().setRecent(site);
Result result = Result.fromJson(homeContent);
if (result.getList().size() > 0) return result;
String homeVideoContent = spider.homeVideoContent();
@ -86,7 +86,7 @@ public class SiteViewModel extends ViewModel {
Spider spider = ApiConfig.get().getCSP(site);
String categoryContent = spider.categoryContent(tid, page, filter, extend);
SpiderDebug.log(categoryContent);
ApiConfig.get().setJar(site.getJar());
ApiConfig.get().setRecent(site);
return Result.fromJson(categoryContent);
} else {
ArrayMap<String, String> params = new ArrayMap<>();
@ -109,7 +109,7 @@ public class SiteViewModel extends ViewModel {
Spider spider = ApiConfig.get().getCSP(site);
String detailContent = spider.detailContent(Arrays.asList(id));
SpiderDebug.log(detailContent);
ApiConfig.get().setJar(site.getJar());
ApiConfig.get().setRecent(site);
Result result = Result.fromJson(detailContent);
if (!result.getList().isEmpty()) result.getList().get(0).setVodFlags();
return result;
@ -140,7 +140,7 @@ public class SiteViewModel extends ViewModel {
Spider spider = ApiConfig.get().getCSP(site);
String playerContent = spider.playerContent(flag, id, ApiConfig.get().getFlags());
SpiderDebug.log(playerContent);
ApiConfig.get().setJar(site.getJar());
ApiConfig.get().setRecent(site);
Result result = Result.objectFrom(playerContent);
if (result.getFlag().isEmpty()) result.setFlag(flag);
result.setKey(key);

@ -22,7 +22,7 @@ public class Parser {
private final Pattern p1 = Pattern.compile("url\\((.*?)\\)", Pattern.MULTILINE | Pattern.DOTALL);
private final Pattern p2 = Pattern.compile(":eq|:lt|:gt|:first|:last|^body$|^#");
private final Pattern p3 = Pattern.compile("(url|src|href|-original|-src|-play|-url)$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
private final Pattern p3 = Pattern.compile("(url|src|href|-original|-src|-play|-url|style)$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
private final Cache cache;

@ -9,8 +9,12 @@ import com.whl.quickjs.wrapper.JSArray;
import com.whl.quickjs.wrapper.JSObject;
import com.whl.quickjs.wrapper.QuickJSContext;
import org.json.JSONArray;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
@ -92,6 +96,27 @@ public class Spider extends com.github.catvod.crawler.Spider {
});
}
public Object[] doProxy(Map<?, ?> params) throws Exception {
return submit(() -> {
JSObject obj = ctx.createNewJSObject();
for (Object key : params.keySet()) obj.setProperty((String) key, (String) params.get(key));
JSONArray array = new JSONArray(((JSArray) jsObject.getJSFunction("proxy").call(obj)).stringify());
Object[] objects = new Object[3];
objects[0] = array.get(0);
objects[1] = array.opt(1);
Object o = array.opt(2);
if (o instanceof JSONArray) {
JSONArray a = (JSONArray) o;
byte[] bytes = new byte[a.length()];
for (int i = 0; i < a.length(); i++) bytes[i] = (byte) a.optInt(i);
objects[2] = new ByteArrayInputStream(bytes);
} else {
objects[2] = new ByteArrayInputStream(o.toString().getBytes());
}
return objects;
}).get();
}
private void initJS(Context context, String extend) {
if (ctx == null) createCtx();
ctx.evaluateModule(getContent(context), api);

Loading…
Cancel
Save