提交 c31cb685 编写于 作者: H hjdhnx

踩了无数个坑并完善了360影视

上级 e6b66298
...@@ -12,7 +12,7 @@ from models import * ...@@ -12,7 +12,7 @@ from models import *
from utils.config import playerConfig from utils.config import playerConfig
from utils.log import logger from utils.log import logger
from utils.encode import base64Encode,baseDecode,fetch,post,request,getCryptoJS,getPreJs,buildUrl,getHome 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.safePython import safePython
from utils.parser import runPy,runJScode,JsObjectWrapper from utils.parser import runPy,runJScode,JsObjectWrapper
from utils.htmlParser import jsoup from utils.htmlParser import jsoup
...@@ -24,7 +24,7 @@ from easydict import EasyDict as edict ...@@ -24,7 +24,7 @@ from easydict import EasyDict as edict
py_ctx = { py_ctx = {
'requests':requests,'print':print,'base64Encode':base64Encode,'baseDecode':baseDecode, 'requests':requests,'print':print,'base64Encode':base64Encode,'baseDecode':baseDecode,
'log':logger.info,'fetch':fetch,'post':post,'request':request,'getCryptoJS':getCryptoJS, '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()) # print(getCryptoJS())
...@@ -569,103 +569,128 @@ class CMS: ...@@ -569,103 +569,128 @@ class CMS:
if p == '*': if p == '*':
vod = self.blank_vod() vod = self.blank_vod()
vod['vod_play_from'] = '道长在线' vod['vod_play_from'] = '道长在线'
vod['desc'] = self.play_url+detailUrl vod['vod_remarks'] = self.play_url+detailUrl
vod['vod_actor'] = '没有二级,只有一级链接直接嗅探播放' vod['vod_actor'] = '没有二级,只有一级链接直接嗅探播放'
vod['content'] = detailUrl vod['vod_content'] = detailUrl
vod['vod_play_url'] = '嗅探播放$'+detailUrl vod['vod_play_url'] = '嗅探播放$'+detailUrl
return vod 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 return vod
jsp = jsoup(self.url) jsp = jsoup(self.url)
is_json = p.get('is_json',False) # 二级里加is_json参数 is_json = p.get('is_json',False) if isinstance(p,dict) else False # 二级里加is_json参数
pdfh = jsp.pjfh if is_json else jsp.pdfh is_js = isinstance(p,str) and str(p).startswith('js:') # 是js
pdfa = jsp.pjfa if is_json else jsp.pdfa if is_js:
pd = jsp.pj if is_json else jsp.pd headers['Referer'] = getHome(url)
pq = jsp.pq py_ctx.update({
obj = {} 'input': url,
vod_name = '' 'fetch_params': {'headers': headers, 'timeout': self.d.timeout, 'encoding': self.d.encoding},
r = requests.get(url, headers=self.headers, timeout=self.timeout) 'd': self.d,
r.encoding = self.encoding 'getParse': self.d.getParse,
# html = r.text 'saveParse': self.d.saveParse,
html = r.json() if is_json else r.text 'jsp':jsp,'setDetail':setDetail,
# print(html) })
if p.get('title'): ctx = py_ctx
p1 = p['title'].split(';') # print(ctx)
vod_name = pdfh(html,p1[0]).replace('\n',' ') jscode = getPreJs() + p.replace('js:','',1)
# title = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) # print(jscode)
title = '\n'.join([','.join([pdfh(html, pp1).strip() for pp1 in i.split('+')]) for i in p1]) loader, _ = runJScode(jscode, ctx=ctx)
# print(title) # print(loader.toString())
obj['title'] = title vod = loader.eval('vod')
if p.get('desc'): if isinstance(vod,JsObjectWrapper):
p1 = p['desc'].split(';') vod = vod.to_dict()
desc = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1]) else:
obj['desc'] = desc vod = {}
# print(type(vod))
if p.get('content'): # print(vod)
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: else:
vodHeader = ['道长在线'] pdfh = jsp.pjfh if is_json else jsp.pdfh
pdfa = jsp.pjfa if is_json else jsp.pdfa
for v in vodHeader: pd = jsp.pj if is_json else jsp.pd
playFrom.append(v) pq = jsp.pq
vod_play_from = vod_play_from.join(playFrom) obj = {}
vod_name = ''
vod_play_url = '$$$' r = requests.get(url, headers=self.headers, timeout=self.timeout)
vod_tab_list = [] r.encoding = self.encoding
if p.get('lists'): # html = r.text
for i in range(len(vodHeader)): html = r.json() if is_json else r.text
tab_name = str(vodHeader[i]) # print(html)
tab_ext = p['tabs'].split(';')[1] if len(p['tabs'].split(';')) > 1 else '' if p.get('title'):
p1 = p['lists'].replace('#idv',tab_name).replace('#id',str(i)) p1 = p['title'].split(';')
tab_ext = tab_ext.replace('#idv',tab_name).replace('#id',str(i)) vod_name = pdfh(html,p1[0]).replace('\n',' ')
vodList = pdfa(html,p1) # 1条线路的选集列表 # title = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1])
# print(vodList) title = '\n'.join([','.join([pdfh(html, pp1).strip() for pp1 in i.split('+')]) for i in p1])
# vodList = [pq(i).text()+'$'+pd(i,'a&&href') for i in vodList] # 拼接成 名称$链接 # print(title)
if self.play_parse: # 自动base64编码 obj['title'] = title
vodList = [(pdfh(html,tab_ext) if tab_ext else tab_name)+'$'+self.play_url+base64Encode(i) for i in vodList] if is_json else\ if p.get('desc'):
[pq(i).text()+'$'+self.play_url+base64Encode(pd(i,'a&&href')) for i in vodList] # 拼接成 名称$链接 p1 = p['desc'].split(';')
else: desc = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1])
vodList = [(pdfh(html, tab_ext) if tab_ext else tab_name) + '$' + self.play_url + i for i in obj['desc'] = desc
vodList] if is_json else \
[pq(i).text() + '$' + self.play_url + pd(i, 'a&&href') for i in vodList] # 拼接成 名称$链接 if p.get('content'):
vlist = '#'.join(vodList) # 拼多个选集 p1 = p['content'].split(';')
vod_tab_list.append(vlist) content = '\n'.join([pdfh(html,i).replace('\n',' ') for i in p1])
vod_play_url = vod_play_url.join(vod_tab_list) obj['content'] = content
# print(vod_play_url)
vod['vod_play_from'] = vod_play_from if p.get('img'):
vod['vod_play_url'] = vod_play_url 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: except Exception as e:
logger.info(f'{self.getName()}获取单个详情页{detailUrl}出错{e}') logger.info(f'{self.getName()}获取单个详情页{detailUrl}出错{e}')
# print(vod) # print(vod)
......
...@@ -19,7 +19,8 @@ var rule = { ...@@ -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', 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;title;cover;comment;cat+ent_id;description',
一级:'json:data.movies;title;cover;pubdate;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"}, // 二级:{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;j<total;j+=delta){let end=Math.min(total,j+delta-1);let url2=buildUrl(input,{start:j,end:end,site:site});let vod_data=JSON.parse(fetch(url2),fetch_params).data;if(vod_data.allepidetail){vod_data=vod_data.allepidetail[site];vod_data.forEach(function(item,index){vodItems.push((item.playlink_num||"")+"$"+(item.url||""))})}else{vod_data=vod_data.defaultepisode;vod_data.forEach(function(item,index){vodItems.push((item.period||"")+(item.name||"")+"$"+item.url||"")})}}}else{let item=data.playlinksdetail[site];vodItems.push((item.sort||"")+"$"+(item.default_url||""))}if(vodItems.length>0){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', 搜索:'json:data.longData.rows;titleTxt;cover;score;cat_id+id;description',
} }
\ No newline at end of file
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) { function maoss(jxurl, ref, key) {
eval(getCryptoJS()); eval(getCryptoJS());
......
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<total;j+=delta){
let end = Math.min(total,j + delta-1);
let url2 = buildUrl(input,{
"start": j,
"end": end,
"site": site
});
// print(url2);
let vod_data = JSON.parse(fetch(url2),fetch_params).data;
if(vod_data.allepidetail){ //电视剧或者动漫
vod_data = vod_data.allepidetail[site];
vod_data.forEach(function(item,index) {
vodItems.push((item.playlink_num||"") + "$" + (item.url||""));
});
}else{// 综艺
vod_data = vod_data.defaultepisode;
vod_data.forEach(function(item,index) {
vodItems.push((item.period||"")+(item.name||"") + "$" + item.url||"");
});
}
}
}else{
let item = data.playlinksdetail[site];
// print(item);
vodItems.push((item.sort||"") + "$" +(item.default_url||""));
}
if(vodItems.length > 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
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
# Date : 2022/8/29 # Date : 2022/8/29
import base64 import base64
from urllib.parse import urljoin
import requests import requests
import requests.utils import requests.utils
from time import sleep from time import sleep
...@@ -85,6 +87,48 @@ def base64Encode(text): ...@@ -85,6 +87,48 @@ def base64Encode(text):
def baseDecode(text): def baseDecode(text):
return base64.b64decode(text).decode("utf-8") #base64解码 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): def dealObj(obj=None):
if not obj: if not obj:
obj = {} obj = {}
...@@ -165,9 +209,11 @@ def buildUrl(url,obj=None): ...@@ -165,9 +209,11 @@ def buildUrl(url,obj=None):
new_obj = {} new_obj = {}
for i in obj: for i in obj:
new_obj[str(i).replace("'", "")] = str(obj[i]).replace("'", "") new_obj[str(i).replace("'", "")] = str(obj[i]).replace("'", "")
if not str(url).endswith('?'): if str(url).find('?') < 0:
url = str(url) + '?' url = str(url) + '?'
prs = '&'.join([f'{i}={obj[i]}' for i in obj]) prs = '&'.join([f'{i}={obj[i]}' for i in obj])
if len(new_obj) > 0:
url += '&'
url = (url + prs).replace('"','').replace("'",'') url = (url + prs).replace('"','').replace("'",'')
# print(url) # print(url)
return url return url
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册