diff --git a/OK/api.json b/OK/api.json index 32d44fe..25a6183 100644 --- a/OK/api.json +++ b/OK/api.json @@ -382,20 +382,6 @@ }, "timeout": 10 }, - { - "key": "鲸鱼", - "name": "🐳鲸鱼┃App", - "type": 3, - "api": "csp_AweSomeGuard", - "searchable": 1, - "quickSearch": 1, - "changeable": 0, - "filterable": 1, - "ext": { - "sp": "JingYu" - }, - "timeout": 10 - }, { "key": "小猪", "name": "🐖小猪┃App", @@ -425,8 +411,8 @@ "timeout": 10 }, { - "key": "仓鼠", - "name": "🐹仓鼠┃App", + "key": "芬奇", + "name": "🐹芬奇┃App", "type": 3, "api": "csp_AweSomeGuard", "searchable": 1, @@ -434,7 +420,7 @@ "changeable": 0, "filterable": 1, "ext": { - "sp": "CangShu" + "sp": "FenQi" }, "timeout": 10 }, @@ -452,6 +438,34 @@ }, "timeout": 10 }, + { + "key": "小白", + "name": "🍼小白┃App", + "type": 3, + "api": "csp_AweSomeGuard", + "searchable": 1, + "quickSearch": 1, + "changeable": 0, + "filterable": 1, + "ext": { + "sp": "XiaoBai" + }, + "timeout": 10 + }, + { + "key": "汤圆", + "name": "🍚汤圆┃App", + "type": 3, + "api": "csp_AweSomeGuard", + "searchable": 1, + "quickSearch": 1, + "changeable": 0, + "filterable": 1, + "ext": { + "sp": "TangYuan" + }, + "timeout": 10 + }, { "key": "木瓜", "name": "🥑木瓜┃App", @@ -467,6 +481,21 @@ }, "timeout": 10 }, + { + "key": "紫金", + "name": "🍇紫金┃App", + "type": 3, + "api": "csp_AweSomeGuard", + "searchable": 1, + "quickSearch": 1, + "changeable": 0, + "filterable": 1, + "ext": { + "sp": "AppFox", + "siteUrl": "https://www.zjcvod.com" + }, + "timeout": 10 + }, { "key": "厂长", "name": "📔厂长┃直连", @@ -730,20 +759,6 @@ }, "timeout": 10 }, - { - "key": "yhdm", - "name": "🌸樱花┃动漫", - "type": 3, - "api": "csp_AweSomeGuard", - "searchable": 1, - "quickSearch": 1, - "changeable": 0, - "filterable": 1, - "ext": { - "sp": "YHDM" - }, - "timeout": 15 - }, { "key": "动漫巴士", "name": "🚌巴士┃动漫", @@ -866,6 +881,19 @@ }, "timeout": 10 }, + { + "key": "酷狗音乐", + "name": "🐕酷狗┃音乐", + "type": 3, + "api": "csp_AweSomeGuard", + "searchable": 0, + "quickSearch": 0, + "changeable": 0, + "ext": { + "sp": "KuGou" + }, + "timeout": 10 + }, { "key": "世界听书", "name": "🎸世界┃听书", diff --git a/南风/api.json b/南风/api.json index e875cc7..86d9b53 100644 --- a/南风/api.json +++ b/南风/api.json @@ -388,8 +388,18 @@ "ext": "https://dm84.net" }, { - "key": "樱花", - "name": "💮樱花", + "key": "嗷呜动漫", + "name": "🙀嗷呜动漫", + "type": 3, + "api": "csp_XYQHiker", + "searchable": 1, + "quickSearch": 1, + "filterable": 1, + "ext": "./json/嗷呜动漫.json" + }, + { + "key": "樱花动漫", + "name": "💮樱花动漫", "type": 3, "api": "csp_XYQHiker", "searchable": 1, @@ -1567,8 +1577,6 @@ } ], "ads": [ - "mozai.4gtv.tv", - "pv.vipwm.cc", - "m3u8.xiangodt.com" + "mozai.4gtv.tv" ] } \ No newline at end of file diff --git a/南风/json/农民影视.json b/南风/json/农民影视.json index b7e6b8d..97da670 100644 --- a/南风/json/农民影视.json +++ b/南风/json/农民影视.json @@ -56,7 +56,7 @@ "演员详情": "body&&.sDes:contains(主演:)&&Text!主演:", "简介详情": ".detail-con&&p&&Text!简介:", "线路列表数组规则": "#leftTabBox&&ul&&li", - "线路标题": "Text[替换:线路=>农民专线]", + "线路标题": "Text[替换:默认=>农民专线]", "播放列表数组规则": "#leftTabBox&&.numList", "选集列表数组规则": "li", "选集标题链接是否Jsoup写法": "1", @@ -69,4 +69,4 @@ "是否开启手动嗅探": "1", "手动嗅探视频链接关键词": ".mp4#.m3u8#item/video#video_mp4#video/tos", "手动嗅探视频链接过滤词": ".html#=http" -} +} \ No newline at end of file diff --git a/南风/json/嗷呜动漫.json b/南风/json/嗷呜动漫.json new file mode 100644 index 0000000..3f9e84c --- /dev/null +++ b/南风/json/嗷呜动漫.json @@ -0,0 +1,86 @@ +{ + "规则名": "嗷呜动漫", + "规则作者": "", + "请求头参数": "User-Agent$PC_UA#Referer$https://www.aowu.tv#accept$text/html#origin$https://www.aowu.tv", + "网页编码格式": "UTF-8", + "图片是否需要代理": "0", + "是否开启获取首页数据": "1", + "首页推荐链接": "https://www.aowu.tv", + "首页列表数组规则": "body&&.fadeInUp:has(.gen-movie-img)", + "首页片单列表数组规则": ".public-list-box", + "首页片单是否Jsoup写法": "1", + "首页片单标题": "a&&title", + "首页片单链接": "a&&href", + "首页片单图片": ".lazy&&data-src", + "首页片单副标题": ".public-list-prb&&Text", + "首页片单链接加前缀": "https://www.aowu.tv", + "首页片单链接加后缀": "", + "分类起始页码": "1", + "分类链接": "https://www.aowu.tv/index.php/ds_api/vod?type={cateId}&class=&area=&year=&lang=&version=&state=&letter=&time=&level=0&weekday=&by=time&page={catePg};post", + "分类名称": "新番&番剧&剧场版", + "分类名称替换词": "20&21&22", + "筛选数据": "ext", + //{cateId} + "筛选子分类名称": "", + "筛选子分类替换词": "", + //{class} + "筛选类型名称": "", + "筛选类型替换词": "*", + //{area} + "筛选地区名称": "", + "筛选地区替换词": "*", + //{year} + "筛选年份名称": "", + "筛选年份替换词": "*", + //{lang} + "筛选语言名称": "", + "筛选语言替换词": "*", + //{by} + "筛选排序名称": "最新&最热&评分", + "筛选排序替换词": "time&hits&score", + "分类截取模式": "0", + "分类列表数组规则": "list", + "分类片单是否Jsoup写法": "1", + "分类片单标题": "vod_name", + "分类片单链接": "url", + "分类片单图片": "vod_pic", + "分类片单副标题": "vod_remarks", + "分类片单链接加前缀": "https://www.aowu.tv", + "分类片单链接加后缀": "", + "搜索请求头参数": "User-Agent$PC_UA#Referer$https://www.aowu.tv#accept$text/html#origin$https://www.aowu.tv", + "搜索链接": "https://www.aowu.tv/search/{wd}----------{SearchPg}---.html", + "POST请求数据": "wd={wd}", + "搜索截取模式": "1", + "搜索列表数组规则": "body&&.search-list", + "搜索片单是否Jsoup写法": "1", + "搜索片单图片": ".lazy&&data-src", + "搜索片单标题": "h3&&Text", + "搜索片单链接": "a&&href", + "搜索片单副标题": ".slide-info-remarks&&Text", + "搜索片单链接加前缀": "https://www.aowu.tv", + "搜索片单链接加后缀": "", + "链接是否直接播放": "0", + "直接播放链接加前缀": "", + "直接播放链接加后缀": "#isVideo=true#", + "直接播放直链视频请求头": "", + "详情是否Jsoup写法": "1", + "类型详情": "", + "年代详情": "", + "地区详情": "", + "演员详情": ".detail-info&&.slide-info,2&&Text!演员:", + "简介详情": "#height_limit&&Text", + "线路列表数组规则": ".anthology-tab&&a", + "线路标题": "Text", + "播放列表数组规则": "body&&.anthology-list-play", + "选集列表数组规则": "li", + "选集标题链接是否Jsoup写法": "1", + "选集标题": "a&&Text", + "选集链接": "a&&href", + "是否反转选集序列": "0", + "选集链接加前缀": "https://www.aowu.tv", + "选集链接加后缀": "", + "分析MacPlayer": "0", + "是否开启手动嗅探": "0", + "手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#obj/tos", + "手动嗅探视频链接过滤词": ".html#=http#=https" +} \ No newline at end of file diff --git a/南风/json/樱花动漫.json b/南风/json/樱花动漫.json index aa91261..0812bfd 100644 --- a/南风/json/樱花动漫.json +++ b/南风/json/樱花动漫.json @@ -4,7 +4,7 @@ "请求头参数": "User-Agent$MOBILE_UA#Referer$WebView", "网页编码格式": "UTF-8", "图片是否需要代理": "0", - "是否开启获取首页数据": "0", + "是否开启获取首页数据": "1", "首页推荐链接": "http://www.yinghuadm.cn", "首页列表数组规则": "body&&.module-main.tab-list.active", "首页片单列表数组规则": ".module-item", @@ -78,4 +78,4 @@ "是否开启手动嗅探": "0", "手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos", "手动嗅探视频链接过滤词": ".html#=http" -} +} \ No newline at end of file diff --git a/小米/api.json b/小米/api.json index 76566d5..f227253 100644 --- a/小米/api.json +++ b/小米/api.json @@ -56,12 +56,12 @@ "filterable": 1, "ext": { "site_urls": [ + "https://www.erixaopan.fun/", "https://www.wexwp.cc", "https://wexwp.cc", "https://zhizhen1.top", "https://www.2xiaopan.fun/", - "https://2xiaopan.fun/", - "https://www.2xiaoyun.fun/" + "https://2xiaopan.fun/" ], "url_key": "UC", "token": "", @@ -124,8 +124,8 @@ "type": 3, "quickSearch": 1, "searchable": 1, - "api": "./api/%E9%BA%BB%E9%9B%80%E8%A7%86%E9%A2%91.js", - "ext": "" + "api": "./api/Applzxw.py", + "ext": "http://118.89.203.120:8365/" }, { "key": "csp_Music", @@ -162,7 +162,7 @@ "quickSearch": 0, "searchable": 1, "ext": { - "json": "https://cik07-cos.7moor-fs2.com/im/4d2c3f00-7d4c-11e5-af15-41bf63ae4ea0/1ef9257f7cd6eac9/bilibil.json", + "json": "https://pan-1.vma.cc/pan/down.php/699148f919c79be3493e53c780d8e2a8.txt", "cookie": "" }, "style": { diff --git a/小米/api/%E9%BA%BB%E9%9B%80%E8%A7%86%E9%A2%91.js b/小米/api/%E9%BA%BB%E9%9B%80%E8%A7%86%E9%A2%91.js deleted file mode 100644 index 33651c1..0000000 --- a/小米/api/%E9%BA%BB%E9%9B%80%E8%A7%86%E9%A2%91.js +++ /dev/null @@ -1,285 +0,0 @@ -// 本资源来源于互联网公开渠道,仅可用于个人学习爬虫技术。 -// 严禁将其用于任何商业用途,下载后请于 24 小时内删除,搜索结果均来自源站,本人不承担任何责任。 - -import { Crypto, _ } from 'assets://js/lib/cat.js'; -let host = 'https://www.mqtv.cc'; -const key = 'Mcxos@mucho!nmme'; -const main_headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36', - 'accept-language': 'zh-CN,zh;q=0.9', - 'sec-ch-ua': '"Google Chrome";v="143", "Chromium";v="143", "Not A(Brand";v="24"', - 'cache-control': 'no-cache', - 'pragma': 'no-cache', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-site': 'same-origin' -}; - -async function init(cfg) { - if (cfg.ext && cfg.ext.startsWith('http')) { - host = cfg.ext.trim().replace(/\/$/, ''); - } -} - -async function home(filter) { - if (!host) return JSON.stringify({ class: [] }); - return JSON.stringify({ - class: [ - { 'type_id': '/type/movie', 'type_name': '电影' }, - { 'type_id': '/type/tv', 'type_name': '电视剧' }, - { 'type_id': '/type/va', 'type_name': '综艺' }, - { 'type_id': '/type/ct', 'type_name': '动漫' } - ] - }); -} - -async function homeVod() { - const token = await getToken('/'); - const url = `${host}/libs/VodList.api.php?home=index&token=${token}`; - const resp = await req(url, { headers: getHeaders2('/') }); - const json = JSON.parse(resp.content); - let videos = []; - if (json.data && json.data.movie) { - for (const i of json.data.movie) { - videos.push(...arr2vods(i.show)); - } - } - return JSON.stringify({ list: videos }); -} - -async function category(tid, pg, filter, extend) { - const typeKey = tid.split('/')[2]; - const token = await getToken(tid, '/'); - const url = `${host}/libs/VodList.api.php?type=${typeKey}&rank=rankhot&cat=&year=&area=&page=${pg}&token=${token}`; - const resp = await req(url, { headers: getHeaders2(tid) }); - const json = JSON.parse(resp.content); - return JSON.stringify({ - list: arr2vods(json.data), - page: parseInt(pg) - }); -} - -async function search(wd, quick, pg=1) { - const path = `/search/${encodeURIComponent(wd)}`; - const token = await getToken(path, '/'); - const url = `${host}/libs/VodList.api.php?search=${encodeURIComponent(wd)}&token=${token}`; - const resp = await req(url, { headers: getHeaders2(path) }); - const json = JSON.parse(resp.content); - const data = decodeData(json.data); - let videos = []; - if (data.vod_all) { - for (const i of data.vod_all) { - if (_.isPlainObject(i)) { - videos.push(...arr2vods(i.show)); - } - } - } - return JSON.stringify({ list: videos, pagecount: 1, page: parseInt(pg) }); -} - -async function detail(id) { - const idParts = id.split('/'); - const realId = idParts[idParts.length - 1]; - const token = await getToken(id, '/'); - const url = `${host}/libs/VodInfo.api.php?type=ct&id=${realId}&token=${token}`; - const resp = await req(url, { headers: getHeaders2(id) }); - const json = JSON.parse(resp.content); - const data = json.data; - const parsesArr = []; - const playApi = data.playapi || []; - for (const i of playApi) { - if (_.isPlainObject(i) && i.url && typeof i.url === 'string') { - if (i.url.startsWith('//')) { - parsesArr.push(`https:${i.url}`); - } else { - parsesArr.push(i.url); - } - } - } - const parses = parsesArr.join(','); - const shows = []; - const playUrls = []; - if (data.playinfo) { - for (const j of data.playinfo) { - const urls = []; - for (const k of j.player) { - urls.push(`${k.no}$${k.url}@${parses}`); - } - if (urls.length > 0) { - playUrls.push(urls.join('#')); - shows.push(j.cnsite); - } - } - } - const video = { - 'vod_id': id, - 'vod_name': data.title, - 'vod_pic': data.img, - 'vod_remarks': data.remark, - 'vod_year': data.year, - 'vod_area': data.area, - 'vod_actor': data.actor, - 'vod_director': data.director, - 'vod_content': '', - 'vod_play_from': shows.join('$$$'), - 'vod_play_url': playUrls.join('$$$'), - 'type_name': '' - }; - return JSON.stringify({ list: [video] }); -} - -async function play(flag, vid, flags) { - const parts = vid.split('@'); - const rawUrl = parts[0]; - const parsesStr = parts[1] || ''; - const parses = parsesStr.split(','); - let jx = 0; - let sniff = 0; - let url = ''; - for (const parseUrl of parses) { - try { - const apiUrl = `${parseUrl}${rawUrl}`; - const resp = await req(apiUrl, { headers: main_headers, timeout: 10000 }); - const html = resp.content; - const charsetMatch = html.match(/<(?:\s+)?meta(?:\s+)?charset="UTF-8"(?:\s+)?id(?:\s+)?=(?:\s+)?"now_(.*?)"(?:\s+)?>/i); - const viewportMatch = html.match(/<(?:\s+)?meta(?:\s+)?name(?:\s+)?=(?:\s+)?"viewport".*?id(?:\s+)?=(?:\s+)?"now_(.*?)">/i); - const urlMatch = html.match(/"url"(?:\s+)?:\s+?"(.*?)",/i); - if (charsetMatch && viewportMatch && urlMatch) { - const charsetMetaId = charsetMatch[1]; - const viewportMetaId = viewportMatch[1]; - const encryptedUrl = urlMatch[1]; - const playUrl = decryptUrl(encryptedUrl, viewportMetaId, charsetMetaId); - if (playUrl.startsWith('http')) { - url = playUrl; - break; - } - } - } catch (e) { - console.warn(e)} - } - if (!url) { - if (rawUrl.startsWith('http') && /(?:www\.iqiyi|v\.qq|v\.youku|www\.mgtv|www\.bilibili)\.com/.test(rawUrl)) { - url = rawUrl; - jx = 1; - } else { - for (const j of parses) { - if (j.startsWith('http')) { - url = `${j}${rawUrl}`; - sniff = 1; - break; - } - } - } - } - return JSON.stringify({jx: jx, parse: sniff, url: url, header: {'User-Agent': main_headers['User-Agent']}}); -} - -function decryptUrl(encryptedStr, viewportMetaId, charsetMetaId) { - try { - const idTextList = []; - for (let i = 0; i < charsetMetaId.length; i++) { - const idChar = charsetMetaId[i]; - const textChar = i < viewportMetaId.length ? viewportMetaId[i] : ''; - idTextList.push({ id: idChar, text: textChar }); - } - idTextList.sort((a, b) => parseInt(a.id) - parseInt(b.id)); - const seed = idTextList.map(item => item.text).join(''); - const md5Result = md5X(`${seed}lemon`); - const iv = md5Result.substring(0, 16); - const keyStr = md5Result.substring(16); - return aesX('AES/CBC/PKCS7', false, encryptedStr, true, keyStr, iv, false); - } catch (e) { - return ''; - } -} - -async function getToken(path, refPath = '') { - const headers = { - ...main_headers, - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', - 'priority': 'u=0, i', - 'sec-fetch-dest': 'document', - 'sec-fetch-mode': 'navigate', - 'sec-fetch-user': '?1', - 'upgrade-insecure-requests': '1' - }; - if (refPath) headers['referer'] = `${host}${refPath}`; - const resp = await req(`${host}${path}`, { headers }); - const content = resp.content; - const match = content.match(/window\.pageid\s?=\s?'(.*?)';/i); - const pageId = match ? match[1] : ''; - return encodeData(pageId); -} - -function encodeData(data) { - const jsonStr = JSON.stringify(data); - const b64_1 = strToBase64(jsonStr); - let xor_result = ''; - const keyLen = key.length; - for (let i = 0; i < b64_1.length; i++) { - const charCode = b64_1.charCodeAt(i) ^ key.charCodeAt(i % keyLen); - xor_result += String.fromCharCode(charCode); - } - const b64_2 = strToBase64(xor_result); - return encodeURIComponent(b64_2); -} - -function decodeData(encodedStr) { - try { - const decodedStep1Str = base64ToStr(encodedStr); - let xorResult = ''; - const keyLen = key.length; - for (let i = 0; i < decodedStep1Str.length; i++) { - const charCode = decodedStep1Str.charCodeAt(i) ^ key.charCodeAt(i % keyLen); - xorResult += String.fromCharCode(charCode); - } - const decodedStep2Str = base64ToStr(xorResult); - return JSON.parse(decodedStep2Str); - } catch (e) { - console.error('Decode error:', e); - return {}; - } -} - -function getHeaders2(refPath = '') { - const headers = { - ...main_headers, - 'Accept': 'application/json, text/javascript, */*; q=0.01', - 'priority': 'u=1, i', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'x-requested-with': 'XMLHttpRequest' - }; - if (refPath) headers['referer'] = `${host}${refPath}`; - return headers; -} - -function arr2vods(arr) { - return (arr || []).map(i => ({ - 'vod_id': i.url, - 'vod_name': i.title, - 'vod_pic': i.img, - 'vod_remarks': i.remark, - 'vod_year': null - })); -} - -function strToBase64(str) { - return Crypto.enc.Base64.stringify(Crypto.enc.Utf8.parse(str)); -} - -function base64ToStr(b64) { - return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(b64)); -} - -export function __jsEvalReturn() { - return { - init: init, - home: home, - homeVod: homeVod, - category: category, - search: search, - detail: detail, - play: play - }; -} \ No newline at end of file diff --git a/小米/api/Applzxw.py b/小米/api/Applzxw.py new file mode 100644 index 0000000..76a95d4 --- /dev/null +++ b/小米/api/Applzxw.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +# 本资源来源于互联网公开渠道,仅可用于个人学习及爬虫技术交流。 +# 严禁将其用于任何商业用途,下载后请于 24 小时内删除,搜索结果均来自源站,本人不承担任何责任。 +""" +{ + "key": "xxx", + "name": "xxx", + "type": 3, + "api": "./ApptoV5无加密.py", + "ext": "http://domain.com" +} +""" + +import re,sys,uuid +from base.spider import Spider +sys.path.append('..') + +class Spider(Spider): + host,config,local_uuid,parsing_config = '','','',[] + headers = { + 'User-Agent': "Dart/2.19 (dart:io)", + 'Accept-Encoding': "gzip", + 'appto-local-uuid': local_uuid + } + + def init(self, extend=''): + try: + host = extend.strip() + if not host.startswith('http'): + return {} + if not re.match(r'^https?://[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(:\d+)?/?$', host): + host_=self.fetch(host).json() + self.host = host_['domain'] + else: + self.host = host + self.local_uuid = str(uuid.uuid4()) + response = self.fetch(f'{self.host}/apptov5/v1/config/get?p=android&__platform=android', headers=self.headers).json() + config = response['data'] + self.config = config + parsing_conf = config['get_parsing']['lists'] + parsing_config = {} + for i in parsing_conf: + if len(i['config']) != 0: + label = [] + for j in i['config']: + if j['type'] == 'json': + label.append(j['label']) + parsing_config.update({i['key']:label}) + self.parsing_config = parsing_config + return None + except Exception as e: + print(f'初始化异常:{e}') + return {} + + def detailContent(self, ids): + response = self.fetch(f"{self.host}/apptov5/v1/vod/getVod?id={ids[0]}",headers=self.headers).json() + data3 = response['data'] + videos = [] + vod_play_url = '' + vod_play_from = '' + for i in data3['vod_play_list']: + play_url = '' + for j in i['urls']: + play_url += f"{j['name']}${i['player_info']['from']}@{j['url']}#" + vod_play_from += i['player_info']['show'] + '$$$' + vod_play_url += play_url.rstrip('#') + '$$$' + vod_play_url = vod_play_url.rstrip('$$$') + vod_play_from = vod_play_from.rstrip('$$$') + videos.append({ + 'vod_id': data3.get('vod_id'), + 'vod_name': data3.get('vod_name'), + 'vod_content': data3.get('vod_content'), + 'vod_remarks': data3.get('vod_remarks'), + 'vod_director': data3.get('vod_director'), + 'vod_actor': data3.get('vod_actor'), + 'vod_year': data3.get('vod_year'), + 'vod_area': data3.get('vod_area'), + 'vod_play_from': vod_play_from, + 'vod_play_url': vod_play_url + }) + return {'list': videos} + + def searchContent(self, key, quick, pg='1'): + url = f"{self.host}/apptov5/v1/search/lists?wd={key}&page={pg}&type=&__platform=android" + response = self.fetch(url, headers=self.headers).json() + data = response['data']['data'] + for i in data: + if i.get('vod_pic').startswith('mac://'): + i['vod_pic'] = i['vod_pic'].replace('mac://', 'http://', 1) + return {'list': data, 'page': pg, 'total': response['data']['total']} + + def playerContent(self, flag, id, vipflags): + default_ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1' + parsing_config = self.parsing_config + parts = id.split('@') + if len(parts) != 2: + return {'parse': 0, 'url': id, 'header': {'User-Agent': default_ua}} + playfrom, rawurl = parts + label_list = parsing_config.get(playfrom) + if not label_list: + return {'parse': 0, 'url': rawurl, 'header': {'User-Agent': default_ua}} + result = {'parse': 1, 'url': rawurl, 'header': {'User-Agent': default_ua}} + for label in label_list: + payload = { + 'play_url': rawurl, + 'label': label, + 'key': playfrom + } + try: + response = self.post( + f"{self.host}/apptov5/v1/parsing/proxy?__platform=android", + data=payload, + headers=self.headers + ).json() + except Exception as e: + print(f"请求异常: {e}") + continue + if not isinstance(response, dict): + continue + if response.get('code') == 422: + continue + data = response.get('data') + if not isinstance(data, dict): + continue + url = data.get('url') + if not url: + continue + ua = data.get('UA') or data.get('UserAgent') or default_ua + result = { + 'parse': 0, + 'url': url, + 'header': {'User-Agent': ua} + } + break + return result + + def homeContent(self, filter): + config = self.config + if not config: + return {} + home_cate = config['get_home_cate'] + classes = [] + for i in home_cate: + if isinstance(i.get('extend', []),dict): + classes.append({'type_id': i['cate'], 'type_name': i['title']}) + return {'class': classes} + + def homeVideoContent(self): + response = self.fetch(f'{self.host}/apptov5/v1/home/data?id=1&mold=1&__platform=android',headers=self.headers).json() + data = response['data'] + vod_list = [] + for i in data['sections']: + for j in i['items']: + vod_pic = j.get('vod_pic') + if vod_pic.startswith('mac://'): + vod_pic = vod_pic.replace('mac://', 'http://', 1) + vod_list.append({ + "vod_id": j.get('vod_id'), + "vod_name": j.get('vod_name'), + "vod_pic": vod_pic, + "vod_remarks": j.get('vod_remarks') + }) + return {'list': vod_list} + + def categoryContent(self, tid, pg, filter, extend): + response = self.fetch(f"{self.host}/apptov5/v1/vod/lists?area={extend.get('area','')}&lang={extend.get('lang','')}&year={extend.get('year','')}&order={extend.get('sort','time')}&type_id={tid}&type_name=&page={pg}&pageSize=21&__platform=android", headers=self.headers).json() + data = response['data'] + data2 = data['data'] + for i in data['data']: + if i.get('vod_pic','').startswith('mac://'): + i['vod_pic'] = i['vod_pic'].replace('mac://', 'http://', 1) + return {'list': data2, 'page': pg, 'total': data['total']} + + def getName(self): + pass + + def isVideoFormat(self, url): + pass + + def manualVideoCheck(self): + pass + + def destroy(self): + pass + + def localProxy(self, param): + pass \ No newline at end of file diff --git a/小虎斑/api.json b/小虎斑/api.json index f183de1..16512f6 100644 --- a/小虎斑/api.json +++ b/小虎斑/api.json @@ -225,6 +225,50 @@ "type": 4, "api": "https://so.yinpai.xyz/api.php?type=tianyi" }, + { + "key": "茉莉", + "name": "茉莉|弹幕", + "type": 3, + "searchable": 1, + "changeable": 1, + "api": "csp_HBgetapp", + "ext": { + "host": "https://gitee.com/wmmoliill/wimg/raw/master/img/bk/9.txt", + "appkey": "88689667dce61725", + "appiv": "88689667dce61725" + } + }, + { + "key": "灵虎", + "name": "灵虎|弹幕", + "type": 3, + "searchable": 1, + "changeable": 1, + "api": "csp_HBgetapp", + "ext": { + "host": "https://bind.315999.xyz/89.txt", + "appkey": "#getapp@TMD@2025", + "appiv": "#getapp@TMD@2025" + } + }, + { + "key": "魔方", + "name": "魔方|4K弹幕", + "type": 3, + "api": "csp_HBgetapp", + "ext": { + "host": "https://snysw.xyz/mf4kzs327.txt", + "key": "MTIzNDU2Nzg4NzY1NDMyMQ==", + "iv": "MTIzNDU2Nzg4NzY1NDMyMQ==" + } + }, + { + "key": "狐狸", + "name": "狐狸|4K弹幕", + "type": 3, + "api": "csp_HBAppfox", + "ext": "./json/host.json" + }, { "key": "景天", "name": "景天|4K弹幕", @@ -349,73 +393,6 @@ "api": "csp_Jianpian", "ext": "http://pizazzGY.zxbwv.com" }, - { - "key": "风神", - "name": "风神|弹幕", - "type": 3, - "api": "csp_HBv1Class", - "ext": "DyoqWQInJUMuGFdINDU2AQMoEEAuDFdLDRtJAwMGWR8DJjhENFAqWC0CLgYDOQIADA82Ey0CJgMAMldLCzFBAQIoAwAGKQYB" - }, - { - "key": "爱影", - "name": "爱影|弹幕", - "type": 3, - "api": "csp_HBv1Class", - "ext": "./txt/api.txt" - }, - { - "key": "0°", - "name": "0°|弹幕", - "type": 3, - "api": "csp_HBlingDu" - }, - { - "key": "橘汁", - "name": "橘汁|弹幕", - "type": 3, - "api": "csp_HBmoou", - "ext": "https://ajuzi.top" - }, - { - "key": "123", - "name": "123|弹幕", - "type": 3, - "api": "csp_HBmoou", - "ext": "https://123ysw.com" - }, - { - "key": "演员", - "name": "演员|弹幕", - "type": 3, - "api": "csp_HBmoou", - "ext": "DyoqWQInJUMuGFcDDFApHDsCPgUGUyhENBtNAzgWUEg=" - }, - { - "key": "橘子", - "name": "橘子|弹幕", - "type": 3, - "api": "csp_HBmoou", - "ext": "DyoqWQInJUMuGFdZDwwuXwA8XUUAUi9HJxs1AwAnOkUBKSMHIhtBXQABPkMDMlsBDFE5HygWJR9XEANoWwNKOCgWJR8sIlpIIgg5AygWJUc7NT8FIw89WiwoIUEvJjhdNA81XCgWJR87GwUEIDYfEC8CLQ84NQkDNA8uAjsuVUg=" - }, - { - "key": "趣看", - "name": "趣看|弹幕", - "type": 3, - "api": "csp_HBmoou", - "ext": "DyoqWQInJUMuGFcCClEbHAI3Pg0GNhpZDAtNAzgWUEg=" - }, - { - "key": "HBqwKan", - "name": "全网|弹幕", - "type": 3, - "api": "csp_HBqwKan" - }, - { - "key": "csp_HBhcShun", - "name": "蝴蝶|弹幕", - "type": 3, - "api": "csp_HBhcShun" - }, { "key": "磁力", "name": "6V|弹幕", @@ -456,13 +433,6 @@ "api": "csp_Wcai", "ext": "https://www.jxshdzs.com/" }, - { - "key": "星河", - "name": "星河|弹幕", - "type": 3, - "api": "csp_HBgetapp", - "ext": "eyJob3N0IjoiaHR0cDovLzEyMS42Mi4yMi4yMDQ6OTg3Ni8iLCJrZXkiOiJaalZsTW5SNE5UTjVhM0EyY3pKak9RPT0iLCJpdiI6IlpqVmxNblI0TlRONWEzQTJjekpqT1E9PSIsInR5cGVJZHMiOlsiMSIsIjIiLCIzIiwiNCJdLCJ0eXBlTmFtZXMiOlsi55S15b2xIiwi55S16KeG5YmnIiwi5Yqo5ryrIiwi57u86Im6Il19" - }, { "key": "追追", "name": "追追|弹幕", diff --git a/小虎斑/json/host.json b/小虎斑/json/host.json new file mode 100644 index 0000000..072084f --- /dev/null +++ b/小虎斑/json/host.json @@ -0,0 +1,3 @@ +{ + "apiDomain": "http://103.23.148.102:12003" +} \ No newline at end of file diff --git a/小虎斑/spider.jar b/小虎斑/spider.jar index e0fb64c..a53d438 100644 Binary files a/小虎斑/spider.jar and b/小虎斑/spider.jar differ diff --git a/小虎斑/txt/api.txt b/小虎斑/txt/api.txt deleted file mode 100644 index 8aa4a9d..0000000 --- a/小虎斑/txt/api.txt +++ /dev/null @@ -1 +0,0 @@ -aQpuKZO+OwlAdPzo/A5wQ6juvRdKc70cmxz69JLXKe10vV/AZRaj3pkeP6u1WcUD \ No newline at end of file diff --git a/摸鱼儿/api.json b/摸鱼儿/api.json index 65108d1..f919b25 100644 --- a/摸鱼儿/api.json +++ b/摸鱼儿/api.json @@ -123,14 +123,6 @@ "api": "csp_AppGet", "ext": "bB1iyOjtXWh234iOsqOpQ65mKOL2sRd+RcTIk0cmjrD8688Xw5ArmjN9zmaBcFgVgymXypm6lVMfsF9YOHbdKm0QT6K8/+z1B6YhKTatmFsNRMAw995p8MscOfu0wUGg" }, - { - "key": "乐柔", - "name": "乐柔|APP", - "type": 3, - "searchable": 1, - "api": "csp_AppGet", - "ext": "VASETDFRsu3l5WWe51GKvTyRYQAaLaVChdrS1sM9T3RnDep1+RxdH0Ec+6amNaDQJc3tR+HcogeYahduEdscYQ9iPvdsyEWJhhPXgWXneDiD+tnTt1fce5OEp0IcyqYeacinOSFxrW53ivDWLDXIfOKVJPbU/QCZx2nPwoNB+ryCLDAuM24OWDaeR8Dj2fjxRXXeczV6jOwKGoTC4HkF2U/I0Iza93G8DKboyirsYdsFjrmFjHoL6y+pKNDCzzSz" - }, { "key": "jumeng", "name": "剧梦|APP", @@ -143,21 +135,22 @@ "changeable": 1 }, { - "key": "baige", - "name": "白鸽|APP", + "key": "茉莉", + "name": "茉莉|APP", "type": 3, "searchable": 1, "changeable": 1, "api": "csp_AppGet", - "ext": "N5u2FS3i/elUFAoSVYBzndHyWmPoQhZsTIJ5ve8B5RdbojKSoqbNo9TORMUWkv2seRAMOLNXC0kGo4lOAL64Xk7pAb68ZHIckNJyo2vC4NFuLci8sMhhnj60v/nDbU1U" + "ext": "pWLjYsLv1mpiSv+WqFNaIqp5t2Fo1rfLU1hwJwJ3KAGKWPMicT5CGiEJRsrqJm9/nvc1/bybKq1jaWaAf7G9gUJC37DHLmVmIm9/p/N1fBD+82t9o4+ohiIbelQv/KcjFIKtpyq6+YLDnlgrruYRKUgTa4rOFFgLDPhiYQ9OCWc=" }, { - "key": "shuzi", - "name": "数字|APP", + "key": "驿站", + "name": "驿站丨APP", "type": 3, - "quickSearch": 1, + "searchable": 1, + "changeable": 1, "api": "csp_AppGet", - "ext": "ij8RUkhocZ9ruRgraOrV50cdijznPXJjPSmDdoI59PzF/K2UT7pKnau1ohLhZpTHxdrsBe+l0Qca19BaNsP0tMwh5qgX5Vzp8djZcM8TGlBmgxUOngKyNKQe04jcTDCX" + "ext": "pWLjYsLv1mpiSv+WqFNaIm66mYd3wj8hTGH18iQWPMOsJQb0GzUsB8gINUmUt9ktN2asJBwog2UGrTKUT2iY8NRz8qdgv5ctIC4NHKNarxWpwJPC52QcuqpdWKb8HK5mKYzOD7hj1nFrKL2gyacGOuMvUnqtIF5tWCjfnMws2K5omAGxO4lwWXOv7klFBE5q" }, { "key": "bimoxinghe", @@ -169,6 +162,15 @@ "api": "csp_AppYsV2", "ext": "wYceOHC6X3P3alhnB4RtmzgFD1Irln8apuUGgGt0cGNu1m3wi32g5216U4VmaeMAakuchzAtkZK4hN76RGX+SgXswlO9BU7AAQg57WGKJIWptJgUaSjRv+dsCFHAMS7NtEkaU8HcHtu3mNmXmiGVLae6KtmpbuT1razd8CkTO1A=" }, + { + "key": "优兔", + "name": "优兔|APP", + "type": 3, + "api": "csp_AppQi", + "searchable": 1, + "changeable": 1, + "ext": "sCnv2gwYzALZxDcfyX62oa/GcFEmb/I/xXqDZHfxD21nygxbF0g0k2XZ3eHUgcbapE9SlSBNGML4tm9z8djfku+EgbK9ImWx26mt1XH7qoOLZOX6Rbfvov/kxcOpd6VZno3RJd7gpzk5gabcuJLOw30jtpjQjXU5ScVOQ0OmHoBoMc6kkivh0wIRj1VFxSUc" + }, { "key": "顾我", "name": "顾我|APP", @@ -210,14 +212,6 @@ "filterable": 1, "ext": "sCnv2gwYzALZxDcfyX62oRPMT83Bt3Q5r5Q6ZwZ7Qq7ZfJZDdC8XcpJTArOjxs1hHGrH7JX/hlcGzED0RCFI/s5GJg5ZWPlTtK+GsArjWDyxNkvAnyr0ju34UuSCxQLD322RSid4K96h74Nx/SiPlH1VjrRyIHMEIfDj/wTAjZGrqJ89zsewId3PXJEpHlqc7ewAudH5J9EGzdit7AYOug==" }, - { - "key": "Xiaozhu", - "name": "小猪|APP", - "type": 3, - "quickSearch": 1, - "api": "csp_AppQi", - "ext": "sCnv2gwYzALZxDcfyX62ocnzUvJAKkFYjANTpxiK4/gGbDrz9ldn19W+exdncXnlqR08hfUr/v07gMuoCqnxT/O9WGtW6zaH8aFD4Spq4NK92kGzWrDcb5Nc8ycIEjHAWTd/BDtWfd5tajTFKjhLQXUAooetlpwSJ0eM3WJVfEmRjHm9NTC7gfAABbjO7nkX1YEGgMQ5872CBiFGKF29HHLt3WokOXaCkLyr2R3/Edo=" - }, { "key": "奇奇", "name": "奇奇|APP", @@ -322,11 +316,7 @@ "type": 3, "api": "csp_PanTa", "searchable": 1, - "changeable": 1, - "style": { - "type": "list", - "ratio": 1.433 - } + "changeable": 1 }, { "key": "夸父", diff --git a/摸鱼儿/spider.jar b/摸鱼儿/spider.jar index 30e0ea5..cbb2022 100644 Binary files a/摸鱼儿/spider.jar and b/摸鱼儿/spider.jar differ diff --git a/欧歌/api.json b/欧歌/api.json index db41219..226860d 100644 --- a/欧歌/api.json +++ b/欧歌/api.json @@ -13,14 +13,14 @@ "sites": [ { "key": "豆瓣2", - "name": "📢免费仅限测试用,请勿演示贩卖购买,谨防上当受骗!", + "name": "📢天作孽,犹可违,自作孽,不可活。——《尚书》", "type": 3, "api": "csp_Douban", "searchable": 0 }, { "key": "豆瓣1", - "name": "📢公告❤更新01.28❤", + "name": "📢公告❤更新01.31❤", "type": 3, "api": "csp_Notice", "searchable": 1, @@ -64,7 +64,7 @@ ], "url_key": "wogg1", "threadinfo": { - "chunksize": 265, + "chunksize": 228, "threads": 16 } } @@ -86,7 +86,7 @@ ], "url_key": "woog2", "threadinfo": { - "chunksize": 282, + "chunksize": 245, "threads": 16 } } @@ -1395,7 +1395,7 @@ { "name": "失败手动换", "type": "1", - "url": "https://by1.nxog.eu.org/jx.php?ou=80&mz=0&url=", + "url": "https://by1.nxog.eu.org/jx.php?ou=83&mz=0&url=", "ext": { "header": { "user-agent": "Mozilla/5.0(Linux;Android13;V2049ABuild/TP1A.220624.014;wv)AppleWebKit/537.36(KHTML,likeGecko)Version/4.0Chrome/116.0.0.0MobileSafari/537.36" @@ -1405,17 +1405,17 @@ { "name": "-关注-", "type": 1, - "url": "https://by1.nxog.eu.org/jx.php?ou=80&mz=1&url=" + "url": "https://by1.nxog.eu.org/jx.php?ou=83&mz=1&url=" }, { "name": "-装歌API-", "type": 1, - "url": "https://by1.nxog.eu.org/jx.php?ou=80&mz=2&url=" + "url": "https://by1.nxog.eu.org/jx.php?ou=83&mz=2&url=" }, { "name": "-公众号-", "type": 1, - "url": "https://by1.nxog.eu.org/jx.php?ou=80&mz=3&url=" + "url": "https://by1.nxog.eu.org/jx.php?ou=83&mz=3&url=" }, { "name": "装歌APP", diff --git a/欧歌/json/养生堂.json b/欧歌/json/养生堂.json index 4519779..222640e 100644 --- a/欧歌/json/养生堂.json +++ b/欧歌/json/养生堂.json @@ -9,9 +9,4 @@ "链接前缀": "https://app.api.btime.com/video/play?callback=jQuery36009651202523243325_1747927554988&id=", // "线路标题": "&&