# -*- coding: utf-8 -*- # by @嗷呜 import concurrent.futures import json import sys sys.path.append('..') from base.spider import Spider class Spider(Spider): def init(self, extend=""): self.ihost=self.imgsite() pass def getName(self): pass def isVideoFormat(self, url): pass def manualVideoCheck(self): pass def destroy(self): pass host='https://api.ubj83.com' headers={ 'User-Agent': 'Mozilla/5.0 (Linux; Android 11; M2012K10C Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;webank/h5face;webank/1.0;netType:NETWORK_WIFI;appVersion:416;packageName:com.jp3.xg3', 'Accept': 'application/json, text/plain, */*', 'x-requested-with': 'com.jp3.xg3', 'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', } def imgsite(self): data=self.fetch(f"{self.host}/api/appAuthConfig",headers=self.headers).json() host=data['data']['imgDomain'] return host if host.startswith('http') else f"https://{host}" def getfts(self,id): data=self.fetch(f"{self.host}/api/crumb/filterOptions",params={'fcate_pid':id},headers=self.headers).json() fts=[{ 'key': i['key'], 'name':i['key'], 'value': [{ 'n': j['name'], 'v': j['id'] } for j in i['data']] } for i in data['data']] return id,fts def build_cl(self,data,tid=''): videos=[] for i in data: text=json.dumps(i.get('res_categories',[])) videos.append({ 'vod_id': f"{i.get('id')}@{'67' if json.dumps('短剧') in text and '67' in text else tid}", 'vod_name': i.get('title'), 'vod_pic': f"{self.ihost}{i.get('path') or i.get('cover_image') or i.get('thumbnail')}", 'vod_remarks': i.get('mask'), 'vod_year': i.get('score'), }) return videos def homeContent(self, filter): result = {} cdata=self.fetch(f"{self.host}/api/term/home_fenlei",headers=self.headers).json() hdata=self.fetch(f"{self.host}/api/dyTag/hand_data",params={'category_id':cdata['data'][0]['id']},headers=self.headers).json() classes = [] filters = {} for k in cdata['data']: if 'abbr' in k: classes.append({ 'type_name': k['name'], 'type_id': k['id'] }) with concurrent.futures.ThreadPoolExecutor(max_workers=len(classes)) as executor: future_to_aid = { executor.submit(self.getfts, aid['type_id']): aid['type_id'] for aid in classes } for future in concurrent.futures.as_completed(future_to_aid): aid = future_to_aid[future] try: aid_id, fts = future.result() filters[aid_id] = fts except Exception as e: print(f"Error processing aid {aid}: {e}") result['class'] = classes result['filters'] = filters result['list'] = [item for i in hdata['data'].values() for item in self.build_cl(i)] return result def homeVideoContent(self): pass def categoryContent(self, tid, pg, filter, extend): params={**{'fcate_pid': tid, 'page': pg}, **extend} path= '/api/crumb/shortList' if tid=='67' else '/api/crumb/list' data=self.fetch(f"{self.host}{path}",params=params,headers=self.headers).json() result = {} result['list'] = self.build_cl(data['data'],tid) result['page'] = pg result['pagecount'] = 9999 result['limit'] = 90 result['total'] = 999999 return result def detailContent(self, ids): ids=ids[0].split('@') path, ikey = ('/api/detail', 'vid') if ids[-1] == '67' else ('/api/video/detailv2', 'id') data=self.fetch(f"{self.host}{path}",params={ikey:ids[0]},headers=self.headers).json() v=data['data'] if ids[-1]=='67': pdata=v.get('playlist',[]) n,p=[pdata[0].get('source_config_name')],['#'.join([f"{i.get('title')}${i['url']}" for i in pdata])] else: n,p=[],[] for i in v.get('source_list_source',[]): n.append(i.get('name')) p.append('#'.join([f"{j.get('source_name') or j.get('weight')}${j['url']}" for j in i.get('source_list',[])])) vod = { 'type_name': '/'.join([i.get('name') for i in v.get('types',[])]), 'vod_year': v.get('year'), 'vod_area': v.get('area'), 'vod_remarks': v.get('update_cycle'), 'vod_actor': '/'.join([i.get('name') for i in v.get('actors',[])]), 'vod_content': v.get('description'), 'vod_play_from': '$$$'.join(n), 'vod_play_url': '$$$'.join(p) } return {'list':[vod]} def searchContent(self, key, quick, pg="1"): data=self.fetch(f"{self.host}/api/v2/search/videoV2",params={'key':key,'page':pg,'pageSize':20},headers=self.headers).json() return {'list':self.build_cl(data['data']),'page':pg} def playerContent(self, flag, id, vipFlags): return {'parse': 0, 'url': id, 'header': {'User-Agent':self.headers['User-Agent']}} def localProxy(self, param): pass def liveContent(self, url): pass