From c31cb6852023eb8b37f0fbae32589562d9d9529a Mon Sep 17 00:00:00 2001 From: hjdhnx Date: Sat, 3 Sep 2022 21:24:44 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B8=A9=E4=BA=86=E6=97=A0=E6=95=B0=E4=B8=AA?= =?UTF-8?q?=E5=9D=91=E5=B9=B6=E5=AE=8C=E5=96=84=E4=BA=86360=E5=BD=B1?= =?UTF-8?q?=E8=A7=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/cms.py | 205 ++++++++++++++++------------ "js/360\345\275\261\350\247\206.js" | 3 +- libs/pre.js | 40 ++++++ "py/360\344\272\214\347\272\247.js" | 99 ++++++++++++++ utils/encode.py | 48 ++++++- 5 files changed, 303 insertions(+), 92 deletions(-) create mode 100644 "py/360\344\272\214\347\272\247.js" diff --git a/classes/cms.py b/classes/cms.py index 1180de8..3fa0e83 100644 --- a/classes/cms.py +++ b/classes/cms.py @@ -12,7 +12,7 @@ from models import * from utils.config import playerConfig from utils.log import logger from utils.encode import base64Encode,baseDecode,fetch,post,request,getCryptoJS,getPreJs,buildUrl,getHome -from utils.encode import verifyCode +from utils.encode import verifyCode,setDetail,join,urljoin2 from utils.safePython import safePython from utils.parser import runPy,runJScode,JsObjectWrapper from utils.htmlParser import jsoup @@ -24,7 +24,7 @@ from easydict import EasyDict as edict py_ctx = { 'requests':requests,'print':print,'base64Encode':base64Encode,'baseDecode':baseDecode, 'log':logger.info,'fetch':fetch,'post':post,'request':request,'getCryptoJS':getCryptoJS, -'buildUrl':buildUrl,'getHome':getHome +'buildUrl':buildUrl,'getHome':getHome,'setDetail':setDetail,'join':join,'urljoin2':urljoin2 } # print(getCryptoJS()) @@ -569,103 +569,128 @@ class CMS: if p == '*': vod = self.blank_vod() vod['vod_play_from'] = '道长在线' - vod['desc'] = self.play_url+detailUrl + vod['vod_remarks'] = self.play_url+detailUrl vod['vod_actor'] = '没有二级,只有一级链接直接嗅探播放' - vod['content'] = detailUrl + vod['vod_content'] = detailUrl vod['vod_play_url'] = '嗅探播放$'+detailUrl return vod - if not isinstance(p,dict): + if not isinstance(p,dict) and not isinstance(p,str) and not str(p).startswith('js:'): return vod jsp = jsoup(self.url) - is_json = p.get('is_json',False) # 二级里加is_json参数 - pdfh = jsp.pjfh if is_json else jsp.pdfh - pdfa = jsp.pjfa if is_json else jsp.pdfa - pd = jsp.pj if is_json else jsp.pd - pq = jsp.pq - obj = {} - vod_name = '' - r = requests.get(url, headers=self.headers, timeout=self.timeout) - r.encoding = self.encoding - # html = r.text - html = r.json() if is_json else r.text - # print(html) - if p.get('title'): - p1 = p['title'].split(';') - vod_name = pdfh(html,p1[0]).replace('\n',' ') - # title = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) - title = '\n'.join([','.join([pdfh(html, pp1).strip() for pp1 in i.split('+')]) for i in p1]) - # print(title) - obj['title'] = title - if p.get('desc'): - p1 = p['desc'].split(';') - desc = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) - obj['desc'] = desc - - if p.get('content'): - p1 = p['content'].split(';') - content = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) - obj['content'] = content - - if p.get('img'): - p1 = p['img'].split(';') - img = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) - obj['img'] = img - - vod = { - "vod_id": detailUrl, - "vod_name": vod_name, - "vod_pic": obj.get('img',''), - "type_name": obj.get('title',''), - "vod_year": "", - "vod_area": "", - "vod_remarks": obj.get('desc',''), - "vod_actor": "", - "vod_director": "", - "vod_content": obj.get('content','') - } - - vod_play_from = '$$$' - playFrom = [] - if p.get('tabs'): - vodHeader = pdfa(html,p['tabs'].split(';')[0]) - # print(f'线路列表数:{len((vodHeader))}') - # print(vodHeader) - if not is_json: - vodHeader = [pq(v).text() for v in vodHeader] + is_json = p.get('is_json',False) if isinstance(p,dict) else False # 二级里加is_json参数 + is_js = isinstance(p,str) and str(p).startswith('js:') # 是js + if is_js: + headers['Referer'] = getHome(url) + py_ctx.update({ + 'input': url, + 'fetch_params': {'headers': headers, 'timeout': self.d.timeout, 'encoding': self.d.encoding}, + 'd': self.d, + 'getParse': self.d.getParse, + 'saveParse': self.d.saveParse, + 'jsp':jsp,'setDetail':setDetail, + }) + ctx = py_ctx + # print(ctx) + jscode = getPreJs() + p.replace('js:','',1) + # print(jscode) + loader, _ = runJScode(jscode, ctx=ctx) + # print(loader.toString()) + vod = loader.eval('vod') + if isinstance(vod,JsObjectWrapper): + vod = vod.to_dict() + else: + vod = {} + # print(type(vod)) + # print(vod) else: - vodHeader = ['道长在线'] - - for v in vodHeader: - playFrom.append(v) - vod_play_from = vod_play_from.join(playFrom) - - vod_play_url = '$$$' - vod_tab_list = [] - if p.get('lists'): - for i in range(len(vodHeader)): - tab_name = str(vodHeader[i]) - tab_ext = p['tabs'].split(';')[1] if len(p['tabs'].split(';')) > 1 else '' - p1 = p['lists'].replace('#idv',tab_name).replace('#id',str(i)) - tab_ext = tab_ext.replace('#idv',tab_name).replace('#id',str(i)) - vodList = pdfa(html,p1) # 1条线路的选集列表 - # print(vodList) - # vodList = [pq(i).text()+'$'+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 - if self.play_parse: # 自动base64编码 - vodList = [(pdfh(html,tab_ext) if tab_ext else tab_name)+'$'+self.play_url+base64Encode(i) for i in vodList] if is_json else\ - [pq(i).text()+'$'+self.play_url+base64Encode(pd(i,'a&&href')) for i in vodList] # 拼接成 名称$链接 - else: - vodList = [(pdfh(html, tab_ext) if tab_ext else tab_name) + '$' + self.play_url + i for i in - vodList] if is_json else \ - [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) - # print(vod_play_url) - vod['vod_play_from'] = vod_play_from - vod['vod_play_url'] = vod_play_url + pdfh = jsp.pjfh if is_json else jsp.pdfh + pdfa = jsp.pjfa if is_json else jsp.pdfa + pd = jsp.pj if is_json else jsp.pd + pq = jsp.pq + obj = {} + vod_name = '' + r = requests.get(url, headers=self.headers, timeout=self.timeout) + r.encoding = self.encoding + # html = r.text + html = r.json() if is_json else r.text + # print(html) + if p.get('title'): + p1 = p['title'].split(';') + vod_name = pdfh(html,p1[0]).replace('\n',' ') + # title = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) + title = '\n'.join([','.join([pdfh(html, pp1).strip() for pp1 in i.split('+')]) for i in p1]) + # print(title) + obj['title'] = title + if p.get('desc'): + p1 = p['desc'].split(';') + desc = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) + obj['desc'] = desc + + if p.get('content'): + p1 = p['content'].split(';') + content = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) + obj['content'] = content + + if p.get('img'): + p1 = p['img'].split(';') + img = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) + obj['img'] = img + + vod = { + "vod_id": detailUrl, + "vod_name": vod_name, + "vod_pic": obj.get('img',''), + "type_name": obj.get('title',''), + "vod_year": "", + "vod_area": "", + "vod_remarks": obj.get('desc',''), + "vod_actor": "", + "vod_director": "", + "vod_content": obj.get('content','') + } + + vod_play_from = '$$$' + playFrom = [] + if p.get('tabs'): + vodHeader = pdfa(html,p['tabs'].split(';')[0]) + # print(f'线路列表数:{len((vodHeader))}') + # print(vodHeader) + if not is_json: + vodHeader = [pq(v).text() for v in vodHeader] + else: + vodHeader = ['道长在线'] + + for v in vodHeader: + playFrom.append(v) + vod_play_from = vod_play_from.join(playFrom) + + vod_play_url = '$$$' + vod_tab_list = [] + if p.get('lists'): + for i in range(len(vodHeader)): + tab_name = str(vodHeader[i]) + tab_ext = p['tabs'].split(';')[1] if len(p['tabs'].split(';')) > 1 else '' + p1 = p['lists'].replace('#idv',tab_name).replace('#id',str(i)) + tab_ext = tab_ext.replace('#idv',tab_name).replace('#id',str(i)) + vodList = pdfa(html,p1) # 1条线路的选集列表 + # print(vodList) + # vodList = [pq(i).text()+'$'+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 + if self.play_parse: # 自动base64编码 + vodList = [(pdfh(html,tab_ext) if tab_ext else tab_name)+'$'+self.play_url+base64Encode(i) for i in vodList] if is_json else\ + [pq(i).text()+'$'+self.play_url+base64Encode(pd(i,'a&&href')) for i in vodList] # 拼接成 名称$链接 + else: + vodList = [(pdfh(html, tab_ext) if tab_ext else tab_name) + '$' + self.play_url + i for i in + vodList] if is_json else \ + [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) + # print(vod_play_url) + vod['vod_play_from'] = vod_play_from + vod['vod_play_url'] = vod_play_url except Exception as e: logger.info(f'{self.getName()}获取单个详情页{detailUrl}出错{e}') # print(vod) diff --git "a/js/360\345\275\261\350\247\206.js" "b/js/360\345\275\261\350\247\206.js" index c2606c3..5fbb007 100644 --- "a/js/360\345\275\261\350\247\206.js" +++ "b/js/360\345\275\261\350\247\206.js" @@ -19,7 +19,8 @@ var rule = { lazy:'js:input="https://cache.json.icu/home/api?type=ys&uid=292796&key=fnoryABDEFJNPQV269&url="+input.split("?")[0];log(input);let html=JSON.parse(request(input));log(html);input=html.url||input', 推荐:'json:data;title;cover;comment;cat+ent_id;description', 一级:'json:data.movies;title;cover;pubdate;id;description', - 二级:{is_json:1,"title":"data.title;data.moviecategory[0]+data.moviecategory[1]","img":"data.cdncover","desc":"data.area[0];data.director[0]","content":"data.description","tabs":"data.playlink_sites;data.playlinksdetail.#idv.quality","lists":"data.playlinksdetail.#idv.default_url"}, + // 二级:{is_json:1,"title":"data.title;data.moviecategory[0]+data.moviecategory[1]","img":"data.cdncover","desc":"data.area[0];data.director[0]","content":"data.description","tabs":"data.playlink_sites;data.playlinksdetail.#idv.quality","lists":"data.playlinksdetail.#idv.default_url"}, // 二级:{is_json:1,"title":"data.title;data.moviecategory[0]+data.moviecategory[1]","img":"data.cdncover","desc":"data.area[0];data.director[0]","content":"data.description","tabs":"data.playlink_sites","lists":"data.playlinksdetail.#idv.default_url"}, + 二级:'js:let html=JSON.parse(fetch(input,fetch_params));let data=html.data;let tilte=data.title;let img=data.cdncover;let vod_type=data.moviecategory.join(",");let area=data.area.join(",");let director=data.director.join(",");let actor=data.actor.join(",");let content=data.description;base_vod={vod_id:input,vod_name:tilte,type_name:vod_type,vod_actor:actor,vod_director:director,vod_content:content,vod_remarks:area,vod_pic:urljoin2(input,img)};let delta=200;let vod_play={};let sites=data.playlink_sites;for(let i in sites){let site=sites[i];let playList="";let vodItems=[];if(data.allupinfo){let total=parseInt(data.allupinfo[site]);for(let j=1;j0){playList=vodItems.join("#")}if(playList.length<1){continue}vod_play[site]=playList}let tabs=Object.keys(vod_play);let playUrls=[];for(let id in tabs){playUrls.push(vod_play[tabs[id]])}if(tabs.length>0){vod_play_from=tabs.join("$$$");vod_play_url=playUrls.join("$$$");base_vod.vod_play_from=vod_play_from;base_vod.vod_play_url=vod_play_url}vod=base_vod;', 搜索:'json:data.longData.rows;titleTxt;cover;score;cat_id+id;description', } \ No newline at end of file diff --git a/libs/pre.js b/libs/pre.js index 28e0564..92df381 100644 --- a/libs/pre.js +++ b/libs/pre.js @@ -1,3 +1,43 @@ +Object.assign = function () { + var target = arguments[0]; + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; +}; +Object.prototype.myValues=function(obj){ + if(obj ==null) { + throw new TypeError("Cannot convert undefined or null to object"); + } + var res=[] + for(var k in obj){ + if(obj.hasOwnProperty(k)){//需判断是否是本身的属性 + res.push(obj[k]); + } + } + return res; +} +Array.prototype.join = function (emoji) { + emoji = emoji||','; + let self = this; + let str = ""; + let i = 0; + if (!Array.isArray(self)) {throw String(self)+'is not Array'} + if(self.length===0){return ''} + if (self.length === 1){return String(self[0])} + i = 1; + str = this[0]; + for (; i < self.length; i++) { + str += String(emoji)+String(self[i]); + } + return str; +}; +// 千万不要用for in 推荐 forEach (for in 会打乱顺序) //猫函数 function maoss(jxurl, ref, key) { eval(getCryptoJS()); diff --git "a/py/360\344\272\214\347\272\247.js" "b/py/360\344\272\214\347\272\247.js" new file mode 100644 index 0000000..65aa8f8 --- /dev/null +++ "b/py/360\344\272\214\347\272\247.js" @@ -0,0 +1,99 @@ +js: +// 请不要在里面使用单引号 +// let html = fetch(input,fetch_params); +let html = JSON.parse(fetch(input,fetch_params)); +let data = html.data; +// let tilte = jsp.pjfh(html,"data.title"); +let tilte = data.title; +// let img = jsp.pj(html,"data.cdncover"); +let img = data.cdncover; +// let vod_type = jsp.pjfa(html,"data.moviecategory").join(","); +let vod_type = data.moviecategory.join(","); +// let area = jsp.pjfa(html,"data.area").join(","); +let area = data.area.join(","); +// let director = jsp.pjfa(html,"data.director").join(","); +let director = data.director.join(","); +// let actor = jsp.pjfa(html,"data.actor").join(","); +let actor = data.actor.join(","); +// let content = jsp.pjfh(html,"data.description"); +let content = data.description; +base_vod = { + vod_id:input, + vod_name:tilte, + type_name:vod_type, + vod_actor:actor, + vod_director:director, + vod_content:content, + vod_remarks:area, + vod_pic:urljoin2(input,img), + // vod_pic:img, +}; +// print(base_vod); +let delta = 200; +let vod_play = {}; +// let sites = jsp.pjfa(html,"data.playlink_sites"); //data.playlinksdetail.#idv.quality +let sites = data.playlink_sites; //data.playlinksdetail.#idv.quality +// print(sites); +for(let i in sites){ + let site = sites[i]; + let playList = ""; + let vodItems = []; + if(data.allupinfo){ + let total = parseInt(data.allupinfo[site]); + // print('total:'+String(total)); + for(let j=1;j 0){ + playList = vodItems.join("#"); + } + // print(playList); + if(playList.length < 1){ + continue + } + vod_play[site]=playList; +} +// print(vod_play); +let tabs = Object.keys(vod_play); +// let playUrls = Object.values(vod_play); // 没法使用values方法和列表的join方法 +let playUrls = []; +for(let id in tabs){ + playUrls.push(vod_play[tabs[id]]); +} +// print(tabs); +// print(playUrls); +if(tabs.length>0){ + // vod_play_from = join(tabs,"$$$"); + vod_play_from = tabs.join("$$$"); + // vod_play_url = join(playUrls,"$$$"); + vod_play_url = playUrls.join("$$$"); + // print(vod_play_from); + // print(vod_play_url); + base_vod.vod_play_from = vod_play_from; + base_vod.vod_play_url = vod_play_url; +} +vod = base_vod; +// print(vod); \ No newline at end of file diff --git a/utils/encode.py b/utils/encode.py index 06dd7ed..0d7e84f 100644 --- a/utils/encode.py +++ b/utils/encode.py @@ -5,6 +5,8 @@ # Date : 2022/8/29 import base64 +from urllib.parse import urljoin + import requests import requests.utils from time import sleep @@ -85,6 +87,48 @@ def base64Encode(text): def baseDecode(text): return base64.b64decode(text).decode("utf-8") #base64解码 +def setDetail(title:str,img:str,desc:str,content:str,tabs:list=None,lists:list=None): + vod = { + "vod_name": title.split('/n')[0], + "vod_pic": img, + "type_name": title, + "vod_year": "", + "vod_area": "", + "vod_remarks": desc, + "vod_actor": "", + "vod_director": "", + "vod_content": content + } + return vod + +def urljoin2(a,b): + a = str(a).replace("'",'').replace('"','') + b = str(b).replace("'",'').replace('"','') + # print(type(a),a) + # print(type(b),b) + ret = urljoin(a,b) + return ret + +def join(lists,string): + """ + 残废函数,没法使用 + :param lists: + :param string: + :return: + """ + # FIXME + lists1 = lists.to_list() + string1 = str(string) + print(type(lists1),lists1) + print(type(string1),string1) + try: + ret = string1.join(lists1) + print(ret) + return ret + except Exception as e: + print(e) + return '' + def dealObj(obj=None): if not obj: obj = {} @@ -165,9 +209,11 @@ def buildUrl(url,obj=None): new_obj = {} for i in obj: new_obj[str(i).replace("'", "")] = str(obj[i]).replace("'", "") - if not str(url).endswith('?'): + if str(url).find('?') < 0: url = str(url) + '?' prs = '&'.join([f'{i}={obj[i]}' for i in obj]) + if len(new_obj) > 0: + url += '&' url = (url + prs).replace('"','').replace("'",'') # print(url) return url \ No newline at end of file -- GitLab