From f5ade05d0ab39db1cf6b5c8650be6e6c56098899 Mon Sep 17 00:00:00 2001 From: hjdhnx Date: Thu, 25 Aug 2022 10:44:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3execjs=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E4=B9=B1=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 37 ++++++++++++++- js/rules.py | 9 ++++ "js/\351\270\255\345\245\210\351\243\236.js" | 10 ++++ utils/error.py | 17 +++++++ utils/parser.py | 48 ++++++++++++++++++++ 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 js/rules.py create mode 100644 "js/\351\270\255\345\245\210\351\243\236.js" create mode 100644 utils/error.py create mode 100644 utils/parser.py diff --git a/app.py b/app.py index 252016c..38f9cfc 100644 --- a/app.py +++ b/app.py @@ -5,7 +5,8 @@ # Date : 2022/8/25 from flask import Flask, jsonify, abort,request,redirect,make_response,render_template - +from js.rules import rule_list +from utils import error,parser import sys import codecs sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) @@ -20,6 +21,22 @@ headers = { 'user-agent': UA, } +def getParmas(key=None): + """ + 获取链接参数 + :param key: + :return: + """ + args = {} + if request.method == 'POST': + args = request.json + elif request.method == 'GET': + args = request.args + if key: + return args.get(key,'') + else: + return args + @app.route('/') def forbidden(): # put application's code here abort(403) @@ -28,5 +45,23 @@ def forbidden(): # put application's code here def index(): # put application's code here return render_template('index.html') +@app.route('/vod') +def vod(): + rule = getParmas('rule') + if not rule: + return jsonify(error.failed('规则字段必填')) + if not rule in rule_list: + msg = f'仅支持以下规则:{",".join(rule_list)}' + return jsonify(error.failed(msg)) + + # with open(f'js/{rule}.js',mode='r',encoding='utf-8') as f: + # js_code = f.read() + js_path = f'js/{rule}.js' + ctx,js_code = parser.runJs(js_path) + a = ctx.eval('rule') + print(a) + print(type(a)) + return jsonify({'rule':rule,'js_code':js_code}) + if __name__ == '__main__': app.run(host="0.0.0.0", port=9000) \ No newline at end of file diff --git a/js/rules.py b/js/rules.py new file mode 100644 index 0000000..34dc789 --- /dev/null +++ b/js/rules.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# File : rules.py.py +# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ +# Date : 2022/8/25 + +rule_list = [ + '鸭奈飞' +] diff --git "a/js/\351\270\255\345\245\210\351\243\236.js" "b/js/\351\270\255\345\245\210\351\243\236.js" new file mode 100644 index 0000000..f03244e --- /dev/null +++ "b/js/\351\270\255\345\245\210\351\243\236.js" @@ -0,0 +1,10 @@ +var rule = { + url:'https://yanetflix.com/vodshow/dianying--------fypage---.html', + searchUrl:'/vodsearch/**----------fypage---.html', + ua:'MOBILE_UA', + class_name:'', + class_url:'测试', + 一级:'', + 二级:'', + 搜索:'', +} \ No newline at end of file diff --git a/utils/error.py b/utils/error.py new file mode 100644 index 0000000..b3449ee --- /dev/null +++ b/utils/error.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# File : error.py +# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ +# Date : 2022/8/25 + +def failed(msg): + return { + 'msg':msg, + 'code':404, + } + +def success(msg): + return { + 'msg':msg, + 'code':200, + } \ No newline at end of file diff --git a/utils/parser.py b/utils/parser.py new file mode 100644 index 0000000..286dca1 --- /dev/null +++ b/utils/parser.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# File : parser.py +# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ +# Date : 2022/8/25 + +import os +from flask import make_response,jsonify +from functools import partial # 这玩意儿能锁定一个函数的参数 +import subprocess +subprocess.Popen = partial(subprocess.Popen, encoding="utf-8") # 固定写法 +# 解决execjs执行js时产生的乱码报错,需要在导入该模块之前,让Popen的encoding参数锁定为utf-8 +import execjs + +# os.environ["EXECJS_RUNTIME"] = "JScript" +# print(execjs.get().name) + +def runJs(jsPath): + # base_path = os.path.dirname(os.path.abspath(__file__)) # 当前文件所在目录 + # base_path = os.path.dirname(os.getcwd()) # 当前主程序所在工作目录 + # base_path = os.path.dirname(os.path.abspath('.')) # 上级目录 + base_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) # 上级目录 + js_path = os.path.join(base_path, jsPath) + with open(js_path, 'r', encoding='UTF-8') as fp: + js_code = fp.read() + # print(js_code) + loader = execjs.compile(js_code) + return loader,js_code + +def toJs(jsPath): + base_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) # 上级目录 + js_path = os.path.join(base_path, jsPath) + if not os.path.exists(js_path): + return jsonify({'code': -2, 'msg': f'非法猥亵,文件不存在'}) + with open(js_path, 'r', encoding='UTF-8') as fp: + js = fp.read() + response = make_response(js) + response.headers['Content-Type'] = 'text/javascript; charset=utf-8' + return response + +def toHtml(jsPath): + base_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) # 上级目录 + js_path = os.path.join(base_path, jsPath) + with open(js_path, 'r', encoding='UTF-8') as fp: + js = fp.read() + response = make_response(js) + response.headers['Content-Type'] = 'text/html; charset=utf-8' + return response -- GitLab