Delete TVBox_PY directory
This commit is contained in:
@@ -1,191 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
import re
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import urllib.parse
|
||||
import json
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "快播影视"
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "movie",
|
||||
"剧集": "serie",
|
||||
"综艺": "variety",
|
||||
"动漫": "anime"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list': []
|
||||
}
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
url = 'https://www.3qu.live/videos/{0}?page={1}'.format(tid, pg)
|
||||
rsp = self.fetch(url,headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//div[@class='main-content-box']/div/div/div/div/div/div/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
picl = a.xpath('./@style')[0]
|
||||
pica = re.findall(r"url\(\'(.*)\'\);", picl)[0]
|
||||
pic = 'https://www.3qu.live{0}'.format(pica)
|
||||
sidh = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sidh,'/videos/(\\S+).html')
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": ""
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 100
|
||||
result['total'] = 99999
|
||||
return result
|
||||
|
||||
def detailContent(self, array):
|
||||
tid = array[0]
|
||||
url = 'https://www.3qu.live/videos/{0}.html'.format(tid)
|
||||
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
rsp = self.fetch(url,headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
divContent = root.xpath("//div[@class='video-detail row']")[0]
|
||||
title = divContent.xpath(".//div[@class='info-box']/a/h1/text()")[0]
|
||||
pica = divContent.xpath(".//div[@class='thumb-box']/img/@src")[0]
|
||||
pic = 'https://www.3qu.live{0}'.format(pica)
|
||||
vod = {
|
||||
"vod_id": tid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": "",
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": "",
|
||||
"vod_actor": "",
|
||||
"vod_director": "",
|
||||
"vod_content": ""
|
||||
}
|
||||
infoArray = divContent.xpath(".//div[@class='info-box']/ul/li")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
flag = "类型" in content
|
||||
if flag == True:
|
||||
infon = content.strip().split(' ')
|
||||
for inf in infon:
|
||||
if inf.startswith('类型'):
|
||||
vod['type_name'] = inf.replace("类型:", "")
|
||||
if inf.startswith('地区'):
|
||||
vod['vod_area'] = inf.replace("地区:", "")
|
||||
if inf.startswith('语言'):
|
||||
vod['vod_remarks'] = inf.replace("语言:", "")
|
||||
if content.startswith('演员'):
|
||||
vod['vod_actor'] = content.replace("演员:", "")
|
||||
if content.startswith('年份'):
|
||||
yearl = content.split(' ')
|
||||
year = yearl[0].replace("年份:", "")
|
||||
vod['vod_year'] = year
|
||||
if content.startswith('导演'):
|
||||
vod['vod_director'] = content.replace("导演:", "")
|
||||
if content.startswith('简介'):
|
||||
vod['vod_content'] = content.replace("简介:", "")
|
||||
vodList = root.xpath(".//div[@class='tab-content']/div[@id='playlist']/a")
|
||||
playUrl = ''
|
||||
for vl in vodList:
|
||||
name = vl.xpath("./text()")[0]
|
||||
did = vl.xpath("./@data-id")[0]
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(name,tid,did)
|
||||
vod['vod_play_from'] = '快播影视'
|
||||
vod['vod_play_url'] = playUrl
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
url = 'https://www.3qu.live/api/v1/search?page=1&q={0}&type=all&period=0'.format(key)
|
||||
rsp = self.fetch(url, headers=header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
videos = []
|
||||
vodList = jRoot['data']['videos']
|
||||
for vod in vodList:
|
||||
id = vod['id']
|
||||
title = vod['name']
|
||||
img = vod['coverURL']
|
||||
pic = 'https://www.3qu.live{0}'.format(img)
|
||||
videos.append({
|
||||
"vod_id": id,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": ""
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
ids = id.split("_")
|
||||
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
url = 'https://www.3qu.live/api/v1/videos/{0}/{1}/playUrl'.format(ids[0],ids[1])
|
||||
rsp = self.fetch(url,headers=header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
apiurl = jRoot['data']['url']
|
||||
url = 'https://www.3qu.live{0}'.format(apiurl)
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] =url
|
||||
result["header"] = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def localProxy(self, param):
|
||||
action = {
|
||||
'url': '',
|
||||
'header': '',
|
||||
'param': '',
|
||||
'type': 'string',
|
||||
'after': ''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,175 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "77"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
url = 'http://api.kunyu77.com/api.php/provide/filter'
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
classes = []
|
||||
jData = jo['data']
|
||||
for cKey in jData.keys():
|
||||
classes.append({
|
||||
'type_name':jData[cKey][0]['cat'],
|
||||
'type_id':cKey
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
url = 'http://api.kunyu77.com/api.php/provide/homeBlock?type_id=0'
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
blockList = jo['data']['blocks']
|
||||
videos = []
|
||||
for block in blockList:
|
||||
vodList = block['contents']
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id":vod['id'],
|
||||
"vod_name":vod['title'],
|
||||
"vod_pic":vod['videoCover'],
|
||||
"vod_remarks":vod['msg']
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
if 'type_id' not in extend.keys():
|
||||
extend['type_id'] = tid
|
||||
extend['pagenum'] = pg
|
||||
filterParams = ["type_id", "pagenum"]
|
||||
params = ["", ""]
|
||||
for idx in range(len(filterParams)):
|
||||
fp = filterParams[idx]
|
||||
if fp in extend.keys():
|
||||
params[idx] = '&'+filterParams[idx]+'='+extend[fp]
|
||||
suffix = ''.join(params)
|
||||
url = 'http://api.kunyu77.com/api.php/provide/searchFilter?pagesize=24{0}'.format(suffix)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
vodList = jo['data']['result']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id":vod['id'],
|
||||
"vod_name":vod['title'],
|
||||
"vod_pic":vod['videoCover'],
|
||||
"vod_remarks":vod['msg']
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'http://api.kunyu77.com/api.php/provide/videoDetail?devid=453CA5D864457C7DB4D0EAA93DE96E66&package=com.sevenVideo.app.android&version=1.8.7&ids={0}'.format(tid)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
node = jo['data']
|
||||
vod = {
|
||||
"vod_id":node['id'],
|
||||
"vod_name":node['videoName'],
|
||||
"vod_pic":node['videoCover'],
|
||||
"type_name":node['subCategory'],
|
||||
"vod_year":node['year'],
|
||||
"vod_area":node['area'],
|
||||
"vod_remarks":node['msg'],
|
||||
"vod_actor":node['actor'],
|
||||
"vod_director":node['director'],
|
||||
"vod_content":node['brief'].strip()
|
||||
}
|
||||
listUrl = 'http://api.kunyu77.com/api.php/provide/videoPlaylist?devid=453CA5D864457C7DB4D0EAA93DE96E66&package=com.sevenVideo.app.android&version=1.8.7&ids={0}'.format(tid)
|
||||
listRsp = self.fetch(listUrl,headers=self.header)
|
||||
listJo = json.loads(listRsp.text)
|
||||
playMap = {}
|
||||
episodes = listJo['data']['episodes']
|
||||
for ep in episodes:
|
||||
playurls = ep['playurls']
|
||||
for playurl in playurls:
|
||||
source = playurl['playfrom']
|
||||
if source not in playMap.keys():
|
||||
playMap[source] = []
|
||||
playMap[source].append(playurl['title'].strip() + '$' + playurl['playurl'])
|
||||
|
||||
playFrom = []
|
||||
playList = []
|
||||
for key in playMap.keys():
|
||||
playFrom.append(key)
|
||||
playList.append('#'.join(playMap[key]))
|
||||
|
||||
vod_play_from = '$$$'
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
vod_play_url = '$$$'
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
url = 'http://api.kunyu77.com/api.php/provide/searchVideo?searchName={0}'.format(key)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
vodList = jo['data']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id":vod['id'],
|
||||
"vod_name":vod['videoName'],
|
||||
"vod_pic":vod['videoCover'],
|
||||
"vod_remarks":vod['msg']
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {
|
||||
"User-Agent":"Dalvik/2.1.0"
|
||||
}
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = 'http://api.kunyu77.com/api.php/provide/parserUrl?url={0}'.format(id)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
result = {
|
||||
'parse':0,
|
||||
'jx':0,
|
||||
'playUrl':'',
|
||||
'url':id,
|
||||
'header':''
|
||||
}
|
||||
if flag in vipFlags:
|
||||
result['parse'] = 1
|
||||
result['jx'] = 1
|
||||
return result
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,405 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import requests
|
||||
import time
|
||||
import re
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "阿里云盘"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
return result
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
if flag == 'AliYun':
|
||||
return self.originContent(flag,id,vipFlags)
|
||||
elif flag == 'AliYun原画':
|
||||
return self.fhdContent(flag,id,vipFlags)
|
||||
else:
|
||||
return {}
|
||||
def fhdContent(self,flag,id,vipFlags):
|
||||
self.login()
|
||||
ids = id.split('+')
|
||||
shareId = ids[0]
|
||||
shareToken = ids[1]
|
||||
fileId = ids[2]
|
||||
category = ids[3]
|
||||
url = self.getDownloadUrl(shareId,shareToken,fileId,category)
|
||||
print(url)
|
||||
|
||||
noRsp = requests.get(url,headers=self.header, allow_redirects=False,verify = False)
|
||||
realUrl = ''
|
||||
if 'Location' in noRsp.headers:
|
||||
realUrl = noRsp.headers['Location']
|
||||
if 'location' in noRsp.headers and len(realUrl) == 0 :
|
||||
realUrl = noRsp.headers['location']
|
||||
newHeader = {
|
||||
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36",
|
||||
"referer":"https://www.aliyundrive.com/",
|
||||
}
|
||||
result = {
|
||||
'parse':'0',
|
||||
'playUrl':'',
|
||||
'url':realUrl,
|
||||
'header':newHeader
|
||||
}
|
||||
return result
|
||||
def originContent(self,flag,id,vipFlags):
|
||||
self.login()
|
||||
ids = id.split('+')
|
||||
shareId = ids[0]
|
||||
shareToken = ids[1]
|
||||
fileId = ids[2]
|
||||
url = '{0}?do=push_agent&api=python&type=m3u8&share_id={1}&file_id={2}'.format(self.localProxyUrl,shareId,fileId)
|
||||
|
||||
result = {
|
||||
'parse':'0',
|
||||
'playUrl':'',
|
||||
'url':url,
|
||||
'header':''
|
||||
}
|
||||
|
||||
# shareToken = self.getToken(shareId,'')
|
||||
# self.getMediaSlice(shareId,shareToken,fileId)
|
||||
|
||||
|
||||
# map = {
|
||||
# 'share_id':'p1GJYEqgeb2',
|
||||
# 'file_id':'62ed1b95b1048d60ffc246669f5e0999e90b8c2f',
|
||||
# 'media_id':'1'
|
||||
# }
|
||||
|
||||
# self.proxyMedia(map)
|
||||
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
# shareId = self.regStr(href,'www.aliyundrive.com\\/s\\/([^\\/]+)(\\/folder\\/([^\\/]+))?')
|
||||
# todo =========================================================================================
|
||||
m = re.search('www.aliyundrive.com\\/s\\/([^\\/]+)(\\/folder\\/([^\\/]+))?', tid)
|
||||
col = m.groups()
|
||||
shareId = col[0]
|
||||
fileId = col[2]
|
||||
|
||||
infoUrl = 'https://api.aliyundrive.com/adrive/v3/share_link/get_share_by_anonymous'
|
||||
|
||||
infoForm = {'share_id':shareId}
|
||||
infoRsp = requests.post(infoUrl,json = infoForm,headers=self.header)
|
||||
infoJo = json.loads(infoRsp.text)
|
||||
|
||||
infoJa = []
|
||||
if 'file_infos' in infoJo:
|
||||
infoJa = infoJo['file_infos']
|
||||
if len(infoJa) <= 0 :
|
||||
return ''
|
||||
fileInfo = {}
|
||||
# todo
|
||||
fileInfo = infoJa[0]
|
||||
print(fileId)
|
||||
if fileId == None or len(fileId) <= 0:
|
||||
fileId = fileInfo['file_id']
|
||||
|
||||
vodList = {
|
||||
'vod_id':tid,
|
||||
'vod_name':infoJo['share_name'],
|
||||
'vod_pic':infoJo['avatar'],
|
||||
'vod_content':tid,
|
||||
'vod_play_from':'AliYun原画$$$AliYun'
|
||||
}
|
||||
fileType = fileInfo['type']
|
||||
if fileType != 'folder':
|
||||
if fileType != 'file' or fileInfo['category'] != video:
|
||||
return ''
|
||||
fileId = 'root'
|
||||
|
||||
shareToken = self.getToken(shareId,'')
|
||||
hashMap = {}
|
||||
self.listFiles(hashMap,shareId,shareToken,fileId)
|
||||
|
||||
sortedMap = sorted(hashMap.items(), key=lambda x: x[0])
|
||||
arrayList = []
|
||||
playList = []
|
||||
|
||||
for sm in sortedMap:
|
||||
arrayList.append(sm[0]+'$'+sm[1])
|
||||
playList.append('#'.join(arrayList))
|
||||
playList.append('#'.join(arrayList))
|
||||
vodList['vod_play_url'] = '$$$'.join(playList)
|
||||
|
||||
result = {
|
||||
'list':[vodList]
|
||||
}
|
||||
return result
|
||||
|
||||
authorization = ''
|
||||
timeoutTick = 0
|
||||
localTime = 0
|
||||
expiresIn = 0
|
||||
shareTokenMap = {}
|
||||
expiresMap = {}
|
||||
localMedia = {}
|
||||
header = {
|
||||
"Referer":"https://www.aliyundrive.com/",
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
|
||||
}
|
||||
localProxyUrl = 'http://127.0.0.1:UndCover/proxy'
|
||||
|
||||
def redirectResponse(tUrl):
|
||||
rsp = requests.get(tUrl, allow_redirects=False,verify = False)
|
||||
if 'Location' in rsp.headers:
|
||||
return redirectResponse(rsp.headers['Location'])
|
||||
else:
|
||||
return rsp
|
||||
|
||||
def getDownloadUrl(self,shareId,token,fileId,category):
|
||||
lShareId = shareId
|
||||
lFileId = fileId
|
||||
params = {
|
||||
"share_id": lShareId,
|
||||
"category": "live_transcoding",
|
||||
"file_id": lFileId,
|
||||
"template_id": ""
|
||||
}
|
||||
customHeader = self.header.copy()
|
||||
customHeader['x-share-token'] = token
|
||||
customHeader['authorization'] = self.authorization
|
||||
url = 'https://api.aliyundrive.com/v2/file/get_share_link_video_preview_play_info'
|
||||
if category == 'video':
|
||||
rsp = requests.post(url,json = params,headers=customHeader)
|
||||
rspJo = json.loads(rsp.text)
|
||||
lShareId = rspJo['share_id']
|
||||
lFileId = rspJo['file_id']
|
||||
jo = {
|
||||
|
||||
}
|
||||
if category == 'video':
|
||||
jo['share_id'] = lShareId
|
||||
jo['file_id'] = lFileId
|
||||
jo['expire_sec'] = 600
|
||||
if category == 'audio':
|
||||
jo['share_id'] = lShareId
|
||||
jo['file_id'] = lFileId
|
||||
jo['get_audio_play_info'] = True
|
||||
downloadUrl = 'https://api.aliyundrive.com/v2/file/get_share_link_download_url'
|
||||
downloadRsp = requests.post(downloadUrl,json = jo,headers=customHeader)
|
||||
resultJo = json.loads(downloadRsp.text)
|
||||
return resultJo['download_url']
|
||||
|
||||
def getMediaSlice(self,shareId,token,fileId):
|
||||
params = {
|
||||
"share_id": shareId,
|
||||
"category": "live_transcoding",
|
||||
"file_id": fileId,
|
||||
"template_id": ""
|
||||
}
|
||||
customHeader = self.header.copy()
|
||||
customHeader['x-share-token'] = token
|
||||
customHeader['authorization'] = self.authorization
|
||||
url = 'https://api.aliyundrive.com/v2/file/get_share_link_video_preview_play_info'
|
||||
|
||||
rsp = requests.post(url,json = params,headers=customHeader)
|
||||
rspJo = json.loads(rsp.text)
|
||||
|
||||
quality = ['FHD','HD','SD']
|
||||
videoList = rspJo['video_preview_play_info']['live_transcoding_task_list']
|
||||
highUrl = ''
|
||||
for q in quality:
|
||||
if len(highUrl) > 0:
|
||||
break
|
||||
for video in videoList:
|
||||
if(video['template_id'] == q):
|
||||
highUrl = video['url']
|
||||
break
|
||||
if len(highUrl) == 0:
|
||||
highUrl = videoList[0]['url']
|
||||
|
||||
noRsp = requests.get(highUrl,headers=self.header, allow_redirects=False,verify = False)
|
||||
m3u8Url = ''
|
||||
if 'Location' in noRsp.headers:
|
||||
m3u8Url = noRsp.headers['Location']
|
||||
if 'location' in noRsp.headers and len(m3u8Url) == 0 :
|
||||
m3u8Url = noRsp.headers['location']
|
||||
m3u8Rsp = requests.get(m3u8Url,headers=self.header)
|
||||
m3u8Content = m3u8Rsp.text
|
||||
|
||||
tmpArray = m3u8Url.split('/')[0:-1]
|
||||
host = '/'.join(tmpArray) + '/'
|
||||
|
||||
m3u8List = []
|
||||
mediaMap = {}
|
||||
slices = m3u8Content.split("\n")
|
||||
count = 0
|
||||
for slice in slices:
|
||||
tmpSlice = slice
|
||||
if 'x-oss-expires' in tmpSlice:
|
||||
count = count + 1
|
||||
mediaMap[str(count)] = host+tmpSlice
|
||||
|
||||
tmpSlice = "{0}?do=push_agent&api=python&type=media&share_id={1}&file_id={2}&media_id={3}".format(self.localProxyUrl,shareId,fileId,count)
|
||||
m3u8List.append(tmpSlice)
|
||||
|
||||
self.localMedia[fileId] = mediaMap
|
||||
|
||||
return '\n'.join(m3u8List)
|
||||
|
||||
def proxyMedia(self,map):
|
||||
shareId = map['share_id']
|
||||
fileId = map['file_id']
|
||||
mediaId = map['media_id']
|
||||
shareToken = self.getToken(shareId,'')
|
||||
|
||||
refresh = False
|
||||
url = ''
|
||||
ts = 0
|
||||
if fileId in self.localMedia:
|
||||
fileMap = self.localMedia[fileId]
|
||||
if mediaId in fileMap:
|
||||
url = fileMap[mediaId]
|
||||
if len(url) > 0:
|
||||
ts = int(self.regStr(url,"x-oss-expires=(\\d+)&"))
|
||||
|
||||
# url = self.localMedia[fileId][mediaId]
|
||||
|
||||
# ts = int(self.regStr(url,"x-oss-expires=(\\d+)&"))
|
||||
|
||||
self.localTime = int(time.time())
|
||||
|
||||
if ts - self.localTime <= 60:
|
||||
self.getMediaSlice(shareId,shareToken,fileId)
|
||||
url = self.localMedia[fileId][mediaId]
|
||||
|
||||
action = {
|
||||
'url':url,
|
||||
'header':self.header,
|
||||
'param':'',
|
||||
'type':'stream',
|
||||
'after':''
|
||||
}
|
||||
print(action)
|
||||
return [200, "video/MP2T", action, ""]
|
||||
|
||||
def proxyM3U8(self,map):
|
||||
shareId = map['share_id']
|
||||
fileId = map['file_id']
|
||||
|
||||
shareToken = self.getToken(shareId,'')
|
||||
content = self.getMediaSlice(shareId,shareToken,fileId)
|
||||
|
||||
action = {
|
||||
'url':'',
|
||||
'header':'',
|
||||
'param':'',
|
||||
'type':'string',
|
||||
'after':''
|
||||
}
|
||||
|
||||
return [200, "application/octet-stream", action, content]
|
||||
|
||||
def localProxy(self,param):
|
||||
typ = param['type']
|
||||
if typ == "m3u8":
|
||||
return self.proxyM3U8(param)
|
||||
if typ == "media":
|
||||
return self.proxyMedia(param)
|
||||
return None
|
||||
|
||||
def getToken(self,shareId,sharePwd):
|
||||
self.localTime = int(time.time())
|
||||
shareToken = ''
|
||||
if shareId in self.shareTokenMap:
|
||||
shareToken = self.shareTokenMap[shareId]
|
||||
# todo
|
||||
expire = self.expiresMap[shareId]
|
||||
if len(shareToken) > 0 and expire - self.localTime > 600:
|
||||
return shareToken
|
||||
params = {
|
||||
'share_id':shareId,
|
||||
'share_pwd':sharePwd
|
||||
}
|
||||
url = 'https://api.aliyundrive.com/v2/share_link/get_share_token'
|
||||
rsp = requests.post(url,json = params,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
newShareToken = jo['share_token']
|
||||
self.expiresMap[shareId] = self.localTime + int(jo['expires_in'])
|
||||
self.shareTokenMap[shareId] = newShareToken
|
||||
|
||||
print(self.expiresMap)
|
||||
print(self.shareTokenMap)
|
||||
|
||||
return newShareToken
|
||||
|
||||
def listFiles(self,map,shareId,shareToken,fileId):
|
||||
url = 'https://api.aliyundrive.com/adrive/v3/file/list'
|
||||
newHeader = self.header.copy()
|
||||
newHeader['x-share-token'] = shareToken
|
||||
params = {
|
||||
'image_thumbnail_process':'image/resize,w_160/format,jpeg',
|
||||
'image_url_process':'image/resize,w_1920/format,jpeg',
|
||||
'limit':200,
|
||||
'order_by':'updated_at',
|
||||
'order_direction':'DESC',
|
||||
'parent_file_id':fileId,
|
||||
'share_id':shareId,
|
||||
'video_thumbnail_process':'video/snapshot,t_1000,f_jpg,ar_auto,w_300'
|
||||
}
|
||||
maker = ''
|
||||
arrayList = []
|
||||
for i in range(1,51):
|
||||
if i >= 2 and len(maker) == 0:
|
||||
break
|
||||
params['marker'] = maker
|
||||
rsp = requests.post(url,json = params,headers=newHeader)
|
||||
jo = json.loads(rsp.text)
|
||||
ja = jo['items']
|
||||
for jt in ja:
|
||||
if jt['type'] == 'folder':
|
||||
arrayList.append(jt['file_id'])
|
||||
else:
|
||||
if 'video' in jt['mime_type'] or 'video' in jt['category']:
|
||||
repStr = jt['name'].replace("#", "_").replace("$", "_")
|
||||
map[repStr] = shareId + "+" + shareToken + "+" + jt['file_id'] + "+" + jt['category']
|
||||
# print(repStr,shareId + "+" + shareToken + "+" + jt['file_id'])
|
||||
maker = jo['next_marker']
|
||||
i = i + 1
|
||||
|
||||
for item in arrayList:
|
||||
self.listFiles(map,shareId,shareToken,item)
|
||||
|
||||
def login(self):
|
||||
self.localTime = int(time.time())
|
||||
url = 'https://api.aliyundrive.com/token/refresh'
|
||||
if len(self.authorization) == 0 or self.timeoutTick - self.localTime <= 600:
|
||||
form = {
|
||||
'refresh_token':'4acb3ad2f2254ba1b566279f7cd98ba3'
|
||||
}
|
||||
rsp = requests.post(url,json = form,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
self.authorization = jo['token_type'] + ' ' + jo['access_token']
|
||||
self.expiresIn = int(jo['expires_in'])
|
||||
self.timeoutTick = self.localTime + self.expiresIn
|
||||
|
||||
# print(self.authorization)
|
||||
# print(self.timeoutTick)
|
||||
# print(self.localTime)
|
||||
# print(self.expiresIn)
|
||||
@@ -1,445 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import requests
|
||||
import time
|
||||
import re
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "阿里云盘"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
return result
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
if flag == 'AliYun':
|
||||
return self.originContent(flag,id,vipFlags)
|
||||
elif flag == 'AliYun原画':
|
||||
return self.fhdContent(flag,id,vipFlags)
|
||||
else:
|
||||
return {}
|
||||
def fhdContent(self,flag,id,vipFlags):
|
||||
if not self.login():
|
||||
return {}
|
||||
ids = id.split('+')
|
||||
shareId = ids[0]
|
||||
shareToken = ids[1]
|
||||
fileId = ids[2]
|
||||
category = ids[3]
|
||||
subtitle = ids[4]
|
||||
url = self.getDownloadUrl(shareId,shareToken,fileId,category)
|
||||
|
||||
noRsp = requests.get(url,headers=self.header, allow_redirects=False,verify = False)
|
||||
realUrl = ''
|
||||
if 'Location' in noRsp.headers:
|
||||
realUrl = noRsp.headers['Location']
|
||||
if 'location' in noRsp.headers and len(realUrl) == 0 :
|
||||
realUrl = noRsp.headers['location']
|
||||
newHeader = {
|
||||
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36",
|
||||
"referer":"https://www.aliyundrive.com/",
|
||||
}
|
||||
subtitleUrl = self.subtitleContent(id)
|
||||
result = {
|
||||
'parse':'0',
|
||||
'playUrl':'',
|
||||
'url':realUrl,
|
||||
'header':newHeader,
|
||||
'subt':subtitleUrl
|
||||
}
|
||||
return result
|
||||
def subtitleContent(self,id):
|
||||
ids = id.split('+')
|
||||
shareId = ids[0]
|
||||
shareToken = ids[1]
|
||||
fileId = ids[2]
|
||||
category = ids[3]
|
||||
subtitle = ids[4]
|
||||
if len(subtitle) == 0:
|
||||
return ""
|
||||
|
||||
customHeader = self.header.copy()
|
||||
customHeader['x-share-token'] = shareToken
|
||||
customHeader['authorization'] = self.authorization
|
||||
|
||||
jo = {
|
||||
"expire_sec": 600,
|
||||
"share_id": shareId,
|
||||
"file_id": subtitle,
|
||||
"image_url_process": "image/resize,w_1920/format,jpeg",
|
||||
"image_thumbnail_process": "image/resize,w_1920/format,jpeg",
|
||||
"get_streams_url": True
|
||||
# ,
|
||||
# "drive_id": "183237630"
|
||||
}
|
||||
|
||||
downloadUrl = 'https://api.aliyundrive.com/v2/file/get_share_link_download_url'
|
||||
resultJo = requests.post(downloadUrl,json = jo,headers=customHeader).json()
|
||||
print(resultJo)
|
||||
noRsp = requests.get(resultJo['download_url'],headers=self.header, allow_redirects=False,verify = False)
|
||||
realUrl = ''
|
||||
if 'Location' in noRsp.headers:
|
||||
realUrl = noRsp.headers['Location']
|
||||
if 'location' in noRsp.headers and len(realUrl) == 0 :
|
||||
realUrl = noRsp.headers['location']
|
||||
return realUrl
|
||||
|
||||
def originContent(self,flag,id,vipFlags):
|
||||
if not self.login():
|
||||
return {}
|
||||
ids = id.split('+')
|
||||
shareId = ids[0]
|
||||
shareToken = ids[1]
|
||||
fileId = ids[2]
|
||||
subtitle = ids[4]
|
||||
url = '{0}?do=push_agent&api=python&type=m3u8&share_id={1}&file_id={2}'.format(self.localProxyUrl,shareId,fileId)
|
||||
subtitleUrl = self.subtitleContent(id)
|
||||
newHeader = {
|
||||
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36",
|
||||
"referer":"https://www.aliyundrive.com/",
|
||||
}
|
||||
result = {
|
||||
'parse':'0',
|
||||
'playUrl':'',
|
||||
'url':url,
|
||||
'header':newHeader,
|
||||
'subt':subtitleUrl
|
||||
}
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
m = re.search('www.aliyundrive.com\\/s\\/([^\\/]+)(\\/folder\\/([^\\/]+))?', tid)
|
||||
col = m.groups()
|
||||
shareId = col[0]
|
||||
fileId = col[2]
|
||||
|
||||
infoUrl = 'https://api.aliyundrive.com/adrive/v3/share_link/get_share_by_anonymous'
|
||||
|
||||
infoForm = {'share_id':shareId}
|
||||
infoRsp = requests.post(infoUrl,json = infoForm,headers=self.header)
|
||||
infoJo = json.loads(infoRsp.text)
|
||||
|
||||
infoJa = []
|
||||
if 'file_infos' in infoJo:
|
||||
infoJa = infoJo['file_infos']
|
||||
if len(infoJa) <= 0 :
|
||||
return ''
|
||||
fileInfo = {}
|
||||
|
||||
fileInfo = infoJa[0]
|
||||
|
||||
if fileId == None or len(fileId) <= 0:
|
||||
fileId = fileInfo['file_id']
|
||||
|
||||
vodList = {
|
||||
'vod_id':tid,
|
||||
'vod_name':infoJo['share_name'],
|
||||
'vod_pic':infoJo['avatar'],
|
||||
'vod_content':tid,
|
||||
'vod_play_from':'AliYun$$$AliYun原画'
|
||||
}
|
||||
fileType = fileInfo['type']
|
||||
if fileType != 'folder':
|
||||
if fileType != 'file' or fileInfo['category'] != video:
|
||||
return ''
|
||||
fileId = 'root'
|
||||
|
||||
shareToken = self.getToken(shareId,'')
|
||||
hashMap = {}
|
||||
self.listFiles(hashMap,shareId,shareToken,fileId)
|
||||
|
||||
sortedMap = sorted(hashMap.items(), key=lambda x: x[0])
|
||||
arrayList = []
|
||||
playList = []
|
||||
|
||||
for sm in sortedMap:
|
||||
arrayList.append(sm[0]+'$'+sm[1])
|
||||
playList.append('#'.join(arrayList))
|
||||
playList.append('#'.join(arrayList))
|
||||
vodList['vod_play_url'] = '$$$'.join(playList)
|
||||
|
||||
result = {
|
||||
'list':[vodList]
|
||||
}
|
||||
return result
|
||||
|
||||
authorization = ''
|
||||
timeoutTick = 0
|
||||
localTime = 0
|
||||
expiresIn = 0
|
||||
shareTokenMap = {}
|
||||
expiresMap = {}
|
||||
localMedia = {}
|
||||
header = {
|
||||
"Referer":"https://www.aliyundrive.com/",
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
|
||||
}
|
||||
localProxyUrl = 'http://127.0.0.1:UndCover/proxy'
|
||||
|
||||
def redirectResponse(tUrl):
|
||||
rsp = requests.get(tUrl, allow_redirects=False,verify = False)
|
||||
if 'Location' in rsp.headers:
|
||||
return redirectResponse(rsp.headers['Location'])
|
||||
else:
|
||||
return rsp
|
||||
|
||||
def getDownloadUrl(self,shareId,token,fileId,category):
|
||||
lShareId = shareId
|
||||
lFileId = fileId
|
||||
params = {
|
||||
"share_id": lShareId,
|
||||
"category": "live_transcoding",
|
||||
"file_id": lFileId,
|
||||
"template_id": ""
|
||||
}
|
||||
customHeader = self.header.copy()
|
||||
customHeader['x-share-token'] = token
|
||||
customHeader['authorization'] = self.authorization
|
||||
url = 'https://api.aliyundrive.com/v2/file/get_share_link_video_preview_play_info'
|
||||
if category == 'video':
|
||||
rsp = requests.post(url,json = params,headers=customHeader)
|
||||
rspJo = json.loads(rsp.text)
|
||||
lShareId = rspJo['share_id']
|
||||
lFileId = rspJo['file_id']
|
||||
jo = {
|
||||
|
||||
}
|
||||
if category == 'video':
|
||||
jo['share_id'] = lShareId
|
||||
jo['file_id'] = lFileId
|
||||
jo['expire_sec'] = 600
|
||||
if category == 'audio':
|
||||
jo['share_id'] = lShareId
|
||||
jo['file_id'] = lFileId
|
||||
jo['get_audio_play_info'] = True
|
||||
downloadUrl = 'https://api.aliyundrive.com/v2/file/get_share_link_download_url'
|
||||
downloadRsp = requests.post(downloadUrl,json = jo,headers=customHeader)
|
||||
resultJo = json.loads(downloadRsp.text)
|
||||
return resultJo['download_url']
|
||||
|
||||
def getMediaSlice(self,shareId,token,fileId):
|
||||
params = {
|
||||
"share_id": shareId,
|
||||
"category": "live_transcoding",
|
||||
"file_id": fileId,
|
||||
"template_id": ""
|
||||
}
|
||||
customHeader = self.header.copy()
|
||||
customHeader['x-share-token'] = token
|
||||
customHeader['authorization'] = self.authorization
|
||||
url = 'https://api.aliyundrive.com/v2/file/get_share_link_video_preview_play_info'
|
||||
|
||||
rsp = requests.post(url,json = params,headers=customHeader)
|
||||
rspJo = json.loads(rsp.text)
|
||||
|
||||
quality = ['FHD','HD','SD']
|
||||
videoList = rspJo['video_preview_play_info']['live_transcoding_task_list']
|
||||
highUrl = ''
|
||||
for q in quality:
|
||||
if len(highUrl) > 0:
|
||||
break
|
||||
for video in videoList:
|
||||
if(video['template_id'] == q):
|
||||
highUrl = video['url']
|
||||
break
|
||||
if len(highUrl) == 0:
|
||||
highUrl = videoList[0]['url']
|
||||
|
||||
noRsp = requests.get(highUrl,headers=self.header, allow_redirects=False,verify = False)
|
||||
m3u8Url = ''
|
||||
if 'Location' in noRsp.headers:
|
||||
m3u8Url = noRsp.headers['Location']
|
||||
if 'location' in noRsp.headers and len(m3u8Url) == 0 :
|
||||
m3u8Url = noRsp.headers['location']
|
||||
m3u8Rsp = requests.get(m3u8Url,headers=self.header)
|
||||
m3u8Content = m3u8Rsp.text
|
||||
|
||||
tmpArray = m3u8Url.split('/')[0:-1]
|
||||
host = '/'.join(tmpArray) + '/'
|
||||
|
||||
m3u8List = []
|
||||
mediaMap = {}
|
||||
slices = m3u8Content.split("\n")
|
||||
count = 0
|
||||
for slice in slices:
|
||||
tmpSlice = slice
|
||||
if 'x-oss-expires' in tmpSlice:
|
||||
count = count + 1
|
||||
mediaMap[str(count)] = host+tmpSlice
|
||||
|
||||
tmpSlice = "{0}?do=push_agent&api=python&type=media&share_id={1}&file_id={2}&media_id={3}".format(self.localProxyUrl,shareId,fileId,count)
|
||||
m3u8List.append(tmpSlice)
|
||||
|
||||
self.localMedia[fileId] = mediaMap
|
||||
|
||||
return '\n'.join(m3u8List)
|
||||
|
||||
def proxyMedia(self,map):
|
||||
shareId = map['share_id']
|
||||
fileId = map['file_id']
|
||||
mediaId = map['media_id']
|
||||
shareToken = self.getToken(shareId,'')
|
||||
|
||||
refresh = False
|
||||
url = ''
|
||||
ts = 0
|
||||
if fileId in self.localMedia:
|
||||
fileMap = self.localMedia[fileId]
|
||||
if mediaId in fileMap:
|
||||
url = fileMap[mediaId]
|
||||
if len(url) > 0:
|
||||
ts = int(self.regStr(url,"x-oss-expires=(\\d+)&"))
|
||||
|
||||
self.localTime = int(time.time())
|
||||
|
||||
if ts - self.localTime <= 60:
|
||||
self.getMediaSlice(shareId,shareToken,fileId)
|
||||
url = self.localMedia[fileId][mediaId]
|
||||
|
||||
action = {
|
||||
'url':url,
|
||||
'header':self.header,
|
||||
'param':'',
|
||||
'type':'stream',
|
||||
'after':''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
|
||||
def proxyM3U8(self,map):
|
||||
shareId = map['share_id']
|
||||
fileId = map['file_id']
|
||||
|
||||
shareToken = self.getToken(shareId,'')
|
||||
content = self.getMediaSlice(shareId,shareToken,fileId)
|
||||
|
||||
action = {
|
||||
'url':'',
|
||||
'header':'',
|
||||
'param':'',
|
||||
'type':'string',
|
||||
'after':''
|
||||
}
|
||||
|
||||
return [200, "application/octet-stream", action, content]
|
||||
|
||||
def localProxy(self,param):
|
||||
if not self.login():
|
||||
return {}
|
||||
typ = param['type']
|
||||
if typ == "m3u8":
|
||||
return self.proxyM3U8(param)
|
||||
if typ == "media":
|
||||
return self.proxyMedia(param)
|
||||
return None
|
||||
|
||||
def getToken(self,shareId,sharePwd):
|
||||
self.localTime = int(time.time())
|
||||
shareToken = ''
|
||||
if shareId in self.shareTokenMap:
|
||||
shareToken = self.shareTokenMap[shareId]
|
||||
# todo
|
||||
expire = self.expiresMap[shareId]
|
||||
if len(shareToken) > 0 and expire - self.localTime > 600:
|
||||
return shareToken
|
||||
params = {
|
||||
'share_id':shareId,
|
||||
'share_pwd':sharePwd
|
||||
}
|
||||
url = 'https://api.aliyundrive.com/v2/share_link/get_share_token'
|
||||
rsp = requests.post(url,json = params,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
newShareToken = jo['share_token']
|
||||
self.expiresMap[shareId] = self.localTime + int(jo['expires_in'])
|
||||
self.shareTokenMap[shareId] = newShareToken
|
||||
|
||||
# print(self.expiresMap)
|
||||
# print(self.shareTokenMap)
|
||||
|
||||
return newShareToken
|
||||
|
||||
def listFiles(self,map,shareId,shareToken,fileId,subtitle={}):
|
||||
url = 'https://api.aliyundrive.com/adrive/v3/file/list'
|
||||
newHeader = self.header.copy()
|
||||
newHeader['x-share-token'] = shareToken
|
||||
params = {
|
||||
'image_thumbnail_process':'image/resize,w_160/format,jpeg',
|
||||
'image_url_process':'image/resize,w_1920/format,jpeg',
|
||||
'limit':200,
|
||||
'order_by':'updated_at',
|
||||
'order_direction':'DESC',
|
||||
'parent_file_id':fileId,
|
||||
'share_id':shareId,
|
||||
'video_thumbnail_process':'video/snapshot,t_1000,f_jpg,ar_auto,w_300'
|
||||
}
|
||||
maker = ''
|
||||
arrayList = []
|
||||
for i in range(1,51):
|
||||
if i >= 2 and len(maker) == 0:
|
||||
break
|
||||
params['marker'] = maker
|
||||
rsp = requests.post(url,json = params,headers=newHeader)
|
||||
jo = json.loads(rsp.text)
|
||||
ja = jo['items']
|
||||
for jt in ja:
|
||||
if jt['type'] == 'folder':
|
||||
arrayList.append(jt['file_id'])
|
||||
else:
|
||||
if 'video' in jt['mime_type'] or 'video' in jt['category']:
|
||||
repStr = jt['name'].replace("#", "_").replace("$", "_").replace(jt['file_extension'],'')[0:-1]
|
||||
map[repStr] = shareId + "+" + shareToken + "+" + jt['file_id'] + "+" + jt['category'] + "+"
|
||||
elif 'others' == jt['category'] and ('srt' == jt['file_extension'] or 'ass' == jt['file_extension']):
|
||||
repStr = jt['name'].replace("#", "_").replace("$", "_").replace(jt['file_extension'],'')[0:-1]
|
||||
subtitle[repStr] = jt['file_id']
|
||||
maker = jo['next_marker']
|
||||
i = i + 1
|
||||
|
||||
for item in arrayList:
|
||||
self.listFiles(map,shareId,shareToken,item,subtitle)
|
||||
for key in map.keys():
|
||||
for subKey in subtitle.keys():
|
||||
if key in subKey and map[key][-1] == "+":
|
||||
map[key]=map[key]+subtitle[subKey]
|
||||
break
|
||||
|
||||
def login(self):
|
||||
self.localTime = int(time.time())
|
||||
url = 'https://api.aliyundrive.com/token/refresh'
|
||||
if len(self.authorization) == 0 or self.timeoutTick - self.localTime <= 600:
|
||||
form = {
|
||||
'refresh_token':'4acb3ad2f2254ba1b566279f7cd98ba3'
|
||||
}
|
||||
rsp = requests.post(url,json = form,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
if rsp.status_code == 200:
|
||||
self.authorization = jo['token_type'] + ' ' + jo['access_token']
|
||||
self.expiresIn = int(jo['expires_in'])
|
||||
self.timeoutTick = self.localTime + self.expiresIn
|
||||
return True
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
# print(self.authorization)
|
||||
# print(self.timeoutTick)
|
||||
# print(self.localTime)
|
||||
# print(self.expiresIn)
|
||||
@@ -1,175 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "哔哩"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"Zard": "Zard",
|
||||
"玩具汽车": "玩具汽车",
|
||||
"儿童": "儿童",
|
||||
"幼儿": "幼儿",
|
||||
"儿童玩具": "儿童玩具",
|
||||
"昆虫": "昆虫",
|
||||
"动物世界": "动物世界",
|
||||
"纪录片": "纪录片",
|
||||
"相声小品": "相声小品",
|
||||
"搞笑": "搞笑",
|
||||
"假窗-白噪音": "窗+白噪音",
|
||||
"演唱会": "演唱会"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
cookies = ''
|
||||
def getCookie(self):
|
||||
rsp = self.fetch("https://www.bilibili.com/")
|
||||
self.cookies = rsp.cookies
|
||||
return rsp.cookies
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&duration=4&page={1}'.format(tid,pg)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url,cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] != 0:
|
||||
rspRetry = self.fetch(url,cookies=self.getCookie())
|
||||
content = rspRetry.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
remark = str(vod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def cleanSpace(self,str):
|
||||
return str.replace('\n','').replace('\t','').replace('\r','').replace(' ','')
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "https://api.bilibili.com/x/web-interface/view?aid={0}".format(aid)
|
||||
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
title = jo['title'].replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
pic = jo['pic']
|
||||
desc = jo['desc']
|
||||
typeName = jo['tname']
|
||||
vod = {
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":typeName,
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":desc
|
||||
}
|
||||
ja = jo['pages']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['part']
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part,aid,cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
# https://www.555dianying.cc/vodplay/static/js/playerconfig.js
|
||||
result = {}
|
||||
|
||||
ids = id.split("_")
|
||||
url = 'https://api.bilibili.com:443/x/player/playurl?avid={0}&cid=%20%20{1}&qn=112'.format(ids[0],ids[1])
|
||||
rsp = self.fetch(url)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
ja = jo['durl']
|
||||
|
||||
maxSize = -1
|
||||
position = -1
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer":"https://www.bilibili.com",
|
||||
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,175 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "哔哩"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"Zard": "Zard",
|
||||
"玩具汽车": "玩具汽车",
|
||||
"儿童": "儿童",
|
||||
"幼儿": "幼儿",
|
||||
"儿童玩具": "儿童玩具",
|
||||
"昆虫": "昆虫",
|
||||
"动物世界": "动物世界",
|
||||
"纪录片": "纪录片",
|
||||
"相声小品": "相声小品",
|
||||
"搞笑": "搞笑",
|
||||
"假窗-白噪音": "窗+白噪音",
|
||||
"演唱会": "演唱会"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
cookies = ''
|
||||
def getCookie(self):
|
||||
rsp = self.fetch("https://www.bilibili.com/")
|
||||
self.cookies = rsp.cookies
|
||||
return rsp.cookies
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&duration=4&page={1}'.format(tid,pg)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url,cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] != 0:
|
||||
rspRetry = self.fetch(url,cookies=self.getCookie())
|
||||
content = rspRetry.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
remark = str(vod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def cleanSpace(self,str):
|
||||
return str.replace('\n','').replace('\t','').replace('\r','').replace(' ','')
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "https://api.bilibili.com/x/web-interface/view?aid={0}".format(aid)
|
||||
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
title = jo['title'].replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
pic = jo['pic']
|
||||
desc = jo['desc']
|
||||
typeName = jo['tname']
|
||||
vod = {
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":typeName,
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":desc
|
||||
}
|
||||
ja = jo['pages']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['part']
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part,aid,cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
# https://www.555dianying.cc/vodplay/static/js/playerconfig.js
|
||||
result = {}
|
||||
|
||||
ids = id.split("_")
|
||||
url = 'https://api.bilibili.com:443/x/player/playurl?avid={0}&cid=%20%20{1}&qn=112'.format(ids[0],ids[1])
|
||||
rsp = self.fetch(url)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
ja = jo['durl']
|
||||
|
||||
maxSize = -1
|
||||
position = -1
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer":"https://www.bilibili.com",
|
||||
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,379 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "哔哩哔哩"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"动态":"动态",
|
||||
"热门":"热门",
|
||||
"排行榜":"排行榜",
|
||||
"频道":"频道",
|
||||
"历史记录":"历史记录",
|
||||
"zane妈":"zane妈",
|
||||
"相声小品": "相声小品",
|
||||
"林芊妤":"林芊妤",
|
||||
"Zard": "Zard",
|
||||
"玩具汽车": "玩具汽车",
|
||||
"儿童": "儿童",
|
||||
"幼儿": "幼儿",
|
||||
"儿童玩具": "儿童玩具",
|
||||
"昆虫": "昆虫",
|
||||
"动物世界": "动物世界",
|
||||
"纪录片": "纪录片",
|
||||
"搞笑": "搞笑",
|
||||
"假窗-白噪音": "窗+白噪音",
|
||||
"演唱会": "演唱会"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
cookies = ''
|
||||
def getCookie(self):
|
||||
import requests
|
||||
import http.cookies
|
||||
### 这里加cookie
|
||||
raw_cookie_line = ""
|
||||
simple_cookie = http.cookies.SimpleCookie(raw_cookie_line)
|
||||
cookie_jar = requests.cookies.RequestsCookieJar()
|
||||
cookie_jar.update(simple_cookie)
|
||||
return cookie_jar
|
||||
def get_dynamic(self,pg):
|
||||
result = {}
|
||||
if int(pg) > 1:
|
||||
return result
|
||||
offset = ''
|
||||
videos = []
|
||||
for i in range(0,10):
|
||||
url= 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=all&page={0}&offset={1}'.format(pg,offset)
|
||||
rsp = self.fetch(url,cookies=self.getCookie())
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
offset = jo['data']['offset']
|
||||
vodList = jo['data']['items']
|
||||
for vod in vodList:
|
||||
if vod['type'] == 'DYNAMIC_TYPE_AV':
|
||||
ivod = vod['modules']['module_dynamic']['major']['archive']
|
||||
aid = str(ivod['aid']).strip()
|
||||
title = ivod['title'].strip().replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
img = ivod['cover'].strip()
|
||||
remark = str(ivod['duration_text']).strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def second_to_time(self,a):
|
||||
#将秒数转化为 时分秒的格式
|
||||
if a < 3600:
|
||||
return time.strftime("%M:%S", time.gmtime(a))
|
||||
else:
|
||||
return time.strftime("%H:%M:%S", time.gmtime(a))
|
||||
def get_history(self,pg):
|
||||
result = {}
|
||||
url = 'http://api.bilibili.com/x/v2/history?pn=%s' % pg
|
||||
rsp = self.fetch(url,cookies=self.getCookie())
|
||||
content = rsp.text
|
||||
jo = json.loads(content) #解析api接口,转化成json数据对象
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']
|
||||
for vod in vodList:
|
||||
if vod['duration'] > 0: #筛选掉非视频的历史记录
|
||||
aid = str(vod["aid"]).strip() #获取 aid
|
||||
#获取标题
|
||||
title = vod["title"].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""",
|
||||
'"')
|
||||
#封面图片
|
||||
img = vod["pic"].strip()
|
||||
|
||||
#获取已观看时间
|
||||
if str(vod['progress'])=='-1':
|
||||
process=str(self.second_to_time(vod['duration'])).strip()
|
||||
else:
|
||||
process = str(self.second_to_time(vod['progress'])).strip()
|
||||
#获取视频总时长
|
||||
total_time= str(self.second_to_time(vod['duration'])).strip()
|
||||
#组合 已观看时间 / 总时长 ,赋值给 remark
|
||||
remark = process+' / '+total_time
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def get_hot(self,pg):
|
||||
result = {}
|
||||
url= 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn={0}'.format(pg)
|
||||
rsp = self.fetch(url,cookies=self.getCookie())
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
img = vod['pic'].strip()
|
||||
remark = str(vod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def get_rank(self):
|
||||
result = {}
|
||||
url= 'https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all'
|
||||
rsp = self.fetch(url,cookies=self.getCookie())
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
img = vod['pic'].strip()
|
||||
remark = str(vod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def get_channel(self,pg,cid):
|
||||
result = {}
|
||||
if int(pg) > 1:
|
||||
return result
|
||||
offset = ''
|
||||
videos = []
|
||||
for i in range(0,5):
|
||||
url= 'https://api.bilibili.com/x/web-interface/web/channel/multiple/list?channel_id={0}&sort_type=hot&offset={1}&page_size=30'.format(cid,offset)
|
||||
rsp = self.fetch(url,cookies=self.getCookie())
|
||||
content = rsp.text
|
||||
print(content)
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
offset = jo['data']['offset']
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
if vod['card_type'] == 'rank':
|
||||
rankVods = vod['items']
|
||||
for ivod in rankVods:
|
||||
aid = str(ivod['id']).strip()
|
||||
title = ivod['name'].strip().replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
img = ivod['cover'].strip()
|
||||
remark = str(ivod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
elif vod['card_type'] == 'archive':
|
||||
aid = str(vod['id']).strip()
|
||||
title = vod['name'].strip().replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
img = vod['cover'].strip()
|
||||
remark = str(vod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
print(tid,pg,filter,extend)
|
||||
result = {}
|
||||
if tid == "热门":
|
||||
return self.get_hot(pg=pg)
|
||||
if tid == "排行榜" :
|
||||
return self.get_rank()
|
||||
if tid == '动态':
|
||||
return self.get_dynamic(pg=pg)
|
||||
if tid == '历史记录':
|
||||
return self.get_history(pg=pg)
|
||||
if tid == '频道':
|
||||
cid = '9222'
|
||||
if 'cid' in extend:
|
||||
cid = extend['cid']
|
||||
return self.get_channel(pg=pg,cid=cid)
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&page={1}'.format(tid,pg)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url,cookies=self.getCookie())
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] != 0:
|
||||
rspRetry = self.fetch(url,cookies=self.getCookie())
|
||||
content = rspRetry.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = tid + ":" + vod['title'].strip().replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
remark = str(vod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def cleanSpace(self,str):
|
||||
return str.replace('\n','').replace('\t','').replace('\r','').replace(' ','')
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "https://api.bilibili.com/x/web-interface/view?aid={0}".format(aid)
|
||||
|
||||
rsp = self.fetch(url,headers=self.header,cookies=self.getCookie())
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
title = jo['title'].replace("<em class=\"keyword\">","").replace("</em>","")
|
||||
pic = jo['pic']
|
||||
desc = jo['desc']
|
||||
typeName = jo['tname']
|
||||
vod = {
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":typeName,
|
||||
"vod_year":"",
|
||||
"vod_area":"bilidanmu",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":jo['owner']['name'],
|
||||
"vod_director":jo['owner']['name'],
|
||||
"vod_content":desc
|
||||
}
|
||||
ja = jo['pages']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['part']
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part,aid,cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
search = self.categoryContent(tid=key,pg=1,filter=None,extend=None)
|
||||
result = {
|
||||
'list':search['list']
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
# https://www.555dianying.cc/vodplay/static/js/playerconfig.js
|
||||
result = {}
|
||||
|
||||
ids = id.split("_")
|
||||
url = 'https://api.bilibili.com:443/x/player/playurl?avid={0}&cid=%20%20{1}&qn=112'.format(ids[0],ids[1])
|
||||
rsp = self.fetch(url,cookies=self.getCookie())
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
ja = jo['durl']
|
||||
|
||||
maxSize = -1
|
||||
position = -1
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer":"https://www.bilibili.com",
|
||||
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"频道":[{"key":"cid","name":"分类","value":[{'n': '搞笑', 'v': 1833}, {'n': '美食', 'v': 20215}, {'n': '鬼畜', 'v': 68}, {'n': '天官赐福', 'v': 2544632}, {'n': '英雄联盟', 'v': 9222}, {'n': '美妆', 'v': 832569}, {'n': '必剪创作', 'v': 15775524}, {'n': '单机游戏', 'v': 17683}, {'n': '搞笑', 'v': 1833}, {'n': '科普', 'v': 5417}, {'n': '影视剪辑', 'v': 318570}, {'n': 'vlog', 'v': 2511282}, {'n': '声优', 'v': 1645}, {'n': '动漫杂谈', 'v': 530918}, {'n': 'COSPLAY', 'v': 88}, {'n': '漫展', 'v': 22551}, {'n': 'MAD', 'v': 281}, {'n': '手书', 'v': 608}, {'n': '英雄联盟', 'v': 9222}, {'n': '王者荣耀', 'v': 1404375}, {'n': '单机游戏', 'v': 17683}, {'n': '我的世界', 'v': 47988}, {'n': '守望先锋', 'v': 926988}, {'n': '恐怖游戏', 'v': 17941}, {'n': '英雄联盟', 'v': 9222}, {'n': '王者荣耀', 'v': 1404375}, {'n': '守望先锋', 'v': 926988}, {'n': '炉石传说', 'v': 318756}, {'n': 'DOTA2', 'v': 47034}, {'n': 'CS:GO', 'v': 99842}, {'n': '鬼畜', 'v': 68}, {'n': '鬼畜调教', 'v': 497221}, {'n': '诸葛亮', 'v': 51330}, {'n': '二次元鬼畜', 'v': 29415}, {'n': '王司徒', 'v': 987568}, {'n': '万恶之源', 'v': 21}, {'n': '美妆', 'v': 832569}, {'n': '服饰', 'v': 313718}, {'n': '减肥', 'v': 20805}, {'n': '穿搭', 'v': 1139735}, {'n': '发型', 'v': 13896}, {'n': '化妆教程', 'v': 261355}, {'n': '电音', 'v': 14426}, {'n': '欧美音乐', 'v': 17034}, {'n': '中文翻唱', 'v': 8043}, {'n': '洛天依', 'v': 8564}, {'n': '翻唱', 'v': 386}, {'n': '日文翻唱', 'v': 85689}, {'n': '科普', 'v': 5417}, {'n': '技术宅', 'v': 368}, {'n': '历史', 'v': 221}, {'n': '科学', 'v': 1364}, {'n': '人文', 'v': 40737}, {'n': '科幻', 'v': 5251}, {'n': '手机', 'v': 7007}, {'n': '手机评测', 'v': 143751}, {'n': '电脑', 'v': 1339}, {'n': '摄影', 'v': 25450}, {'n': '笔记本', 'v': 1338}, {'n': '装机', 'v': 413678}, {'n': '课堂教育', 'v': 3233375}, {'n': '公开课', 'v': 31864}, {'n': '演讲', 'v': 2739}, {'n': 'PS教程', 'v': 335752}, {'n': '编程', 'v': 28784}, {'n': '英语学习', 'v': 360005}, {'n': '喵星人', 'v': 1562}, {'n': '萌宠', 'v': 6943}, {'n': '汪星人', 'v': 9955}, {'n': '大熊猫', 'v': 22919}, {'n': '柴犬', 'v': 30239}, {'n': '吱星人', 'v': 6947}, {'n': '美食', 'v': 20215}, {'n': '甜点', 'v': 35505}, {'n': '吃货', 'v': 6942}, {'n': '厨艺', 'v': 239855}, {'n': '烘焙', 'v': 218245}, {'n': '街头美食', 'v': 1139423}, {'n': 'A.I.Channel', 'v': 3232987}, {'n': '虚拟UP主', 'v': 4429874}, {'n': '神楽めあ', 'v': 7562902}, {'n': '白上吹雪', 'v': 7355391}, {'n': '彩虹社', 'v': 1099778}, {'n': 'hololive', 'v': 8751822}, {'n': 'EXO', 'v': 191032}, {'n': '防弹少年团', 'v': 536395}, {'n': '肖战', 'v': 1450880}, {'n': '王一博', 'v': 902215}, {'n': '易烊千玺', 'v': 15186}, {'n': 'BLACKPINK', 'v': 1749296}, {'n': '宅舞', 'v': 9500}, {'n': '街舞', 'v': 5574}, {'n': '舞蹈教学', 'v': 157087}, {'n': '明星舞蹈', 'v': 6012204}, {'n': '韩舞', 'v': 159571}, {'n': '古典舞', 'v': 161247}, {'n': '旅游', 'v': 6572}, {'n': '绘画', 'v': 2800}, {'n': '手工', 'v': 11265}, {'n': 'vlog', 'v': 2511282}, {'n': 'DIY', 'v': 3620}, {'n': '手绘', 'v': 1210}, {'n': '综艺', 'v': 11687}, {'n': '国家宝藏', 'v': 105286}, {'n': '脱口秀', 'v': 4346}, {'n': '日本综艺', 'v': 81265}, {'n': '国内综艺', 'v': 641033}, {'n': '人类观察', 'v': 282453}, {'n': '影评', 'v': 111377}, {'n': '电影解说', 'v': 1161117}, {'n': '影视混剪', 'v': 882598}, {'n': '影视剪辑', 'v': 318570}, {'n': '漫威', 'v': 138600}, {'n': '超级英雄', 'v': 13881}, {'n': '影视混剪', 'v': 882598}, {'n': '影视剪辑', 'v': 318570}, {'n': '诸葛亮', 'v': 51330}, {'n': '韩剧', 'v': 53056}, {'n': '王司徒', 'v': 987568}, {'n': '泰剧', 'v': 179103}, {'n': '郭德纲', 'v': 8892}, {'n': '相声', 'v': 5783}, {'n': '张云雷', 'v': 1093613}, {'n': '秦霄贤', 'v': 3327368}, {'n': '孟鹤堂', 'v': 1482612}, {'n': '岳云鹏', 'v': 24467}, {'n': '假面骑士', 'v': 2069}, {'n': '特摄', 'v': 2947}, {'n': '奥特曼', 'v': 963}, {'n': '迪迦奥特曼', 'v': 13784}, {'n': '超级战队', 'v': 32881}, {'n': '铠甲勇士', 'v': 11564}, {'n': '健身', 'v': 4344}, {'n': '篮球', 'v': 1265}, {'n': '体育', 'v': 41103}, {'n': '帕梅拉', 'v': 257412}, {'n': '极限运动', 'v': 8876}, {'n': '足球', 'v': 584}, {'n': '星海', 'v': 178862}, {'n': '张召忠', 'v': 116480}, {'n': '航母', 'v': 57834}, {'n': '航天', 'v': 81618}, {'n': '导弹', 'v': 14958}, {'n': '战斗机', 'v': 24304}]}]}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,1476 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import requests
|
||||
from requests import session, utils
|
||||
import os
|
||||
import time
|
||||
import base64
|
||||
from time import strftime
|
||||
from time import gmtime
|
||||
|
||||
|
||||
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
box_video_type = ''
|
||||
vod_area='bilidanmu'
|
||||
|
||||
def getName(self):
|
||||
return "哔哩3_带直播"
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
|
||||
self.getCookie()
|
||||
|
||||
|
||||
|
||||
url = 'http://api.bilibili.com/x/v3/fav/folder/created/list-all?up_mid=%s&jsonp=jsonp' % (self.userid)
|
||||
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
|
||||
|
||||
|
||||
fav_list=[]
|
||||
|
||||
|
||||
if jo['code'] == 0:
|
||||
for fav in jo['data'].get('list'):
|
||||
|
||||
fav_dict = {'n':fav['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"').strip() ,'v':fav['id']}
|
||||
fav_list.append(fav_dict)
|
||||
|
||||
|
||||
if self.config["filter"].get('收藏夹'):
|
||||
for i in self.config["filter"].get('收藏夹'):
|
||||
if i['key']=='mlid':
|
||||
i['value']=fav_list
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def second_to_time(self,a):
|
||||
#将秒数转化为 时分秒的格式
|
||||
if a < 3600:
|
||||
return time.strftime("%M:%S", time.gmtime(a))
|
||||
else:
|
||||
return time.strftime("%H:%M:%S", time.gmtime(a))
|
||||
|
||||
def manualVideoCheck(self):
|
||||
|
||||
pass
|
||||
|
||||
#用户userid
|
||||
userid=''
|
||||
|
||||
def get_live_userInfo(self,uid):
|
||||
|
||||
url = 'https://api.live.bilibili.com/live_user/v1/Master/info?uid=%s'%uid
|
||||
|
||||
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
|
||||
if jo['code'] == 0:
|
||||
|
||||
return jo['data']["info"]["uname"]
|
||||
|
||||
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"动态": "动态",
|
||||
"历史记录": '历史记录',
|
||||
"收藏夹": '收藏夹',
|
||||
"热门": "热门",
|
||||
"排行榜": "排行榜",
|
||||
"频道": "频道",
|
||||
"直播": "直播",
|
||||
"舞蹈": "舞蹈",
|
||||
"宅舞": "宅舞",
|
||||
"少女": "少女",
|
||||
'cosplay':'cosplay',
|
||||
'mmd':'mmd',
|
||||
|
||||
"鬼畜": "鬼畜",
|
||||
"狗狗": "汪星人",
|
||||
'科技': '科技',
|
||||
|
||||
"音声": "音声",
|
||||
"演唱会": "演唱会",
|
||||
"番剧": "1",
|
||||
"国创": "4",
|
||||
"电影": "2",
|
||||
"综艺": "7",
|
||||
"电视剧": "5",
|
||||
"纪录片": "3",
|
||||
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
self.box_video_type = '热门'
|
||||
return self.get_hot(pg='1')
|
||||
|
||||
cookies = ''
|
||||
|
||||
# def getCookie(self):
|
||||
# # 在cookies_str中填入会员或大会员cookie,以获得更好的体验。
|
||||
# cookies_str = "buvid3=CFF74DA7-E79E-4B53-BB96-FC74AB8CD2F3184997infoc; LIVE_BUVID=AUTO4216125328906835; rpdid=|(umRum~uY~R0J'uYukYukkkY; balh_is_closed=; balh_server_inner=__custom__; PVID=4; video_page_version=v_old_home; i-wanna-go-back=-1; CURRENT_BLACKGAP=0; blackside_state=0; fingerprint=8965144a609d60190bd051578c610d72; buvid_fp_plain=undefined; CURRENT_QUALITY=120; hit-dyn-v2=1; nostalgia_conf=-1; buvid_fp=CFF74DA7-E79E-4B53-BB96-FC74AB8CD2F3184997infoc; CURRENT_FNVAL=4048; DedeUserID=85342; DedeUserID__ckMd5=f070401c4c699c83; b_ut=5; hit-new-style-dyn=0; buvid4=15C64651-E8B7-100C-4B1F-C7CFD2DB473007906-022110820-jYQRaMeS%2BRXRfw14q70%2FLQ%3D%3D; b_nut=1667910208; b_lsid=3CE4AE79_184578915C0; is-2022-channel=1; innersign=0; SESSDATA=a5e4d58d%2C1683641322%2C2c39a%2Ab1; bili_jct=2f3126b5954e37f593130f2fef082cd8; sid=p7tjqv22; bp_video_offset_85342=726936847258746900"
|
||||
# cookies_dic = dict([co.strip().split('=') for co in cookies_str.split(';')])
|
||||
# rsp = session()
|
||||
# cookies_jar = utils.cookiejar_from_dict(cookies_dic)
|
||||
# rsp.cookies = cookies_jar
|
||||
# content = self.fetch("http://api.bilibili.com/x/web-interface/nav", cookies=rsp.cookies)
|
||||
# res = json.loads(content.text)
|
||||
# if res["code"] == 0:
|
||||
# self.cookies = rsp.cookies
|
||||
# else:
|
||||
|
||||
# rsp = self.fetch("https://www.bilibili.com/")
|
||||
# self.cookies = rsp.cookies
|
||||
# return rsp.cookies
|
||||
def getCookie(self):
|
||||
|
||||
#在下方cookies_str 后面 双引号里面放置你的cookies
|
||||
cookies_str = ""
|
||||
if cookies_str:
|
||||
cookies = dict([co.strip().split('=') for co in cookies_str.split(';')])
|
||||
bili_jct = cookies['bili_jct']
|
||||
SESSDATA = cookies['SESSDATA']
|
||||
DedeUserID = cookies['DedeUserID']
|
||||
|
||||
cookies_jar={"bili_jct":bili_jct,
|
||||
'SESSDATA': SESSDATA,
|
||||
'DedeUserID':DedeUserID
|
||||
|
||||
}
|
||||
rsp = session()
|
||||
rsp.cookies = cookies_jar
|
||||
content = self.fetch("http://api.bilibili.com/x/web-interface/nav", cookies=rsp.cookies)
|
||||
res = json.loads(content.text)
|
||||
|
||||
if res["code"] == 0:
|
||||
self.cookies = rsp.cookies
|
||||
self.userid = res["data"].get('mid')
|
||||
|
||||
return rsp.cookies
|
||||
rsp = self.fetch("https://www.bilibili.com/")
|
||||
self.cookies = rsp.cookies
|
||||
|
||||
|
||||
return rsp.cookies
|
||||
|
||||
|
||||
|
||||
|
||||
def get_hot(self, pg):
|
||||
self.box_video_type = '热门'
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn={0}'.format(pg)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['pic'].strip()
|
||||
remark = str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid+'&hot',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def str2sec(self,x):
|
||||
'''
|
||||
字符串时分秒转换成秒
|
||||
'''
|
||||
x=str(x)
|
||||
try:
|
||||
h, m, s = x.strip().split(':') #.split()函数将其通过':'分隔开,.strip()函数用来除去空格
|
||||
return int(h)*3600 + int(m)*60 + int(s) #int()函数转换成整数运算
|
||||
except:
|
||||
m, s = x.strip().split(':') #.split()函数将其通过':'分隔开,.strip()函数用来除去空格
|
||||
return int(m)*60 + int(s) #int()函数转换成整数运算
|
||||
|
||||
|
||||
def get_rank(self):
|
||||
self.box_video_type = '排行榜'
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all'
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['pic'].strip()
|
||||
remark = str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid+'&rank',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
|
||||
def filter_duration(self, vodlist, key):
|
||||
# 按时间过滤
|
||||
if key == '0':
|
||||
return vodlist
|
||||
else:
|
||||
|
||||
|
||||
vod_list_new = [i for i in vodlist if self.time_diff1[key][0] <= self.str2sec(str(i["vod_remarks"])) < self.time_diff1[key][1]]
|
||||
return vod_list_new
|
||||
|
||||
|
||||
|
||||
|
||||
chanel_offset=''
|
||||
def get_channel(self, pg, cid,extend,order,duration_diff):
|
||||
result = {}
|
||||
self.box_video_type = '频道'
|
||||
|
||||
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&page={1}&duration={2}&order={3}'.format(
|
||||
cid, pg,duration_diff,order)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo.get('code') == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
remark = str( self.second_to_time(self.str2sec(vod['duration']))).strip()
|
||||
videos.append({
|
||||
"vod_id": aid+'&channale',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
|
||||
})
|
||||
|
||||
|
||||
#videos=self.filter_duration(videos, duration_diff)
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
|
||||
|
||||
|
||||
dynamic_offset = ''
|
||||
|
||||
def get_dynamic(self, pg):
|
||||
self.box_video_type = '动态'
|
||||
result = {}
|
||||
|
||||
if str(pg) == '1':
|
||||
url = 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=all&page=%s' % pg
|
||||
else:
|
||||
# print('偏移',self.dynamic_offset)
|
||||
url = 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=all&offset=%s&page=%s' % (
|
||||
self.dynamic_offset, pg)
|
||||
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
self.dynamic_offset = jo['data'].get('offset')
|
||||
videos = []
|
||||
vodList = jo['data']['items']
|
||||
for vod in vodList:
|
||||
if vod['type'] == 'DYNAMIC_TYPE_AV':
|
||||
#up=vod['modules']["module_author"]['name']
|
||||
ivod = vod['modules']['module_dynamic']['major']['archive']
|
||||
aid = str(ivod['aid']).strip()
|
||||
title = ivod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = ivod['cover'].strip()
|
||||
#remark = str(ivod['duration_text']).strip()
|
||||
remark =str( self.second_to_time(self.str2sec(ivod['duration_text']))).strip()
|
||||
videos.append({
|
||||
"vod_id": aid+'&dynamic',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
|
||||
time_diff1={'1':[0,300],
|
||||
'2':[300,900],'3':[900,1800],'4':[1800,3600],
|
||||
'5':[3600,99999999999999999999999999999999]
|
||||
|
||||
}
|
||||
|
||||
time_diff='0'
|
||||
|
||||
|
||||
def get_fav_detail(self,pg,mlid,order):
|
||||
result = {}
|
||||
self.box_video_type = '收藏夹'
|
||||
|
||||
|
||||
|
||||
url = 'http://api.bilibili.com/x/v3/fav/resource/list?media_id=%s&order=%s&pn=%s&ps=20&platform=web&type=0'%(mlid,order,pg)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['medias']
|
||||
|
||||
for vod in vodList:
|
||||
#print(vod)
|
||||
#只展示类型为 视频的条目
|
||||
#过滤去掉收藏夹中的 已失效视频;如果不喜欢可以去掉这个 if条件
|
||||
if vod.get('type') in [2] and vod.get('title') != '已失效视频':
|
||||
|
||||
aid = str(vod['id']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = vod['cover'].strip()
|
||||
remark = str( self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid+'&fav',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
#videos=self.filter_duration(videos, duration_diff)
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
|
||||
return result
|
||||
|
||||
def get_fav(self,pg,order,extend):
|
||||
self.box_video_type = '收藏夹'
|
||||
|
||||
#获取自己的up_mid(也就是用户uid)
|
||||
|
||||
|
||||
mlid=''
|
||||
|
||||
fav_config=self.config["filter"].get('收藏夹')
|
||||
|
||||
#默认显示第一个收藏夹内容
|
||||
if fav_config:
|
||||
for i in fav_config:
|
||||
if i['key']=='mlid':
|
||||
if len(i['value'])>0:
|
||||
mlid=i['value'][0]['v']
|
||||
|
||||
|
||||
|
||||
|
||||
#print(self.config["filter"].get('收藏夹'))
|
||||
|
||||
if 'mlid' in extend:
|
||||
mlid = extend['mlid']
|
||||
if mlid:
|
||||
return self.get_fav_detail(pg=pg,mlid=mlid,order=order)
|
||||
else:
|
||||
return {}
|
||||
|
||||
|
||||
|
||||
def get_history(self,pg):
|
||||
result = {}
|
||||
self.box_video_type = '历史记录'
|
||||
url = 'http://api.bilibili.com/x/v2/history?pn=%s' % pg
|
||||
rsp = self.fetch(url,cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content) #解析api接口,转化成json数据对象
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']
|
||||
for vod in vodList:
|
||||
if vod['duration'] > 0: #筛选掉非视频的历史记录
|
||||
aid = str(vod["aid"]).strip() #获取 aid
|
||||
#获取标题
|
||||
title = vod["title"].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""",
|
||||
'"')
|
||||
#封面图片
|
||||
img = vod["pic"].strip()
|
||||
|
||||
#获取已观看时间
|
||||
if str(vod['progress'])=='-1':
|
||||
process=str(self.second_to_time(vod['duration'])).strip()
|
||||
else:
|
||||
process = str(self.second_to_time(vod['progress'])).strip()
|
||||
#获取视频总时长
|
||||
total_time= str(self.second_to_time(vod['duration'])).strip()
|
||||
#组合 已观看时间 / 总时长 ,赋值给 remark
|
||||
remark = process+' / '+total_time
|
||||
videos.append({
|
||||
"vod_id":aid+'&history',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
|
||||
def get_live(self,pg,parent_area_id):
|
||||
result = {}
|
||||
self.box_video_type = '直播'
|
||||
|
||||
|
||||
url = 'https://api.live.bilibili.com/room/v3/area/getRoomList?page=%s&sort_type=online&parent_area_id=%s'%(pg,parent_area_id)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
|
||||
for vod in vodList:
|
||||
|
||||
|
||||
|
||||
aid = str(vod['roomid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = vod.get('cover').strip()
|
||||
remark = '直播间人数:'+str( vod['online']).strip()
|
||||
videos.append({
|
||||
"vod_id": aid+'&live',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
#videos=self.filter_duration(videos, duration_diff)
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
|
||||
return result
|
||||
|
||||
|
||||
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
|
||||
result = {}
|
||||
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
|
||||
if tid == "热门":
|
||||
self.box_video_type = '热门'
|
||||
return self.get_hot(pg=pg)
|
||||
elif tid == "排行榜":
|
||||
self.box_video_type = '排行榜'
|
||||
return self.get_rank()
|
||||
elif tid == "收藏夹":
|
||||
self.box_video_type = '收藏夹'
|
||||
order = 'mtime'
|
||||
if 'order' in extend:
|
||||
order = extend['order']
|
||||
|
||||
return self.get_fav(pg=pg, order=order,extend=extend)
|
||||
|
||||
elif tid == '直播':
|
||||
self.box_video_type = '直播'
|
||||
parent_area_id = '0'
|
||||
if 'parent_area_id' in extend:
|
||||
parent_area_id = extend['parent_area_id']
|
||||
return self.get_live(pg=pg,parent_area_id=parent_area_id)
|
||||
|
||||
|
||||
|
||||
elif tid == '频道':
|
||||
self.box_video_type = '频道'
|
||||
|
||||
cid = '搞笑'
|
||||
if 'cid' in extend:
|
||||
cid = extend['cid']
|
||||
|
||||
duration_diff='0'
|
||||
if 'duration' in extend:
|
||||
duration_diff = extend['duration']
|
||||
|
||||
order = 'totalrank'
|
||||
if 'order' in extend:
|
||||
order = extend['order']
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return self.get_channel(pg=pg, cid=cid,extend=extend,order=order,duration_diff=duration_diff)
|
||||
|
||||
|
||||
elif tid == '动态':
|
||||
self.box_video_type = '动态'
|
||||
return self.get_dynamic(pg=pg)
|
||||
|
||||
elif tid == '历史记录':
|
||||
self.box_video_type = '历史记录'
|
||||
return self.get_history(pg=pg)
|
||||
elif tid.isdigit():
|
||||
self.box_video_type = '影视'
|
||||
url = 'https://api.bilibili.com/pgc/season/index/result?order=2&season_status=-1&style_id=-1&sort=0&area=-1&pagesize=20&type=1&st={0}&season_type={0}&page={1}'.format(
|
||||
tid, pg)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title'].strip()
|
||||
img = vod['cover'].strip()
|
||||
remark = vod['index_show'].strip()
|
||||
videos.append({
|
||||
"vod_id": aid+'&movie',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark # 视频part数量
|
||||
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
|
||||
|
||||
|
||||
else:
|
||||
duration_diff='0'
|
||||
if 'duration' in extend:
|
||||
duration_diff = extend['duration']
|
||||
|
||||
order = 'totalrank'
|
||||
if 'order' in extend:
|
||||
order = extend['order']
|
||||
|
||||
|
||||
|
||||
|
||||
self.box_video_type = '其他'
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&page={1}&duration={2}&order={3}'.format(
|
||||
tid, pg,duration_diff,order)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
|
||||
if jo.get('code') == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
#remark = str(vod['duration']).strip()
|
||||
remark =str( self.second_to_time(self.str2sec(vod['duration']))).strip()
|
||||
videos.append({
|
||||
"vod_id": aid+'&other',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
|
||||
})
|
||||
|
||||
|
||||
#videos=self.filter_duration(videos, duration_diff)
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def cleanSpace(self, str):
|
||||
return str.replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')
|
||||
|
||||
def detailContent(self, array):
|
||||
# if int(array[0])< 1000000:
|
||||
result={}
|
||||
arrays = array[0].split("&")
|
||||
if arrays[-1] == 'movie':
|
||||
self.box_video_type='影视'
|
||||
aid = arrays[0]
|
||||
url = "http://api.bilibili.com/pgc/view/web/season?season_id={0}".format(aid)
|
||||
rsp = self.fetch(url, headers=self.header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot['code'] == 0:
|
||||
jo = jRoot['result']
|
||||
id = jo['season_id']
|
||||
title = jo['title']
|
||||
pic = jo['cover']
|
||||
areas = jo['areas'][0]['name']
|
||||
typeName = jo['share_sub_title']
|
||||
dec = jo['evaluate']
|
||||
remark = jo['new_ep']['desc']
|
||||
vod = {
|
||||
"vod_id": id,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": "",
|
||||
# "vod_area":areas,
|
||||
"vod_area": self.vod_area, #弹幕是否显示的开关
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": "",
|
||||
"vod_director": "",
|
||||
"vod_content": dec
|
||||
}
|
||||
ja = jo['episodes']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
eid = tmpJo['id']
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['title'].replace("#", "-")
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part, eid, cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
|
||||
elif arrays[-1] == 'live':
|
||||
self.box_video_type='直播'
|
||||
aid = arrays[0]
|
||||
|
||||
|
||||
url = "https://api.live.bilibili.com/room/v1/Room/get_info?room_id=%s"%aid
|
||||
rsp = self.fetch(url, headers=self.header,cookies=self.cookies)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot.get('code')==0:
|
||||
jo = jRoot['data']
|
||||
title = jo['title'].replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
pic = jo.get("user_cover")
|
||||
desc = jo.get('description')
|
||||
|
||||
dire = self.get_live_userInfo(jo["uid"])
|
||||
typeName = jo.get("area_name")
|
||||
remark = '在线人数:'+str(jo['online']).strip()
|
||||
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": '(' + dire + ")" + title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
|
||||
"vod_area": self.vod_area,
|
||||
#"vod_area":"",
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": "直播间id-"+aid,
|
||||
"vod_director": dire,
|
||||
"vod_content": desc + '\n主播:' + dire,
|
||||
'vod_play_from':'B站',
|
||||
'vod_play_url':'flv线路原画$platform=web&quality=4_'+aid+'#flv线路高清$platform=web&quality=3_'+aid+'#h5线路原画$platform=h5&quality=4_'+aid+'#h5线路高清$platform=h5&quality=3_'+aid
|
||||
# 'vod_play_url':aid
|
||||
}
|
||||
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
|
||||
else :
|
||||
self.box_video_type='其他'
|
||||
aid = arrays[0]
|
||||
url = "https://api.bilibili.com/x/web-interface/view?aid={0}".format(aid)
|
||||
rsp = self.fetch(url, headers=self.header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot['code'] == 0:
|
||||
jo = jRoot['data']
|
||||
title = jo['title'].replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
pic = jo['pic']
|
||||
desc = jo['desc']
|
||||
timeStamp = jo['pubdate']
|
||||
timeArray = time.localtime(timeStamp)
|
||||
year = str(time.strftime("%Y", timeArray))
|
||||
dire = jo['owner']['name']
|
||||
typeName = jo['tname']
|
||||
remark = str(jo['duration']).strip()
|
||||
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": '(' + dire + ")" + title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": year,
|
||||
"vod_area": self.vod_area,
|
||||
# "vod_area":"",
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": '',
|
||||
|
||||
"vod_director": dire,
|
||||
"vod_content": desc + '\nup主:' + dire
|
||||
}
|
||||
ja = jo['pages']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['part'].replace("#", "-")
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part, aid, cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
self.box_video_type = '搜索'
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&page=1'.format(key)
|
||||
|
||||
rsp = self.fetch(url, cookies=self.cookies, headers=header)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] != 0:
|
||||
rspRetry = self.fetch(url, cookies=self.cookies, headers=header)
|
||||
content = rspRetry.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
remark = str(vod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id": aid+'&search',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
if self.box_video_type == '影视':
|
||||
ids = id.split("_")
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
url = 'https://api.bilibili.com/pgc/player/web/playurl?qn=116&ep_id={0}&cid={1}'.format(ids[0], ids[1])
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies, headers=header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot['message'] != 'success':
|
||||
print("需要大会员权限才能观看")
|
||||
return {}
|
||||
jo = jRoot['result']
|
||||
ja = jo['durl']
|
||||
maxSize = -1
|
||||
position = -1
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
self.box_video_type = '影视'
|
||||
|
||||
elif self.box_video_type == '直播':
|
||||
|
||||
ids = id.split("_")
|
||||
|
||||
|
||||
url = 'https://api.live.bilibili.com/room/v1/Room/playUrl?cid=%s&%s'%(ids[1],ids[0])
|
||||
|
||||
#raise Exception(url)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
jRoot = json.loads(rsp.text)
|
||||
|
||||
|
||||
if jRoot['code'] == 0:
|
||||
|
||||
|
||||
jo = jRoot['data']
|
||||
ja = jo['durl']
|
||||
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
|
||||
url = ja[0]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
# result['type'] ="m3u8"
|
||||
result["playUrl"] = ''
|
||||
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer": "https://live.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
|
||||
|
||||
self.box_video_type = '直播'
|
||||
if ids[0]=="h5":
|
||||
result["contentType"] = ''
|
||||
else:
|
||||
result["contentType"] = 'video/x-flv'
|
||||
|
||||
else:
|
||||
|
||||
ids = id.split("_")
|
||||
url = 'https://api.bilibili.com:443/x/player/playurl?avid={0}&cid={1}&qn=116'.format(ids[0], ids[1])
|
||||
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
ja = jo['durl']
|
||||
|
||||
maxSize = -1
|
||||
position = -1
|
||||
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
self.box_video_type = '其他'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {
|
||||
|
||||
|
||||
|
||||
"舞蹈": [{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "综合排序",
|
||||
"v": "totalrank"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最新发布",
|
||||
"v": "pubdate"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最多点击",
|
||||
"v": "click"
|
||||
},
|
||||
{
|
||||
"n": "最多收藏",
|
||||
"v": "stow"
|
||||
},
|
||||
|
||||
|
||||
|
||||
{
|
||||
"n": "最多弹幕",
|
||||
"v": "dm"
|
||||
},
|
||||
|
||||
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "duration",
|
||||
"name": "时长",
|
||||
"value": [{
|
||||
"n": "全部",
|
||||
"v": "0"
|
||||
},
|
||||
{
|
||||
"n": "60分钟以上",
|
||||
"v": "4"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "30~60分钟",
|
||||
"v": "3"
|
||||
},
|
||||
{
|
||||
"n": "5~30分钟",
|
||||
"v": "2"
|
||||
},
|
||||
{
|
||||
"n": "5分钟以下",
|
||||
"v": "1"
|
||||
}
|
||||
]
|
||||
}],
|
||||
|
||||
|
||||
|
||||
"少女": [{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "综合排序",
|
||||
"v": "totalrank"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最新发布",
|
||||
"v": "pubdate"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最多点击",
|
||||
"v": "click"
|
||||
},
|
||||
{
|
||||
"n": "最多收藏",
|
||||
"v": "stow"
|
||||
},
|
||||
|
||||
|
||||
|
||||
{
|
||||
"n": "最多弹幕",
|
||||
"v": "dm"
|
||||
},
|
||||
|
||||
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "duration",
|
||||
"name": "时长",
|
||||
"value": [{
|
||||
"n": "全部",
|
||||
"v": "0"
|
||||
},
|
||||
{
|
||||
"n": "60分钟以上",
|
||||
"v": "4"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "30~60分钟",
|
||||
"v": "3"
|
||||
},
|
||||
{
|
||||
"n": "5~30分钟",
|
||||
"v": "2"
|
||||
},
|
||||
{
|
||||
"n": "5分钟以下",
|
||||
"v": "1"
|
||||
}
|
||||
]
|
||||
}],
|
||||
|
||||
"mmd": [{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "综合排序",
|
||||
"v": "totalrank"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最新发布",
|
||||
"v": "pubdate"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最多点击",
|
||||
"v": "click"
|
||||
},
|
||||
{
|
||||
"n": "最多收藏",
|
||||
"v": "stow"
|
||||
},
|
||||
|
||||
|
||||
|
||||
{
|
||||
"n": "最多弹幕",
|
||||
"v": "dm"
|
||||
},
|
||||
|
||||
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "duration",
|
||||
"name": "时长",
|
||||
"value": [{
|
||||
"n": "全部",
|
||||
"v": "0"
|
||||
},
|
||||
{
|
||||
"n": "60分钟以上",
|
||||
"v": "4"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "30~60分钟",
|
||||
"v": "3"
|
||||
},
|
||||
{
|
||||
"n": "5~30分钟",
|
||||
"v": "2"
|
||||
},
|
||||
{
|
||||
"n": "5分钟以下",
|
||||
"v": "1"
|
||||
}
|
||||
]
|
||||
}],
|
||||
|
||||
"直播": [{
|
||||
"key": "parent_area_id",
|
||||
"name": "直播分区",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "全部分区",
|
||||
"v": "0"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "娱乐",
|
||||
"v": "1"
|
||||
},
|
||||
{
|
||||
"n": "电台",
|
||||
"v": "5"
|
||||
},
|
||||
{
|
||||
"n": "网游",
|
||||
"v": "2"
|
||||
},
|
||||
{
|
||||
"n": "手游",
|
||||
"v": "3"
|
||||
},
|
||||
|
||||
|
||||
|
||||
{
|
||||
"n": "单机游戏",
|
||||
"v": "6"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "虚拟主播",
|
||||
"v": "9"
|
||||
},{'n': '生活', 'v': 10},
|
||||
{'n': '知识', 'v': 11},
|
||||
{'n': '赛事', 'v': 13}
|
||||
|
||||
|
||||
|
||||
]
|
||||
},
|
||||
],
|
||||
|
||||
|
||||
"音声": [{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "综合排序",
|
||||
"v": "totalrank"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最新发布",
|
||||
"v": "pubdate"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最多点击",
|
||||
"v": "click"
|
||||
},
|
||||
{
|
||||
"n": "最多收藏",
|
||||
"v": "stow"
|
||||
},
|
||||
|
||||
|
||||
|
||||
{
|
||||
"n": "最多弹幕",
|
||||
"v": "dm"
|
||||
},
|
||||
|
||||
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "duration",
|
||||
"name": "时长",
|
||||
"value": [{
|
||||
"n": "全部",
|
||||
"v": "0"
|
||||
},
|
||||
{
|
||||
"n": "60分钟以上",
|
||||
"v": "4"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "30~60分钟",
|
||||
"v": "3"
|
||||
},
|
||||
{
|
||||
"n": "5~30分钟",
|
||||
"v": "2"
|
||||
},
|
||||
{
|
||||
"n": "5分钟以下",
|
||||
"v": "1"
|
||||
}
|
||||
]
|
||||
}],
|
||||
|
||||
"收藏夹": [{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "收藏时间",
|
||||
"v": "mtime"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "播放量",
|
||||
"v": "view"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "投稿时间",
|
||||
"v": "pubtime"
|
||||
}
|
||||
|
||||
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "mlid",
|
||||
"name": "收藏夹分区",
|
||||
"value": [
|
||||
]
|
||||
}],
|
||||
"cosplay": [{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "综合排序",
|
||||
"v": "totalrank"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最新发布",
|
||||
"v": "pubdate"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最多点击",
|
||||
"v": "click"
|
||||
},
|
||||
{
|
||||
"n": "最多收藏",
|
||||
"v": "stow"
|
||||
},
|
||||
|
||||
|
||||
|
||||
{
|
||||
"n": "最多弹幕",
|
||||
"v": "dm"
|
||||
},
|
||||
|
||||
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "duration",
|
||||
"name": "时长",
|
||||
"value": [{
|
||||
"n": "全部",
|
||||
"v": "0"
|
||||
},
|
||||
{
|
||||
"n": "60分钟以上",
|
||||
"v": "4"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "30~60分钟",
|
||||
"v": "3"
|
||||
},
|
||||
{
|
||||
"n": "5~30分钟",
|
||||
"v": "2"
|
||||
},
|
||||
{
|
||||
"n": "5分钟以下",
|
||||
"v": "1"
|
||||
}
|
||||
]
|
||||
}],
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
"频道": [{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "综合排序",
|
||||
"v": "totalrank"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最新发布",
|
||||
"v": "pubdate"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最多点击",
|
||||
"v": "click"
|
||||
},
|
||||
{
|
||||
"n": "最多收藏",
|
||||
"v": "stow"
|
||||
},
|
||||
|
||||
|
||||
|
||||
{
|
||||
"n": "最多弹幕",
|
||||
"v": "dm"
|
||||
},
|
||||
|
||||
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "duration",
|
||||
"name": "时长",
|
||||
"value": [{
|
||||
"n": "全部",
|
||||
"v": "0"
|
||||
},
|
||||
{
|
||||
"n": "60分钟以上",
|
||||
"v": "4"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "30~60分钟",
|
||||
"v": "3"
|
||||
},
|
||||
{
|
||||
"n": "5~30分钟",
|
||||
"v": "2"
|
||||
},
|
||||
{
|
||||
"n": "5分钟以下",
|
||||
"v": "1"
|
||||
}
|
||||
]
|
||||
}, {"key": "cid", "name": "分类",
|
||||
"value":[{'n': '搞笑', 'v': '搞笑'}, {'n': '美食', 'v': '美食'}, {'n': '鬼畜', 'v': '鬼畜'}, {'n': '美妆', 'v': '美妆'}, {'n': 'mmd', 'v': 'mmd'}, {'n': '科普', 'v': '科普'}, {'n': 'COSPLAY', 'v': 'COSPLAY'}, {'n': '漫展', 'v': '漫展'}, {'n': 'MAD', 'v': 'MAD'}, {'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': '公开课'}, {'n': '演讲', 'v': '演讲'}, {'n': 'PS教程', 'v': 'PS教程'}, {'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': 'A.I.Channel', 'v': 'A.I.Channel'}, {'n': '虚拟UP主', 'v': '虚拟UP主'}, {'n': '神楽めあ', 'v': '神楽めあ'}, {'n': '白上吹雪', 'v': '白上吹雪'}, {'n': '婺源', 'v': '婺源'}, {'n': 'hololive', 'v': 'hololive'}, {'n': 'EXO', 'v': 'EXO'}, {'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': 'vlog', 'v': 'vlog'}, {'n': 'DIY', 'v': 'DIY'}, {'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': '孟鹤堂'}, {'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': '战斗机'}]
|
||||
}
|
||||
],
|
||||
}
|
||||
}
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
|
||||
def localProxy(self, param):
|
||||
|
||||
|
||||
return [200, "video/MP2T", action, ""]
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
a=Spider()
|
||||
|
||||
|
||||
print(a.categoryContent('5','1',filter={},extend='1'))
|
||||
|
||||
|
||||
#print(a.get_live(pg=1,parent_area_id='0'))
|
||||
|
||||
a.box_video_type='直播'
|
||||
print(a.get_hot(pg=1))
|
||||
print(a.detailContent(['43000&movie']))
|
||||
|
||||
|
||||
print(a.playerContent('flag', 'flv线路$web_43000#h5线路$h5_43000', 'vipFlags'))
|
||||
|
||||
|
||||
|
||||
#print(a.get_fav(pg='1',order='mtime',extend={}))
|
||||
|
||||
@@ -1,875 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import requests
|
||||
from requests import session, utils
|
||||
import time
|
||||
import base64
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
|
||||
def getName(self):
|
||||
return "哔哩哔哩"
|
||||
|
||||
# 主页
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"动态": "动态",
|
||||
"热门": "热门",
|
||||
"推荐": "推荐",
|
||||
"历史记录": "历史记录",
|
||||
# "稍后再看":"稍后再看", #意义不大,隐藏该项
|
||||
"收藏": "收藏",
|
||||
"动画": "1",
|
||||
"音乐": "3",
|
||||
"舞蹈": "129",
|
||||
"游戏": "4",
|
||||
"鬼畜": "119",
|
||||
"知识": "36",
|
||||
"科技": "188",
|
||||
"运动": "234",
|
||||
"生活": "160",
|
||||
"美食": "211",
|
||||
"动物": "217",
|
||||
"汽车": "223",
|
||||
"时尚": "155",
|
||||
"娱乐": "5",
|
||||
"影视": "181",
|
||||
"每周必看": "每周必看",
|
||||
"入站必刷": "入站必刷",
|
||||
"频道": "频道",
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
# 用户cookies
|
||||
cookies = ''
|
||||
userid = ''
|
||||
csrf = ''
|
||||
|
||||
def getCookie(self):
|
||||
import http.cookies
|
||||
# ----↓↓↓↓↓↓↓----在下方raw_cookie_line后的双引号内填写----↓↓↓↓↓↓↓----
|
||||
raw_cookie_line = ""
|
||||
simple_cookie = http.cookies.SimpleCookie(raw_cookie_line)
|
||||
cookie_jar = requests.cookies.RequestsCookieJar()
|
||||
cookie_jar.update(simple_cookie)
|
||||
rsp = session()
|
||||
rsp.cookies = cookie_jar
|
||||
content = self.fetch("http://api.bilibili.com/x/web-interface/nav", cookies=rsp.cookies)
|
||||
res = json.loads(content.text)
|
||||
if res["code"] == 0:
|
||||
self.cookies = rsp.cookies
|
||||
self.userid = res["data"].get('mid')
|
||||
self.csrf = rsp.cookies['bili_jct']
|
||||
return cookie_jar
|
||||
|
||||
def __init__(self):
|
||||
self.getCookie()
|
||||
url = 'https://api.bilibili.com/x/v3/fav/folder/created/list-all?up_mid=%s&jsonp=jsonp' % self.userid
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
fav_list = []
|
||||
if jo['code'] == 0:
|
||||
for fav in jo['data'].get('list'):
|
||||
fav_dict = {
|
||||
'n': fav['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""",
|
||||
'"').strip(),
|
||||
'v': fav['id']}
|
||||
fav_list.append(fav_dict)
|
||||
if self.config["filter"].get('收藏'):
|
||||
for i in self.config["filter"].get('收藏'):
|
||||
if i['key'] == 'mlid':
|
||||
i['value'] = fav_list
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def post_history(self, aid, cid):
|
||||
url = 'http://api.bilibili.com/x/v2/history/report?aid={0}&cid={1}&csrf={2}'.format(aid, cid, self.csrf)
|
||||
requests.post(url=url, cookies=self.cookies)
|
||||
|
||||
# 将超过10000的数字换成成以万和亿为单位
|
||||
def zh(self, num):
|
||||
if int(num) >= 100000000:
|
||||
p = round(float(num) / float(100000000), 1)
|
||||
p = str(p) + '亿'
|
||||
else:
|
||||
if int(num) >= 10000:
|
||||
p = round(float(num) / float(10000), 1)
|
||||
p = str(p) + '万'
|
||||
else:
|
||||
p = str(num)
|
||||
return p
|
||||
|
||||
# 将秒数转化为 时分秒的格式
|
||||
def second_to_time(self, a):
|
||||
if a < 3600:
|
||||
return time.strftime("%M:%S", time.gmtime(a))
|
||||
else:
|
||||
return time.strftime("%H:%M:%S", time.gmtime(a))
|
||||
|
||||
# 字符串时分秒以及分秒形式转换成秒
|
||||
def str2sec(self, x):
|
||||
x = str(x)
|
||||
try:
|
||||
h, m, s = x.strip().split(':') # .split()函数将其通过':'分隔开,.strip()函数用来除去空格
|
||||
return int(h) * 3600 + int(m) * 60 + int(s) # int()函数转换成整数运算
|
||||
except:
|
||||
m, s = x.strip().split(':') # .split()函数将其通过':'分隔开,.strip()函数用来除去空格
|
||||
return int(m) * 60 + int(s) # int()函数转换成整数运算
|
||||
|
||||
# 按时间过滤
|
||||
def filter_duration(self, vodlist, key):
|
||||
if key == '0':
|
||||
return vodlist
|
||||
else:
|
||||
vod_list_new = [i for i in vodlist if
|
||||
self.time_diff1[key][0] <= self.str2sec(str(i["vod_remarks"])) < self.time_diff1[key][1]]
|
||||
return vod_list_new
|
||||
|
||||
time_diff1 = {'1': [0, 300],
|
||||
'2': [300, 900], '3': [900, 1800], '4': [1800, 3600],
|
||||
'5': [3600, 99999999999999999999999999999999]
|
||||
}
|
||||
time_diff = '0'
|
||||
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all'
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list'][0:50]
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['pic'].strip()
|
||||
remark = "观看:" + self.zh(vod['stat']['view']) + " " + str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
dynamic_offset = ''
|
||||
|
||||
def get_dynamic(self, pg):
|
||||
result = {}
|
||||
if str(pg) == '1':
|
||||
url = 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=all&page=%s' % pg
|
||||
else:
|
||||
# print('偏移',self.dynamic_offset)
|
||||
url = 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=all&offset=%s&page=%s' % (self.dynamic_offset, pg)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
self.dynamic_offset = jo['data'].get('offset')
|
||||
videos = []
|
||||
vodList = jo['data']['items']
|
||||
for vod in vodList:
|
||||
if vod['type'] == 'DYNAMIC_TYPE_AV':
|
||||
up = vod['modules']["module_author"]['name']
|
||||
ivod = vod['modules']['module_dynamic']['major']['archive']
|
||||
aid = str(ivod['aid']).strip()
|
||||
title = ivod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = ivod['cover'].strip()
|
||||
# remark = str(ivod['duration_text']).strip()
|
||||
remark = str(self.second_to_time(self.str2sec(ivod['duration_text']))).strip() + ' ' + str(
|
||||
up).strip() # 显示分钟数+up主名字
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_hot(self, pg):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/popular?ps=10&pn={0}'.format(pg)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list'][0:50]
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['pic'].strip()
|
||||
remark = "观看:" + self.zh(vod['stat']['view']) + " " + str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_rcmd(self, pg):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/index/top/feed/rcmd?y_num={0}&fresh_type=3&feed_version=SEO_VIDEO&fresh_idx_1h=1&fetch_row=1&fresh_idx=1&brush=0&homepage_ver=1&ps=10'.format(
|
||||
pg)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['item']
|
||||
for vod in vodList:
|
||||
if vod['duration'] > 0:
|
||||
aid = str(vod['id']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['pic'].strip()
|
||||
remark = "观看:" + self.zh(vod['stat']['view']) + " " + str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_rank(self):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all'
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list'][0:50]
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['pic'].strip()
|
||||
remark = "观看:" + self.zh(vod['stat']['view']) + " " + str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_history(self, pg):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/v2/history?pn=%s&ps=10' % pg
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content) # 解析api接口,转化成json数据对象
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']
|
||||
for vod in vodList:
|
||||
if vod['duration'] > 0: # 筛选掉非视频的历史记录
|
||||
aid = str(vod["aid"]).strip()
|
||||
title = vod["title"].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""",
|
||||
'"')
|
||||
img = vod["pic"].strip()
|
||||
# 获取已观看时间
|
||||
if str(vod['progress']) == '-1':
|
||||
process = str(self.second_to_time(vod['duration'])).strip()
|
||||
else:
|
||||
process = str(self.second_to_time(vod['progress'])).strip()
|
||||
# 获取视频总时长
|
||||
total_time = str(self.second_to_time(vod['duration'])).strip()
|
||||
# 组合 已观看时间 / 总时长 ,赋值给 remark
|
||||
remark = process + ' / ' + total_time
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_fav(self, pg, order, extend):
|
||||
mlid = ''
|
||||
fav_config = self.config["filter"].get('收藏')
|
||||
# 默认显示第一个收藏内容
|
||||
if fav_config:
|
||||
for i in fav_config:
|
||||
if i['key'] == 'mlid':
|
||||
if len(i['value']) > 0:
|
||||
mlid = i['value'][0]['v']
|
||||
# print(self.config["filter"].get('收藏'))
|
||||
if 'mlid' in extend:
|
||||
mlid = extend['mlid']
|
||||
if mlid:
|
||||
return self.get_fav_detail(pg=pg, mlid=mlid, order=order)
|
||||
else:
|
||||
return {}
|
||||
|
||||
def get_fav_detail(self, pg, mlid, order):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/v3/fav/resource/list?media_id=%s&order=%s&pn=%s&ps=10&platform=web&type=0' % (mlid, order, pg)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['medias']
|
||||
for vod in vodList:
|
||||
# print(vod)
|
||||
# 只展示类型为 视频的条目
|
||||
# 过滤去掉收藏中的 已失效视频;如果不喜欢可以去掉这个 if条件
|
||||
if vod.get('type') in [2] and vod.get('title') != '已失效视频':
|
||||
aid = str(vod['id']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""",
|
||||
'"')
|
||||
img = vod['cover'].strip()
|
||||
remark = "观看:" + self.zh(vod['cnt_info']['play']) + " " + str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
# videos=self.filter_duration(videos, duration_diff)
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_zone(self, tid):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/ranking/v2?rid={0}&type=all'.format(tid)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list'][0:50]
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['pic'].strip()
|
||||
remark = "观看:" + self.zh(vod['stat']['view']) + " " + str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_weekly(self):
|
||||
result = {}
|
||||
url1 = 'https://api.bilibili.com/x/web-interface/popular/series/list'
|
||||
rsp1 = self.fetch(url1, cookies=self.cookies)
|
||||
content1 = rsp1.text
|
||||
jo1 = json.loads(content1)
|
||||
number = jo1['data']['list'][0]['number']
|
||||
url = 'https://api.bilibili.com/x/web-interface/popular/series/one?number=' + str(number)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip()
|
||||
img = vod['pic'].strip()
|
||||
remark = "观看:" + self.zh(vod['stat']['view']) + " " + str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_must_watch(self):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/popular/precious?page_size=100&page=1'
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip()
|
||||
img = vod['pic'].strip()
|
||||
remark = "观看:" + self.zh(vod['stat']['view']) + " " + str(self.second_to_time(vod['duration'])).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_toview(self, pg):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/v2/history/toview'
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content) # 解析api接口,转化成json数据对象
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
if vod['duration'] > 0:
|
||||
aid = str(vod["aid"]).strip()
|
||||
title = vod["title"].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""",
|
||||
'"')
|
||||
img = vod["pic"].strip()
|
||||
if str(vod['progress']) == '-1':
|
||||
process = str(self.second_to_time(vod['duration'])).strip()
|
||||
else:
|
||||
process = str(self.second_to_time(vod['progress'])).strip()
|
||||
# 获取视频总时长
|
||||
total_time = str(self.second_to_time(vod['duration'])).strip()
|
||||
# 组合 已观看时间 / 总时长 ,赋值给 remark
|
||||
remark = process + ' / ' + total_time
|
||||
videos.append({
|
||||
"vod_id": aid + '&toview',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
chanel_offset = ''
|
||||
|
||||
def get_channel(self, pg, cid, extend, order, duration_diff):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&page={1}&duration={2}&order={3}&page_size=10'.format(
|
||||
cid, pg, duration_diff, order)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo.get('code') == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
remark = "观看:" + self.zh(vod['play']) + " " + str(self.second_to_time(self.str2sec(vod['duration']))).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
# videos=self.filter_duration(videos, duration_diff)
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
if tid == "动态":
|
||||
return self.get_dynamic(pg=pg)
|
||||
elif tid == "热门":
|
||||
return self.get_hot(pg=pg)
|
||||
elif tid == '推荐':
|
||||
return self.get_rcmd(pg=pg)
|
||||
elif tid == '历史记录':
|
||||
return self.get_history(pg=pg)
|
||||
elif tid == "每周必看":
|
||||
return self.get_weekly()
|
||||
elif tid == "入站必刷":
|
||||
return self.get_must_watch()
|
||||
elif tid == '稍后再看':
|
||||
return self.get_toview(pg=pg)
|
||||
elif tid in ("1", "3", "129", "4", "119", "36", "188", "234", "160", "211", "217", "223", "155", "5", "181"):
|
||||
return self.get_zone(tid=tid)
|
||||
|
||||
elif tid == "收藏":
|
||||
order = 'mtime'
|
||||
if 'order' in extend:
|
||||
order = extend['order']
|
||||
return self.get_fav(pg=pg, order=order, extend=extend)
|
||||
|
||||
elif tid == '频道':
|
||||
cid = '搞笑'
|
||||
if 'cid' in extend:
|
||||
cid = extend['cid']
|
||||
duration_diff = '0'
|
||||
if 'duration' in extend:
|
||||
duration_diff = extend['duration']
|
||||
order = 'totalrank'
|
||||
if 'order' in extend:
|
||||
order = extend['order']
|
||||
return self.get_channel(pg=pg, cid=cid, extend=extend, order=order, duration_diff=duration_diff)
|
||||
|
||||
else:
|
||||
duration_diff = '0'
|
||||
if 'duration' in extend:
|
||||
duration_diff = extend['duration']
|
||||
order = 'totalrank'
|
||||
if 'order' in extend:
|
||||
order = extend['order']
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&page={1}&duration={2}&order={3}&page_size=10'.format(
|
||||
tid, pg, duration_diff, order)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo.get('code') == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""",
|
||||
'"')
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
# remark = str(vod['duration']).strip()
|
||||
remark = "观看:" + self.zh(vod['play']) + " " + str(self.second_to_time(self.str2sec(vod['duration']))).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
# videos=self.filter_duration(videos, duration_diff)
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def cleanSpace(self, str):
|
||||
return str.replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')
|
||||
|
||||
def detailContent(self, array):
|
||||
aid = array[0]
|
||||
url = "https://api.bilibili.com/x/web-interface/view?aid={0}".format(aid)
|
||||
rsp = self.fetch(url, headers=self.header, cookies=self.cookies)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
title = jo['title'].replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
pic = jo['pic']
|
||||
desc = jo['desc']
|
||||
typeName = jo['tname']
|
||||
date = time.strftime("%Y%m%d", time.localtime(jo['pubdate'])) # 投稿时间本地年月日表示
|
||||
stat = jo['stat']
|
||||
# 演员项展示视频状态,包括以下内容:
|
||||
status = "播放: " + self.zh(stat['view']) + " 弹幕: " + self.zh(stat['danmaku']) + " 点赞: " + self.zh(stat['like']) + " 收藏: " + self.zh(stat['favorite']) + " 投币: " + self.zh(stat['coin'])
|
||||
remark = str(jo['duration']).strip()
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": '[' + jo['owner']['name'] + "]" + title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": date,
|
||||
"vod_area": "bilidanmu",
|
||||
"vod_remarks": remark, # 不会显示
|
||||
'vod_tags': 'mv', # 不会显示
|
||||
"vod_actor": status,
|
||||
"vod_director": jo['owner']['name'],
|
||||
"vod_content": desc
|
||||
}
|
||||
ja = jo['pages']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['part'].replace("#", "-")
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part, aid, cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&page=1'.format(key)
|
||||
|
||||
rsp = self.fetch(url, cookies=self.cookies, headers=self.header)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] != 0:
|
||||
rspRetry = self.fetch(url, cookies=self.cookies, headers=self.header)
|
||||
content = rspRetry.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"') + '[' + key + ']'
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
remark = str(self.second_to_time(self.str2sec(vod['duration']))).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
ids = id.split("_")
|
||||
if len(ids) < 2:
|
||||
return result
|
||||
url = 'https://api.bilibili.com:443/x/player/playurl?avid={0}&cid={1}&qn=116'.format(ids[0], ids[1])
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
self.post_history(ids[0], ids[1]) # 回传播放历史记录
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
ja = jo['durl']
|
||||
maxSize = -1
|
||||
position = -1
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {
|
||||
|
||||
"收藏": [{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "收藏时间",
|
||||
"v": "mtime"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "播放量",
|
||||
"v": "view"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "投稿时间",
|
||||
"v": "pubtime"
|
||||
}
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "mlid",
|
||||
"name": "收藏分区",
|
||||
"value": [
|
||||
]
|
||||
}],
|
||||
|
||||
"频道": [{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "综合排序",
|
||||
"v": "totalrank"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最新发布",
|
||||
"v": "pubdate"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最多点击",
|
||||
"v": "click"
|
||||
},
|
||||
{
|
||||
"n": "最多收藏",
|
||||
"v": "stow"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最多弹幕",
|
||||
"v": "dm"
|
||||
},
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "duration",
|
||||
"name": "时长",
|
||||
"value": [{
|
||||
"n": "全部",
|
||||
"v": "0"
|
||||
},
|
||||
{
|
||||
"n": "60分钟以上",
|
||||
"v": "4"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "30~60分钟",
|
||||
"v": "3"
|
||||
},
|
||||
{
|
||||
"n": "5~30分钟",
|
||||
"v": "2"
|
||||
},
|
||||
{
|
||||
"n": "5分钟以下",
|
||||
"v": "1"
|
||||
}
|
||||
]
|
||||
}, {"key": "cid", "name": "分类",
|
||||
"value": [{'n': '搞笑', 'v': '搞笑'}, {'n': '美食', 'v': '美食'}, {'n': '鬼畜', 'v': '鬼畜'},
|
||||
{'n': '美妆', 'v': '美妆'}, {'n': 'mmd', 'v': 'mmd'}, {'n': '科普', 'v': '科普'},
|
||||
{'n': 'COSPLAY', 'v': 'COSPLAY'}, {'n': '漫展', 'v': '漫展'}, {'n': 'MAD', 'v': 'MAD'},
|
||||
{'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': '公开课'},
|
||||
{'n': '演讲', 'v': '演讲'}, {'n': 'PS教程', 'v': 'PS教程'}, {'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': 'A.I.Channel', 'v': 'A.I.Channel'}, {'n': '虚拟UP主', 'v': '虚拟UP主'},
|
||||
{'n': '神楽めあ', 'v': '神楽めあ'}, {'n': '白上吹雪', 'v': '白上吹雪'}, {'n': '婺源', 'v': '婺源'},
|
||||
{'n': 'hololive', 'v': 'hololive'}, {'n': 'EXO', 'v': 'EXO'},
|
||||
{'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': 'vlog', 'v': 'vlog'},
|
||||
{'n': 'DIY', 'v': 'DIY'}, {'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': '孟鹤堂'}, {'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': '战斗机'}]
|
||||
}
|
||||
],
|
||||
}
|
||||
}
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
|
||||
def localProxy(self, param):
|
||||
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,214 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
from requests import session, utils
|
||||
import os
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "B站影视"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"番剧": "1",
|
||||
"国创": "4",
|
||||
"电影": "2",
|
||||
"综艺": "7",
|
||||
"电视剧": "5",
|
||||
"纪录片": "3"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
cookies = ''
|
||||
def getCookie(self):
|
||||
#在cookies_str中填入会员或大会员cookie,以获得更好的体验
|
||||
cookies_str = "innersign=0; buvid3=606BE156-AE37-AEA8-7052-9DA0B21766E776404infoc; b_nut=1663302976; i-wanna-go-back=-1; b_ut=7; b_lsid=4106252F6_18344933A90; _uuid=586AAEB7-6B88-A691-F7AC-95C27E57F53C43036infoc; buvid4=B6FF1449-4361-1C76-DEFC-4AFCA1777B7E78304-022091612-PdJr0jKE6N5TamfAEX9uACD1RXvklspbNdlcIQEFLMu0d9wS3G3sdA%3D%3D; buvid_fp=2a9b54d5e06aa54293dc7544e000552d"
|
||||
cookies_dic = dict([co.strip().split('=') for co in cookies_str.split(';')])
|
||||
rsp = session()
|
||||
cookies_jar = utils.cookiejar_from_dict(cookies_dic)
|
||||
rsp.cookies = cookies_jar
|
||||
content = self.fetch("http://api.bilibili.com/x/web-interface/nav", cookies=rsp.cookies)
|
||||
res = json.loads(content.text)
|
||||
if res["code"] == 0:
|
||||
self.cookies = rsp.cookies
|
||||
else:
|
||||
rsp = self.fetch("https://www.bilibili.com/")
|
||||
self.cookies = rsp.cookies
|
||||
return rsp.cookies
|
||||
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/pgc/season/index/result?order=2&season_status=-1&style_id=-1&sort=0&area=-1&pagesize=20&type=1&st={0}&season_type={0}&page={1}'.format(tid,pg)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title'].strip()
|
||||
img = vod['cover'].strip()
|
||||
remark = vod['index_show'].strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def cleanSpace(self,str):
|
||||
return str.replace('\n','').replace('\t','').replace('\r','').replace(' ','')
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "http://api.bilibili.com/pgc/view/web/season?season_id={0}".format(aid)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['result']
|
||||
id = jo['season_id']
|
||||
title = jo['title']
|
||||
pic = jo['cover']
|
||||
areas = jo['areas'][0]['name']
|
||||
typeName = jo['share_sub_title']
|
||||
dec = jo['evaluate']
|
||||
remark = jo['new_ep']['desc']
|
||||
vod = {
|
||||
"vod_id":id,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":typeName,
|
||||
"vod_year":"",
|
||||
"vod_area":areas,
|
||||
"vod_remarks":remark,
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":dec
|
||||
}
|
||||
ja = jo['episodes']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
eid = tmpJo['id']
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['title'].replace("#", "-")
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part, eid, cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站影视'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=media_bangumi&keyword={0}'.format(key) # 番剧搜索
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
rs = jo['data']
|
||||
if rs['numResults'] == 0:
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=media_ft&keyword={0}'.format(key) # 影视搜索
|
||||
rspRetry = self.fetch(url, cookies=self.cookies)
|
||||
content = rspRetry.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['eps'][0]['cover'].strip()
|
||||
remark = vod['index_show']
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
ids = id.split("_")
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
url = 'https://api.bilibili.com/pgc/player/web/playurl?qn=116&ep_id={0}&cid={1}'.format(ids[0],ids[1])
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url,cookies=self.cookies,headers=header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot['message'] != 'success':
|
||||
print("需要大会员权限才能观看")
|
||||
return {}
|
||||
jo = jRoot['result']
|
||||
ja = jo['durl']
|
||||
maxSize = -1
|
||||
position = -1
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer":"https://www.bilibili.com",
|
||||
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,214 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
from requests import session, utils
|
||||
import os
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "B站影视"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"番剧": "1",
|
||||
"国创": "4",
|
||||
"电影": "2",
|
||||
"综艺": "7",
|
||||
"电视剧": "5",
|
||||
"纪录片": "3"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
cookies = ''
|
||||
def getCookie(self):
|
||||
#在cookies_str中填入会员或大会员cookie,以获得更好的体验
|
||||
cookies_str = "innersign=0; buvid3=606BE156-AE37-AEA8-7052-9DA0B21766E776404infoc; b_nut=1663302976; i-wanna-go-back=-1; b_ut=7; b_lsid=4106252F6_18344933A90; _uuid=586AAEB7-6B88-A691-F7AC-95C27E57F53C43036infoc; buvid4=B6FF1449-4361-1C76-DEFC-4AFCA1777B7E78304-022091612-PdJr0jKE6N5TamfAEX9uACD1RXvklspbNdlcIQEFLMu0d9wS3G3sdA%3D%3D; buvid_fp=2a9b54d5e06aa54293dc7544e000552d"
|
||||
cookies_dic = dict([co.strip().split('=') for co in cookies_str.split(';')])
|
||||
rsp = session()
|
||||
cookies_jar = utils.cookiejar_from_dict(cookies_dic)
|
||||
rsp.cookies = cookies_jar
|
||||
content = self.fetch("http://api.bilibili.com/x/web-interface/nav", cookies=rsp.cookies)
|
||||
res = json.loads(content.text)
|
||||
if res["code"] == 0:
|
||||
self.cookies = rsp.cookies
|
||||
else:
|
||||
rsp = self.fetch("https://www.bilibili.com/")
|
||||
self.cookies = rsp.cookies
|
||||
return rsp.cookies
|
||||
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/pgc/season/index/result?order=2&season_status=-1&style_id=-1&sort=0&area=-1&pagesize=20&type=1&st={0}&season_type={0}&page={1}'.format(tid,pg)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title'].strip()
|
||||
img = vod['cover'].strip()
|
||||
remark = vod['index_show'].strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def cleanSpace(self,str):
|
||||
return str.replace('\n','').replace('\t','').replace('\r','').replace(' ','')
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "http://api.bilibili.com/pgc/view/web/season?season_id={0}".format(aid)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['result']
|
||||
id = jo['season_id']
|
||||
title = jo['title']
|
||||
pic = jo['cover']
|
||||
areas = jo['areas'][0]['name']
|
||||
typeName = jo['share_sub_title']
|
||||
dec = jo['evaluate']
|
||||
remark = jo['new_ep']['desc']
|
||||
vod = {
|
||||
"vod_id":id,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":typeName,
|
||||
"vod_year":"",
|
||||
"vod_area":areas,
|
||||
"vod_remarks":remark,
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":dec
|
||||
}
|
||||
ja = jo['episodes']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
eid = tmpJo['id']
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['title'].replace("#", "-")
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part, eid, cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站影视'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=media_bangumi&keyword={0}'.format(key) # 番剧搜索
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
rs = jo['data']
|
||||
if rs['numResults'] == 0:
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=media_ft&keyword={0}'.format(key) # 影视搜索
|
||||
rspRetry = self.fetch(url, cookies=self.cookies)
|
||||
content = rspRetry.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['eps'][0]['cover'].strip()
|
||||
remark = vod['index_show']
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
ids = id.split("_")
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
url = 'https://api.bilibili.com/pgc/player/web/playurl?qn=116&ep_id={0}&cid={1}'.format(ids[0],ids[1])
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url,cookies=self.cookies,headers=header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot['message'] != 'success':
|
||||
print("需要大会员权限才能观看")
|
||||
return {}
|
||||
jo = jRoot['result']
|
||||
ja = jo['durl']
|
||||
maxSize = -1
|
||||
position = -1
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer":"https://www.bilibili.com",
|
||||
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,216 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
from requests import session, utils
|
||||
import os
|
||||
import time
|
||||
import base64
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
box_video_type = ''
|
||||
|
||||
def getDependence(self):
|
||||
return ['py_bilibili']
|
||||
|
||||
def getName(self):
|
||||
return "我的哔哩"
|
||||
|
||||
def init(self, extend=""):
|
||||
self.bilibili = extend[0]
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
# ————————以下可自定义关键词,结果以搜索方式展示————————
|
||||
"宅舞": "宅舞",
|
||||
"cosplay": "cosplay",
|
||||
"周杰伦": "周杰伦",
|
||||
"狗狗": "汪星人",
|
||||
"猫咪": "喵星人",
|
||||
"请自定义关键词": "美女",
|
||||
# ————————以下可自定义UP主,冒号后须填写UID————————
|
||||
"徐云流浪中国": "697166795",
|
||||
# "虫哥说电影": "29296192",
|
||||
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
filters = {}
|
||||
for lk in cateManual:
|
||||
if not cateManual[lk].isdigit():
|
||||
link = cateManual[lk]
|
||||
filters.update({
|
||||
link: [{"key": "order", "name": "排序",
|
||||
"value": [{"n": "综合排序", "v": "totalrank"}, {"n": "最新发布", "v": "pubdate"},
|
||||
{"n": "最多点击", "v": "click"}, {"n": "最多收藏", "v": "stow"},
|
||||
{"n": "最多弹幕", "v": "dm"}, ]},
|
||||
{"key": "duration", "name": "时长",
|
||||
"value": [{"n": "全部", "v": "0"}, {"n": "60分钟以上", "v": "4"},
|
||||
{"n": "30~60分钟", "v": "3"}, {"n": "5~30分钟", "v": "2"},
|
||||
{"n": "5分钟以下", "v": "1"}]}]
|
||||
})
|
||||
result['filters'] = filters
|
||||
return result
|
||||
|
||||
# 用户cookies,请在py_bilibili里填写,此处不用改
|
||||
cookies = ''
|
||||
|
||||
def getCookie(self):
|
||||
self.cookies = self.bilibili.getCookie()
|
||||
return self.cookies
|
||||
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def get_up_videos(self, tid, pg):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/space/arc/search?mid={0}&pn={1}&ps=10'.format(tid, pg)
|
||||
rsp = self.fetch(url, headers=self.header, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']['vlist']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['pic'].strip()
|
||||
remark = "观看:" + self.bilibili.zh(vod['play']) + " " + str(vod['length']).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
self.box_video_type = "分区"
|
||||
if tid.isdigit():
|
||||
return self.get_up_videos(tid, pg)
|
||||
else:
|
||||
result = self.bilibili.categoryContent(tid, pg, filter, extend)
|
||||
return result
|
||||
|
||||
def cleanSpace(self, str):
|
||||
return str.replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')
|
||||
|
||||
def detailContent(self, array):
|
||||
if self.box_video_type == "搜索":
|
||||
mid = array[0]
|
||||
# 获取UP主视频列表,ps后面为视频数量,默认为20,加快加载速度
|
||||
url = 'https://api.bilibili.com/x/space/arc/search?mid={0}&pn=1&ps=20'.format(mid)
|
||||
rsp = self.fetch(url, headers=self.header)
|
||||
content = rsp.text
|
||||
jRoot = json.loads(content)
|
||||
jo = jRoot['data']['list']['vlist']
|
||||
|
||||
url2 = "https://api.bilibili.com/x/web-interface/card?mid={0}".format(mid)
|
||||
rsp2 = self.fetch(url2, headers=self.header)
|
||||
jRoot2 = json.loads(rsp2.text)
|
||||
jo2 = jRoot2['data']['card']
|
||||
name = jo2['name'].replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
pic = jo2['face']
|
||||
desc = jo2['Official']['desc'] + " " + jo2['Official']['title']
|
||||
vod = {
|
||||
"vod_id": mid,
|
||||
"vod_name": name + " " + "个人主页",
|
||||
"vod_pic": pic,
|
||||
"type_name": "最近投稿",
|
||||
"vod_year": "",
|
||||
"vod_area": "bilidanmu",
|
||||
"vod_remarks": "", # 不会显示
|
||||
'vod_tags': 'mv', # 不会显示
|
||||
"vod_actor": "粉丝数:" + self.bilibili.zh(jo2['fans']),
|
||||
"vod_director": name,
|
||||
"vod_content": desc
|
||||
}
|
||||
playUrl = ''
|
||||
for tmpJo in jo:
|
||||
eid = tmpJo['aid']
|
||||
url3 = "https://api.bilibili.com/x/web-interface/view?aid=%s" % str(eid)
|
||||
rsp3 = self.fetch(url3)
|
||||
jRoot3 = json.loads(rsp3.text)
|
||||
cid = jRoot3['data']['cid']
|
||||
part = tmpJo['title'].replace("#", "-")
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part, eid, cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
else:
|
||||
return self.bilibili.detailContent(array)
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
self.box_video_type = "搜索"
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=bili_user&keyword={0}'.format(key)
|
||||
rsp = self.fetch(url, headers=self.header, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['mid']) # str(vod["res"][0]["aid"])
|
||||
title = "UP主:" + vod['uname'].strip() + " ☜" + key
|
||||
img = 'https:' + vod['upic'].strip()
|
||||
remark = "粉丝数" + self.bilibili.zh(vod['fans'])
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
return self.bilibili.playerContent(flag, id, vipFlags)
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {
|
||||
}
|
||||
}
|
||||
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
|
||||
def localProxy(self, param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,231 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import requests
|
||||
from requests import session, utils
|
||||
import os
|
||||
import time
|
||||
import base64
|
||||
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "哔哩"
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"Zard": "Zard",
|
||||
"玩具汽车": "玩具汽车",
|
||||
"儿童": "儿童",
|
||||
"幼儿": "幼儿",
|
||||
"儿童玩具": "儿童玩具",
|
||||
"昆虫": "昆虫",
|
||||
"动物世界": "动物世界",
|
||||
"纪录片": "纪录片",
|
||||
"相声小品": "相声小品",
|
||||
"搞笑": "搞笑",
|
||||
"假窗-白噪音": "窗+白噪音",
|
||||
"演唱会": "演唱会"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list': []
|
||||
}
|
||||
return result
|
||||
|
||||
cookies = ''
|
||||
|
||||
def getCookie(self):
|
||||
# 在cookies_str中填入会员或大会员cookie,以获得更好的体验。
|
||||
cookies_str = "innersign=0; buvid3=606BE156-AE37-AEA8-7052-9DA0B21766E776404infoc; b_nut=1663302976; i-wanna-go-back=-1; b_ut=7; b_lsid=4106252F6_18344933A90; _uuid=586AAEB7-6B88-A691-F7AC-95C27E57F53C43036infoc; buvid4=B6FF1449-4361-1C76-DEFC-4AFCA1777B7E78304-022091612-PdJr0jKE6N5TamfAEX9uACD1RXvklspbNdlcIQEFLMu0d9wS3G3sdA%3D%3D; buvid_fp=2a9b54d5e06aa54293dc7544e000552d"
|
||||
cookies_dic = dict([co.strip().split('=') for co in cookies_str.split(';')])
|
||||
rsp = session()
|
||||
cookies_jar = utils.cookiejar_from_dict(cookies_dic)
|
||||
rsp.cookies = cookies_jar
|
||||
content = self.fetch("http://api.bilibili.com/x/web-interface/nav", cookies=rsp.cookies)
|
||||
res = json.loads(content.text)
|
||||
if res["code"] == 0:
|
||||
self.cookies = rsp.cookies
|
||||
else:
|
||||
rsp = self.fetch("https://www.bilibili.com/")
|
||||
self.cookies = rsp.cookies
|
||||
return rsp.cookies
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}&page={1}'.format(tid, pg)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
remark = str(vod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def cleanSpace(self, str):
|
||||
return str.replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')
|
||||
|
||||
def detailContent(self, array):
|
||||
aid = array[0]
|
||||
url = "https://api.bilibili.com/x/web-interface/view?aid={0}".format(aid)
|
||||
rsp = self.fetch(url, headers=self.header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
title = jo['title'].replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
pic = jo['pic']
|
||||
desc = jo['desc']
|
||||
timeStamp = jo['pubdate']
|
||||
timeArray = time.localtime(timeStamp)
|
||||
year = str(time.strftime("%Y", timeArray))
|
||||
dire = jo['owner']['name']
|
||||
typeName = jo['tname']
|
||||
remark = str(jo['duration']).strip()
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": year,
|
||||
"vod_area": "",
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": "",
|
||||
"vod_director": dire,
|
||||
"vod_content": desc
|
||||
}
|
||||
ja = jo['pages']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['part'].replace("#", "-")
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part, aid, cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站视频'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword={0}'.format(key)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies,headers=header)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] != 0:
|
||||
rspRetry = self.fetch(url, cookies=self.getCookie())
|
||||
content = rspRetry.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['aid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = 'https:' + vod['pic'].strip()
|
||||
remark = str(vod['duration']).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
|
||||
ids = id.split("_")
|
||||
url = 'https://api.bilibili.com:443/x/player/playurl?avid={0}&cid={1}&qn=116'.format(ids[0], ids[1])
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
ja = jo['durl']
|
||||
|
||||
maxSize = -1
|
||||
position = -1
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self, param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,541 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
from requests import session, utils
|
||||
import os
|
||||
import time
|
||||
import base64
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
def getDependence(self):
|
||||
return ['py_bilibili']
|
||||
|
||||
def getName(self):
|
||||
return "哔哩影视"
|
||||
|
||||
def init(self, extend=""):
|
||||
self.bilibili = extend[0]
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
# 主页
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"番剧": "1",
|
||||
"国创": "4",
|
||||
"电影": "2",
|
||||
"电视剧": "5",
|
||||
"纪录片": "3",
|
||||
"综艺": "7",
|
||||
"全部": "全部",
|
||||
"追番": "追番",
|
||||
"追剧": "追剧",
|
||||
"时间表": "时间表",
|
||||
# ————————以下可自定义关键字,结果以影视类搜索展示————————
|
||||
# "喜羊羊": "喜羊羊"
|
||||
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
# 用户cookies
|
||||
cookies = ''
|
||||
userid = ''
|
||||
|
||||
def getCookie(self):
|
||||
self.cookies = self.bilibili.getCookie()
|
||||
self.userid = self.bilibili.userid
|
||||
return self.cookies
|
||||
|
||||
# 将超过10000的数字换成成以万和亿为单位
|
||||
def zh(self, num):
|
||||
if int(num) >= 100000000:
|
||||
p = round(float(num) / float(100000000), 1)
|
||||
p = str(p) + '亿'
|
||||
else:
|
||||
if int(num) >= 10000:
|
||||
p = round(float(num) / float(10000), 1)
|
||||
p = str(p) + '万'
|
||||
else:
|
||||
p = str(num)
|
||||
return p
|
||||
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
videos = self.get_rank(1)['list'][0:5]
|
||||
for i in [4, 2, 5, 3, 7]:
|
||||
videos += self.get_rank2(i)['list'][0:5]
|
||||
result['list'] = videos
|
||||
return result
|
||||
|
||||
def get_rank(self, tid):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/pgc/web/rank/list?season_type={0}&day=3'.format(tid)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['result']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title'].strip()
|
||||
img = vod['cover'].strip()
|
||||
remark = vod['new_ep']['index_show']
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_rank2(self, tid):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/pgc/season/rank/web/list?season_type={0}&day=3'.format(tid)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title'].strip()
|
||||
img = vod['cover'].strip()
|
||||
remark = vod['new_ep']['index_show']
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_zhui(self, pg, mode):
|
||||
result = {}
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
url = 'https://api.bilibili.com/x/space/bangumi/follow/list?type={2}&follow_status=0&pn={1}&ps=10&vmid={0}'.format(self.userid, pg, mode)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title']
|
||||
img = vod['cover'].strip()
|
||||
remark = vod['new_ep']['index_show'].strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_all(self, tid, pg, order, season_status, extend):
|
||||
result = {}
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
url = 'https://api.bilibili.com/pgc/season/index/result?order={2}&pagesize=10&type=1&season_type={0}&page={1}&season_status={3}'.format(tid, pg, order, season_status)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title']
|
||||
img = vod['cover'].strip()
|
||||
remark = vod['index_show'].strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_timeline(self, tid, pg):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/pgc/web/timeline/v2?season_type={0}&day_before=2&day_after=4'.format(tid)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos1 = []
|
||||
vodList = jo['result']['latest']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = vod['title'].strip()
|
||||
img = vod['cover'].strip()
|
||||
remark = vod['pub_index'] + ' ' + vod['follows'].replace('系列', '')
|
||||
videos1.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
videos2 = []
|
||||
for i in range(0, 7):
|
||||
vodList = jo['result']['timeline'][i]['episodes']
|
||||
for vod in vodList:
|
||||
if str(vod['published']) == "0":
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = str(vod['title']).strip()
|
||||
img = str(vod['cover']).strip()
|
||||
date = str(time.strftime("%m-%d %H:%M", time.localtime(vod['pub_ts'])))
|
||||
remark = date + " " + vod['pub_index']
|
||||
videos2.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos2 + videos1
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
if tid == "1":
|
||||
return self.get_rank(tid=tid)
|
||||
elif tid in {"2", "3", "4", "5", "7"}:
|
||||
return self.get_rank2(tid=tid)
|
||||
elif tid == "全部":
|
||||
tid = '1' # 全部界面默认展示最多播放的番剧
|
||||
order = '2'
|
||||
season_status = '-1'
|
||||
if 'tid' in extend:
|
||||
tid = extend['tid']
|
||||
if 'order' in extend:
|
||||
order = extend['order']
|
||||
if 'season_status' in extend:
|
||||
season_status = extend['season_status']
|
||||
return self.get_all(tid, pg, order, season_status, extend)
|
||||
elif tid == "追番":
|
||||
return self.get_zhui(pg, 1)
|
||||
elif tid == "追剧":
|
||||
return self.get_zhui(pg, 2)
|
||||
elif tid == "时间表":
|
||||
tid = 1
|
||||
if 'tid' in extend:
|
||||
tid = extend['tid']
|
||||
return self.get_timeline(tid, pg)
|
||||
else:
|
||||
result = self.searchContent(key=tid, quick="false")
|
||||
return result
|
||||
|
||||
def cleanSpace(self, str):
|
||||
return str.replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')
|
||||
|
||||
def detailContent(self, array):
|
||||
aid = array[0]
|
||||
url = "https://api.bilibili.com/pgc/view/web/season?season_id={0}".format(aid)
|
||||
rsp = self.fetch(url, headers=self.header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['result']
|
||||
id = jo['season_id']
|
||||
title = jo['title']
|
||||
pic = jo['cover']
|
||||
# areas = jo['areas']['name'] 改bilidanmu显示弹幕
|
||||
typeName = jo['share_sub_title']
|
||||
date = jo['publish']['pub_time'][0:4]
|
||||
dec = jo['evaluate']
|
||||
remark = jo['new_ep']['desc']
|
||||
stat = jo['stat']
|
||||
# 演员和导演框展示视频状态,包括以下内容:
|
||||
status = "弹幕: " + self.zh(stat['danmakus']) + " 点赞: " + self.zh(stat['likes']) + " 投币: " + self.zh(
|
||||
stat['coins']) + " 追番追剧: " + self.zh(stat['favorites'])
|
||||
if 'rating' in jo:
|
||||
score = "评分: " + str(jo['rating']['score']) + ' ' + jo['subtitle']
|
||||
else:
|
||||
score = "暂无评分" + ' ' + jo['subtitle']
|
||||
vod = {
|
||||
"vod_id": id,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": date,
|
||||
"vod_area": "bilidanmu",
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": status,
|
||||
"vod_director": score,
|
||||
"vod_content": dec
|
||||
}
|
||||
ja = jo['episodes']
|
||||
playUrl = ''
|
||||
for tmpJo in ja:
|
||||
aid = tmpJo['aid']
|
||||
cid = tmpJo['cid']
|
||||
part = tmpJo['title'].replace("#", "-")
|
||||
playUrl = playUrl + '{0}${1}_{2}#'.format(part, aid, cid)
|
||||
|
||||
vod['vod_play_from'] = 'B站'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
url1 = 'https://api.bilibili.com/x/web-interface/search/type?search_type=media_bangumi&keyword={0}'.format(
|
||||
key) # 番剧搜索
|
||||
rsp1 = self.fetch(url1, cookies=self.cookies)
|
||||
content1 = rsp1.text
|
||||
jo1 = json.loads(content1)
|
||||
rs1 = jo1['data']
|
||||
url2 = 'https://api.bilibili.com/x/web-interface/search/type?search_type=media_ft&keyword={0}'.format(
|
||||
key) # 影视搜索
|
||||
rsp2 = self.fetch(url2, cookies=self.cookies)
|
||||
content2 = rsp2.text
|
||||
jo2 = json.loads(content2)
|
||||
rs2 = jo2['data']
|
||||
videos = []
|
||||
if rs1['numResults'] == 0:
|
||||
vodList = jo2['data']['result']
|
||||
elif rs2['numResults'] == 0:
|
||||
vodList = jo1['data']['result']
|
||||
else:
|
||||
vodList = jo1['data']['result'] + jo2['data']['result']
|
||||
for vod in vodList:
|
||||
aid = str(vod['season_id']).strip()
|
||||
title = key + '➢' + vod['title'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
img = vod['cover'].strip() # vod['eps'][0]['cover'].strip()原来的错误写法
|
||||
remark = vod['index_show']
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
ids = id.split("_")
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
url = 'https://api.bilibili.com/pgc/player/web/playurl?qn=116&aid={0}&cid={1}'.format(ids[0], ids[1])
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
self.bilibili.post_history(ids[0], ids[1]) # 回传播放历史记录
|
||||
rsp = self.fetch(url, cookies=self.cookies, headers=header)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot['message'] != 'success':
|
||||
print("需要大会员权限才能观看")
|
||||
return {}
|
||||
jo = jRoot['result']
|
||||
ja = jo['durl']
|
||||
maxSize = -1
|
||||
position = -1
|
||||
for i in range(len(ja)):
|
||||
tmpJo = ja[i]
|
||||
if maxSize < int(tmpJo['size']):
|
||||
maxSize = int(tmpJo['size'])
|
||||
position = i
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
if position == -1:
|
||||
position = 0
|
||||
url = ja[position]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {
|
||||
"全部": [
|
||||
{
|
||||
"key": "tid",
|
||||
"name": "分类",
|
||||
"value": [{
|
||||
"n": "番剧",
|
||||
"v": "1"
|
||||
},
|
||||
{
|
||||
"n": "国创",
|
||||
"v": "4"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "电影",
|
||||
"v": "2"
|
||||
},
|
||||
{
|
||||
"n": "电视剧",
|
||||
"v": "5"
|
||||
},
|
||||
{
|
||||
"n": "记录片",
|
||||
"v": "3"
|
||||
},
|
||||
{
|
||||
"n": "综艺",
|
||||
"v": "7"
|
||||
}
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "order",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "播放数量",
|
||||
"v": "2"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "更新时间",
|
||||
"v": "0"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "最高评分",
|
||||
"v": "4"
|
||||
},
|
||||
{
|
||||
"n": "弹幕数量",
|
||||
"v": "1"
|
||||
},
|
||||
{
|
||||
"n": "追看人数",
|
||||
"v": "3"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "开播时间",
|
||||
"v": "5"
|
||||
},
|
||||
{
|
||||
"n": "上映时间",
|
||||
"v": "6"
|
||||
},
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "season_status",
|
||||
"name": "付费",
|
||||
"value": [
|
||||
{
|
||||
"n": "全部",
|
||||
"v": "-1"
|
||||
},
|
||||
{
|
||||
"n": "免费",
|
||||
"v": "1"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "付费",
|
||||
"v": "2%2C6"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "大会员",
|
||||
"v": "4%2C6"
|
||||
},
|
||||
|
||||
]
|
||||
},
|
||||
],
|
||||
|
||||
|
||||
"时间表": [{
|
||||
"key": "tid",
|
||||
"name": "分类",
|
||||
"value": [
|
||||
|
||||
{
|
||||
"n": "番剧",
|
||||
"v": "1"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "国创",
|
||||
"v": "4"
|
||||
},
|
||||
|
||||
]
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
|
||||
def localProxy(self, param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,665 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import requests
|
||||
from requests import session, utils
|
||||
import time
|
||||
import base64
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
def getDependence(self):
|
||||
return ['py_bilibili']
|
||||
|
||||
def getName(self):
|
||||
return "哔哩直播"
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"推荐": "推荐",
|
||||
"网游": "2",
|
||||
"手游": "3",
|
||||
"单机": "6",
|
||||
"娱乐": "1",
|
||||
"生活": "10",
|
||||
"知识": "11",
|
||||
"赛事": "13",
|
||||
"电台": "5",
|
||||
"虚拟": "9",
|
||||
"我的关注": "我的关注",
|
||||
"观看记录": "观看记录",
|
||||
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
# 用户cookies
|
||||
cookies = ''
|
||||
userid = ''
|
||||
|
||||
def getCookie(self):
|
||||
self.cookies = self.bilibili.getCookie()
|
||||
return self.cookies
|
||||
|
||||
def init(self, extend=""):
|
||||
self.bilibili = extend[0]
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
# 将超过10000的数字换成成以万和亿为单位
|
||||
def zh(self, num):
|
||||
if int(num) >= 100000000:
|
||||
p = round(float(num) / float(100000000), 1)
|
||||
p = str(p) + '亿'
|
||||
else:
|
||||
if int(num) >= 10000:
|
||||
p = round(float(num) / float(10000), 1)
|
||||
p = str(p) + '万'
|
||||
else:
|
||||
p = str(num)
|
||||
return p
|
||||
|
||||
uname = ''
|
||||
|
||||
def get_live_userInfo(self, uid):
|
||||
url = 'https://api.live.bilibili.com/live_user/v1/Master/info?uid=%s' % uid
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
return jo['data']["info"]["uname"]
|
||||
|
||||
def homeVideoContent(self):
|
||||
return self.get_hot(1)
|
||||
|
||||
def get_recommend(self, pg):
|
||||
result = {}
|
||||
url = 'https://api.live.bilibili.com/xlive/web-interface/v1/webMain/getList?platform=web&page=%s' % pg
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['recommend_room_list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['roomid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = vod['keyframe'].strip()
|
||||
remark = vod['watched_show']['text_small'].strip() + " " + vod['uname'].strip()
|
||||
videos.append({
|
||||
"vod_id": aid + '&live',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_hot(self, pg):
|
||||
result = {}
|
||||
url = 'https://api.live.bilibili.com/room/v1/room/get_user_recommend?page=%s' % pg
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']
|
||||
for vod in vodList:
|
||||
aid = str(vod['roomid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = vod['user_cover'].strip()
|
||||
remark = vod['watched_show']['text_small'].strip() + " " + vod['uname'].strip()
|
||||
videos.append({
|
||||
"vod_id": aid + '&live',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_live(self, pg, parent_area_id, area_id):
|
||||
result = {}
|
||||
url = 'https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?platform=web&parent_area_id=%s&area_id=%s&sort_type=online&page=%s' % (
|
||||
parent_area_id, area_id, pg)
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['roomid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = vod.get('cover').strip()
|
||||
remark = vod['watched_show']['text_small'].strip() + " " + vod['uname'].strip()
|
||||
videos.append({
|
||||
"vod_id": aid + '&live',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_fav(self, pg):
|
||||
result = {}
|
||||
url = 'https://api.live.bilibili.com/xlive/web-ucenter/v1/xfetter/GetWebList?page=%s&page_size=10' % pg
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['rooms']
|
||||
for vod in vodList:
|
||||
aid = str(vod['room_id']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = vod['cover_from_user'].strip()
|
||||
remark = vod['uname'].strip()
|
||||
videos.append({
|
||||
"vod_id": aid + '&live',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def get_history(self):
|
||||
result = {}
|
||||
url = 'https://api.bilibili.com/x/web-interface/history/cursor?ps=30&type=live'
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] == 0:
|
||||
videos = []
|
||||
vodList = jo['data']['list']
|
||||
for vod in vodList:
|
||||
aid = str(vod['history']['oid']).strip()
|
||||
title = vod['title'].replace("<em class=\"keyword\">", "").replace("</em>", "").replace(""", '"')
|
||||
img = vod['cover'].strip()
|
||||
remark = str(vod['live_status']).replace("0", "未开播").replace("1", "") +" " + vod['author_name'].strip()
|
||||
videos.append({
|
||||
"vod_id": aid + '&live',
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = 1
|
||||
result['pagecount'] = 1
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
if tid.isdigit():
|
||||
parent_area_id = tid
|
||||
area_id = 0
|
||||
if 'area_id' in extend:
|
||||
area_id = extend['area_id']
|
||||
return self.get_live(pg=pg, parent_area_id=parent_area_id, area_id=area_id)
|
||||
if tid == "推荐":
|
||||
return self.get_recommend(pg)
|
||||
if tid == "我的关注":
|
||||
return self.get_fav(pg)
|
||||
if tid == "观看记录":
|
||||
return self.get_history()
|
||||
return result
|
||||
|
||||
def cleanSpace(self, str):
|
||||
return str.replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')
|
||||
|
||||
def detailContent(self, array):
|
||||
arrays = array[0].split("&")
|
||||
aid = arrays[0]
|
||||
url = "https://api.live.bilibili.com/room/v1/Room/get_info?room_id=%s" % aid
|
||||
rsp = self.fetch(url, headers=self.header, cookies=self.cookies)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot.get('code') == 0:
|
||||
jo = jRoot['data']
|
||||
title = jo['title'].replace("<em class=\"keyword\">", "").replace("</em>", "")
|
||||
pic = jo.get("user_cover")
|
||||
desc = jo.get('description')
|
||||
dire = self.get_live_userInfo(jo["uid"])
|
||||
typeName = jo.get("area_name")
|
||||
live_status = str(jo.get('live_status')).replace("0", "未开播").replace("1", "").replace("2", "")
|
||||
live_time = str(jo.get('live_time'))[5: 16]
|
||||
remark = '在线人数:' + str(jo['online']).strip()
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": "",
|
||||
"vod_area": "bilidanmu",
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": "主播:" + dire + " " + "房间号:" + aid + " " + live_status,
|
||||
"vod_director": "关注:" + self.zh(jo.get('attention')) + " " + "开播时间:" + live_time,
|
||||
"vod_content": desc,
|
||||
}
|
||||
playUrl = 'flv线路原画$platform=web&quality=4_' + aid + '#flv线路高清$platform=web&quality=3_' + aid + '#h5线路原画$platform=h5&quality=4_' + aid + '#h5线路高清$platform=h5&quality=3_' + aid
|
||||
|
||||
vod['vod_play_from'] = 'B站'
|
||||
vod['vod_play_url'] = playUrl
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'https://api.bilibili.com/x/web-interface/search/type?search_type=live&keyword={0}&page=1'.format(key)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies, headers=self.header)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
if jo['code'] != 0:
|
||||
rspRetry = self.fetch(url, cookies=self.cookies, headers=self.header)
|
||||
content = rspRetry.text
|
||||
jo = json.loads(content)
|
||||
videos1 = []
|
||||
if jo['data']['pageinfo']['live_room']['numResults'] != 0:
|
||||
vodList = jo['data']['result']['live_room']
|
||||
for vod in vodList:
|
||||
aid = str(vod['roomid']).strip()
|
||||
title = vod['title'].strip() + "⇦" + key
|
||||
img = 'https:' + vod['user_cover'].strip()
|
||||
remark = vod['watched_show']['text_small'].strip() + " " + vod['uname'].strip()
|
||||
videos1.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
videos2 = []
|
||||
if jo['data']['pageinfo']['live_user']['numResults'] != 0:
|
||||
vodList = jo['data']['result']['live_user']
|
||||
for vod in vodList:
|
||||
aid = str(vod['roomid']).strip()
|
||||
title = vod['uname'].strip().replace("<em class=\"keyword\">", "").replace("</em>", "") + "⇦" + key
|
||||
img = 'https:' + vod['uface'].strip()
|
||||
remark = str(vod['live_status']).replace("0", "未开播").replace("1", "") + " 关注:" + self.zh(vod['attentions'])
|
||||
videos2.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
videos = videos1 + videos2
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
ids = id.split("_")
|
||||
|
||||
url = 'https://api.live.bilibili.com/room/v1/Room/playUrl?cid=%s&%s' % (ids[1], ids[0])
|
||||
|
||||
# raise Exception(url)
|
||||
if len(self.cookies) <= 0:
|
||||
self.getCookie()
|
||||
rsp = self.fetch(url, cookies=self.cookies)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot['code'] == 0:
|
||||
|
||||
jo = jRoot['data']
|
||||
ja = jo['durl']
|
||||
|
||||
url = ''
|
||||
if len(ja) > 0:
|
||||
url = ja[0]['url']
|
||||
|
||||
result["parse"] = 0
|
||||
# result['type'] ="m3u8"
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"Referer": "https://live.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
|
||||
if "h5" in ids[0]:
|
||||
result["contentType"] = ''
|
||||
else:
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {
|
||||
"1": [
|
||||
{
|
||||
"key": "area_id",
|
||||
"name": "全部分类",
|
||||
"value": [
|
||||
{
|
||||
"n": "舞见",
|
||||
"v": "207"
|
||||
},
|
||||
{
|
||||
"n": "视频唱见",
|
||||
"v": "21"
|
||||
},
|
||||
{
|
||||
"n": "萌宅领域",
|
||||
"v": "530"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "视频聊天",
|
||||
"v": "145"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "情感",
|
||||
"v": "706"
|
||||
},
|
||||
{
|
||||
"n": "户外",
|
||||
"v": "123"
|
||||
},
|
||||
{
|
||||
"n": "日常",
|
||||
"v": "399"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
"2": [
|
||||
{
|
||||
"key": "area_id",
|
||||
"name": "热门分类",
|
||||
"value": [
|
||||
{
|
||||
"n": "英雄联盟",
|
||||
"v": "86"
|
||||
},
|
||||
{
|
||||
"n": "DOTA2",
|
||||
"v": "92"
|
||||
},
|
||||
{
|
||||
"n": "CS:GO",
|
||||
"v": "89"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "APEX英雄",
|
||||
"v": "240"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "永劫无间",
|
||||
"v": "666"
|
||||
},
|
||||
{
|
||||
"n": "穿越火线",
|
||||
"v": "88"
|
||||
},
|
||||
{
|
||||
"n": "守望先锋",
|
||||
"v": "87"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
"3": [
|
||||
{
|
||||
"key": "area_id",
|
||||
"name": "热门分类",
|
||||
"value": [
|
||||
{
|
||||
"n": "王者荣耀",
|
||||
"v": "35"
|
||||
},
|
||||
{
|
||||
"n": "和平精英",
|
||||
"v": "256"
|
||||
},
|
||||
{
|
||||
"n": "LOL手游",
|
||||
"v": "395"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "原神",
|
||||
"v": "321"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "第五人格",
|
||||
"v": "163"
|
||||
},
|
||||
{
|
||||
"n": "明日方舟",
|
||||
"v": "255"
|
||||
},
|
||||
{
|
||||
"n": "哈利波特:魔法觉醒",
|
||||
"v": "474"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
"6": [
|
||||
{
|
||||
"key": "area_id",
|
||||
"name": "热门分类",
|
||||
"value": [
|
||||
{
|
||||
"n": "主机游戏",
|
||||
"v": "236"
|
||||
},
|
||||
{
|
||||
"n": "战神",
|
||||
"v": "579"
|
||||
},
|
||||
{
|
||||
"n": "我的世界",
|
||||
"v": "216"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "独立游戏",
|
||||
"v": "283"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "怀旧游戏",
|
||||
"v": "237"
|
||||
},
|
||||
{
|
||||
"n": "大多数",
|
||||
"v": "726"
|
||||
},
|
||||
{
|
||||
"n": "弹幕互动玩法",
|
||||
"v": "460"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
"5": [
|
||||
{
|
||||
"key": "area_id",
|
||||
"name": "全部分类",
|
||||
"value": [
|
||||
{
|
||||
"n": "唱见电台",
|
||||
"v": "190"
|
||||
},
|
||||
{
|
||||
"n": "聊天电台",
|
||||
"v": "192"
|
||||
},
|
||||
{
|
||||
"n": "配音",
|
||||
"v": "193"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
"9": [
|
||||
{
|
||||
"key": "area_id",
|
||||
"name": "全部分类",
|
||||
"value": [
|
||||
{
|
||||
"n": "虚拟主播",
|
||||
"v": "371"
|
||||
},
|
||||
{
|
||||
"n": "3D虚拟主播",
|
||||
"v": "697"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
"10": [
|
||||
{
|
||||
"key": "area_id",
|
||||
"name": "全部分类",
|
||||
"value": [
|
||||
{
|
||||
"n": "生活分享",
|
||||
"v": "646"
|
||||
},
|
||||
{
|
||||
"n": "运动",
|
||||
"v": "628"
|
||||
},
|
||||
{
|
||||
"n": "搞笑",
|
||||
"v": "624"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "手工绘画",
|
||||
"v": "627"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "萌宠",
|
||||
"v": "369"
|
||||
},
|
||||
{
|
||||
"n": "美食",
|
||||
"v": "367"
|
||||
},
|
||||
{
|
||||
"n": "时尚",
|
||||
"v": "378"
|
||||
},
|
||||
{
|
||||
"n": "影音馆",
|
||||
"v": "33"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
"11": [
|
||||
{
|
||||
"key": "area_id",
|
||||
"name": "全部分类",
|
||||
"value": [
|
||||
{
|
||||
"n": "社科法律心理",
|
||||
"v": "376"
|
||||
},
|
||||
{
|
||||
"n": "人文历史",
|
||||
"v": "702"
|
||||
},
|
||||
{
|
||||
"n": "校园学习",
|
||||
"v": "372"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "职场·技能",
|
||||
"v": "377"
|
||||
},
|
||||
|
||||
{
|
||||
"n": "科技",
|
||||
"v": "375"
|
||||
},
|
||||
{
|
||||
"n": "科学科普",
|
||||
"v": "710"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
"13": [
|
||||
{
|
||||
"key": "area_id",
|
||||
"name": "全部分类",
|
||||
"value": [
|
||||
{
|
||||
"n": "游戏赛事",
|
||||
"v": "561"
|
||||
},
|
||||
{
|
||||
"n": "体育赛事",
|
||||
"v": "562"
|
||||
},
|
||||
{
|
||||
"n": "赛事综合",
|
||||
"v": "563"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
||||
header = {
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
|
||||
}
|
||||
|
||||
def localProxy(self, param):
|
||||
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,149 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "央视"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"等着我": "TOPC1451378757637200",
|
||||
"我爱发明": "TOPC1569314345479107",
|
||||
"动物世界": "TOPC1451378967257534",
|
||||
"探索发现": "TOPC1451557893544236",
|
||||
"创新进行时": "TOPC1570875218228998",
|
||||
"我爱发明2021": "TOPC1451557970755294",
|
||||
"经典咏流传 第五季":"VIDAIiNbDQzOjE5mLl3T4t2B220403"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
extend['id'] = tid
|
||||
extend['p'] = pg
|
||||
filterParams = ["id", "p", "d"]
|
||||
params = ["", "", ""]
|
||||
for idx in range(len(filterParams)):
|
||||
fp = filterParams[idx]
|
||||
if fp in extend.keys():
|
||||
params[idx] = '{0}={1}'.format(filterParams[idx],extend[fp])
|
||||
suffix = '&'.join(params)
|
||||
url = 'https://api.cntv.cn/NewVideo/getVideoListByColumn?{0}&n=20&sort=desc&mode=0&serviceId=tvcctv&t=json'.format(suffix)
|
||||
if not tid.startswith('TOPC'):
|
||||
url = 'https://api.cntv.cn/NewVideo/getVideoListByAlbumIdNew?{0}&n=20&sort=desc&mode=0&serviceId=tvcctv&t=json'.format(suffix)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
vodList = jo['data']['list']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
guid = vod['guid']
|
||||
title = vod['title']
|
||||
img = vod['image']
|
||||
brief = vod['brief']
|
||||
videos.append({
|
||||
"vod_id":guid+"###"+img,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":''
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
aid = array[0].split('###')
|
||||
tid = aid[0]
|
||||
url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid={0}".format(tid)
|
||||
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
title = jo['title'].strip()
|
||||
link = jo['hls_url'].strip()
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":aid[1],
|
||||
"type_name":'',
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":""
|
||||
}
|
||||
vod['vod_play_from'] = 'CCTV'
|
||||
vod['vod_play_url'] = title+"$"+link
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
rsp = self.fetch(id,headers=self.header)
|
||||
content = rsp.text.strip()
|
||||
arr = content.split('\n')
|
||||
urlPrefix = self.regStr(id,'(http[s]?://[a-zA-z0-9.]+)/')
|
||||
|
||||
subUrl = arr[-1].split('/')
|
||||
subUrl[3] = '1200'
|
||||
subUrl[-1] = '1200.m3u8'
|
||||
hdUrl = urlPrefix + '/'.join(subUrl)
|
||||
|
||||
url = urlPrefix + arr[-1]
|
||||
|
||||
hdRsp = self.fetch(hdUrl,headers=self.header)
|
||||
if hdRsp.status_code == 200:
|
||||
url = hdUrl
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"TOPC1451557970755294": [{"key": "d", "name": "年份", "value": [{"n": "全部", "v": ""}, {"n": "2021", "v": "2021"}, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, {"n": "2017", "v": "2017"}, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "2014", "v": "2014"}, {"n": "2013", "v": "2013"}, {"n": "2012", "v": "2012"}, {"n": "2011", "v": "2011"}, {"n": "2010", "v": "2010"}, {"n": "2009", "v": "2009"}]}]}
|
||||
}
|
||||
header = {
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,227 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "央视"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"等着我": "TOPC1451378757637200",
|
||||
"我爱发明": "TOPC1569314345479107",
|
||||
"我爱发明2021": "TOPC1451557970755294",
|
||||
"动物世界": "TOPC1451378967257534",
|
||||
"自然传奇": "TOPC1451558150787467",
|
||||
"探索发现": "TOPC1451557893544236",
|
||||
"地理中国": "TOPC1451557421544786",
|
||||
"人与自然": "TOPC1451525103989666",
|
||||
"远方的家": "TOPC1451541349400938",
|
||||
"动画大放映": "TOPC1451559025546574",
|
||||
"动画乐园": "TOPC1451378857272262",
|
||||
"动漫世界": "TOPC1451559448233349",
|
||||
"新闻联播": "TOPC1451528971114112",
|
||||
"焦点访谈": "TOPC1451558976694518",
|
||||
"海峡两岸": "TOPC1451540328102649",
|
||||
"今日关注": "TOPC1451540389082713",
|
||||
"今日亚洲": "TOPC1451540448405749",
|
||||
"今日环球": "TOPC1571034705435323",
|
||||
"防务新观察": "TOPC1451526164984187",
|
||||
"共同关注": "TOPC1451558858788377",
|
||||
"深度国际": "TOPC1451540709098112",
|
||||
"环球视线": "TOPC1451558926200436",
|
||||
"世界周刊": "TOPC1451558687534149",
|
||||
"东方时空": "TOPC1451558532019883",
|
||||
"新闻调查": "TOPC1451558819463311",
|
||||
"环球记者连线": "TOPC1451559225116905",
|
||||
"中国舆论场": "TOPC1458109953138295",
|
||||
"国际时讯": "TOPC1451558887804404",
|
||||
"卢健访谈": "TOPC1609904361007481",
|
||||
"新闻1+1": "TOPC1451559066181661",
|
||||
"朝闻天下": "TOPC1451558496100826",
|
||||
"新闻直播间": "TOPC1451559129520755",
|
||||
"晚间新闻": "TOPC1451528792881669",
|
||||
"第一时间": "TOPC1451530259915198",
|
||||
"新闻30分": "TOPC1451559097947700",
|
||||
"中国新闻": "TOPC1451539894330405",
|
||||
"讲武堂": "TOPC1451526241359341",
|
||||
"国宝发现": "TOPC1571034869935436",
|
||||
"国宝档案": "TOPC1451540268188575",
|
||||
"天下财经": "TOPC1451531385787654",
|
||||
"央视财经评论": "TOPC1451538686034772",
|
||||
"生财有道": "TOPC1451534118159896",
|
||||
"中国经济大讲堂": "TOPC1514182710380601",
|
||||
"正点财经": "TOPC1453100395512779",
|
||||
"走进科学": "TOPC1451558190239536",
|
||||
"解码科技史": "TOPC1570876640457386",
|
||||
"法律讲堂": "TOPC1451542824484472",
|
||||
"今日说法": "TOPC1451464665008914",
|
||||
"一线": "TOPC1451543462858283",
|
||||
"百家讲坛": "TOPC1451557052519584",
|
||||
"名家书场": "TOPC1579401761622774",
|
||||
"星光大道": "TOPC1451467630488780",
|
||||
"非常6+1": "TOPC1451467940101208",
|
||||
"中国节拍": "TOPC1570025984977611",
|
||||
"一鸣惊人": "TOPC1451558692971175",
|
||||
"金牌喜剧班": "TOPC1611826337610628",
|
||||
"九州大戏台": "TOPC1451558399948678",
|
||||
"乡村大舞台": "TOPC1563179546003162",
|
||||
"家庭幽默大赛": "TOPC1451375222891702",
|
||||
"综艺盛典": "TOPC1451985071887935",
|
||||
"环球综艺": "TOPC1571300682556971",
|
||||
"中国好歌曲": "TOPC1451984949453678",
|
||||
"广场舞金曲": "TOPC1528685010104859",
|
||||
"今日影评": "TOPC1470713254980521",
|
||||
"聆听时刻": "TOPC1570026397101703",
|
||||
"影视留声机": "TOPC1451542346007956",
|
||||
"全球中文音乐榜": "TOPC1451542061864640",
|
||||
"曲苑杂谈": "TOPC1451984417763860",
|
||||
"锦绣梨园": "TOPC1451558363250650",
|
||||
"梨园周刊": "TOPC1574909786070351",
|
||||
"角儿来了": "TOPC1508747509633692",
|
||||
"宝贝亮相吧": "TOPC1579401989187953",
|
||||
"曲藏": "TOPC1597825254395109",
|
||||
"外国人在中国": "TOPC1451541113743615",
|
||||
"华人世界": "TOPC1451539822927345",
|
||||
"动物传奇": "TOPC1451984181884527",
|
||||
"武林大会": "TOPC1451551891055866",
|
||||
"棋牌乐": "TOPC1451550531682936",
|
||||
"天下足球": "TOPC1451551777876756",
|
||||
"体育世界": "TOPC1451551371554333",
|
||||
"健康之路": "TOPC1451557646802924",
|
||||
"味道中国": "TOPC1482483166133803",
|
||||
"美食中国": "TOPC1571034804976375",
|
||||
"田间示范秀": "TOPC1563178908227191",
|
||||
"三农群英会": "TOPC1600745974233265",
|
||||
"乡村振兴面对面": "TOPC1568966531726705",
|
||||
"超级新农人": "TOPC1597627647957699",
|
||||
"印象乡村": "TOPC1563178734372977",
|
||||
"农业气象": "TOPC1568949200635957",
|
||||
"中国三农报道": "TOPC1600746045741952",
|
||||
"大地讲堂": "TOPC1568966472372643",
|
||||
"振兴路上": "TOPC1632709936747979",
|
||||
"谁知盘中餐": "TOPC1568966325430648",
|
||||
"我的美丽乡村": "TOPC1570787364956444",
|
||||
"乡土中国": "TOPC1563178586782832",
|
||||
"乡里乡亲": "TOPC1568966155566515"}
|
||||
|
||||
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
extend['id'] = tid
|
||||
extend['p'] = pg
|
||||
filterParams = ["id", "p", "d"]
|
||||
params = ["", "", ""]
|
||||
for idx in range(len(filterParams)):
|
||||
fp = filterParams[idx]
|
||||
if fp in extend.keys():
|
||||
params[idx] = '{0}={1}'.format(filterParams[idx],extend[fp])
|
||||
suffix = '&'.join(params)
|
||||
url = 'https://api.cntv.cn/NewVideo/getVideoListByColumn?{0}&n=20&sort=desc&mode=0&serviceId=tvcctv&t=json'.format(suffix)
|
||||
print(url)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
vodList = jo['data']['list']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
guid = vod['guid']
|
||||
title = vod['title']
|
||||
img = vod['image']
|
||||
brief = vod['brief']
|
||||
videos.append({
|
||||
"vod_id":guid+"###"+img,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":''
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
aid = array[0].split('###')
|
||||
tid = aid[0]
|
||||
url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid={0}".format(tid)
|
||||
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
title = jo['title'].strip()
|
||||
link = jo['hls_url'].strip()
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":aid[1],
|
||||
"type_name":'',
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":""
|
||||
}
|
||||
vod['vod_play_from'] = 'CCTV'
|
||||
vod['vod_play_url'] = title+"$"+link
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
rsp = self.fetch(id,headers=self.header)
|
||||
content = rsp.text.strip()
|
||||
arr = content.split('\n')
|
||||
urlPrefix = self.regStr(id,'(http[s]?://[a-zA-z0-9.]+)/')
|
||||
url = urlPrefix + arr[-1]
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"TOPC1451557970755294": [{"key": "d", "name": "年份", "value": [{"n": "全部", "v": ""}, {"n": "2021", "v": "2021"}, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, {"n": "2017", "v": "2017"}, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "2014", "v": "2014"}, {"n": "2013", "v": "2013"}, {"n": "2012", "v": "2012"}, {"n": "2011", "v": "2011"}, {"n": "2010", "v": "2010"}, {"n": "2009", "v": "2009"}]}]}
|
||||
}
|
||||
header = {
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,218 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "央视大全"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"央视大全": "CCTV"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
month = ""
|
||||
year = ""
|
||||
if 'month' in extend.keys():
|
||||
month = extend['month']
|
||||
if 'year' in extend.keys():
|
||||
year = extend['year']
|
||||
if year == '':
|
||||
month = ''
|
||||
prefix = year + month
|
||||
extend['p'] = pg
|
||||
filterMap = {
|
||||
"fl":"",
|
||||
"fc":"",
|
||||
"cid":"",
|
||||
"p":"1"
|
||||
}
|
||||
suffix = ""
|
||||
for key in filterMap.keys():
|
||||
if key in extend.keys():
|
||||
filterMap[key] = extend[key]
|
||||
suffix = suffix + '&' + key + '=' + filterMap[key]
|
||||
url = 'https://api.cntv.cn/lanmu/columnSearch?{0}&n=20&serviceId=tvcctv&t=json'.format(suffix)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
vodList = jo['response']['docs']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
lastVideo = vod['lastVIDE']['videoSharedCode']
|
||||
if len(lastVideo) == 0:
|
||||
lastVideo = '_'
|
||||
guid = prefix+'###'+vod['column_name']+'###'+lastVideo+'###'+vod['column_logo']
|
||||
# guid = prefix+'###'+vod['column_website']+'###'+vod['column_logo']
|
||||
title = vod['column_name']
|
||||
img = vod['column_logo']
|
||||
videos.append({
|
||||
"vod_id":guid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":''
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
aid = array[0].split('###')
|
||||
tid = aid[0]
|
||||
logo = aid[3]
|
||||
lastVideo = aid[2]
|
||||
title = aid[1]
|
||||
date = aid[0]
|
||||
if lastVideo == '_':
|
||||
return {}
|
||||
|
||||
lastUrl = 'https://api.cntv.cn/video/videoinfoByGuid?guid={0}&serviceId=tvcctv'.format(lastVideo)
|
||||
lastJo = self.fetch(lastUrl,headers=self.header).json()
|
||||
topicId = lastJo['ctid']
|
||||
url = "https://api.cntv.cn/NewVideo/getVideoListByColumn?id={0}&d={1}&p=1&n=100&sort=desc&mode=0&serviceId=tvcctv&t=json".format(topicId,date)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
vodList = jo['data']['list']
|
||||
videoList = []
|
||||
for video in vodList:
|
||||
videoList.append(video['title']+"$"+video['guid'])
|
||||
if len(videoList) == 0:
|
||||
return {}
|
||||
if len(date) == 0:
|
||||
date = time.strftime("%Y", time.localtime(time.time()))
|
||||
vod = {
|
||||
"vod_id":array[0],
|
||||
"vod_name":date +" "+title,
|
||||
"vod_pic":logo,
|
||||
"type_name":lastJo['channel'],
|
||||
"vod_year":date,
|
||||
"vod_area":"",
|
||||
"vod_remarks":date,
|
||||
"vod_actor":"",
|
||||
"vod_director":topicId,
|
||||
"vod_content":"当前页面默认只展示最新100期的内容,可在分类页面选择年份和月份进行往期节目查看。年份和月份仅影响当前页面内容,不参与分类过滤。视频默认播放可以获取到的最高帧率。"
|
||||
}
|
||||
|
||||
vod['vod_play_from'] = 'CCTV'
|
||||
vod['vod_play_url'] = "#".join(videoList)
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
# def detailContent(self,array):
|
||||
# aid = array[0].split('###')
|
||||
# tid = aid[0]
|
||||
# logo = aid[2]
|
||||
# webSite = aid[1]
|
||||
# date = aid[0]
|
||||
# rsp = self.fetch(webSite,headers=self.header)
|
||||
# topicId = ''
|
||||
# root = self.html(rsp.text)
|
||||
# topicId = self.regStr(rsp.text,"(TOPC[0-9]{16})")
|
||||
# title = root.xpath('.//title/text()')[0]
|
||||
# if len(topicId) <= 0:
|
||||
# return {}
|
||||
# url = "https://api.cntv.cn/NewVideo/getVideoListByColumn?id={0}&d={1}&p=1&n=100&sort=desc&mode=0&serviceId=tvcctv&t=json".format(topicId,date)
|
||||
# jo = self.fetch(url,headers=self.header).json()
|
||||
# vodList = jo['data']['list']
|
||||
# videoList = []
|
||||
# for video in vodList:
|
||||
# videoList.append(video['title']+"$"+video['guid'])
|
||||
# if len(videoList) == 0:
|
||||
# return {}
|
||||
# if len(date) == 0:
|
||||
# date = '近期'
|
||||
# vod = {
|
||||
# "vod_id":array[0],
|
||||
# "vod_name":date +" "+title,
|
||||
# "vod_pic":logo,
|
||||
# "type_name":'',
|
||||
# "vod_year":date,
|
||||
# "vod_area":"",
|
||||
# "vod_remarks":date,
|
||||
# "vod_actor":"",
|
||||
# "vod_director":"",
|
||||
# "vod_content":"详情页面默认只展示最新100期的内容,可以在分类页面选择年份和月份进行往期节目查看。年份和月份仅影响视频详情内容,不参与分类过滤。视频默认播放最高帧率。"
|
||||
# }
|
||||
|
||||
# vod['vod_play_from'] = 'CCTV'
|
||||
# vod['vod_play_url'] = "#".join(videoList)
|
||||
# result = {
|
||||
# 'list':[
|
||||
# vod
|
||||
# ]
|
||||
# }
|
||||
# return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid={0}".format(id)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
link = jo['hls_url'].strip()
|
||||
rsp = self.fetch(link,headers=self.header)
|
||||
content = rsp.text.strip()
|
||||
arr = content.split('\n')
|
||||
urlPrefix = self.regStr(link,'(http[s]?://[a-zA-z0-9.]+)/')
|
||||
|
||||
subUrl = arr[-1].split('/')
|
||||
subUrl[3] = '1200'
|
||||
subUrl[-1] = '1200.m3u8'
|
||||
hdUrl = urlPrefix + '/'.join(subUrl)
|
||||
|
||||
url = urlPrefix + arr[-1]
|
||||
|
||||
hdRsp = self.fetch(hdUrl,headers=self.header)
|
||||
if hdRsp.status_code == 200:
|
||||
url = hdUrl
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"CCTV":[{"key":"cid","name":"频道","value":[{"n":"全部","v":""},{"n":"CCTV-1综合","v":"EPGC1386744804340101"},{"n":"CCTV-2财经","v":"EPGC1386744804340102"},{"n":"CCTV-3综艺","v":"EPGC1386744804340103"},{"n":"CCTV-4中文国际","v":"EPGC1386744804340104"},{"n":"CCTV-5体育","v":"EPGC1386744804340107"},{"n":"CCTV-6电影","v":"EPGC1386744804340108"},{"n":"CCTV-7国防军事","v":"EPGC1386744804340109"},{"n":"CCTV-8电视剧","v":"EPGC1386744804340110"},{"n":"CCTV-9纪录","v":"EPGC1386744804340112"},{"n":"CCTV-10科教","v":"EPGC1386744804340113"},{"n":"CCTV-11戏曲","v":"EPGC1386744804340114"},{"n":"CCTV-12社会与法","v":"EPGC1386744804340115"},{"n":"CCTV-13新闻","v":"EPGC1386744804340116"},{"n":"CCTV-14少儿","v":"EPGC1386744804340117"},{"n":"CCTV-15音乐","v":"EPGC1386744804340118"},{"n":"CCTV-16奥林匹克","v":"EPGC1634630207058998"},{"n":"CCTV-17农业农村","v":"EPGC1563932742616872"},{"n":"CCTV-5+体育赛事","v":"EPGC1468294755566101"}]},{"key":"fc","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":"影视"}]},{"key":"fl","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"month","name":"月份","value":[{"n":"全部","v":""},{"n":"12","v":"12"},{"n":"11","v":"11"},{"n":"10","v":"10"},{"n":"09","v":"09"},{"n":"08","v":"08"},{"n":"07","v":"07"},{"n":"06","v":"06"},{"n":"05","v":"05"},{"n":"04","v":"04"},{"n":"03","v":"03"},{"n":"02","v":"02"},{"n":"01","v":"01"}]}]}
|
||||
}
|
||||
header = {
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36",
|
||||
"Origin": "https://tv.cctv.com",
|
||||
"Referer": "https://tv.cctv.com/"
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,244 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import base64
|
||||
from Crypto.Cipher import AES
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "厂长资源"
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"豆瓣电影Top250": "dbtop250",
|
||||
"最新电影": "zuixindianying",
|
||||
"电视剧": "dsj",
|
||||
"国产剧": "gcj",
|
||||
"美剧": "meijutt",
|
||||
"韩剧": "hanjutv",
|
||||
"番剧": "fanju",
|
||||
"动漫": "dm"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://czspp.com")
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//div[@class='mi_btcon']//ul/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./a/img/@alt')[0]
|
||||
pic = a.xpath('./a/img/@data-original')[0]
|
||||
mark = a.xpath("./div[@class='hdinfo']/span/text()")[0]
|
||||
sid = a.xpath("./a/@href")[0]
|
||||
sid = self.regStr(sid, "/movie/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
url = 'https://czspp.com/{0}/page/{1}'.format(tid, pg)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//div[contains(@class,'mi_cont')]//ul/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./a/img/@alt')[0]
|
||||
pic = a.xpath('./a/img/@data-original')[0]
|
||||
mark = a.xpath("./div[@class='hdinfo']/span/text()")[0]
|
||||
sid = a.xpath("./a/@href")[0]
|
||||
sid = self.regStr(sid, "/movie/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def detailContent(self, array):
|
||||
tid = array[0]
|
||||
url = 'https://czspp.com/movie/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
node = root.xpath("//div[@class='dyxingq']")[0]
|
||||
pic = node.xpath(".//div[@class='dyimg fl']/img/@src")[0]
|
||||
title = node.xpath('.//h1/text()')[0]
|
||||
detail = root.xpath(".//div[@class='yp_context']//p/text()")[0]
|
||||
vod = {
|
||||
"vod_id": tid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": "",
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": "",
|
||||
"vod_actor": "",
|
||||
"vod_director": "",
|
||||
"vod_content": detail
|
||||
}
|
||||
infoArray = node.xpath(".//ul[@class='moviedteail_list']/li")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
if content.startswith('类型'):
|
||||
tpyen = ''
|
||||
for inf in info:
|
||||
tn = inf.text
|
||||
tpyen = tpyen +'/'+'{0}'.format(tn)
|
||||
vod['type_name'] = tpyen.strip('/')
|
||||
if content.startswith('地区'):
|
||||
tpyeare = ''
|
||||
for inf in info:
|
||||
tn = inf.text
|
||||
tpyeare = tpyeare +'/'+'{0}'.format(tn)
|
||||
vod['vod_area'] = tpyeare.strip('/')
|
||||
if content.startswith('豆瓣'):
|
||||
vod['vod_remarks'] = content
|
||||
if content.startswith('主演'):
|
||||
tpyeact = ''
|
||||
for inf in info:
|
||||
tn = inf.text
|
||||
tpyeact = tpyeact +'/'+'{0}'.format(tn)
|
||||
vod['vod_actor'] = tpyeact.strip('/')
|
||||
if content.startswith('导演'):
|
||||
tpyedire = ''
|
||||
for inf in info:
|
||||
tn = inf.text
|
||||
tpyedire = tpyedire +'/'+'{0}'.format(tn)
|
||||
vod['vod_director'] = tpyedire .strip('/')
|
||||
vod_play_from = '$$$'
|
||||
playFrom = ['厂长']
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath("//div[@class='paly_list_btn']")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('./text()')[0]
|
||||
tId = self.regStr(href, '/v_play/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'https://czspp.com/xssearch?q={0}'.format(key)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
vodList = root.xpath("//div[contains(@class,'mi_ne_kd')]/ul/li/a")
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
name = vod.xpath('./img/@alt')[0]
|
||||
pic = vod.xpath('./img/@data-original')[0]
|
||||
href = vod.xpath('./@href')[0]
|
||||
tid = self.regStr(href, 'movie/(\\S+).html')
|
||||
res = vod.xpath('./div[@class="jidi"]/span/text()')
|
||||
if len(res) == 0:
|
||||
remark = '全1集'
|
||||
else:
|
||||
remark = vod.xpath('./div[@class="jidi"]/span/text()')[0]
|
||||
videos.append({
|
||||
"vod_id": tid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36"
|
||||
}
|
||||
def parseCBC(self, enc, key, iv):
|
||||
keyBytes = key.encode("utf-8")
|
||||
ivBytes = iv.encode("utf-8")
|
||||
cipher = AES.new(keyBytes, AES.MODE_CBC, ivBytes)
|
||||
msg = cipher.decrypt(enc)
|
||||
paddingLen = msg[len(msg) - 1]
|
||||
return msg[0:-paddingLen]
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
url = 'https://czspp.com/v_play/{0}.html'.format(id)
|
||||
pat = '\\"([^\\"]+)\\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\\"([\\d\\w]+)\\".*md5.enc.Utf8.parse\\(([\\d]+)\\)'
|
||||
rsp = self.fetch(url)
|
||||
html = rsp.text
|
||||
content = self.regStr(html, pat)
|
||||
if content == '':
|
||||
return {}
|
||||
key = self.regStr(html, pat, 2)
|
||||
iv = self.regStr(html, pat, 3)
|
||||
decontent = self.parseCBC(base64.b64decode(content), key, iv).decode()
|
||||
urlPat = 'video: \\{url: \\\"([^\\\"]+)\\\"'
|
||||
vttPat = 'subtitle: \\{url:\\\"([^\\\"]+\\.vtt)\\\"'
|
||||
str3 = self.regStr(decontent, urlPat)
|
||||
str4 = self.regStr(decontent, vttPat)
|
||||
self.loadVtt(str3)
|
||||
result = {
|
||||
'parse': '0',
|
||||
'playUrl': '',
|
||||
'url': str3,
|
||||
'header': ''
|
||||
}
|
||||
if len(str4) > 0:
|
||||
result['subf'] = '/vtt/utf-8'
|
||||
# result['subt'] = Proxy.localProxyUrl() + "?do=czspp&url=" + URLEncoder.encode(str4)
|
||||
result['subt'] = ''
|
||||
return result
|
||||
|
||||
def loadVtt(self, url):
|
||||
pass
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def localProxy(self, param):
|
||||
action = {}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,216 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
import re
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import urllib.parse
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "创艺影视"
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "1",
|
||||
"剧集": "2",
|
||||
"动漫": "4",
|
||||
"综艺": "3",
|
||||
"纪录片": "30"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list': []
|
||||
}
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
header = {"User-Agent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36"}
|
||||
url = 'https://www.30dian.cn/vodtype/{0}-{1}.html'.format(tid, pg)
|
||||
rsp = self.fetch(url,headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//div[@class='myui-panel myui-panel-bg clearfix']/div/div/ul/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./div/a/@title')[0]
|
||||
pic = a.xpath('./div/a/@data-original')[0]
|
||||
mark = a.xpath("./div/a/span/span[@class='tag']/text()")[0]
|
||||
sid = a.xpath("./div/a/@href")[0].replace("/", "").replace("voddetail", "").replace(".html", "")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 999
|
||||
result['limit'] = 5
|
||||
result['total'] = 9999
|
||||
return result
|
||||
|
||||
def detailContent(self, array):
|
||||
tid = array[0]
|
||||
url = 'https://www.30dian.cn/voddetail/{0}.html'.format(tid)
|
||||
header = {"User-Agent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36"}
|
||||
rsp = self.fetch(url,headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
divContent = root.xpath("//div[@class='col-lg-wide-75 col-md-wide-7 col-xs-1 padding-0']")[0]
|
||||
title = divContent.xpath(".//div[@class='myui-content__detail']/h1/text()")[0]
|
||||
pic = divContent.xpath(".//div[@class='myui-content__thumb']/a/img/@data-original")[0]
|
||||
det = divContent.xpath(".//div[@class='col-pd text-collapse content']/span[@class='data']")[0]
|
||||
if det.text is None:
|
||||
detail = det.xpath(".//p/text()")[0]
|
||||
else:
|
||||
detail = det.text
|
||||
vod = {
|
||||
"vod_id": tid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": "",
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": "",
|
||||
"vod_actor": "",
|
||||
"vod_director": "",
|
||||
"vod_content": detail
|
||||
}
|
||||
infoArray = divContent.xpath(".//div[@class='myui-content__detail']/p[contains(@class,'data')]")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
flag = "分类" in content
|
||||
if flag == True:
|
||||
infon = content.replace("\t","").replace("\n","").strip().split('\r')
|
||||
for inf in infon:
|
||||
if inf.startswith('分类'):
|
||||
vod['type_name'] = inf.replace("分类:", "")
|
||||
if inf.startswith('地区'):
|
||||
vod['vod_area'] = inf.replace("地区:", "")
|
||||
if inf.startswith('年份'):
|
||||
vod['vod_year'] = inf.replace("年份:", "")
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content.replace("\xa0", "/").replace("主演:", "").strip('/')
|
||||
if content.startswith('更新'):
|
||||
vod['vod_remarks'] = content.replace("更新:", "")
|
||||
if content.startswith('导演'):
|
||||
vod['vod_director'] = content.replace("\xa0", "").replace("导演:", "").strip('/')
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = divContent.xpath(".//div[@class='myui-panel_hd']/div/ul/li/a[contains(@href,'playlist')]/text()")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v.replace(" ", ""))
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = divContent.xpath(".//div[contains(@id,'playlist')]")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./ul/li/a')
|
||||
if len(aList) <= 0:
|
||||
name = '无法找到播放源'
|
||||
tId = '00000'
|
||||
vodItems.append(name + "$" + tId)
|
||||
else:
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath("./text()")[0].replace(" ", "")
|
||||
tId = self.regStr(href, '/vodplay/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'https://www.30dian.cn/vodsearch/-------------.html?wd={0}'.format(key)
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36"}
|
||||
rsp = self.fetch(url, headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//ul[contains(@class,'myui-vodlist__media clearfix')]/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath(".//div[@class='detail']/h4/a/text()")[0]
|
||||
pic = a.xpath(".//a[contains(@class,'myui-vodlist__thumb')]//@data-original")[0]
|
||||
mark = a.xpath(".//span[@class='tag']/text()")[0]
|
||||
sid = a.xpath(".//div[@class='detail']/h4/a/@href")[0]
|
||||
sid = self.regStr(sid,'/voddetail/(\\S+).html')
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36"}
|
||||
if id == '00000':
|
||||
return {}
|
||||
url = 'https://www.30dian.cn/vodplay/{0}.html'.format(id)
|
||||
rsp = self.fetch(url,headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
scripts = root.xpath("//div[@class='embed-responsive clearfix']/script[@type='text/javascript']/text()")[0]
|
||||
ukey = re.findall(r"url(.*)url_next", scripts)[0].replace('"', "").replace(',', "").replace(':', "")
|
||||
purl = urllib.parse.unquote(ukey)
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] =purl
|
||||
result["header"] = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def localProxy(self, param):
|
||||
action = {
|
||||
'url': '',
|
||||
'header': '',
|
||||
'param': '',
|
||||
'type': 'string',
|
||||
'after': ''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,232 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import requests
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "Cokemv"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"抖音电影":"5",
|
||||
"电视剧":"2",
|
||||
"电影":"1",
|
||||
"动漫":"4",
|
||||
"综艺":"3"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://cokemv.me/")
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//div[@class='main']//div[contains(@class,'module-items')]/a")
|
||||
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('.//img/@data-original')[0]
|
||||
mark = a.xpath(".//div[@class='module-item-note']/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/voddetail/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
|
||||
urlParams = ["", "", "", "", "", "", "", "", "", "", "", ""]
|
||||
urlParams[0] = tid
|
||||
urlParams[8] = pg
|
||||
for key in extend:
|
||||
urlParams[int(key)] = extend[key]
|
||||
params = '-'.join(urlParams)
|
||||
url = 'https://cokemv.me/vodshow/{0}.html'.format(params)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//div[contains(@class, 'module-items')]/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('.//img/@data-original')[0]
|
||||
mark = a.xpath(".//div[contains(@class,'module-item-note')]/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/voddetail/(\\d+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'https://cokemv.me/voddetail/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
divContent = root.xpath("//div[@class='module-info-main']")[0]
|
||||
title = divContent.xpath('.//h1/text()')[0]
|
||||
year = divContent.xpath('.//div/div/div[1]/a/text()')[0]
|
||||
area = divContent.xpath('.//div/div/div[2]/a/text()')[0]
|
||||
typ = divContent.xpath('.//div/div/div[3]/a/text()')
|
||||
type = ', '.join(typ)
|
||||
dir = divContent.xpath(".//div[@class='module-info-items']/div[2]/div[1]/a/text()")[0]
|
||||
act = divContent.xpath(".//div[@class='module-info-items']/div[4]/div/a/text()")
|
||||
actor = ', '.join(act)
|
||||
pic = root.xpath(".//div[@class='module-poster-bg']//img/@data-original")[0]
|
||||
detail = root.xpath(".//div[@class='module-info-introduction-content']/p/text()")[0]
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":type,
|
||||
"vod_year":year,
|
||||
"vod_area":area,
|
||||
"vod_remarks":"",
|
||||
"vod_actor":actor,
|
||||
"vod_director":dir,
|
||||
"vod_content":detail
|
||||
}
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath("//div[@class='module-tab-item tab-item']/span/text()")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v)
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath("//div[@class='module-play-list']")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./div/a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('.//span/text()')[0]
|
||||
tId = self.regStr(href,'/vodplay/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def verifyCode(self, url):
|
||||
retry = 5
|
||||
header = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"}
|
||||
while retry:
|
||||
try:
|
||||
session = requests.session()
|
||||
img = session.get('https://cokemv.me/index.php/verify/index.html?', headers=header).content
|
||||
code = session.post('https://api.nn.ci/ocr/b64/text', data=base64.b64encode(img).decode()).text
|
||||
res = session.post(url=f"https://cokemv.me/index.php/ajax/verify_check?type=search&verify={code}", headers=header).json()
|
||||
if res["msg"] == "ok":
|
||||
return session
|
||||
except Exception as e:
|
||||
print(e)
|
||||
finally:
|
||||
retry = retry - 1
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'https://cokemv.me/vodsearch/-------------.html?wd={0}'.format(key)
|
||||
session = self.verifyCode(url)
|
||||
rsp = session.get(url)
|
||||
root = self.html(rsp.text)
|
||||
vodList = root.xpath("//div[@class='module-card-item module-item']/a[@class='module-card-item-poster']")
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
name = vod.xpath(".//img/@alt")[0]
|
||||
pic = vod.xpath(".//img/@data-original")[0]
|
||||
mark = vod.xpath(".//div[@class='module-item-note']/text()")[0]
|
||||
sid = vod.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/voddetail/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {"cokemv0555":{"show":"COKEMV","des":"","ps":"0","parse":""},"cokeqie01":{"show":"極速路線","des":"","ps":"0","parse":""},"xin":{"show":"高速路線","des":"","ps":"0","parse":""},"90mm":{"show":"COKEMV(測試)","des":"","ps":"0","parse":""},"toutiao":{"show":"海外路線","des":"","ps":"0","parse":""},"age01":{"show":"動漫一線","des":"","ps":"0","parse":""},"mahua":{"show":"海外(禁國內)","des":"","ps":"0","parse":""},"age02":{"show":"動漫二線","des":"","ps":"0","parse":""}},
|
||||
"filter": {"5":[{"key":3,"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":"微電影"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"國語","v":"國語"},{"n":"英語","v":"英語"},{"n":"粵語","v":"粵語"},{"n":" 閩南語","v":"閩南語"},{"n":"韓語","v":"韓語"},{"n":"日語","v":"日語"},{"n":"法語","v":"法語"},{"n":"德語","v":"德語"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}],"2":[{"key":0,"name":"类型","value":[{"n":"全部","v":"2"},{"n":"大陸劇","v":"13"},{"n":"香港劇","v":"14"},{"n":"韓國劇","v":"15"},{"n":"歐美劇","v":"16"},{"n":"日本劇","v":"20"},{"n":"台灣劇","v":"21"},{"n":"泰國劇","v":"22"}]},{"key":1,"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":"其他"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}],"1":[{"key":0,"name":"类型","value":[{"n":"全部","v":"1"},{"n":"動作片","v":"6"},{"n":"喜劇片","v":"7"},{"n":"愛情片","v":"8"},{"n":"科幻片","v":"9"},{"n":"恐怖片","v":"10"},{"n":"劇情片","v":"11"},{"n":"戰爭片","v":"12"},{"n":"犯罪片","v":"23"},{"n":"奇幻片","v":"24"},{"n":"懸疑片","v":"25"},{"n":"記錄片","v":"27"}]},{"key":1,"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":"其他"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"法语","v":"法语"},{"n":"德语","v":"德语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}],"4":[{"key":0,"name":"类型","value":[{"n":"全部","v":"4"},{"n":"動畫電影","v":"41"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}],"3":[{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"韩国","v":" 韩国"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩 语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":" 时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}]}
|
||||
}
|
||||
header = {
|
||||
"origin":"https://cokemv.me",
|
||||
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
|
||||
"Accept":" */*",
|
||||
"Accept-Language":"zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7",
|
||||
"Accept-Encoding":"gzip, deflate"
|
||||
}
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
url = 'https://cokemv.me/vodplay/{0}.html'.format(id)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
scripts = root.xpath("//script/text()")
|
||||
jo = {}
|
||||
result = {}
|
||||
for script in scripts:
|
||||
if(script.startswith("var player_")):
|
||||
target = script[script.index('{'):]
|
||||
jo = json.loads(target)
|
||||
break;
|
||||
parseUrl = ""
|
||||
playerConfig = self.config['player']
|
||||
if jo['from'] in self.config['player']:
|
||||
playerConfig = self.config['player'][jo['from']]
|
||||
videoUrl = jo['url']
|
||||
playerUrl = playerConfig['parse']
|
||||
result["parse"] = playerConfig['ps']
|
||||
result["playUrl"] = playerUrl
|
||||
result["url"] = videoUrl
|
||||
result["header"] = json.dumps(self.header)
|
||||
return result
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,232 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import requests
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "Cokemv"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"抖音电影":"5",
|
||||
"电视剧":"2",
|
||||
"电影":"1",
|
||||
"动漫":"4",
|
||||
"综艺":"3"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://cokemv.me/")
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//div[@class='main']//div[contains(@class,'module-items')]/a")
|
||||
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('.//img/@data-original')[0]
|
||||
mark = a.xpath(".//div[@class='module-item-note']/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/voddetail/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
|
||||
urlParams = ["", "", "", "", "", "", "", "", "", "", "", ""]
|
||||
urlParams[0] = tid
|
||||
urlParams[8] = pg
|
||||
for key in extend:
|
||||
urlParams[int(key)] = extend[key]
|
||||
params = '-'.join(urlParams)
|
||||
url = 'https://cokemv.me/vodshow/{0}.html'.format(params)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//div[contains(@class, 'module-items')]/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('.//img/@data-original')[0]
|
||||
mark = a.xpath(".//div[contains(@class,'module-item-note')]/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/voddetail/(\\d+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'https://cokemv.me/voddetail/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
divContent = root.xpath("//div[@class='module-info-main']")[0]
|
||||
title = divContent.xpath('.//h1/text()')[0]
|
||||
year = divContent.xpath('.//div/div/div[1]/a/text()')[0]
|
||||
area = divContent.xpath('.//div/div/div[2]/a/text()')[0]
|
||||
typ = divContent.xpath('.//div/div/div[3]/a/text()')
|
||||
type = ', '.join(typ)
|
||||
dir = divContent.xpath(".//div[@class='module-info-items']/div[2]/div[1]/a/text()")[0]
|
||||
act = divContent.xpath(".//div[@class='module-info-items']/div[4]/div/a/text()")
|
||||
actor = ', '.join(act)
|
||||
pic = root.xpath(".//div[@class='module-poster-bg']//img/@data-original")[0]
|
||||
detail = root.xpath(".//div[@class='module-info-introduction-content']/p/text()")[0]
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":type,
|
||||
"vod_year":year,
|
||||
"vod_area":area,
|
||||
"vod_remarks":"",
|
||||
"vod_actor":actor,
|
||||
"vod_director":dir,
|
||||
"vod_content":detail
|
||||
}
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath("//div[@class='module-tab-item tab-item']/span/text()")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v)
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath("//div[@class='module-play-list']")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./div/a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('.//span/text()')[0]
|
||||
tId = self.regStr(href,'/vodplay/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def verifyCode(self, url):
|
||||
retry = 5
|
||||
header = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"}
|
||||
while retry:
|
||||
try:
|
||||
session = requests.session()
|
||||
img = session.get('https://cokemv.me/index.php/verify/index.html?', headers=header).content
|
||||
code = session.post('https://api.nn.ci/ocr/b64/text', data=base64.b64encode(img).decode()).text
|
||||
res = session.post(url=f"https://cokemv.me/index.php/ajax/verify_check?type=search&verify={code}", headers=header).json()
|
||||
if res["msg"] == "ok":
|
||||
return session
|
||||
except Exception as e:
|
||||
print(e)
|
||||
finally:
|
||||
retry = retry - 1
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'https://cokemv.me/vodsearch/-------------.html?wd={0}'.format(key)
|
||||
session = self.verifyCode(url)
|
||||
rsp = session.get(url)
|
||||
root = self.html(rsp.text)
|
||||
vodList = root.xpath("//div[@class='module-card-item module-item']/a[@class='module-card-item-poster']")
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
name = vod.xpath(".//img/@alt")[0]
|
||||
pic = vod.xpath(".//img/@data-original")[0]
|
||||
mark = vod.xpath(".//div[@class='module-item-note']/text()")[0]
|
||||
sid = vod.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/voddetail/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {"cokemv0555":{"show":"COKEMV","des":"","ps":"0","parse":""},"cokeqie01":{"show":"極速路線","des":"","ps":"0","parse":""},"xin":{"show":"高速路線","des":"","ps":"0","parse":""},"90mm":{"show":"COKEMV(測試)","des":"","ps":"0","parse":""},"toutiao":{"show":"海外路線","des":"","ps":"0","parse":""},"age01":{"show":"動漫一線","des":"","ps":"0","parse":""},"mahua":{"show":"海外(禁國內)","des":"","ps":"0","parse":""},"age02":{"show":"動漫二線","des":"","ps":"0","parse":""}},
|
||||
"filter": {"5":[{"key":3,"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":"微電影"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"國語","v":"國語"},{"n":"英語","v":"英語"},{"n":"粵語","v":"粵語"},{"n":" 閩南語","v":"閩南語"},{"n":"韓語","v":"韓語"},{"n":"日語","v":"日語"},{"n":"法語","v":"法語"},{"n":"德語","v":"德語"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}],"2":[{"key":0,"name":"类型","value":[{"n":"全部","v":"2"},{"n":"大陸劇","v":"13"},{"n":"香港劇","v":"14"},{"n":"韓國劇","v":"15"},{"n":"歐美劇","v":"16"},{"n":"日本劇","v":"20"},{"n":"台灣劇","v":"21"},{"n":"泰國劇","v":"22"}]},{"key":1,"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":"其他"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}],"1":[{"key":0,"name":"类型","value":[{"n":"全部","v":"1"},{"n":"動作片","v":"6"},{"n":"喜劇片","v":"7"},{"n":"愛情片","v":"8"},{"n":"科幻片","v":"9"},{"n":"恐怖片","v":"10"},{"n":"劇情片","v":"11"},{"n":"戰爭片","v":"12"},{"n":"犯罪片","v":"23"},{"n":"奇幻片","v":"24"},{"n":"懸疑片","v":"25"},{"n":"記錄片","v":"27"}]},{"key":1,"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":"其他"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"法语","v":"法语"},{"n":"德语","v":"德语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}],"4":[{"key":0,"name":"类型","value":[{"n":"全部","v":"4"},{"n":"動畫電影","v":"41"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}],"3":[{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"韩国","v":" 韩国"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩 语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":" 时间排序","v":"time"},{"n":"人气排序","v":"hits"},{"n":"评分排序","v":"score"}]}]}
|
||||
}
|
||||
header = {
|
||||
"origin":"https://cokemv.me",
|
||||
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
|
||||
"Accept":" */*",
|
||||
"Accept-Language":"zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7",
|
||||
"Accept-Encoding":"gzip, deflate"
|
||||
}
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
url = 'https://cokemv.me/vodplay/{0}.html'.format(id)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
scripts = root.xpath("//script/text()")
|
||||
jo = {}
|
||||
result = {}
|
||||
for script in scripts:
|
||||
if(script.startswith("var player_")):
|
||||
target = script[script.index('{'):]
|
||||
jo = json.loads(target)
|
||||
break;
|
||||
parseUrl = ""
|
||||
playerConfig = self.config['player']
|
||||
if jo['from'] in self.config['player']:
|
||||
playerConfig = self.config['player'][jo['from']]
|
||||
videoUrl = jo['url']
|
||||
playerUrl = playerConfig['parse']
|
||||
result["parse"] = playerConfig['ps']
|
||||
result["playUrl"] = playerUrl
|
||||
result["url"] = videoUrl
|
||||
result["header"] = json.dumps(self.header)
|
||||
return result
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,242 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
import re
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import urllib.parse
|
||||
import base64
|
||||
from Crypto.Cipher import AES
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "创艺影视"
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "1",
|
||||
"剧集": "2",
|
||||
"动漫": "4",
|
||||
"综艺": "3",
|
||||
"纪录片": "30"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list': []
|
||||
}
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
header = {"User-Agent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36"}
|
||||
url = 'https://www.30dian.cn/vodtype/{0}-{1}.html'.format(tid, pg)
|
||||
rsp = self.fetch(url,headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//div[@class='myui-panel myui-panel-bg clearfix']/div/div/ul/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./div/a/@title')[0]
|
||||
pic = a.xpath('./div/a/@data-original')[0]
|
||||
mark = a.xpath("./div/a/span/span[@class='tag']/text()")[0]
|
||||
sid = a.xpath("./div/a/@href")[0].replace("/", "").replace("voddetail", "").replace(".html", "")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 999
|
||||
result['limit'] = 5
|
||||
result['total'] = 9999
|
||||
return result
|
||||
|
||||
def detailContent(self, array):
|
||||
tid = array[0]
|
||||
url = 'https://www.30dian.cn/voddetail/{0}.html'.format(tid)
|
||||
header = {"User-Agent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36"}
|
||||
rsp = self.fetch(url,headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
divContent = root.xpath("//div[@class='col-lg-wide-75 col-md-wide-7 col-xs-1 padding-0']")[0]
|
||||
title = divContent.xpath(".//div[@class='myui-content__detail']/h1/text()")[0]
|
||||
pic = divContent.xpath(".//div[@class='myui-content__thumb']/a/img/@data-original")[0]
|
||||
det = divContent.xpath(".//div[@class='col-pd text-collapse content']/span[@class='data']")[0]
|
||||
if det.text is None:
|
||||
detail = det.xpath(".//p/text()")[0]
|
||||
else:
|
||||
detail = det.text
|
||||
vod = {
|
||||
"vod_id": tid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": "",
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": "",
|
||||
"vod_actor": "",
|
||||
"vod_director": "",
|
||||
"vod_content": detail
|
||||
}
|
||||
infoArray = divContent.xpath(".//div[@class='myui-content__detail']/p[contains(@class,'data')]")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
flag = "分类" in content
|
||||
if flag == True:
|
||||
infon = content.replace("\t","").replace("\n","").strip().split('\r')
|
||||
for inf in infon:
|
||||
if inf.startswith('分类'):
|
||||
vod['type_name'] = inf.replace("分类:", "")
|
||||
if inf.startswith('地区'):
|
||||
vod['vod_area'] = inf.replace("地区:", "")
|
||||
if inf.startswith('年份'):
|
||||
vod['vod_year'] = inf.replace("年份:", "")
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content.replace("\xa0", "/").replace("主演:", "").strip('/')
|
||||
if content.startswith('更新'):
|
||||
vod['vod_remarks'] = content.replace("更新:", "")
|
||||
if content.startswith('导演'):
|
||||
vod['vod_director'] = content.replace("\xa0", "").replace("导演:", "").strip('/')
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = divContent.xpath(".//div[@class='myui-panel_hd']/div/ul/li/a[contains(@href,'playlist')]/text()")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v.replace(" ", ""))
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = divContent.xpath(".//div[contains(@id,'playlist')]")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./ul/li/a')
|
||||
if len(aList) <= 0:
|
||||
name = '无法找到播放源'
|
||||
tId = '00000'
|
||||
vodItems.append(name + "$" + tId)
|
||||
else:
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath("./text()")[0].replace(" ", "")
|
||||
tId = self.regStr(href, '/vodplay/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'https://www.30dian.cn/vodsearch/-------------.html?wd={0}'.format(key)
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36"}
|
||||
rsp = self.fetch(url, headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//ul[contains(@class,'myui-vodlist__media clearfix')]/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath(".//div[@class='detail']/h4/a/text()")[0]
|
||||
pic = a.xpath(".//a[contains(@class,'myui-vodlist__thumb')]//@data-original")[0]
|
||||
mark = a.xpath(".//span[@class='tag']/text()")[0]
|
||||
sid = a.xpath(".//div[@class='detail']/h4/a/@href")[0]
|
||||
sid = self.regStr(sid,'/voddetail/(\\S+).html')
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
def parseCBC(self, enc, key, iv):
|
||||
keyBytes = key.encode("utf-8")
|
||||
ivBytes = iv.encode("utf-8")
|
||||
cipher = AES.new(keyBytes, AES.MODE_CBC, ivBytes)
|
||||
msg = cipher.decrypt(enc)
|
||||
paddingLen = msg[len(msg) - 1]
|
||||
return msg[0:-paddingLen]
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36"}
|
||||
if id == '00000':
|
||||
return {}
|
||||
url = 'https://www.30dian.cn/vodplay/{0}.html'.format(id)
|
||||
rsp = self.fetch(url,headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
scripts = root.xpath("//div[@class='embed-responsive clearfix']/script[@type='text/javascript']/text()")[0]
|
||||
ukey = re.findall(r"url(.*)url_next", scripts)[0].replace('"', "").replace(',', "").replace(':', "")
|
||||
pf = re.findall(r'\"from\":\"(.*?)\"', scripts)[0]
|
||||
purl = urllib.parse.unquote(ukey)
|
||||
if purl.startswith('http'):
|
||||
purl = purl
|
||||
if pf == 'wjm3u8':
|
||||
prsp = self.fetch(purl, headers=header)
|
||||
purle = prsp.text.strip('\n').split('\n')[-1]
|
||||
purls = re.findall(r"http.*://.*?/", purl)[0].strip('/')
|
||||
purl = purls + purle
|
||||
else:
|
||||
scrurl = 'https://vip.30dian.cn/?url={0}'.format(purl)
|
||||
script = self.fetch(scrurl,headers=header)
|
||||
html = script.text
|
||||
pat = 'var le_token = \\"([\\d\\w]+)\\"'
|
||||
cpat = 'getVideoInfo\\(\\"(.*)\\"\\)'
|
||||
content = self.regStr(html, cpat)
|
||||
iv = self.regStr(html, pat)
|
||||
key = 'A42EAC0C2B408472'
|
||||
purl = self.parseCBC(base64.b64decode(content), key, iv).decode()
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = purl
|
||||
result["header"] = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def localProxy(self, param):
|
||||
action = {
|
||||
'url': '',
|
||||
'header': '',
|
||||
'param': '',
|
||||
'type': 'string',
|
||||
'after': ''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,300 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import base64
|
||||
import hashlib
|
||||
import requests
|
||||
from Crypto.Cipher import AES
|
||||
import urllib
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "厂长资源"
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"豆瓣电影Top250": "dbtop250",
|
||||
"最新电影": "zuixindianying",
|
||||
"电视剧": "dsj",
|
||||
"国产剧": "gcj",
|
||||
"美剧": "meijutt",
|
||||
"韩剧": "hanjutv",
|
||||
"番剧": "fanju",
|
||||
"动漫": "dm"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
url = "https://czspp.com"
|
||||
header = {
|
||||
"Connection": "keep-alive",
|
||||
"Referer": url,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
|
||||
}
|
||||
session = self.getCookie(url,header)
|
||||
rsp = session.get(url, headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//div[@class='mi_btcon']//ul/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./a/img/@alt')[0]
|
||||
pic = a.xpath('./a/img/@data-original')[0]
|
||||
mark = a.xpath("./div[@class='hdinfo']/span/text()")[0]
|
||||
sid = a.xpath("./a/@href")[0]
|
||||
sid = self.regStr(sid, "/movie/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def getCookie(self,url,header):
|
||||
session = requests.session()
|
||||
rsp = session.get(url)
|
||||
nurl = 'https://czspp.com' + self.regStr(rsp.text, 'src=\"(.*?)\"')
|
||||
nrsp = session.get(nurl, headers=header)
|
||||
key = self.regStr(nrsp.text, 'var key=\"(.*?)\"')
|
||||
avalue = self.regStr(nrsp.text, 'value=\"(.*?)\"')
|
||||
c = ''
|
||||
for i in range(0, len(avalue)):
|
||||
a = avalue[i]
|
||||
b = ord(a)
|
||||
c = c + str(b)
|
||||
value = hashlib.md5(c.encode()).hexdigest()
|
||||
session.get('https://czspp.com/a20be899_96a6_40b2_88ba_32f1f75f1552_yanzheng_ip.php?type=96c4e20a0e951f471d32dae103e83881&key={0}&value={1}'.format(key,value), headers=header)
|
||||
return session
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
url = 'https://czspp.com/{0}/page/{1}'.format(tid,pg)
|
||||
header = {
|
||||
"Connection": "keep-alive",
|
||||
"Referer": url,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
|
||||
}
|
||||
session = self.getCookie(url,header)
|
||||
rsp = session.get(url, headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//div[contains(@class,'bt_img mi_ne_kd mrb')]/ul/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./a/img/@alt')[0]
|
||||
pic = a.xpath('./a/img/@data-original')[0]
|
||||
mark = a.xpath(".//div[@class='jidi']/span/text()")
|
||||
if mark ==[]:
|
||||
mark = a.xpath("./div[@class='hdinfo']/span/text()")
|
||||
mark = mark[0]
|
||||
sid = a.xpath("./a/@href")[0]
|
||||
sid = self.regStr(sid, "/movie/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def detailContent(self, array):
|
||||
tid = array[0]
|
||||
url = 'https://czspp.com/movie/{0}.html'.format(tid)
|
||||
header = {
|
||||
"Connection": "keep-alive",
|
||||
"Referer": url,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
|
||||
}
|
||||
session = self.getCookie(url, header)
|
||||
rsp = session.get(url, headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
node = root.xpath("//div[@class='dyxingq']")[0]
|
||||
pic = node.xpath(".//div[@class='dyimg fl']/img/@src")[0]
|
||||
title = node.xpath('.//h1/text()')[0]
|
||||
detail = root.xpath(".//div[@class='yp_context']//p/text()")[0]
|
||||
vod = {
|
||||
"vod_id": tid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": "",
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": "",
|
||||
"vod_actor": "",
|
||||
"vod_director": "",
|
||||
"vod_content": detail
|
||||
}
|
||||
infoArray = node.xpath(".//ul[@class='moviedteail_list']/li")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
if content.startswith('地区'):
|
||||
tpyeare = ''
|
||||
for inf in info:
|
||||
tn = inf.text
|
||||
tpyeare = tpyeare +'/'+'{0}'.format(tn)
|
||||
vod['vod_area'] = tpyeare.strip('/')
|
||||
if content.startswith('年份'):
|
||||
vod['vod_year'] = content.replace("年份:","")
|
||||
if content.startswith('主演'):
|
||||
tpyeact = ''
|
||||
for inf in info:
|
||||
tn = inf.text
|
||||
tpyeact = tpyeact +'/'+'{0}'.format(tn)
|
||||
vod['vod_actor'] = tpyeact.strip('/')
|
||||
if content.startswith('导演'):
|
||||
tpyedire = ''
|
||||
for inf in info:
|
||||
tn = inf.text
|
||||
tpyedire = tpyedire +'/'+'{0}'.format(tn)
|
||||
vod['vod_director'] = tpyedire .strip('/')
|
||||
vod_play_from = '$$$'
|
||||
playFrom = ['厂长']
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath("//div[@class='paly_list_btn']")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('./text()')[0].replace('\xa0','')
|
||||
tId = self.regStr(href, '/v_play/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'https://czspp.com/xssearch?q={0}'.format(urllib.parse.quote(key))
|
||||
header = {
|
||||
"Connection": "keep-alive",
|
||||
"Referer": url,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
|
||||
}
|
||||
session = self.getCookie(url, header)
|
||||
rsp = session.get(url, headers=header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
vodList = root.xpath("//div[contains(@class,'mi_ne_kd')]/ul/li/a")
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
name = vod.xpath('./img/@alt')[0]
|
||||
pic = vod.xpath('./img/@data-original')[0]
|
||||
href = vod.xpath('./@href')[0]
|
||||
tid = self.regStr(href, 'movie/(\\S+).html')
|
||||
res = vod.xpath('./div[@class="jidi"]/span/text()')
|
||||
if len(res) == 0:
|
||||
remark = '全1集'
|
||||
else:
|
||||
remark = vod.xpath('./div[@class="jidi"]/span/text()')[0]
|
||||
videos.append({
|
||||
"vod_id": tid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {
|
||||
"Referer": "https://czspp.com/",
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36"
|
||||
}
|
||||
def parseCBC(self, enc, key, iv):
|
||||
keyBytes = key.encode("utf-8")
|
||||
ivBytes = iv.encode("utf-8")
|
||||
cipher = AES.new(keyBytes, AES.MODE_CBC, ivBytes)
|
||||
msg = cipher.decrypt(enc)
|
||||
paddingLen = msg[len(msg) - 1]
|
||||
return msg[0:-paddingLen]
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
url = 'https://czspp.com/v_play/{0}.html'.format(id)
|
||||
header = {
|
||||
"Connection": "keep-alive",
|
||||
"Referer": url,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
|
||||
}
|
||||
session = self.getCookie(url, header)
|
||||
pat = '\\"([^\\"]+)\\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\\"([\\d\\w]+)\\".*md5.enc.Utf8.parse\\(([\\d]+)\\)'
|
||||
rsp = session.get(url, headers=header)
|
||||
html = rsp.text
|
||||
content = self.regStr(html, pat)
|
||||
if content == '':
|
||||
str3 = url
|
||||
pars = 1
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
|
||||
}
|
||||
else:
|
||||
key = self.regStr(html, pat, 2)
|
||||
iv = self.regStr(html, pat, 3)
|
||||
decontent = self.parseCBC(base64.b64decode(content), key, iv).decode()
|
||||
urlPat = 'video: \\{url: \\\"([^\\\"]+)\\\"'
|
||||
vttPat = 'subtitle: \\{url:\\\"([^\\\"]+\\.vtt)\\\"'
|
||||
str3 = self.regStr(decontent, urlPat)
|
||||
str4 = self.regStr(decontent, vttPat)
|
||||
self.loadVtt(str3)
|
||||
pars = 0
|
||||
header = ''
|
||||
if len(str4) > 0:
|
||||
result['subf'] = '/vtt/utf-8'
|
||||
result['subt'] = ''
|
||||
result = {
|
||||
'parse': pars,
|
||||
'playUrl': '',
|
||||
'url': str3,
|
||||
'header': header
|
||||
}
|
||||
return result
|
||||
|
||||
|
||||
def loadVtt(self, url):
|
||||
pass
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def localProxy(self, param):
|
||||
action = {}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,128 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
host_url = 'https://frodo.douban.com/api/v2'
|
||||
apikey = "?apikey=0ac44ae016490db2204ce0a042db2916"
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "豆瓣"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"热门电影": "hot_gaia",
|
||||
"热播剧集": "tv_hot",
|
||||
"热播综艺": "show_hot",
|
||||
"电影筛选": "movie",
|
||||
"电视筛选": "tv",
|
||||
"电影榜单": "rank_list_movie",
|
||||
"电视榜单": "rank_list_tv"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
url = host_url + '/subject_collection/subject_real_time_hotest/items' + apikey
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
joList = jo.get("subject_collection_items")
|
||||
lists = []
|
||||
for item in joList:
|
||||
rating = item['rating']['value'] if item['rating'] else ""
|
||||
lists.append({
|
||||
"vod_id": f'msearch:{item.get("type", "")}__{item.get("id", "")}',
|
||||
"vod_name": item['title'],
|
||||
"vod_pic": item['pic']['normal'],
|
||||
"vod_remarks": rating
|
||||
})
|
||||
result = {
|
||||
'list':lists
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
if extend:
|
||||
sort = extend.pop('sort') if "sort" in extend else "T"
|
||||
tags = ",".join(item for item in extend.values())
|
||||
else:
|
||||
sort = "T"
|
||||
tags = ""
|
||||
if tid == "hot_gaia":
|
||||
urlpath = f"/movie/{tid}"
|
||||
getdata = "items"
|
||||
sort = extend.get("sort", "recommend")
|
||||
area = extend.get("area", "全部")
|
||||
sort = sort + "&area=" + area
|
||||
elif tid == "tv_hot" or tid == "show_hot":
|
||||
urlpath = f"/subject_collection/{tid}/items"
|
||||
getdata = "subject_collection_items"
|
||||
elif tid.startswith("rank_list"):
|
||||
id = "movie_real_time_hotest" if tid == "rank_list_movie" else "tv_real_time_hotest"
|
||||
urlpath = f"/subject_collection/{id}/items"
|
||||
getdata = "subject_collection_items"
|
||||
else:
|
||||
urlpath = f"/{tid}/recommend"
|
||||
getdata = "items"
|
||||
|
||||
url = host_url + urlpath + apikey + '&sort=' + sort + '&tags=' + tags + '&start=' + pg
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
jolist = jo[getdata]
|
||||
|
||||
videos = []
|
||||
for vod in jolist:
|
||||
rating = vod.get("rating", "").get("value", "") if vod.get("rating", "") else ""
|
||||
pic = vod.get("pic", "").get("normal", "") if vod.get("pic", "") else ""
|
||||
videos.append({
|
||||
"vod_id": f'msearch:{vod.get("type", "")}__{vod.get("id", "")}',
|
||||
"vod_name": vod['title'],
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": rating
|
||||
})
|
||||
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
pass
|
||||
def searchContent(self,key,quick):
|
||||
pass
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
pass
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"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"}]}]}
|
||||
}
|
||||
header = {
|
||||
"Host": "frodo.douban.com",
|
||||
"Connection": "Keep-Alive",
|
||||
"Referer": "https://servicewechat.com/wx2f9b06c1de1ccfca/84/page-frame.html",
|
||||
"content-type": "application/json",
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat"
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,138 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "斗鱼"
|
||||
def init(self,extend=""):
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"热门游戏": "热门游戏",
|
||||
"主机游戏": "主机游戏",
|
||||
"原创IP": "原创IP"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'http://live.yj1211.work/api/live/getRecommendByPlatformArea?platform=douyu&size=20&area={0}&page={1}'.format(tid, pg)
|
||||
rsp = self.fetch(url)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']
|
||||
for vod in vodList:
|
||||
aid = (vod['roomId']).strip()
|
||||
title = vod['roomName'].strip()
|
||||
img = vod['roomPic'].strip()
|
||||
remark = (vod['ownerName']).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "http://live.yj1211.work/api/live/getRoomInfo?platform=douyu&roomId={0}".format(aid)
|
||||
rsp = self.fetch(url)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
title = jo['roomName']
|
||||
pic = jo['roomPic']
|
||||
desc = str(jo['online'])
|
||||
dire = jo['ownerName']
|
||||
typeName = jo['categoryName']
|
||||
remark = jo['categoryName']
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": '在线人数:' + desc,
|
||||
"vod_director": dire,
|
||||
"vod_content": ""
|
||||
}
|
||||
playUrl = '原画' + '${0}#'.format(aid)
|
||||
vod['vod_play_from'] = '斗鱼直播'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = 'http://live.yj1211.work/api/live/getRealUrl?platform=douyu&roomId={0}'.format(id)
|
||||
rsp = self.fetch(url)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if len(jRoot['data']) == 0:
|
||||
return {}
|
||||
jo = jRoot['data']
|
||||
ja = jo['OD']
|
||||
url = ja
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
def localProxy(self,param):
|
||||
action = {
|
||||
'url':'',
|
||||
'header':'',
|
||||
'param':'',
|
||||
'type':'string',
|
||||
'after':''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,161 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import re
|
||||
import math
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "体育直播"
|
||||
def init(self,extend=""):
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"全部": ""
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'http://www.freezb.live/'
|
||||
rsp = self.fetch(url)
|
||||
html = self.html(rsp.text)
|
||||
aList = html.xpath("//tr[@class='match_main']")
|
||||
videos = []
|
||||
img = 'https://s1.ax1x.com/2022/10/07/x3NPUO.png'
|
||||
for a in aList:
|
||||
urlList = a.xpath("./td[@class='update_data live_link']/a")
|
||||
stat = a.xpath("./td[contains(@style, 'font-weight:bold')]/sapn/@title")[0]
|
||||
time = a.xpath("./td[contains(@style, 'font-weight:bold')]/sapn/text()")[0]
|
||||
if '比分' not in urlList[0].xpath("./text()")[0] and stat == '直播中':
|
||||
remark = a.xpath(".//p[@class='raceclass matchcolor']/@title")[0].replace('直播','') + '|' + time
|
||||
name = a.xpath("string(./td[4])").replace(' ','').replace('\tVS','VS')
|
||||
if 'VS' not in name:
|
||||
names = name.split('\t')
|
||||
remark = names[0] + '|' + time
|
||||
name = names[-1].replace('vs','VS')
|
||||
aid = ''
|
||||
for url in urlList:
|
||||
title = url.xpath("./text()")[0]
|
||||
aurl = url.xpath("./@href")[0]
|
||||
aurl = self.regStr(reg=r'/tv/(.*?).html', src=aurl)
|
||||
if '比分' not in title:
|
||||
aid = aid + title + '@@@' + aurl + '#'
|
||||
videos.append({
|
||||
"vod_id": name + '###' + remark.split('|')[0] + '###' + aid,
|
||||
"vod_name": name,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
numvL = len(videos)
|
||||
pgc = math.ceil(numvL/15)
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = pgc
|
||||
result['limit'] = numvL
|
||||
result['total'] = numvL
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
aids = aid.split('###')
|
||||
name = aids[0]
|
||||
typeName = aids[1]
|
||||
tus = aids[2].strip('#').split('#')
|
||||
pic = 'https://s1.ax1x.com/2022/10/07/x3NPUO.png'
|
||||
vod = {
|
||||
"vod_id": name,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": '',
|
||||
"vod_actor": '',
|
||||
"vod_director":'',
|
||||
"vod_content": ''
|
||||
}
|
||||
purl = ''
|
||||
for tu in tus:
|
||||
title = tu.split('@@@')[0]
|
||||
uid = tu.split('@@@')[1]
|
||||
url = "http://www.freezb.live/tv/{0}.html".format(uid)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
phpurl = root.xpath("//div[@class='media']/iframe/@src")[0]
|
||||
purl = purl + '{0}${1}@@@{2}'.format(title,phpurl,uid) + '#'
|
||||
vod['vod_play_from'] = '体育直播'
|
||||
vod['vod_play_url'] = purl
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
ids = id.split('@@@')
|
||||
url = ids[0]
|
||||
vid = ids[1]
|
||||
headers = {
|
||||
"referer": "http://www.freezb.live/tv/{0}.html".format(vid),
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
|
||||
}
|
||||
rsp = self.fetch(url,headers=headers)
|
||||
aurl = self.regStr(reg=r'\"../(.*?)\"', src=rsp.text)
|
||||
if aurl =='':
|
||||
url = self.regStr(reg=r"url: \'(.*?)\'", src=rsp.text)
|
||||
else:
|
||||
pheaders = {
|
||||
"referer": url,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
|
||||
}
|
||||
purl = self.regStr(reg=r'(.*)/', src=url) + '/' + aurl
|
||||
prsp = self.fetch(purl, headers=pheaders)
|
||||
url = self.regStr(reg=r"url: \'(.*?)\'", src=prsp.text)
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
action = {
|
||||
'url':'',
|
||||
'header':'',
|
||||
'param':'',
|
||||
'type':'string',
|
||||
'after':''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,202 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "我爱跟剧"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
# genmov
|
||||
# https://www.genmov.com/v/yinyue.html
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影":"dianying",
|
||||
"连续剧":"lianxuju",
|
||||
"动漫":"dongman",
|
||||
"综艺":"zongyi",
|
||||
"少儿":"shaoer",
|
||||
"音乐":"yinyue"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://www.genmov.com/",headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//div[@class='module module-wrapper']//div[@class='module-item']")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath(".//div[@class='module-item-pic']/a/@title")[0]
|
||||
pic = a.xpath(".//div[@class='module-item-pic']/img/@data-src")[0]
|
||||
mark = a.xpath("./div[@class='module-item-text']/text()")[0]
|
||||
sid = a.xpath(".//div[@class='module-item-pic']/a/@href")[0]
|
||||
sid = self.regStr(sid,"/video/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
urlParams = ["", "", "", "", "", "", "", "", "", "", "", ""]
|
||||
urlParams[0] = tid
|
||||
urlParams[8] = pg
|
||||
for key in extend:
|
||||
urlParams[int(key)] = extend[key]
|
||||
params = '-'.join(urlParams)
|
||||
url = 'https://www.genmov.com/vodshow/{0}.html'.format(params)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//div[@class='module-items']/div[@class='module-item']")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath(".//div[@class='module-item-pic']/a/@title")[0]
|
||||
pic = a.xpath(".//div[@class='module-item-pic']/img/@data-src")[0]
|
||||
mark = a.xpath("./div[@class='module-item-text']/text()")[0]
|
||||
sid = a.xpath(".//div[@class='module-item-pic']/a/@href")[0]
|
||||
sid = self.regStr(sid,"/video/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
# video-info-header
|
||||
tid = array[0]
|
||||
url = 'https://www.genmov.com/video/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
title = root.xpath(".//h1[@class='page-title']/text()")[0]
|
||||
pic = root.xpath(".//div[@class='video-cover']//img/@data-src")[0]
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":"",
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":""
|
||||
}
|
||||
infoArray = root.xpath(".//div[@class='video-info-items']")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
# if content.startswith('类型'):
|
||||
# vod['type_name'] = content
|
||||
# if content.startswith('年份'):
|
||||
# vod['vod_year'] = content
|
||||
# if content.startswith('地区'):
|
||||
# vod['vod_area'] = content
|
||||
if content.startswith('集数'):
|
||||
vod['vod_remarks'] = content
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content
|
||||
if content.startswith('导演'):
|
||||
vod['vod_director'] = content
|
||||
if content.startswith('剧情'):
|
||||
vod['vod_content'] = content
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath(".//main[@id='main']//div[@class='module-heading']//div[contains(@class,'module-tab-item')]/span/text()")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v)
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath(".//main[@id='main']//div[contains(@class,'module-list')]//div[@class='sort-item']")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('./span/text()')[0]
|
||||
tId = self.regStr(href,'/play/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
# https://www.genmov.com/play/301475-1-1.html
|
||||
# https://www.genmov.com/static/js/playerconfig.js
|
||||
url = 'https://www.genmov.com/play/{0}.html'.format(id)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
scripts = root.xpath("//script/text()")
|
||||
jo = {}
|
||||
for script in scripts:
|
||||
if(script.startswith("var player_")):
|
||||
target = script[script.index('{'):]
|
||||
jo = json.loads(target)
|
||||
break;
|
||||
result = {}
|
||||
parseUrl = ""
|
||||
playerConfig = self.config['player']
|
||||
if jo['from'] in self.config['player']:
|
||||
parser = self.config['player'][jo['from']]
|
||||
originUrl = jo['url']
|
||||
parseUrl = parser['parse']
|
||||
|
||||
result["parse"] = parser['ps']
|
||||
result["playUrl"] = parseUrl
|
||||
result["url"] = originUrl
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
cookie = {}
|
||||
config = {
|
||||
"player": {"dplayer":{"show":"默认","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"qqy":{"show":"预告专用","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"qiyi":{"show":"爱奇艺","des":"qiyi.com","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"youku":{"show":"优酷","des":"youku.com","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"qq":{"show":"腾讯","des":"qq.com","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"mgtv":{"show":"芒果","des":"mgtv.com","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"letv":{"show":"乐视","des":"","ps":"1","parse":"https://jx.quanmingjiexi.com/?url="},"m1905":{"show":"电影网","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"bilibili":{"show":"哔哩哔哩","des":"","ps":"1","parse":"https://jx.bozrc.com:4433/player/?url="},"sohu":{"show":"搜狐","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"lzm3u8":{"show":"量子资源1","des":"支持手机电脑在线播放","ps":"0","parse":""},"ss4m3u8":{"show":"松鼠资源4","des":"支持手机电脑在线播放","ps":"0","parse":""},"ss3m3u8":{"show":"松鼠资源3","des":"支持手机电脑在线播放","ps":"0","parse":""},"ss2m3u8":{"show":"松鼠资源2","des":"支持手机电脑在线播放","ps":"0","parse":""},"ss1m3u8":{"show":"松鼠资源1","des":"支持手机电脑在线播放","ps":"0","parse":""},"jinyingm3u8":{"show":"金鹰资源②","des":"支持手机电脑在线播放","ps":"0","parse":""},"cmpyun":{"show":"冠军资源①","des":"支持手机电脑在线播放","ps":"0","parse":""},"kcm3u8":{"show":"快车资源①","des":"支持手机电脑在线播放","ps":"0","parse":""},"xlm3u8":{"show":"新浪资源2","des":"支持手机电脑在线播放","ps":"0","parse":""},"ssyun":{"show":"神速资源1","des":"支持手机电脑在线播放","ps":"0","parse":""},"ssm3u8":{"show":"神速资源2","des":"支持手机电脑在线播放","ps":"0","parse":""},"wolong":{"show":"卧龙资源","des":"支持手机电脑在线播放","ps":"1","parse":"https://vip.2ktvb.com/?url="},"ptzy":{"show":"葡萄资源","des":"支持手机电脑在线播放","ps":"0","parse":""},"zgzy":{"show":"猪哥播放器","des":"支持手机电脑在线播放","ps":"0","parse":""},"ukm3u8":{"show":"U酷点播","des":"支持手机电脑在线播放","ps":"0","parse":""},"fsm3u8":{"show":"飞速播放器","des":"支持手机电脑在线播放","ps":"0","parse":""},"mim3u8":{"show":"大米播放器","des":"支持手机电脑在线播放","ps":"0","parse":""},"if101":{"show":"if101播放器","des":"支持手机电脑在线播放","ps":"0","parse":""},"sgm3u8":{"show":"速更播放器","des":"支持手机电脑在线播放","ps":"0","parse":""},"kdm3u8":{"show":"酷点播放器","des":"支持手机电脑在线播放","ps":"0","parse":""},"xiuse":{"show":"秀色播放","des":"支持手机电脑在线播放","ps":"0","parse":""},"swm3u8":{"show":"丝袜播放器","des":"支持手机电脑在线播放","ps":"0","parse":""},"bdxm3u8":{"show":"北斗星m3u8","des":"支持手机电脑在线播放","ps":"0","parse":""},"hjm3u8":{"show":"花椒播放器","des":"支持手机电脑在线播放","ps":"0","parse":""},"kbzy":{"show":"快播云播","des":"支持手机电脑在线播放","ps":"0","parse":""},"88zym3u8":{"show":"88在线","des":"支持手机电脑在线播放","ps":"0","parse":""},"lezy":{"show":"乐库云播","des":"支持手机电脑在线播放","ps":"0","parse":""},"kkyun":{"show":"酷酷云播","des":"支持手机电脑在线播放","ps":"0","parse":""},"kkm3u8":{"show":"KK在线","des":"支持手机电脑在线播放","ps":"0","parse":""},"tpm3u8":{"show":"淘片播放器","des":"支持手机电脑在线播放","ps":"0","parse":""},"ckm3u8":{"show":"ck资源","des":"支持手机电脑在线播放","ps":"0","parse":""},"bjyun":{"show":"八戒云播","des":"支持手机电脑在线播放","ps":"0","parse":""},"gsm3u8":{"show":"光速云资源②","des":"支持手机电脑在线播放","ps":"0","parse":""},"m3u8":{"show":"m3u8在线","des":"支持手机电脑在线播放","ps":"0","parse":""},"videojs":{"show":"videojs-H5播放器","des":"videojs.com","ps":"0","parse":""},"iva":{"show":"iva-H5播放器","des":"videojj.com","ps":"0","parse":""},"iframe":{"show":"外链数据","des":"iframe外链数据","ps":"0","parse":""},"link":{"show":"外链数据","des":"外部网站播放链接","ps":"0","parse":""},"swf":{"show":"Flash文件","des":"swf","ps":"0","parse":""},"flv":{"show":"Flv文件","des":"flv","ps":"0","parse":""},"pptv":{"show":"PPTV","des":"pptv","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"migu":{"show":"咪咕","des":"migu","ps":"0","parse":"https://vip.2ktvb.com/player/sg.php?url="},"cctv":{"show":"cctv","des":"cctv","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"cntv":{"show":"cntv","des":"cntv","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"funshion":{"show":"风行","des":"funshion","ps":"1","parse":"hhttps://vip.2ktvb.com/player/sg.php?url="},"wasu":{"show":"华数","des":"wasu","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"605m3u8":{"show":"605线","des":"支持手机电脑在线播放","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"bjm3u8":{"show":"八戒","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"dbm3u8":{"show":"百度线","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"hnm3u8":{"show":"牛牛线","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"igen":{"show":"爱跟线","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"kbm3u8":{"show":"快播线","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"lajiao":{"show":"辣椒","des":"","ps":"1","parse":"https://lajiaoapi.com/watch?url="},"tkm3u8":{"show":"天空线","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"tsm3u8":{"show":"Ts线","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"wjm3u8":{"show":"无尽线","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"xigua":{"show":"西瓜线","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/sg.php?url="},"xkm3u8":{"show":"想看线","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"jhyun":{"show":"聚合云","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"sdm3u8":{"show":"闪电线","des":"支持手机电脑在线播放","ps":"1","parse":"https://vip.2ktvb.com/player/?url="},"ddzy":{"show":"极速多线","des":"","ps":"1","parse":"https://bo.dd520.cc//xmplayer/?url="},"jscq":{"show":"极速超清","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?xf=languang&url="},"jslg":{"show":"极速蓝光","des":"","ps":"1","parse":"https://vip.2ktvb.com/player/?xf=languang&url="}},
|
||||
"filter": {"dianying":[{"key":3,"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":"魔幻"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"记录","v":"记录"},{"n":"情色","v":"情色"}]},{"key":1,"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":"其它"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"法语","v":"法语"},{"n":"德语","v":"德语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"lianxuju":[{"key":3,"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":"惊悚"},{"n":"爱情","v":"爱情"},{"n":"剧情","v":"剧情"},{"n":"奇幻","v":"奇幻"},{"n":"仙侠","v":"仙侠"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"dongman":[{"key":3,"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":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"日本","v":"日本"},{"n":"欧美","v":"欧美"},{"n":"其他","v":"其他"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"zongyi":[{"key":3,"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":"音乐MV","v":"音乐MV"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"其它","v":"其它"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"shaoer":[{"key":3,"name":"分类","value":[{"n":"全部","v":""},{"n":"历险","v":"历险"},{"n":"奇幻","v":"奇幻"},{"n":"教育","v":"教 育"},{"n":"搞笑","v":"搞笑"},{"n":"教育","v":"教育"},{"n":"益智","v":"益智"}]},{"key":1,"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":"其它"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"法语","v":"法语"},{"n":"德语","v":"德语"},{"n":"其它","v":"其它"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"yinyue":[{"key":3,"name":"分类","value":[{"n":"全部","v":""},{"n":"MV","v":"MV"},{"n":"演唱会","v":"演唱会"},{"n":"音频","v":"音频"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"}]},{"key":4,"name":"语言","value":[{"n":"全部","v":""},{"n":"韩语","v":"韩语"},{"n":"粤语","v":"粤语"},{"n":"日语","v":"日语"},{"n":"英语","v":"英语"},{"n":"泰语","v":"泰语"},{"n":"国语","v":"国语"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}]}
|
||||
}
|
||||
header = {
|
||||
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,216 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "剧迷"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
# https://gimytv.co/
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "movies",
|
||||
"电视剧": "tvseries",
|
||||
"综艺": "tv_show",
|
||||
"动漫": "anime"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://gimytv.co/",headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//ul[@class='myui-vodlist clearfix']/li/div/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath("./@title")[0]
|
||||
pic = a.xpath("./@data-original")[0]
|
||||
mark = a.xpath("./span[contains(@class, 'pic-text')]/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
urlParams = ["", "", "", ""]
|
||||
urlParams[0] = tid
|
||||
urlParams[3] = pg
|
||||
suffix = ''
|
||||
for key in extend:
|
||||
if key == 4:
|
||||
suffix = '/by/'+extend[key]
|
||||
else:
|
||||
urlParams[int(key)] = extend[key]
|
||||
params = '-'.join(urlParams)+suffix
|
||||
# https://gimytv.co/genre/tvseries--2022-/by/hits_month.html
|
||||
url = 'https://gimytv.com/genre/{0}.html'.format(params)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//ul[@class='myui-vodlist clearfix']/li/div/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath("./@title")[0]
|
||||
pic = a.xpath("./@data-original")[0]
|
||||
mark = a.xpath("./span[contains(@class, 'pic-text')]/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'https://gimytv.co/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
node = root.xpath("//div[@class='container']")[0]
|
||||
title = node.xpath(".//div[@class='myui-content__thumb']/a/@title")[0]
|
||||
pic = node.xpath(".//div[@class='myui-content__thumb']/a/img/@data-original")[0]
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":"",
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":""
|
||||
}
|
||||
infoArray = node.xpath(".//div[@class='myui-content__detail']/p")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
if content.startswith('分類'):
|
||||
vod['type_name'] = content
|
||||
# if content.startswith('年份'):
|
||||
# vod['vod_year'] = content
|
||||
# if content.startswith('地区'):
|
||||
# vod['vod_area'] = content
|
||||
if content.startswith('狀態'):
|
||||
vod['vod_remarks'] = content
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content
|
||||
if content.startswith('導演'):
|
||||
vod['vod_director'] = content
|
||||
# if content.startswith('剧情'):
|
||||
# vod['vod_content'] = content
|
||||
vod['vod_content'] = node.xpath(".//div[contains(@class,'col-pd')]/p/text()")[0]
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath(".//div[@class='myui-panel_hd']/div/h3/text()[2]")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v.strip())
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath(".//ul[contains(@class,'myui-content__list')]")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./li/a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('./text()')[0]
|
||||
tId = self.regStr(href,'/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
url = "https://gimytv.co/search/-------------.html?wd={0}".format(key)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//ul[contains(@class,'myui-vodlist__media')]/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath(".//a/@title")[0]
|
||||
pic = a.xpath(".//a/@data-original")[0]
|
||||
mark = a.xpath(".//span[contains(@class, 'pic-text')]/text()")[0]
|
||||
sid = a.xpath(".//a/@href")[0]
|
||||
sid = self.regStr(sid,"/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
url = 'https://gimytv.co/{0}.html'.format(id)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
scripts = root.xpath("//script/text()")
|
||||
jo = {}
|
||||
for script in scripts:
|
||||
if(script.startswith("var player_")):
|
||||
target = script[script.index('{'):]
|
||||
jo = json.loads(target)
|
||||
break;
|
||||
url = jo['url']
|
||||
result = {}
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
cookie = {}
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"movies":[{"key":0,"name":"分类","value":[{"n":"全部","v":""},{"n":"劇情片","v":"drama"},{"n":"動作片","v":"action"},{"n":"科幻片","v":"scifi"},{"n":"喜劇片","v":"comedymovie"},{"n":"愛情片","v":"romance"},{"n":"戰爭片","v":"war"},{"n":"恐怖片","v":"horror"},{"n":"動畫電影","v":"animation"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"美國","v":"美國"},{"n":"歐美","v":"歐美"},{"n":"大陸","v":"大陸"},{"n":"中國大陸","v":"中國大陸"},{"n":"韓國","v":"韓國"},{"n":"香港","v":"香港"},{"n":"日本","v":"日本"},{"n":"英國","v":"英國"}]},{"key":2,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"}]},{"key":4,"name":"排序","value":[{"n":"按更新","v":"time"},{"n":"周人气","v":"hits_week"},{"n":"月人气","v":"hits_month"}]}],"tvseries":[{"key":0,"name":"分类","value":[{"n":"全部","v":""},{"n":"陸劇","v":"cn"},{"n":"韓劇","v":"kr"},{"n":"美劇","v":"us"},{"n":"日劇","v":"jp"},{"n":"台劇","v":"tw"},{"n":"港劇","v":"hks"},{"n":"海外劇","v":"ot"},{"n":"紀錄片","v":"documentary"}]},{"key":2,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"}]},{"key":4,"name":"排序","value":[{"n":"按更新","v":"time"},{"n":"周人气","v":"hits_week"},{"n":"月人气","v":"hits_month"}]}],"anime":[{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"日本"},{"n":"美國","v":"美國"},{"n":"歐美","v":"歐美"},{"n":"大陸","v":"大陸"},{"n":"臺灣","v":"臺灣"},{"n":"香港","v":"香港"}]},{"key":2,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"}]},{"key":4,"name":"排序","value":[{"n":"按更新","v":"time"},{"n":"周人气","v":"hits_week"},{"n":"月人气","v":"hits_month"}]}],"tv_show":[{"key":0,"name":"分类","value":[{"n":"全部","v":""},{"n":"纪录片","v":"28"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"大陸","v":"大陸"},{"n":"中國大陸","v":"中國大陸"},{"n":"韓國","v":"韓國"},{"n":"臺灣","v":"臺灣"},{"n":"美國","v":"美國"},{"n":"歐美","v":"歐美"},{"n":"日本","v":"日本"},{"n":"香港","v":"香港"}]},{"key":2,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"}]},{"key":4,"name":"排序","value":[{"n":"按更新","v":"time"},{"n":"周人气","v":"hits_week"},{"n":"月人气","v":"hits_month"}]}]}
|
||||
}
|
||||
header = {
|
||||
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,136 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import requests
|
||||
import json
|
||||
|
||||
class Spider(Spider):
|
||||
def getDependence(self):
|
||||
return ['py_ali']
|
||||
def getName(self):
|
||||
return "py_gitcafe"
|
||||
def init(self,extend):
|
||||
self.ali = extend[0]
|
||||
print("============py_gitcafe============")
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"华语电视" :"hyds",
|
||||
"日韩电视" :"rhds",
|
||||
"欧美电视" :"omds",
|
||||
"其他电视" :"qtds",
|
||||
"华语电影" :"hydy",
|
||||
"日韩电影" :"rhdy",
|
||||
"欧美电影" :"omdy",
|
||||
"其他电影" :"qtdy",
|
||||
"华语动漫" :"hydm",
|
||||
"日韩动漫" :"rhdm",
|
||||
"欧美动漫" :"omdm",
|
||||
"纪录片" :"jlp",
|
||||
"综艺片" :"zyp",
|
||||
"教育培训" :"jypx",
|
||||
"其他视频" :"qtsp",
|
||||
"华语音乐" :"hyyy",
|
||||
"日韩音乐" :"rhyy",
|
||||
"欧美音乐" :"omyy",
|
||||
"其他音乐" :"qtyy"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if filter:
|
||||
result['filter'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
if len(self.homeData.keys()) == 0:
|
||||
url = self.baseUrl+'/alipaper/home.json'
|
||||
self.homeData = self.fetch(url,headers=self.header).json()
|
||||
cateList = self.homeData['data']
|
||||
videos = []
|
||||
for cate in cateList:
|
||||
if cate['info']['code'] in self.category:
|
||||
vodList = cate['data']
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id":"https://www.aliyundrive.com/s/" + vod['key'],
|
||||
"vod_name":vod['title'],
|
||||
"vod_pic":'https://txc.gtimg.com/data/375895/2022/0214/d6b96cc3799b6417d30e4715d2973f64.png',
|
||||
"vod_remarks":''
|
||||
})
|
||||
result['list']=videos
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = self.baseUrl+'/tool/alipaper/'
|
||||
form = {
|
||||
"action": "viewcat",
|
||||
"cat": tid,
|
||||
"num":pg
|
||||
}
|
||||
|
||||
rsp = requests.post(url,headers=self.header,data=form)
|
||||
vodList = json.loads(self.cleanText(rsp.text))
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id": 'https://www.aliyundrive.com/s/'+vod["key"],
|
||||
"vod_name": vod["title"],
|
||||
"vod_pic": "https://txc.gtimg.com/data/375895/2022/0214/d6b96cc3799b6417d30e4715d2973f64.png",
|
||||
"vod_remarks": vod['cat']
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
category = ['hydm','hyds','hydy','omdm','omds','omdy','rhdm','rhds','rhdy','qtds','qtdy','qtsp','jlp','zyp']
|
||||
def detailContent(self,array):
|
||||
return self.ali.detailContent(array)
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
url = self.baseUrl+'/tool/alipaper/'
|
||||
form = {
|
||||
"action": "search",
|
||||
"keyword": key
|
||||
}
|
||||
vodList = requests.post(url,headers=self.header,data=form).json()
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id": 'https://www.aliyundrive.com/s/'+vod["key"],
|
||||
"vod_name": vod["title"],
|
||||
"vod_pic": "https://txc.gtimg.com/data/375895/2022/0214/d6b96cc3799b6417d30e4715d2973f64.png",
|
||||
"vod_remarks": vod['cat']
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
return self.ali.playerContent(flag,id,vipFlags)
|
||||
|
||||
homeData = {}
|
||||
baseUrl = 'https://gitcafe.net'
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 12; V2049A Build/SP1A.210812.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.129 Mobile Safari/537.36",
|
||||
"Referer": "https://u.gitcafe.net/"
|
||||
}
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,140 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "虎牙"
|
||||
def init(self,extend=""):
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"音乐": "音乐",
|
||||
"一起看": "一起看",
|
||||
"三国杀": "三国杀",
|
||||
"网游竞技": "网游竞技"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'http://live.yj1211.work/api/live/getRecommendByPlatformArea?platform=huya&size=20&area={0}&page={1}'.format(tid, pg)
|
||||
rsp = self.fetch(url)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']
|
||||
for vod in vodList:
|
||||
aid = (vod['roomId']).strip()
|
||||
title = vod['roomName'].strip()
|
||||
img = vod['roomPic'].strip()
|
||||
remark = (vod['ownerName']).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "http://live.yj1211.work/api/live/getRoomInfo?platform=huya&roomId={0}".format(aid)
|
||||
rsp = self.fetch(url)
|
||||
jRoot = json.loads(rsp.text)
|
||||
jo = jRoot['data']
|
||||
title = jo['roomName']
|
||||
pic = jo['roomPic']
|
||||
desc = str(jo['online'])
|
||||
dire = jo['ownerName']
|
||||
typeName = jo['categoryName']
|
||||
remark = jo['categoryName']
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": '在线人数:' + desc,
|
||||
"vod_director": dire,
|
||||
"vod_content": ""
|
||||
}
|
||||
playUrl = '原画' + '${0}#'.format(aid)
|
||||
vod['vod_play_from'] = '虎牙直播'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = 'https://mp.huya.com/cache.php?m=Live&do=profileRoom&roomid={0}'.format(id)
|
||||
rsp = self.fetch(url)
|
||||
jRoot = json.loads(rsp.text)
|
||||
if jRoot['data']['liveStatus'] != 'ON':
|
||||
return {}
|
||||
jo = jRoot['data']
|
||||
ja = jo['stream']['baseSteamInfoList'][0]['sStreamName']
|
||||
url = 'http://txtest-xp2p.p2p.huya.com/src/' + ja + '.xs?ratio=4000'
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
}
|
||||
result["contentType"] = 'video/x-flv'
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
def localProxy(self,param):
|
||||
action = {
|
||||
'url':'',
|
||||
'header':'',
|
||||
'param':'',
|
||||
'type':'string',
|
||||
'after':''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,86 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import urllib.parse
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "IF101影视"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
|
||||
classes = [{"type_id":20,"type_name":"电影"},{"type_id":21,"type_name":"电视剧"},{"type_id":22,"type_name":"动漫"},{"type_id":23,"type_name":"综艺"},{"type_id":24,"type_name":"体育"},{"type_id":25,"type_name":"纪录片"},{"type_id":26,"type_name":"明星资讯"},{"type_id":28,"type_name":"冒险片"},{"type_id":29,"type_name":"剧情片"},{"type_id":30,"type_name":"动作片"},{"type_id":31,"type_name":"动画电影"},{"type_id":32,"type_name":"同性片"},{"type_id":33,"type_name":"喜剧片"},{"type_id":34,"type_name":"奇幻片"},{"type_id":35,"type_name":"恐怖片"},{"type_id":36,"type_name":"悬疑片"},{"type_id":37,"type_name":"惊悚片"},{"type_id":38,"type_name":"歌舞片"},{"type_id":39,"type_name":"灾难片"},{"type_id":40,"type_name":"爱情片"},{"type_id":41,"type_name":"犯罪片"},{"type_id":42,"type_name":"科幻片"},{"type_id":43,"type_name":"经典片"},{"type_id":44,"type_name":"网络电影"},{"type_id":117,"type_name":"战争片"},{"type_id":119,"type_name":"欧美剧"},{"type_id":120,"type_name":"日剧"},{"type_id":121,"type_name":"韩剧"},{"type_id":122,"type_name":"国产剧"},{"type_id":123,"type_name":"泰剧"},{"type_id":124,"type_name":"港剧"},{"type_id":125,"type_name":"台剧"},{"type_id":126,"type_name":"新马剧"},{"type_id":127,"type_name":"其他剧"},{"type_id":128,"type_name":"欧美综艺"},{"type_id":129,"type_name":"日本综艺"},{"type_id":130,"type_name":"韩国综艺"},{"type_id":131,"type_name":"国产综艺"},{"type_id":132,"type_name":"新马泰综艺"},{"type_id":133,"type_name":"港台综艺"},{"type_id":134,"type_name":"其他综艺"},{"type_id":135,"type_name":"欧美动漫"},{"type_id":136,"type_name":"日本动漫"},{"type_id":137,"type_name":"韩国动漫"},{"type_id":138,"type_name":"国产动漫"},{"type_id":139,"type_name":"新马泰动漫"},{"type_id":140,"type_name":"港台动漫"},{"type_id":142,"type_name":"其他动漫"}]
|
||||
|
||||
result['class'] = classes
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://api.8a5.cn/parse/if101/py.php?do=homeVideoContent")
|
||||
alists = json.loads(rsp.text)
|
||||
alist = alists['list']
|
||||
result = {
|
||||
'list':alist
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
urlParams = []
|
||||
params = ''
|
||||
for key in extend:
|
||||
urlParams.append(str(key) + '=' + extend[key])
|
||||
params = '&'.join(urlParams)
|
||||
url = 'https://api.8a5.cn/parse/if101/py.php?do=categoryContent&tid={0}&page={1}&{2}'.format(tid, pg,params)
|
||||
rsp = self.fetch(url)
|
||||
alists = json.loads(rsp.text)
|
||||
alist = alists['list']
|
||||
|
||||
result['list'] = alist
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'https://api.8a5.cn/parse/if101/py.php?do=detailContent&id={0}'.format(tid)
|
||||
rsp = self.fetch(url)
|
||||
alists = json.loads(rsp.text)
|
||||
vod = alists['vod']
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
url = 'https://api.8a5.cn/parse/if101/py.php?do=searchContent&wd={0}'.format(key)
|
||||
rsp = self.fetch(url)
|
||||
alists = json.loads(rsp.text)
|
||||
list = alists['list']
|
||||
result = {
|
||||
'list':list
|
||||
}
|
||||
return result
|
||||
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
id = 'https://api.8a5.cn/parse/if101/get.php?url=' + urllib.parse.quote(id)
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = id
|
||||
return result
|
||||
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,206 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import base64
|
||||
import math
|
||||
import json
|
||||
import requests
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "爱看影视"
|
||||
def init(self,extend=""):
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "1",
|
||||
"剧集": "2",
|
||||
"综艺": "3",
|
||||
"动漫": "4",
|
||||
"美剧": "16",
|
||||
"日韩剧": "15",
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'https://ikan6.vip/vodtype/{0}-{1}/'.format(tid,pg)
|
||||
rsp = self.fetch(url)
|
||||
html = self.html(rsp.text)
|
||||
aList = html.xpath("//ul[contains(@class, 'myui-vodlist')]/li")
|
||||
videos = []
|
||||
numvL = len(aList)
|
||||
pgc = math.ceil(numvL/15)
|
||||
for a in aList:
|
||||
aid = a.xpath("./div[contains(@class, 'myui-vodlist__box')]/a/@href")[0]
|
||||
aid = self.regStr(reg=r'/voddetail/(.*?)/', src=aid)
|
||||
img = a.xpath(".//div[contains(@class, 'myui-vodlist__box')]/a/@data-original")[0]
|
||||
name = a.xpath(".//div[contains(@class, 'myui-vodlist__box')]/a/@title")[0]
|
||||
remark = a.xpath(".//span[contains(@class, 'pic-text text-right')]/text()")[0]
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": name,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = pgc
|
||||
result['limit'] = numvL
|
||||
result['total'] = numvL
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = 'https://ikan6.vip/voddetail/{0}/'.format(aid)
|
||||
rsp = self.fetch(url)
|
||||
html = self.html(rsp.text)
|
||||
node = html.xpath("//div[@class='myui-content__detail']")[0]
|
||||
title = node.xpath("./h1/text()")[0]
|
||||
pic = html.xpath("//a[@class='myui-vodlist__thumb picture']/img/@src")[0]
|
||||
cont = html.xpath("//div[@class='col-pd text-collapse content']/span[@class='data']/p/text()")[0].replace('\u3000','')
|
||||
infoList = node.xpath("./p[@class='data']")
|
||||
for info in infoList:
|
||||
content = info.xpath('string(.)').replace('\t','').replace('\r','').replace('\n','').strip()
|
||||
if content.startswith('导演:'):
|
||||
dir = content.replace('导演:','').strip()
|
||||
if content.startswith('主演:'):
|
||||
act = content.replace('主演:','').replace('\xa0','/').strip()
|
||||
if content.startswith('分类:'):
|
||||
infos = content.split(':')
|
||||
for i in range(0, len(infos)):
|
||||
if infos[i] == '分类':
|
||||
typeName = infos[i + 1][:-2]
|
||||
if infos[i][-2:] == '地区':
|
||||
area = infos[i + 1][:-2]
|
||||
if infos[i][-2:] == '年份':
|
||||
year = infos[i + 1]
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": year,
|
||||
"vod_area": area,
|
||||
"vod_remarks": '',
|
||||
"vod_actor": act,
|
||||
"vod_director": dir,
|
||||
"vod_content": cont
|
||||
}
|
||||
urlList = html.xpath("//div[@class='tab-content myui-panel_bd']/div/ul/li")
|
||||
playUrl = ''
|
||||
for url in urlList:
|
||||
purl = url.xpath("./a/@href")[0]
|
||||
purl = self.regStr(reg=r'/vodplay/(.*?)/', src=purl)
|
||||
name = url.xpath("./a/text()")[0]
|
||||
playUrl = playUrl + '{0}${1}#'.format(name, purl)
|
||||
vod['vod_play_from'] = '爱看影视'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def verifyCode(self):
|
||||
retry = 10
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"}
|
||||
while retry:
|
||||
try:
|
||||
session = requests.session()
|
||||
img = session.get('https://ikan6.vip/index.php/verify/index.html?', headers=header).content
|
||||
code = session.post('https://api.nn.ci/ocr/b64/text', data=base64.b64encode(img).decode()).text
|
||||
res = session.post(url=f"https://ikan6.vip/index.php/ajax/verify_check?type=search&verify={code}",
|
||||
headers=header).json()
|
||||
if res["msg"] == "ok":
|
||||
return session
|
||||
except Exception as e:
|
||||
print(e)
|
||||
finally:
|
||||
retry = retry - 1
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
url = 'https://ikan6.vip/vodsearch/-------------/?wd={0}&submit='.format(key)
|
||||
session = self.verifyCode()
|
||||
rsp = session.get(url)
|
||||
root = self.html(rsp.text)
|
||||
vodList = root.xpath("//ul[@class='myui-vodlist__media clearfix']/li")
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
name = vod.xpath("./div/h4/a/text()")[0]
|
||||
pic = vod.xpath("./div[@class='thumb']/a/@data-original")[0]
|
||||
mark = vod.xpath("./div[@class='thumb']/a/span[@class='pic-text text-right']/text()")[0]
|
||||
sid = vod.xpath("./div[@class='thumb']/a/@href")[0]
|
||||
sid = self.regStr(sid,"/voddetail/(\\S+)/")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = 'https://ikan6.vip/vodplay/{0}/'.format(id)
|
||||
rsp = self.fetch(url)
|
||||
info = json.loads(self.regStr(reg=r'var player_data=(.*?)</script>', src=rsp.text))
|
||||
if info['encrypt'] == 1:
|
||||
str = info['url'].replace('%u', '\\u').encode('utf-8').decode('unicode_escape')
|
||||
elif info['encrypt'] == 2:
|
||||
str = base64.b64decode(info['url'].replace('%u', '\\u').encode('utf-8').decode('unicode_escape')).decode(
|
||||
'UTF-8')
|
||||
elif info['encrypt'] == 3:
|
||||
string = info['url'][8:len(info['url'])]
|
||||
substr = base64.b64decode(string).decode('UTF-8')
|
||||
str = substr[8:len(substr) - 8].split('_')[-1]
|
||||
purl = 'https://weiyunsha.ikan6.vip/tsjmjson/play.php?sign={0}'.format(str)
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = purl
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
action = {
|
||||
'url':'',
|
||||
'header':'',
|
||||
'param':'',
|
||||
'type':'string',
|
||||
'after':''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,158 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import re
|
||||
import math
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "企鹅体育"
|
||||
def init(self,extend=""):
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"全部": ""
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'https://m.jrskbs.com'
|
||||
rsp = self.fetch(url)
|
||||
html = self.html(rsp.text)
|
||||
aList = html.xpath("//div[contains(@class, 'contentList')]/a")
|
||||
videos = []
|
||||
numvL = len(aList)
|
||||
pgc = math.ceil(numvL/15)
|
||||
for a in aList:
|
||||
aid = a.xpath("./@href")[0]
|
||||
aid = self.regStr(reg=r'/live/(.*?).html', src=aid)
|
||||
img = a.xpath(".//div[@class='contentLeft']/p/img/@src")[0]
|
||||
home = a.xpath(".//div[@class='contentLeft']/p[@class='false false']/text()")[0]
|
||||
away = a.xpath(".//div[@class='contentRight']/p[@class='false false']/text()")[0]
|
||||
infoArray = a.xpath(".//div[@class='contentCenter']/p")
|
||||
remark = ''
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)').replace(' ','')
|
||||
remark = remark + '|' + content
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": home + 'vs' + away,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark.strip('|')
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = pgc
|
||||
result['limit'] = numvL
|
||||
result['total'] = numvL
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "http://m.jrskbs.com/live/{0}.html".format(aid)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
divContent = root.xpath("//div[@class='today']")[0]
|
||||
home = divContent.xpath(".//p[@class='onePlayer homeTeam']/text()")[0]
|
||||
away = divContent.xpath(".//div[3]/text()")[0].strip()
|
||||
title = home + 'vs' + away
|
||||
pic = divContent.xpath(".//img[@class='gameLogo1 homeTeam_img']/@src")[0]
|
||||
typeName = divContent.xpath(".//div/p[@class='name1 matchTime_wap']/text()")[0]
|
||||
remark = divContent.xpath(".//div/p[@class='time1 matchTitle']/text()")[0].replace(' ','')
|
||||
url = divContent.xpath("//div[@class='liveCotainer']/iframe[@id='pp']/@src")[0]
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": '',
|
||||
"vod_director":'',
|
||||
"vod_content": ''
|
||||
}
|
||||
playUrl = '{0}${1}#'.format(title, url)
|
||||
vod['vod_play_from'] = '体育直播'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = id
|
||||
rsp = self.fetch(url)
|
||||
html = rsp.text
|
||||
strList = re.findall(r"eval\((.*?)\);", html)
|
||||
fuctList = strList[1].split('+')
|
||||
scrpit = ''
|
||||
for fuc in fuctList:
|
||||
if fuc.endswith(')'):
|
||||
append = fuc.split(')')[-1]
|
||||
else:
|
||||
append = ''
|
||||
Unicode = int(self.regStr(reg=r'l\((.*?)\)', src=fuc))
|
||||
char = chr(Unicode%256)
|
||||
char = char + append
|
||||
scrpit = scrpit + char
|
||||
par= self.regStr(reg=r'/(.*)/', src=scrpit).replace(')','')
|
||||
pars= par.split('/')
|
||||
infoList = strList[2].split('+')
|
||||
str = ''
|
||||
for info in infoList:
|
||||
if info.startswith('O'):
|
||||
Unicode = int(int(self.regStr(reg=r'O\((.*?)\)', src=info))/int(pars[0])/int(pars[1]))
|
||||
char = chr(Unicode % 256)
|
||||
str = str +char
|
||||
url = self.regStr(reg=r"play_url=\'(.*?)\'", src=str)
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
action = {
|
||||
'url':'',
|
||||
'header':'',
|
||||
'param':'',
|
||||
'type':'string',
|
||||
'after':''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,216 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "剧迷"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
# https://gimytv.co/
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "movies",
|
||||
"电视剧": "tvseries",
|
||||
"综艺": "tv_show",
|
||||
"动漫": "anime"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://gimytv.co/",headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//ul[@class='myui-vodlist clearfix']/li/div/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath("./@title")[0]
|
||||
pic = a.xpath("./@data-original")[0]
|
||||
mark = a.xpath("./span[contains(@class, 'pic-text')]/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
urlParams = ["", "", "", ""]
|
||||
urlParams[0] = tid
|
||||
urlParams[3] = pg
|
||||
suffix = ''
|
||||
for key in extend:
|
||||
if key == 4:
|
||||
suffix = '/by/'+extend[key]
|
||||
else:
|
||||
urlParams[int(key)] = extend[key]
|
||||
params = '-'.join(urlParams)+suffix
|
||||
# https://gimytv.co/genre/tvseries--2022-/by/hits_month.html
|
||||
url = 'https://gimytv.com/genre/{0}.html'.format(params)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//ul[@class='myui-vodlist clearfix']/li/div/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath("./@title")[0]
|
||||
pic = a.xpath("./@data-original")[0]
|
||||
mark = a.xpath("./span[contains(@class, 'pic-text')]/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'https://gimytv.co/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
node = root.xpath("//div[@class='container']")[0]
|
||||
title = node.xpath(".//div[@class='myui-content__thumb']/a/@title")[0]
|
||||
pic = node.xpath(".//div[@class='myui-content__thumb']/a/img/@data-original")[0]
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":"",
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":""
|
||||
}
|
||||
infoArray = node.xpath(".//div[@class='myui-content__detail']/p")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
if content.startswith('分類'):
|
||||
vod['type_name'] = content
|
||||
# if content.startswith('年份'):
|
||||
# vod['vod_year'] = content
|
||||
# if content.startswith('地区'):
|
||||
# vod['vod_area'] = content
|
||||
if content.startswith('狀態'):
|
||||
vod['vod_remarks'] = content
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content
|
||||
if content.startswith('導演'):
|
||||
vod['vod_director'] = content
|
||||
# if content.startswith('剧情'):
|
||||
# vod['vod_content'] = content
|
||||
vod['vod_content'] = node.xpath(".//div[contains(@class,'col-pd')]/p/text()")[0]
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath(".//div[@class='myui-panel_hd']/div/h3/text()[2]")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v.strip())
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath(".//ul[contains(@class,'myui-content__list')]")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./li/a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('./text()')[0]
|
||||
tId = self.regStr(href,'/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
url = "https://gimytv.co/search/-------------.html?wd={0}".format(key)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//ul[contains(@class,'myui-vodlist__media')]/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath(".//a/@title")[0]
|
||||
pic = a.xpath(".//a/@data-original")[0]
|
||||
mark = a.xpath(".//span[contains(@class, 'pic-text')]/text()")[0]
|
||||
sid = a.xpath(".//a/@href")[0]
|
||||
sid = self.regStr(sid,"/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
url = 'https://gimytv.co/{0}.html'.format(id)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
scripts = root.xpath("//script/text()")
|
||||
jo = {}
|
||||
for script in scripts:
|
||||
if(script.startswith("var player_")):
|
||||
target = script[script.index('{'):]
|
||||
jo = json.loads(target)
|
||||
break;
|
||||
url = jo['url']
|
||||
result = {}
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
cookie = {}
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"movies":[{"key":0,"name":"分类","value":[{"n":"全部","v":""},{"n":"劇情片","v":"drama"},{"n":"動作片","v":"action"},{"n":"科幻片","v":"scifi"},{"n":"喜劇片","v":"comedymovie"},{"n":"愛情片","v":"romance"},{"n":"戰爭片","v":"war"},{"n":"恐怖片","v":"horror"},{"n":"動畫電影","v":"animation"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"美國","v":"美國"},{"n":"歐美","v":"歐美"},{"n":"大陸","v":"大陸"},{"n":"中國大陸","v":"中國大陸"},{"n":"韓國","v":"韓國"},{"n":"香港","v":"香港"},{"n":"日本","v":"日本"},{"n":"英國","v":"英國"}]},{"key":2,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"}]},{"key":4,"name":"排序","value":[{"n":"按更新","v":"time"},{"n":"周人气","v":"hits_week"},{"n":"月人气","v":"hits_month"}]}],"tvseries":[{"key":0,"name":"分类","value":[{"n":"全部","v":""},{"n":"陸劇","v":"cn"},{"n":"韓劇","v":"kr"},{"n":"美劇","v":"us"},{"n":"日劇","v":"jp"},{"n":"台劇","v":"tw"},{"n":"港劇","v":"hks"},{"n":"海外劇","v":"ot"},{"n":"紀錄片","v":"documentary"}]},{"key":2,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"}]},{"key":4,"name":"排序","value":[{"n":"按更新","v":"time"},{"n":"周人气","v":"hits_week"},{"n":"月人气","v":"hits_month"}]}],"anime":[{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"日本"},{"n":"美國","v":"美國"},{"n":"歐美","v":"歐美"},{"n":"大陸","v":"大陸"},{"n":"臺灣","v":"臺灣"},{"n":"香港","v":"香港"}]},{"key":2,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"}]},{"key":4,"name":"排序","value":[{"n":"按更新","v":"time"},{"n":"周人气","v":"hits_week"},{"n":"月人气","v":"hits_month"}]}],"tv_show":[{"key":0,"name":"分类","value":[{"n":"全部","v":""},{"n":"纪录片","v":"28"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"大陸","v":"大陸"},{"n":"中國大陸","v":"中國大陸"},{"n":"韓國","v":"韓國"},{"n":"臺灣","v":"臺灣"},{"n":"美國","v":"美國"},{"n":"歐美","v":"歐美"},{"n":"日本","v":"日本"},{"n":"香港","v":"香港"}]},{"key":2,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"}]},{"key":4,"name":"排序","value":[{"n":"按更新","v":"time"},{"n":"周人气","v":"hits_week"},{"n":"月人气","v":"hits_month"}]}]}
|
||||
}
|
||||
header = {
|
||||
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,175 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "77"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
url = 'http://api.kunyu77.com/api.php/provide/filter'
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
classes = []
|
||||
jData = jo['data']
|
||||
for cKey in jData.keys():
|
||||
classes.append({
|
||||
'type_name':jData[cKey][0]['cat'],
|
||||
'type_id':cKey
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
url = 'http://api.kunyu77.com/api.php/provide/homeBlock?type_id=0'
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
blockList = jo['data']['blocks']
|
||||
videos = []
|
||||
for block in blockList:
|
||||
vodList = block['contents']
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id":vod['id'],
|
||||
"vod_name":vod['title'],
|
||||
"vod_pic":vod['videoCover'],
|
||||
"vod_remarks":vod['msg']
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
if 'type_id' not in extend.keys():
|
||||
extend['type_id'] = tid
|
||||
extend['pagenum'] = pg
|
||||
filterParams = ["type_id", "pagenum"]
|
||||
params = ["", ""]
|
||||
for idx in range(len(filterParams)):
|
||||
fp = filterParams[idx]
|
||||
if fp in extend.keys():
|
||||
params[idx] = '&'+filterParams[idx]+'='+extend[fp]
|
||||
suffix = ''.join(params)
|
||||
url = 'http://api.kunyu77.com/api.php/provide/searchFilter?pagesize=24{0}'.format(suffix)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
vodList = jo['data']['result']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id":vod['id'],
|
||||
"vod_name":vod['title'],
|
||||
"vod_pic":vod['videoCover'],
|
||||
"vod_remarks":vod['msg']
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'http://api.kunyu77.com/api.php/provide/videoDetail?devid=453CA5D864457C7DB4D0EAA93DE96E66&package=com.sevenVideo.app.android&version=1.8.7&ids={0}'.format(tid)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
node = jo['data']
|
||||
vod = {
|
||||
"vod_id":node['id'],
|
||||
"vod_name":node['videoName'],
|
||||
"vod_pic":node['videoCover'],
|
||||
"type_name":node['subCategory'],
|
||||
"vod_year":node['year'],
|
||||
"vod_area":node['area'],
|
||||
"vod_remarks":node['msg'],
|
||||
"vod_actor":node['actor'],
|
||||
"vod_director":node['director'],
|
||||
"vod_content":node['brief'].strip()
|
||||
}
|
||||
listUrl = 'http://api.kunyu77.com/api.php/provide/videoPlaylist?devid=453CA5D864457C7DB4D0EAA93DE96E66&package=com.sevenVideo.app.android&version=1.8.7&ids={0}'.format(tid)
|
||||
listRsp = self.fetch(listUrl,headers=self.header)
|
||||
listJo = json.loads(listRsp.text)
|
||||
playMap = {}
|
||||
episodes = listJo['data']['episodes']
|
||||
for ep in episodes:
|
||||
playurls = ep['playurls']
|
||||
for playurl in playurls:
|
||||
source = playurl['playfrom']
|
||||
if source not in playMap.keys():
|
||||
playMap[source] = []
|
||||
playMap[source].append(playurl['title'].strip() + '$' + playurl['playurl'])
|
||||
|
||||
playFrom = []
|
||||
playList = []
|
||||
for key in playMap.keys():
|
||||
playFrom.append(key)
|
||||
playList.append('#'.join(playMap[key]))
|
||||
|
||||
vod_play_from = '$$$'
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
vod_play_url = '$$$'
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
url = 'http://api.kunyu77.com/api.php/provide/searchVideo?searchName={0}'.format(key)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
vodList = jo['data']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id":vod['id'],
|
||||
"vod_name":vod['videoName'],
|
||||
"vod_pic":vod['videoCover'],
|
||||
"vod_remarks":vod['msg']
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {
|
||||
"User-Agent":"Dalvik/2.1.0"
|
||||
}
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = 'http://api.kunyu77.com/api.php/provide/parserUrl?url={0}'.format(id)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
result = {
|
||||
'parse':0,
|
||||
'jx':0,
|
||||
'playUrl':'',
|
||||
'url':id,
|
||||
'header':''
|
||||
}
|
||||
if flag in vipFlags:
|
||||
result['parse'] = 1
|
||||
result['jx'] = 1
|
||||
return result
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,238 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import base64
|
||||
import hashlib
|
||||
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "LeZhuTV"
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "1",
|
||||
"连续剧": "2",
|
||||
"动漫": "4",
|
||||
"综艺": "3",
|
||||
"韩剧": "14",
|
||||
"美剧": "15"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("http://www.lezhutv.com")
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//ul[@class='tbox_m2']/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('.//@title')[0]
|
||||
pic = a.xpath('.//@data-original')[0]
|
||||
mark = a.xpath(".//span/text()")[0]
|
||||
sid = a.xpath(".//@href")[0]
|
||||
sid = self.regStr(sid, "/detail/(\\d+).html")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
|
||||
ext = extend.get("by","")
|
||||
url = 'http://www.lezhutv.com/list/{0}_{1}_desc_{2}_0_0___.html'.format(tid,pg,ext)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//ul[@class='tbox_m2']/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('.//@title')[0]
|
||||
pic = a.xpath('.//@data-original')[0]
|
||||
mark = a.xpath(".//span/text()")[0]
|
||||
sid = a.xpath(".//@href")[0]
|
||||
sid = self.regStr(sid, "/detail/(\\d+).html")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def detailContent(self, array):
|
||||
tid = array[0]
|
||||
url = 'http://www.lezhutv.com/detail/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
node = root.xpath(".//div[@class='dbox']")[0]
|
||||
nodes = root.xpath(".//div[@class='tbox2']")[0]
|
||||
pic = node.xpath(".//div/@data-original")[0]
|
||||
title = node.xpath('.//h4/text()')[0]
|
||||
detail = nodes.xpath(".//div[@class='tbox_js']/text()")[0]
|
||||
yac = node.xpath(".//p[@class='yac']/text()")[0]
|
||||
yac = yac.split('/')
|
||||
yacs = yac[0].strip()
|
||||
type_name = yac[1].strip()
|
||||
actor = node.xpath(".//p[@class='act']/text()")[0]
|
||||
director = node.xpath(".//p[@class='dir']/text()")[0]
|
||||
|
||||
vod = {
|
||||
"vod_id": tid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": type_name,
|
||||
"vod_year": yacs,
|
||||
"vod_area": "",
|
||||
"vod_remarks": "",
|
||||
"vod_actor": actor,
|
||||
"vod_director": director,
|
||||
"vod_content": detail
|
||||
}
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath(".//div[@class='tbox2 tabs']/div/h3/text()")
|
||||
i=1
|
||||
for v in vodHeader:
|
||||
playFrom.append("线路" + str(i))
|
||||
i = i+1
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath("//div[@class='tbox2 tabs']")
|
||||
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath(".//ul/li/a")
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('./text()')[0]
|
||||
tId = self.regStr(href, '/play/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'http://www.lezhutv.com/search-pg-1-wd-{0}.html'.format(key)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
seaArray = root.xpath("//ul[@class='tbox_m']/li")
|
||||
seaList = []
|
||||
for vod in seaArray:
|
||||
name = vod.xpath('.//@title')[0]
|
||||
pic = vod.xpath('.//@data-original')[0]
|
||||
mark = vod.xpath(".//span/text()")[0]
|
||||
sid = vod.xpath(".//@href")[0]
|
||||
sid = self.regStr(sid, "/detail/(\\d+).html")
|
||||
seaList.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result = {
|
||||
'list': seaList
|
||||
}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player":{},
|
||||
"filter":{"1":[{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"score"},{"n":"评分","v":"hits"}]}],"2":[{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"score"},{"n":"评分","v":"hits"}]}],"3":[{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"score"},{"n":"评分","v":"hits"}]}],"4":[{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"score"},{"n":"评分","v":"hits"}]}],"14":[{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"score"},{"n":"评分","v":"hits"}]}],"15":[{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"score"},{"n":"评分","v":"hits"}]}]}
|
||||
}
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"
|
||||
}
|
||||
|
||||
def get_md5(self,value):
|
||||
b64 = base64.b64encode((base64.b64encode(value.encode()).decode() + "NTY2").encode()).decode()
|
||||
md5 = hashlib.md5(b64.encode()).hexdigest()
|
||||
return "".join(char if char.isdigit() else "zyxwvutsrqponmlkjihgfedcba"["abcdefghijklmnopqrstuvwxyz".find(char)] for char in md5)
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
url = 'http://www.lezhutv.com/play/{0}.html'.format(id)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
scripts = root.xpath("//script/text()")
|
||||
scripts = scripts[1].replace('\n', '')
|
||||
nid = self.regStr(scripts, 'view_path = \'(.*?)\';')
|
||||
|
||||
md5url = 'http://www.lezhutv.com/hls2/index.php?url={0}'.format(nid)
|
||||
rsp = self.fetch(md5url)
|
||||
root = self.html(rsp.text)
|
||||
value = root.xpath(".//input[@id='hdMd5']/@value")
|
||||
value = ''.join(value)
|
||||
md5s = self.get_md5(str(value))
|
||||
data = {
|
||||
"id": nid,
|
||||
"type": "vid",
|
||||
"siteuser": "",
|
||||
"md5": md5s,
|
||||
"referer": url,
|
||||
"hd": "",
|
||||
"lg": ""
|
||||
}
|
||||
payUrl = 'http://www.lezhutv.com/hls2/url.php'
|
||||
parseRsp = self.post(payUrl,data,headers=self.header)
|
||||
parseRsps = json.loads(parseRsp.text)
|
||||
realUrl = parseRsps['media']['url']
|
||||
if len(realUrl) > 0:
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ""
|
||||
result["url"] = realUrl
|
||||
result["header"] = ""
|
||||
else:
|
||||
result["parse"] = 1
|
||||
result["playUrl"] = ""
|
||||
result["url"] = url
|
||||
result["header"] = json.dumps(self.header)
|
||||
return result
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def localProxy(self, param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,234 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "Libvio"
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "1",
|
||||
"剧集": "2",
|
||||
"动漫": "4",
|
||||
"即将上线": "27",
|
||||
"日韩剧": "15",
|
||||
"欧美剧": "16"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://www.libvio.me")
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//div[@class='stui-pannel__bd']/ul/li/div/a")
|
||||
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('./@data-original')[0]
|
||||
mark = a.xpath("./span[2]/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid, "/detail/(\\d+).html")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result = {
|
||||
'list': videos
|
||||
}
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
|
||||
urlParams = ["", "", "", "", "", "", "", "", "", "", "", ""]
|
||||
urlParams[0] = tid
|
||||
urlParams[8] = pg
|
||||
for key in extend:
|
||||
urlParams[int(key)] = extend[key]
|
||||
params = '-'.join(urlParams)
|
||||
url = 'https://www.libvio.me/show/{0}.html'.format(params)
|
||||
print(url)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//div[@class='stui-pannel__bd clearfix']/ul/li/div/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('./@data-original')[0]
|
||||
mark = a.xpath("./span[2]/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid, "/detail/(\\d+).html")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def detailContent(self, array):
|
||||
tid = array[0]
|
||||
url = 'https://www.libvio.me/detail/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
node = root.xpath("//div[@class='stui-pannel__bd']")[0]
|
||||
pic = node.xpath(".//img/@data-original")[0]
|
||||
title = node.xpath('.//h1/text()')[0]
|
||||
detail = node.xpath(".//span[@class='detail-content']/text()")[0]
|
||||
douban = node.xpath(".//span[@class='douban']/text()")[0]
|
||||
|
||||
vod = {
|
||||
"vod_id": tid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": "",
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": "",
|
||||
"vod_actor": "",
|
||||
"vod_director": "",
|
||||
"vod_douban_score": format(douban.rstrip("分")),
|
||||
"vod_content": detail
|
||||
}
|
||||
|
||||
infoArray = node.xpath(".//div[@class='stui-content__detail']/p")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
if content.startswith('类型'):
|
||||
vod['type_name'] = content
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content.replace('\n', '').replace('\t', '')
|
||||
if content.startswith('导演'):
|
||||
vod['vod_director'] = content.replace('\n', '').replace('\t', '')
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath("//div[@class='stui-pannel__head clearfix']/h3/text()")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v)
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath("//div[@class='stui-vodlist__head']")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./ul/li/a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('./text()')[0]
|
||||
tId = self.regStr(href, '/play/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
url = 'https://www.libvio.me/index.php/ajax/suggest?mid=1&wd={0}'.format(key)
|
||||
# getHeader()
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
result = {}
|
||||
jArray = []
|
||||
if jo['total'] > 0:
|
||||
for j in jo['list']:
|
||||
jArray.append({
|
||||
"vod_id": j['id'],
|
||||
"vod_name": j['name'],
|
||||
"vod_pic": j['pic'],
|
||||
"vod_remarks": ""
|
||||
})
|
||||
result = {
|
||||
'list': jArray
|
||||
}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player":{"LINE405":{"show":"LINE405","des":"更多极速线路请访问APP","ps":"0","parse":""},"duoduozy":{"show":"LINE100","des":"","ps":"0","parse":""},"LINE407":{"show":"LINE400","des":"","ps":"0","parse":""},"LINE408":{"show":"LINE408","des":"","ps":"0","parse":""},"p300":{"show":"LINE300","des":"","ps":"0","parse":""},"p301":{"show":"LINE301","des":"","ps":"0","parse":""},"line402-日语":{"show":"LINE402","des":"","ps":"0","parse":""},"LINE400":{"show":"LINE400","des":"","ps":"0","parse":""},"line401":{"show":"LINE401","des":"","ps":"0","parse":""},"iframe268":{"show":"LINE268","des":"","ps":"0","parse":""},"iframe290":{"show":"LINE290","des":"","ps":"0","parse":""},"iframe291":{"show":"LINE291","des":"","ps":"0","parse":""},"iframe296":{"show":"LINE296","des":"","ps":"0","parse":""},"iframe297":{"show":"LINE297","des":"","ps":"0","parse":""},"iframe307":{"show":"LINE307","des":"","ps":"0","parse":""},"iframe308":{"show":"LINE308","des":"","ps":"0","parse":""},"iframe309":{"show":"LINE309","des":"","ps":"0","parse":""},"line301":{"show":"LINE333","des":"","ps":"0","parse":""},"line302":{"show":"LINE302","des":"","ps":"0","parse":""},"LINE409":{"show":"LINE409","des":"","ps":"0","parse":""},"banquan":{"show":"已下架","des":"","ps":"0","parse":""},"iframe261":{"show":"LINE261","des":"","ps":"0","parse":""},"iframe265":{"show":"LINE265","des":"","ps":"0","parse":""},"iframe278":{"show":"LINE278","des":"","ps":"0","parse":""},"iframe306":{"show":"LINE306","des":"","ps":"0","parse":""},"iframe317":{"show":"LINE317","des":"","ps":"0","parse":""},"iframe257":{"show":"LINE257","des":"","ps":"0","parse":""},"iframe263":{"show":"LINE263","des":"","ps":"0","parse":""},"iframe258":{"show":"LINE258","des":"","ps":"0","parse":""},"iframe267":{"show":"LINE267","des":"","ps":"0","parse":""},"iframe":{"show":"LINE200","des":"","ps":"0","parse":""},"iframe262":{"show":"LINE262","des":"","ps":"0","parse":""},"iframe266":{"show":"LINE266","des":"","ps":"0","parse":""},"LINE406":{"show":"LINE406","des":"","ps":"0","parse":""},"dplayer3":{"show":"播放线路3","des":"","ps":"0","parse":""}},
|
||||
"filter":{"1":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"2":[{"key":"class","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":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"中国大陆"},{"n":"台湾","v":"中国台湾"},{"n":"香港","v":"中国香港"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"3":[{"key":"class","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":"求职"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"4":[{"key":"class","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":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国","v":"中国"},{"n":"日本","v":"日本"},{"n":"欧美","v":"欧美"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"6":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"7":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"8":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"9":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"10":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"11":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"12":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"13":[{"key":"class","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":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"中国大陆"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"14":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"香港","v":"中国香港"},{"n":"台湾","v":"中国台湾"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"15":[{"key":"class","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":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"16":[{"key":"class","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":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"美国","v":"美国"},{"n":"英国","v":"英国"},{"n":"德国","v":"德国"},{"n":"加拿大","v":"加拿大"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}]}
|
||||
}
|
||||
header = {
|
||||
"Referer": "https://www.libvio.me",
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"
|
||||
}
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
url = 'https://www.libvio.me/play/{0}.html'.format(id)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
scripts = root.xpath("//script/text()")
|
||||
jo = {}
|
||||
for script in scripts:
|
||||
if (script.startswith("var player_")):
|
||||
target = script[script.index('{'):]
|
||||
jo = json.loads(target)
|
||||
break;
|
||||
nid = str(jo['nid'])
|
||||
scriptUrl = 'https://www.libvio.me/static/player/{0}.js'.format(jo['from'])
|
||||
scriptRsp = self.fetch(scriptUrl)
|
||||
parseUrl = self.regStr(scriptRsp.text, 'src="(\\S+url=)')
|
||||
if len(parseUrl) > 0:
|
||||
path = jo['url'] + '&next=' + jo['link_next'] + '&id=' + jo['id'] + '&nid=' + nid
|
||||
parseRsp = self.fetch(parseUrl + path,headers=self.header)
|
||||
realUrl = self.regStr(parseRsp.text, "(?<=urls\\s=\\s').*?(?=')", 0)
|
||||
if len(realUrl) > 0:
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ""
|
||||
result["url"] = realUrl
|
||||
result["header"] = ""
|
||||
else:
|
||||
result["parse"] = 1
|
||||
result["playUrl"] = ""
|
||||
result["url"] = jo['url']
|
||||
result["header"] = json.dumps(self.header)
|
||||
return result
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def localProxy(self, param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,82 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import requests
|
||||
|
||||
class Spider(Spider):
|
||||
def getDependence(self):
|
||||
return ['py_ali']
|
||||
def getName(self):
|
||||
return "py_mac"
|
||||
def init(self,extend):
|
||||
self.ali = extend[0]
|
||||
print("============py_mac============")
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
return result
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 12; V2049A Build/SP1A.210812.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.129 Mobile Safari/537.36",
|
||||
"Referer": "http://ali.546326.xyz"
|
||||
}
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
#print(tid)
|
||||
#print(self.getName())
|
||||
url="http://ali.546326.xyz/api.php/provide/vod/?ac=detail&ids={0}".format(tid)
|
||||
vods=requests.get(url=url, headers=self.header, verify=False).json()["list"][0]
|
||||
playurl = vods['vod_play_url']
|
||||
playArray = playurl.split("#")
|
||||
newArray =[]
|
||||
for vod in playArray:
|
||||
if vod:
|
||||
vds = vod.split("$")
|
||||
playurl = vds[1].replace(" ","")
|
||||
pattern = '(https://www.aliyundrive.com/s/[^\"]+)'
|
||||
url = self.regStr(playurl, pattern)
|
||||
if len(url) > 0:
|
||||
newArray.append(playurl)
|
||||
if len(newArray) == 0:
|
||||
return ""
|
||||
#print(newArray)
|
||||
return self.ali.detailContent(newArray)
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
url = "http://ali.546326.xyz/api.php/provide/vod/?wd={0}".format(key)
|
||||
vodList = requests.get(url=url, headers=self.header, verify=False).json()["list"]
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id": vod["vod_id"],
|
||||
"vod_name": vod["vod_name"],
|
||||
"vod_pic": "https://img0.baidu.com/it/u=603086994,1727626977&fm=253&fmt=auto?w=500&h=667",#字段不存在
|
||||
"vod_remarks": vod["vod_remarks"]
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
return self.ali.playerContent(flag,id,vipFlags)
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,92 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
|
||||
class Spider(Spider):
|
||||
def getDependence(self):
|
||||
return ['py_ali']
|
||||
def getName(self):
|
||||
return "py_pansou"
|
||||
def init(self,extend):
|
||||
self.ali = extend[0]
|
||||
print("============py_pansou============")
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
print(self.getName())
|
||||
pattern = '(https:\\/\\/www.aliyundrive.com\\/s\\/[^\\\"]+)'
|
||||
url = self.regStr(tid,pattern)
|
||||
if len(url) > 0:
|
||||
return self.ali.detailContent(array)
|
||||
|
||||
rsp = self.fetch('https://www.alipansou.com'+tid)
|
||||
url = self.regStr(rsp.text,pattern)
|
||||
if len(url) == 0:
|
||||
return ""
|
||||
url = url.replace('\\','')
|
||||
newArray = [url]
|
||||
print(newArray)
|
||||
return self.ali.detailContent(newArray)
|
||||
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
map = {
|
||||
'7':'文件夹',
|
||||
'1':'视频'
|
||||
}
|
||||
ja = []
|
||||
for tKey in map.keys():
|
||||
url = "https://www.alipansou.com/search?k={0}&t={1}".format(key,tKey)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//van-row/a")
|
||||
for a in aList:
|
||||
title = ''
|
||||
# title = a.xpath('string(.//template/div)')
|
||||
# title = self.cleanText(title).strip()
|
||||
|
||||
divList = a.xpath('.//template/div')
|
||||
for div in divList:
|
||||
t = div.xpath('string(.)')
|
||||
t = self.cleanText(t).strip()
|
||||
title = title + t
|
||||
if key in title:
|
||||
pic = 'https://www.alipansou.com'+ self.xpText(a,'.//van-card/@thumb')
|
||||
jo = {
|
||||
'vod_id': a.xpath('@href')[0],
|
||||
'vod_name': '[{0}]{1}'.format(key,title),
|
||||
'vod_pic': pic
|
||||
}
|
||||
ja.append(jo)
|
||||
result = {
|
||||
'list':ja
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
return self.ali.playerContent(flag,id,vipFlags)
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,137 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import math
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "企鹅体育"
|
||||
def init(self,extend=""):
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"全部": "",
|
||||
"足球": "Football",
|
||||
"篮球": "Basketball",
|
||||
"NBA": "NBA",
|
||||
"台球": "Billiards",
|
||||
"搏击": "Fight",
|
||||
"网排": "Tennis",
|
||||
"游戏": "Game",
|
||||
"其他": "Others",
|
||||
"橄棒冰": "MLB"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'https://live.qq.com/api/live/vlist?page_size=60&shortName={0}&page={1}'.format(tid, pg)
|
||||
rsp = self.fetch(url)
|
||||
content = rsp.text
|
||||
jo = json.loads(content)
|
||||
videos = []
|
||||
vodList = jo['data']['result']
|
||||
numvL = len(vodList)
|
||||
pgc = math.ceil(numvL/15)
|
||||
for vod in vodList:
|
||||
aid = (vod['room_id'])
|
||||
title = vod['room_name'].strip()
|
||||
img = vod['room_src']
|
||||
remark = (vod['game_name']).strip()
|
||||
videos.append({
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": img,
|
||||
"vod_remarks": remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = pgc
|
||||
result['limit'] = numvL
|
||||
result['total'] = numvL
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "https://m.live.qq.com/{0}".format(aid)
|
||||
rsp = self.fetch(url)
|
||||
html = self.cleanText(rsp.text)
|
||||
if self.regStr(reg=r'\"show_status\":\"(\d)\"', src=html) == '1':
|
||||
title = self.regStr(reg=r'\"room_name\":\"(.*?)\"', src=html)
|
||||
pic = self.regStr(reg=r'\"room_src\":\"(.*?)\"', src=html)
|
||||
typeName = self.regStr(reg=r'\"game_name\":\"(.*?)\"', src=html)
|
||||
remark = self.regStr(reg=r'\"nickname\":\"(.*?)\"', src=html)
|
||||
purl = self.regStr(reg=r'\"hls_url\":\"(.*?)\"', src=html)
|
||||
else:
|
||||
return {}
|
||||
vod = {
|
||||
"vod_id": aid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": typeName,
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": remark,
|
||||
"vod_actor": '',
|
||||
"vod_director":'',
|
||||
"vod_content": ''
|
||||
}
|
||||
playUrl = '{0}${1}#'.format(typeName, purl)
|
||||
vod['vod_play_from'] = '企鹅体育'
|
||||
vod['vod_play_url'] = playUrl
|
||||
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = id
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
action = {
|
||||
'url':'',
|
||||
'header':'',
|
||||
'param':'',
|
||||
'type':'string',
|
||||
'after':''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,228 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "Voflix"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
# https://meijuchong.cc/
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "1",
|
||||
"剧集": "2",
|
||||
"综艺": "3",
|
||||
"动漫": "4"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://www.voflix.com/",headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
vodList = root.xpath("//div[@class='module']/div[contains(@class,'tab-list')]//a")
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
name = vod.xpath("./@title")[0]
|
||||
pic = vod.xpath(".//img/@data-original")[0]
|
||||
mark = vod.xpath(".//div[@class='module-item-note']/text()")[0]
|
||||
sid = vod.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/detail/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
if 'id' not in extend.keys():
|
||||
extend['id'] = tid
|
||||
extend['page'] = pg
|
||||
filterParams = ["id", "area", "by", "class", "", "", "", "", "page", "", "", "year"]
|
||||
params = ["", "", "", "", "", "", "", "", "", "", "", ""]
|
||||
for idx in range(len(filterParams)):
|
||||
fp = filterParams[idx]
|
||||
if fp in extend.keys():
|
||||
params[idx] = extend[fp]
|
||||
suffix = '-'.join(params)
|
||||
url = 'https://www.voflix.com/show/{0}.html'.format(suffix)
|
||||
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
vodList = root.xpath("//div[contains(@class, 'module-items')]/a")
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
name = vod.xpath("./@title")[0]
|
||||
pic = vod.xpath(".//img/@data-original")[0]
|
||||
mark = vod.xpath(".//div[contains(@class,'module-item-note')]/text()")[0]
|
||||
sid = vod.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/detail/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'https://www.voflix.com/detail/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
node = root.xpath("//div[@class='main']")[0]
|
||||
title = node.xpath(".//div[@class='module-info-heading']/h1/text()")[0]
|
||||
pic = root.xpath(".//div[@class='module-item-pic']/img/@data-original")[0]
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":"",
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":""
|
||||
}
|
||||
infoArray = node.xpath(".//div[@class='module-info-item']")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
# if content.startswith('分類'):
|
||||
# vod['type_name'] = content
|
||||
# if content.startswith('年份'):
|
||||
# vod['vod_year'] = content
|
||||
# if content.startswith('地区'):
|
||||
# vod['vod_area'] = content
|
||||
if content.startswith('片长'):
|
||||
vod['vod_remarks'] = content.replace('\n','').replace('\t','')
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content.replace('\n','').replace('\t','')
|
||||
if content.startswith('导演'):
|
||||
vod['vod_director'] = content.replace('\n','').replace('\t','')
|
||||
# if content.startswith('剧情'):
|
||||
# vod['vod_content'] = content.replace('\n','').replace('\t','')
|
||||
vod['vod_content'] = node.xpath(".//div[contains(@class,'module-info-introduction-content')]/p/text()")[0].replace('\n','').replace('\t','')
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath(".//div[contains(@class,'module-tab-items-box')]/div/span/text()")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v.strip())
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath(".//div[contains(@class,'module-play-list-content')]")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('.//span/text()')[0]
|
||||
tId = self.regStr(href,'/play/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
url = "https://www.voflix.com/index.php/ajax/suggest?mid=1&wd={0}".format(key)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
vodList = jo['list']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
name = vod['name']
|
||||
pic = vod['pic']
|
||||
mark = ''
|
||||
sid = vod['id']
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
# https://meijuchong.cc/static/js/playerconfig.js
|
||||
result = {}
|
||||
url = 'https://www.voflix.com/play/{0}.html'.format(id)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(rsp.text)
|
||||
scripts = root.xpath("//script/text()")
|
||||
jo = {}
|
||||
for script in scripts:
|
||||
if(script.startswith("var player_")):
|
||||
target = script[script.index('{'):]
|
||||
jo = json.loads(target)
|
||||
break;
|
||||
|
||||
parseUrl = 'https://play.shtpin.com/xplay/?url={0}'.format(jo['url'])
|
||||
parseRsp = self.fetch(parseUrl,headers={'referer':'https://www.voflix.com/'})
|
||||
|
||||
configStr = self.regStr(parseRsp.text,'var config = ({[\\s\\S]+})')
|
||||
configJo = json.loads(configStr)
|
||||
playUrl = 'https://play.shtpin.com/xplay/555tZ4pvzHE3BpiO838.php?tm={0}&url={1}&vkey={2}&token={3}&sign=F4penExTGogdt6U8'
|
||||
playUrl.format(time.time(),configJo['url'],configJo['vkey'],configJo['token'])
|
||||
playRsp = self.fetch(playUrl.format(time.time(),configJo['url'],configJo['vkey'],configJo['token'])
|
||||
,headers={'referer':'https://www.voflix.com/'})
|
||||
playJo = json.loads(playRsp.text)
|
||||
b64 = playJo['url'][8:]
|
||||
targetUrl = base64.b64decode(b64)[8:-8].decode()
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = targetUrl
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"1":[{"key":"id","name":"类型","value":[{"n":"全部","v":"1"},{"n":"动作","v":"6"},{"n":"喜剧","v":"7"},{"n":"爱情","v":"8"},{"n":"科幻","v":"9"},{"n":"恐怖","v":"10"},{"n":"剧情","v":"11"},{"n":"战争","v":"12"},{"n":"动画","v":"23"}]},{"key":"class","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":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]},{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"2":[{"key":"id","name":"类型","value":[{"n":"全部","v":"2"},{"n":"国产剧","v":"13"},{"n":"港台剧","v":"14"},{"n":"日韩剧","v":"15"},{"n":"欧美剧","v":"16"},{"n":"纪 录片","v":"21"},{"n":"泰国剧","v":"24"}]},{"key":"class","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":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"中国大陆"},{"n":"中国台湾","v":"中国台湾"},{"n":"中国香港","v":"中国香港"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"3":[{"key":"class","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":"求职"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"4":[{"key":"class","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":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国","v":"中国"},{"n":"日本","v":"日本"},{"n":"欧美","v":"欧美"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}]}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,176 +0,0 @@
|
||||
# coding=utf-8
|
||||
# !/usr/bin/python
|
||||
import sys
|
||||
import re
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
|
||||
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "完美看看"
|
||||
|
||||
def init(self, extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影": "1",
|
||||
"国产剧": "5",
|
||||
"欧美剧": "2",
|
||||
"韩剧": "3",
|
||||
"泰剧": "9",
|
||||
"日剧": "4",
|
||||
"动漫": "6",
|
||||
"综艺": "7",
|
||||
"纪录片": "10"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list': []
|
||||
}
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
url = 'https://www.wanmeikk.film/category/{0}-{1}.html'.format(tid, pg)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//div[@class='stui-pannel_bd']/ul[1]/li")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./div/a/@title')[0]
|
||||
pic = a.xpath('./div/a/@data-original')[0]
|
||||
mark = a.xpath("./div/a/span[@class='pic-text text-right']/text()")[0]
|
||||
sid = a.xpath("./div/a/@href")[0].replace("/", "").replace("project", "").replace(".html", "")
|
||||
videos.append({
|
||||
"vod_id": sid,
|
||||
"vod_name": name,
|
||||
"vod_pic": pic,
|
||||
"vod_remarks": mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def detailContent(self, array):
|
||||
tid = array[0]
|
||||
url = 'https://www.wanmeikk.film/project/{0}.html'.format(tid)
|
||||
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
rsp = self.fetch(url, headers=header)
|
||||
root = self.html(rsp.content)
|
||||
divContent = root.xpath("//div[@class='col-lg-wide-75 col-xs-1']")[0]
|
||||
title = divContent.xpath(".//h1[@class='title']/text()")[0]
|
||||
pic = divContent.xpath(".//a[@class='stui-vodlist__thumb picture v-thumb']/img/@data-original")[0]
|
||||
detail = divContent.xpath(".//p[@class='desc detail hidden-xs']/span[@class='detail-content']/text()")[0]
|
||||
vod = {
|
||||
"vod_id": tid,
|
||||
"vod_name": title,
|
||||
"vod_pic": pic,
|
||||
"type_name": "",
|
||||
"vod_year": "",
|
||||
"vod_area": "",
|
||||
"vod_remarks": "",
|
||||
"vod_actor": "",
|
||||
"vod_director": "",
|
||||
"vod_content": detail
|
||||
}
|
||||
infoArray = divContent.xpath(".//div[@class='stui-content__detail']/p[@class='data']")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
if content.startswith('类型'):
|
||||
infon = content.split('\xa0')
|
||||
for inf in infon:
|
||||
if inf.startswith('类型'):
|
||||
vod['type_name'] = inf.replace("类型:", "")
|
||||
if inf.startswith('地区'):
|
||||
vod['vod_area'] = inf.replace("地区:", "")
|
||||
if inf.startswith('年份'):
|
||||
vod['vod_year'] = inf.replace("年份:", "")
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content.replace("\xa0", "/").replace("主演:", "")
|
||||
if content.startswith('导演'):
|
||||
vod['vod_director'] = content.replace("\xa0", "").replace("导演:", "")
|
||||
vod_play_url = '$$$'
|
||||
vod['vod_play_from'] = '完美看看'
|
||||
purl = divContent.xpath(".//div[@class='stui-pannel_bd col-pd clearfix']/ul/li")
|
||||
playList = []
|
||||
vodItems = []
|
||||
for plurl in purl:
|
||||
plaurl = plurl.xpath(".//a/@href")[0]
|
||||
name = plurl.xpath(".//a/text()")[0]
|
||||
tId = self.regStr(plaurl, '/play/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {}
|
||||
url = 'https://www.wanmeikk.film/play/{0}.html'.format(id)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
scripts = root.xpath("//div[@class='stui-player__video embed-responsive embed-responsive-16by9 clearfix']/script/text()")[0]
|
||||
key = scripts.split("url")[1].replace('"', "").replace(':', "").replace(',', "").replace("'", "")
|
||||
surl = 'https://www.wanmeikk.film/dplayer.php?url={0}'.format(key)
|
||||
srsp = self.fetch(surl)
|
||||
sroot = self.html(srsp.text)
|
||||
murl = sroot.xpath("//script[@type='text/javascript']/text()")[0]
|
||||
mp4url = re.findall(r"var urls = '(.*)';", murl)[0]
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = mp4url
|
||||
result["header"] = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def localProxy(self, param):
|
||||
action = {
|
||||
'url': '',
|
||||
'header': '',
|
||||
'param': '',
|
||||
'type': 'string',
|
||||
'after': ''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,258 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "x小猫咪"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影":"1",
|
||||
"电视剧":"2",
|
||||
"综艺":"3",
|
||||
"动漫":"4",
|
||||
"纪录":"5"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
tmpRsp = self.fetch("https://xmaomi.net/")
|
||||
suffix = self.regStr(tmpRsp.text,"window.location.href =\"(\\S+)\"")
|
||||
url = "https://xmaomi.net"+suffix
|
||||
# self.cookie = rsp.cookies
|
||||
rsp = self.fetch(url,cookies=tmpRsp.cookies)
|
||||
root = self.html(rsp.text)
|
||||
print(rsp.text[0])
|
||||
print(root)
|
||||
aList = root.xpath("//ul[contains(@class,'hl-vod-list')]/li/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('./@data-original')[0]
|
||||
mark = a.xpath("./div[@class='hl-pic-text']/span/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
|
||||
urlParams = ["", "", "", "", "", "", "", "", "", "", "", ""]
|
||||
urlParams[0] = tid
|
||||
urlParams[8] = pg
|
||||
for key in extend:
|
||||
urlParams[int(key)] = extend[key]
|
||||
params = '-'.join(urlParams)
|
||||
url = 'https://xmaomi.net/vod_____show/{0}.html'.format(params)
|
||||
tmpRsp = self.fetch(url)
|
||||
suffix = self.regStr(tmpRsp.text,"window.location.href =\"(\\S+)\"")
|
||||
url = 'https://xmaomi.net'+suffix
|
||||
rsp = self.fetch(url,cookies=tmpRsp.cookies)
|
||||
root = self.html(rsp.text)
|
||||
print(rsp.text[0])
|
||||
print(root)
|
||||
aList = root.xpath("//ul[contains(@class,'hl-vod-list')]/li/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('./@data-original')[0]
|
||||
mark = a.xpath("./div[@class='hl-pic-text']/span/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'https://xmaomi.net/{0}.html'.format(tid)
|
||||
tmpRsp = self.fetch(url)
|
||||
suffix = self.regStr(tmpRsp.text,"window.location.href =\"(\\S+)\"")
|
||||
url = "https://xmaomi.net"+suffix
|
||||
rsp = self.fetch(url,cookies=tmpRsp.cookies)
|
||||
root = self.html(rsp.text)
|
||||
print(rsp.text[0])
|
||||
print(root)
|
||||
divContent = root.xpath("//div[contains(@class,'hl-full-box')]")[0]
|
||||
title = divContent.xpath("./div[@class='hl-item-pic']/span/@title")[0]
|
||||
pic = divContent.xpath("./div[@class='hl-item-pic']/span/@data-original")[0]
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":"",
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":""
|
||||
}
|
||||
liArray = divContent.xpath(".//li")
|
||||
for li in liArray:
|
||||
content = li.xpath('string(.)')
|
||||
if content.startswith('类型'):
|
||||
vod['type_name'] = content
|
||||
if content.startswith('年份'):
|
||||
vod['vod_year'] = content
|
||||
if content.startswith('地区'):
|
||||
vod['vod_area'] = content
|
||||
if content.startswith('状态'):
|
||||
vod['vod_remarks'] = content
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content
|
||||
if content.startswith('导演'):
|
||||
vod['vod_director'] = content
|
||||
if content.startswith('简介'):
|
||||
vod['vod_content'] = content
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath("//div[contains(@class,'hl-rb-tips')]//span[@class='hl-text-site']/text()")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v)
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath(".//div[contains(@class,'hl-play-source')]//ul")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./li/a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('string(.)')
|
||||
tId = self.regStr(href,'/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
url = 'https://xmaomi.net/v_search/{0}-------------.html'.format(key)
|
||||
tmpRsp = self.fetch(url)
|
||||
suffix = self.regStr(tmpRsp.text,"window.location.href =\"(\\S+)\"")
|
||||
url = "https://xmaomi.net"+suffix
|
||||
rsp = self.fetch(url,cookies=tmpRsp.cookies)
|
||||
root = self.html(rsp.text)
|
||||
print(rsp.text[0])
|
||||
print(root)
|
||||
aList = root.xpath("//ul[contains(@class,'hl-one-list')]/li//a[contains(@class,'hl-item-thumb')]")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
print(name)
|
||||
pic = a.xpath('./@data-original')[0]
|
||||
print(pic)
|
||||
mark = a.xpath("./div[@class='hl-pic-text']/span/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
url = 'https://xmaomi.net/{0}.html'.format(id)
|
||||
tmpRsp = self.fetch(url)
|
||||
suffix = self.regStr(tmpRsp.text,"window.location.href =\"(\\S+)\"")
|
||||
url = "https://xmaomi.net"+suffix
|
||||
rsp = self.fetch(url,cookies=tmpRsp.cookies)
|
||||
root = self.html(rsp.text)
|
||||
print(rsp.text[0])
|
||||
print(root)
|
||||
scripts = root.xpath("//script/text()")
|
||||
jo = {}
|
||||
for script in scripts:
|
||||
if(script.startswith("var player_")):
|
||||
target = script[script.index('{'):]
|
||||
jo = json.loads(target)
|
||||
break;
|
||||
parseUrl = ""
|
||||
print(jo)
|
||||
htmlUrl = 'https://play.fositv.com/?url={0}&tm={1}&key={2}&next=&title='.format(jo['url'],jo['tm'],jo['key'])
|
||||
htmlRsp = self.fetch(htmlUrl)
|
||||
htmlRoot = self.html(htmlRsp.text)
|
||||
configScripts = htmlRoot.xpath("//script/text()")
|
||||
configJo = {}
|
||||
for script in configScripts:
|
||||
if(script.strip().startswith("var config")):
|
||||
target = script[script.index('{'):(script.index('}')+1)]
|
||||
configJo = json.loads(target)
|
||||
break;
|
||||
param = {
|
||||
'url': configJo['url'],
|
||||
'time': configJo['time'],
|
||||
'key': configJo['key']
|
||||
}
|
||||
postRsp = self.post('https://play.fositv.com/API.php',param)
|
||||
resultJo = json.loads(postRsp.text)
|
||||
result = {
|
||||
'parse':0,
|
||||
'playUrl':'',
|
||||
'url':resultJo['url'],
|
||||
'header':{
|
||||
'User-Agent':resultJo['ua']
|
||||
}
|
||||
}
|
||||
return result
|
||||
|
||||
cookie = {}
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"1":[{"key":0,"name":"分类","value":[{"n":"全部","v":"1"},{"n":"动作","v":"101"},{"n":"喜剧","v":"102"},{"n":"爱情","v":"103"},{"n":"科幻","v":"104"},{"n":"剧情","v":"105"},{"n":"悬疑","v":"106"},{"n":"惊悚","v":"107"},{"n":"恐怖","v":"108"},{"n":"犯罪","v":"109"},{"n":"谍战","v":"110"},{"n":"冒险","v":"111"},{"n":"奇幻","v":"112"},{"n":"灾难","v":"113"},{"n":"战争","v":"114"},{"n":"动画","v":"115"},{"n":"歌舞","v":"116"},{"n":"历史","v":"117"},{"n":"传记","v":"118"},{"n":"纪录","v":"119"},{"n":"其他","v":"120"}]},{"key":1,"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":"其他"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"2":[{"key":0,"name":"分类","value":[{"n":"全部","v":"2"},{"n":"武侠","v":"201"},{"n":"喜剧","v":"202"},{"n":"爱情","v":"203"},{"n":"剧情","v":"204"},{"n":"青春","v":"205"},{"n":"悬疑","v":"206"},{"n":"科幻","v":"207"},{"n":"军事","v":"208"},{"n":"警匪","v":"209"},{"n":"谍战","v":"210"},{"n":"奇幻","v":"211"},{"n":"偶 像","v":"212"},{"n":"年代","v":"213"},{"n":"乡村","v":"214"},{"n":"都市","v":"215"},{"n":"家庭","v":"216"},{"n":"古装","v":"217"},{"n":"历史","v":"218"},{"n":"神话","v":"219"},{"n":"其他","v":"220"}]},{"key":1,"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":"其他"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"3":[{"key":0,"name":"分类","value":[{"n":"全部","v":"3"},{"n":"脱口秀","v":"301"},{"n":"真人秀","v":"302"},{"n":"搞笑","v":"303"},{"n":"访谈","v":"304"},{"n":"生活","v":"305"},{"n":"晚会","v":"306"},{"n":"美食","v":"307"},{"n":"游戏","v":"308"},{"n":"亲子","v":"309"},{"n":"旅游","v":"310"},{"n":"文化","v":"311"},{"n":"体育","v":"312"},{"n":"时尚","v":"313"},{"n":"纪实","v":"314"},{"n":"益智","v":"315"},{"n":"演艺","v":"316"},{"n":"歌舞","v":"317"},{"n":"音乐","v":"318"},{"n":"播报","v":"319"},{"n":"其他","v":"320"}]},{"key":1,"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":"其他"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"4":[{"key":0,"name":"分类","value":[{"n":"全部","v":"4"},{"n":"热血","v":"401"},{"n":"格斗","v":"402"},{"n":"恋爱","v":"403"},{"n":"美少女","v":"404"},{"n":"校园","v":"405"},{"n":"搞笑","v":"406"},{"n":"LOLI","v":"407"},{"n":"神魔","v":"408"},{"n":"机战","v":"409"},{"n":"科幻","v":"410"},{"n":"真人","v":"411"},{"n":"青春","v":"412"},{"n":"魔法","v":"413"},{"n":"神话","v":"414"},{"n":"冒险","v":"415"},{"n":"运动","v":"416"},{"n":"竞技","v":"417"},{"n":"童话","v":"418"},{"n":"亲子","v":"419"},{"n":"教育","v":"420"}]},{"key":1,"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":"其他"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],"5":[{"key":0,"name":"分类","value":[{"n":"全部","v":"5"},{"n":"人物","v":"501"},{"n":"军事","v":"502"},{"n":"历史","v":"503"},{"n":"自然","v":"504"},{"n":"探险","v":"505"},{"n":"科技","v":"506"},{"n":"文化","v":"507"},{"n":"刑侦","v":"508"},{"n":"社会","v":"509"},{"n":"旅游","v":"510"},{"n":"其他","v":"511"}]},{"key":1,"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":"其他"}]},{"key":11,"name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":5,"name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":2,"name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}]}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,149 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "央视"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"等着我": "TOPC1451378757637200",
|
||||
"我爱发明": "TOPC1569314345479107",
|
||||
"动物世界": "TOPC1451378967257534",
|
||||
"探索发现": "TOPC1451557893544236",
|
||||
"创新进行时": "TOPC1570875218228998",
|
||||
"我爱发明2021": "TOPC1451557970755294",
|
||||
"经典咏流传 第五季":"VIDAIiNbDQzOjE5mLl3T4t2B220403"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
extend['id'] = tid
|
||||
extend['p'] = pg
|
||||
filterParams = ["id", "p", "d"]
|
||||
params = ["", "", ""]
|
||||
for idx in range(len(filterParams)):
|
||||
fp = filterParams[idx]
|
||||
if fp in extend.keys():
|
||||
params[idx] = '{0}={1}'.format(filterParams[idx],extend[fp])
|
||||
suffix = '&'.join(params)
|
||||
url = 'https://api.cntv.cn/NewVideo/getVideoListByColumn?{0}&n=20&sort=desc&mode=0&serviceId=tvcctv&t=json'.format(suffix)
|
||||
if not tid.startswith('TOPC'):
|
||||
url = 'https://api.cntv.cn/NewVideo/getVideoListByAlbumIdNew?{0}&n=20&sort=desc&mode=0&serviceId=tvcctv&t=json'.format(suffix)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
vodList = jo['data']['list']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
guid = vod['guid']
|
||||
title = vod['title']
|
||||
img = vod['image']
|
||||
brief = vod['brief']
|
||||
videos.append({
|
||||
"vod_id":guid+"###"+img,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":''
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
aid = array[0].split('###')
|
||||
tid = aid[0]
|
||||
url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid={0}".format(tid)
|
||||
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
jo = json.loads(rsp.text)
|
||||
title = jo['title'].strip()
|
||||
link = jo['hls_url'].strip()
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":aid[1],
|
||||
"type_name":'',
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":""
|
||||
}
|
||||
vod['vod_play_from'] = 'CCTV'
|
||||
vod['vod_play_url'] = title+"$"+link
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
rsp = self.fetch(id,headers=self.header)
|
||||
content = rsp.text.strip()
|
||||
arr = content.split('\n')
|
||||
urlPrefix = self.regStr(id,'(http[s]?://[a-zA-z0-9.]+)/')
|
||||
|
||||
subUrl = arr[-1].split('/')
|
||||
subUrl[3] = '1200'
|
||||
subUrl[-1] = '1200.m3u8'
|
||||
hdUrl = urlPrefix + '/'.join(subUrl)
|
||||
|
||||
url = urlPrefix + arr[-1]
|
||||
|
||||
hdRsp = self.fetch(hdUrl,headers=self.header)
|
||||
if hdRsp.status_code == 200:
|
||||
url = hdUrl
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"TOPC1451557970755294": [{"key": "d", "name": "年份", "value": [{"n": "全部", "v": ""}, {"n": "2021", "v": "2021"}, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, {"n": "2017", "v": "2017"}, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "2014", "v": "2014"}, {"n": "2013", "v": "2013"}, {"n": "2012", "v": "2012"}, {"n": "2011", "v": "2011"}, {"n": "2010", "v": "2010"}, {"n": "2009", "v": "2009"}]}]}
|
||||
}
|
||||
header = {
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,218 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "央视大全"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"央视大全": "CCTV"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
month = ""
|
||||
year = ""
|
||||
if 'month' in extend.keys():
|
||||
month = extend['month']
|
||||
if 'year' in extend.keys():
|
||||
year = extend['year']
|
||||
if year == '':
|
||||
month = ''
|
||||
prefix = year + month
|
||||
extend['p'] = pg
|
||||
filterMap = {
|
||||
"fl":"",
|
||||
"fc":"",
|
||||
"cid":"",
|
||||
"p":"1"
|
||||
}
|
||||
suffix = ""
|
||||
for key in filterMap.keys():
|
||||
if key in extend.keys():
|
||||
filterMap[key] = extend[key]
|
||||
suffix = suffix + '&' + key + '=' + filterMap[key]
|
||||
url = 'https://api.cntv.cn/lanmu/columnSearch?{0}&n=20&serviceId=tvcctv&t=json'.format(suffix)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
vodList = jo['response']['docs']
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
lastVideo = vod['lastVIDE']['videoSharedCode']
|
||||
if len(lastVideo) == 0:
|
||||
lastVideo = '_'
|
||||
guid = prefix+'###'+vod['column_name']+'###'+lastVideo+'###'+vod['column_logo']
|
||||
# guid = prefix+'###'+vod['column_website']+'###'+vod['column_logo']
|
||||
title = vod['column_name']
|
||||
img = vod['column_logo']
|
||||
videos.append({
|
||||
"vod_id":guid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":''
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
aid = array[0].split('###')
|
||||
tid = aid[0]
|
||||
logo = aid[3]
|
||||
lastVideo = aid[2]
|
||||
title = aid[1]
|
||||
date = aid[0]
|
||||
if lastVideo == '_':
|
||||
return {}
|
||||
|
||||
lastUrl = 'https://api.cntv.cn/video/videoinfoByGuid?guid={0}&serviceId=tvcctv'.format(lastVideo)
|
||||
lastJo = self.fetch(lastUrl,headers=self.header).json()
|
||||
topicId = lastJo['ctid']
|
||||
url = "https://api.cntv.cn/NewVideo/getVideoListByColumn?id={0}&d={1}&p=1&n=100&sort=desc&mode=0&serviceId=tvcctv&t=json".format(topicId,date)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
vodList = jo['data']['list']
|
||||
videoList = []
|
||||
for video in vodList:
|
||||
videoList.append(video['title']+"$"+video['guid'])
|
||||
if len(videoList) == 0:
|
||||
return {}
|
||||
if len(date) == 0:
|
||||
date = time.strftime("%Y", time.localtime(time.time()))
|
||||
vod = {
|
||||
"vod_id":array[0],
|
||||
"vod_name":date +" "+title,
|
||||
"vod_pic":logo,
|
||||
"type_name":lastJo['channel'],
|
||||
"vod_year":date,
|
||||
"vod_area":"",
|
||||
"vod_remarks":date,
|
||||
"vod_actor":"",
|
||||
"vod_director":topicId,
|
||||
"vod_content":"当前页面默认只展示最新100期的内容,可在分类页面选择年份和月份进行往期节目查看。年份和月份仅影响当前页面内容,不参与分类过滤。视频默认播放可以获取到的最高帧率。"
|
||||
}
|
||||
|
||||
vod['vod_play_from'] = 'CCTV'
|
||||
vod['vod_play_url'] = "#".join(videoList)
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
# def detailContent(self,array):
|
||||
# aid = array[0].split('###')
|
||||
# tid = aid[0]
|
||||
# logo = aid[2]
|
||||
# webSite = aid[1]
|
||||
# date = aid[0]
|
||||
# rsp = self.fetch(webSite,headers=self.header)
|
||||
# topicId = ''
|
||||
# root = self.html(rsp.text)
|
||||
# topicId = self.regStr(rsp.text,"(TOPC[0-9]{16})")
|
||||
# title = root.xpath('.//title/text()')[0]
|
||||
# if len(topicId) <= 0:
|
||||
# return {}
|
||||
# url = "https://api.cntv.cn/NewVideo/getVideoListByColumn?id={0}&d={1}&p=1&n=100&sort=desc&mode=0&serviceId=tvcctv&t=json".format(topicId,date)
|
||||
# jo = self.fetch(url,headers=self.header).json()
|
||||
# vodList = jo['data']['list']
|
||||
# videoList = []
|
||||
# for video in vodList:
|
||||
# videoList.append(video['title']+"$"+video['guid'])
|
||||
# if len(videoList) == 0:
|
||||
# return {}
|
||||
# if len(date) == 0:
|
||||
# date = '近期'
|
||||
# vod = {
|
||||
# "vod_id":array[0],
|
||||
# "vod_name":date +" "+title,
|
||||
# "vod_pic":logo,
|
||||
# "type_name":'',
|
||||
# "vod_year":date,
|
||||
# "vod_area":"",
|
||||
# "vod_remarks":date,
|
||||
# "vod_actor":"",
|
||||
# "vod_director":"",
|
||||
# "vod_content":"详情页面默认只展示最新100期的内容,可以在分类页面选择年份和月份进行往期节目查看。年份和月份仅影响视频详情内容,不参与分类过滤。视频默认播放最高帧率。"
|
||||
# }
|
||||
|
||||
# vod['vod_play_from'] = 'CCTV'
|
||||
# vod['vod_play_url'] = "#".join(videoList)
|
||||
# result = {
|
||||
# 'list':[
|
||||
# vod
|
||||
# ]
|
||||
# }
|
||||
# return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid={0}".format(id)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
link = jo['hls_url'].strip()
|
||||
rsp = self.fetch(link,headers=self.header)
|
||||
content = rsp.text.strip()
|
||||
arr = content.split('\n')
|
||||
urlPrefix = self.regStr(link,'(http[s]?://[a-zA-z0-9.]+)/')
|
||||
|
||||
subUrl = arr[-1].split('/')
|
||||
subUrl[3] = '1200'
|
||||
subUrl[-1] = '1200.m3u8'
|
||||
hdUrl = urlPrefix + '/'.join(subUrl)
|
||||
|
||||
url = urlPrefix + arr[-1]
|
||||
|
||||
hdRsp = self.fetch(hdUrl,headers=self.header)
|
||||
if hdRsp.status_code == 200:
|
||||
url = hdUrl
|
||||
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {"CCTV":[{"key":"cid","name":"频道","value":[{"n":"全部","v":""},{"n":"CCTV-1综合","v":"EPGC1386744804340101"},{"n":"CCTV-2财经","v":"EPGC1386744804340102"},{"n":"CCTV-3综艺","v":"EPGC1386744804340103"},{"n":"CCTV-4中文国际","v":"EPGC1386744804340104"},{"n":"CCTV-5体育","v":"EPGC1386744804340107"},{"n":"CCTV-6电影","v":"EPGC1386744804340108"},{"n":"CCTV-7国防军事","v":"EPGC1386744804340109"},{"n":"CCTV-8电视剧","v":"EPGC1386744804340110"},{"n":"CCTV-9纪录","v":"EPGC1386744804340112"},{"n":"CCTV-10科教","v":"EPGC1386744804340113"},{"n":"CCTV-11戏曲","v":"EPGC1386744804340114"},{"n":"CCTV-12社会与法","v":"EPGC1386744804340115"},{"n":"CCTV-13新闻","v":"EPGC1386744804340116"},{"n":"CCTV-14少儿","v":"EPGC1386744804340117"},{"n":"CCTV-15音乐","v":"EPGC1386744804340118"},{"n":"CCTV-16奥林匹克","v":"EPGC1634630207058998"},{"n":"CCTV-17农业农村","v":"EPGC1563932742616872"},{"n":"CCTV-5+体育赛事","v":"EPGC1468294755566101"}]},{"key":"fc","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":"影视"}]},{"key":"fl","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"month","name":"月份","value":[{"n":"全部","v":""},{"n":"12","v":"12"},{"n":"11","v":"11"},{"n":"10","v":"10"},{"n":"09","v":"09"},{"n":"08","v":"08"},{"n":"07","v":"07"},{"n":"06","v":"06"},{"n":"05","v":"05"},{"n":"04","v":"04"},{"n":"03","v":"03"},{"n":"02","v":"02"},{"n":"01","v":"01"}]}]}
|
||||
}
|
||||
header = {
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36",
|
||||
"Origin": "https://tv.cctv.com",
|
||||
"Referer": "https://tv.cctv.com/"
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,63 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import requests
|
||||
|
||||
class Spider(Spider):
|
||||
def getDependence(self):
|
||||
return ['py_ali']
|
||||
def getName(self):
|
||||
return "py_yiso"
|
||||
def init(self,extend):
|
||||
self.ali = extend[0]
|
||||
print("============py_yiso============")
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
return result
|
||||
header = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 12; V2049A Build/SP1A.210812.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.129 Mobile Safari/537.36",
|
||||
"Referer": "https://yiso.fun/"
|
||||
}
|
||||
def detailContent(self,array):
|
||||
return self.ali.detailContent(array)
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
url = "https://yiso.fun/api/search?name={0}&from=ali".format(key)
|
||||
vodList = requests.get(url=url, headers=self.header, verify=False).json()["data"]["list"]
|
||||
videos = []
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id": vod["url"],
|
||||
"vod_name": vod["fileInfos"][0]["fileName"],
|
||||
"vod_pic": "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000",
|
||||
"vod_remarks": vod['gmtCreate']
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
return self.ali.playerContent(flag,id,vipFlags)
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,126 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "一席"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
url = 'https://yixi.tv/api/site/category/?_=1'
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
category = jo['data']['items']
|
||||
classes = []
|
||||
classes.append({
|
||||
'type_name':'全部',
|
||||
'type_id':''
|
||||
})
|
||||
for cat in category:
|
||||
classes.append({
|
||||
'type_name':cat['title'],
|
||||
'type_id':cat['id']
|
||||
})
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
# url = 'https://yixi.tv/api/site/album/?page=1&page_size=4&_=1'
|
||||
url = 'https://yixi.tv/api/site/album/22/detail/?page=1&page_size=24&_=1'
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
videos = []
|
||||
vodList = jo['data']['items']
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id":vod['id'],
|
||||
"vod_name":vod['title'],
|
||||
"vod_pic":vod['cover'],
|
||||
"vod_remarks":vod['time']
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'https://yixi.tv/api/site/speech/?page={1}&page_size=12&category_id={0}&order_by=0&_=1'.format(tid,pg)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
videos = []
|
||||
vodList = jo['data']['items']
|
||||
for vod in vodList:
|
||||
videos.append({
|
||||
"vod_id":vod['id'],
|
||||
"vod_name":vod['title'],
|
||||
"vod_pic":vod['cover'],
|
||||
"vod_remarks":vod['time']
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = "https://yixi.tv/api/site/speech/{0}/detail/?_=1".format(tid)
|
||||
jo = self.fetch(url,headers=self.header).json()
|
||||
|
||||
vod = {
|
||||
"vod_id":jo['data']['speech']['id'],
|
||||
"vod_name":jo['data']['speech']['title'],
|
||||
"vod_pic":jo['data']['speech']['cover'],
|
||||
"type_name":jo['data']['speech']['first_category'],
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":jo['data']['speech']['date'],
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":jo['data']['speech']['titlelanguage']
|
||||
}
|
||||
|
||||
vod['vod_play_from'] = '一席'
|
||||
pList = []
|
||||
for vUrl in jo['data']['speech']['video_url']:
|
||||
pList.append(vUrl['type_name']+"$"+vUrl['video_url'])
|
||||
vod['vod_play_url'] = '#'.join(pList)
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {
|
||||
'list':[]
|
||||
}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = id
|
||||
result["header"] = ''
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
|
||||
}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,136 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "体育直播"
|
||||
def init(self,extend=""):
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"全部": "0",
|
||||
"足球": "1",
|
||||
"篮球": "2",
|
||||
"其他": "5"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if (filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
url = 'https://json.cranemarsh.com/all_live_rooms.json'
|
||||
rsp = self.fetch(url)
|
||||
pat = 'all_live_rooms\\((.*)\\)'
|
||||
Root = self.regStr(rsp.text, pat)
|
||||
jRoot = json.loads(Root)
|
||||
videos = []
|
||||
vodList = jRoot['data'][tid]
|
||||
for vod in vodList:
|
||||
aid = vod['roomNum']
|
||||
title = vod['title'].strip()
|
||||
img = vod['cover'].strip()
|
||||
remark = vod['anchor']['nickName'].strip()
|
||||
videos.append({
|
||||
"vod_id":aid,
|
||||
"vod_name":title,
|
||||
"vod_pic":img,
|
||||
"vod_remarks":remark
|
||||
})
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
|
||||
def detailContent(self,array):
|
||||
aid = array[0]
|
||||
url = "https://json.cranemarsh.com/room/{0}/detail.json".format(aid)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
pat = 'detail\\((.*)\\)'
|
||||
Root = self.regStr(rsp.text, pat)
|
||||
jRoot = json.loads(Root)
|
||||
jo = jRoot['data']['room']
|
||||
id = jo['roomNum']
|
||||
title = jo['title']
|
||||
pic = jo['cover']
|
||||
vod = {
|
||||
"vod_id":id,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":'',
|
||||
"vod_year":"",
|
||||
"vod_area":'',
|
||||
"vod_remarks":'',
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":''
|
||||
}
|
||||
ja = jRoot['data']['stream']
|
||||
flv = ja['flv']
|
||||
hdFlv = ja['hdFlv']
|
||||
m3u8 = ja['m3u8']
|
||||
hdM3u8 = ja['hdM3u8']
|
||||
playUrl = 'FLV' + '$' + flv + '#' + '高清FLV' + '$' + hdFlv + '#' + 'M3U8' + '$' + m3u8 + '#' + '高清M3U8' + '$' + hdM3u8 + '#'
|
||||
vod['vod_play_from'] = '体育直播'
|
||||
vod['vod_play_url'] = playUrl
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
def searchContent(self,key,quick):
|
||||
result = {}
|
||||
return result
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = id
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ''
|
||||
result["url"] = url
|
||||
result["header"] = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
|
||||
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
def localProxy(self,param):
|
||||
action = {
|
||||
'url':'',
|
||||
'header':'',
|
||||
'param':'',
|
||||
'type':'string',
|
||||
'after':''
|
||||
}
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,85 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
|
||||
class Spider(Spider):
|
||||
def getDependence(self):
|
||||
return ['py_ali']
|
||||
def getName(self):
|
||||
return "py_zhaozy"
|
||||
def init(self,extend):
|
||||
self.ali = extend[0]
|
||||
print("============py_zhaozy============")
|
||||
pass
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
result = {}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
return result
|
||||
header = {
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36",
|
||||
"Referer": "https://zhaoziyuan.me/"
|
||||
}
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
print(self.getName())
|
||||
pattern = '(https://www.aliyundrive.com/s/[^\"]+)'
|
||||
url = self.regStr(tid,pattern)
|
||||
if len(url) > 0:
|
||||
return self.ali.detailContent(array)
|
||||
|
||||
rsp = self.fetch('https://zhaoziyuan.me/'+tid)
|
||||
url = self.regStr(rsp.text,pattern)
|
||||
if len(url) == 0:
|
||||
return ""
|
||||
newArray = [url]
|
||||
print(newArray)
|
||||
return self.ali.detailContent(newArray)
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
map = {
|
||||
'7':'文件夹',
|
||||
'1':'视频'
|
||||
}
|
||||
ja = []
|
||||
for tKey in map.keys():
|
||||
url = "https://zhaoziyuan.me/so?filename={0}&t={1}".format(key,tKey)
|
||||
rsp = self.fetch(url,headers=self.header)
|
||||
root = self.html(self.cleanText(rsp.text))
|
||||
aList = root.xpath("//li[@class='clear']//a")
|
||||
for a in aList:
|
||||
# title = a.xpath('./h3/text()')[0] + a.xpath('./p/text()')[0]
|
||||
title = self.xpText(a,'./h3/text()') + self.xpText(a,'./p/text()')
|
||||
pic = 'https://img0.baidu.com/it/u=603086994,1727626977&fm=253&fmt=auto?w=500&h=667'
|
||||
jo = {
|
||||
'vod_id': self.xpText(a,'@href'),
|
||||
'vod_name': '[{0}]{1}'.format(key,title),
|
||||
'vod_pic': pic
|
||||
}
|
||||
ja.append(jo)
|
||||
result = {
|
||||
'list':ja
|
||||
}
|
||||
return result
|
||||
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
return self.ali.playerContent(flag,id,vipFlags)
|
||||
|
||||
config = {
|
||||
"player": {},
|
||||
"filter": {}
|
||||
}
|
||||
header = {}
|
||||
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,246 +0,0 @@
|
||||
#coding=utf-8
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import json
|
||||
|
||||
class Spider(Spider): # 元类 默认的元类 type
|
||||
def getName(self):
|
||||
return "在线之家"
|
||||
def init(self,extend=""):
|
||||
print("============{0}============".format(extend))
|
||||
pass
|
||||
def homeContent(self,filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
"电影":"1",
|
||||
"美剧":"2",
|
||||
"韩剧":"3",
|
||||
"日剧":"4",
|
||||
"泰剧":"5",
|
||||
"动漫":"6"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name':k,
|
||||
'type_id':cateManual[k]
|
||||
})
|
||||
|
||||
result['class'] = classes
|
||||
if(filter):
|
||||
result['filters'] = self.config['filter']
|
||||
return result
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch("https://zxzj.vip/")
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//div[@class='stui-vodlist__box']/a")
|
||||
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('./@data-original')[0]
|
||||
mark = a.xpath("./span[@class='pic-text text-right']/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/detail/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
result = {
|
||||
'list':videos
|
||||
}
|
||||
return result
|
||||
def categoryContent(self,tid,pg,filter,extend):
|
||||
result = {}
|
||||
if 'id' not in extend.keys():
|
||||
extend['id'] = tid
|
||||
extend['page'] = pg
|
||||
filterParams = ["id", "area", "by", "class", "lang", "", "", "", "page", "", "", "year"]
|
||||
params = ["", "", "", "", "", "", "", "", "", "", "", ""]
|
||||
for idx in range(len(filterParams)):
|
||||
fp = filterParams[idx]
|
||||
if fp in extend.keys():
|
||||
params[idx] = extend[fp]
|
||||
suffix = '-'.join(params)
|
||||
url = 'https://zxzj.vip/vodshow/{0}.html'.format(suffix)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
aList = root.xpath("//div[@class='stui-vodlist__box']/a")
|
||||
videos = []
|
||||
for a in aList:
|
||||
name = a.xpath('./@title')[0]
|
||||
pic = a.xpath('./@data-original')[0]
|
||||
mark = a.xpath("./span[@class='pic-text text-right']/text()")[0]
|
||||
sid = a.xpath("./@href")[0]
|
||||
sid = self.regStr(sid,"/detail/(\\S+).html")
|
||||
videos.append({
|
||||
"vod_id":sid,
|
||||
"vod_name":name,
|
||||
"vod_pic":pic,
|
||||
"vod_remarks":mark
|
||||
})
|
||||
|
||||
result['list'] = videos
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
return result
|
||||
def detailContent(self,array):
|
||||
tid = array[0]
|
||||
url = 'https://zxzj.vip/detail/{0}.html'.format(tid)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
node = root.xpath("//div[@class='stui-content']")[0]
|
||||
|
||||
pic = node.xpath(".//img/@data-original")[0]
|
||||
title = node.xpath('.//h1/text()')[0]
|
||||
detail = node.xpath(".//span[@class='detail-content']/text()")[0]
|
||||
|
||||
vod = {
|
||||
"vod_id":tid,
|
||||
"vod_name":title,
|
||||
"vod_pic":pic,
|
||||
"type_name":"",
|
||||
"vod_year":"",
|
||||
"vod_area":"",
|
||||
"vod_remarks":"",
|
||||
"vod_actor":"",
|
||||
"vod_director":"",
|
||||
"vod_content":detail
|
||||
}
|
||||
|
||||
infoArray = node.xpath(".//div[@class='stui-content__detail']/p")
|
||||
for info in infoArray:
|
||||
content = info.xpath('string(.)')
|
||||
if content.startswith('类型'):
|
||||
vod['type_name'] = content
|
||||
# if content.startswith('年份'):
|
||||
# vod['vod_year'] = content
|
||||
# if content.startswith('地区'):
|
||||
# vod['vod_area'] = content
|
||||
# if content.startswith('更新'):
|
||||
# vod['vod_remarks'] = content.replace('\n','').replace('\t','')
|
||||
if content.startswith('主演'):
|
||||
vod['vod_actor'] = content.replace('\n','').replace('\t','')
|
||||
if content.startswith('导演'):
|
||||
vod['vod_director'] = content.replace('\n','').replace('\t','')
|
||||
# if content.startswith('剧情'):
|
||||
# vod['vod_content'] = content.replace('\n','').replace('\t','')
|
||||
|
||||
vod_play_from = '$$$'
|
||||
playFrom = []
|
||||
vodHeader = root.xpath("//div[@class='stui-vodlist__head']/h3/text()")
|
||||
for v in vodHeader:
|
||||
playFrom.append(v)
|
||||
vod_play_from = vod_play_from.join(playFrom)
|
||||
|
||||
vod_play_url = '$$$'
|
||||
playList = []
|
||||
vodList = root.xpath("//ul[contains(@class,'stui-content__playlist')]")
|
||||
for vl in vodList:
|
||||
vodItems = []
|
||||
aList = vl.xpath('./li/a')
|
||||
for tA in aList:
|
||||
href = tA.xpath('./@href')[0]
|
||||
name = tA.xpath('./text()')[0]
|
||||
tId = self.regStr(href,'/video/(\\S+).html')
|
||||
vodItems.append(name + "$" + tId)
|
||||
joinStr = '#'
|
||||
joinStr = joinStr.join(vodItems)
|
||||
playList.append(joinStr)
|
||||
vod_play_url = vod_play_url.join(playList)
|
||||
|
||||
vod['vod_play_from'] = vod_play_from
|
||||
vod['vod_play_url'] = vod_play_url
|
||||
|
||||
result = {
|
||||
'list':[
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self,key,quick):
|
||||
url = 'https://zxzj.vip/index.php/ajax/suggest?mid=1&wd={0}'.format(key)
|
||||
# getHeader()
|
||||
rsp = self.fetch(url)
|
||||
jo = json.loads(rsp.text)
|
||||
result = {}
|
||||
jArray = []
|
||||
if int(jo['total']) > 0:
|
||||
for j in jo['list']:
|
||||
jArray.append({
|
||||
"vod_id": j['id'],
|
||||
"vod_name": j['name'],
|
||||
"vod_pic": j['pic'],
|
||||
"vod_remarks": ""
|
||||
})
|
||||
result = {
|
||||
'list':jArray
|
||||
}
|
||||
return result
|
||||
|
||||
config = {
|
||||
"player": {
|
||||
"dpp": {
|
||||
"sh": "DP播放",
|
||||
"pu": "https://jx.zxzj.vip/dplayer.php?url=",
|
||||
"sn": 1,
|
||||
"or": 999
|
||||
}
|
||||
},
|
||||
"filter": {"1": [{"key": "class", "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": "情色"}]}, {"key": "area", "name": "地区", "value": [{"n": "全部", "v": ""}, {"n": "大陆", "v": "大陆"}, {"n": "香港", "v": "香港"}, {"n": "台湾", "v": "台湾"}, {"n": "欧美", "v": "欧美"}, {"n": "韩国", "v": "韩国"}, {"n": "日本", "v": "日本"}, {"n": "泰国", "v": "泰国"}, {"n": "印度", "v": "印度"}, {"n": "俄罗斯", "v": "俄罗斯"}, {"n": "其他", "v": "其他"}]}, {"key": "year", "name": "年份", "value": [{"n": "全部", "v": ""}, {"n": "2022", "v": "2022"}, {"n": "2021", "v": "2021"}, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, {"n": "2017", "v": "2017"}, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "2014", "v": "2014"}, {"n": "2013", "v": "2013"}, {"n": "2012", "v": "2012"}, {"n": "2011", "v": "2011"}, {"n": "2010", "v": "2010"}, {"n": "2009", "v": "2009"}, {"n": "2008", "v": "2008"}, {"n": "2007", "v": "2007"}, {"n": "2006", "v": "2006"}, {"n": "2005", "v": "2005"}, {"n": "2004", "v": "2004"}, {"n": "2003", "v": "2003"}, {"n": "2002", "v": "2002"}, {"n": "2001", "v": "2001"}, {"n": "2000", "v": "2000"}]}, {"key": "lang", "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": "其它"}]}, {"key": "by", "name": "排序", "value": [{"n": "最新", "v": "time"}, {"n": "最热", "v": "hits"}, {"n": "评分", "v": "score"}]}], "2": [{"key": "class", "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": "其他"}]}, {"key": "year", "name": "年份", "value": [{"n": "全部", "v": ""}, {"n": "2022", "v": "2022"}, {"n": "2021", "v": "2021"}, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, {"n": "2017", "v": "2017"}, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "2014", "v": "2014"}, {"n": "2013", "v": "2013"}, {"n": "2012", "v": "2012"}, {"n": "2011", "v": "2011"}, {"n": "2010", "v": "2010"}, {"n": "2009", "v": "2009"}, {"n": "2008", "v": "2008"}, {"n": "2006", "v": "2006"}, {"n": "2005", "v": "2005"}, {"n": "2004", "v": "2004"}]}, {"key": "lang", "name": "语言", "value": [{"n": "全部", "v": ""}, {"n": "英语", "v": "英语"}, {"n": "法语", "v": "法语"}]}, {"key": "by", "name": "排序", "value": [{"n": "最新", "v": "time"}, {"n": "最热", "v": "hits"}, {"n": "评分", "v": "score"}]}], "3": [{"key": "class", "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": "其他"}]}, {"key": "year", "name": "年份", "value": [{"n": "全部", "v": ""}, {"n": "2022", "v": "2022"}, {"n": "2021", "v": "2021"}, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, {"n": "2017", "v": "2017"}, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "2014", "v": "2014"}, {"n": "2013", "v": "2013"}, {"n": "2012", "v": "2012"}, {"n": "2011", "v": "2011"}, {"n": "2010", "v": "2010"}, {"n": "2009", "v": "2009"}, {"n": "2008", "v": "2008"}, {"n": "2007", "v": "2007"}, {"n": "2006", "v": "2006"}, {"n": "2005", "v": "2005"}, {"n": "2004", "v": "2004"}, {"n": "2003", "v": "2003"}, {"n": "2002", "v": "2002"}, {"n": "2001", "v": "2001"}, {"n": "2000", "v": "2000"}]}, {"key": "by", "name": "排序", "value": [{"n": "最新", "v": "time"}, {"n": "最热", "v": "hits"}, {"n": "评分", "v": "score"}]}], "4": [{"key": "class", "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": "其他"}]}, {"key": "year", "name": "年份", "value": [{"n": "全部", "v": ""}, {"n": "2022", "v": "2022"}, {"n": "2021", "v": "2021"}, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, {"n": "2017", "v": "2017"}, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "2014", "v": "2014"}, {"n": "2013", "v": "2013"}, {"n": "2012", "v": "2012"}, {"n": "2011", "v": "2011"}, {"n": "2010", "v": "2010"}, {"n": "2009", "v": "2009"}, {"n": "2008", "v": "2008"}, {"n": "2007", "v": "2007"}, {"n": "2006", "v": "2006"}, {"n": "2005", "v": "2005"}, {"n": "2004", "v": "2004"}, {"n": "2003", "v": "2003"}, {"n": "2002", "v": "2002"}, {"n": "2001", "v": "2001"}, {"n": "2000", "v": "2000"}]}, {"key": "by", "name": "排序", "value": [{"n": "最新", "v": "time"}, {"n": "最热", "v": "hits"}, {"n": "评分", "v": "score"}]}], "5": [{"key": "year", "name": "年份", "value": [{"n": "全部", "v": ""}, {"n": "2022", "v": "2022"}, {"n": "2021", "v": "2021"}, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, {"n": "2017", "v": "2017"}, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "2014", "v": "2014"}, {"n": "2013", "v": "2013"}, {"n": "2012", "v": "2012"}, {"n": "2011", "v": "2011"}, {"n": "2010", "v": "2010"}, {"n": "2009", "v": "2009"}, {"n": "2008", "v": "2008"}, {"n": "2007", "v": "2007"}, {"n": "2006", "v": "2006"}, {"n": "2005", "v": "2005"}, {"n": "2004", "v": "2004"}, {"n": "2003", "v": "2003"}, {"n": "2002", "v": "2002"}, {"n": "2001", "v": "2001"}, {"n": "2000", "v": "2000"}]}, {"key": "by", "name": "排序", "value": [{"n": "最新", "v": "time"}, {"n": "最热", "v": "hits"}, {"n": "评分", "v": "score"}]}], "6": [{"key": "class", "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": "其他"}]}, {"key": "area", "name": "地区", "value": [{"n": "全部", "v": ""}, {"n": "国产", "v": "国产"}, {"n": "日本", "v": "日本"}, {"n": "欧美", "v": "欧美"}, {"n": "其他", "v": "其他"}]}, {"key": "lang", "name": "语言", "value": [{"n": "全部", "v": ""}, {"n": "国语", "v": "国语"}, {"n": "日语", "v": "日语"}, {"n": "英语", "v": "英语"}, {"n": "其他", "v": "其他"}]}, {"key": "year", "name": "年份", "value": [{"n": "全部", "v": ""}, {"n": "2022", "v": "2022"}, {"n": "2021", "v": "2021"}, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, {"n": "2017", "v": "2017"}, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "2014", "v": "2014"}, {"n": "2013", "v": "2013"}, {"n": "2012", "v": "2012"}, {"n": "2011", "v": "2011"}, {"n": "2010", "v": "2010"}, {"n": "2009", "v": "2009"}, {"n": "2008", "v": "2008"}, {"n": "2007", "v": "2007"}, {"n": "2006", "v": "2006"}, {"n": "2005", "v": "2005"}, {"n": "2004", "v": "2004"}, {"n": "2003", "v": "2003"}, {"n": "2002", "v": "2002"}, {"n": "2001", "v": "2001"}, {"n": "2000", "v": "2000"}]}, {"key": "by", "name": "排序", "value": [{"n": "最新", "v": "time"}, {"n": "最热", "v": "hits"}, {"n": "评分", "v": "score"}]}]}
|
||||
}
|
||||
header = {
|
||||
"origin":"https://zxzj.vip",
|
||||
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
|
||||
"Accept":" */*",
|
||||
"Accept-Language":"zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7",
|
||||
"Accept-Encoding":"gzip, deflate"
|
||||
}
|
||||
def playerContent(self,flag,id,vipFlags):
|
||||
result = {}
|
||||
url = 'https://zxzj.vip/video/{0}.html'.format(id)
|
||||
rsp = self.fetch(url)
|
||||
root = self.html(rsp.text)
|
||||
scripts = root.xpath("//script/text()")
|
||||
jo = {}
|
||||
for script in scripts:
|
||||
if(script.startswith("var player_")):
|
||||
target = script[script.index('{'):]
|
||||
jo = json.loads(target)
|
||||
break;
|
||||
parseUrl = ''
|
||||
# src="(\S+url=)
|
||||
# playerConfig = self.config['player']
|
||||
# if jo['from'] in self.config['player']:
|
||||
# playerConfig = self.config['player'][jo['from']]
|
||||
# parseUrl = playerConfig['pu'] + jo['url']
|
||||
scriptUrl = 'https://zxzj.vip/static/player/{0}.js'.format(jo['from'])
|
||||
scriptRsp = self.fetch(scriptUrl)
|
||||
parseUrl = self.regStr(scriptRsp.text,'src="(\\S+url=)')
|
||||
if len(parseUrl) > 0:
|
||||
parseRsp = self.fetch(parseUrl+jo['url'])
|
||||
realUrl = self.regStr(parseRsp.text,"(?<=urls\\s=\\s').*?(?=')",0)
|
||||
if len(realUrl) > 0 :
|
||||
result["parse"] = 0
|
||||
result["playUrl"] = ""
|
||||
result["url"] = realUrl
|
||||
result["header"] = json.dumps(self.header)
|
||||
else:
|
||||
result["parse"] = 1
|
||||
result["playUrl"] = ""
|
||||
result["url"] = jo['url']
|
||||
result["header"] = json.dumps(self.header)
|
||||
return result
|
||||
def isVideoFormat(self,url):
|
||||
pass
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
def localProxy(self,param):
|
||||
return [200, "video/MP2T", action, ""]
|
||||
@@ -1,172 +0,0 @@
|
||||
from spider import Spider, SpiderCategory, SpiderVideo, SpiderEpisode
|
||||
from proxy import get_proxy_main_url
|
||||
from urllib.parse import urlparse
|
||||
from danmaku import get_danmaku_url
|
||||
import requests
|
||||
import hashlib
|
||||
import time
|
||||
|
||||
base_params = {
|
||||
'pcode': '010110005',
|
||||
'version': '2.0.5',
|
||||
'devid': hashlib.md5(str(time.time()).encode()).hexdigest(),
|
||||
'sys': 'android',
|
||||
'sysver': 11,
|
||||
'brand': 'google',
|
||||
'model': 'Pixel_3_XL',
|
||||
'package': 'com.sevenVideo.app.android'
|
||||
}
|
||||
|
||||
base_headers = {
|
||||
'User-Agent': 'okhttp/3.12.0',
|
||||
}
|
||||
|
||||
|
||||
class Spider77(Spider):
|
||||
|
||||
def name(self):
|
||||
return '七七'
|
||||
|
||||
def is_searchable(self):
|
||||
return True
|
||||
|
||||
def list_categories(self):
|
||||
r = requests.get('http://api.kunyu77.com/api.php/provide/filter',
|
||||
headers=base_headers.copy())
|
||||
data = r.json()
|
||||
categories = []
|
||||
for category_id in data['data']:
|
||||
category_name = data['data'][category_id][0]['cat']
|
||||
categories.append(SpiderCategory(category_id, category_name))
|
||||
return categories
|
||||
|
||||
def list_videos(self, category_id, page):
|
||||
r = requests.get('http://api.kunyu77.com/api.php/provide/searchFilter',
|
||||
params={
|
||||
'type_id': category_id,
|
||||
'pagenum': page,
|
||||
'pagesize': 50
|
||||
},
|
||||
headers=base_headers.copy())
|
||||
data = r.json()
|
||||
videos = []
|
||||
for video in data['data']['result']:
|
||||
videos.append(
|
||||
SpiderVideo(id=video['id'],
|
||||
name=video['title'],
|
||||
cover=video['videoCover']))
|
||||
|
||||
has_next_page = page < data['data']['pagesize']
|
||||
return videos, has_next_page
|
||||
|
||||
def list_episodes(self, video_id):
|
||||
ts = int(time.time())
|
||||
params = base_params.copy()
|
||||
params['ids'] = video_id
|
||||
params['sj'] = ts
|
||||
|
||||
headers = base_headers.copy()
|
||||
headers['t'] = str(ts)
|
||||
|
||||
url = 'http://api.kunyu77.com/api.php/provide/videoDetail'
|
||||
headers['TK'] = self._get_tk(url, params, ts)
|
||||
r = requests.get(url, params=params, headers=headers)
|
||||
detail = r.json()['data']
|
||||
|
||||
url = 'http://api.kunyu77.com/api.php/provide/videoPlaylist'
|
||||
headers['TK'] = self._get_tk(url, params, ts)
|
||||
r = requests.get(url, params=params, headers=headers)
|
||||
episodes = r.json()['data']['episodes']
|
||||
|
||||
mepisodes = []
|
||||
for episode in episodes:
|
||||
|
||||
sources = []
|
||||
danmakus = []
|
||||
for playurl in episode['playurls']:
|
||||
if playurl['playfrom'] in ['ppayun']:
|
||||
sources.append({
|
||||
'name': playurl['playfrom'],
|
||||
'params': {
|
||||
'url': playurl['playurl'],
|
||||
}
|
||||
})
|
||||
|
||||
if playurl['playfrom'] in [
|
||||
'qq', 'mgtv', 'qiyi', 'youku', 'bilibili'
|
||||
]:
|
||||
danmakus.append({
|
||||
'name': playurl['playfrom'],
|
||||
'url': get_danmaku_url(playurl['playurl']),
|
||||
})
|
||||
|
||||
mepisodes.append(
|
||||
SpiderEpisode(
|
||||
name=episode['title'],
|
||||
sources=sources,
|
||||
cover=detail['videoCover'],
|
||||
description=detail['brief'],
|
||||
cast=detail['actor'].split(' '),
|
||||
director=detail['director'],
|
||||
area=detail['area'],
|
||||
year=int(detail['year']),
|
||||
danmakus=danmakus,
|
||||
))
|
||||
|
||||
return mepisodes
|
||||
|
||||
def resolve_play_url(self, episode_params):
|
||||
headers = base_headers.copy()
|
||||
|
||||
r = requests.get('http://api.kunyu77.com/api.php/provide/parserUrl',
|
||||
params={'url': episode_params['url']},
|
||||
headers=base_headers.copy())
|
||||
data = r.json()['data']
|
||||
if 'playHeader' in data:
|
||||
for key in data['playHeader']:
|
||||
headers[key] = data['playHeader'][key]
|
||||
|
||||
r = requests.get(data['url'])
|
||||
return get_proxy_main_url(r.json()['url'], headers)
|
||||
|
||||
def search_videos(self, keyword):
|
||||
url = 'http://api.kunyu77.com/api.php/provide/searchVideo'
|
||||
|
||||
ts = int(time.time())
|
||||
params = base_params.copy()
|
||||
params['sj'] = ts
|
||||
params['searchName'] = keyword
|
||||
params['pg'] = 1
|
||||
|
||||
headers = base_headers.copy()
|
||||
headers['t'] = str(ts)
|
||||
headers['TK'] = self._get_tk(url, params, ts)
|
||||
|
||||
r = requests.get(url, params=params, headers=headers)
|
||||
data = r.json()
|
||||
videos = []
|
||||
for video in data['data']:
|
||||
videos.append(
|
||||
SpiderVideo(
|
||||
id=video['id'],
|
||||
name=video['videoName'],
|
||||
cover=video['videoCover'],
|
||||
description=video['brief'],
|
||||
cast=video['starName'].split(','),
|
||||
year=int(video['year']),
|
||||
))
|
||||
return videos
|
||||
|
||||
def _get_tk(self, url, params, ts):
|
||||
keys = []
|
||||
for key in params:
|
||||
keys.append(key)
|
||||
keys.sort()
|
||||
|
||||
src = urlparse(url).path
|
||||
for key in keys:
|
||||
src += str(params[key])
|
||||
src += str(ts)
|
||||
src += 'XSpeUFjJ'
|
||||
|
||||
return hashlib.md5(src.encode()).hexdigest()
|
||||
@@ -1,58 +0,0 @@
|
||||
from spider import SpiderVideo
|
||||
from spider_aliyundrive import SpiderAliyunDrive
|
||||
from bs4 import BeautifulSoup
|
||||
import requests
|
||||
import re
|
||||
|
||||
|
||||
class SpiderAliPanSou(SpiderAliyunDrive):
|
||||
|
||||
regex_url = re.compile(r'https://www.aliyundrive.com/s/[^"]+')
|
||||
|
||||
def name(self):
|
||||
return '猫狸盘搜'
|
||||
|
||||
def is_searchable(self):
|
||||
return True
|
||||
|
||||
def hide(self):
|
||||
return False
|
||||
|
||||
def list_categories(self):
|
||||
return []
|
||||
|
||||
def list_videos(self, category_id, page):
|
||||
return [], False
|
||||
|
||||
def list_episodes(self, video_id):
|
||||
r = requests.get('https://www.alipansou.com' + video_id)
|
||||
m = self.regex_url.search(r.text)
|
||||
url = m.group().replace('\\', '')
|
||||
return super().list_episodes(url)
|
||||
|
||||
def search_videos(self, keyword):
|
||||
r = requests.get('https://www.alipansou.com/search',
|
||||
params={
|
||||
'k': keyword,
|
||||
't': 7,
|
||||
})
|
||||
soup = BeautifulSoup(r.text, 'html.parser')
|
||||
|
||||
items = soup.select('van-row > a')
|
||||
videos = []
|
||||
for item in items:
|
||||
name = self._remove_html_tags(item.find('template').__str__())
|
||||
#if keyword not in name:
|
||||
# continue
|
||||
videos.append(SpiderVideo(
|
||||
id=item.get('href'),
|
||||
name=name,
|
||||
))
|
||||
|
||||
return videos
|
||||
|
||||
def _remove_html_tags(self, text):
|
||||
"""Remove html tags from a string"""
|
||||
import re
|
||||
clean = re.compile('<.*?>')
|
||||
return re.sub(clean, '', text)
|
||||
@@ -1,426 +0,0 @@
|
||||
from spider import Spider, SpiderEpisode
|
||||
from cache import get_cache, set_cache
|
||||
from proxy import get_proxy_func_url, ProxyFuncResult
|
||||
from downloader import get_download_url
|
||||
import requests
|
||||
import re
|
||||
import json
|
||||
import time
|
||||
import xbmcaddon
|
||||
|
||||
_ADDON = xbmcaddon.Addon()
|
||||
|
||||
base_headers = {
|
||||
'User-Agent':
|
||||
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36',
|
||||
'Referer': 'https://www.aliyundrive.com/',
|
||||
}
|
||||
|
||||
|
||||
class SpiderAliyunDrive(Spider):
|
||||
setting_key_refresh_token = 'aliyundrive_refresh_token'
|
||||
setting_key_display_file_size_switch = 'aliyundrive_display_file_size_switch'
|
||||
setting_key_downloder_switch = 'downloader_switch'
|
||||
regex_share_id = re.compile(
|
||||
r'www.aliyundrive.com\/s\/([^\/]+)(\/folder\/([^\/]+))?')
|
||||
cache = {}
|
||||
|
||||
def name(self):
|
||||
return '阿里云盘'
|
||||
|
||||
def is_searchable(self):
|
||||
return False
|
||||
|
||||
def hide(self):
|
||||
return True
|
||||
|
||||
def list_categories(self):
|
||||
return []
|
||||
|
||||
def list_videos(self, category_id, page):
|
||||
return [], False
|
||||
|
||||
def list_episodes(self, video_id):
|
||||
m = self.regex_share_id.search(video_id)
|
||||
share_id = m.group(1)
|
||||
file_id = m.group(3)
|
||||
|
||||
r = requests.post(
|
||||
'https://api.aliyundrive.com/adrive/v3/share_link/get_share_by_anonymous',
|
||||
json={'share_id': share_id})
|
||||
share_info = r.json()
|
||||
|
||||
if len(share_info['file_infos']) == 0:
|
||||
return []
|
||||
|
||||
file_info = None
|
||||
if file_id:
|
||||
for fi in share_info['file_infos']:
|
||||
if fi['file_id'] == file_id:
|
||||
file_info = fi
|
||||
break
|
||||
if file_info is None:
|
||||
return []
|
||||
else:
|
||||
file_info = share_info['file_infos'][0]
|
||||
file_id = file_info['file_id']
|
||||
|
||||
parent_file_id = None
|
||||
if file_info['type'] == 'folder':
|
||||
parent_file_id = file_id
|
||||
elif file_info['type'] == 'file' and file_info['category'] == 'video':
|
||||
parent_file_id = 'root'
|
||||
else:
|
||||
return []
|
||||
|
||||
share_token = self._get_share_token(share_id)
|
||||
|
||||
video_file_infos = []
|
||||
subtitle_file_infos = []
|
||||
self._list_files(video_file_infos, subtitle_file_infos, share_id,
|
||||
share_token, parent_file_id)
|
||||
video_file_infos.sort(key=lambda x: x['name'])
|
||||
|
||||
subtitles = []
|
||||
for file_info in subtitle_file_infos:
|
||||
subtitles.append({
|
||||
'name':
|
||||
file_info['name'],
|
||||
'url':
|
||||
get_proxy_func_url(
|
||||
SpiderAliyunDrive.__name__,
|
||||
self.proxy_download_url.__name__,
|
||||
{
|
||||
'share_id': file_info['share_id'],
|
||||
'file_id': file_info['file_id'],
|
||||
'drive_id': file_info['drive_id'],
|
||||
},
|
||||
)
|
||||
})
|
||||
|
||||
episodes = []
|
||||
display_file_size = _ADDON.getSettingBool(
|
||||
self.setting_key_display_file_size_switch)
|
||||
for file_info in video_file_infos:
|
||||
if display_file_size:
|
||||
name = '[{}] {}'.format(
|
||||
self._sizeof_fmt(file_info['size']),
|
||||
file_info['name'],
|
||||
)
|
||||
else:
|
||||
name = file_info['name']
|
||||
|
||||
sources = [{
|
||||
'name': '原画',
|
||||
'params': {
|
||||
'template_id': '',
|
||||
'share_id': file_info['share_id'],
|
||||
'file_id': file_info['file_id'],
|
||||
'drive_id': file_info['drive_id'],
|
||||
},
|
||||
}, {
|
||||
'name': '超高清',
|
||||
'params': {
|
||||
'template_id': 'FHD',
|
||||
'share_id': file_info['share_id'],
|
||||
'file_id': file_info['file_id'],
|
||||
'drive_id': file_info['drive_id'],
|
||||
},
|
||||
}, {
|
||||
'name': '高清',
|
||||
'params': {
|
||||
'template_id': 'HD',
|
||||
'share_id': file_info['share_id'],
|
||||
'file_id': file_info['file_id'],
|
||||
'drive_id': file_info['drive_id'],
|
||||
},
|
||||
}, {
|
||||
'name': '标清',
|
||||
'params': {
|
||||
'template_id': 'SD',
|
||||
'share_id': file_info['share_id'],
|
||||
'file_id': file_info['file_id'],
|
||||
'drive_id': file_info['drive_id'],
|
||||
},
|
||||
}]
|
||||
|
||||
episodes.append(
|
||||
SpiderEpisode(
|
||||
name=name,
|
||||
sources=sources,
|
||||
cover=share_info['avatar'],
|
||||
description=video_id,
|
||||
subtitles=subtitles,
|
||||
))
|
||||
|
||||
return episodes
|
||||
|
||||
def resolve_play_url(self, episode_params):
|
||||
if len(episode_params['template_id']) == 0:
|
||||
downloader_switch = _ADDON.getSettingBool(
|
||||
self.setting_key_downloder_switch)
|
||||
if downloader_switch:
|
||||
return get_download_url(
|
||||
spider_class=SpiderAliyunDrive.__name__,
|
||||
func_name=self.proxy_download_url.__name__,
|
||||
params=episode_params)
|
||||
else:
|
||||
return get_proxy_func_url(SpiderAliyunDrive.__name__,
|
||||
self.proxy_download_url.__name__,
|
||||
episode_params)
|
||||
else:
|
||||
return get_proxy_func_url(SpiderAliyunDrive.__name__,
|
||||
self.proxy_preview_m3u8.__name__,
|
||||
episode_params)
|
||||
|
||||
def search_videos(self, keyword):
|
||||
return []
|
||||
|
||||
def _get_refresh_token(self):
|
||||
token_or_url = _ADDON.getSettingString(self.setting_key_refresh_token)
|
||||
if token_or_url.startswith('http://') or token_or_url.startswith(
|
||||
'https://'):
|
||||
return requests.get(token_or_url).text.strip()
|
||||
else:
|
||||
return token_or_url
|
||||
|
||||
def _get_access_token(self):
|
||||
key = 'aliyundrive:access_token'
|
||||
data = self._get_cache(key)
|
||||
if data:
|
||||
return data['access_token']
|
||||
|
||||
r = requests.post('https://api.aliyundrive.com/token/refresh',
|
||||
json={
|
||||
'refresh_token': self._get_refresh_token(),
|
||||
})
|
||||
data = r.json()
|
||||
|
||||
access_token = '{} {}'.format(data['token_type'], data['access_token'])
|
||||
expires_at = int(time.time()) + int(data['expires_in'] / 2)
|
||||
self._set_cache(key, {
|
||||
'access_token': access_token,
|
||||
'expires_at': expires_at
|
||||
})
|
||||
return access_token
|
||||
|
||||
def _get_share_token(self, share_id, share_pwd=''):
|
||||
key = 'aliyundrive:share_token'
|
||||
data = self._get_cache(key)
|
||||
if data:
|
||||
if data['share_id'] == share_id and data['share_pwd'] == share_pwd:
|
||||
return data['share_token']
|
||||
|
||||
r = requests.post(
|
||||
'https://api.aliyundrive.com/v2/share_link/get_share_token',
|
||||
json={
|
||||
'share_id': share_id,
|
||||
'share_pwd': share_pwd
|
||||
})
|
||||
data = r.json()
|
||||
|
||||
share_token = data['share_token']
|
||||
expires_at = int(time.time()) + int(data['expires_in'] / 2)
|
||||
self._set_cache(
|
||||
key, {
|
||||
'share_token': share_token,
|
||||
'expires_at': expires_at,
|
||||
'share_id': share_id,
|
||||
'share_pwd': share_pwd
|
||||
})
|
||||
return share_token
|
||||
|
||||
def _list_files(self, video_file_infos, subtitle_file_infos, share_id,
|
||||
share_token, parent_file_id):
|
||||
marker = ''
|
||||
headers = base_headers.copy()
|
||||
headers['x-share-token'] = share_token
|
||||
for page in range(1, 51):
|
||||
if page >= 2 and len(marker) == 0:
|
||||
break
|
||||
|
||||
r = requests.post(
|
||||
'https://api.aliyundrive.com/adrive/v3/file/list',
|
||||
json={
|
||||
"image_thumbnail_process":
|
||||
"image/resize,w_160/format,jpeg",
|
||||
"image_url_process": "image/resize,w_1920/format,jpeg",
|
||||
"limit": 200,
|
||||
"order_by": "updated_at",
|
||||
"order_direction": "DESC",
|
||||
"parent_file_id": parent_file_id,
|
||||
"share_id": share_id,
|
||||
"video_thumbnail_process":
|
||||
"video/snapshot,t_1000,f_jpg,ar_auto,w_300",
|
||||
'marker': marker,
|
||||
},
|
||||
headers=headers)
|
||||
data = r.json()
|
||||
|
||||
for item in data['items']:
|
||||
if item['type'] == 'folder':
|
||||
self._list_files(video_file_infos, subtitle_file_infos,
|
||||
share_id, share_token, item['file_id'])
|
||||
elif item['type'] == 'file' and item['category'] == 'video':
|
||||
video_file_infos.append(item)
|
||||
elif item['type'] == 'file' and item['file_extension'] in [
|
||||
'srt', 'ass', 'nfo', 'vtt'
|
||||
]:
|
||||
subtitle_file_infos.append(item)
|
||||
|
||||
marker = data['next_marker']
|
||||
|
||||
def _get_m3u8_cache(self, share_id, file_id, template_id):
|
||||
key = 'aliyundrive:m3u8'
|
||||
data = self._get_cache(key)
|
||||
if data:
|
||||
if data['share_id'] == share_id and data[
|
||||
'file_id'] == file_id and data[
|
||||
'template_id'] == template_id:
|
||||
return data['m3u8'], data['media_urls']
|
||||
|
||||
access_token = self._get_access_token()
|
||||
share_token = self._get_share_token(share_id)
|
||||
|
||||
headers = base_headers.copy()
|
||||
headers['x-share-token'] = share_token
|
||||
headers['Authorization'] = access_token
|
||||
r = requests.post(
|
||||
'https://api.aliyundrive.com/v2/file/get_share_link_video_preview_play_info',
|
||||
json={
|
||||
'share_id': share_id,
|
||||
'category': 'live_transcoding',
|
||||
'file_id': file_id,
|
||||
'template_id': '',
|
||||
},
|
||||
headers=headers,
|
||||
)
|
||||
|
||||
preview_url = ''
|
||||
for t in r.json(
|
||||
)['video_preview_play_info']['live_transcoding_task_list']:
|
||||
if t['template_id'] == template_id:
|
||||
preview_url = t['url']
|
||||
break
|
||||
|
||||
r = requests.get(preview_url,
|
||||
headers=base_headers.copy(),
|
||||
allow_redirects=False)
|
||||
preview_url = r.headers['Location']
|
||||
|
||||
lines = []
|
||||
media_urls = []
|
||||
r = requests.get(preview_url, headers=base_headers.copy(), stream=True)
|
||||
media_id = 0
|
||||
for line in r.iter_lines():
|
||||
line = line.decode()
|
||||
if 'x-oss-expires' in line:
|
||||
media_url = preview_url[:preview_url.rindex('/') + 1] + line
|
||||
media_urls.append(media_url)
|
||||
line = get_proxy_func_url(
|
||||
SpiderAliyunDrive.__name__,
|
||||
self.proxy_preview_media.__name__, {
|
||||
'share_id': share_id,
|
||||
'file_id': file_id,
|
||||
'template_id': template_id,
|
||||
'media_id': media_id
|
||||
})
|
||||
media_id += 1
|
||||
lines.append(line)
|
||||
m3u8 = '\n'.join(lines)
|
||||
|
||||
self._set_cache(
|
||||
key, {
|
||||
'share_id': share_id,
|
||||
'file_id': file_id,
|
||||
'template_id': template_id,
|
||||
'm3u8': m3u8,
|
||||
'media_urls': media_urls,
|
||||
'expires_at': int(time.time()) + 300,
|
||||
})
|
||||
|
||||
return m3u8, media_urls
|
||||
|
||||
def proxy_preview_m3u8(self, params):
|
||||
share_id = params['share_id']
|
||||
file_id = params['file_id']
|
||||
template_id = params['template_id']
|
||||
m3u8, _ = self._get_m3u8_cache(share_id, file_id, template_id)
|
||||
return ProxyFuncResult(
|
||||
body=m3u8,
|
||||
headers={'Content-Type': 'application/vnd.apple.mpegurl'})
|
||||
|
||||
def proxy_preview_media(self, params):
|
||||
share_id = params['share_id']
|
||||
file_id = params['file_id']
|
||||
template_id = params['template_id']
|
||||
media_id = params['media_id']
|
||||
|
||||
_, media_urls = self._get_m3u8_cache(share_id, file_id, template_id)
|
||||
media_url = media_urls[media_id]
|
||||
return ProxyFuncResult(url=media_url, headers=base_headers.copy())
|
||||
|
||||
def proxy_download_url(self, params):
|
||||
share_id = params['share_id']
|
||||
file_id = params['file_id']
|
||||
|
||||
key = 'aliyundrive:download_url:{}:{}'.format(share_id, file_id)
|
||||
data = self._get_cache(key)
|
||||
if data:
|
||||
return ProxyFuncResult(url=data['download_url'],
|
||||
headers=base_headers.copy())
|
||||
|
||||
access_token = self._get_access_token()
|
||||
share_token = self._get_share_token(share_id)
|
||||
|
||||
headers = base_headers.copy()
|
||||
headers['x-share-token'] = share_token
|
||||
headers['Authorization'] = access_token
|
||||
r = requests.post(
|
||||
'https://api.aliyundrive.com/v2/file/get_share_link_download_url',
|
||||
json={
|
||||
'share_id': share_id,
|
||||
'file_id': file_id,
|
||||
'expires_sec': 7200,
|
||||
},
|
||||
headers=headers)
|
||||
data = r.json()
|
||||
|
||||
r = requests.get(data['download_url'],
|
||||
headers=base_headers.copy(),
|
||||
allow_redirects=False)
|
||||
download_url = r.headers['Location']
|
||||
self._set_cache(
|
||||
key, {
|
||||
'download_url': download_url,
|
||||
'expires_at': int(time.time()) + 300,
|
||||
'share_id': share_id,
|
||||
'file_id': file_id,
|
||||
})
|
||||
|
||||
return ProxyFuncResult(url=download_url, headers=base_headers.copy())
|
||||
|
||||
def _sizeof_fmt(self, num, suffix="B"):
|
||||
for unit in ["", "K", "M", "G", "T", "P", "E", "Z"]:
|
||||
if num < 1024.0:
|
||||
return f"{num:3.1f} {unit}{suffix}"
|
||||
num /= 1024.0
|
||||
return f"{num:.1f}Yi{suffix}"
|
||||
|
||||
def _get_cache(self, key):
|
||||
if key in self.cache:
|
||||
data = self.cache[key]
|
||||
if data['expires_at'] >= int(time.time()):
|
||||
return data
|
||||
|
||||
data = get_cache(key)
|
||||
if data:
|
||||
data = json.loads(data)
|
||||
if data['expires_at'] >= int(time.time()):
|
||||
return data
|
||||
|
||||
return None
|
||||
|
||||
def _set_cache(self, key, value):
|
||||
set_cache(key, json.dumps(value))
|
||||
self.cache[key] = value
|
||||
@@ -1,70 +0,0 @@
|
||||
from spider import SpiderCategory, SpiderVideo
|
||||
from spider_aliyundrive import SpiderAliyunDrive
|
||||
import requests
|
||||
|
||||
|
||||
class SpiderGitCafe(SpiderAliyunDrive):
|
||||
|
||||
def name(self):
|
||||
return '小纸条'
|
||||
|
||||
def is_searchable(self):
|
||||
return True
|
||||
|
||||
def hide(self):
|
||||
return False
|
||||
|
||||
def list_categories(self):
|
||||
categories = []
|
||||
categories.append(SpiderCategory('hydm', '华语动漫'))
|
||||
categories.append(SpiderCategory("hyds", '华语电视'))
|
||||
categories.append(SpiderCategory("hydy", '华语电影'))
|
||||
categories.append(SpiderCategory("omdm", '欧美动漫'))
|
||||
categories.append(SpiderCategory("omds", '欧美电视'))
|
||||
categories.append(SpiderCategory("omdy", '欧美电影'))
|
||||
categories.append(SpiderCategory("rhdm", '日韩动漫'))
|
||||
categories.append(SpiderCategory("rhds", '日韩电视'))
|
||||
categories.append(SpiderCategory("rhdy", '日韩电影'))
|
||||
categories.append(SpiderCategory("qtds", '其他电视'))
|
||||
categories.append(SpiderCategory("qtdy", '其他电影'))
|
||||
categories.append(SpiderCategory("qtsp", '其他视频'))
|
||||
categories.append(SpiderCategory("jlp", '纪录片'))
|
||||
categories.append(SpiderCategory("zyp", '综艺片'))
|
||||
return categories
|
||||
|
||||
def list_videos(self, category_id, page):
|
||||
r = requests.post('https://gitcafe.net/tool/alipaper/',
|
||||
data={
|
||||
'action': 'viewcat',
|
||||
'cat': category_id,
|
||||
'num': page,
|
||||
})
|
||||
data = r.json()
|
||||
|
||||
videos = []
|
||||
for video in data:
|
||||
videos.append(
|
||||
SpiderVideo(
|
||||
id='https://www.aliyundrive.com/s/' + video['key'],
|
||||
name=video['title'],
|
||||
))
|
||||
|
||||
return videos, len(videos) >= 50
|
||||
|
||||
def search_videos(self, keyword):
|
||||
r = requests.post('https://gitcafe.net/tool/alipaper/',
|
||||
data={
|
||||
'action': 'search',
|
||||
'keyword': keyword,
|
||||
})
|
||||
data = r.json()
|
||||
|
||||
videos = []
|
||||
for video in data:
|
||||
videos.append(
|
||||
SpiderVideo(
|
||||
id='https://www.aliyundrive.com/s/' + video['key'],
|
||||
name=video['title'],
|
||||
))
|
||||
|
||||
return videos
|
||||
@@ -1,52 +0,0 @@
|
||||
from spider import SpiderVideo
|
||||
from spider_aliyundrive import SpiderAliyunDrive
|
||||
from bs4 import BeautifulSoup
|
||||
import requests
|
||||
import re
|
||||
|
||||
|
||||
class SpiderZhaoZiYuan(SpiderAliyunDrive):
|
||||
|
||||
regex_url = re.compile(r'https://www.aliyundrive.com/s/[^"]+')
|
||||
|
||||
def name(self):
|
||||
return '找资源'
|
||||
|
||||
def is_searchable(self):
|
||||
return True
|
||||
|
||||
def hide(self):
|
||||
return False
|
||||
|
||||
def list_categories(self):
|
||||
return []
|
||||
|
||||
def list_videos(self, category_id, page):
|
||||
return [], False
|
||||
|
||||
def list_episodes(self, video_id):
|
||||
r = requests.get('https://zhaoziyuan.la/' + video_id)
|
||||
print(r.text)
|
||||
m = self.regex_url.search(r.text)
|
||||
url = m.group().replace('\\', '')
|
||||
return super().list_episodes(url)
|
||||
|
||||
def search_videos(self, keyword):
|
||||
r = requests.get('https://zhaoziyuan.la/so',
|
||||
params={
|
||||
'filename': keyword,
|
||||
})
|
||||
soup = BeautifulSoup(r.text, 'html.parser')
|
||||
|
||||
items = soup.select('div.news_text > a')
|
||||
videos = []
|
||||
for item in items:
|
||||
name = item.find('h3').text
|
||||
#if keyword not in name:
|
||||
# continue
|
||||
videos.append(SpiderVideo(
|
||||
id=item.get('href'),
|
||||
name=name,
|
||||
))
|
||||
|
||||
return videos
|
||||
Reference in New Issue
Block a user