From 20492ff7946c2c2f19b9389c681670a1ff9eb91b Mon Sep 17 00:00:00 2001 From: hjdhnx Date: Sun, 28 Aug 2022 12:34:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 16 ++++++++++--- classes/cms.py | 23 +++++++++++++++---- config.py | 4 +++- "js/555\345\275\261\350\247\206.js" | 1 + js/cokemv.js | 1 + "js/\345\226\265\345\226\265.js" | 1 + "js/\345\244\234\347\251\272.js" | 1 + ...51\345\201\266\345\247\220\345\247\220.js" | 1 + "js/\347\223\234\347\232\256TV.js" | 1 + "js/\350\216\253\346\211\216\345\205\224.js" | 1 + ...35\350\216\223\345\275\261\350\247\206.js" | 1 + "js/\351\270\255\345\245\210\351\243\236.js" | 1 + readme.md | 2 ++ utils/web.py | 13 ++++++++++- 14 files changed, 58 insertions(+), 9 deletions(-) diff --git a/app.py b/app.py index f92632d..c979ae3 100644 --- a/app.py +++ b/app.py @@ -6,11 +6,12 @@ from flask_sqlalchemy import SQLAlchemy import config +# import settings import warnings warnings.filterwarnings('ignore') import os -from flask import Flask, jsonify, abort,request,redirect,make_response,render_template,send_from_directory +from flask import Flask, jsonify, abort,request,redirect,make_response,render_template,send_from_directory,url_for from js.rules import getRules from utils import error,parser from utils.web import * @@ -19,11 +20,13 @@ import codecs from classes.cms import CMS,logger import json sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) - app = Flask(__name__,static_folder='static',static_url_path='/static') # app.config["JSON_AS_ASCII"] = False # jsonify返回的中文正常显示 app.config.from_object(config) # 单独的配置文件里写了,这里就不用弄json中文显示了 +# new_conf = get_conf(settings) +# print(new_conf) +print('自定义播放解析地址:',app.config.get('PLAY_URL')) app.logger.name="drLogger" db = SQLAlchemy(app) @@ -60,10 +63,17 @@ def forbidden(): # put application's code here @app.route('/index') def index(): # put application's code here # logger.info("进入了首页") + a = redirect(url_for('vod')).headers['Location'] + print(a) return render_template('index.html',getHost=getHost) @app.route('/vod') def vod(): + play_url = getParmas('play_url') + if play_url: # 播放 + logger.info(f'播放重定向到:{play_url}') + return redirect(play_url) + rule = getParmas('rule') ext = getParmas('ext') if not ext.startswith('http') and not rule: @@ -77,7 +87,7 @@ def vod(): if not js_code: return jsonify(error.failed('爬虫规则加载失败')) rule = ctx.eval('rule') - cms = CMS(rule,db,RuleClass) + cms = CMS(rule,db,RuleClass,app.config) wd = getParmas('wd') ac = getParmas('ac') quick = getParmas('quick') diff --git a/classes/cms.py b/classes/cms.py index c284ec7..3b8ffcc 100644 --- a/classes/cms.py +++ b/classes/cms.py @@ -14,9 +14,22 @@ from utils.htmlParser import jsoup from urllib.parse import urljoin from concurrent.futures import ThreadPoolExecutor # 引入线程池 from time import time +from flask import url_for,redirect class CMS: - def __init__(self,rule,db=None,RuleClass=None): + def __init__(self, rule, db=None, RuleClass=None, new_conf=None): + if new_conf is None: + new_conf = {} + self.play_parse = rule.get('play_parse', False) + play_url = new_conf.get('PLAY_URL',getHost(1)) + if not play_url.startswith('http'): + play_url = 'http://'+play_url + self.vod = redirect(url_for('vod')).headers['Location'] + if self.play_parse: + self.play_url = play_url + self.vod + '?play_url=' + logger.info(f'cms重定向链接:{self.play_url}') + else: + self.play_url = '' self.db = db self.RuleClass = RuleClass host = rule.get('host','').rstrip('/') @@ -386,7 +399,7 @@ class CMS: if p == '*': vod = self.blank_vod() vod['vod_play_from'] = '道长在线' - vod['desc'] = detailUrl + vod['desc'] = self.play_url+detailUrl vod['vod_actor'] = '没有二级,只有一级链接直接嗅探播放' vod['content'] = detailUrl vod['vod_play_url'] = '嗅探播放$'+detailUrl @@ -454,7 +467,8 @@ class CMS: for i in range(len(vodHeader)): p1 = p['lists'].replace('#id',str(i)) vodList = pdfa(html,p1) # 1条线路的选集列表 - vodList = [pq(i).text()+'$'+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 + # vodList = [pq(i).text()+'$'+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 + vodList = [pq(i).text()+'$'+self.play_url+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 vlist = '#'.join(vodList) # 拼多个选集 vod_tab_list.append(vlist) vod_play_url = vod_play_url.join(vod_tab_list) @@ -483,7 +497,8 @@ class CMS: 'list': vod_list } t2 = time() - logger.info(f'{self.getName()}获取详情页耗时:{round((t2-t1)*1000,2)}毫秒') + logger.info(f'{self.getName()}获取详情页耗时:{round((t2-t1)*1000,2)}毫秒,共计{round(len(str(result))/1000,2)} kb') + # print(result) return result def searchContent(self, key, fypage=1): diff --git a/config.py b/config.py index dd6595d..cdef035 100644 --- a/config.py +++ b/config.py @@ -16,4 +16,6 @@ DB_URI = 'sqlite:///models/rules.db?charset=utf8&check_same_thread=False' SQLALCHEMY_DATABASE_URI = DB_URI SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_ECHO = False # 打印sql语句 -JSON_AS_ASCII = False # jsonify返回的中文正常显示 \ No newline at end of file +JSON_AS_ASCII = False # jsonify返回的中文正常显示 +# PLAY_URL = 'http://localhost:5705' # 匹配远程解析服务器链接 +# PLAY_URL = PLAY_URL.rstrip('/') \ No newline at end of file diff --git "a/js/555\345\275\261\350\247\206.js" "b/js/555\345\275\261\350\247\206.js" index 57141a4..a9df19b 100644 --- "a/js/555\345\275\261\350\247\206.js" +++ "b/js/555\345\275\261\350\247\206.js" @@ -11,6 +11,7 @@ var rule = { // class_name:'电影&连续剧&福利&动漫&综艺', // class_url:'1&2&124&4&3', class_parse:'.navbar-items li:gt(2):lt(8);a&&Text;a&&href;/(\\d+).html', + play_parse:true, limit:10, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git a/js/cokemv.js b/js/cokemv.js index 7f99ee7..8d094d4 100644 --- a/js/cokemv.js +++ b/js/cokemv.js @@ -10,6 +10,7 @@ var rule = { }, timeout:5000, class_parse:'.navbar-items li:gt(1):lt(7);a&&Text;a&&href;/(\\d+).html', + play_parse:true, limit:8, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\345\226\265\345\226\265.js" "b/js/\345\226\265\345\226\265.js" index 63d2198..5aea615 100644 --- "a/js/\345\226\265\345\226\265.js" +++ "b/js/\345\226\265\345\226\265.js" @@ -9,6 +9,7 @@ var rule = { }, timeout:5000, class_parse:'.bm-item-list a:gt(0):lt(7);a&&Text;a&&href;/(\\d+).html', + play_parse:true, limit:5, 推荐:'.movie-list-body;.movie-list-item;.movie-title&&Text;.movie-post-lazyload&&data-original;.movie-rating&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\345\244\234\347\251\272.js" "b/js/\345\244\234\347\251\272.js" index fa22db6..79921cb 100644 --- "a/js/\345\244\234\347\251\272.js" +++ "b/js/\345\244\234\347\251\272.js" @@ -11,6 +11,7 @@ var rule = { // class_name:'电影&连续剧&福利&动漫&综艺', // class_url:'1&2&124&4&3', class_parse:'.navbar-items li:gt(1):lt(7);a&&Text;a&&href;.*v/(.*?)/', + play_parse:true, limit:10, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\347\216\251\345\201\266\345\247\220\345\247\220.js" "b/js/\347\216\251\345\201\266\345\247\220\345\247\220.js" index feda1f7..dce2f3a 100644 --- "a/js/\347\216\251\345\201\266\345\247\220\345\247\220.js" +++ "b/js/\347\216\251\345\201\266\345\247\220\345\247\220.js" @@ -8,6 +8,7 @@ var rule = { }, timeout:5000, class_parse:'#side-menu:lt(1) li;a&&Text;a&&href;com/(.*?)/', + play_parse:true, 一级:'.col-sm-6;h3&&Text;img&&data-src;.date&&Text;a&&href', 二级:'*', } \ No newline at end of file diff --git "a/js/\347\223\234\347\232\256TV.js" "b/js/\347\223\234\347\232\256TV.js" index 291f308..99024a3 100644 --- "a/js/\347\223\234\347\232\256TV.js" +++ "b/js/\347\223\234\347\232\256TV.js" @@ -11,6 +11,7 @@ var rule = { // class_name:'电影&连续剧&福利&动漫&综艺', // class_url:'1&2&124&4&3', class_parse:'.navbar-items li:gt(1):lt(8);a&&Text;a&&href;.*-(.*?).html', + play_parse:true, limit:10, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\350\216\253\346\211\216\345\205\224.js" "b/js/\350\216\253\346\211\216\345\205\224.js" index 64e36f8..232f7ca 100644 --- "a/js/\350\216\253\346\211\216\345\205\224.js" +++ "b/js/\350\216\253\346\211\216\345\205\224.js" @@ -11,6 +11,7 @@ var rule = { // class_name:'电影&连续剧&福利&动漫&综艺', // class_url:'1&2&124&4&3', class_parse:'.navbar-items li:gt(2):lt(8);a&&Text;a&&href;.*/(.*?).html', + play_parse:true, limit:10, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 diff --git "a/js/\350\223\235\350\216\223\345\275\261\350\247\206.js" "b/js/\350\223\235\350\216\223\345\275\261\350\247\206.js" index 583f65d..8ad39f8 100644 --- "a/js/\350\223\235\350\216\223\345\275\261\350\247\206.js" +++ "b/js/\350\223\235\350\216\223\345\275\261\350\247\206.js" @@ -10,6 +10,7 @@ var rule = { // class_name:'电影&网剧&剧集&动漫&综艺&记录', // class_url:'20&1&2&3&4&23', class_parse:'.navbar-items li:gt(1):lt(8);a&&Text;a&&href;/(\\d+).html', + play_parse:true, limit:30, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 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" index be8e6d7..7d942a4 100644 --- "a/js/\351\270\255\345\245\210\351\243\236.js" +++ "b/js/\351\270\255\345\245\210\351\243\236.js" @@ -8,6 +8,7 @@ var rule = { // class_name:'电影&连续剧&综艺&动漫', // class_url:'dianying&lianxuju&zongyi&dongman', class_parse:'.navbar-items li:gt(1):lt(6);a&&Text;a&&href;.*/(.*?).html', + play_parse:true, 推荐:'.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href', double:true, // 推荐内容是否双层定位 一级:'body a.module-poster-item.module-item;a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href', diff --git a/readme.md b/readme.md index 0a0ed29..b65d2e5 100644 --- a/readme.md +++ b/readme.md @@ -73,6 +73,8 @@ var rule = { class_url:'1&2&3&4',//静态分类标识拼接 //动态分类获取 列表;标题;链接;正则提取 不需要正则的时候后面别加分号 class_parse:'#side-menu:lt(1) li;a&&Text;a&&href;com/(.*?)/', + // 服务器解析播放 + play_parse:true, // 首页推荐显示数量 limit:6, double:true,//是否双层列表定位,默认false diff --git a/utils/web.py b/utils/web.py index 96b51a0..cd63e99 100644 --- a/utils/web.py +++ b/utils/web.py @@ -5,6 +5,7 @@ # Date : 2022/8/25 import socket +from werkzeug.utils import import_string from netifaces import interfaces, ifaddresses, AF_INET from flask import request from utils.log import logger @@ -52,4 +53,14 @@ def getHost(mode=0,port=None): host = f'{ip}:{port}' else: host = 'cms.nokia.press' - return host \ No newline at end of file + return host + +def get_conf(obj): + new_conf = {} + if isinstance(obj, str): + config = import_string(obj) + for key in dir(obj): + if key.isupper(): + new_conf[key] = getattr(obj, key) + # print(new_conf) + return new_conf \ No newline at end of file -- GitLab