From 4bf2e8a4fa592f83be6faa2fe5967a3068597ae3 Mon Sep 17 00:00:00 2001 From: cluntop <85211716+cluntop@users.noreply.github.com> Date: Sat, 21 Mar 2026 17:51:30 +0800 Subject: [PATCH] Update Up --- py/爱瓜.py | 537 ------------------------------------------------ py/爱瓜TVAPP.py | 165 --------------- 2 files changed, 702 deletions(-) delete mode 100755 py/爱瓜.py delete mode 100755 py/爱瓜TVAPP.py diff --git a/py/爱瓜.py b/py/爱瓜.py deleted file mode 100755 index 34fa92984..000000000 --- a/py/爱瓜.py +++ /dev/null @@ -1,537 +0,0 @@ -# -*- coding: utf-8 -*- -# @Author : Doubebly -# @Time : 2025/3/22 21:03 -import json -import sys -import requests -from lxml import etree, html -import re -sys.path.append('..') -from base.spider import Spider - - -class Spider(Spider): - def getName(self): - return "爱瓜TV" - - def init(self, extend): - self.home_url = 'https://aigua1.com' - self.headers = { - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", - "Referer": "https://aigua1.com/", - } - self.image_domain = "https://vres.wbadl.cn" # 圖片域名 - - self.default_play_url = 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4' - - def getDependence(self): - return [] - - def isVideoFormat(self, url): - pass - - def manualVideoCheck(self): - pass - - def homeContent(self, filter): - result = { - 'class': [ - {'type_id': '2', 'type_name': '电视剧'}, - {'type_id': '1', 'type_name': '电影'}, - {'type_id': '3', 'type_name': '综艺'}, - {'type_id': '4', 'type_name': '动漫'}, - {'type_id': '32', 'type_name': '纪录片'} - ], - 'filters': { - '1': [ # 电影筛选条件 - {'name': '剧情', 'key': 'class', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '魔幻', 'v': '179'}, - {'n': '动作', 'v': '154'}, - {'n': '科幻', 'v': '159'}, - {'n': '惊悚', 'v': '156'}, - {'n': '犯罪', 'v': '157'}, - {'n': '剧情', 'v': '161'}, - {'n': '悬疑', 'v': '160'}, - {'n': '奇幻', 'v': '226'}, - {'n': '爱情', 'v': '155'}, - {'n': '战争', 'v': '164'}, - {'n': '恐怖', 'v': '169'}, - {'n': '喜剧', 'v': '153'}, - {'n': '冒险', 'v': '280'}, - {'n': '灾难', 'v': '281'}, - {'n': '歌舞', 'v': '282'}, - {'n': '动画', 'v': '283'}, - {'n': '经典', 'v': '284'}, - {'n': '同性', 'v': '285'}, - {'n': '网络电影', 'v': '286'}, - {'n': '其他', 'v': '178'} - ]}, - {'name': '地区', 'key': 'area', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '大陆', 'v': '18'}, - {'n': '日本', 'v': '24'}, - {'n': '香港', 'v': '20'}, - {'n': '韩国', 'v': '21'}, - {'n': '台湾', 'v': '23'}, - {'n': '英国', 'v': '22'}, - {'n': '东南亚', 'v': '29'}, - {'n': '欧美', 'v': '19'}, - {'n': '其它', 'v': '30'} - ]}, - {'name': '年份', 'key': 'year', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '2025', 'v': '131'}, - {'n': '2024', 'v': '130'}, - {'n': '2023', 'v': '129'}, - {'n': '2022', 'v': '21'}, - {'n': '2021', 'v': '22'}, - {'n': '2020', 'v': '23'}, - {'n': '2019', 'v': '24'}, - {'n': '2018', 'v': '25'}, - {'n': '2017', 'v': '26'}, - {'n': '2016', 'v': '27'}, - {'n': '2015', 'v': '28'}, - {'n': '2014', 'v': '29'}, - {'n': '2013', 'v': '30'}, - {'n': '2012', 'v': '31'}, - {'n': '2011', 'v': '32'}, - {'n': '2010', 'v': '33'}, - {'n': '2009', 'v': '34'}, - {'n': '2008', 'v': '35'}, - {'n': '更早', 'v': '127'} - ]}, - {'name': '状态', 'key': 'status', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '完结', 'v': '1'}, - {'n': '更新中', 'v': '2'} - ]}, - {'name': '排序', 'key': 'by', 'value': [ - {'n': '添加时间', 'v': 'new'}, - {'n': '人气高低', 'v': 'hot'}, - {'n': '评分高低', 'v': 'score'} - ]} - ], - '2': [ # 电视剧筛选条件 - {'name': '剧情', 'key': 'class', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '短剧', 'v': '364'}, - {'n': '偶像', 'v': '251'}, - {'n': '爱情', 'v': '252'}, - {'n': '言情', 'v': '253'}, - {'n': '古装', 'v': '254'}, - {'n': '历史', 'v': '255'}, - {'n': '玄幻', 'v': '256'}, - {'n': '谍战', 'v': '257'}, - {'n': '历险', 'v': '258'}, - {'n': '都市', 'v': '259'}, - {'n': '科幻', 'v': '260'}, - {'n': '军旅', 'v': '261'}, - {'n': '喜剧', 'v': '262'}, - {'n': '武侠', 'v': '263'}, - {'n': '江湖', 'v': '264'}, - {'n': '罪案', 'v': '265'}, - {'n': '青春', 'v': '266'}, - {'n': '家庭', 'v': '267'}, - {'n': '战争', 'v': '268'}, - {'n': '悬疑', 'v': '269'}, - {'n': '穿越', 'v': '270'}, - {'n': '宫廷', 'v': '271'}, - {'n': '神话', 'v': '272'}, - {'n': '商战', 'v': '273'}, - {'n': '警匪', 'v': '274'}, - {'n': '动作', 'v': '275'}, - {'n': '惊悚', 'v': '276'}, - {'n': '剧情', 'v': '277'}, - {'n': '同性', 'v': '278'}, - {'n': '奇幻', 'v': '279'}, - {'n': '其他', 'v': '231'} - ]}, - {'name': '地区', 'key': 'area', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '大陆', 'v': '18'}, - {'n': '日本', 'v': '24'}, - {'n': '香港', 'v': '20'}, - {'n': '韩国', 'v': '21'}, - {'n': '台湾', 'v': '23'}, - {'n': '英国', 'v': '22'}, - {'n': '东南亚', 'v': '29'}, - {'n': '欧美', 'v': '19'}, - {'n': '其它', 'v': '30'} - ]}, - {'name': '年份', 'key': 'year', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '2025', 'v': '131'}, - {'n': '2024', 'v': '130'}, - {'n': '2023', 'v': '129'}, - {'n': '2022', 'v': '21'}, - {'n': '2021', 'v': '22'}, - {'n': '2020', 'v': '23'}, - {'n': '2019', 'v': '24'}, - {'n': '2018', 'v': '25'}, - {'n': '2017', 'v': '26'}, - {'n': '2016', 'v': '27'}, - {'n': '2015', 'v': '28'}, - {'n': '2014', 'v': '29'}, - {'n': '2013', 'v': '30'}, - {'n': '2012', 'v': '31'}, - {'n': '2011', 'v': '32'}, - {'n': '2010', 'v': '33'}, - {'n': '2009', 'v': '34'}, - {'n': '2008', 'v': '35'}, - {'n': '更早', 'v': '127'} - ]}, - {'name': '状态', 'key': 'status', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '完结', 'v': '1'}, - {'n': '更新中', 'v': '2'} - ]}, - {'name': '排序', 'key': 'by', 'value': [ - {'n': '添加时间', 'v': 'new'}, - {'n': '人气高低', 'v': 'hot'}, - {'n': '评分高低', 'v': 'score'} - ]} - ], - '3': [ # 综艺筛选条件 - {'name': '类型', 'key': 'class', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '生活', 'v': '229'}, - {'n': '脱口秀', 'v': '228'}, - {'n': '真人秀', 'v': '227'}, - {'n': '访谈', 'v': '168'}, - {'n': '选秀', 'v': '287'}, - {'n': '网综', 'v': '288'}, - {'n': '搞笑', 'v': '289'}, - {'n': '竞技', 'v': '290'}, - {'n': '情感', 'v': '291'}, - {'n': '演唱会', 'v': '292'}, - {'n': '晚会', 'v': '293'}, - {'n': '其他', 'v': '232'} - ]}, - {'name': '地区', 'key': 'area', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '大陆', 'v': '18'}, - {'n': '日本', 'v': '24'}, - {'n': '香港', 'v': '20'}, - {'n': '韩国', 'v': '21'}, - {'n': '台湾', 'v': '23'}, - {'n': '东南亚', 'v': '29'}, - {'n': '欧美', 'v': '19'}, - {'n': '其它', 'v': '30'} - ]}, - {'name': '年份', 'key': 'year', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '2025', 'v': '131'}, - {'n': '2024', 'v': '130'}, - {'n': '2023', 'v': '129'}, - {'n': '2022', 'v': '21'}, - {'n': '2021', 'v': '22'}, - {'n': '2020', 'v': '23'}, - {'n': '2019', 'v': '24'}, - {'n': '2018', 'v': '25'}, - {'n': '2017', 'v': '26'}, - {'n': '2016', 'v': '27'}, - {'n': '2015', 'v': '28'}, - {'n': '2014', 'v': '29'}, - {'n': '2013', 'v': '30'}, - {'n': '2012', 'v': '31'}, - {'n': '2011', 'v': '32'}, - {'n': '2010', 'v': '33'}, - {'n': '2009', 'v': '34'}, - {'n': '2008', 'v': '35'}, - {'n': '更早', 'v': '127'} - ]}, - {'name': '状态', 'key': 'status', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '完结', 'v': '1'}, - {'n': '更新中', 'v': '2'} - ]}, - {'name': '排序', 'key': 'by', 'value': [ - {'n': '添加时间', 'v': 'new'}, - {'n': '人气高低', 'v': 'hot'}, - {'n': '评分高低', 'v': 'score'} - ]} - ], - '4': [ # 动漫筛选条件 - {'name': '类型', 'key': 'class', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '儿童', 'v': '363'}, - {'n': '格斗', 'v': '167'}, - {'n': '热血', 'v': '165'}, - {'n': '机战', 'v': '166'}, - {'n': '少女', 'v': '294'}, - {'n': '竞技', 'v': '295'}, - {'n': '科幻', 'v': '296'}, - {'n': '爆笑', 'v': '297'}, - {'n': '推理', 'v': '298'}, - {'n': '魔幻', 'v': '299'}, - {'n': '冒险', 'v': '300'}, - {'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': '170'} - ]}, - {'name': '地区', 'key': 'area', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '大陆', 'v': '18'}, - {'n': '日本', 'v': '24'}, - {'n': '香港', 'v': '20'}, - {'n': '韩国', 'v': '21'}, - {'n': '台湾', 'v': '23'}, - {'n': '英国', 'v': '22'}, - {'n': '东南亚', 'v': '29'}, - {'n': '欧美', 'v': '19'}, - {'n': '其它', 'v': '30'} - ]}, - {'name': '年份', 'key': 'year', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '2025', 'v': '131'}, - {'n': '2024', 'v': '130'}, - {'n': '2023', 'v': '129'}, - {'n': '2022', 'v': '21'}, - {'n': '2021', 'v': '22'}, - {'n': '2020', 'v': '23'}, - {'n': '2019', 'v': '24'}, - {'n': '2018', 'v': '25'}, - {'n': '2017', 'v': '26'}, - {'n': '2016', 'v': '27'}, - {'n': '2015', 'v': '28'}, - {'n': '2014', 'v': '29'}, - {'n': '2013', 'v': '30'}, - {'n': '2012', 'v': '31'}, - {'n': '2011', 'v': '32'}, - {'n': '2010', 'v': '33'}, - {'n': '2009', 'v': '34'}, - {'n': '2008', 'v': '35'}, - {'n': '更早', 'v': '127'} - ]}, - {'name': '状态', 'key': 'status', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '完结', 'v': '1'}, - {'n': '更新中', 'v': '2'} - ]}, - {'name': '排序', 'key': 'by', 'value': [ - {'n': '添加时间', 'v': 'new'}, - {'n': '人气高低', 'v': 'hot'}, - {'n': '评分高低', 'v': 'score'} - ]} - ], - '32': [ # 纪录片筛选条件 - {'name': '类型', 'key': 'class', 'value': [ - {'n': '全部', 'v': '0'} # HTML未提供具体类型,仅保留“全部” - ]}, - {'name': '地区', 'key': 'area', 'value': [ - {'n': '全部', 'v': '0'} # HTML未提供具体地区,仅保留“全部” - ]}, - {'name': '年份', 'key': 'year', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '2025', 'v': '131'}, - {'n': '2024', 'v': '130'}, - {'n': '2023', 'v': '129'}, - {'n': '2022', 'v': '21'}, - {'n': '2021', 'v': '22'}, - {'n': '2020', 'v': '23'}, - {'n': '2019', 'v': '24'}, - {'n': '2018', 'v': '25'}, - {'n': '2017', 'v': '26'}, - {'n': '2016', 'v': '27'}, - {'n': '2015', 'v': '28'}, - {'n': '2014', 'v': '29'}, - {'n': '2013', 'v': '30'}, - {'n': '2012', 'v': '31'}, - {'n': '2011', 'v': '32'}, - {'n': '2010', 'v': '33'}, - {'n': '2009', 'v': '34'}, - {'n': '2008', 'v': '35'}, - {'n': '更早', 'v': '127'} - ]}, - {'name': '状态', 'key': 'status', 'value': [ - {'n': '全部', 'v': '0'}, - {'n': '完结', 'v': '1'}, - {'n': '更新中', 'v': '2'} - ]}, - {'name': '排序', 'key': 'by', 'value': [ - {'n': '添加时间', 'v': 'new'}, - {'n': '人气高低', 'v': 'hot'}, - {'n': '评分高低', 'v': 'score'} - ]} - ] - } - } - # print(f"Debug homeContent: {result}") - return result - - def homeVideoContent(self): - d = [] - try: - res = requests.get(self.home_url, headers=self.headers) - res.encoding = 'utf-8' # 根据实际情况设置编码 - root = etree.HTML(res.text.encode('utf-8')) - data_list = root.xpath('//div[@class="video-box-new"]/div[@class="Movie-list"]') - for i in data_list: - d.append( - { - 'vod_id': i.xpath('./a[@class="Movie movie-height"]/@href')[0].split('=')[-1], - 'vod_name': i.xpath('./a[2]/text()')[0].strip(), - 'vod_pic': i.xpath('./a[1]/img/@originalsrc')[0], - 'vod_remarks': i.xpath('./div[@class="Movie-type02"]/div[2]/text()')[0].strip() - } - ) - return {'list': d, 'parse': 0, 'jx': 0} - except Exception as e: - print(e) - return {'list': d, 'parse': 0, 'jx': 0} - - def categoryContent(self, cid, page, filter, ext): - _class = ext.get('class', '0') # 剧情/类型 - _area = ext.get('area', '0') # 地区 - _year = ext.get('year', '0') # 年份 - _status = ext.get('status', '0') # 状态 - _by = ext.get('by', 'new') # 排序 - - url = self.home_url + f'/video/refresh-cate?page_num={page}&sorttype=desc&channel_id={cid}&tag={_class}&area={_area}&year={_year}&status={_status}&sort={_by}&page_size=28' - d = [] - try: - res = requests.get(url, headers=self.headers) - data_list = res.json()['data']['list'] - for i in data_list: - d.append( - { - 'vod_id': i['video_id'], - 'vod_name': i['video_name'], - 'vod_pic': i['cover'], - 'vod_remarks': i['flag'], - } - ) - return {'list': d, 'parse': 0, 'jx': 0} - except Exception as e: - print(e) - return {'list': d, 'parse': 0, 'jx': 0} - - def detailContent(self, did): - ids = did[0] - video_list = [] - url = self.home_url + f'/video/detail?video_id={ids}' - try: - res = requests.get(url, headers=self.headers) - root = etree.HTML(res.text.encode('utf-8')) - # vod_play_from_list = root.xpath('//span[@class="source-item-label"]/text()') - vod_play_from = '$$$'.join(['书生玩剣ⁱ·*₁'', '名妓读经ⁱ·*₁'', '将军作文ⁱ·*₁'']) - # 电视剧 - play_list1 = root.xpath('//ul[contains(@class, "qy-episode-num")]') - # print(play_list1) - # 电影 - # play_list2 = root.xpath('//ul[contains(@class, "qy-play-list")]') - play_list2 = root.xpath('//ul[@id="srctab-1"]') - # print(play_list2) - vod_play_url_list = [] - if len(play_list1) > 0: - play_list = play_list1[:-1] - # print(play_list) - - elif len(play_list2) > 0: - play_list = play_list2 - # print(play_list) - else: - play_list = [] - - for i in play_list: - name_list1 = i.xpath('.//div[@class="select-link"]/text()') - name_list2 = i.xpath('.//span[@class="title-link"]/text()') - name_list3 = i.xpath('./li/text()') - # print(name_list1) - # print(name_list2) - # print(name_list3) - # print(name_list1 + name_list2 + name_list3) - name_list = name_list1 + name_list2 + name_list3 - url_list = i.xpath('./li/@data-chapter-id') - vod_play_url_list.append( - '#'.join([_name.strip() + '$' + f'{ids}-{_url}' for _name, _url in zip(name_list, url_list)]) - ) - - - # print(vod_play_url_list*3) - vod_play_url = '$$$'.join(vod_play_url_list*3) - # print(vod_play_url_list) - video_list.append({ - 'type_name': '', - 'vod_id': ids, - 'vod_name': '', - 'vod_remarks': '', - 'vod_year': '', - 'vod_area': '', - 'vod_actor': '', - 'vod_director': '', - 'vod_content': '', - 'vod_play_from': vod_play_from, - 'vod_play_url': vod_play_url - }) - return {"list": video_list, 'parse': 0, 'jx': 0} - - except Exception as e: - print(f"Error in detailContent: {e}") - return {'list': [], 'msg': str(e)} - - def searchContent(self, key, quick, page='1'): - if str(page) != '1': - return {'list': [], 'parse': 0, 'jx': 0} - url = f'{self.home_url}/video/refresh-video?page_num=1&sorttype=desc&page_size=28&tvNum=7&sort=new&keyword={key}' - d = [] - try: - res = requests.get(url, headers=self.headers) - res.encoding = 'utf-8' - root = etree.HTML(res.text) - data_list = root.xpath('//div[@class="SSbox"]') - for i in data_list: - d.append( - { - 'vod_id': i.xpath('./a/@href')[0].split('=')[-1], - 'vod_name': ''.join(i.xpath('.//span/text()')), - 'vod_pic': i.xpath('./a/img/@originalsrc')[0], - 'vod_remarks': i.xpath('.//div[@class="SSjgTitle"]/text()')[0], - } - ) - return {'list': d, 'parse': 0, 'jx': 0} - except Exception as e: - print(f"Error in searchContent: {e}") - return {'list': [], 'parse': 0, 'jx': 0} - - def playerContent(self, flag, pid, vipFlags): - url = 'https://aigua1.com/video/play-url?videoId=230907&sourceId=0&citycode=HKG&chapterId=2916522' - a = pid.split('-') - videoId = a[0] - chapterId = a[1] - url = self.home_url + f'/video/play-url?videoId={videoId}&sourceId=0&citycode=HKG&chapterId={chapterId}' - try: - res = requests.get(url, headers=self.headers) - play_url_list = res.json()['data']['urlinfo']['resource_url'] - if flag == '线路一': - play_url = play_url_list['1'] - pass - elif flag == '线路二': - play_url = play_url_list['16'] - else: - play_url = play_url_list['21'] - return {'url': play_url, 'parse': 0, 'jx': 0, 'header': self.headers} - except Exception as e: - print(f"Error in playerContent: {e}") - return {'url': self.default_play_url, 'parse': 0, 'jx': 0} - - def localProxy(self, params): - pass - - def destroy(self): - return '正在Destroy' - - def get_data(self): - url = self.home_url + 'https://aigua1.com/video/refresh-cate?page_num=1&sorttype=desc&channel_id=0&tag=0&area=0&year=0&page_size=28&sort=new' - pass - -if __name__ == '__main__': - pass - diff --git a/py/爱瓜TVAPP.py b/py/爱瓜TVAPP.py deleted file mode 100755 index 5432413f3..000000000 --- a/py/爱瓜TVAPP.py +++ /dev/null @@ -1,165 +0,0 @@ -# -*- coding: utf-8 -*- -# by @嗷呜 -# 温馨提示:搜索只能搜拼音联想 -import sys -import time -import uuid -from Crypto.Hash import MD5 -sys.path.append('..') -from base.spider import Spider - - -class Spider(Spider): - - def init(self, extend=""): - self.uid = self.getuid() - self.token, self.code = self.getuserinfo() - pass - - def getName(self): - pass - - def isVideoFormat(self, url): - pass - - def manualVideoCheck(self): - pass - - def destroy(self): - pass - - host = 'https://tvapi211.magicetech.com' - - headers = {'User-Agent': 'okhttp/3.11.0'} - - def homeContent(self, filter): - body = {'token': self.token, 'authcode': self.code} - data = self.post(f'{self.host}/hr_1_1_0/apptvapi/web/index.php/video/filter-header', json=self.getbody(body), - headers=self.headers).json() - result = {} - classes = [] - filters = {} - for k in data['data']: - classes.append({ - 'type_name': k['channel_name'], - 'type_id': str(k['channel_id']), - }) - filters[str(k['channel_id'])] = [] - for i in k['search_box']: - if len(i['list']): - filters[str(k['channel_id'])].append({ - 'key': i['field'], - 'name': i['label'], - 'value': [{'n': j['display'], 'v': str(j['value'])} for j in i['list'] if j['value']] - }) - result['class'] = classes - result['filters'] = filters - return result - - def homeVideoContent(self): - body = {'token': self.token, 'authcode': self.code} - data = self.post(f'{self.host}/hr_1_1_0/apptvapi/web/index.php/video/index-tv', json=self.getbody(body), - headers=self.headers).json() - return {'list': self.getlist(data['data'][0]['banner'])} - - def categoryContent(self, tid, pg, filter, extend): - body = {'token': self.token, 'authcode': self.code, 'channel_id': tid, 'area': extend.get('area', '0'), - 'year': extend.get('year', '0'), 'sort': extend.get('sort', '0'), 'tag': extend.get('tag', 'hot'), - 'status': extend.get('status', '0'), 'page_num': pg, 'page_size': '24'} - data = self.post(f'{self.host}/hr_1_1_0/apptvapi/web/index.php/video/filter-video', json=self.getbody(body), - headers=self.headers).json() - result = {} - result['list'] = self.getlist(data['data']['list']) - result['page'] = pg - result['pagecount'] = 9999 - result['limit'] = 90 - result['total'] = 999999 - return result - - def detailContent(self, ids): - ids = ids[0].split('@') - body = {'token': self.token, 'authcode': self.code, 'channel_id': ids[0], 'video_id': ids[1]} - data = self.post(f'{self.host}/hr_1_1_0/apptvapi/web/index.php/video/detail', json=self.getbody(body), - headers=self.headers).json() - vdata = {} - for k in data['data']['chapters']: - i = k['sourcelist'] - for j in i: - if j['source_name'] not in vdata: vdata[j['source_name']] = [] - vdata[j['source_name']].append(f"{k['title']}${j['source_url']}") - plist, names = [], [] - for key, value in vdata.items(): - names.append(key) - plist.append('#'.join(value)) - vod = { - 'vod_play_from': '$$$'.join(names), - 'vod_play_url': '$$$'.join(plist), - } - return {'list': [vod]} - - def searchContent(self, key, quick, pg="1"): - body = {'token': self.token, 'authcode': self.code, 'keyword': key, 'page_num': pg} - data = self.post(f'{self.host}/hr_1_1_0/apptvapi/web/index.php/search/letter-result', json=self.getbody(body), - headers=self.headers).json() - return {'list': self.getlist(data['data']['list'])} - - def playerContent(self, flag, id, vipFlags): - # https://rysp.tv - # https://aigua.tv - result = { - "parse": 0, - "url": "id", - "header": { - "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 11; M2012K10C Build/RP1A.200720.011)", - "Origin": "https://aigua.tv", - "Referer": "https://aigua.tv/" - } - } - return result - - def localProxy(self, param): - pass - - def getuserinfo(self): - data = self.post(f'{self.host}/hr_1_1_0/apptvapi/web/index.php/user/auth-login', json=self.getbody(), - headers=self.headers).json() - v = data['data'] - return v['user_token'], v['authcode'] - - def getuid(self): - uid = self.getCache('uid') - if not uid: - uid = str(uuid.uuid4()) - self.setCache('uid', uid) - return uid - - def getbody(self, json_data=None): - if json_data is None: json_data = {} - params = {"product": "4", "ver": "1.1.0", "debug": "1", "appId": "1", "osType": "3", "marketChannel": "tv", - "sysVer": "11", "time": str(int(time.time())), "packageName": "com.gzsptv.gztvvideo", - "udid": self.uid, } - json_data.update(params) - sorted_json = dict(sorted(json_data.items(), key=lambda item: item[0])) - text = '&'.join(f"{k}={v}" for k, v in sorted_json.items() if v != '') - md5_hash = self.md5(f"jI7POOBbmiUZ0lmi{text}D9ShYdN51ksWptpkTu11yenAJu7Zu3cR").upper() - json_data.update({'sign': md5_hash}) - return json_data - - def md5(self, text): - h = MD5.new() - h.update(text.encode('utf-8')) - return h.hexdigest() - - def getlist(self, data): - videos = [] - for i in data: - if type(i.get('video')) == dict: i = i['video'] - videos.append({ - 'vod_id': f"{i.get('channel_id')}@{i.get('video_id')}", - 'vod_name': i.get('video_name'), - 'vod_pic': i.get('cover'), - 'vod_year': i.get('score'), - 'vod_remarks': i.get('flag'), - }) - return videos -