app.py 6.0 KB
Newer Older
H
hjdhnx 已提交
1 2 3 4 5
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# File  : app.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date  : 2022/8/25
H
hjdhnx 已提交
6
import os
H
hjdhnx 已提交
7

H
hjdhnx 已提交
8
from flask import Flask, jsonify, abort,request,redirect,make_response,render_template,send_from_directory
H
hjdhnx 已提交
9
from js.rules import getRules
H
hjdhnx 已提交
10
from utils import error,parser
H
hjdhnx 已提交
11 12
import sys
import codecs
H
hjdhnx 已提交
13
from models.cms import CMS
H
hjdhnx 已提交
14
import json
H
hjdhnx 已提交
15 16
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())

H
hjdhnx 已提交
17
app = Flask(__name__,static_folder='static',static_url_path='/static')
H
hjdhnx 已提交
18
app.config["JSON_AS_ASCII"] = False  # jsonify返回的中文正常显示
H
hjdhnx 已提交
19
from utils.web import *
H
hjdhnx 已提交
20 21
rule_list = getRules()
print(rule_list)
H
hjdhnx 已提交
22

23
def getParmas(key=None,value=''):
H
hjdhnx 已提交
24 25 26 27 28 29 30 31 32 33 34
    """
    获取链接参数
    :param key:
    :return:
    """
    args = {}
    if request.method == 'POST':
        args = request.json
    elif request.method == 'GET':
        args = request.args
    if key:
35
        return args.get(key,value)
H
hjdhnx 已提交
36 37 38
    else:
        return args

H
hjdhnx 已提交
39 40 41 42 43 44
@app.route('/')
def forbidden():  # put application's code here
    abort(403)

@app.route('/index')
def index():  # put application's code here
H
hjdhnx 已提交
45
    return render_template('index.html',getHost=getHost)
H
hjdhnx 已提交
46

H
hjdhnx 已提交
47 48 49
@app.route('/vod')
def vod():
    rule = getParmas('rule')
H
hjdhnx 已提交
50
    ext = getParmas('ext')
H
hjdhnx 已提交
51
    if not ext.startswith('http') and not rule:
H
hjdhnx 已提交
52
        return jsonify(error.failed('规则字段必填'))
H
hjdhnx 已提交
53 54
    if not ext.startswith('http') and not rule in rule_list:
        msg = f'服务端本地仅支持以下规则:{",".join(rule_list)}'
H
hjdhnx 已提交
55 56
        return jsonify(error.failed(msg))

H
hjdhnx 已提交
57
    js_path = f'js/{rule}.js' if not ext.startswith('http') else ext
H
hjdhnx 已提交
58
    ctx,js_code = parser.runJs(js_path)
H
hjdhnx 已提交
59 60
    if not js_code:
        return jsonify(error.failed('爬虫规则加载失败'))
H
hjdhnx 已提交
61 62
    rule = ctx.eval('rule')
    cms = CMS(rule)
H
hjdhnx 已提交
63 64 65 66 67 68 69
    wd = getParmas('wd')
    ac = getParmas('ac')
    quick = getParmas('quick')
    play = getParmas('play')
    flag = getParmas('flag')
    filter = getParmas('filter')
    t = getParmas('t')
70 71
    pg = getParmas('pg','1')
    pg = int(pg)
H
hjdhnx 已提交
72 73 74
    ids = getParmas('ids')
    q = getParmas('q')

H
hjdhnx 已提交
75 76 77 78 79
    if ac and t: # 一级
        data = cms.categoryContent(t,pg)
        # print(data)
        return jsonify(data)
    if ac and ids: # 二级
80 81 82 83
        id_list = ids.split(',')
        # print(len(id_list))
        # print(id_list)
        data = cms.detailContent(pg,id_list)
H
hjdhnx 已提交
84 85 86 87 88 89 90 91
        # print(data)
        return jsonify(data)
    if wd: # 搜索
        data = cms.searchContent(wd)
        # print(data)
        return jsonify(data)

    # return jsonify({'rule':rule,'js_code':js_code})
92
    home_data = cms.homeContent(pg)
H
hjdhnx 已提交
93
    return jsonify(home_data)
H
hjdhnx 已提交
94

