提交 c31cb685 编写于 作者: H hjdhnx

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

上级 e6b66298
......@@ -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)
......
......@@ -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;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',
}
\ 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) {
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 @@
# 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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册