147 lines
5.8 KiB
Python
147 lines
5.8 KiB
Python
# -*- coding: utf-8 -*-
|
||
# 本资源来源于互联网公开渠道,仅可用于个人学习爬虫技术。
|
||
# 严禁将其用于任何商业用途,下载后请于 24 小时内删除,搜索结果均来自源站,本人不承担任何责任。
|
||
|
||
from base.spider import Spider
|
||
import re,sys,time,urllib3,hashlib
|
||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||
sys.path.append('..')
|
||
|
||
class Spider(Spider):
|
||
headers,host,tab = {
|
||
'User-Agent': 'okhttp-okgo/jeasonlzy',
|
||
'Connection': 'Keep-Alive',
|
||
'Accept-Encoding': 'gzip',
|
||
'Accept-Language': 'zh-CN,zh;q=0.8'
|
||
},'',{'泰剧','日剧','美剧','台剧'}
|
||
|
||
def init(self, host=''):
|
||
if host.startswith('http'): self.host = host
|
||
|
||
def homeContent(self, filter):
|
||
if not self.host: return None
|
||
response = self.post(f'{self.host}/v3/type/top_type', data=self.payload(), headers=self.headers, verify=False).json()
|
||
classes = []
|
||
for i in response['data']['list']:
|
||
if isinstance(i, dict):
|
||
if i['type_name'] not in self.tab:
|
||
classes.append({'type_id': i['type_id'],'type_name': i['type_name']})
|
||
return {'class': classes}
|
||
|
||
def homeVideoContent(self):
|
||
if not self.host: return None
|
||
response = self.post(f'{self.host}/v3/type/tj_vod', data=self.payload({'':''}), headers=self.headers, verify=False).json()
|
||
data = response['data']
|
||
videos = []
|
||
videos.extend(self.arr2vods(data.get('cai',[])))
|
||
videos.extend(self.arr2vods(data.get('loop', [])))
|
||
for i in data.get('type_vod',[]):
|
||
if isinstance(i,dict):
|
||
if i['type_name'] not in self.tab:
|
||
videos.extend(self.arr2vods(i.get('vod', [])))
|
||
return {'list': videos}
|
||
|
||
def categoryContent(self, tid, pg, filter, extend):
|
||
if not self.host: return None
|
||
response = self.post(f'{self.host}/v3/home/type_search', data=self.payload({'type_id':str(tid),'page':str(pg)}), headers=self.headers, verify=False).json()
|
||
return {'list': self.arr2vods(response['data']['list']), 'page': pg}
|
||
|
||
def searchContent(self, key, quick, pg='1'):
|
||
if not self.host: return None
|
||
response = self.post(f'{self.host}/v3/home/search', data=self.payload({'keyword': key}), headers=self.headers, verify=False).json()
|
||
videos = self.arr2vods(response['data']['list'])
|
||
return {'list': videos, 'page': pg}
|
||
|
||
def detailContent(self, ids):
|
||
if not self.host: return None
|
||
response = self.post(f'{self.host}/v3/home/vod_details', data=self.payload({'vod_id':str(ids[0])}), headers=self.headers, verify=False).json()
|
||
data = response['data']
|
||
shows,play_urls = [],[]
|
||
for i in data['vod_play_list']:
|
||
parses = ','.join(i['parse_urls'])
|
||
urls = []
|
||
for j in i['urls']:
|
||
urls.append(f"{j['name']}${j['url']}@{parses}@{i['ua']}@{i['referer']}")
|
||
play_urls.append('#'.join(urls))
|
||
name = re.sub(r'[\((](?:点击|换)[^)]*[\))]|[Z▶❤【].*', '', i.get('title', i.get('name', '')))
|
||
if name == i['flag']:
|
||
shows.append(name)
|
||
else:
|
||
shows.append(f"{name}({i['flag']})")
|
||
video = {
|
||
'vod_id': data['vod_id'],
|
||
'vod_name': data['vod_name'],
|
||
'vod_pic': data.get('vod_pic',data.get('vod_pic_thumb')),
|
||
'vod_remarks': data['vod_remarks'],
|
||
'vod_year': data['vod_year'],
|
||
'vod_area': data['vod_area'],
|
||
'vod_actor': data['vod_actor'],
|
||
'vod_director': data['vod_director'],
|
||
'vod_content': data['vod_content'],
|
||
'vod_play_from': '$$$'.join(shows),
|
||
'vod_play_url': '$$$'.join(play_urls),
|
||
'type_name': data['vod_class']
|
||
}
|
||
return {'list': [video]}
|
||
|
||
def playerContent(self, flag, vid, vip_flags):
|
||
raw_url,parses,ua,referer = vid.split('@',3)
|
||
jx,url,play_headers = 0,'',{}
|
||
if ua:
|
||
play_headers['User-Agent'] = ua
|
||
if referer:
|
||
play_headers['Referer'] = referer
|
||
for parse in parses.split(','):
|
||
try:
|
||
if parse.startswith('http'):
|
||
res = self.fetch(f'{parse}{raw_url}',headers=self.headers, verify=False).json()
|
||
play_url = res['url']
|
||
if play_url.startswith('http'):
|
||
url = play_url
|
||
except Exception:
|
||
pass
|
||
if not url and raw_url.startswith('http'):
|
||
url = raw_url
|
||
if re.search(r'(?:www\.iqiyi|v\.qq|v\.youku|www\.mgtv|www\.bilibili)\.com', raw_url):
|
||
jx = 1
|
||
return {'jx': jx, 'parse': 0, 'url': url, 'header': play_headers}
|
||
|
||
def arr2vods(self, arr):
|
||
videos = []
|
||
for i in arr:
|
||
try:
|
||
if i.get('vod_name') == '首页轮播': continue
|
||
videos.append({
|
||
'vod_id': i['vod_id'],
|
||
'vod_name': i['vod_name'],
|
||
'vod_pic': i.get('vod_pic', i.get('vod_pic_thumb')),
|
||
'vod_remarks': i.get('vod_remarks'),
|
||
'type_name': i.get('vod_class'),
|
||
'vod_year': i.get('vod_year')
|
||
})
|
||
except Exception:
|
||
continue
|
||
return videos
|
||
|
||
def payload(self, payload={}):
|
||
timestamp = str(int(time.time()))
|
||
return {
|
||
'sign': hashlib.md5(f'7gp0bnd2sr85ydii2j32pcypscoc4w6c7g5spl{timestamp}'.encode()).hexdigest(),
|
||
**payload,
|
||
'timestamp': timestamp
|
||
}
|
||
|
||
def getName(self):
|
||
pass
|
||
|
||
def isVideoFormat(self, url):
|
||
pass
|
||
|
||
def manualVideoCheck(self):
|
||
pass
|
||
|
||
def destroy(self):
|
||
pass
|
||
|
||
def localProxy(self, param):
|
||
pass |