H
hjdhnx 已提交
95 96 97 98 99
@app.route('/clear')
def clear():
    rule = getParmas('rule')
    if not rule:
        return jsonify(error.failed('规则字段必填'))
H
hjdhnx 已提交
100
    cache_path = os.path.abspath(f'cache/{rule}.js')
H
hjdhnx 已提交
101
    if not os.path.exists(cache_path):
H
hjdhnx 已提交
102
        return jsonify(error.failed('服务端没有此规则的缓存文件!'+cache_path))
H
hjdhnx 已提交
103 104 105
    os.remove(cache_path)
    return jsonify(error.success('成功删除文件:'+cache_path))

H
hjdhnx 已提交
106 107 108 109
def getRules(path='cache'):
    base_path = path+'/'  # 当前文件所在目录
    # print(base_path)
    os.makedirs(base_path,exist_ok=True)
H
hjdhnx 已提交
110 111 112 113
    file_name = os.listdir(base_path)
    file_name = list(filter(lambda x: str(x).endswith('.js'), file_name))
    # print(file_name)
    rule_list = [file.replace('.js', '') for file in file_name]
H
hjdhnx 已提交
114 115 116
    rules = {'list': rule_list, 'count': len(rule_list)}
    return rules

H
hjdhnx 已提交
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
def getHost(mode=0):
    ip = request.remote_addr
    port = request.environ.get('SERVER_PORT')
    # mode 为0是本地,1是局域网 2是线上
    if mode == 0:
        host = f'localhost:{port}'
    elif mode == 1:
        host = f'{ip}:{port}'
    else:
        host = 'cms.nokia.press'
    return host


@app.route('/favicon.ico')  # 设置icon
def favicon():
    return app.send_static_file('img/favicon.svg')
    # 对于当前文件所在路径,比如这里是static下的favicon.ico
    return send_from_directory(os.path.join(app.root_path, 'static'),  'img/favicon.svg', mimetype='image/vnd.microsoft.icon')


H
hjdhnx 已提交
137 138 139 140 141 142 143 144
@app.route('/rules')
def rules():
    return render_template('rules.html',rules=getRules())

@app.route('/raw')
def rules_raw():
    return render_template('raw.html',rules=getRules())

H
hjdhnx 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
@app.route('/config/<int:mode>')
def config_render(mode):
    html = render_template('config.txt',rules=getRules('js'),host=getHost(mode),mode=mode)
    response = make_response(html)
    response.headers['Content-Type'] = 'application/json; charset=utf-8'
    return response

@app.route('/configs')
def config_gen():
    # 生成文件
    set_local = render_template('config.txt',rules=getRules('js'),mode=0,host=getHost(0))
    set_area = render_template('config.txt',rules=getRules('js'),mode=1,host=getHost(1))
    set_online = render_template('config.txt',rules=getRules('js'),mode=1,host=getHost(2))
    with open('pycms0.json','w+',encoding='utf-8') as f:
        set_dict = json.loads(set_local)
        f.write(json.dumps(set_dict,ensure_ascii=False,indent=4))
    with open('pycms1.json','w+',encoding='utf-8') as f:
        set_dict = json.loads(set_area)
        f.write(json.dumps(set_dict,ensure_ascii=False,indent=4))

    with open('pycms2.json','w+',encoding='utf-8') as f:
        set_dict = json.loads(set_online)
        f.write(json.dumps(set_dict,ensure_ascii=False,indent=4))
    files = [os.path.abspath(f'pycms{i}.json') for i in range(3)]
    # print(files)
    return jsonify(error.success('猫配置生成完毕,文件位置在:\n'+'\n'.join(files)))

H
hjdhnx 已提交
172 173 174 175 176 177 178 179 180
@app.route("/plugin/<name>",methods=['GET'])
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'))
    try:
        return parser.toJs(name)
    except Exception as e:
        return jsonify(error.failed(f'非法猥亵\n{e}'))
H
hjdhnx 已提交
181 182


H
hjdhnx 已提交
183
if __name__ == '__main__':
H
hjdhnx 已提交
184 185
    app.run(host="0.0.0.0", port=5705)
    # app.run(debug=True, host='0.0.0.0', port=5705)