From ff03d664377a61ed18d2a094a2e82e50dbe535e7 Mon Sep 17 00:00:00 2001 From: hjdhnx Date: Wed, 31 Aug 2022 14:47:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E6=93=8D=E4=BD=9C=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 43 ++++++++++--- readme.md | 12 +++- templates/admin.html | 146 +++++++++++++++++++++++++++++++++++++++++-- templates/raw.html | 6 +- templates/rules.html | 4 +- utils/parser.py | 4 +- 6 files changed, 194 insertions(+), 21 deletions(-) diff --git a/app.py b/app.py index 60cf070..b6f41c2 100644 --- a/app.py +++ b/app.py @@ -99,7 +99,7 @@ def admin_home(): # 管理员界面 if not verfy_token(token): return render_template('login.html') # return jsonify(error.success('登录成功')) - return render_template('admin.html') + return render_template('admin.html',rules=getRules('js')) @app.route('/api/login',methods=['GET','POST']) def login_api(): @@ -118,6 +118,26 @@ def login_api(): else: return jsonify(error.failed('登录失败,用户名或密码错误')) +@app.route("/admin/view/",methods=['GET']) +def admin_view_rule(name): + if not name or not name.split('.')[-1] in ['js','txt','py','json']: + return jsonify(error.failed(f'非法猥亵,未指定文件名。必须包含js|txt|json|py')) + try: + return parser.toJs(name,'js') + except Exception as e: + return jsonify(error.failed(f'非法猥亵\n{e}')) + +@app.route('/admin/clear/') +def admin_clear_rule(name): + if not name or not name.split('.')[-1] in ['js','txt','py','json']: + return jsonify(error.failed(f'非法猥亵,未指定文件名。必须包含js|txt|json|py')) + + file_path = os.path.abspath(f'js/{name}') + if not os.path.exists(file_path): + return jsonify(error.failed('服务端没有此文件!'+file_path)) + os.remove(file_path) + return jsonify(error.success('成功删除文件:'+file_path)) + @app.route('/upload', methods=['GET', 'POST']) def upload_file(): cookies = request.cookies @@ -127,13 +147,18 @@ def upload_file(): if not verfy_token(token): return render_template('login.html') if request.method == 'POST': - f = request.files['file'] - # print(request.files) - filename = secure_filename(f.filename) - savePath = f'js/{filename}' - # print(savePath) - f.save(savePath) - return jsonify(error.success('文件上传成功')) + try: + f = request.files['file'] + # print(request.files) + filename = secure_filename(f.filename) + savePath = f'js/{filename}' + if os.path.exists(savePath): + return jsonify(error.failed(f'上传失败,文件已存在,请先查看删除再试')) + # print(savePath) + f.save(savePath) + return jsonify(error.success('文件上传成功')) + except Exception as e: + return jsonify(error.failed(f'文件上传失败!{e}')) else: # return render_template('upload.html') return jsonify(error.failed('文件上传失败')) @@ -409,7 +434,7 @@ def config_gen(): def plugin(name): # name=道长影视模板.js if not name or not name.split('.')[-1] in ['js','txt','py','json']: - return jsonify(error.failed(f'非法威胁,未指定文件名。必须包含js|txt|json|py')) + return jsonify(error.failed(f'非法猥亵,未指定文件名。必须包含js|txt|json|py')) try: return parser.toJs(name) except Exception as e: diff --git a/readme.md b/readme.md index b4eb7e9..e625b42 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,8 @@ ##### python3.6-3.8完美运行(3.9以上不支持linux进程启动) ###### 更新日志 ###### 2022/08/30 -- [X] 1.增加管理员登录功能(用户上传和删除规则) +- [X] 1.增加管理员登录功能 +- [X] 2.增加管理员上传和删除内置规则功能 ###### 2022/08/30 - [X] 1.增加动态局域网ip获取 - [X] 2.增加js规则热加载(增删改不用重启) @@ -121,4 +122,13 @@ var rule = { // 搜索可以是*,集成一级,或者跟一级一样的写法 列表;标题;图片;描述;链接;详情 搜索:'*', } +``` +模板继承写法 +```javascript +var rule = Object.assign(muban.mxpro,{ +title:'鸭奈飞', +host:'https://yanetflix.com', +url:'/index.php/vod/show/id/fyclass/page/fypage.html', +class_parse:'.navbar-items li:gt(1):lt(6);a&&Text;a&&href;.*/(.*?).html', +}); ``` \ No newline at end of file diff --git a/templates/admin.html b/templates/admin.html index dfd2aec..446b944 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -2,19 +2,157 @@ - 管理员操作中心 + 管理员操作中心-{{rules.count}}条规则 + + -

欢迎使用py_dr管理员界面

+ + +

欢迎使用py_dr管理员界面

返回首页

你可以在此页面在线上传规则文件到js目录或者删除js目录的文件

- - + + +
+

+ +

内置规则列表

+{% if rules.count < 1 %} +

暂无内置的规则

+{% endif %} +{% for rule in rules.list %} + {% if rule.name|length > 2 %} +
  • + {{ rule.name }} + 删除 +
  • + {% else %} +
  • + {{ rule.name }} + 删除 +
  • + {% endif %} + {% endfor %} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/raw.html b/templates/raw.html index c538fd1..acea3f4 100644 --- a/templates/raw.html +++ b/templates/raw.html @@ -47,17 +47,17 @@ {% for rule in rules.list %} - {% if rule|length > 2 %} + {% if rule.name|length > 2 %}
  • - {{ rule }} + {{ rule.name }}
  • {% else %}
  • - {{ rule }} + {{ rule.name }}
  • {% endif %} diff --git a/templates/rules.html b/templates/rules.html index d516343..f6c0d60 100644 --- a/templates/rules.html +++ b/templates/rules.html @@ -65,13 +65,13 @@
  • - {{ rule }} + {{ rule.name }}
  • {% else %}
  • - {{ rule }} + {{ rule.name }}
  • {% endif %} diff --git a/utils/parser.py b/utils/parser.py index 679eaf5..86c7619 100644 --- a/utils/parser.py +++ b/utils/parser.py @@ -68,9 +68,9 @@ def runJs(jsPath, before='', after='', ctx=None): # loader.execute(jscode_to_run) # return loader,js_code -def toJs(jsPath): +def toJs(jsPath,jsRoot='cache'): base_path = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) # 上级目录 - js_path = os.path.join(base_path, f'cache/{jsPath}') + js_path = os.path.join(base_path, f'{jsRoot}/{jsPath}') print(js_path) if not os.path.exists(js_path): return jsonify({'code': -2, 'msg': f'非法猥亵,文件不存在'}) -- GitLab