pull/144/head
jun 1 year ago
parent f1eb3c016e
commit 8defdeab79
  1. 1
      app/src/main/java/com/github/catvod/crawler/python/IPyLoader.java
  2. 19
      app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java
  3. 6
      app/src/normal/java/com/github/catvod/crawler/pyLoader.java
  4. 143
      app/src/python/java/com/github/catvod/crawler/pyLoader.java
  5. 41
      app/src/python/java/com/undcover/freedom/pyramid/PythonLoader.java
  6. 38
      app/src/python/java/com/undcover/freedom/pyramid/PythonSpider.java

@ -9,6 +9,5 @@ public interface IPyLoader {
void setConfig(String jsonStr);
void setRecentPyKey(String pyApi);
Spider getSpider(String key, String cls, String ext);
Object[] proxyInvoke(Map<String, String> params, String key, String api, String ext);
Object[] proxyInvoke(Map<String, String> params);
}

@ -864,11 +864,18 @@ public class ApiConfig {
Hawk.put(HawkConfig.LIVE_PLAY_TYPE,livePlayType);
}
//设置UA
if(livesOBJ.has("ua")){
String ua =livesOBJ.get("ua").getAsString();
HashMap<String,String> liveHeader=new HashMap<>();
liveHeader.put("User-Agent",ua);
Hawk.put(HawkConfig.LIVE_WEB_HEADER,liveHeader);
if(livesOBJ.has("header")) {
JsonObject headerObj = livesOBJ.getAsJsonObject("header");
HashMap<String, String> liveHeader = new HashMap<>();
for (Map.Entry<String, JsonElement> entry : headerObj.entrySet()) {
liveHeader.put(entry.getKey(), entry.getValue().getAsString());
}
Hawk.put(HawkConfig.LIVE_WEB_HEADER, liveHeader);
} else if(livesOBJ.has("ua")) {
String ua = livesOBJ.get("ua").getAsString();
HashMap<String,String> liveHeader = new HashMap<>();
liveHeader.put("User-Agent", ua);
Hawk.put(HawkConfig.LIVE_WEB_HEADER, liveHeader);
}else {
Hawk.put(HawkConfig.LIVE_WEB_HEADER,null);
}
@ -911,7 +918,7 @@ public class ApiConfig {
return pyLoader.getSpider(MD5.string2MD5(url), url, "");
}
public Object[] proxyLocal(Map<String,String> param) {
public Object[] proxyLocal(Map<String,String> param){
SourceBean sourceBean = ApiConfig.get().getHomeSourceBean();
if(Hawk.get(HawkConfig.PLAYER_IS_LIVE,false)){

@ -28,12 +28,6 @@ public class pyLoader implements IPyLoader {
return new SpiderNull();
}
@Override
public Object[] proxyInvoke(Map<String, String> params, String key, String api, String ext) {
Log.i("PyLoader", "normal flavor: proxyInvoke(params, key, api, ext) 调用,但不支持 Python 功能。");
return null;
}
@Override
public Object[] proxyInvoke(Map<String, String> params) {
Log.i("PyLoader", "normal flavor: proxyInvoke(params) 调用,但不支持 Python 功能。");

@ -51,16 +51,9 @@ public class pyLoader implements IPyLoader {
}
try {
Log.i("PyLoader", "echo-getSpider url: " + getPyUrl(cls, ext));
PythonSpider sp = (PythonSpider) pythonLoader.getSpider(key, getPyUrl(cls, ext));
// sp.init(App.getInstance(),getPyUrl(cls, ext));
// PythonSpiderWrapper wrapper = new PythonSpiderWrapper(sp);
// wrapper.init(getPyUrl(cls, ext));
// Log.i("PyLoader", "echo-getSpider getName: " + wrapper.getName());
// Log.i("PyLoader", "echo-getSpider getName: " + sp.getName());
// Log.i("PyLoader", "echo-getSpider liveContent: " + sp.liveContent("true"));
Log.i("PyLoader", "echo-getSpider homeContent: " + sp.homeContent(true));
spiders.put(key, (Spider) sp);
Spider sp = pythonLoader.getSpider(key, getPyUrl(cls, ext));
// Log.i("PyLoader", "echo-getSpider homeContent: " + sp.homeContent(true));
spiders.put(key, sp);
Log.i("PyLoader", "echo-getSpider 加载spider: " + key);
return (Spider)sp;
} catch (Throwable th) {
@ -70,140 +63,18 @@ public class pyLoader implements IPyLoader {
}
@Override
public Object[] proxyInvoke(Map<String, String> params, String key, String api, String ext) {
public Object[] proxyInvoke(Map<String, String> params){
LOG.i("echo-recentPyApi" + recentPyApi);
try {
String doStr = params.get("do");
assert doStr != null;
if (doStr.equals("ck") || doStr.equals("live"))
return pythonLoader.proxyLocal("", "", params);
return (Object[]) pythonLoader.proxyLocal(key, getPyUrl(api, ext), params);
} catch (Throwable th) {
th.printStackTrace();
}
return null;
}
@Override
public Object[] proxyInvoke(Map<String, String> params) {
try {
LOG.i("echo-recentPyApi" + recentPyApi);
PythonSpider originalSpider = (PythonSpider) pythonLoader.getSpider(MD5.string2MD5(recentPyApi), recentPyApi);
// PythonSpiderWrapper wrapper = new PythonSpiderWrapper(originalSpider);
// return wrapper.proxyLocal(params);
PythonSpider originalSpider = (PythonSpider) getSpider(MD5.string2MD5(recentPyApi), recentPyApi,"");
return originalSpider.proxyLocal(params);
} catch (Throwable th) {
LOG.i("echo-Throwable:---" + th.getMessage());
LOG.i("echo-proxyInvoke_Throwable:---" + th.getMessage());
th.printStackTrace();
}
return null;
}
public static class PythonSpiderWrapper {
private final PythonSpider spider;
public PythonSpiderWrapper(PythonSpider spider) {
this.spider = spider;
}
public Object[] proxyLocal(Map<String, String> param) {
try {
// 反射获取私有字段 app
Field appField = PythonSpider.class.getDeclaredField("app");
appField.setAccessible(true);
PyObject app = (PyObject) appField.get(spider);
// 反射获取私有字段 pySpider
Field pySpiderField = PythonSpider.class.getDeclaredField("pySpider");
pySpiderField.setAccessible(true);
PyObject pySpider = (PyObject) pySpiderField.get(spider);
// 调用 Python 接口获取原始结果
assert app != null;
List<PyObject> poList = app.callAttr("localProxy",
new Object[]{pySpider, spider.map2json(param).toString()}).asList();
int code = poList.get(0).toInt();
String type = poList.get(1).toString();
String action = poList.get(2).toString();
InputStream stream = new ByteArrayInputStream(action.getBytes("utf8"));
Object extra = null;
if (poList.size() > 3) {
extra = poList.get(3).toJava(Map.class);
}
return new Object[]{code, type, stream, extra};
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public String getName() {
try {
// 反射获取私有字段 app
Field appField = PythonSpider.class.getDeclaredField("app");
appField.setAccessible(true);
PyObject app = (PyObject) appField.get(spider);
// 反射获取私有字段 pySpider
Field pySpiderField = PythonSpider.class.getDeclaredField("pySpider");
pySpiderField.setAccessible(true);
PyObject pySpider = (PyObject) pySpiderField.get(spider);
// 调用 Python 接口获取原始结果
assert app != null;
String poList = String.valueOf(app.callAttr("getName",
new Object[]{pySpider}));
return poList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public String homeContent(boolean filter) {
try {
// 反射获取私有字段 app
Field appField = PythonSpider.class.getDeclaredField("app");
appField.setAccessible(true);
PyObject app = (PyObject) appField.get(spider);
// 反射获取私有字段 pySpider
Field pySpiderField = PythonSpider.class.getDeclaredField("pySpider");
pySpiderField.setAccessible(true);
PyObject pySpider = (PyObject) pySpiderField.get(spider);
// 调用 Python 接口获取原始结果
assert app != null;
String poList = String.valueOf(app.callAttr("homeContent",
new Object[]{pySpider,filter}));
return poList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void init(String filter) {
try {
// 反射获取私有字段 app
Field appField = PythonSpider.class.getDeclaredField("app");
appField.setAccessible(true);
PyObject app = (PyObject) appField.get(spider);
// 反射获取私有字段 pySpider
Field pySpiderField = PythonSpider.class.getDeclaredField("pySpider");
pySpiderField.setAccessible(true);
PyObject pySpider = (PyObject) pySpiderField.get(spider);
// 调用 Python 接口获取原始结果
assert app != null;
app.callAttr("init", new Object[]{pySpider,filter});
} catch (Exception e) {
e.printStackTrace();
}
}
}
private String getPyUrl(String api, String ext) throws UnsupportedEncodingException {
StringBuilder urlBuilder = new StringBuilder(api);
if (!ext.isEmpty()) {

@ -122,7 +122,23 @@ public class PythonLoader {
}
try {
PythonSpider sp = new PythonSpider(key, cache);
sp.init(app, url);
Thread initThread = new Thread(() -> {
try {
sp.init(app, url);
} catch (Exception e) {
e.printStackTrace();
}
});
initThread.start();
initThread.join(12_000);
if (initThread.isAlive()) {
PyLog.e("echo-init方法执行超时超时");
initThread.interrupt();
throw new Exception("echo-init方法执行超时");
}
spiders.put(key, sp);
return sp;
} catch (Throwable th) {
@ -131,29 +147,6 @@ public class PythonLoader {
return new SpiderNull();
}
public Object[] proxyLocal(String key, String url, Map<String, String> map) {
String what = map.get("do").toString();
try {
if (what.equals("ck")) {
return new Object[]{200, "text/plain; charset=utf-8", new ByteArrayInputStream("ok".getBytes("UTF-8"))};
}
if (what.equals("live")) {
String type = map.get("type");
if (type.equals("txt")) {
String ext = map.get("ext");
ext = new String(Base64.decode(ext, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8");
return TxtSubscribe.load(ext);
}
return null;
}
PythonSpider spider = (PythonSpider) getSpider(key, url);
return spider.proxyLocal(map);
} catch (Exception e) {
e.printStackTrace();
}
return new Object[]{};
}
int port = -1;
public void getPort() {

@ -14,11 +14,10 @@ import org.json.JSONObject;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class PythonSpider extends Spider {
PyObject app;
@ -67,7 +66,7 @@ public class PythonSpider extends Spider {
}
app.callAttr("init", pySpider, extInfo);
loadSuccess = true;
Log.i("PyLoader", "echo-init extInfo: " + extInfo);
Log.i("PyLoader", "echo-init extInfo: " +url+ extInfo);
PyLog.d(name + ": 下載插件成功!");
} else {
PyToast.showCancelableToast(name + "下载插件失败");
@ -153,36 +152,41 @@ public class PythonSpider extends Spider {
// return new Object[]{code, type, stream, extra};
// }
public Object[] proxyLocal(Map params) {
Log.i("tvbox","echo-proxyLocal"+params.toString());
public Object[] proxyLocal(Map<String,String> params) {
Log.i("PyLoader","echo-proxyLocal:param"+params.toString());
List<PyObject> list = app.callAttr("localProxy", pySpider, map2json(params).toString()).asList();
boolean base64 = list.size() > 4 && list.get(4).toInt() == 1;
boolean header = list.size() > 3 && list.get(3) != null;
boolean headerAvailable = list.size() > 3 && list.get(3) != null;
Object[] result = new Object[4];
result[0] = list.get(0).toInt();
result[1] = list.get(1).toString();
result[2] = getStream(list.get(2), base64);
result[3] = header ? getHeader(list.get(3)) : null;
result[3] = headerAvailable ? getHeader(list.get(3)) : null;
// result[3] = null;
return result;
}
private Map<String, String> getHeader(PyObject obj) {
try {
Map<String, String> header = new HashMap<>();
for (Map.Entry<PyObject, PyObject> entry : obj.asMap().entrySet()) header.put(entry.getKey().toString(), entry.getValue().toString());
return header;
} catch (Exception e) {
private Map<String, String> getHeader(PyObject headerObj) {
if (headerObj == null) {
return null;
}
// 处理 headerObj
Map<String, String> headerMap = new HashMap<>();
for (PyObject key : headerObj.asMap().keySet()) {
headerMap.put(key.toString(), Objects.requireNonNull(headerObj.asMap().get(key)).toString());
}
return headerMap;
}
private ByteArrayInputStream getStream(PyObject o, boolean base64) {
Log.i("tvbox","echo-getStream"+o.toString());
if (o == null) return null;
if (o.type().toString().contains("bytes")) return new ByteArrayInputStream(o.toJava(byte[].class));
if (o == null) return new ByteArrayInputStream(new byte[0]);
String typeStr = o.type().toString();
if (typeStr.contains("bytes")) return new ByteArrayInputStream(o.toJava(byte[].class));
String content = o.toString();
if (base64 && content.contains("base64,")) content = content.split("base64,")[1];
if (base64 && content.contains("base64,")) {
content = content.split("base64,")[1];
}
return new ByteArrayInputStream(base64 ? decode(content) : content.getBytes());
}

Loading…
Cancel
Save