Arquivos
tvbox_collect/tbapi2/py/app/RJAPP.py
T
2026-07-05 04:58:38 +00:00

147 linhas
5.8 KiB
Python
Original Anotar Histórico

Este arquivo contém caracteres Unicode ambíguos
Este arquivo contém caracteres Unicode que podem ser confundidos com outros caracteres. Se você acha que isso é intencional, pode ignorar esse aviso com segurança. Use o botão Escapar para revelá-los
# -*- 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