diff --git a/controllers/vod.py b/controllers/vod.py index 6b7cbfdbb12303dcb8856df97b1c83c081e10cca..1bbc418b50210d7c0b2c6f085c8483052c632e37 100644 --- a/controllers/vod.py +++ b/controllers/vod.py @@ -20,6 +20,8 @@ from models.playparse import PlayParse from js.rules import getRules from controllers.service import storage_service from concurrent.futures import ThreadPoolExecutor,as_completed,thread # 引入线程池 +from quickjs import Function,Context +import ujson vod = Blueprint("vod", __name__) @@ -163,13 +165,29 @@ def vod_home(): # logger.info(f'js读取耗时:{get_interval(t1)}毫秒') logger.info(f'参数检验js读取共计耗时:{get_interval(t0)}毫秒') t2 = time() - ctx, js_code = parser.runJs(js_path,before=before) - if not js_code: + + + # ctx, js_code = parser.runJs(js_path,before=before) + # if not js_code: + # return R.failed('爬虫规则加载失败') + # # rule = ctx.eval('rule') + # # print(type(ctx.rule.lazy()),ctx.rule.lazy().toString()) + # ruleDict = ctx.rule.to_dict() + + ctx = Context() + try: + with open(js_path,encoding='utf-8') as f2: + jscode = f2.read() + jscode = before + jscode + ctx.eval(jscode) + js_ret = ctx.get('rule') + ruleDict = ujson.loads(js_ret.json()) + except Exception as e: + logger.info(f'{e}') return R.failed('爬虫规则加载失败') - # rule = ctx.eval('rule') - # print(type(ctx.rule.lazy()),ctx.rule.lazy().toString()) - ruleDict = ctx.rule.to_dict() + # print(type(ruleDict)) + # print(ruleDict) ruleDict['id'] = rule # 把路由请求的id装到字典里,后面播放嗅探才能用 # print(ruleDict) # print(rule) diff --git a/docker/amd64_dockerfile.txt b/docker/amd64_dockerfile.txt index 34e531424c85781f74ea6c1ac541a28e47505e35..b83e56c2b4fc7d53756f62c77d7f93f28f7b1cfd 100644 --- a/docker/amd64_dockerfile.txt +++ b/docker/amd64_dockerfile.txt @@ -8,6 +8,13 @@ RUN rm -rf /root/sd/pywork/dr_py && mkdir -p /root/sd/pywork/dr_py # 复制文件及目录过去 COPY . /root/sd/pywork/dr_py +# 装依赖 +# RUN pip install -i https://mirrors.cloud.tencent.com/pypi/simple --upgrade pip \ +# && pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple + +# 执行指令,安装依赖 +RUN pip install -r requirements.txt + # 设置语言支持中文打印 # ENV LANG C.UTF-8 # ENV LC_ALL C.UTF-8 @@ -16,9 +23,9 @@ COPY . /root/sd/pywork/dr_py # vi /etc/resolv.conf 加了两行也不行?? # systemctl daemon-reload # systemctl restart docker -# docker build -f amd64_dockerfile.txt -t hjdhnx/drpy:amd64-v3.7.0 . -# docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:amd64-v3.7.0 -# docker push hjdhnx/drpy:amd64-v3.7.0 +# docker build -f amd64_dockerfile.txt -t hjdhnx/drpy:amd64-v3.9.0 . +# docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:amd64-v3.9.0 +# docker push hjdhnx/drpy:amd64-v3.9.0 # docker cp . drpy:/root/sd/pywork/ # CMD supervisord -c /root/sd/pywork/dr_py/super/flask.conf && /bin/bash ENTRYPOINT ["/etc/autostart/app.sh","flask"] \ No newline at end of file diff --git a/docker/arm64_dockerfile.txt b/docker/arm64_dockerfile.txt index 5f182de25ab33b2ac212bec59dcf2d9083d6daf8..f5572cc29ea246b5e1d57c1fb0a69825c041a1ff 100644 --- a/docker/arm64_dockerfile.txt +++ b/docker/arm64_dockerfile.txt @@ -8,11 +8,14 @@ WORKDIR /root/sd/pywork/dr_py # 复制文件及目录过去 COPY . /root/sd/pywork/dr_py +# 执行指令,安装依赖 +RUN pip install -r requirements.txt + # 设置语言支持中文打印 # ENV LANG C.UTF-8 # ENV LC_ALL C.UTF-8 -# docker buildx build --platform linux/arm64 -f arm64_dockerfile.txt -t hjdhnx/drpy:arm64-v3.7.0 --push . -# docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:arm64-v3.7.0 -# docker push hjdhnx/drpy:arm64-v3.7.0 +# docker buildx build --platform linux/arm64 -f arm64_dockerfile.txt -t hjdhnx/drpy:arm64-v3.9.0 --push . +# docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:arm64-v3.9.0 +# docker push hjdhnx/drpy:arm64-v3.9.0 # CMD supervisord -c /root/sd/pywork/dr_py/super/flask.conf && /bin/bash ENTRYPOINT ["/etc/autostart/app.sh","flask"] \ No newline at end of file diff --git a/docker/armv7_dockerfile.txt b/docker/armv7_dockerfile.txt index f8fb3997003a37eb26516d9a92f59b6eac40ba0f..81c5ef35fac1472789da70e82e8038d1123b6202 100644 --- a/docker/armv7_dockerfile.txt +++ b/docker/armv7_dockerfile.txt @@ -8,11 +8,14 @@ WORKDIR /root/sd/pywork/dr_py # 复制文件及目录过去 COPY . /root/sd/pywork/dr_py +# 执行指令,安装依赖 +RUN pip3 install -r requirements.txt + # 设置语言支持中文打印 # ENV LANG C.UTF-8 # ENV LC_ALL C.UTF-8 -# docker buildx build --platform linux/arm/v7 -f armv7_dockerfile.txt -t hjdhnx/drpy:armv7-v3.7.0 --push . -# docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:armv7-v3.7.0 -# docker push hjdhnx/drpy:armv7-v3.7.0 +# docker buildx build --platform linux/arm/v7 -f armv7_dockerfile.txt -t hjdhnx/drpy:armv7-v3.9.0 --push . +# docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:armv7-v3.9.0 +# docker push hjdhnx/drpy:armv7-v3.9.0 # CMD supervisord -c /root/sd/pywork/dr_py/super/flask.conf && /bin/bash ENTRYPOINT ["/etc/autostart/app.sh","flask"] \ No newline at end of file diff --git a/docker/merge.sh b/docker/merge.sh index f22f4ac42746ab5de417705f4d1436c21708f2ff..561b613d93d1fcac5766d03f797d586ba3c85ae7 100644 --- a/docker/merge.sh +++ b/docker/merge.sh @@ -1,10 +1,10 @@ #!/bin/bash #kill -9 $(cat supervisord.pid) # 杀掉进程 docker manifest rm hjdhnx/drpy -docker manifest create hjdhnx/drpy hjdhnx/drpy:amd64-v3.7.0 hjdhnx/drpy:arm64-v3.7.0 hjdhnx/drpy:armv7-v3.7.0 -docker manifest annotate hjdhnx/drpy hjdhnx/drpy:amd64-v3.7.0 --os linux --arch amd64 -docker manifest annotate hjdhnx/drpy hjdhnx/drpy:arm64-v3.7.0 --os linux --arch arm64/v8 -docker manifest annotate hjdhnx/drpy hjdhnx/drpy:armv7-v3.7.0 --os linux --arch arm/v7 +docker manifest create hjdhnx/drpy hjdhnx/drpy:amd64-v3.9.0 hjdhnx/drpy:arm64-v3.9.0 hjdhnx/drpy:armv7-v3.9.0 +docker manifest annotate hjdhnx/drpy hjdhnx/drpy:amd64-v3.9.0 --os linux --arch amd64 +docker manifest annotate hjdhnx/drpy hjdhnx/drpy:arm64-v3.9.0 --os linux --arch arm64/v8 +docker manifest annotate hjdhnx/drpy hjdhnx/drpy:armv7-v3.9.0 --os linux --arch arm/v7 docker manifest push hjdhnx/drpy # 保留一个 bash #/bin/bash \ No newline at end of file diff --git a/js/rules.py b/js/rules.py index 9505a164e509e663e919aa4593bb85b624bec50f..2b81990365584f1bb05a353bf6742a237d1793a7 100644 --- a/js/rules.py +++ b/js/rules.py @@ -7,10 +7,12 @@ import json import os from time import time import js2py +from quickjs import Function,Context from utils.log import logger # from utils.web import get_interval,UA from utils.ua import UA,get_interval from flask import render_template_string +import ujson def getRuleLists(): base_path = os.path.dirname(os.path.abspath(__file__)) # 当前文件所在目录 @@ -29,7 +31,7 @@ def getCacheCount(): file_name = list(filter(lambda x: str(x).endswith('.js') and str(x).find('模板') < 0, file_name)) return len(file_name) -def getRules(path='cache',js_mode=0): +def getRulesJs2py(path='cache',js_mode=0): t1 = time() base_path = path+'/' # 当前文件所在目录 @@ -64,11 +66,11 @@ def getRules(path='cache',js_mode=0): for i in range(len(js_path)): rule_codes.append(ctx.eval(f'rule{i}')) - # print(rule_codes) # print(type(rule_codes[0]),rule_codes[0]) # print(rule_codes[0].title) # print(rule_codes[0].searchable) # print(rule_codes[0].quickSearch) + # rule_codes 是个 js2py.base.JsObjectWrapper 类型,所以下面才能用. 获取属性 new_rule_list = [] for i in range(len(rule_list)): if js_mode == 1 and rule_list[i] == 'drpy': @@ -92,6 +94,60 @@ def getRules(path='cache',js_mode=0): logger.info(f'自动配置装载耗时:{get_interval(t1)}毫秒') return rules +def getRules(path='cache',js_mode=0): + t1 = time() + + base_path = path+'/' # 当前文件所在目录 + os.makedirs(base_path,exist_ok=True) + file_name = os.listdir(base_path) + file_name = list(filter(lambda x: str(x).endswith('.js') and str(x).find('模板') < 0, file_name)) + rule_list = [file.replace('.js', '') for file in file_name] + js_path = [f'{path}/{rule}.js' for rule in rule_list] + with open('js/模板.js', encoding='utf-8') as f: + before = f.read().split('export')[0] + rule_codes = [] + ctx = Context() + codes = [] + for i in range(len(js_path)): + js = js_path[i] + with open(js,encoding='utf-8') as f: + code = f.read() + new_code = 'var muban = JSON.parse(JSON.stringify(mubanDict));\n'+code.replace('rule',f'rule{i}',1) + # new_code = ''+code.replace('rule',f'rule{i}',1) + codes.append(new_code) + newCodes = before + '\n'+ '\n'.join(codes) + # print(newCodes) + try: + ctx.eval(newCodes) + for i in range(len(js_path)): + rule_codes.append(ctx.get(f'rule{i}')) + + # rule_codes 是个 js2py.base.JsObjectWrapper 类型,所以下面才能用. 获取属性 + new_rule_list = [] + for i in range(len(rule_list)): + if js_mode == 1 and rule_list[i] == 'drpy': + continue + rule_codes[i] = ujson.loads(rule_codes[i].json()) + sable = rule_codes[i].get('searchable',0) + tmpObj = { + 'name':rule_list[i], + # 'searchable':1 if (js_mode==1 and sable==2) else sable, # 对js模式1开放软件聚搜(还是算了,服务器遭不住) + 'searchable':sable, + 'quickSearch': rule_codes[i].get('quickSearch',0), + 'filterable': rule_codes[i].get('filterable',0), + } + # print(tmpObj) + if rule_codes[i].get('multi'): + tmpObj['multi'] = 1 + new_rule_list.append(tmpObj) + # print(new_rule_list) + rules = {'list': new_rule_list, 'count': len(rule_list)} + except Exception as e: + logger.info(f'装载js内置源列表失败,置空内置源') + rules = [] + logger.info(f'自动配置装载耗时:{get_interval(t1)}毫秒') + return rules + def jxTxt2Json(text:str,host:str): try: data = render_template_string(text,host=host).strip().split('\n') diff --git a/js/version.txt b/js/version.txt index 8c1da59dbb3a01e6f335d2e73d9b42affb230219..33f465d1ad3b7c3181aa7fcad2cac51d642457dc 100644 --- a/js/version.txt +++ b/js/version.txt @@ -1 +1 @@ -3.8.5 \ No newline at end of file +3.9.1 \ No newline at end of file diff --git a/py/qkjs/quick.py b/py/qkjs/quick.py index fde210525a6f213940a02a05baf8a71e46832a4d..9d9fa5641ff6815606e53279f24f0041cb2e9c3a 100644 --- a/py/qkjs/quick.py +++ b/py/qkjs/quick.py @@ -88,15 +88,22 @@ ctx.add_callable('request',request) ctx.eval('bd()') t1 = time() -with open('../../js/兔小贝.js',encoding='utf-8') as f1: +rule_file = '555影视.js' +with open('../../js/模板.js', encoding='utf-8') as f: + before = f.read().split('export')[0] + +with open(f'../../js/{rule_file}',encoding='utf-8') as f1: jscode = f1.read() + jscode = before + jscode print(jscode) ctx1 = Context() ctx1.eval(jscode) ret = ctx1.get('rule') -print(type(ret.json()),ret.json()) -print(json.loads(ret.json())) +# print(type(ret.json()),ret.json()) +# print(json.loads(ret.json())) +ret = json.loads(ret.json()) +print(type(ret),ret) t2 = time() print(f'quickjs耗时:{round((t2-t1)*1000,2)}毫秒') tt1 = time() @@ -108,9 +115,10 @@ tt2 = time() print(f'quickjs第2次耗时:{round((tt2-tt1)*1000,2)}毫秒') t3 = time() -with open('../../js/兔小贝.js',encoding='utf-8') as f1: +with open(f'../../js/{rule_file}',encoding='utf-8') as f1: jscode = f1.read() - print(jscode) + jscode = before + jscode + # print(jscode) ctx2 = js2py.EvalJs({},enable_require=False) # enable_require启用require关键字,会自动获取系统nodejs环境 ctx2.execute(jscode) ret = ctx2.rule.to_dict() diff --git a/readme.md b/readme.md index 0ea4b3840490fc4ff5df658d12f9f8c3373e614d..2a43cb25434e1cac2ee8d9c459f89eb535464454 100644 --- a/readme.md +++ b/readme.md @@ -4,19 +4,19 @@ logo

