From cc8f7c0546af015e81c747f59734939a8439c524 Mon Sep 17 00:00:00 2001 From: hjdhnx Date: Fri, 16 Sep 2022 14:36:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=A2=9E=E5=8A=A0=E8=B1=86?= =?UTF-8?q?=E7=93=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/cms.py | 16 +++- js/drpy.js | 13 ++- libs/pre.js | 18 +++- "py/drpy\344\270\200\347\272\247.js" | 89 ++++++++++++++++--- "py/drpy\346\216\250\350\215\220.js" | 47 ++++++++++ ...06\347\223\243\346\265\213\350\257\225.py" | 16 ++++ utils/encode.py | 28 ++++-- utils/parser.py | 2 +- 8 files changed, 200 insertions(+), 29 deletions(-) create mode 100644 "py/drpy\346\216\250\350\215\220.js" create mode 100644 "py/\350\261\206\347\223\243\346\265\213\350\257\225.py" diff --git a/controllers/cms.py b/controllers/cms.py index 86daf62..6f76fff 100644 --- a/controllers/cms.py +++ b/controllers/cms.py @@ -15,7 +15,7 @@ from utils.log import logger from utils.encode import base64Encode,baseDecode,fetch,post,request,getCryptoJS,getPreJs,buildUrl,getHome from utils.encode import verifyCode,setDetail,join,urljoin2,parseText from utils.safePython import safePython -from utils.parser import runPy,runJScode,JsObjectWrapper +from utils.parser import runPy,runJScode,JsObjectWrapper,PyJsObject from utils.htmlParser import jsoup from urllib.parse import urljoin,quote,unquote from concurrent.futures import ThreadPoolExecutor # 引入线程池 @@ -40,12 +40,18 @@ def encodeUrl(url): # return base64Encode(url) return quote(url) +def stringify(obj): + if isinstance(obj,PyJsObject): + # obj = obj.to_dict() + obj = parseText(str(obj)) + return json.dumps(obj, separators=(',', ':'), ensure_ascii=False) + 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,'setDetail':setDetail,'join':join,'urljoin2':urljoin2, 'PC_UA':PC_UA,'MOBILE_UA':MOBILE_UA,'UC_UA':UC_UA,'IOS_UA':IOS_UA, -'setItem':setItem,'getItem':getItem,'clearItem':clearItem +'setItem':setItem,'getItem':getItem,'clearItem':clearItem,'stringify':stringify } # print(getCryptoJS()) @@ -780,7 +786,11 @@ class CMS: print(vod) return vod - if not isinstance(p,dict) and not isinstance(p,str) and not str(p).startswith('js:'): + if not p: + return vod + if not isinstance(p,dict) and not isinstance(p,str): + return vod + if isinstance(p,str) and not str(p).startswith('js:'): return vod jsp = jsoup(self.url) diff --git a/js/drpy.js b/js/drpy.js index 69e4bfa..29e6607 100644 --- a/js/drpy.js +++ b/js/drpy.js @@ -7,7 +7,7 @@ var rule = { quickSearch:0, filterable:1, // 分类链接fypage参数支持1个()表达式 - url:'/?pg=fypage&class=fyclass', + url:'/?pg=fypage&class=fyclass&douban=', filter_url:'fl={{fl}}', headers:{ "Host": "frodo.douban.com", @@ -21,15 +21,14 @@ var rule = { class_url:'interests&hot_gaia&tv_hot&show_hot&movie&tv&rank_list_movie&rank_list_tv', filter:{'interests': [{'key': 'status', 'name': '状态', 'value': [{'n': '想看', 'v': 'mark'}, {'n': '在看', 'v': 'doing'}, {'n': '看过', 'v': 'done'}]}, {'key': 'subtype_tag', 'name': '形式', 'value': [{'n': '全部', 'v': ''}, {'n': '电影', 'v': 'movie'}, {'n': '电视', 'v': 'tv'}]}, {'key': 'year_tag', 'name': '年代', 'value': [{'n': '全部', 'v': '全部'}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2010年代', 'v': '2010年代'}, {'n': '2000年代', 'v': '2000年代'}, {'n': '90年代', 'v': '90年代'}, {'n': '80年代', 'v': '80年代'}, {'n': '70年代', 'v': '70年代'}, {'n': '60年代', 'v': '60年代'}, {'n': '更早', 'v': '更早'}]}], 'hot_gaia': [{'key': 'sort', 'name': '排序', 'value': [{'n': '热度', 'v': 'recommend'}, {'n': '最新', 'v': 'time'}, {'n': '评分', 'v': 'rank'}]}, {'key': 'area', 'name': '地区', 'value': [{'n': '全部', 'v': '全部'}, {'n': '华语', 'v': '华语'}, {'n': '欧美', 'v': '欧美'}, {'n': '韩国', 'v': '韩国'}, {'n': '日本', 'v': '日本'}]}], 'tv_hot': [{'key': 'type', 'name': '分类', 'value': [{'n': '综合', 'v': 'tv_hot'}, {'n': '国产剧', 'v': 'tv_domestic'}, {'n': '欧美剧', 'v': 'tv_american'}, {'n': '日剧', 'v': 'tv_japanese'}, {'n': '韩剧', 'v': 'tv_korean'}, {'n': '动画', 'v': 'tv_animation'}]}], 'show_hot': [{'key': 'type', 'name': '分类', 'value': [{'n': '综合', 'v': 'show_hot'}, {'n': '国内', 'v': 'show_domestic'}, {'n': '国外', 'v': 'show_foreign'}]}], 'movie': [{'key': '类型', 'name': '类型', 'value': [{'n': '全部类型', 'v': ''}, {'n': '喜剧', 'v': '喜剧'}, {'n': '爱情', 'v': '爱情'}, {'n': '动作', 'v': '动作'}, {'n': '科幻', 'v': '科幻'}, {'n': '动画', 'v': '动画'}, {'n': '悬疑', 'v': '悬疑'}, {'n': '犯罪', 'v': '犯罪'}, {'n': '惊悚', 'v': '惊悚'}, {'n': '冒险', 'v': '冒险'}, {'n': '音乐', 'v': '音乐'}, {'n': '历史', 'v': '历史'}, {'n': '奇幻', 'v': '奇幻'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '战争', 'v': '战争'}, {'n': '传记', 'v': '传记'}, {'n': '歌舞', 'v': '歌舞'}, {'n': '武侠', 'v': '武侠'}, {'n': '情色', 'v': '情色'}, {'n': '灾难', 'v': '灾难'}, {'n': '西部', 'v': '西部'}, {'n': '纪录片', 'v': '纪录片'}, {'n': '短片', 'v': '短片'}]}, {'key': '地区', 'name': '地区', 'value': [{'n': '全部地区', 'v': ''}, {'n': '华语', 'v': '华语'}, {'n': '欧美', 'v': '欧美'}, {'n': '韩国', 'v': '韩国'}, {'n': '日本', 'v': '日本'}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '美国', 'v': '美国'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '英国', 'v': '英国'}, {'n': '法国', 'v': '法国'}, {'n': '德国', 'v': '德国'}, {'n': '意大利', 'v': '意大利'}, {'n': '西班牙', 'v': '西班牙'}, {'n': '印度', 'v': '印度'}, {'n': '泰国', 'v': '泰国'}, {'n': '俄罗斯', 'v': '俄罗斯'}, {'n': '加拿大', 'v': '加拿大'}, {'n': '澳大利亚', 'v': '澳大利亚'}, {'n': '爱尔兰', 'v': '爱尔兰'}, {'n': '瑞典', 'v': '瑞典'}, {'n': '巴西', 'v': '巴西'}, {'n': '丹麦', 'v': '丹麦'}]}, {'key': 'sort', 'name': '排序', 'value': [{'n': '近期热度', 'v': 'T'}, {'n': '首映时间', 'v': 'R'}, {'n': '高分优先', 'v': 'S'}]}, {'key': '年代', 'name': '年代', 'value': [{'n': '全部年代', 'v': ''}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2010年代', 'v': '2010年代'}, {'n': '2000年代', 'v': '2000年代'}, {'n': '90年代', 'v': '90年代'}, {'n': '80年代', 'v': '80年代'}, {'n': '70年代', 'v': '70年代'}, {'n': '60年代', 'v': '60年代'}, {'n': '更早', 'v': '更早'}]}], 'tv': [{'key': '类型', 'name': '类型', 'value': [{'n': '不限', 'v': ''}, {'n': '电视剧', 'v': '电视剧'}, {'n': '综艺', 'v': '综艺'}]}, {'key': '电视剧形式', 'name': '电视剧形式', 'value': [{'n': '不限', 'v': ''}, {'n': '喜剧', 'v': '喜剧'}, {'n': '爱情', 'v': '爱情'}, {'n': '悬疑', 'v': '悬疑'}, {'n': '动画', 'v': '动画'}, {'n': '武侠', 'v': '武侠'}, {'n': '古装', 'v': '古装'}, {'n': '家庭', 'v': '家庭'}, {'n': '犯罪', 'v': '犯罪'}, {'n': '科幻', 'v': '科幻'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '历史', 'v': '历史'}, {'n': '战争', 'v': '战争'}, {'n': '动作', 'v': '动作'}, {'n': '冒险', 'v': '冒险'}, {'n': '传记', 'v': '传记'}, {'n': '剧情', 'v': '剧情'}, {'n': '奇幻', 'v': '奇幻'}, {'n': '惊悚', 'v': '惊悚'}, {'n': '灾难', 'v': '灾难'}, {'n': '歌舞', 'v': '歌舞'}, {'n': '音乐', 'v': '音乐'}]}, {'key': '综艺形式', 'name': '综艺形式', 'value': [{'n': '不限', 'v': ''}, {'n': '真人秀', 'v': '真人秀'}, {'n': '脱口秀', 'v': '脱口秀'}, {'n': '音乐', 'v': '音乐'}, {'n': '歌舞', 'v': '歌舞'}]}, {'key': '地区', 'name': '地区', 'value': [{'n': '全部地区', 'v': ''}, {'n': '华语', 'v': '华语'}, {'n': '欧美', 'v': '欧美'}, {'n': '国外', 'v': '国外'}, {'n': '韩国', 'v': '韩国'}, {'n': '日本', 'v': '日本'}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '美国', 'v': '美国'}, {'n': '英国', 'v': '英国'}, {'n': '泰国', 'v': '泰国'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '意大利', 'v': '意大利'}, {'n': '法国', 'v': '法国'}, {'n': '德国', 'v': '德国'}, {'n': '西班牙', 'v': '西班牙'}, {'n': '俄罗斯', 'v': '俄罗斯'}, {'n': '瑞典', 'v': '瑞典'}, {'n': '巴西', 'v': '巴西'}, {'n': '丹麦', 'v': '丹麦'}, {'n': '印度', 'v': '印度'}, {'n': '加拿大', 'v': '加拿大'}, {'n': '爱尔兰', 'v': '爱尔兰'}, {'n': '澳大利亚', 'v': '澳大利亚'}]}, {'key': 'sort', 'name': '排序', 'value': [{'n': '近期热度', 'v': 'T'}, {'n': '首播时间', 'v': 'R'}, {'n': '高分优先', 'v': 'S'}]}, {'key': '年代', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2010年代', 'v': '2010年代'}, {'n': '2000年代', 'v': '2000年代'}, {'n': '90年代', 'v': '90年代'}, {'n': '80年代', 'v': '80年代'}, {'n': '70年代', 'v': '70年代'}, {'n': '60年代', 'v': '60年代'}, {'n': '更早', 'v': '更早'}]}, {'key': '平台', 'name': '平台', 'value': [{'n': '全部', 'v': ''}, {'n': '腾讯视频', 'v': '腾讯视频'}, {'n': '爱奇艺', 'v': '爱奇艺'}, {'n': '优酷', 'v': '优酷'}, {'n': '湖南卫视', 'v': '湖南卫视'}, {'n': 'Netflix', 'v': 'Netflix'}, {'n': 'HBO', 'v': 'HBO'}, {'n': 'BBC', 'v': 'BBC'}, {'n': 'NHK', 'v': 'NHK'}, {'n': 'CBS', 'v': 'CBS'}, {'n': 'NBC', 'v': 'NBC'}, {'n': 'tvN', 'v': 'tvN'}]}], 'rank_list_movie': [{'key': '榜单', 'name': '榜单', 'value': [{'n': '实时热门电影', 'v': 'movie_real_time_hotest'}, {'n': '一周口碑电影榜', 'v': 'movie_weekly_best'}, {'n': '豆瓣电影Top250', 'v': 'movie_top250'}]}], 'rank_list_tv': [{'key': '榜单', 'name': '榜单', 'value': [{'n': '实时热门电视', 'v': 'tv_real_time_hotest'}, {'n': '华语口碑剧集榜', 'v': 'tv_chinese_best_weekly'}, {'n': '全球口碑剧集榜', 'v': 'tv_global_best_weekly'}, {'n': '国内口碑综艺榜', 'v': 'show_chinese_best_weekly'}, {'n': '国外口碑综艺榜', 'v': 'show_global_best_weekly'}]}]}, limit:20, - play_parse:true, + play_parse:false, + 推荐:'', + 推荐:'js:let d=[];let douban_api_host="https://frodo.douban.com/api/v2";let miniapp_apikey="0ac44ae016490db2204ce0a042db2916";const count=30;function miniapp_request(path,query){try{let url=douban_api_host+path;query.apikey=miniapp_apikey;fetch_params.headers=oheaders;url=buildUrl(url,query);let html=fetch(url,fetch_params);return JSON.parse(html)}catch(e){print("发生了错误:"+e.message);return{}}}function subject_real_time_hotest(){try{let res=miniapp_request("/subject_collection/subject_real_time_hotest/items",{});let lists=[];let arr=res.subject_collection_items||[];arr.forEach(function(item){if(item.type==="movie"||item.type==="tv"){let rating=item.rating?item.rating.value:"暂无评分";let honnor=(item.honor_infos||[]).map(function(it){return it.title}).join("|");lists.append({vod_id:TYPE+"$1",vod_name:item.title||"",vod_pic:item.pic.normal,vod_remarks:rating+" "+honnor})}});return lists}catch(e){print("发生了错误:"+e.message);return[]}}VODS=subject_real_time_hotest();print(VODS);', // 手动调用解析请求json的url,此lazy不方便 - lazy:'js:print(input);fetch_params.headers["user-agent"]=MOBILE_UA;let html=request(input);let rurl=html.match(/window\\.open\\(\'(.*?)\',/)[1];rurl=urlDeal(rurl);input={parse:1,url:rurl};', + lazy:'', // 推荐:'.list_item;img&&alt;img&&src;a&&Text;a&&data-float', 一级:'', - 一级:'js:print(input);print(MY_CATE);print(MY_PAGE);print(MY_FL);let d=[];let douban_api_host="https://frodo.douban.com/api/v2";let miniapp_apikey="0ac44ae016490db2204ce0a042db2916";const count=30;function miniapp_request(path,query){try{let url=douban_api_host+path;query.apikey=miniapp_apikey;fetch_params.headers=oheaders;url=buildUrl(url,query);let html=fetch(url,fetch_params);return JSON.parse(html)}catch(e){print(e.message);return{}}}function cate_filter(d,douban){douban=douban||"";try{if(MY_CATE==="interests"){let status=MY_FL.status||"mark";let subtype_tag=MY_FL.subtype_tag||"";let year_tag=MY_FL.year_tag||"全部";let path="/user/"+douban+"/interests";let res=miniapp_request(path,{type:"movie",status:status,subtype_tag:subtype_tag,year_tag:year_tag,start:(MY_PAGE-1)*count,count:count});print(res)}else if(MY_CATE==="hot_gaia"){let sort=MY_FL.sort||"recommend";let area=MY_FL.area||"全部";let path="/movie/"+MY_CATE;res=miniapp_request(path,{area:area,sort:sort,start:(MY_PAGE-1)*count,count:count});print(res)}let result={page:MY_PAGE,pagecount:Math.ceil(res.total/count),limit:count,total:res.total};let items=[];if(/rank_list|tv_hot|show_hot/.test(MY_CATE)){items=res["subject_collection_items"]}else if(MY_CATE==="interests"){res["interests"].forEach(function(it){items.push(it.subject)})}else{items=res.items}let lists=[];print(items);items.forEach(function(item){if(item.type==="movie"||item.type==="tv"){let rating=item.rating?item.rating.value:"";let rat_str=rating||"暂无评分";let title=item.title;let honor=item.honor_infos||[];let honor_str=honor.map(function(it){return it.title}).join("|");let vod_obj={vod_id:item.type+"$"+item.id,vod_name:title!=="未知电影"?title:"暂不支持展示",vod_pic:item.pic.normal,vod_remarks:rat_str+" "+honor_str};let vod_obj_d={url:item.type+"$"+item.id,title:title!=="未知电影"?title:"暂不支持展示",pic_url:item.pic.normal,desc:rat_str+" "+honor_str};lists.push(vod_obj);d.push(vod_obj_d)}});result.list=lists;return result}catch(e){print(e.message)}return{}}let res=cate_filter(d);setResult2(res);', + 一级:'js:let d=[];let douban=input.split("douban=")[1].split("&")[0];let douban_api_host="https://frodo.douban.com/api/v2";let miniapp_apikey="0ac44ae016490db2204ce0a042db2916";const count=30;function miniapp_request(path,query){try{let url=douban_api_host+path;query.apikey=miniapp_apikey;fetch_params.headers=oheaders;url=buildUrl(url,query);let html=fetch(url,fetch_params);return JSON.parse(html)}catch(e){print("发生了错误:"+e.message);return{}}}function cate_filter(d,douban){douban=douban||"";try{if(MY_CATE==="interests"){if(douban){let status=MY_FL.status||"mark";let subtype_tag=MY_FL.subtype_tag||"";let year_tag=MY_FL.year_tag||"全部";let path="/user/"+douban+"/interests";let res=miniapp_request(path,{type:"movie",status:status,subtype_tag:subtype_tag,year_tag:year_tag,start:(MY_PAGE-1)*count,count:count})}else{return{}}}else if(MY_CATE==="hot_gaia"){let sort=MY_FL.sort||"recommend";let area=MY_FL.area||"全部";let path="/movie/"+MY_CATE;let res=miniapp_request(path,{area:area,sort:sort,start:(MY_PAGE-1)*count,count:count})}else if(MY_CATE==="tv_hot"||MY_CATE==="show_hot"){let stype=MY_FL.type||MY_CATE;let path="/subject_collection/"+stype+"/items";let res=miniapp_request(path,{start:(MY_PAGE-1)*count,count:count})}else if(MY_CATE.startsWith("rank_list")){let id=MY_CATE==="rank_list_movie"?"movie_real_time_hotest":"tv_real_time_hotest";id=MY_FL.榜单||id;let path="/subject_collection/"+id+"/items";let res=miniapp_request(path,{start:(MY_PAGE-1)*count,count:count})}else{let path="/"+MY_CATE+"/recommend";let selected_categories;if(Object.keys(MY_FL).length>0){let sort=MY_FL.sort||"T";let tags=Object.Values(MY_FL).join(",");if(MY_CATE==="movie"){selected_categories={"类型":MY_FL.类型||"","地区":MY_FL.地区||""}}else{selected_categories={"类型":MY_FL.类型||"","形式":MY_FL.类型?MY_FL.类型+"地区":"","地区":MY_FL.地区||""}}}else{let sort="T";let tags="";if(MY_CATE==="movie"){selected_categories={"类型":"","地区":""}}else{selected_categories={"类型":"","形式":"","地区":""}}}let params={tags:tags,sort:sort,refresh:0,selected_categories:stringify(selected_categories),start:(MY_PAGE-1)*count,count:count};let res=miniapp_request(path,params)}let result={page:MY_PAGE,pagecount:Math.ceil(res.total/count),limit:count,total:res.total};let items=[];if(/^rank_list|tv_hot|show_hot/.test(MY_CATE)){items=res["subject_collection_items"]}else if(MY_CATE==="interests"){res["interests"].forEach(function(it){items.push(it.subject)})}else{items=res.items}let lists=[];items.forEach(function(item){if(item.type==="movie"||item.type==="tv"){let rating=item.rating?item.rating.value:"";let rat_str=rating||"暂无评分";let title=item.title;let honor=item.honor_infos||[];let honor_str=honor.map(function(it){return it.title}).join("|");let vod_obj={vod_name:title!=="未知电影"?title:"暂不支持展示",vod_pic:item.pic.normal,vod_remarks:rat_str+" "+honor_str};let vod_obj_d={url:item.type+"$"+item.id,title:title!=="未知电影"?title:"暂不支持展示",pic_url:item.pic.normal,desc:rat_str+" "+honor_str};lists.push(vod_obj);d.push(vod_obj_d)}});result.list=lists;return result}catch(e){print(e.message)}return{}}let res=cate_filter(d);setResult2(res);', 二级:'', - 二级:'js:var vod={vod_id:input};let html=request(input);function adhead(url){let hd="https://v.sogou.com";if(!url.startsWith(hd)){url=hd+url}return urlencode(url)}try{let json=JSON.parse(html.match(/INITIAL_STATE.*?({.*});/)[1]).detail.itemData;let key=json.dockey;let name=json.name;let zone=json.zone;let score=json.score?json.score:"暂无";let style=json.style;let emcee=json.emcee?"主持:"+json.emcee:json.name;let director=json.director?"导演:"+json.director:name;director=director.replace(/;/g,"\\t");let starring=json.starring?"演员:"+json.starring:"声优:"+json.shengyou;starring=starring.replace(/.*undefined/,"").replace(/;/g,"\\t");let update=json.update_wordstr?json.update_wordstr:"";let tv_station=json.tv_station?json.tv_station:zone;let introduction=json.introduction;let shengyou=json.shengyou;let shows=json.play_from_open_index;let plays=json.play.item_list;if(shows){vod.vod_name=name;vod.vod_area=emcee+","+tv_station;vod.vod_director=director;vod.vod_actor=starring;vod.vod_pic=jsp.pd(html,"#thumb_img&&img&&src");vod.vod_remarks=style+" 评分:"+score+","+update;vod.vod_content=introduction}else{vod.vod_name=name;vod.vod_director=director;vod.vod_actor=starring;vod.vod_pic=jsp.pd(html,"#thumb_img&&img&&src");vod.vod_content=introduction}let tp="&type=json";try{let tabs=[];let lists=[];plays.forEach(function(it){lists.push(it.info);let tbn=it.sitename[0]||it.site.replace(".com","");tbn=tbn.split("").join(" ");tabs.push(tbn)});vod.vod_play_from=tabs.join("$$$");vod_lists=[];play_url=play_url.replace("&play_url=","&type=json&play_url=");lists.forEach(function(item,idex){if(item||shows){if(item&&Array.isArray(item)&&item.length>1){let tmp=item.slice(1).map(function(its){return its.index+"$"+play_url+base64Encode(adhead(its.url))});vod_lists.push(tmp.join("#"))}if(shows){let arr=[];let tmp=[];let zy=shows.item_list[idex];zy.date.forEach(function(date){let day=date.day;for(let j=0;j=10?day[j][0]:"0"+day[j][0];let Tdate=date.year+date.month+dayy;arr.push(Tdate)}});for(let k=0;k0?img[0]:""}}catch(e){}', - // 二级:'js:var vod={vod_id:input};let html=request(input);function adhead(url){let hd="https://v.sogou.com";if(!url.startsWith(hd)){url=hd+url}return url}try{let json=JSON.parse(html.match(/INITIAL_STATE.*?({.*});/)[1]).detail.itemData;let key=json.dockey;let name=json.name;let zone=json.zone;let score=json.score?json.score:"暂无";let style=json.style;let emcee=json.emcee?"主持:"+json.emcee:json.name;let director=json.director?"导演:"+json.director:name;director=director.replace(/;/g,"\\t");let starring=json.starring?"演员:"+json.starring:"声优:"+json.shengyou;starring=starring.replace(/.*undefined/,"").replace(/;/g,"\\t");let update=json.update_wordstr?json.update_wordstr:"";let tv_station=json.tv_station?json.tv_station:zone;let introduction=json.introduction;let shengyou=json.shengyou;let shows=json.play_from_open_index;let plays=json.play.item_list;if(shows){vod.vod_name=name;vod.vod_area=emcee+","+tv_station;vod.vod_director=director;vod.vod_actor=starring;vod.vod_pic=jsp.pd(html,"#thumb_img&&img&&src");vod.vod_remarks=style+" 评分:"+score+","+update;vod.vod_content=introduction}else{vod.vod_name=name;vod.vod_director=director;vod.vod_actor=starring;vod.vod_pic=jsp.pd(html,"#thumb_img&&img&&src");vod.vod_content=introduction}let tp="&type=json";try{let tabs=[];let lists=[];plays.forEach(function(it){lists.push(it.info);let tbn=it.sitename[0]||it.site.replace(".com","");tbn=tbn.split("").join(" ");tabs.push(tbn)});vod.vod_play_from=tabs.join("$$$");vod_lists=[];play_url=play_url.replace("&play_url=","&type=json&play_url=");lists.forEach(function(item,idex){if(item||shows){if(item&&Array.isArray(item)&&item.length>1){let tmp=item.slice(1).map(function(its){return its.index+"$"+play_url+base64Encode(adhead(its.url))});vod_lists.push(tmp.join("#"))}if(shows){let arr=[];let tmp=[];let zy=shows.item_list[idex];zy.date.forEach(function(date){let day=date.day;for(let j=0;j=10?day[j][0]:"0"+day[j][0];let Tdate=date.year+date.month+dayy;arr.push(Tdate)}});for(let k=0;k0?img[0]:""}}catch(e){}', 搜索:'', - 搜索:'js:let d=[];let html=request(input);let jsonA=JSON.parse(html.match(/INITIAL_STATE.*?({.*});/)[1]).result.longVideo.results;jsonA.forEach(function(it){let name=it.name;let introduction=it.introduction;let pic=it.v_picurl;let url=it.tiny_url;let zone=it.zone;let score=it.score||"暂无";let style=it.style;if(it.play.item_list){let r={};r.title=name.replace(//,"").replace(//,"");r.url="https://v.sogou.com"+url;r.desc=it.list_category.join(",");r.content=introduction;r.pic_url=pic;d.push(r)}});setResult(d);', } \ No newline at end of file diff --git a/libs/pre.js b/libs/pre.js index 796b56d..ed8729f 100644 --- a/libs/pre.js +++ b/libs/pre.js @@ -77,6 +77,21 @@ Object.prototype.myValues=function(obj){ } return res; } +if (typeof Object.prototype.values != 'function') { + Object.prototype.values=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||','; emoji = emoji||''; @@ -93,6 +108,7 @@ Array.prototype.join = function (emoji) { } return str; }; +Array.prototype.append = Array.prototype.push; function 是否正版(vipUrl){ let flag = new RegExp('qq\.com|iqiyi\.com|youku\.com|mgtv\.com|bilibili\.com|sohu\.com|ixigua\.com|pptv\.com|miguvideo\.com|le\.com|1905\.com|fun\.tv'); return flag.test(vipUrl); @@ -145,7 +161,7 @@ function setResult(d){ return VODS } function setResult2(res){ - VODS = res.list; + VODS = res.list||[]; return VODS } function setHomeResult(res){ diff --git "a/py/drpy\344\270\200\347\272\247.js" "b/py/drpy\344\270\200\347\272\247.js" index 0ca56ca..a20e857 100644 --- "a/py/drpy\344\270\200\347\272\247.js" +++ "b/py/drpy\344\270\200\347\272\247.js" @@ -1,10 +1,10 @@ js: -print(input); -print(MY_CATE); -print(MY_PAGE); -print(MY_FL); +// print(input); +// print(MY_CATE); +// print(MY_PAGE); +// print(MY_FL); let d = []; - +let douban = input.split('douban=')[1].split('&')[0]; let douban_api_host = 'https://frodo.douban.com/api/v2'; let miniapp_apikey = '0ac44ae016490db2204ce0a042db2916'; const count = 30; @@ -30,7 +30,7 @@ function miniapp_request(path, query){ return JSON.parse(html); } catch(e){ - print(e.message); + print('发生了错误:'+e.message); return {} } } @@ -39,6 +39,7 @@ function cate_filter(d,douban){ douban = douban||''; try { if(MY_CATE==='interests'){ + if(douban){ let status = MY_FL.status||"mark"; let subtype_tag = MY_FL.subtype_tag||""; let year_tag = MY_FL.year_tag||"全部"; @@ -51,20 +52,84 @@ function cate_filter(d,douban){ "start": (MY_PAGE - 1) * count, "count": count }); - print(res); + // print(res); + }else{ + return {} + } }else if(MY_CATE === "hot_gaia"){ let sort =MY_FL.sort||"recommend"; let area =MY_FL.area||"全部"; let path = '/movie/'+MY_CATE; - res = miniapp_request(path, { + let res = miniapp_request(path, { "area": area, "sort": sort, "start": (MY_PAGE - 1) * count, "count": count }); - print(res); + // print(res); + }else if(MY_CATE === "tv_hot" || MY_CATE === "show_hot"){ + let stype = MY_FL.type||MY_CATE; + let path = "/subject_collection/"+stype+"/items" + let res = miniapp_request(path, { + "start": (MY_PAGE - 1) * count, + "count": count + }); + // print(res); + } + else if(MY_CATE.startsWith("rank_list")){ + let id = MY_CATE === "rank_list_movie"?"movie_real_time_hotest":"tv_real_time_hotest"; + id = MY_FL.榜单||id; + let path = "/subject_collection/"+id+"/items"; + let res = miniapp_request(path, { + "start": (MY_PAGE - 1) * count, + "count": count + }); + // print(res); + }else{ + let path = "/"+MY_CATE+"/recommend"; + let selected_categories; + if(Object.keys(MY_FL).length > 0){ + let sort = MY_FL.sort||"T"; + let tags = Object.Values(MY_FL).join(','); + if(MY_CATE === "movie"){ + selected_categories = { + "类型": MY_FL.类型||'', + "地区": MY_FL.地区||'' + } + }else{ + selected_categories = { + "类型": MY_FL.类型||"", + "形式": MY_FL.类型?MY_FL.类型+'地区':'', + "地区": MY_FL.地区||"" + } + } + }else{ + let sort = "T"; + let tags = ""; + if(MY_CATE === "movie"){ + selected_categories = { + "类型": "", + "地区": "" + }; + }else{ + selected_categories = { + "类型": "", + "形式": "", + "地区": "" + } + } + } + let params = { + "tags": tags, + "sort": sort, + "refresh": 0, + "selected_categories": stringify(selected_categories), + "start": (MY_PAGE - 1) * count, + "count": count + } + // print(params); + let res = miniapp_request(path, params) } - let result = { "page": MY_PAGE, "pagecount": Math.ceil(res.total / count), @@ -72,7 +137,7 @@ function cate_filter(d,douban){ "total": res.total } let items = []; - if(/rank_list|tv_hot|show_hot/.test(MY_CATE)) { + if(/^rank_list|tv_hot|show_hot/.test(MY_CATE)) { items = res['subject_collection_items'] } else if(MY_CATE==='interests'){ @@ -93,7 +158,7 @@ function cate_filter(d,douban){ let honor_str = honor.map(function (it){return it.title}).join('|'); let vod_obj = { // "vod_id": f'msearch:{item.get("type", "")}__{item.get("id", "")}', - "vod_id": item.type+'$'+item.id, + // "vod_id": item.type+'$'+item.id, "vod_name": title !== "未知电影"?title: "暂不支持展示", "vod_pic": item.pic.normal, "vod_remarks": rat_str + " " + honor_str diff --git "a/py/drpy\346\216\250\350\215\220.js" "b/py/drpy\346\216\250\350\215\220.js" new file mode 100644 index 0000000..ff38778 --- /dev/null +++ "b/py/drpy\346\216\250\350\215\220.js" @@ -0,0 +1,47 @@ +js: +let d = []; +let douban_api_host = 'https://frodo.douban.com/api/v2'; +let miniapp_apikey = '0ac44ae016490db2204ce0a042db2916'; +const count = 30; + +function miniapp_request(path, query){ + try { + let url = douban_api_host + path; + query.apikey = miniapp_apikey; + fetch_params.headers = oheaders; + url = buildUrl(url,query); + let html = fetch(url,fetch_params); + return JSON.parse(html); + } + catch(e){ + print('发生了错误:'+e.message); + return {} + } +} + +function subject_real_time_hotest(){ + try{ + let res = miniapp_request("/subject_collection/subject_real_time_hotest/items", {}); + let lists = []; + let arr = res.subject_collection_items||[]; + arr.forEach(function (item){ + if(item.type==='movie'||item.type==='tv'){ + let rating = item.rating?item.rating.value:"暂无评分"; + let honnor = (item.honor_infos||[]).map(function (it){return it.title}).join('|'); + lists.append({ + // "vod_id": "", + "vod_id": TYPE+"$1", + "vod_name": item.title||"", + "vod_pic": item.pic.normal, + "vod_remarks": rating + " " + honnor + }) + } + }); + return lists + }catch (e) { + print('发生了错误:'+e.message); + return [] + } +} +VODS = subject_real_time_hotest(); +print(VODS); \ No newline at end of file diff --git "a/py/\350\261\206\347\223\243\346\265\213\350\257\225.py" "b/py/\350\261\206\347\223\243\346\265\213\350\257\225.py" new file mode 100644 index 0000000..470c75e --- /dev/null +++ "b/py/\350\261\206\347\223\243\346\265\213\350\257\225.py" @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# File : 豆瓣测试.py +# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------ +# Date : 2022/9/16 + +import json + +selected_categories = { + "类型": "", + "形式": "", + "地区": "" + } +print(selected_categories) +b = json.dumps(selected_categories, separators=(',', ':'), ensure_ascii=False) +print(b) \ No newline at end of file diff --git a/utils/encode.py b/utils/encode.py index b3be90d..5ee9276 100644 --- a/utils/encode.py +++ b/utils/encode.py @@ -5,7 +5,7 @@ # Date : 2022/8/29 import base64 -from urllib.parse import urljoin +from urllib.parse import urljoin,quote,unquote from js2py.base import PyJsString import requests,warnings # 关闭警告 @@ -225,19 +225,37 @@ def request(url,obj): return base_request(url, obj) +def redx(text): + """ + 修正js2py交互的字符串自动加前后引号问题 + :param text: + :return: + """ + # return text.replace("'", "").replace('"', "") + text = str(text) + if text.startswith("'") and text.endswith("'"): + text = text[1:-1] + return text + def buildUrl(url,obj=None): - url = str(url).replace("'", "") + # url = str(url).replace("'", "") + url = redx(url) if not obj: obj = {} new_obj = {} for i in obj: - new_obj[str(i).replace("'", "")] = str(obj[i]).replace("'", "") + # new_obj[str(i).replace("'", "")] = str(obj[i]).replace("'", "") + new_obj[redx(i)] = redx(obj[i]) + if str(url).find('?') < 0: url = str(url) + '?' - prs = '&'.join([f'{i}={obj[i]}' for i in obj]) + param_list = [f'{i}={new_obj[i]}' for i in new_obj] + # print(param_list) + prs = '&'.join(param_list) if len(new_obj) > 0 and not str(url).endswith('?'): url += '&' - url = (url + prs).replace('"','').replace("'",'') + # url = (url + prs).replace('"','').replace("'",'') + url = url + prs # print(url) return url diff --git a/utils/parser.py b/utils/parser.py index de1dd37..424d61c 100644 --- a/utils/parser.py +++ b/utils/parser.py @@ -14,7 +14,7 @@ subprocess.Popen = partial(subprocess.Popen, encoding="utf-8") # 固定写法 # 解决execjs执行js时产生的乱码报错,需要在导入该模块之前,让Popen的encoding参数锁定为utf-8 # import execjs import js2py -from js2py.base import JsObjectWrapper,PyJsString +from js2py.base import JsObjectWrapper,PyJsString,PyJsObject # os.environ["EXECJS_RUNTIME"] = "JScript" # print(execjs.get().name) -- GitLab