From a09569b2d6b133271653b3364f0fcb5d635d1731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=9A=E9=A3=8E=E6=8B=82=E6=9F=B3=E9=A2=9C?= <434857005@qq.com> Date: Tue, 4 Jul 2023 11:45:34 +0800 Subject: [PATCH] update --- controllers/vod.py | 4 +++- doc/写源教程.md | 17 +++++++++++++-- jiexi/斗鱼.js | 44 +++++++++++++++++++++++++++++++++++++++ js/007影视.js | 16 +++++++++++++- js/LIBVIO2.js | 52 ++++++++++++++++++++++++++++++++++++++++++++++ js/version.txt | 2 +- 6 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 jiexi/斗鱼.js create mode 100644 js/LIBVIO2.js diff --git a/controllers/vod.py b/controllers/vod.py index dde2187..8bbae63 100644 --- a/controllers/vod.py +++ b/controllers/vod.py @@ -372,7 +372,8 @@ def vod_home(): # print(jscode) ctx.eval(jscode) js_ret = ctx.get('rule') - ruleDict = ujson.loads(js_ret.json()) + rule_json = js_ret.json() # 规则的json字符串 + ruleDict = ujson.loads(rule_json) except Exception as e: logger.info(f'{e}') return R.failed('爬虫规则加载失败') @@ -455,5 +456,6 @@ def vod_home(): # print(data) return jsonify(data) # return jsonify({'rule':rule,'js_code':js_code}) + logger.info(rule_json) home_data = cms.homeContent(pg) return jsonify(home_data) \ No newline at end of file diff --git a/doc/写源教程.md b/doc/写源教程.md index 318c45f..cf7bb9b 100644 --- a/doc/写源教程.md +++ b/doc/写源教程.md @@ -98,7 +98,7 @@ 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', +class_parse:`.navbar-items li:gt(1):lt(6);a&&Text;a&&href;.*/(.*?).html`, }); ``` 模板继承写法(新) @@ -107,8 +107,21 @@ var rule = { title:'cokemv', 模板:'mxpro', host:'https://cokemv.me', -class_parse:'.navbar-items li:gt(1):lt(7);a&&Text;a&&href;/(\\d+).html', +class_parse:`.navbar-items li:gt(1):lt(7);a&&Text;a&&href;/(\\d+).html`, } ``` + +源正则写法说明 +```text +属性class_parse按;分隔后取[3]为分类的正则字符串。 +这里的正则跟js的/.*/这种写法相比,由于是字符串,需要实现字符串标准。 +比如想实现 /(\d+)/ 那么字符串写法为 (\\d+) +原理是 new RegExp('(\\d+)') = /(\d+)/ + +属性lazy由于是纯js代码实现,不存在正则转义问题。 +每个源的属性对应的值如果是字符串,可以用反引号``包含起来。 +避免内部出现单双引号混用等需\转义问题 +``` + js:内置变量 input,html,VODS,VOD,TABS,LISTS,MY_CATE,MY_FL \ No newline at end of file diff --git a/jiexi/斗鱼.js b/jiexi/斗鱼.js new file mode 100644 index 0000000..2ccd27f --- /dev/null +++ b/jiexi/斗鱼.js @@ -0,0 +1,44 @@ +js: +//输入的vipUrl如:https://m.douyu.com/312212?dyshid=0-00000003333&dyshci=1 +function getSign(script, rid, did, tt){ + + let result = script.match(/(function ub98484234.*)\s(var.*)/)[0]; + let func_ub9 = result.replace(/eval.*;}/, 'strc;}', result); + eval(func_ub9); + + let res = ub98484234(); + let v = res.match(/v=(\d+)/)[0].replace("v=", ''); + let rb = md5(rid + did + tt + v); + + let func_sign = res.replace(/return rt;}\);?/, 'return rt;}'); + func_sign = func_sign.replace('(function (', 'function sign('); + func_sign = func_sign.replace('CryptoJS.MD5(cb).toString()', '"' + rb + '"'); + eval(func_sign); + + let params = sign(rid, did, tt) + "&ver=219032101&rid={}&rate=-1&rid="+rid; + return params +} +// log(env); +// fetch_params.headers.Referer = vipUrl; +try { + // realUrl = null; + let html = request(vipUrl); + // log(html); + let rid = html.match(/rid":(.*?),"vipId/)[1]; + log(rid); + // let tt = Date.parse(new Date()).toString().substr(0, 10); + let tt = Math.round(new Date().getTime()/1000).toString(); + let did = '10000000000000000000000000001501'; + let param_body = getSign(html, rid, did, tt); + log(param_body); + let stream_json = request('https://m.douyu.com/api/room/ratestream', {headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, body: param_body, method:'POST'}); + log(stream_json); + let stream = JSON.parse(stream_json).data; + realUrl = stream.url; + log('解析到真实播放地址:'+realUrl); +}catch (e) { + log('解析发生错误:'+e.message); + realUrl = vipUrl; +} \ No newline at end of file diff --git a/js/007影视.js b/js/007影视.js index 9ab99c7..b30e67d 100644 --- a/js/007影视.js +++ b/js/007影视.js @@ -24,7 +24,21 @@ var rule = { "20":[{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}] }, class_parse: '.stui-header__menu li:gt(0):lt(9);a&&Text;a&&href;.*/(.*?).html', - lazy:"js:var html=JSON.parse(request(input).match(/r player_.*?=(.*?)