mirror of
https://github.com/ls125781003/tvboxtg.git
synced 2025-10-29 12:52:21 +00:00
更新线路
整体线路:v09.06 PG线路:20250907-1139 潇洒线路:v09.07(22)
This commit is contained in:
280
欧歌/api.json
280
欧歌/api.json
@@ -20,7 +20,7 @@
|
||||
},
|
||||
{
|
||||
"key": "豆瓣1",
|
||||
"name": "📢公告❤更新:9/2❤",
|
||||
"name": "📢公告❤更新:9/6❤",
|
||||
"type": 3,
|
||||
"api": "csp_Notice",
|
||||
"searchable": 0,
|
||||
@@ -45,7 +45,7 @@
|
||||
],
|
||||
"url_key": "woog",
|
||||
"threadinfo": {
|
||||
"chunksize": 242,
|
||||
"chunksize": 259,
|
||||
"threads": 16
|
||||
}
|
||||
}
|
||||
@@ -74,7 +74,7 @@
|
||||
],
|
||||
"url_key": "UC",
|
||||
"threadinfo": {
|
||||
"chunksize": 207,
|
||||
"chunksize": 256,
|
||||
"threads": 60
|
||||
}
|
||||
}
|
||||
@@ -105,7 +105,7 @@
|
||||
],
|
||||
"url_key": "woog2",
|
||||
"threadinfo": {
|
||||
"chunksize": 252,
|
||||
"chunksize": 212,
|
||||
"threads": 16
|
||||
}
|
||||
}
|
||||
@@ -266,16 +266,13 @@
|
||||
"api": "csp_Qiyou"
|
||||
},
|
||||
{
|
||||
"key": "AI2",
|
||||
"name": "💡AI┃仅搜索",
|
||||
"key": "1905",
|
||||
"name": "💡1905|影视",
|
||||
"type": 3,
|
||||
"api": "csp_AI",
|
||||
"api": "csp_Web1905",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 0,
|
||||
"playerType": 2,
|
||||
"jar": "./jars/AI2.jar",
|
||||
"ext": "7lj763gg0939795i037ki481k20ki2i3g3lk840883843k6k5l4354k0k10k48411g8654l9885g83ih2h0lh295lll81jg8k66l7011l8hji0l432912jhi3hk3140kghkhj3ghl7782871"
|
||||
"quickSearch": 0,
|
||||
"filterable": 0
|
||||
},
|
||||
{
|
||||
"key": "爱看",
|
||||
@@ -306,20 +303,6 @@
|
||||
"version": "120"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "1若惜",
|
||||
"name": "👑若惜|弹幕",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppGet",
|
||||
"ext": {
|
||||
"url": "http://110.40.59.188:9527",
|
||||
"dataKey": "ebad3f1a58b13933",
|
||||
"dataIv": "ebad3f1a58b13933",
|
||||
"deviceId": "",
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "萝卜",
|
||||
"name": "👑萝卜|弹幕",
|
||||
@@ -515,18 +498,6 @@
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "星河",
|
||||
"name": "👑星河|弹幕",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppSy",
|
||||
"ext": {
|
||||
"url": "http://192.140.161.171:2563",
|
||||
"listKey": "aassddwwxxllsx1x",
|
||||
"parsesKey": "aassddwwxxllsx1x"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "和友",
|
||||
"name": "👑和友|弹幕",
|
||||
@@ -540,22 +511,6 @@
|
||||
"parsesKey": "gHSLmx3JQRasgztO"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "干饭",
|
||||
"name": "👑干饭|弹幕",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppQi",
|
||||
"ext": {
|
||||
"url": "http://110.42.53.99:1080",
|
||||
"site": "",
|
||||
"dataKey": "staraugust123456",
|
||||
"dataIv": "staraugust123456",
|
||||
"deviceId": "",
|
||||
"version": "301",
|
||||
"ua": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "鲸鱼",
|
||||
"name": "👑鲸鱼|弹幕",
|
||||
@@ -571,37 +526,6 @@
|
||||
"version": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "一三",
|
||||
"name": "👑一三|弹幕",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppQi",
|
||||
"ext": {
|
||||
"url": "",
|
||||
"site": "https://cdn-tupic-duofun-neimenggu.56uxi.com/1.txt",
|
||||
"dataKey": "qwertyuiopqwerty",
|
||||
"dataIv": "qwertyuiopqwerty",
|
||||
"deviceId": "",
|
||||
"version": "",
|
||||
"ua": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "柚子",
|
||||
"name": "👑柚子|弹幕",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppGet",
|
||||
"ext": {
|
||||
"url": "https://cnm.guahd.com",
|
||||
"dataKey": "f2A7D4B9E8C16531",
|
||||
"dataIv": "f2A7D4B9E8C16531",
|
||||
"deviceId": "",
|
||||
"version": "",
|
||||
"ua": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "漫国",
|
||||
"name": "👑漫国|弹幕",
|
||||
@@ -681,13 +605,20 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "1905",
|
||||
"name": "🧿1905|影视",
|
||||
"key": "小猪",
|
||||
"name": "👑小猪丨弹幕",
|
||||
"type": 3,
|
||||
"api": "csp_Web1905",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0
|
||||
"quickSearch": 1,
|
||||
"api": "csp_AppGet",
|
||||
"ext": {
|
||||
"url": "",
|
||||
"site": "https://xz4k.top/url.txt",
|
||||
"dataKey": "1785acb6c963184b",
|
||||
"dataIv": "1785acb6c963184b",
|
||||
"deviceId": "",
|
||||
"version": "",
|
||||
"ua": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "养生堂",
|
||||
@@ -801,6 +732,19 @@
|
||||
"分类url": "https://www.myripon.com/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "韩国",
|
||||
"name": "🧿韩国|影视",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"jar": "./jars/养生堂.jar",
|
||||
"ext": {
|
||||
"副标题": "欧歌专属",
|
||||
"请求头": "User-Agent$MOBILE_UA",
|
||||
"编码": "UTF-8",
|
||||
"分类url": "https://www.hanjukankan.com/;;"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "猎手影视",
|
||||
"name": "🧡猎手|PY影视",
|
||||
@@ -812,17 +756,6 @@
|
||||
"filterable": 1,
|
||||
"playerType": 2
|
||||
},
|
||||
{
|
||||
"key": "若惜",
|
||||
"name": "🧡若惜|PY影视",
|
||||
"type": 3,
|
||||
"api": "./api/若惜追剧APP.py",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"playerType": 2
|
||||
},
|
||||
{
|
||||
"key": "金牌影视PY",
|
||||
"name": "🧡金牌|PY影视",
|
||||
@@ -874,6 +807,17 @@
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "软件",
|
||||
"name": "🅰️软件┃教程",
|
||||
"type": 3,
|
||||
"api": "./api/drpy2.min.js",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"filterable": 1,
|
||||
"order_num": 142,
|
||||
"ext": "./js/我的哔哩.js?type=url¶ms=https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/Bilibili/软件教程.json"
|
||||
},
|
||||
{
|
||||
"key": "学堂",
|
||||
"name": "🅰️学堂┃教育",
|
||||
@@ -1039,28 +983,6 @@
|
||||
"order_num": 142,
|
||||
"ext": "./js/我的哔哩.js?type=url¶ms=https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/Bilibili/哔哩套餐2.json"
|
||||
},
|
||||
{
|
||||
"key": "软件",
|
||||
"name": "🅰️软件┃教程",
|
||||
"type": 3,
|
||||
"api": "./api/drpy2.min.js",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"filterable": 1,
|
||||
"order_num": 142,
|
||||
"ext": "./js/我的哔哩.js?type=url¶ms=https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/Bilibili/软件教程.json"
|
||||
},
|
||||
{
|
||||
"key": "演唱会",
|
||||
"name": "🅰️演唱会┃哔哩",
|
||||
"type": 3,
|
||||
"api": "./api/drpy2.min.js",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"filterable": 1,
|
||||
"order_num": 142,
|
||||
"ext": "./js/我的哔哩.js?type=url¶ms=https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/Bilibili/演唱会.json"
|
||||
},
|
||||
{
|
||||
"key": "MV",
|
||||
"name": "🌈歌曲┃哔哩",
|
||||
@@ -1105,6 +1027,17 @@
|
||||
"order_num": 142,
|
||||
"ext": "./js/我的哔哩.js?type=url¶ms=https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/Bilibili/球星合集.json"
|
||||
},
|
||||
{
|
||||
"key": "演唱会",
|
||||
"name": "🅰️演唱会┃哔哩",
|
||||
"type": 3,
|
||||
"api": "./api/drpy2.min.js",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"filterable": 1,
|
||||
"order_num": 142,
|
||||
"ext": "./js/我的哔哩.js?type=url¶ms=https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/Bilibili/演唱会.json"
|
||||
},
|
||||
{
|
||||
"key": "戏曲",
|
||||
"name": "🅰️戏曲┃合集",
|
||||
@@ -1116,6 +1049,23 @@
|
||||
"order_num": 142,
|
||||
"ext": "./js/我的哔哩.js?type=url¶ms=https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/Bilibili/戏曲合集.json"
|
||||
},
|
||||
{
|
||||
"key": "哔哩哔哩听书",
|
||||
"name": "🅰听书┃哔哩",
|
||||
"type": 3,
|
||||
"api": "csp_Bili",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0,
|
||||
"ext": {
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/bili_cookie.txt",
|
||||
"json": "https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/Bilibili/小说.json"
|
||||
},
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "急救教学",
|
||||
"name": "🚑急救|教学",
|
||||
@@ -1130,19 +1080,6 @@
|
||||
},
|
||||
"gridview": "0-0-4.1"
|
||||
},
|
||||
{
|
||||
"key": "本地",
|
||||
"name": "🌸本地|视频",
|
||||
"type": 3,
|
||||
"api": "csp_LocalFile"
|
||||
},
|
||||
{
|
||||
"key": "预告",
|
||||
"name": "🌸新片|预告",
|
||||
"type": 3,
|
||||
"api": "csp_DouBan",
|
||||
"searchable": 0
|
||||
},
|
||||
{
|
||||
"key": "合集",
|
||||
"name": "💋哔哩┃合集",
|
||||
@@ -1164,6 +1101,19 @@
|
||||
},
|
||||
"ext": "./js/88看球.js"
|
||||
},
|
||||
{
|
||||
"key": "本地",
|
||||
"name": "🌸本地|视频",
|
||||
"type": 3,
|
||||
"api": "csp_LocalFile"
|
||||
},
|
||||
{
|
||||
"key": "预告",
|
||||
"name": "🌸新片|预告",
|
||||
"type": 3,
|
||||
"api": "csp_DouBan",
|
||||
"searchable": 0
|
||||
},
|
||||
{
|
||||
"key": "曼波动漫",
|
||||
"name": "🤣曼波|动漫",
|
||||
@@ -1277,17 +1227,6 @@
|
||||
"changeable": 1,
|
||||
"ext": "./json/xm.json"
|
||||
},
|
||||
{
|
||||
"key": "小斑快映",
|
||||
"name": "❤快映|4K弹幕",
|
||||
"type": 3,
|
||||
"api": "csp_PanWebShare",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1,
|
||||
"ext": "./json/xbky.json"
|
||||
},
|
||||
{
|
||||
"key": "多多",
|
||||
"name": "❤多多|4K弹幕",
|
||||
@@ -1310,6 +1249,33 @@
|
||||
"changeable": 1,
|
||||
"ext": "./json/wogg.json"
|
||||
},
|
||||
{
|
||||
"key": "糖果",
|
||||
"name": "❤糖果|搜索",
|
||||
"type": 3,
|
||||
"api": "csp_TGSou",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "音海",
|
||||
"name": "❤音海|搜索",
|
||||
"type": 3,
|
||||
"api": "csp_YinHai",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "盘搜",
|
||||
"name": "❤盘搜|搜索",
|
||||
"type": 3,
|
||||
"api": "csp_PanSou",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "阿里云盘",
|
||||
"name": "❤我的|阿里",
|
||||
@@ -1365,24 +1331,6 @@
|
||||
"ratio": 1.433
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "糖果",
|
||||
"name": "❤糖果|搜索",
|
||||
"type": 3,
|
||||
"api": "csp_TGSou",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "音海",
|
||||
"name": "❤音海|搜索",
|
||||
"type": 3,
|
||||
"api": "csp_YinHai",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "push_agent",
|
||||
"name": "📢手机|推送",
|
||||
|
||||
@@ -1,255 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# by @嗷呜
|
||||
import re
|
||||
import sys
|
||||
from Crypto.Hash import MD5
|
||||
sys.path.append("..")
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Util.Padding import pad, unpad
|
||||
from urllib.parse import quote, urlparse
|
||||
from base64 import b64encode, b64decode
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
import json
|
||||
import time
|
||||
from base.spider import Spider
|
||||
|
||||
class Spider(Spider):
|
||||
|
||||
'''
|
||||
sites照常配置,
|
||||
lives配置:
|
||||
{
|
||||
"name": "xxxx",
|
||||
"type": 3,
|
||||
"api": "路径/若惜追剧APP.py",
|
||||
"ext": ""
|
||||
}
|
||||
'''
|
||||
|
||||
def init(self, extend=""):
|
||||
self.host = self.gethost()
|
||||
pass
|
||||
|
||||
def getName(self):
|
||||
pass
|
||||
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def action(self, action):
|
||||
pass
|
||||
|
||||
def destroy(self):
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
data = self.getdata("/api.php/getappapi.index/initV119")
|
||||
dy = {"class": "类型", "area": "地区", "lang": "语言", "year": "年份", "letter": "字母", "by": "排序",
|
||||
"sort": "排序"}
|
||||
filters = {}
|
||||
classes = []
|
||||
json_data = data["type_list"]
|
||||
homedata = data["banner_list"][8:]
|
||||
for item in json_data:
|
||||
if item["type_name"] == "全部":
|
||||
continue
|
||||
has_non_empty_field = False
|
||||
jsontype_extend = json.loads(item["type_extend"])
|
||||
homedata.extend(item["recommend_list"])
|
||||
jsontype_extend["sort"] = "最新,最热,最赞"
|
||||
classes.append({"type_name": item["type_name"], "type_id": item["type_id"]})
|
||||
for key in dy:
|
||||
if key in jsontype_extend and jsontype_extend[key].strip() != "":
|
||||
has_non_empty_field = True
|
||||
break
|
||||
if has_non_empty_field:
|
||||
filters[str(item["type_id"])] = []
|
||||
for dkey in jsontype_extend:
|
||||
if dkey in dy and jsontype_extend[dkey].strip() != "":
|
||||
values = jsontype_extend[dkey].split(",")
|
||||
value_array = [{"n": value.strip(), "v": value.strip()} for value in values if
|
||||
value.strip() != ""]
|
||||
filters[str(item["type_id"])].append({"key": dkey, "name": dy[dkey], "value": value_array})
|
||||
result = {}
|
||||
result["class"] = classes
|
||||
result["filters"] = filters
|
||||
result["list"] = homedata[1:]
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
pass
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
body = {"area": extend.get('area', '全部'), "year": extend.get('year', '全部'), "type_id": tid, "page": pg,
|
||||
"sort": extend.get('sort', '最新'), "lang": extend.get('lang', '全部'),
|
||||
"class": extend.get('class', '全部')}
|
||||
result = {}
|
||||
data = self.getdata("/api.php/getappapi.index/typeFilterVodList", body)
|
||||
result["list"] = data["recommend_list"]
|
||||
result["page"] = pg
|
||||
result["pagecount"] = 9999
|
||||
result["limit"] = 90
|
||||
result["total"] = 999999
|
||||
return result
|
||||
|
||||
def detailContent(self, ids):
|
||||
body = f"vod_id={ids[0]}"
|
||||
data = self.getdata("/api.php/getappapi.index/vodDetail", body)
|
||||
vod = data["vod"]
|
||||
play = []
|
||||
names = []
|
||||
for itt in data["vod_play_list"]:
|
||||
a = []
|
||||
names.append(itt["player_info"]["show"])
|
||||
for it in itt['urls']:
|
||||
it['user_agent']=itt["player_info"].get("user_agent")
|
||||
it["parse"]=itt["player_info"].get("parse")
|
||||
a.append(f"{it['name']}${self.e64(json.dumps(it))}")
|
||||
play.append("#".join(a))
|
||||
vod["vod_play_from"] = "$$$".join(names)
|
||||
vod["vod_play_url"] = "$$$".join(play)
|
||||
result = {"list": [vod]}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick, pg="1"):
|
||||
body = f"keywords={key}&type_id=0&page={pg}"
|
||||
data = self.getdata("/api.php/getappapi.index/searchList", body)
|
||||
result = {"list": data["search_list"], "page": pg}
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
ids = json.loads(self.d64(id))
|
||||
h={"User-Agent": (ids['user_agent'] or "okhttp/3.14.9")}
|
||||
try:
|
||||
if re.search(r'url=', ids['parse_api_url']):
|
||||
data=self.fetch(ids['parse_api_url'], headers=h, timeout=10).json()
|
||||
url=data.get('url') or data['data'].get('url')
|
||||
else:
|
||||
body = f"parse_api={ids.get('parse') or ids['parse_api_url'].replace(ids['url'], '')}&url={quote(self.aes(ids['url'],True))}&token={ids.get('token')}"
|
||||
b = self.getdata("/api.php/getappapi.index/vodParse", body)['json']
|
||||
url = json.loads(b)['url']
|
||||
if 'error' in url:raise ValueError(f"解析失败: {url}")
|
||||
p=0
|
||||
except Exception as e:
|
||||
print('错误信息:',e)
|
||||
url, p = ids['url'], 1
|
||||
|
||||
if re.search(r'\.jpg|\.png|\.jpeg', url):
|
||||
url = self.Mproxy(url)
|
||||
result = {}
|
||||
result["parse"] = p
|
||||
result["url"] = url
|
||||
result["header"] = h
|
||||
return result
|
||||
|
||||
def liveContent(self, url):
|
||||
id=self.homeContent(True)['class'][-1]['type_id']
|
||||
vlist=self.categoryContent(id,1,False,{})['list']
|
||||
results = []
|
||||
with ThreadPoolExecutor(max_workers=len(vlist)) as executor:
|
||||
futures = [executor.submit(self.livedetailContent, item['vod_name'], item['vod_id']) for item in vlist]
|
||||
for future in futures:
|
||||
try:
|
||||
detail = future.result()
|
||||
if detail:
|
||||
results.append(detail)
|
||||
except Exception as e:
|
||||
print(f"处理详情数据失败: {str(e)}")
|
||||
return '\n'.join(results)
|
||||
|
||||
def livedetailContent(self, name,id):
|
||||
try:
|
||||
print(f"获取直播源:{name}")
|
||||
body = f"vod_id={id}"
|
||||
data = self.getdata("/api.php/getappapi.index/vodDetail", body)
|
||||
play = [f"{name},#genre#"]
|
||||
for itt in data["vod_play_list"]:
|
||||
for it in itt['urls']:
|
||||
play.append(f"{it['name']}, {it['url']}")
|
||||
except Exception as e:
|
||||
print(f"获取直播源失败:{str(e)}")
|
||||
play=[]
|
||||
return '\n'.join(play)
|
||||
|
||||
def localProxy(self, param):
|
||||
return self.Mlocal(param)
|
||||
|
||||
def gethost(self):
|
||||
headers = {
|
||||
'User-Agent': 'okhttp/3.14.9'
|
||||
}
|
||||
host = self.fetch('https://rxysyyds.oss-cn-chengdu.aliyuncs.com/getapp.txt', headers=headers).text
|
||||
return host.strip()
|
||||
|
||||
def aes(self, text,b=None):
|
||||
key = b"ebad3f1a58b13933"
|
||||
cipher = AES.new(key, AES.MODE_CBC, key)
|
||||
if b:
|
||||
ct_bytes = cipher.encrypt(pad(text.encode("utf-8"), AES.block_size))
|
||||
ct = b64encode(ct_bytes).decode("utf-8")
|
||||
return ct
|
||||
else :
|
||||
pt = unpad(cipher.decrypt(b64decode(text)), AES.block_size)
|
||||
return pt.decode("utf-8")
|
||||
|
||||
def header(self):
|
||||
t = str(int(time.time()))
|
||||
header = {"Referer":self.host,
|
||||
"User-Agent": "okhttp/3.14.9", "app-version-code": "140", "app-ui-mode": "light",
|
||||
"app-api-verify-time": t, "app-user-device-id": self.md5(t),
|
||||
"app-api-verify-sign": self.aes(t,True),
|
||||
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}
|
||||
return header
|
||||
|
||||
def getdata(self, path, data=None):
|
||||
vdata = self.post(f"{self.host}{path}", headers=self.header(), data=data, timeout=10).json()['data']
|
||||
data1 = self.aes(vdata)
|
||||
return json.loads(data1)
|
||||
|
||||
def Mproxy(self, url):
|
||||
return f"{self.getProxyUrl()}&url={self.e64(url)}&type=m3u8"
|
||||
|
||||
def Mlocal(self, param,header=None):
|
||||
url = self.d64(param["url"])
|
||||
ydata = self.fetch(url, headers=header, allow_redirects=False)
|
||||
data = ydata.content.decode('utf-8')
|
||||
if ydata.headers.get('Location'):
|
||||
url = ydata.headers['Location']
|
||||
data = self.fetch(url, headers=header).content.decode('utf-8')
|
||||
parsed_url = urlparse(url)
|
||||
durl = parsed_url.scheme + "://" + parsed_url.netloc
|
||||
lines = data.strip().split('\n')
|
||||
for index, string in enumerate(lines):
|
||||
if '#EXT' not in string and 'http' not in string:
|
||||
last_slash_index = string.rfind('/')
|
||||
lpath = string[:last_slash_index + 1]
|
||||
lines[index] = durl + ('' if lpath.startswith('/') else '/') + lpath
|
||||
data = '\n'.join(lines)
|
||||
return [200, "application/vnd.apple.mpegur", data]
|
||||
|
||||
def e64(self, text):
|
||||
try:
|
||||
text_bytes = text.encode('utf-8')
|
||||
encoded_bytes = b64encode(text_bytes)
|
||||
return encoded_bytes.decode('utf-8')
|
||||
except Exception as e:
|
||||
print(f"Base64编码错误: {str(e)}")
|
||||
return ""
|
||||
|
||||
def d64(self,encoded_text):
|
||||
try:
|
||||
encoded_bytes = encoded_text.encode('utf-8')
|
||||
decoded_bytes = b64decode(encoded_bytes)
|
||||
return decoded_bytes.decode('utf-8')
|
||||
except Exception as e:
|
||||
print(f"Base64解码错误: {str(e)}")
|
||||
return ""
|
||||
|
||||
def md5(self, text):
|
||||
h = MD5.new()
|
||||
h.update(text.encode('utf-8'))
|
||||
return h.hexdigest()
|
||||
BIN
欧歌/jars/AI2.jar
BIN
欧歌/jars/AI2.jar
Binary file not shown.
BIN
欧歌/jars/豆瓣1.jar
Normal file
BIN
欧歌/jars/豆瓣1.jar
Normal file
Binary file not shown.
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"SiteUrl": "",
|
||||
"Domains": [
|
||||
"http://xsayang.fun:12512"
|
||||
],
|
||||
"SiteWord": "xbky",
|
||||
"SiteName": "小斑快映",
|
||||
"Classes": [
|
||||
{
|
||||
"type_name": "电影",
|
||||
"type_id": "1"
|
||||
},
|
||||
{
|
||||
"type_name": "剧集",
|
||||
"type_id": "2"
|
||||
},
|
||||
{
|
||||
"type_name": "综艺",
|
||||
"type_id": "3"
|
||||
},
|
||||
{
|
||||
"type_name": "动漫",
|
||||
"type_id": "4"
|
||||
}
|
||||
]
|
||||
}
|
||||
2578
欧歌/lives/tv.txt
2578
欧歌/lives/tv.txt
File diff suppressed because it is too large
Load Diff
BIN
欧歌/spider.jar
BIN
欧歌/spider.jar
Binary file not shown.
Reference in New Issue
Block a user