🗂️A webServer convert web and x5 movie sites to cms api data

- latest version + latest version discussions - Downloads + Downloads - - Downloads + + Downloads @@ -30,7 +30,7 @@ - License + License @@ -46,6 +46,9 @@ [dockerfile教程](https://blog.csdn.net/qq_46158060/article/details/125718218) [获取本地设备信息](https://blog.csdn.net/cui_yonghua/article/details/125508991) [获取本地设备信息](https://m.jb51.net/article/140716.htm) +###### 2022/10/11 +- [X] 增加自建解析加密示例 +- [X] 发布3.9.0镜像,重大升级,优化js装载速度 ###### 2022/10/09 - [X] 1.v3.8.2 本地drpy.js抄了一下影魔代码实现了base64加解密和md5加密并且引入全局的CryptoJS对象 - [X] 2.v3.8.3 本地drpy.js抄了一下影魔代码不用import模板改成init加载模板解决换源冲突问题 diff --git a/requirements.txt b/requirements.txt index 875ff66e9fc0144008e1d52c7ee6a6e2f161b0bd..13d23ff2df5324cbdfbb77e03c4a211d77101f6a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,4 +14,6 @@ gunicorn ; python_version >= '3.6' supervisor ; sys_platform != 'win32' func_timeout easydict -jsonpath \ No newline at end of file +jsonpath +quickjs +ujson \ No newline at end of file diff --git "a/\345\256\211\345\215\223\346\234\254\345\234\260\346\220\255\345\273\272\350\257\264\346\230\216.md" "b/\345\256\211\345\215\223\346\234\254\345\234\260\346\220\255\345\273\272\350\257\264\346\230\216.md" index e4bb3c49a53efdef026a831fc3890ef18b9e8d42..1b46b1b50fdc3b258992d54b3e4a6db6e0c8cf71 100644 --- "a/\345\256\211\345\215\223\346\234\254\345\234\260\346\220\255\345\273\272\350\257\264\346\230\216.md" +++ "b/\345\256\211\345\215\223\346\234\254\345\234\260\346\220\255\345\273\272\350\257\264\346\230\216.md" @@ -13,7 +13,7 @@ apt install python3 ##### 特殊-docker直装(支持amd64/armv7/arm64) ##### 不知道自己架构的通过arch命令查看 ###### 可以通过点此下载获得最小必要文件压缩包 -[蓝奏云下载](https://wwi.lanzoup.com/i02Vp0c3hpkd) +[蓝奏云下载](https://wwi.lanzoup.com/igPCG0dlqouf) ##### 三架构自动识别(测试功能) ```shell @@ -22,15 +22,15 @@ docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/ ##### amd64/x86架构(主流设备) ```shell -docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:amd64-v3.7.0 +docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:amd64-v3.9.0 ``` ##### armv7架构(树莓派,机顶盒,软路由等) ```shell -docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:armv7-v3.7.0 +docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:armv7-v3.9.0 ``` ##### arm64架构(部分服务器) ```shell -docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:arm64-v3.7.0 +docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:arm64-v3.9.0 ``` ##### 上面代码如果成功了下面都可以忽略 @@ -40,10 +40,10 @@ docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/ ``` ```shell # 运行容器-小白只需要这一条命令(存在问题是不能在远程面板上正确获取配置地址和进程管理地址,但自己知道地址就不影响使用,可进入容器自行修改config) -docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:amd64-v3.7.0 +docker run -it -p 5705:5705 -p 9001:9001 --restart=always --name drpy -d hjdhnx/drpy:amd64-v3.9.0 # 稍微懂一点可以运行下面的操作 先把本项目拷贝到 /home/pywork/dr_py -docker run -it -p 5705:5705 -p 9001:9001 -v /home/pywork/dr_py:/root/sd/pywork/dr_py --restart=always --name drpy -d hjdhnx/drpy:amd64-v3.7.0 +docker run -it -p 5705:5705 -p 9001:9001 -v /home/pywork/dr_py:/root/sd/pywork/dr_py --restart=always --name drpy -d hjdhnx/drpy:amd64-v3.9.0 # 进入容器然后修改config.py文件改配置里面自己的远程地址等信息,改完退出容器再重启容器(或者通过进程管理9001端口在线重启flask服务) docker exec -it drpy bash vi ./base/config.py diff --git "a/\351\201\223\351\225\277\344\271\261\350\257\264.md" "b/\351\201\223\351\225\277\344\271\261\350\257\264.md" index 7db5fe876e8a1e43248e0cdffed185ad0621bae8..ded169e83aaba9452fd9ab9f2c4d9304cc2b9a03 100644 --- "a/\351\201\223\351\225\277\344\271\261\350\257\264.md" +++ "b/\351\201\223\351\225\277\344\271\261\350\257\264.md" @@ -81,6 +81,7 @@ find . -iname drpy.txt # 推荐drpy项目映射方案: -v /home/pywork/kod/data/files/dr_py:/root/sd/pywork/dr_py -# 道长占用完整命令 +# 道长专用完整命令 docker run -it -p 5705:5705 -p 9001:9001 -v /home/pywork/kod/data/files/dr_py:/root/sd/pywork/dr_py --restart=always --name drpy -d hjdhnx/drpy +docker run -it -p 5705:5705 -p 9001:9001 -v /home/pywork/kod/data/files/dr_py:/root/sd/pywork/dr_py --restart=always --name drpy -d hjdhnx/drpy:amd64-v3.9.0 ``` \ No newline at end of file