Files
2026-07-05 04:58:38 +00:00

147 lines
5.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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