diff --git a/FGBLH/py/每日大赛.py b/FGBLH/py/每日大赛.py new file mode 100644 index 00000000..65ca1cc3 --- /dev/null +++ b/FGBLH/py/每日大赛.py @@ -0,0 +1,463 @@ +import json +import re +import sys +import hashlib +from base64 import b64decode, b64encode +from urllib.parse import urlparse + +import requests +from Crypto.Cipher import AES +from Crypto.Util.Padding import unpad +from pyquery import PyQuery as pq +sys.path.append('..') +from base.spider import Spider as BaseSpider + +img_cache = {} + +class Spider(BaseSpider): + + def init(self, extend=""): + try: + self.proxies = json.loads(extend) + except: + self.proxies = {} + self.headers = { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', + 'Accept-Language': 'zh-CN,zh;q=0.9', + 'Connection': 'keep-alive', + 'Cache-Control': 'no-cache', + } + self.host = self.get_working_host() + self.headers.update({'Origin': self.host, 'Referer': f"{self.host}/"}) + print(f"使用站点: {self.host}") + + def getName(self): + return "🌈 每日大赛|终极完美版" + + def isVideoFormat(self, url): + return any(ext in (url or '') for ext in ['.m3u8', '.mp4', '.ts']) + + def manualVideoCheck(self): + return False + + def destroy(self): + global img_cache + img_cache.clear() + + def get_working_host(self): + dynamic_urls = [ + 'https://www.mrds66.com/', + 'https://mrdsa2.com/', + 'https://mrdsa1.com/', + 'https://mrdsk.com/', + ] + for url in dynamic_urls: + try: + response = requests.get( + url, + headers=self.headers, + proxies=self.proxies, + timeout=6, + verify=False, + allow_redirects=True + ) + if response.status_code == 200: + return response.url.rstrip('/') + except Exception: + continue + return 'https://www.mrds66.com' + + def homeContent(self, filter): + try: + response = requests.get(self.host, headers=self.headers, proxies=self.proxies, timeout=15) + if response.status_code != 200: + return {'class': [], 'list': []} + data = self.getpq(response.text) + + classes = [] + category_selectors = ['.category-list ul li', '.nav-menu li', '.menu li', 'nav ul li'] + for selector in category_selectors: + for k in data(selector).items(): + link = k('a') + href = (link.attr('href') or '').strip() + name = (link.text() or '').strip() + if not href or href == '#' or not name or href == '/': + continue + if not href.startswith('http'): + href = href if href.startswith('/') else f"/{href}" + classes.append({'type_name': name, 'type_id': href}) + if classes: + break + + if not classes: + classes = [ + {'type_name': '每日大赛', 'type_id': '/category/mrds/'}, + ] + + return { + 'class': classes, + 'list': self.getlist(data('#index article, article')) + } + except Exception: + return {'class': [], 'list': []} + + def homeVideoContent(self): + try: + response = requests.get(self.host, headers=self.headers, proxies=self.proxies, timeout=15) + if response.status_code != 200: + return {'list': []} + data = self.getpq(response.text) + return {'list': self.getlist(data('#index article, article'))} + except Exception: + return {'list': []} + + def categoryContent(self, tid, pg, filter, extend): + try: + if '@folder' in tid: + v = self.getfod(tid.replace('@folder', '')) + return {'list': v, 'page': 1, 'pagecount': 1, 'limit': 90, 'total': len(v)} + + pg = int(pg) if pg else 1 + + if tid.startswith('http'): + base_url = tid.rstrip('/') + else: + path = tid if tid.startswith('/') else f"/{tid}" + base_url = f"{self.host}{path}".rstrip('/') + + if pg == 1: + url = f"{base_url}/" + else: + host_no_slash = self.host.rstrip('/') + if base_url == host_no_slash: + url = f"{host_no_slash}/page/{pg}/" + elif '/category/' in base_url or '/tag/' in base_url: + url = f"{base_url}/{pg}/" + else: + if '/page/' in base_url: + url = f"{base_url}/{pg}/" + else: + url = f"{base_url}/page/{pg}/" + + response = requests.get(url, headers=self.headers, proxies=self.proxies, timeout=15) + if response.status_code != 200: + return { + 'list': [], + 'page': pg, + 'pagecount': 9999, + 'limit': 90, + 'total': 0 + } + + data = self.getpq(response.text) + videos = self.getlist(data('#archive article, #index article, article'), tid) + + return {'list': videos, 'page': pg, 'pagecount': 9999, 'limit': 90, 'total': 999999} + except Exception: + return {'list': [], 'page': pg, 'pagecount': 9999, 'limit': 90, 'total': 0} + + def detailContent(self, ids): + try: + url = ids[0] if ids[0].startswith('http') else f"{self.host}{ids[0]}" + response = requests.get(url, headers=self.headers, proxies=self.proxies, timeout=15) + data = self.getpq(response.text) + + plist = [] + used_names = set() + + # 策略1: 提取 DPlayer 配置 + if data('.dplayer'): + for c, k in enumerate(data('.dplayer').items(), start=1): + try: + config_attr = k.attr('data-config') + if config_attr: + config = json.loads(config_attr) + video_url = config.get('video', {}).get('url', '') + + if video_url: + ep_name = '' + parent = k.parents().eq(0) + for _ in range(4): + if not parent: break + heading = parent.find('h2, h3, h4').eq(0).text().strip() + if heading: + ep_name = heading + break + parent = parent.parents().eq(0) + + base_name = ep_name if ep_name else f"视频{c}" + name = base_name + count = 2 + while name in used_names: + name = f"{base_name} {count}" + count += 1 + used_names.add(name) + + plist.append(f"{name}${video_url}") + except: + continue + + # 策略2: 提取正文中的文本链接 + if not plist: + content_area = data('.post-content, article') + for i, link in enumerate(content_area('a').items(), start=1): + link_text = link.text().strip() + link_href = link.attr('href') + + if link_href and any(kw in link_text for kw in ['点击观看', '观看', '播放', '视频', '第一弹']): + ep_name = link_text.replace('点击观看:', '').replace('点击观看', '').strip() + if not ep_name: + ep_name = f"视频{i}" + + if not link_href.startswith('http'): + link_href = f"{self.host}{link_href}" if link_href.startswith('/') else f"{self.host}/{link_href}" + + plist.append(f"{ep_name}${link_href}") + + play_url = '#'.join(plist) if plist else f"未找到视频源,请访问网页${url}" + + # ★★★ 标签点击功能修复核心区域 ★★★ + # 采用 reference 代码中的 [a=cr:...] 格式 + vod_content = '' + try: + tags = [] + seen_names = set() + seen_ids = set() + + # 每日大赛的标签选择器 + tag_links = data('.post-tags a, .tags a, .keywords a') + + candidates = [] + for k in tag_links.items(): + title = k.text().strip() + href = k.attr('href') + if title and href: + # 修正相对链接为绝对链接 + if not href.startswith('http'): + href = f"{self.host}{href}" if href.startswith('/') else f"{self.host}/{href}" + candidates.append({'name': title, 'id': href}) + + # 按长度排序,与参考代码保持一致 + candidates.sort(key=lambda x: len(x['name']), reverse=True) + + for item in candidates: + name = item['name'] + id_ = item['id'] + + if id_ in seen_ids: continue + # 简单的去重逻辑 + is_duplicate = False + for seen in seen_names: + if name in seen: + is_duplicate = True + break + if is_duplicate and name not in seen_names: pass # 允许完全匹配的标签 + elif is_duplicate: pass + + # 生成播放器专用跳转代码:[a=cr:{json}/]名称[/a] + target = json.dumps({'id': id_, 'name': name}) + tags.append(f'[a=cr:{target}/]{name}[/a]') + + seen_names.add(name) + seen_ids.add(id_) + + # 如果有标签,拼接显示 + if tags: + # 参考代码只显示标签,这里为了体验更好,我加上了正文摘要 + tags_str = ' '.join(tags) + summary = data('.post-content').text() or '' + summary = summary[:150] + '...' if len(summary) > 150 else summary + vod_content = f"{tags_str}\n\n{summary}" + else: + vod_content = data('.post-title').text() or data('h1').text() + + except Exception: + vod_content = '每日大赛' + + if not vod_content: + vod_content = '每日大赛' + + return {'list': [{ + 'vod_play_from': '每日大赛', + 'vod_play_url': play_url, + 'vod_content': vod_content + }]} + except: + return {'list': [{'vod_play_from': '每日大赛', 'vod_play_url': '获取失败'}]} + + def searchContent(self, key, quick, pg="1"): + try: + pg = int(pg) if pg else 1 + + if pg == 1: + url = f"{self.host}/search/{key}/" + else: + url = f"{self.host}/search/{key}/{pg}/" + + response = requests.get(url, headers=self.headers, proxies=self.proxies, timeout=15) + return {'list': self.getlist(self.getpq(response.text)('article')), 'page': pg, 'pagecount': 9999} + except: + return {'list': [], 'page': pg, 'pagecount': 9999} + + def playerContent(self, flag, id, vipFlags): + parse = 0 if self.isVideoFormat(id) else 1 + url = self.proxy(id) if '.m3u8' in id else id + return {'parse': parse, 'url': url, 'header': self.headers} + + def localProxy(self, param): + try: + type_ = param.get('type') + url = param.get('url') + if type_ == 'cache': + key = param.get('key') + if content := img_cache.get(key): + return [200, 'image/jpeg', content] + return [404, 'text/plain', b'Expired'] + elif type_ == 'img': + real_url = self.d64(url) if not url.startswith('http') else url + res = requests.get(real_url, headers=self.headers, proxies=self.proxies, timeout=10) + content = self.aesimg(res.content) + return [200, 'image/jpeg', content] + elif type_ == 'm3u8': + return self.m3Proxy(url) + else: + return self.tsProxy(url) + except: + return [404, 'text/plain', b''] + + def proxy(self, data, type='m3u8'): + if data and self.proxies: return f"{self.getProxyUrl()}&url={self.e64(data)}&type={type}" + return data + + def m3Proxy(self, url): + url = self.d64(url) + res = requests.get(url, headers=self.headers, proxies=self.proxies) + data = res.text + base = res.url.rsplit('/', 1)[0] + lines = [] + for line in data.split('\n'): + if '#EXT' not in line and line.strip(): + if not line.startswith('http'): + line = f"{base}/{line}" + lines.append(self.proxy(line, 'ts')) + else: + lines.append(line) + return [200, "application/vnd.apple.mpegurl", '\n'.join(lines)] + + def tsProxy(self, url): + return [200, 'video/mp2t', requests.get(self.d64(url), headers=self.headers, proxies=self.proxies).content] + + def e64(self, text): + return b64encode(str(text).encode()).decode() + + def d64(self, text): + return b64decode(str(text).encode()).decode() + + def aesimg(self, data): + if len(data) < 16: return data + keys = [(b'f5d965df75336270', b'97b60394abc2fbe1'), (b'75336270f5d965df', b'abc2fbe197b60394')] + for k, v in keys: + try: + dec = unpad(AES.new(k, AES.MODE_CBC, v).decrypt(data), 16) + if dec.startswith(b'\xff\xd8') or dec.startswith(b'\x89PNG'): return dec + except: pass + try: + dec = unpad(AES.new(k, AES.MODE_ECB).decrypt(data), 16) + if dec.startswith(b'\xff\xd8'): return dec + except: pass + return data + + def getlist(self, data, tid=''): + videos = [] + is_folder = '/mrdg' in (tid or '') + for k in data.items(): + card_html = k.outer_html() if hasattr(k, 'outer_html') else str(k) + a = k if k.is_('a') else k('a').eq(0) + href = a.attr('href') + title = k('h2').text() or k('.entry-title').text() or k('.post-title').text() + if not title and k.is_('a'): title = k.text() + + if href and title: + img = self.getimg(k('script').text(), k, card_html) + + remarks = k('time').text() + if not remarks: + full_text = k.text() + m = re.search(r'(\d{4}\s*年\s*\d{1,2}\s*月\s*\d{1,2}\s*日)', full_text) + if m: + remarks = m.group(1) + else: + m2 = re.search(r'(\d{4}-\d{1,2}-\d{1,2})', full_text) + if m2: + remarks = m2.group(1) + + videos.append({ + 'vod_id': f"{href}{'@folder' if is_folder else ''}", + 'vod_name': title.strip(), + 'vod_pic': img, + 'vod_remarks': remarks.strip() if remarks else '', + 'vod_tag': 'folder' if is_folder else '', + 'style': {"type": "rect", "ratio": 1.33} + }) + return videos + + def getfod(self, id): + url = f"{self.host}{id}" + data = self.getpq(requests.get(url, headers=self.headers, proxies=self.proxies).text) + videos = [] + for i, h2 in enumerate(data('.post-content h2').items()): + p_txt = data('.post-content p').eq(i * 2) + p_img = data('.post-content p').eq(i * 2 + 1) + p_html = p_img.outer_html() if hasattr(p_img, 'outer_html') else str(p_img) + videos.append({ + 'vod_id': p_txt('a').attr('href'), + 'vod_name': p_txt.text().strip(), + 'vod_pic': self.getimg('', p_img, p_html), + 'vod_remarks': h2.text().strip() + }) + return videos + + def getimg(self, text, elem=None, html_content=None): + if m := re.search(r"loadBannerDirect\('([^']+)'", text or ''): + return self._proc_url(m.group(1)) + + if html_content is None and elem is not None: + html_content = elem.outer_html() if hasattr(elem, 'outer_html') else str(elem) + if not html_content: return '' + + html_content = html_content.replace('"', '"').replace(''', "'").replace('&', '&') + + if 'data:image' in html_content: + m = re.search(r'(data:image/[a-zA-Z0-9+/=;,]+)', html_content) + if m: return self._proc_url(m.group(1)) + + m = re.search(r'(https?://[^"\'\s)]+\.(?:jpg|png|jpeg|webp))', html_content, re.I) + if m: return self._proc_url(m.group(1)) + + if 'url(' in html_content: + m = re.search(r'url\s*\(\s*[\'"]?([^"\'\)]+)[\'"]?\s*\)', html_content, re.I) + if m: return self._proc_url(m.group(1)) + + return '' + + def _proc_url(self, url): + if not url: return '' + url = url.strip('\'" ') + if url.startswith('data:'): + try: + _, b64_str = url.split(',', 1) + raw = b64decode(b64_str) + if not (raw.startswith(b'\xff\xd8') or raw.startswith(b'\x89PNG') or raw.startswith(b'GIF8')): + raw = self.aesimg(raw) + key = hashlib.md5(raw).hexdigest() + img_cache[key] = raw + return f"{self.getProxyUrl()}&type=cache&key={key}" + except: return "" + if not url.startswith('http'): + url = f"{self.host}{url}" if url.startswith('/') else f"{self.host}/{url}" + return f"{self.getProxyUrl()}&url={self.e64(url)}&type=img" + + def getpq(self, data): + try: return pq(data) + except: return pq(data.encode('utf-8')) diff --git a/FGBLH/海豚666.json b/FGBLH/海豚666.json index 7d0d648f..ae94244f 100644 --- a/FGBLH/海豚666.json +++ b/FGBLH/海豚666.json @@ -524,6 +524,12 @@ "type": 3, "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/91吃瓜中心.py" }, + { + "key": "mrds", + "name": "🐬每日大赛.py|🔞", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/每日大赛.py" + }, { "key": "xmzb", "name": "🐬熊猫视频.py|🔞", diff --git a/FGBLH/海豚py.json b/FGBLH/海豚py.json new file mode 100644 index 00000000..136e2136 --- /dev/null +++ b/FGBLH/海豚py.json @@ -0,0 +1,719 @@ +{ + "spider": "./tvbox.jar", + "logo": "https://img.freepik.com/free-vector/cute-dolphin-swimming-cartoon-vector-icon-illustration-animal-nature-icon-isolated-flat-vector_138676-12582.jpg?semt=ais_hybrid&w=740&q=80", + "wallpaper":"http://tool.teyonds.com/api", + "warningText": "注意:如果别人倒卖海豚影视接口收费的都是骗子,没有qq群微信群,只有tg官方交流群 TG:@hshsjk", + "sites": [ + { + "key": "MGtv", + "name": "🐬芒果TV.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/芒果TV.py" + }, + { + "key": "ppx", + "name": "🐬皮皮虾.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/皮皮虾.py", + "ext": "http://43.248.117.123:4680" + }, + { + "key": "fY", + "name": "🐬枫叶影院(关梯子使用)", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/枫叶影院.py" + }, + { + "key": "rb", + "name": "🐬热播APP.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/热播APP.py" + }, + { + "key": "JP", + "name": "🐬金牌APP.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/金牌APP.py" + }, + { + "key": "GZ", + "name": "🐬瓜子APP.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/瓜子APP.py" + }, + { + "key": "nmvm", + "name": "🐬农民影视.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/农民影视.py" + }, + { + "key": "xc", + "name": "🐬星辰影院.py(关梯)", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/星辰影院.py" + }, + { + "key": "hstv", + "name": "🐬华数TV.py(关梯)", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/华数TV.py" + }, + { + "key": "dttv", + "name": "🐬蛋挞TV.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/蛋挞TV.py" + }, + { + "key": "dsys", + "name": "🐬毒舌影视.py(关梯)", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/毒舌影视.py" + }, + { + "key": "qw", + "name": "🐬七味.py(关梯)", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/七味.py" + }, + { + "key": "kf", + "name": "🐬咖啡体育直播.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/咖啡直播.py" + }, + { + "key": "sm", + "name": "🐬熊猫直播", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/熊猫直播.py" + }, + { + "key": "blzb", + "name": "🐬哔哩直播.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/哔哩直播.py" + }, + { + "key": "jhzb", + "name": "🐬聚合直播.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/聚合直播.py" + }, + { + "key": "MiFun", + "name": "🐬MiFun动漫.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/MiFun动漫.py" + }, + { + "key": "smdj", + "name": "🐬星芽短剧.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/星芽短剧.py" + }, + { + "key": "hmjc", + "name": "🐬河马剧场.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/河马剧场.py" + }, + { + "key": "hgdj", + "name": "🐬红果短剧.py", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/红果短剧.py" + }, + { + "key": "网易云音|音乐", + "name": "🐬网易云音.py", + "type": 3, + "api": "https://xn--fjq53n.xyz/Ting/yinyue/网易云音乐.py" + }, + { + "key": "网易云音乐1", + "name": "🐬网易云1.py", + "type": 3, + "api": "https://xn--fjq53n.xyz/Ting/yinyue/网易云音乐1.py" + } + ], + "parses": [ + { + "name": "盘古", + "type": 0, + "url": "https://www.playm3u8.cn/jiexi.php?url=", + "ext": { + "header": { + "user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36" + } + } + }, + { + "name": "极速", + "type": 0, + "url": "https://jiexi.789jiexi.net:4433/?url=" + }, + { + "name": "虾米解析", + "type": 0, + "url": "https://jx.xmflv.com/?url=" + }, + { + "name": "淘片解析", + "type": 0, + "url": "https://jx.yparse.com/index.php?url=" + }, + { + "name": "解析1", + "type": 0, + "url": "https://huayong.net/999/?v=" + }, + { + "name": "解析2", + "type": 0, + "url": "https://jx.m3u8.tv/jiexi/?url=" + }, + { + "name": "解析3", + "type": 0, + "url": "https://t2.qlplayer.cyou/player/analysis.php?v=" + }, + + { + "name": "解析4", + "type": 0, + "url": "https://www.ckplayer.vip/jiexi/?url=" + }, + { + "name": "解析5", + "type": 0, + "url": "https://nm.xxxc137.top/static/player/artplayer.html?url=" + }, + { + "name": "解析6", + "type": 0, + "url": "https://www.yemu.xyz/?url=" + }, + { + "name": "冰豆", + "type": 0, + "url": "https://bd.jx.cn/?url=" + }, + { + "name":"爱酷", + "type":0, + "url":"https://jx.zhanlangbu.com/?url=" + }, + {"name":"云解析","type":0,"url":"https://jx.yparse.com/index.php?url=","ext":{"header":{"user-agent":"Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"}}}, + {"name":"777","type":0,"url":"https://jx.jsonplayer.com/player/?url=","ext":{"header":{"user-agent":"Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"}}}, + {"name":"-剖云-","type":0,"url":"https://www.kkvip2022.com/vip/jiexi1/?url=","ext":{"header":{"user-agent":"Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"}}}, + {"name":"-全看-","type":0,"url":"https://jx.quankan.app/?url=","ext":{"header":{"user-agent":"Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"}}} + ], + "doh": [ + { + "name": "Google", + "url": "https://dns.google/dns-query", + "ips": [ + "8.8.4.4", + "8.8.8.8" + ] + }, + { + "name": "Cloudflare", + "url": "https://cloudflare-dns.com/dns-query", + "ips": [ + "1.1.1.1", + "1.0.0.1", + "2606:4700:4700::1111", + "2606:4700:4700::1001" + ] + }, + { + "name": "AdGuard", + "url": "https://dns.adguard.com/dns-query", + "ips": [ + "94.140.14.140", + "94.140.14.141" + ] + }, + { + "name": "DNSWatch", + "url": "https://resolver2.dns.watch/dns-query", + "ips": [ + "84.200.69.80", + "84.200.70.40" + ] + }, + { + "name": "Quad9", + "url": "https://dns.quad9.net/dns-quer", + "ips": [ + "9.9.9.9", + "149.112.112.112" + ] + } + ], + "ads": [ + "mozai.4gtv.tv", + "static-mozai.4gtv.tv" + ], + "lives": [ + { + "name": "🐬各大源合集 海豚影视永久免费如有收费的都是骗子", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "https://gh-proxy.org/https://raw.githubusercontent.com/807080747/zv/refs/heads/main/sese.txt" + }, + { + "name": "🐬综合直播 海豚影视交流群 TG:@hshsjk9", + "type": 0, + "playerType": 2, + "ua": "okhttp", + "url": "https://raw.githubusercontent.com/fleung49/star/refs/heads/main/mit" + }, + { + "name": "🐬电视家", + "type": 0, + "playerType": 2, + "ua": "okhttp", + "url": "https://gh-proxy.org/https://github.com/bang359/dsj/raw/main/dsjcs.txt" + }, + { + "name": "🐬地方直播", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "https://ghfast.top/https://raw.githubusercontent.com/develop202/migu_video/refs/heads/main/interface.txt" + }, + { + "name": "🐬地方直播2", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "https://raw.githubusercontent.com/Guovin/iptv-api/gd/output/ipv4/result.m3u" + }, + { + "name": "🐬海燕直播", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "https://gh-proxy.org/https://raw.githubusercontent.com/wujiangliu/live-sources/refs/heads/main/haiyan.txt" + }, + { + "name": "🐬薄荷直播", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "https://gh-proxy.org/https://raw.githubusercontent.com/wujiangliu/live-sources/refs/heads/main/bhmb.m3u" + }, + { + "name": "🐬湘西直播", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "https://hub.glowp.xyz/https://raw.githubusercontent.com/wujiangliu/live-sources/refs/heads/main/xiangxi.txt" + }, + { + "name": "🐬全球直播", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "https://gh-proxy.org/https://raw.githubusercontent.com/wujiangliu/live-sources/refs/heads/main/%E5%85%A8%E7%90%83%E7%9B%B4%E6%92%AD.m3u" + }, + { + "name": "🐬咪咕直播", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "http://www.52top.com.cn:678/downloads/migu.txt" + }, + { + "name": "🐬iptv直播", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "https://wget.la/https://raw.githubusercontent.com/vinkerq/iptv-api/refs/heads/master/iptv.txt" + }, + { + "name": "🐬小新TV", + "type": 0, + "ua": "okhttp/5.3.2", + "url": "https://d.kstore.dev/download/9565/小新TV.txt" + }, + { + "name": "🐬北美长城源", + "type": 0, + "ua": "okhttp", + "url": "https://ha.msbot.dpdns.org/wall.php" + }, + { + "name": "🐬港台", + "type": 0, + "ua": "okhttp", + "url": "https://feer-cdn-bp.xpnb.qzz.io/xnkl.txt" + }, + { + "name": "🐬台湾台", + "type": 0, + "ua": "okhttp", + "url": "https://epg.pw/test_channels_taiwan.m3u" + }, + { + "name": "🐬体育台", + "type": 0, + "ua": "okhttp", + "url": "http://82.156.243.185:33389/fwc.m3u" + }, + { + "name": "🐬国际TV", + "type": 0, + "ua": "okhttp", + "url": "https://raw.githubusercontent.com/xJEYDAin/iptv/main/output/all_merged.m3u" + }, + { + "name": "🐬UnifiTV(马来节点)", + "type": 0, + "ua": "okhttp", + "url": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/unifi.txt" + }, + { + "name": "🐬裤佬TV", + "type": 0, + "ua": "okhttp", + "url": "https://gh-proxy.org/https://raw.githubusercontent.com/Jsnzkpg/Jsnzkpg/Jsnzkpg/Jsnzkpg1.m3u" + }, + { + "name": "🐬Gather", + "type": 0, + "ua": "okhttp", + "url": "https://iptv.yang-1989.eu.org/m3u/Gather.m3u" + }, + { + "name": "🐬Mytv", + "type": 0, + "ua": "okhttp", + "url": "https://cdn.qd.je/live.m3u" + }, + { + "name": "🐬新加坡(梯子)", + "type": 0, + "ua": "okhttp", + "url": "http://xtvantsc.xyz/新加坡.m3u" + }, + { + "name": "🐬黄蚂蚁先锋推流源", + "type": 0, + "ua": "okhttp", + "url": "http://ge.html-5.me//ii/黄蚂蚁先锋推流源.txt" + }, + { + "name": "🐬风云源", + "type": 0, + "ua": "okhttp", + "url": "http://iptv.4666888.xyz/FYTV.txt" + }, + { + "name": "🐬飞扬源", + "type": 0, + "ua": "okhttp", + "url": "https://www.985pan.com/down.php/bf5e9607ff407fcdd71f63928ea5bc79.txt" + }, + { + "name": "🐬港奥台国际", + "type": 0, + "ua": "okhttp", + "url": "http://tv123.vvvv.ee/tv.m3u" + }, + { + "name": "🐬中港台直播源", + "type": 0, + "ua": "okhttp", + "url": "https://t.freetv.fun/m3u/playlist_all.txt" + }, + { + "name": "🐬4GTV(梯子台湾节点)720p", + "type": 0, + "ua": "okhttp", + "url": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/4gtv.txt" + }, + { + "name": "🐬4GTV怡淳酒店(梯子台湾节点)720p", + "type": 0, + "ua": "okhttp", + "url": "http://xtvantsc.xyz/4gtv.txt" + }, + { + "name": "🐬4GTV(梯子任何节点)1080p", + "type": 0, + "ua": "okhttp", + "url": "https://ha.msbot.dpdns.org/4gtv_api.php" + }, + { + "name": "🐬jackTV(梯子)", + "type": 0, + "ua": "okhttp", + "url": "https://php.946985.filegear-sg.me/jackTV.m3u" + } + ], + "ijk": [ + { + "group": "软解码", + "options": [ + { + "category": 4, + "name": "opensles", + "value": "0" + }, + { + "category": 4, + "name": "overlay-format", + "value": "842225234" + }, + { + "category": 4, + "name": "framedrop", + "value": "1" + }, + { + "category": 4, + "name": "soundtouch", + "value": "1" + }, + { + "category": 4, + "name": "start-on-prepared", + "value": "1" + }, + { + "category": 1, + "name": "http-detect-range-support", + "value": "0" + }, + { + "category": 1, + "name": "fflags", + "value": "fastseek" + }, + { + "category": 2, + "name": "skip_loop_filter", + "value": "48" + }, + { + "category": 4, + "name": "reconnect", + "value": "1" + }, + { + "category": 4, + "name": "enable-accurate-seek", + "value": "0" + }, + { + "category": 4, + "name": "mediacodec", + "value": "0" + }, + { + "category": 4, + "name": "mediacodec-auto-rotate", + "value": "0" + }, + { + "category": 4, + "name": "mediacodec-handle-resolution-change", + "value": "0" + }, + { + "category": 4, + "name": "mediacodec-hevc", + "value": "0" + }, + { + "category": 1, + "name": "dns_cache_timeout", + "value": "600000000" + } + ] + }, + { + "group": "硬解码", + "options": [ + { + "category": 4, + "name": "opensles", + "value": "0" + }, + { + "category": 4, + "name": "overlay-format", + "value": "842225234" + }, + { + "category": 4, + "name": "framedrop", + "value": "1" + }, + { + "category": 4, + "name": "soundtouch", + "value": "1" + }, + { + "category": 4, + "name": "start-on-prepared", + "value": "1" + }, + { + "category": 1, + "name": "http-detect-range-support", + "value": "0" + }, + { + "category": 1, + "name": "fflags", + "value": "fastseek" + }, + { + "category": 2, + "name": "skip_loop_filter", + "value": "48" + }, + { + "category": 4, + "name": "reconnect", + "value": "1" + }, + { + "category": 4, + "name": "enable-accurate-seek", + "value": "0" + }, + { + "category": 4, + "name": "mediacodec", + "value": "1" + }, + { + "category": 4, + "name": "mediacodec-auto-rotate", + "value": "1" + }, + { + "category": 4, + "name": "mediacodec-handle-resolution-change", + "value": "1" + }, + { + "category": 4, + "name": "mediacodec-hevc", + "value": "1" + }, + { + "category": 1, + "name": "dns_cache_timeout", + "value": "600000000" + } + ] + } +], +"proxy": [ + "file://TV/proxy.json" + ], + "rules": [ + { + "name": "cl", + "hosts": [ + "magnet" + ], + "regex": [ + "最 新", + "直 播", + "更 新" + ] + }, + { + "name": "火山嗅探", + "hosts": [ + "huoshan.com" + ], + "regex": [ + "item_id=" + ] + }, + { + "name": "抖音嗅探", + "hosts": [ + "douyin.com" + ], + "regex": [ + "is_play_url=" + ] + }, + { + "name": "农民嗅探", + "hosts": [ + "toutiaovod.com" + ], + "regex": [ + "video/tos/cn" + ] + }, + { + "name": "七新嗅探", + "hosts": [ + "api.52wyb.com" + ], + "regex": [ + "m3u8?pt=m3u8" + ] + }, + { + "name": "夜市", + "hosts": [ + "yeslivetv.com" + ], + "script": [ + "document.getElementsByClassName('vjs-big-play-button')[0].click()" + ] + }, + { + "name": "毛驴", + "hosts": [ + "www.maolvys.com" + ], + "script": [ + "document.getElementsByClassName('swal-button swal-button--confirm')[0].click()" + ] + }, + { + "name": "czzy", + "hosts": [ + "10086.cn" + ], + "regex": [ + "/storageWeb/servlet/downloadServlet" + ] + }, + { + "name": "bdys", + "hosts": [ + "bytetos.com", + "byteimg.com", + "bytednsdoc.com", + "pstatp.com" + ], + "regex": [ + "/tos-cn" + ], + "exclude": [ + ".m3u8" + ] + }, + { + "name": "bdys10", + "hosts": [ + "bdys10.com" + ], + "regex": [ + "/obj/" + ], + "exclude": [ + ".m3u8" + ] + } + ] +} diff --git a/FGBLH/鱼壳海豚.json b/FGBLH/鱼壳海豚.json index 65e5a66d..9074b9da 100644 --- a/FGBLH/鱼壳海豚.json +++ b/FGBLH/鱼壳海豚.json @@ -608,6 +608,12 @@ "type": 3, "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/91吃瓜中心.py" }, + { + "key": "mrds", + "name": "🐬每日大赛.py|🔞[成人]", + "type": 3, + "api": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/py/每日大赛.py" + }, { "key": "xmzb", "name": "🐬熊猫视频.py|🔞[成人]", diff --git a/cpu_iy/天神IY.json b/cpu_iy/天神IY.json index 8e4f0b9e..da5a3cfe 100644 Binary files a/cpu_iy/天神IY.json and b/cpu_iy/天神IY.json differ diff --git a/cpu_iy3/lib/XBPQ.png b/cpu_iy3/lib/XBPQ.png index 482eea01..194e701e 100644 Binary files a/cpu_iy3/lib/XBPQ.png and b/cpu_iy3/lib/XBPQ.png differ diff --git a/cpu_iy3/lib/bddj.js b/cpu_iy3/lib/bddj.js new file mode 100644 index 00000000..0a56d801 --- /dev/null +++ b/cpu_iy3/lib/bddj.js @@ -0,0 +1,436 @@ +/* +@header({ + searchable: 1, + filterable: 0, + quickSearch: 1, + title: '百度短剧', + lang: 'cat' +}) +*/ +import { Crypto as CryptoJS } from 'assets://js/lib/cat.js'; + +let key = '百度短剧'; +let siteName = ''; +let siteKey = ''; +let siteType = 0; +let shuaCache = []; + +let UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36"; +let clarity_order = {'蓝光': 1, '超清': 2, '标清': 3}; + +// ==================== URL配置集中管理 ==================== +let rule = { + host: 'https://mbd.baidu.com', + detailHost: 'https://sv.baidu.com', + listUrl: '/feedapi/v1/videoserver/playlets/list?service=bdbox', + searchUrl: '/feedapi/v1/videoserver/playlets/search?service=bdbox', + detailUrl: '/haokan/ui-video/playlet/rec/detail?log=vhk&tn=1020970b&ctn=1008350n&blur=1', + playUrl: '/appui/api?cmd=video/relate&log=vhk&tn=1020970b&ctn=1008350n&blur=1', +}; + +function init(cfg) { + siteName = (cfg.skey?.split('_')[1] || cfg.skey) || (cfg.key?.split('_')[1] || cfg.key) || '未知'; + siteKey = cfg.skey; + siteType = cfg.stype; +} + +function home(filter) { + let he = ["全部", "新剧", "限时免费", "精选", "独播"]; + let ticailist = [ + "神医", "连续剧", "都市", "现代言情", "异能", "逆袭", "甜宠", "总裁", "萌宝", "战神", "宫斗宅斗", "神豪", + "虐恋", "闪婚", "玄幻", "穿越重生", "年代", "家庭伦理", "古代言情", "武侠武打", "赘婿", "单元剧", "青春校园", + "历史架空", "王妃", "鉴宝", "科幻", "军旅战争", "种田" + ]; + + let classes = he.map(name => ({ + type_id: name, + type_name: name + })); + + classes = classes.concat(ticailist.map(name => ({ + type_id: name === "全部" ? "全部题材" : name, + type_name: name + }))); + + return JSON.stringify({ + class: classes, + filters: {} + }); +} + +async function homeVod() { + const categoryResult = await category('新剧', 1, {}, {}); + const categoryList = JSON.parse(categoryResult).list; + + return JSON.stringify({ + list: [ + { + vod_id: 'shua', + vod_name: '发现精彩', + vod_pic: 'https://t8.baidu.com/it/u=615012979,225344800&fm=193' + }, + ...categoryList + ] + }); +} + +/** + * 合并请求函数 - 统一处理 data 和 body,支持 form-urlencoded 和 JSON + */ +async function request(url, options = {}) { + try { + console.log(`【${siteName}】${options.method || 'GET'} ${url.split('?')[0]}`); + + // 准备基础配置 + let requestConfig = { + method: options.method || 'GET', + headers: { "User-Agent": UA, ...options.headers } + }; + + // 获取内容类型 + let contentType = requestConfig.headers['Content-Type'] || ''; + + // 辅助函数:将对象转换为字符串 + function stringifyData(data, format) { + if (format.includes('json')) { + return JSON.stringify(data); + } else { + // 默认 form-urlencoded + const parts = []; + for (let key in data) { + let value = data[key]; + if (typeof value === 'object' && value !== null) { + value = JSON.stringify(value); + } + parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); + } + return parts.join('&'); + } + } + + // 处理数据 - 无论 data 还是 body,统一处理 + let requestData = options.data || options.body; + + if (requestData) { + if (typeof requestData === 'string') { + // 已经是字符串,直接使用 + requestConfig.body = requestData; + } else if (typeof requestData === 'object') { + // 对象,根据内容类型转换 + if (!contentType) { + // 没有指定内容类型,默认 form-urlencoded + contentType = 'application/x-www-form-urlencoded'; + requestConfig.headers['Content-Type'] = contentType; + } + requestConfig.body = stringifyData(requestData, contentType); + } + } + + const res = await req(url, requestConfig); + return res.content || ''; + } catch (e) { + console.log(`【${siteName}】请求失败: ${e.message}`); + return ''; + } +} + +async function category(tid, pg, filter, extend) { + pg = pg <= 0 ? 1 : pg; + let sub = ["新剧", "限时免费", "精选", "独播"].includes(tid) ? tid : "新剧"; + let tcsub = tid === "全部" || tid === "全部题材" ? "" : tid; + + let t = Math.floor(Date.now() / 1000); + let version = await md5(t + "v2"); + + // 直接传对象 + let postData = { + 'data': { + "data": { + "extRequest": { "flow_tabid": "13" }, + "from": "feed", + "page": "channel_video_landing", + "pd": "feed", + "refreshIndex": pg, + "cursor": "", + "theme": "", + "timestamp": t, + "version": version, + "themes": [ + { "kind": "综合", "names": [sub] }, + { "kind": "题材", "names": [tcsub] } + ] + } + } + }; + + let html = await request(`${rule.host}${rule.listUrl}`, { + method: 'POST', + headers: { + "Connection": "Keep-Alive", + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: postData // 可以用 data + }); + + let res = JSON.parse(html); + let items = res.data.items; + + let videos = items.map(it => ({ + vod_id: it.collId, + vod_name: it.title, + vod_pic: it.img, + vod_remarks: it.updateStatus, + vod_content: it.description + })); + + return JSON.stringify({ + page: pg, + pagecount: pg + 1, + limit: 20, + total: items.length * (pg + 1), + list: videos + }); +} + +async function detail(id) { + if (id === 'shua') { + return JSON.stringify({ + list: [{ + vod_id: 'shua', + vod_name: '发现精彩', + vod_pic: 'https://t8.baidu.com/it/u=615012979,225344800&fm=193', + vod_play_from: '百度短剧', + vod_play_url: '刷刷看$shua', + vod_tag: '[SHUA][JUMP][V]' + }] + }); + } + + // 也可以用 body + let html = await request(`${rule.detailHost}${rule.detailUrl}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: { // body 传对象也会自动处理 + playlet_id: id, + vid: "undefined" + } + }); + + let res = JSON.parse(html); + let dthtml = res.data; + let vids = dthtml.vid_list; + let playArr = vids.map((vid, index) => `第${index + 1}集$${vid}`); + + const vod = { + vod_id: id, + vod_name: dthtml.playlet_title, + vod_pic: dthtml.playlet_poster, + vod_content: dthtml.description, + vod_remarks: `共${vids.length}集 热度值:${dthtml.hot_value} 集数:${dthtml.episodes_num}`, + vod_director: dthtml.tag_text, + vod_year: dthtml.create_time, + vod_play_from: "百度短剧", + vod_play_url: playArr.join('#') + }; + + return JSON.stringify({ list: [vod] }); +} + +async function play(flag, id, flags) { + if (id == 'shua') { + if (shuaCache.length == 0) { + const randomPage = getRnd(1, 20); + const categories = ["新剧", "限时免费", "精选", "独播"]; + const randomCate = categories[Math.floor(Math.random() * categories.length)]; + + const categoryResult = await category(randomCate, randomPage, {}, {}); + const res = JSON.parse(categoryResult); + const videos = []; + + for (const it of res.list.slice(0, 10)) { + const detailResult = await detail(it.vod_id); + const detailObj = JSON.parse(detailResult); + const vod = detailObj.list[0]; + + const match = vod.vod_remarks.match(/(\d+)/); + const episodeCount = match[1]; + + videos.push({ + parse: 0, + url: it.vod_id, + shuaTitle: vod.vod_name, + shuaDes: '共' + episodeCount + '集 | ' + vod.vod_content.replace(/\s/g, ''), + shuaActions: { play: it.vod_id }, + errorPlayNext: true + }); + } + shuaCache.push(...videos); + } + + const cache = shuaCache.shift(); + const detailResult = await detail(cache.url); + const detailObj = JSON.parse(detailResult); + const vod = detailObj.list[0]; + + const playUrls = vod.vod_play_url.split('#'); + const firstEpisode = playUrls[0]; + const vid = firstEpisode.split('$')[1]; + + const playHtml = await request(`${rule.detailHost}${rule.playUrl}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: { // 用 data 或 body 都可以 + method: "post", + vid: vid + } + }); + + const playRes = JSON.parse(playHtml); + const playJson = playRes["video/relate"].data.cur_video; + const urls = []; + + for (const item of playJson.clarityUrl) { + urls.push({ + title: item.title, + url: item.url, + order: clarity_order[item.title] || 999 + }); + } + urls.sort(function (a, b) { return a.order - b.order; }); + cache.url = urls[0].url; + + return JSON.stringify(cache); + } + + const html = await request(`${rule.detailHost}${rule.playUrl}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: { // body 传对象 + method: "post", + vid: id + } + }); + + const res = JSON.parse(html); + const json = res["video/relate"].data.cur_video; + const urls = []; + + for (const item of json.clarityUrl) { + urls.push({ + title: item.title, + url: item.url, + order: clarity_order[item.title] || 999 + }); + } + urls.sort(function (a, b) { return a.order - b.order; }); + + const flat = []; + for (const item of urls) { + flat.push(item.title); + flat.push(item.url); + } + + return JSON.stringify({ + parse: 0, + url: flat, + header: { + 'User-Agent': UA, + 'Referer': rule.host + } + }); +} + +async function search(wd, quick, pg) { + pg = pg <= 0 ? 1 : pg; + + let postData = { + 'data': { + "data": { + "query": wd, + "page": pg, + "attribute": ["title"], + "fe_page_type": "search", + "extra": { + "tab_id": "216", + "flow_tabid": "13", + "shortplay_source": "feed", + "from": "feed", + "tab_type": "搜索", + "sub_template": "playlet_search_result" + } + } + } + }; + + let html = await request(`${rule.host}${rule.searchUrl}`, { + method: 'POST', + headers: { + "Connection": "Keep-Alive", + "Accept-Encoding": "gzip", + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: postData // 用 data + }); + + let res = JSON.parse(html); + let items = res.data.itemList; + + let videos = items.map(it => ({ + vod_id: it.nid.split("_")[1], + vod_name: it.title, + vod_pic: it.img, + vod_remarks: it.collNum + '集', + vod_content: it.description + })); + + return JSON.stringify({ + page: pg, + pagecount: pg + 1, + limit: 20, + total: items.length * (pg + 1), + list: videos + }); +} + +function getRnd(min, max, hexNum, isUpper) { + var r = parseInt(Math.random() * (max - min + 1) + min, 10); + if (hexNum) { + r = isUpper ? r.toString(hexNum).toUpperCase() : r.toString(hexNum); + } + return r; +} + +async function md5(str) { + return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex).toLowerCase(); +} + +async function action(action, value) { + if (action === 'shuaPlay') { + return JSON.stringify({ + action: { + actionId: '__detail__', + ids: value, + keep: true + } + }); + } +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search, + action: action + }; +} \ No newline at end of file diff --git a/cpu_iy3/lib/ds.png b/cpu_iy3/lib/ds.png index 79e9affa..81d13959 100644 --- a/cpu_iy3/lib/ds.png +++ b/cpu_iy3/lib/ds.png @@ -66,1211 +66,6 @@ CCTV 怀旧剧场频道,http://43.226.38.166:89/dglive/ysp.php?id=cctvhjjc - - -央卫频道2,#genre# -CCTV1,http://emby.xlangnan.cn:10316/rtp/239.254.200.45:8008 -CCTV1,http://wangfei.uno:9999/rtp/225.1.2.47:10276 -CCTV1,http://hiliu.myds.me:18088/rtp/239.254.96.96:8550 -CCTV1,http://b.xiongnas.top:8888/rtp/239.3.1.129:8008 -CCTV1,http://www.sclvip.top:5566/rtp/239.49.8.19:9614 -CCTV1,http://youngx.top:4022/rtp/233.18.204.52:5140 -CCTV1,http://home.scanflove.com:7788/rtp/235.254.198.51:1480 -CCTV1,http://www.maomizi.cn:9530/rtp/239.77.0.86:5146 -CCTV1,http://z.d4p.cn:8000/rtp/239.49.8.19:9614 -CCTV1,http://liuwenxiaokevin.top:14044/rtp/233.18.204.52:5140 -CCTV1,http://hongzhijiaoyu.net:8188/rtp/239.77.0.86:5146 -CCTV1,http://www.negative.top:50000/rtp/233.50.201.118:5140 -CCTV1,http://nas.lyfkai.cn:19999/rtp/239.254.96.96:8550 -CCTV1,http://pr.19760929.xyz:9688/rtp/239.77.0.86:5146 -CCTV1,http://www.wjyu.top:4022/rtp/233.18.204.52:5140 -CCTV1,http://vp.maomizi.cc:9530/rtp/239.77.0.86:5146 -CCTV1,http://ds3622.guangyuan.site:8188/rtp/239.77.0.86:5146 -CCTV1,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.86:5146 -CCTV1,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.47:10276 -CCTV1,http://marcvision.xyz:8000/rtp/238.1.78.166:7200 -CCTV1,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.86:5146 -CCTV1,http://www.syy3.top:3861/rtp/239.77.0.86:5146 -CCTV1,http://alist.guangyuan.site:8188/rtp/239.77.0.86:5146 -CCTV1,http://www.marcvision.xyz:8000/rtp/238.1.78.166:7200 -CCTV1,http://esxi.juzhijian.com:8822/rtp/239.16.20.1:10010 -CCTV1,http://0000505.xyz:8888/rtp/239.76.253.151:9000 -CCTV1,http://sdray.gicp.net:8822/rtp/239.16.20.1:10010 -CCTV1,http://nas.yzzdxc.cn:16666/rtp/239.37.0.254:5540 -CCTV1,http://www.yyf1991.top:9999/rtp/233.18.204.52:5140 -CCTV1,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.96:8550 -CCTV1,http://server.juzhijian.com:8822/rtp/239.16.20.1:10010 -CCTV1,http://zhangkx717.cn:9999/rtp/239.254.96.96:8550 -CCTV1,http://a.xiongnas.top:8888/rtp/239.3.1.129:8008 -CCTV1,http://nas.iszbd.com:4022/rtp/225.0.4.74:7980 -CCTV1,http://www.rongrong.me:14022/rtp/233.18.204.52:5140 -CCTV1,http://wmh.wmh.ink:6633/rtp/239.77.0.86:5146 -CCTV1,http://x1x.bid:5146/rtp/239.3.1.129:8008 -CCTV1,http://iptv.xxika.net:8188/rtp/239.77.0.86:5146 -CCTV2,http://emby.xlangnan.cn:10316/rtp/239.254.200.158:6000 -CCTV2,http://wangfei.uno:9999/rtp/225.1.2.78:10462 -CCTV2,http://hiliu.myds.me:18088/rtp/239.69.1.102:10250 -CCTV2,http://b.xiongnas.top:8888/rtp/239.3.1.60:8084 -CCTV2,http://www.sclvip.top:5566/rtp/239.49.8.50:9802 -CCTV2,http://youngx.top:4022/rtp/233.18.204.68:5140 -CCTV2,http://home.scanflove.com:7788/rtp/235.254.198.52:1484 -CCTV2,http://liuwenxiaokevin.top:14044/rtp/233.18.204.68:5140 -CCTV2,http://hongzhijiaoyu.net:8188/rtp/239.77.0.137:5146 -CCTV2,http://www.negative.top:50000/rtp/233.50.201.119:5140 -CCTV2,http://nas.lyfkai.cn:19999/rtp/239.69.1.102:10250 -CCTV2,http://pr.19760929.xyz:9688/rtp/239.77.0.137:5146 -CCTV2,http://www.wjyu.top:4022/rtp/233.18.204.68:5140 -CCTV2,http://ds3622.guangyuan.site:8188/rtp/239.77.0.137:5146 -CCTV2,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.137:5146 -CCTV2,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.78:10462 -CCTV2,http://marcvision.xyz:8000/rtp/238.1.78.235:7752 -CCTV2,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.137:5146 -CCTV2,http://www.syy3.top:3861/rtp/239.77.0.137:5146 -CCTV2,http://alist.guangyuan.site:8188/rtp/239.77.0.137:5146 -CCTV2,http://www.marcvision.xyz:8000/rtp/238.1.78.235:7752 -CCTV2,http://esxi.juzhijian.com:8822/rtp/239.16.20.2:10020 -CCTV2,http://0000505.xyz:8888/rtp/239.76.253.152:9000 -CCTV2,http://0000505.xyz:8888/rtp/239.76.246.152:1234 -CCTV2,http://sdray.gicp.net:8822/rtp/239.16.20.2:10020 -CCTV2,http://nas.yzzdxc.cn:16666/rtp/239.37.0.003:5540 -CCTV2,http://www.yyf1991.top:9999/rtp/233.18.204.68:5140 -CCTV2,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.102:10250 -CCTV2,http://server.juzhijian.com:8822/rtp/239.16.20.2:10020 -CCTV2,http://zhangkx717.cn:9999/rtp/239.69.1.102:10250 -CCTV2,http://a.xiongnas.top:8888/rtp/239.3.1.60:8084 -CCTV2,http://nas.iszbd.com:4022/rtp/225.0.4.132:7980 -CCTV2,http://www.rongrong.me:14022/rtp/233.18.204.68:5140 -CCTV2,http://wmh.wmh.ink:6633/rtp/239.77.0.137:5146 -CCTV3,http://emby.xlangnan.cn:10316/rtp/239.254.201.152:7205 -CCTV3,http://wangfei.uno:9999/rtp/225.1.2.141:10864 -CCTV3,http://hiliu.myds.me:18088/rtp/239.69.1.122:10370 -CCTV3,http://b.xiongnas.top:8888/rtp/239.3.1.172:8001 -CCTV3,http://www.sclvip.top:5566/rtp/239.49.8.74:8000 -CCTV3,http://youngx.top:4022/rtp/233.18.204.69:5140 -CCTV3,http://home.scanflove.com:7788/rtp/235.254.198.53:1488 -CCTV3,http://www.maomizi.cn:9530/rtp/239.77.0.169:5146 -CCTV3,http://z.d4p.cn:8000/rtp/239.49.8.74:8000 -CCTV3,http://liuwenxiaokevin.top:14044/rtp/233.18.204.69:5140 -CCTV3,http://hongzhijiaoyu.net:8188/rtp/239.77.0.169:5146 -CCTV3,http://www.negative.top:50000/rtp/233.50.201.196:5140 -CCTV3,http://nas.lyfkai.cn:19999/rtp/239.69.1.122:10370 -CCTV3,http://pr.19760929.xyz:9688/rtp/239.77.0.169:5146 -CCTV3,http://www.wjyu.top:4022/rtp/233.18.204.69:5140 -CCTV3,http://vp.maomizi.cc:9530/rtp/239.77.0.169:5146 -CCTV3,http://ds3622.guangyuan.site:8188/rtp/239.77.0.169:5146 -CCTV3,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.169:5146 -CCTV3,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.141:10864 -CCTV3,http://marcvision.xyz:8000/rtp/238.1.78.170:7232 -CCTV3,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.169:5146 -CCTV3,http://www.syy3.top:3861/rtp/239.77.0.169:5146 -CCTV3,http://alist.guangyuan.site:8188/rtp/239.77.0.169:5146 -CCTV3,http://www.marcvision.xyz:8000/rtp/238.1.78.170:7232 -CCTV3,http://esxi.juzhijian.com:8822/rtp/239.16.20.3:10030 -CCTV3,http://0000505.xyz:8888/rtp/239.76.253.153:9000 -CCTV3,http://0000505.xyz:8888/rtp/239.76.246.153:1234 -CCTV3,http://sdray.gicp.net:8822/rtp/239.16.20.3:10030 -CCTV3,http://nas.yzzdxc.cn:16666/rtp/239.37.0.231:5540 -CCTV3,http://www.yyf1991.top:9999/rtp/233.18.204.69:5140 -CCTV3,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.122:10370 -CCTV3,http://server.juzhijian.com:8822/rtp/239.16.20.3:10030 -CCTV3,http://zhangkx717.cn:9999/rtp/239.69.1.122:10370 -CCTV3,http://a.xiongnas.top:8888/rtp/239.3.1.172:8001 -CCTV3,http://www.rongrong.me:14022/rtp/233.18.204.69:5140 -CCTV3,http://wmh.wmh.ink:6633/rtp/239.77.0.169:5146 -CCTV4,http://emby.xlangnan.cn:10316/rtp/239.254.200.190:6307 -CCTV4,http://wangfei.uno:9999/rtp/225.1.2.197:11806 -CCTV4,http://hiliu.myds.me:18088/rtp/239.69.1.138:10466 -CCTV4,http://b.xiongnas.top:8888/rtp/239.3.1.105:8092 -CCTV4,http://www.sclvip.top:5566/rtp/239.49.8.51:9806 -CCTV4,http://youngx.top:4022/rtp/233.18.204.70:5140 -CCTV4,http://home.scanflove.com:7788/rtp/235.254.198.183:7980 -CCTV4,http://www.maomizi.cn:9530/rtp/239.77.0.78:5146 -CCTV4,http://liuwenxiaokevin.top:14044/rtp/233.18.204.70:5140 -CCTV4,http://hongzhijiaoyu.net:8188/rtp/239.77.0.78:5146 -CCTV4,http://www.negative.top:50000/rtp/233.50.200.101:5140 -CCTV4,http://nas.lyfkai.cn:19999/rtp/239.69.1.138:10466 -CCTV4,http://pr.19760929.xyz:9688/rtp/239.77.0.78:5146 -CCTV4,http://www.wjyu.top:4022/rtp/233.18.204.70:5140 -CCTV4,http://vp.maomizi.cc:9530/rtp/239.77.0.78:5146 -CCTV4,http://ds3622.guangyuan.site:8188/rtp/239.77.0.78:5146 -CCTV4,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.78:5146 -CCTV4,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.197:11806 -CCTV4,http://marcvision.xyz:8000/rtp/238.1.78.236:7760 -CCTV4,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.78:5146 -CCTV4,http://www.syy3.top:3861/rtp/239.77.0.78:5146 -CCTV4,http://alist.guangyuan.site:8188/rtp/239.77.0.78:5146 -CCTV4,http://www.marcvision.xyz:8000/rtp/238.1.78.236:7760 -CCTV4,http://esxi.juzhijian.com:8822/rtp/239.16.20.4:10040 -CCTV4,http://0000505.xyz:8888/rtp/239.76.245.195:1234 -CCTV4,http://0000505.xyz:8888/rtp/239.76.246.154:1234 -CCTV4,http://sdray.gicp.net:8822/rtp/239.16.20.4:10040 -CCTV4,http://www.yyf1991.top:9999/rtp/233.18.204.70:5140 -CCTV4,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.138:10466 -CCTV4,http://server.juzhijian.com:8822/rtp/239.16.20.4:10040 -CCTV4,http://zhangkx717.cn:9999/rtp/239.69.1.138:10466 -CCTV4,http://a.xiongnas.top:8888/rtp/239.3.1.105:8092 -CCTV4,http://nas.iszbd.com:4022/rtp/225.0.4.176:7980 -CCTV5,http://emby.xlangnan.cn:10316/rtp/239.254.201.153:7206 -CCTV5,http://wangfei.uno:9999/rtp/225.1.2.48:10282 -CCTV5,http://hiliu.myds.me:18088/rtp/239.69.1.123:10376 -CCTV5,http://b.xiongnas.top:8888/rtp/239.3.1.173:8001 -CCTV5,http://www.sclvip.top:5566/rtp/239.49.8.75:8000 -CCTV5,http://youngx.top:4022/rtp/233.18.204.71:5140 -CCTV5,http://home.scanflove.com:7788/rtp/235.254.198.54:1492 -CCTV5,http://www.maomizi.cn:9530/rtp/239.77.0.170:5146 -CCTV5,http://liuwenxiaokevin.top:14044/rtp/233.18.204.71:5140 -CCTV5,http://hongzhijiaoyu.net:8188/rtp/239.77.0.170:5146 -CCTV5,http://www.negative.top:50000/rtp/233.50.200.108:5140 -CCTV5,http://www.negative.top:50000/rtp/233.50.201.194:5140 -CCTV5,http://nas.lyfkai.cn:19999/rtp/239.69.1.123:10376 -CCTV5,http://pr.19760929.xyz:9688/rtp/239.77.0.170:5146 -CCTV5,http://www.wjyu.top:4022/rtp/233.18.204.71:5140 -CCTV5,http://vp.maomizi.cc:9530/rtp/239.77.0.170:5146 -CCTV5,http://ds3622.guangyuan.site:8188/rtp/239.77.0.170:5146 -CCTV5,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.170:5146 -CCTV5,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.48:10282 -CCTV5,http://marcvision.xyz:8000/rtp/238.1.78.171:7240 -CCTV5,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.170:5146 -CCTV5,http://www.syy3.top:3861/rtp/239.77.0.170:5146 -CCTV5,http://alist.guangyuan.site:8188/rtp/239.77.0.170:5146 -CCTV5,http://www.marcvision.xyz:8000/rtp/238.1.78.171:7240 -CCTV5,http://esxi.juzhijian.com:8822/rtp/239.16.20.53:10530 -CCTV5,http://0000505.xyz:8888/rtp/239.76.253.155:9000 -CCTV5,http://0000505.xyz:8888/rtp/239.76.246.155:1234 -CCTV5,http://sdray.gicp.net:8822/rtp/239.16.20.53:10530 -CCTV5,http://nas.yzzdxc.cn:16666/rtp/239.37.0.232:5540 -CCTV5,http://www.yyf1991.top:9999/rtp/233.18.204.71:5140 -CCTV5,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.123:10376 -CCTV5,http://server.juzhijian.com:8822/rtp/239.16.20.53:10530 -CCTV5,http://zhangkx717.cn:9999/rtp/239.69.1.123:10376 -CCTV5,http://a.xiongnas.top:8888/rtp/239.3.1.173:8001 -CCTV5+,http://emby.xlangnan.cn:10316/rtp/239.254.200.46:8004 -CCTV5+,http://hiliu.myds.me:18088/rtp/239.254.96.234:9484 -CCTV5+,http://b.xiongnas.top:8888/rtp/239.3.1.130:8004 -CCTV5+,http://www.sclvip.top:5566/rtp/239.49.8.18:9610 -CCTV5+,http://youngx.top:4022/rtp/233.18.204.67:5140 -CCTV5+,http://home.scanflove.com:7788/rtp/235.254.198.122:1764 -CCTV5+,http://www.maomizi.cn:9530/rtp/239.77.0.87:5146 -CCTV5+,http://liuwenxiaokevin.top:14044/rtp/233.18.204.67:5140 -CCTV5+,http://hongzhijiaoyu.net:8188/rtp/239.77.0.87:5146 -CCTV5+,http://www.negative.top:50000/rtp/233.50.201.220:5140 -CCTV5+,http://nas.lyfkai.cn:19999/rtp/239.254.96.234:9484 -CCTV5+,http://pr.19760929.xyz:9688/rtp/239.77.0.87:5146 -CCTV5+,http://www.wjyu.top:4022/rtp/233.18.204.67:5140 -CCTV5+,http://vp.maomizi.cc:9530/rtp/239.77.0.87:5146 -CCTV5+,http://ds3622.guangyuan.site:8188/rtp/239.77.0.87:5146 -CCTV5+,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.87:5146 -CCTV5+,http://marcvision.xyz:8000/rtp/238.1.78.237:7768 -CCTV5+,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.87:5146 -CCTV5+,http://www.syy3.top:3861/rtp/239.77.0.87:5146 -CCTV5+,http://alist.guangyuan.site:8188/rtp/239.77.0.87:5146 -CCTV5+,http://www.marcvision.xyz:8000/rtp/238.1.78.237:7768 -CCTV5+,http://esxi.juzhijian.com:8822/rtp/239.16.20.5:10050 -CCTV5+,http://0000505.xyz:8888/rtp/239.76.246.168:1234 -CCTV5+,http://0000505.xyz:8888/rtp/239.76.254.215:9000 -CCTV5+,http://sdray.gicp.net:8822/rtp/239.16.20.5:10050 -CCTV5+,http://nas.yzzdxc.cn:16666/rtp/239.37.0.121:5540 -CCTV5+,http://www.yyf1991.top:9999/rtp/233.18.204.67:5140 -CCTV5+,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.234:9484 -CCTV5+,http://server.juzhijian.com:8822/rtp/239.16.20.5:10050 -CCTV5+,http://zhangkx717.cn:9999/rtp/239.254.96.234:9484 -CCTV5+,http://a.xiongnas.top:8888/rtp/239.3.1.130:8004 -CCTV5+,http://nas.iszbd.com:4022/rtp/225.0.4.73:7980 -CCTV5+,http://www.rongrong.me:14022/rtp/233.18.204.67:5140 -CCTV5+,http://wmh.wmh.ink:6633/rtp/239.77.0.87:5146 -CCTV5+,http://iptv.xxika.net:8188/rtp/239.77.0.87:5146 -CCTV5+,http://www.taoli.website:23234/rtp/239.3.1.130:8004 -CCTV5+,http://yanshifen.top:8889/rtp/239.77.0.87:5146 -CCTV6,http://emby.xlangnan.cn:10316/rtp/239.254.201.154:7207 -CCTV6,http://wangfei.uno:9999/rtp/225.1.2.143:10876 -CCTV6,http://hiliu.myds.me:18088/rtp/239.69.1.124:10382 -CCTV6,http://b.xiongnas.top:8888/rtp/239.3.1.174:8001 -CCTV6,http://www.sclvip.top:5566/rtp/239.49.8.76:8000 -CCTV6,http://youngx.top:4022/rtp/233.18.204.72:5140 -CCTV6,http://home.scanflove.com:7788/rtp/235.254.198.55:1496 -CCTV6,http://www.maomizi.cn:9530/rtp/239.77.0.171:5146 -CCTV6,http://liuwenxiaokevin.top:14044/rtp/233.18.204.72:5140 -CCTV6,http://hongzhijiaoyu.net:8188/rtp/239.77.0.171:5146 -CCTV6,http://www.negative.top:50000/rtp/233.50.200.109:5140 -CCTV6,http://nas.lyfkai.cn:19999/rtp/239.69.1.124:10382 -CCTV6,http://pr.19760929.xyz:9688/rtp/239.77.0.171:5146 -CCTV6,http://www.wjyu.top:4022/rtp/233.18.204.72:5140 -CCTV6,http://vp.maomizi.cc:9530/rtp/239.77.0.171:5146 -CCTV6,http://ds3622.guangyuan.site:8188/rtp/239.77.0.171:5146 -CCTV6,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.171:5146 -CCTV6,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.143:10876 -CCTV6,http://marcvision.xyz:8000/rtp/238.1.78.172:7248 -CCTV6,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.171:5146 -CCTV6,http://www.syy3.top:3861/rtp/239.77.0.171:5146 -CCTV6,http://alist.guangyuan.site:8188/rtp/239.77.0.171:5146 -CCTV6,http://www.marcvision.xyz:8000/rtp/238.1.78.172:7248 -CCTV6,http://esxi.juzhijian.com:8822/rtp/239.16.20.6:10060 -CCTV6,http://0000505.xyz:8888/rtp/239.76.253.156:9000 -CCTV6,http://sdray.gicp.net:8822/rtp/239.16.20.6:10060 -CCTV6,http://nas.yzzdxc.cn:16666/rtp/239.37.0.233:5540 -CCTV6,http://www.yyf1991.top:9999/rtp/233.18.204.72:5140 -CCTV6,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.124:10382 -CCTV6,http://server.juzhijian.com:8822/rtp/239.16.20.6:10060 -CCTV6,http://zhangkx717.cn:9999/rtp/239.69.1.124:10382 -CCTV6,http://a.xiongnas.top:8888/rtp/239.3.1.174:8001 -CCTV6,http://nas.iszbd.com:4022/rtp/225.0.4.144:7980 -CCTV6,http://www.rongrong.me:14022/rtp/233.18.204.72:5140 -CCTV6,http://wmh.wmh.ink:6633/rtp/239.77.0.171:5146 -CCTV7,http://emby.xlangnan.cn:10316/rtp/239.254.200.159:6000 -CCTV7,http://wangfei.uno:9999/rtp/225.1.2.79:10468 -CCTV7,http://hiliu.myds.me:18088/rtp/239.69.1.103:10256 -CCTV7,http://b.xiongnas.top:8888/rtp/239.3.1.61:8104 -CCTV7,http://www.sclvip.top:5566/rtp/239.49.0.126:8000 -CCTV7,http://youngx.top:4022/rtp/233.18.204.73:5140 -CCTV7,http://home.scanflove.com:7788/rtp/235.254.198.56:1500 -CCTV7,http://www.maomizi.cn:9530/rtp/239.77.0.138:5146 -CCTV7,http://z.d4p.cn:8000/rtp/239.49.0.126:8000 -CCTV7,http://liuwenxiaokevin.top:14044/rtp/233.18.204.73:5140 -CCTV7,http://hongzhijiaoyu.net:8188/rtp/239.77.0.138:5146 -CCTV7,http://www.negative.top:50000/rtp/233.50.200.102:5140 -CCTV7,http://nas.lyfkai.cn:19999/rtp/239.69.1.103:10256 -CCTV7,http://pr.19760929.xyz:9688/rtp/239.77.0.138:5146 -CCTV7,http://www.wjyu.top:4022/rtp/233.18.204.73:5140 -CCTV7,http://vp.maomizi.cc:9530/rtp/239.77.0.138:5146 -CCTV7,http://ds3622.guangyuan.site:8188/rtp/239.77.0.138:5146 -CCTV7,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.138:5146 -CCTV7,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.79:10468 -CCTV7,http://marcvision.xyz:8000/rtp/238.1.78.239:7784 -CCTV7,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.138:5146 -CCTV7,http://www.syy3.top:3861/rtp/239.77.0.138:5146 -CCTV7,http://alist.guangyuan.site:8188/rtp/239.77.0.138:5146 -CCTV7,http://www.marcvision.xyz:8000/rtp/238.1.78.239:7784 -CCTV7,http://esxi.juzhijian.com:8822/rtp/239.16.20.51:10510 -CCTV7,http://0000505.xyz:8888/rtp/239.76.253.157:9000 -CCTV7,http://0000505.xyz:8888/rtp/239.76.246.157:1234 -CCTV7,http://sdray.gicp.net:8822/rtp/239.16.20.51:10510 -CCTV7,http://www.yyf1991.top:9999/rtp/233.18.204.73:5140 -CCTV7,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.103:10256 -CCTV7,http://server.juzhijian.com:8822/rtp/239.16.20.51:10510 -CCTV7,http://zhangkx717.cn:9999/rtp/239.69.1.103:10256 -CCTV7,http://a.xiongnas.top:8888/rtp/239.3.1.61:8104 -CCTV7,http://nas.iszbd.com:4022/rtp/225.0.4.127:7980 -CCTV7,http://www.rongrong.me:14022/rtp/233.18.204.73:5140 -CCTV7,http://wmh.wmh.ink:6633/rtp/239.77.0.138:5146 -CCTV7,http://x1x.bid:5146/rtp/239.3.1.61:8104 -CCTV7,http://iptv.xxika.net:8188/rtp/239.77.0.138:5146 -CCTV8,http://emby.xlangnan.cn:10316/rtp/239.254.201.155:7208 -CCTV8,http://wangfei.uno:9999/rtp/225.1.2.144:10882 -CCTV8,http://hiliu.myds.me:18088/rtp/239.69.1.125:10388 -CCTV8,http://b.xiongnas.top:8888/rtp/239.3.1.175:8001 -CCTV8,http://www.sclvip.top:5566/rtp/239.49.8.77:8000 -CCTV8,http://youngx.top:4022/rtp/233.18.204.74:5140 -CCTV8,http://home.scanflove.com:7788/rtp/235.254.198.57:1504 -CCTV8,http://www.maomizi.cn:9530/rtp/239.77.0.172:5146 -CCTV8,http://z.d4p.cn:8000/rtp/239.49.8.77:8000 -CCTV8,http://liuwenxiaokevin.top:14044/rtp/233.18.204.74:5140 -CCTV8,http://hongzhijiaoyu.net:8188/rtp/239.77.0.172:5146 -CCTV8,http://nas.lyfkai.cn:19999/rtp/239.69.1.125:10388 -CCTV8,http://pr.19760929.xyz:9688/rtp/239.77.0.172:5146 -CCTV8,http://www.wjyu.top:4022/rtp/233.18.204.74:5140 -CCTV8,http://vp.maomizi.cc:9530/rtp/239.77.0.172:5146 -CCTV8,http://ds3622.guangyuan.site:8188/rtp/239.77.0.172:5146 -CCTV8,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.172:5146 -CCTV8,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.144:10882 -CCTV8,http://marcvision.xyz:8000/rtp/238.1.78.173:7256 -CCTV8,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.172:5146 -CCTV8,http://www.syy3.top:3861/rtp/239.77.0.172:5146 -CCTV8,http://alist.guangyuan.site:8188/rtp/239.77.0.172:5146 -CCTV8,http://www.marcvision.xyz:8000/rtp/238.1.78.173:7256 -CCTV8,http://esxi.juzhijian.com:8822/rtp/239.16.20.8:10080 -CCTV8,http://0000505.xyz:8888/rtp/239.76.253.158:9000 -CCTV8,http://0000505.xyz:8888/rtp/239.76.246.158:1234 -CCTV8,http://sdray.gicp.net:8822/rtp/239.16.20.8:10080 -CCTV8,http://nas.yzzdxc.cn:16666/rtp/239.37.0.234:5540 -CCTV8,http://www.yyf1991.top:9999/rtp/233.18.204.74:5140 -CCTV8,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.125:10388 -CCTV8,http://server.juzhijian.com:8822/rtp/239.16.20.8:10080 -CCTV8,http://zhangkx717.cn:9999/rtp/239.69.1.125:10388 -CCTV8,http://a.xiongnas.top:8888/rtp/239.3.1.175:8001 -CCTV8,http://nas.iszbd.com:4022/rtp/225.0.4.137:7980 -CCTV8,http://www.rongrong.me:14022/rtp/233.18.204.74:5140 -CCTV8,http://wmh.wmh.ink:6633/rtp/239.77.0.172:5146 -CCTV9,http://emby.xlangnan.cn:10316/rtp/239.254.200.59:8112 -CCTV9,http://wangfei.uno:9999/rtp/225.1.2.80:10474 -CCTV9,http://hiliu.myds.me:18088/rtp/239.69.1.104:10262 -CCTV9,http://b.xiongnas.top:8888/rtp/239.3.1.62:8112 -CCTV9,http://www.sclvip.top:5566/rtp/239.49.8.53:9814 -CCTV9,http://youngx.top:4022/rtp/233.18.204.75:5140 -CCTV9,http://www.maomizi.cn:9530/rtp/239.77.0.135:5146 -CCTV9,http://z.d4p.cn:8000/rtp/239.49.8.53:9814 -CCTV9,http://liuwenxiaokevin.top:14044/rtp/233.18.204.75:5140 -CCTV9,http://hongzhijiaoyu.net:8188/rtp/239.77.0.135:5146 -CCTV9,http://www.negative.top:50000/rtp/233.50.200.23:5140 -CCTV9,http://nas.lyfkai.cn:19999/rtp/239.69.1.104:10262 -CCTV9,http://pr.19760929.xyz:9688/rtp/239.77.0.135:5146 -CCTV9,http://www.wjyu.top:4022/rtp/233.18.204.75:5140 -CCTV9,http://ds3622.guangyuan.site:8188/rtp/239.77.0.135:5146 -CCTV9,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.135:5146 -CCTV9,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.80:10474 -CCTV9,http://marcvision.xyz:8000/rtp/238.1.78.240:7792 -CCTV9,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.135:5146 -CCTV9,http://www.syy3.top:3861/rtp/239.77.0.135:5146 -CCTV9,http://alist.guangyuan.site:8188/rtp/239.77.0.135:5146 -CCTV9,http://www.marcvision.xyz:8000/rtp/238.1.78.240:7792 -CCTV9,http://esxi.juzhijian.com:8822/rtp/239.16.20.9:10090 -CCTV9,http://0000505.xyz:8888/rtp/239.76.246.159:1234 -CCTV9,http://0000505.xyz:8888/rtp/239.76.253.159:9000 -CCTV9,http://sdray.gicp.net:8822/rtp/239.16.20.9:10090 -CCTV9,http://nas.yzzdxc.cn:16666/rtp/239.37.0.001:5540 -CCTV9,http://www.yyf1991.top:9999/rtp/233.18.204.75:5140 -CCTV9,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.104:10262 -CCTV9,http://server.juzhijian.com:8822/rtp/239.16.20.9:10090 -CCTV9,http://zhangkx717.cn:9999/rtp/239.69.1.104:10262 -CCTV9,http://a.xiongnas.top:8888/rtp/239.3.1.62:8112 -CCTV9,http://nas.iszbd.com:4022/rtp/225.0.4.131:7980 -CCTV9,http://www.rongrong.me:14022/rtp/233.18.204.75:5140 -CCTV9,http://wmh.wmh.ink:6633/rtp/239.77.0.135:5146 -CCTV10,http://emby.xlangnan.cn:10316/rtp/239.254.200.160:6000 -CCTV10,http://wangfei.uno:9999/rtp/225.1.2.81:10480 -CCTV10,http://hiliu.myds.me:18088/rtp/239.69.1.105:10268 -CCTV10,http://b.xiongnas.top:8888/rtp/239.3.1.63:8116 -CCTV10,http://www.sclvip.top:5566/rtp/239.49.8.54:9818 -CCTV10,http://youngx.top:4022/rtp/233.18.204.76:5140 -CCTV10,http://home.scanflove.com:7788/rtp/235.254.198.59:1512 -CCTV10,http://z.d4p.cn:8000/rtp/239.49.8.54:9818 -CCTV10,http://liuwenxiaokevin.top:14044/rtp/233.18.204.76:5140 -CCTV10,http://hongzhijiaoyu.net:8188/rtp/239.77.0.134:5146 -CCTV10,http://www.negative.top:50000/rtp/233.50.200.22:5140 -CCTV10,http://nas.lyfkai.cn:19999/rtp/239.69.1.105:10268 -CCTV10,http://pr.19760929.xyz:9688/rtp/239.77.0.134:5146 -CCTV10,http://www.wjyu.top:4022/rtp/233.18.204.76:5140 -CCTV10,http://vp.maomizi.cc:9530/rtp/239.77.0.134:5146 -CCTV10,http://ds3622.guangyuan.site:8188/rtp/239.77.0.134:5146 -CCTV10,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.134:5146 -CCTV10,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.81:10480 -CCTV10,http://marcvision.xyz:8000/rtp/238.1.78.241:7800 -CCTV10,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.134:5146 -CCTV10,http://www.syy3.top:3861/rtp/239.77.0.134:5146 -CCTV10,http://alist.guangyuan.site:8188/rtp/239.77.0.134:5146 -CCTV10,http://www.marcvision.xyz:8000/rtp/238.1.78.241:7800 -CCTV10,http://esxi.juzhijian.com:8822/rtp/239.16.20.10:10100 -CCTV10,http://0000505.xyz:8888/rtp/239.76.253.160:9000 -CCTV10,http://0000505.xyz:8888/rtp/239.76.246.160:1234 -CCTV10,http://sdray.gicp.net:8822/rtp/239.16.20.10:10100 -CCTV10,http://nas.yzzdxc.cn:16666/rtp/239.37.0.007:5540 -CCTV10,http://www.yyf1991.top:9999/rtp/233.18.204.76:5140 -CCTV10,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.105:10268 -CCTV10,http://server.juzhijian.com:8822/rtp/239.16.20.10:10100 -CCTV10,http://zhangkx717.cn:9999/rtp/239.69.1.105:10268 -CCTV10,http://a.xiongnas.top:8888/rtp/239.3.1.63:8116 -CCTV10,http://nas.iszbd.com:4022/rtp/225.0.4.130:7980 -CCTV10,http://www.rongrong.me:14022/rtp/233.18.204.76:5140 -CCTV10,http://wmh.wmh.ink:6633/rtp/239.77.0.134:5146 -CCTV11,http://emby.xlangnan.cn:10316/rtp/239.254.201.123:8120 -CCTV11,http://wangfei.uno:9999/rtp/225.1.2.220:11434 -CCTV11,http://b.xiongnas.top:8888/rtp/239.3.1.152:8120 -CCTV11,http://www.sclvip.top:5566/rtp/239.49.0.127:8000 -CCTV11,http://youngx.top:4022/rtp/233.18.204.77:5140 -CCTV11,http://home.scanflove.com:7788/rtp/235.254.198.7:1304 -CCTV11,http://z.d4p.cn:8000/rtp/239.49.0.127:8000 -CCTV11,http://liuwenxiaokevin.top:14044/rtp/233.18.204.77:5140 -CCTV11,http://hongzhijiaoyu.net:8188/rtp/239.77.1.108:5146 -CCTV11,http://www.negative.top:50000/rtp/233.50.200.132:5140 -CCTV11,http://nas.lyfkai.cn:19999/rtp/239.69.1.154:10560 -CCTV11,http://pr.19760929.xyz:9688/rtp/239.77.1.108:5146 -CCTV11,http://www.wjyu.top:4022/rtp/233.18.204.77:5140 -CCTV11,http://ds3622.guangyuan.site:8188/rtp/239.77.1.108:5146 -CCTV11,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.108:5146 -CCTV11,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.220:11434 -CCTV11,http://marcvision.xyz:8000/rtp/238.1.78.206:7502 -CCTV11,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.108:5146 -CCTV11,http://www.syy3.top:3861/rtp/239.77.1.108:5146 -CCTV11,http://alist.guangyuan.site:8188/rtp/239.77.1.108:5146 -CCTV11,http://www.marcvision.xyz:8000/rtp/238.1.78.206:7502 -CCTV11,http://esxi.juzhijian.com:8822/rtp/239.16.20.11:10110 -CCTV11,http://0000505.xyz:8888/rtp/239.76.245.251:1234 -CCTV11,http://0000505.xyz:8888/rtp/239.76.252.251:9000 -CCTV11,http://sdray.gicp.net:8822/rtp/239.16.20.11:10110 -CCTV11,http://www.yyf1991.top:9999/rtp/233.18.204.77:5140 -CCTV11,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.154:10560 -CCTV11,http://server.juzhijian.com:8822/rtp/239.16.20.11:10110 -CCTV11,http://zhangkx717.cn:9999/rtp/239.69.1.154:10560 -CCTV11,http://a.xiongnas.top:8888/rtp/239.3.1.152:8120 -CCTV11,http://nas.iszbd.com:4022/rtp/225.0.4.218:7980 -CCTV11,http://www.rongrong.me:14022/rtp/233.18.204.77:5140 -CCTV11,http://wmh.wmh.ink:6633/rtp/239.77.1.108:5146 -CCTV11,http://x1x.bid:5146/rtp/239.3.1.152:8120 -CCTV12,http://emby.xlangnan.cn:10316/rtp/239.254.200.161:6000 -CCTV12,http://wangfei.uno:9999/rtp/225.1.2.82:10486 -CCTV12,http://b.xiongnas.top:8888/rtp/239.3.1.64:8124 -CCTV12,http://www.sclvip.top:5566/rtp/239.49.8.55:9822 -CCTV12,http://youngx.top:4022/rtp/233.18.204.78:5140 -CCTV12,http://home.scanflove.com:7788/rtp/235.254.198.60:1516 -CCTV12,http://liuwenxiaokevin.top:14044/rtp/233.18.204.78:5140 -CCTV12,http://hongzhijiaoyu.net:8188/rtp/239.77.0.136:5146 -CCTV12,http://www.negative.top:50000/rtp/233.50.200.21:5140 -CCTV12,http://nas.lyfkai.cn:19999/rtp/239.69.1.106:10274 -CCTV12,http://pr.19760929.xyz:9688/rtp/239.77.0.136:5146 -CCTV12,http://www.wjyu.top:4022/rtp/233.18.204.78:5140 -CCTV12,http://ds3622.guangyuan.site:8188/rtp/239.77.0.136:5146 -CCTV12,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.136:5146 -CCTV12,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.82:10486 -CCTV12,http://marcvision.xyz:8000/rtp/238.1.78.242:7808 -CCTV12,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.136:5146 -CCTV12,http://www.syy3.top:3861/rtp/239.77.0.136:5146 -CCTV12,http://alist.guangyuan.site:8188/rtp/239.77.0.136:5146 -CCTV12,http://www.marcvision.xyz:8000/rtp/238.1.78.242:7808 -CCTV12,http://esxi.juzhijian.com:8822/rtp/239.16.20.12:10120 -CCTV12,http://0000505.xyz:8888/rtp/239.76.246.162:1234 -CCTV12,http://0000505.xyz:8888/rtp/239.76.253.162:9000 -CCTV12,http://sdray.gicp.net:8822/rtp/239.16.20.12:10120 -CCTV12,http://nas.yzzdxc.cn:16666/rtp/239.37.0.006:5540 -CCTV12,http://www.yyf1991.top:9999/rtp/233.18.204.78:5140 -CCTV12,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.106:10274 -CCTV12,http://server.juzhijian.com:8822/rtp/239.16.20.12:10120 -CCTV12,http://zhangkx717.cn:9999/rtp/239.69.1.106:10274 -CCTV12,http://a.xiongnas.top:8888/rtp/239.3.1.64:8124 -CCTV12,http://nas.iszbd.com:4022/rtp/225.0.4.129:7980 -CCTV12,http://www.rongrong.me:14022/rtp/233.18.204.78:5140 -CCTV12,http://wmh.wmh.ink:6633/rtp/239.77.0.136:5146 -CCTV13,http://emby.xlangnan.cn:10316/rtp/239.254.200.9:8264 -CCTV13,http://wangfei.uno:9999/rtp/225.1.2.74:11584 -CCTV13,http://b.xiongnas.top:8888/rtp/239.3.1.124:8128 -CCTV13,http://www.sclvip.top:5566/rtp/239.49.8.109:8000 -CCTV13,http://youngx.top:4022/rtp/233.18.204.79:5140 -CCTV13,http://home.scanflove.com:7788/rtp/235.254.198.9:1312 -CCTV13,http://www.maomizi.cn:9530/rtp/239.253.43.196:5146 -CCTV13,http://z.d4p.cn:8000/rtp/239.49.8.109:8000 -CCTV13,http://liuwenxiaokevin.top:14044/rtp/233.18.204.79:5140 -CCTV13,http://hongzhijiaoyu.net:8188/rtp/239.253.43.196:5146 -CCTV13,http://www.negative.top:50000/rtp/233.50.200.97:5140 -CCTV13,http://nas.lyfkai.cn:19999/rtp/239.254.96.161:9040 -CCTV13,http://pr.19760929.xyz:9688/rtp/239.253.43.196:5146 -CCTV13,http://www.wjyu.top:4022/rtp/233.18.204.79:5140 -CCTV13,http://vp.maomizi.cc:9530/rtp/239.253.43.196:5146 -CCTV13,http://ds3622.guangyuan.site:8188/rtp/239.253.43.196:5146 -CCTV13,http://lbyjlt.vv5678.cn:8880/rtp/239.253.43.196:5146 -CCTV13,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.74:11584 -CCTV13,http://marcvision.xyz:8000/rtp/238.1.79.35:4392 -CCTV13,http://www.hongzhijiaoyu.net:8188/rtp/239.253.43.196:5146 -CCTV13,http://www.syy3.top:3861/rtp/239.253.43.196:5146 -CCTV13,http://alist.guangyuan.site:8188/rtp/239.253.43.196:5146 -CCTV13,http://www.marcvision.xyz:8000/rtp/238.1.79.35:4392 -CCTV13,http://esxi.juzhijian.com:8822/rtp/239.16.20.13:10130 -CCTV13,http://0000505.xyz:8888/rtp/239.76.253.93:9000 -CCTV13,http://0000505.xyz:8888/rtp/239.76.246.93:1234 -CCTV13,http://sdray.gicp.net:8822/rtp/239.16.20.13:10130 -CCTV13,http://www.yyf1991.top:9999/rtp/233.18.204.79:5140 -CCTV13,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.161:9040 -CCTV13,http://server.juzhijian.com:8822/rtp/239.16.20.13:10130 -CCTV13,http://zhangkx717.cn:9999/rtp/239.254.96.161:9040 -CCTV13,http://a.xiongnas.top:8888/rtp/239.3.1.124:8128 -CCTV13,http://nas.iszbd.com:4022/rtp/225.0.4.219:7980 -CCTV13,http://www.rongrong.me:14022/rtp/233.18.204.79:5140 -CCTV13,http://wmh.wmh.ink:6633/rtp/239.253.43.196:5146 -CCTV14,http://emby.xlangnan.cn:10316/rtp/239.254.200.162:6000 -CCTV14,http://wangfei.uno:9999/rtp/225.1.2.83:10492 -CCTV14,http://b.xiongnas.top:8888/rtp/239.3.1.65:8132 -CCTV14,http://www.sclvip.top:5566/rtp/239.49.8.56:9826 -CCTV14,http://youngx.top:4022/rtp/233.18.204.80:5140 -CCTV14,http://home.scanflove.com:7788/rtp/235.254.198.61:1520 -CCTV14,http://www.maomizi.cn:9530/rtp/239.77.0.133:5146 -CCTV14,http://z.d4p.cn:8000/rtp/239.49.8.56:9826 -CCTV14,http://liuwenxiaokevin.top:14044/rtp/233.18.204.80:5140 -CCTV14,http://hongzhijiaoyu.net:8188/rtp/239.77.0.133:5146 -CCTV14,http://www.negative.top:50000/rtp/233.50.200.103:5140 -CCTV14,http://nas.lyfkai.cn:19999/rtp/239.69.1.107:10280 -CCTV14,http://pr.19760929.xyz:9688/rtp/239.77.0.133:5146 -CCTV14,http://www.wjyu.top:4022/rtp/233.18.204.80:5140 -CCTV14,http://vp.maomizi.cc:9530/rtp/239.77.0.133:5146 -CCTV14,http://ds3622.guangyuan.site:8188/rtp/239.77.0.133:5146 -CCTV14,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.133:5146 -CCTV14,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.83:10492 -CCTV14,http://marcvision.xyz:8000/rtp/238.1.78.243:7816 -CCTV14,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.133:5146 -CCTV14,http://www.syy3.top:3861/rtp/239.77.0.133:5146 -CCTV14,http://alist.guangyuan.site:8188/rtp/239.77.0.133:5146 -CCTV14,http://www.marcvision.xyz:8000/rtp/238.1.78.243:7816 -CCTV14,http://esxi.juzhijian.com:8822/rtp/239.16.20.14:10140 -CCTV14,http://0000505.xyz:8888/rtp/239.76.246.164:1234 -CCTV14,http://0000505.xyz:8888/rtp/239.76.253.164:9000 -CCTV14,http://sdray.gicp.net:8822/rtp/239.16.20.14:10140 -CCTV14,http://nas.yzzdxc.cn:16666/rtp/239.37.0.005:5540 -CCTV14,http://www.yyf1991.top:9999/rtp/233.18.204.80:5140 -CCTV14,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.107:10280 -CCTV14,http://server.juzhijian.com:8822/rtp/239.16.20.14:10140 -CCTV14,http://zhangkx717.cn:9999/rtp/239.69.1.107:10280 -CCTV14,http://a.xiongnas.top:8888/rtp/239.3.1.65:8132 -CCTV14,http://nas.iszbd.com:4022/rtp/225.0.4.128:7980 -CCTV14,http://www.rongrong.me:14022/rtp/233.18.204.80:5140 -CCTV14,http://wmh.wmh.ink:6633/rtp/239.77.0.133:5146 -CCTV15,http://emby.xlangnan.cn:10316/rtp/239.254.201.124:8136 -CCTV15,http://wangfei.uno:9999/rtp/225.1.2.221:11440 -CCTV15,http://b.xiongnas.top:8888/rtp/239.3.1.153:8136 -CCTV15,http://www.sclvip.top:5566/rtp/239.49.0.128:8000 -CCTV15,http://youngx.top:4022/rtp/233.18.204.81:5140 -CCTV15,http://home.scanflove.com:7788/rtp/235.254.198.11:1320 -CCTV15,http://www.maomizi.cn:9530/rtp/239.77.1.239:5146 -CCTV15,http://z.d4p.cn:8000/rtp/239.49.0.128:8000 -CCTV15,http://liuwenxiaokevin.top:14044/rtp/233.18.204.81:5140 -CCTV15,http://hongzhijiaoyu.net:8188/rtp/239.77.1.239:5146 -CCTV15,http://www.negative.top:50000/rtp/233.50.200.133:5140 -CCTV15,http://nas.lyfkai.cn:19999/rtp/239.69.1.155:10566 -CCTV15,http://pr.19760929.xyz:9688/rtp/239.77.1.239:5146 -CCTV15,http://www.wjyu.top:4022/rtp/233.18.204.81:5140 -CCTV15,http://vp.maomizi.cc:9530/rtp/239.77.1.239:5146 -CCTV15,http://ds3622.guangyuan.site:8188/rtp/239.77.1.239:5146 -CCTV15,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.239:5146 -CCTV15,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.221:11440 -CCTV15,http://marcvision.xyz:8000/rtp/238.1.78.222:7648 -CCTV15,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.239:5146 -CCTV15,http://www.syy3.top:3861/rtp/239.77.1.239:5146 -CCTV15,http://alist.guangyuan.site:8188/rtp/239.77.1.239:5146 -CCTV15,http://www.marcvision.xyz:8000/rtp/238.1.78.222:7648 -CCTV15,http://esxi.juzhijian.com:8822/rtp/239.16.20.15:10150 -CCTV15,http://0000505.xyz:8888/rtp/239.76.252.252:9000 -CCTV15,http://0000505.xyz:8888/rtp/239.76.245.252:1234 -CCTV15,http://sdray.gicp.net:8822/rtp/239.16.20.15:10150 -CCTV15,http://www.yyf1991.top:9999/rtp/233.18.204.81:5140 -CCTV15,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.155:10566 -CCTV15,http://server.juzhijian.com:8822/rtp/239.16.20.15:10150 -CCTV15,http://zhangkx717.cn:9999/rtp/239.69.1.155:10566 -CCTV15,http://a.xiongnas.top:8888/rtp/239.3.1.153:8136 -CCTV15,http://nas.iszbd.com:4022/rtp/225.0.4.220:7980 -CCTV15,http://www.rongrong.me:14022/rtp/233.18.204.81:5140 -CCTV15,http://wmh.wmh.ink:6633/rtp/239.77.1.239:5146 -CCTV15,http://x1x.bid:5146/rtp/239.3.1.153:8136 -CCTV15,http://iptv.xxika.net:8188/rtp/239.77.1.239:5146 -CCTV16,http://emby.xlangnan.cn:10316/rtp/239.254.200.61:6344 -CCTV16,http://b.xiongnas.top:8888/rtp/239.3.1.184:8001 -CCTV16,http://www.sclvip.top:5566/rtp/239.49.8.31:8000 -CCTV16,http://youngx.top:4022/rtp/233.18.204.82:5140 -CCTV16,http://youngx.top:4022/rtp/233.18.204.114:5140 -CCTV16,http://youngx.top:4022/rtp/233.18.204.215:5140 -CCTV16,http://www.maomizi.cn:9530/rtp/239.77.0.165:5146 -CCTV16,http://z.d4p.cn:8000/rtp/239.49.8.31:8000 -CCTV16,http://liuwenxiaokevin.top:14044/rtp/233.18.204.82:5140 -CCTV16,http://liuwenxiaokevin.top:14044/rtp/233.18.204.114:5140 -CCTV16,http://liuwenxiaokevin.top:14044/rtp/233.18.204.215:5140 -CCTV16,http://hongzhijiaoyu.net:8188/rtp/239.77.0.165:5146 -CCTV16,http://www.negative.top:50000/rtp/233.50.201.192:5140 -CCTV16,http://nas.lyfkai.cn:19999/rtp/239.69.1.247:11124 -CCTV16,http://pr.19760929.xyz:9688/rtp/239.77.0.165:5146 -CCTV16,http://www.wjyu.top:4022/rtp/233.18.204.82:5140 -CCTV16,http://www.wjyu.top:4022/rtp/233.18.204.114:5140 -CCTV16,http://www.wjyu.top:4022/rtp/233.18.204.215:5140 -CCTV16,http://vp.maomizi.cc:9530/rtp/239.77.0.165:5146 -CCTV16,http://ds3622.guangyuan.site:8188/rtp/239.77.0.165:5146 -CCTV16,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.165:5146 -CCTV16,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.165:5146 -CCTV16,http://www.syy3.top:3861/rtp/239.77.0.165:5146 -CCTV16,http://alist.guangyuan.site:8188/rtp/239.77.0.165:5146 -CCTV16,http://0000505.xyz:8888/rtp/239.76.253.98:9000 -CCTV16,http://0000505.xyz:8888/rtp/239.76.246.98:1234 -CCTV16,http://www.yyf1991.top:9999/rtp/233.18.204.82:5140 -CCTV16,http://www.yyf1991.top:9999/rtp/233.18.204.114:5140 -CCTV16,http://www.yyf1991.top:9999/rtp/233.18.204.215:5140 -CCTV16,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.247:11124 -CCTV16,http://zhangkx717.cn:9999/rtp/239.69.1.247:11124 -CCTV16,http://a.xiongnas.top:8888/rtp/239.3.1.184:8001 -CCTV17,http://emby.xlangnan.cn:10316/rtp/239.254.201.120:8144 -CCTV17,http://wangfei.uno:9999/rtp/225.1.2.53:10312 -CCTV17,http://b.xiongnas.top:8888/rtp/239.3.1.151:8144 -CCTV17,http://www.sclvip.top:5566/rtp/239.49.8.52:9810 -CCTV17,http://youngx.top:4022/rtp/233.18.204.83:5140 -CCTV17,http://www.maomizi.cn:9530/rtp/239.77.0.198:5146 -CCTV17,http://liuwenxiaokevin.top:14044/rtp/233.18.204.83:5140 -CCTV17,http://hongzhijiaoyu.net:8188/rtp/239.77.0.198:5146 -CCTV17,http://www.negative.top:50000/rtp/233.50.200.113:5140 -CCTV17,http://nas.lyfkai.cn:19999/rtp/239.69.1.152:10548 -CCTV17,http://pr.19760929.xyz:9688/rtp/239.77.0.198:5146 -CCTV17,http://www.wjyu.top:4022/rtp/233.18.204.83:5140 -CCTV17,http://vp.maomizi.cc:9530/rtp/239.77.0.198:5146 -CCTV17,http://ds3622.guangyuan.site:8188/rtp/239.77.0.198:5146 -CCTV17,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.198:5146 -CCTV17,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.53:10312 -CCTV17,http://marcvision.xyz:8000/rtp/238.1.78.178:7296 -CCTV17,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.198:5146 -CCTV17,http://www.syy3.top:3861/rtp/239.77.0.198:5146 -CCTV17,http://alist.guangyuan.site:8188/rtp/239.77.0.198:5146 -CCTV17,http://www.marcvision.xyz:8000/rtp/238.1.78.178:7296 -CCTV17,http://esxi.juzhijian.com:8822/rtp/239.16.20.7:10070 -CCTV17,http://0000505.xyz:8888/rtp/239.76.252.238:9000 -CCTV17,http://0000505.xyz:8888/rtp/239.76.245.238:1234 -CCTV17,http://sdray.gicp.net:8822/rtp/239.16.20.7:10070 -CCTV17,http://nas.yzzdxc.cn:16666/rtp/239.37.0.002:5540 -CCTV17,http://www.yyf1991.top:9999/rtp/233.18.204.83:5140 -CCTV17,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.152:10548 -CCTV17,http://server.juzhijian.com:8822/rtp/239.16.20.7:10070 -CCTV17,http://zhangkx717.cn:9999/rtp/239.69.1.152:10548 -CCTV17,http://a.xiongnas.top:8888/rtp/239.3.1.151:8144 -CCTV17,http://nas.iszbd.com:4022/rtp/225.0.4.179:7980 -CCTV17,http://www.rongrong.me:14022/rtp/233.18.204.83:5140 -CCTV17,http://wmh.wmh.ink:6633/rtp/239.77.0.198:5146 -CCTV17,http://x1x.bid:5146/rtp/239.3.1.151:8144 -北京卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.47:8024 -北京卫视,http://wangfei.uno:9999/rtp/225.1.2.49:10288 -北京卫视,http://b.xiongnas.top:8888/rtp/239.3.1.241:8000 -北京卫视,http://www.sclvip.top:5566/rtp/239.49.8.11:9414 -北京卫视,http://youngx.top:4022/rtp/233.18.204.87:5140 -北京卫视,http://home.scanflove.com:7788/rtp/235.254.198.66:1540 -北京卫视,http://www.maomizi.cn:9530/rtp/239.77.0.91:5146 -北京卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.87:5140 -北京卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.91:5146 -北京卫视,http://www.negative.top:50000/rtp/233.50.201.107:5140 -北京卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.141:8920 -北京卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.91:5146 -北京卫视,http://www.wjyu.top:4022/rtp/233.18.204.87:5140 -北京卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.91:5146 -北京卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.91:5146 -北京卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.91:5146 -北京卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.49:10288 -北京卫视,http://marcvision.xyz:8000/rtp/238.1.78.162:7168 -北京卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.91:5146 -北京卫视,http://www.syy3.top:3861/rtp/239.77.0.91:5146 -北京卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.91:5146 -北京卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.162:7168 -北京卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.76:10760 -北京卫视,http://0000505.xyz:8888/rtp/239.76.246.184:1234 -北京卫视,http://0000505.xyz:8888/rtp/239.76.253.184:9000 -北京卫视,http://sdray.gicp.net:8822/rtp/239.16.20.76:10760 -北京卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.050:5540 -北京卫视,http://www.yyf1991.top:9999/rtp/233.18.204.87:5140 -北京卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.141:8920 -北京卫视,http://server.juzhijian.com:8822/rtp/239.16.20.76:10760 -北京卫视,http://zhangkx717.cn:9999/rtp/239.254.96.141:8920 -北京卫视,http://a.xiongnas.top:8888/rtp/239.3.1.241:8000 -北京卫视,http://nas.iszbd.com:4022/rtp/225.0.4.78:7980 -北京卫视,http://www.rongrong.me:14022/rtp/233.18.204.87:5140 -北京卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.91:5146 -浙江卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.53:8036 -浙江卫视,http://wangfei.uno:9999/rtp/225.1.2.85:10504 -浙江卫视,http://b.xiongnas.top:8888/rtp/239.3.1.137:8036 -浙江卫视,http://www.sclvip.top:5566/rtp/239.49.8.20:9618 -浙江卫视,http://youngx.top:4022/rtp/233.18.204.84:5140 -浙江卫视,http://home.scanflove.com:7788/rtp/235.254.198.63:1528 -浙江卫视,http://www.maomizi.cn:9530/rtp/239.77.0.89:5146 -浙江卫视,http://z.d4p.cn:8000/rtp/239.49.8.20:9618 -浙江卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.84:5140 -浙江卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.89:5146 -浙江卫视,http://www.negative.top:50000/rtp/233.50.201.100:5140 -浙江卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.143:8932 -浙江卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.89:5146 -浙江卫视,http://www.wjyu.top:4022/rtp/233.18.204.84:5140 -浙江卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.89:5146 -浙江卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.89:5146 -浙江卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.89:5146 -浙江卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.85:10504 -浙江卫视,http://marcvision.xyz:8000/rtp/238.1.78.164:7184 -浙江卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.89:5146 -浙江卫视,http://www.syy3.top:3861/rtp/239.77.0.89:5146 -浙江卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.89:5146 -浙江卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.164:7184 -浙江卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.71:10710 -浙江卫视,http://0000505.xyz:8888/rtp/239.76.246.182:1234 -浙江卫视,http://0000505.xyz:8888/rtp/239.76.253.182:9000 -浙江卫视,http://sdray.gicp.net:8822/rtp/239.16.20.71:10710 -浙江卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.037:5540 -浙江卫视,http://www.yyf1991.top:9999/rtp/233.18.204.84:5140 -浙江卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.143:8932 -浙江卫视,http://server.juzhijian.com:8822/rtp/239.16.20.71:10710 -浙江卫视,http://zhangkx717.cn:9999/rtp/239.254.96.143:8932 -浙江卫视,http://a.xiongnas.top:8888/rtp/239.3.1.137:8036 -浙江卫视,http://nas.iszbd.com:4022/rtp/225.0.4.81:7980 -浙江卫视,http://www.rongrong.me:14022/rtp/233.18.204.84:5140 -浙江卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.89:5146 -东方卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.52:8032 -东方卫视,http://wangfei.uno:9999/rtp/225.1.2.86:10510 -东方卫视,http://b.xiongnas.top:8888/rtp/239.3.1.136:8032 -东方卫视,http://youngx.top:4022/rtp/233.18.204.51:5140 -东方卫视,http://home.scanflove.com:7788/rtp/235.254.198.73:1568 -东方卫视,http://www.maomizi.cn:9530/rtp/239.77.1.218:5146 -东方卫视,http://z.d4p.cn:8000/rtp/239.49.8.17:9606 -东方卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.51:5140 -东方卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.218:5146 -东方卫视,http://www.negative.top:50000/rtp/233.50.201.125:5140 -东方卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.142:8926 -东方卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.218:5146 -东方卫视,http://www.wjyu.top:4022/rtp/233.18.204.51:5140 -东方卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.218:5146 -东方卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.218:5146 -东方卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.218:5146 -东方卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.86:10510 -东方卫视,http://marcvision.xyz:8000/rtp/238.1.78.163:7176 -东方卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.218:5146 -东方卫视,http://www.syy3.top:3861/rtp/239.77.1.218:5146 -东方卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.218:5146 -东方卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.163:7176 -东方卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.73:10730 -东方卫视,http://0000505.xyz:8888/rtp/239.76.246.186:1234 -东方卫视,http://0000505.xyz:8888/rtp/239.76.253.186:9000 -东方卫视,http://sdray.gicp.net:8822/rtp/239.16.20.73:10730 -东方卫视,http://www.yyf1991.top:9999/rtp/233.18.204.51:5140 -东方卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.142:8926 -东方卫视,http://server.juzhijian.com:8822/rtp/239.16.20.73:10730 -东方卫视,http://zhangkx717.cn:9999/rtp/239.254.96.142:8926 -东方卫视,http://a.xiongnas.top:8888/rtp/239.3.1.136:8032 -东方卫视,http://nas.iszbd.com:4022/rtp/225.0.4.80:7980 -东方卫视,http://www.rongrong.me:14022/rtp/233.18.204.51:5140 -东方卫视,http://wmh.wmh.ink:6633/rtp/239.77.1.218:5146 - -湖南卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.48:8012 -湖南卫视,http://wangfei.uno:9999/rtp/225.1.2.50:10294 -湖南卫视,http://b.xiongnas.top:8888/rtp/239.3.1.132:8012 -湖南卫视,http://www.sclvip.top:5566/rtp/239.49.8.12:9418 -湖南卫视,http://youngx.top:4022/rtp/233.18.204.86:5140 -湖南卫视,http://home.scanflove.com:7788/rtp/235.254.198.62:1524 -湖南卫视,http://www.maomizi.cn:9530/rtp/239.77.1.5:5146 -湖南卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.86:5140 -湖南卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.5:5146 -湖南卫视,http://www.negative.top:50000/rtp/233.50.201.103:5140 -湖南卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.139:8908 -湖南卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.5:5146 -湖南卫视,http://www.wjyu.top:4022/rtp/233.18.204.86:5140 -湖南卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.5:5146 -湖南卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.5:5146 -湖南卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.5:5146 -湖南卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.50:10294 -湖南卫视,http://marcvision.xyz:8000/rtp/238.1.78.160:7152 -湖南卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.5:5146 -湖南卫视,http://www.syy3.top:3861/rtp/239.77.1.5:5146 -湖南卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.5:5146 -湖南卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.160:7152 -湖南卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.72:10720 -湖南卫视,http://0000505.xyz:8888/rtp/239.76.245.115:1234 -湖南卫视,http://0000505.xyz:8888/rtp/239.76.246.101:1234 -湖南卫视,http://0000505.xyz:8888/rtp/239.76.253.101:9000 -湖南卫视,http://sdray.gicp.net:8822/rtp/239.16.20.72:10720 -湖南卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.038:5540 -湖南卫视,http://www.yyf1991.top:9999/rtp/233.18.204.86:5140 -湖南卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.139:8908 -湖南卫视,http://server.juzhijian.com:8822/rtp/239.16.20.72:10720 -湖南卫视,http://zhangkx717.cn:9999/rtp/239.254.96.139:8908 -湖南卫视,http://a.xiongnas.top:8888/rtp/239.3.1.132:8012 - -江苏卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.51:8028 -江苏卫视,http://wangfei.uno:9999/rtp/225.1.2.84:10498 -江苏卫视,http://b.xiongnas.top:8888/rtp/239.3.1.135:8028 -江苏卫视,http://www.sclvip.top:5566/rtp/239.49.8.16:9602 -江苏卫视,http://youngx.top:4022/rtp/233.18.204.85:5140 -江苏卫视,http://home.scanflove.com:7788/rtp/235.254.198.64:1532 -江苏卫视,http://www.maomizi.cn:9530/rtp/239.77.1.18:5146 -江苏卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.85:5140 -江苏卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.18:5146 -江苏卫视,http://www.negative.top:50000/rtp/233.50.201.106:5140 -江苏卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.144:8938 -江苏卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.18:5146 -江苏卫视,http://www.wjyu.top:4022/rtp/233.18.204.85:5140 -江苏卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.18:5146 -江苏卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.18:5146 -江苏卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.18:5146 -江苏卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.84:10498 -江苏卫视,http://marcvision.xyz:8000/rtp/238.1.78.165:7192 -江苏卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.18:5146 -江苏卫视,http://www.syy3.top:3861/rtp/239.77.1.18:5146 -江苏卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.18:5146 -江苏卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.165:7192 -江苏卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.74:10740 -江苏卫视,http://0000505.xyz:8888/rtp/239.76.253.181:9000 -江苏卫视,http://0000505.xyz:8888/rtp/239.76.246.181:1234 -江苏卫视,http://sdray.gicp.net:8822/rtp/239.16.20.74:10740 -江苏卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.055:5540 -江苏卫视,http://www.yyf1991.top:9999/rtp/233.18.204.85:5140 -江苏卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.144:8938 -江苏卫视,http://server.juzhijian.com:8822/rtp/239.16.20.74:10740 -江苏卫视,http://zhangkx717.cn:9999/rtp/239.254.96.144:8938 -江苏卫视,http://a.xiongnas.top:8888/rtp/239.3.1.135:8028 -江苏卫视,http://nas.iszbd.com:4022/rtp/225.0.4.79:7980 -江苏卫视,http://www.rongrong.me:14022/rtp/233.18.204.85:5140 -江苏卫视,http://wmh.wmh.ink:6633/rtp/239.77.1.18:5146 -深圳卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.50:8020 -深圳卫视,http://wangfei.uno:9999/rtp/225.1.2.91:10540 -深圳卫视,http://b.xiongnas.top:8888/rtp/239.3.1.134:8020 -深圳卫视,http://www.sclvip.top:5566/rtp/239.49.8.15:9430 -深圳卫视,http://youngx.top:4022/rtp/233.18.204.89:5140 -深圳卫视,http://home.scanflove.com:7788/rtp/235.254.198.71:1560 -深圳卫视,http://www.maomizi.cn:9530/rtp/239.77.0.92:5146 -深圳卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.89:5140 -深圳卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.92:5146 -深圳卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.137:8896 -深圳卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.92:5146 -深圳卫视,http://www.wjyu.top:4022/rtp/233.18.204.89:5140 -深圳卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.92:5146 -深圳卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.92:5146 -深圳卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.92:5146 -深圳卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.91:10540 -深圳卫视,http://marcvision.xyz:8000/rtp/238.1.78.156:7120 -深圳卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.92:5146 -深圳卫视,http://www.syy3.top:3861/rtp/239.77.0.92:5146 -深圳卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.92:5146 -深圳卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.156:7120 -深圳卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.77:10770 -深圳卫视,http://0000505.xyz:8888/rtp/239.76.246.188:1234 -深圳卫视,http://sdray.gicp.net:8822/rtp/239.16.20.77:10770 -深圳卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.047:5540 -深圳卫视,http://www.yyf1991.top:9999/rtp/233.18.204.89:5140 -深圳卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.137:8896 -深圳卫视,http://server.juzhijian.com:8822/rtp/239.16.20.77:10770 -深圳卫视,http://zhangkx717.cn:9999/rtp/239.254.96.137:8896 -深圳卫视,http://a.xiongnas.top:8888/rtp/239.3.1.134:8020 -深圳卫视,http://nas.iszbd.com:4022/rtp/225.0.4.202:7980 -深圳卫视,http://www.rongrong.me:14022/rtp/233.18.204.89:5140 -深圳卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.92:5146 - -广东卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.56:8048 -广东卫视,http://wangfei.uno:9999/rtp/225.1.2.151:10924 -广东卫视,http://b.xiongnas.top:8888/rtp/239.3.1.142:8048 -广东卫视,http://www.sclvip.top:5566/rtp/239.49.8.13:9422 -广东卫视,http://youngx.top:4022/rtp/233.18.204.88:5140 -广东卫视,http://home.scanflove.com:7788/rtp/235.254.196.204:1088 -广东卫视,http://www.maomizi.cn:9530/rtp/239.77.0.84:5146 -广东卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.88:5140 -广东卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.84:5146 -广东卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.140:8914 -广东卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.84:5146 -广东卫视,http://www.wjyu.top:4022/rtp/233.18.204.88:5140 -广东卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.84:5146 -广东卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.84:5146 -广东卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.84:5146 -广东卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.151:10924 -广东卫视,http://marcvision.xyz:8000/rtp/238.1.78.161:7160 -广东卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.84:5146 -广东卫视,http://www.syy3.top:3861/rtp/239.77.0.84:5146 -广东卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.84:5146 -广东卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.161:7160 -广东卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.98:10980 -广东卫视,http://0000505.xyz:8888/rtp/239.76.252.189:9000 -广东卫视,http://0000505.xyz:8888/rtp/239.76.245.189:1234 -广东卫视,http://sdray.gicp.net:8822/rtp/239.16.20.98:10980 -广东卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.033:5540 -广东卫视,http://www.yyf1991.top:9999/rtp/233.18.204.88:5140 -广东卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.140:8914 -广东卫视,http://server.juzhijian.com:8822/rtp/239.16.20.98:10980 -广东卫视,http://zhangkx717.cn:9999/rtp/239.254.96.140:8914 -广东卫视,http://a.xiongnas.top:8888/rtp/239.3.1.142:8048 -广东卫视,http://nas.iszbd.com:4022/rtp/225.0.4.84:7980 -广东卫视,http://www.rongrong.me:14022/rtp/233.18.204.88:5140 -广东卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.84:5146 -广西卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.80:8300 -广西卫视,http://wangfei.uno:9999/rtp/225.1.2.34:10198 -广西卫视,http://b.xiongnas.top:8888/rtp/239.3.1.39:8300 -广西卫视,http://www.sclvip.top:5566/rtp/239.49.8.10:8000 -广西卫视,http://youngx.top:4022/rtp/233.18.204.107:5140 -广西卫视,http://home.scanflove.com:7788/rtp/235.254.198.38:1428 -广西卫视,http://www.maomizi.cn:9530/rtp/239.77.0.139:5146 -广西卫视,http://z.d4p.cn:8000/rtp/239.49.8.10:8000 -广西卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.107:5140 -广西卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.139:5146 -广西卫视,http://www.negative.top:50000/rtp/233.50.200.136:5140 -广西卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.191:10788 -广西卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.139:5146 -广西卫视,http://www.wjyu.top:4022/rtp/233.18.204.107:5140 -广西卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.139:5146 -广西卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.139:5146 -广西卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.139:5146 -广西卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.34:10198 -广西卫视,http://marcvision.xyz:8000/rtp/238.1.78.70:6432 -广西卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.139:5146 -广西卫视,http://www.syy3.top:3861/rtp/239.77.0.139:5146 -广西卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.139:5146 -广西卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.70:6432 -广西卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.84:10840 -广西卫视,http://0000505.xyz:8888/rtp/239.76.254.54:9000 -广西卫视,http://sdray.gicp.net:8822/rtp/239.16.20.84:10840 -广西卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.051:5540 -广西卫视,http://www.yyf1991.top:9999/rtp/233.18.204.107:5140 -广西卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.191:10788 -广西卫视,http://server.juzhijian.com:8822/rtp/239.16.20.84:10840 -广西卫视,http://zhangkx717.cn:9999/rtp/239.69.1.191:10788 -广西卫视,http://a.xiongnas.top:8888/rtp/239.3.1.39:8300 -广西卫视,http://www.rongrong.me:14022/rtp/233.18.204.107:5140 -广西卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.139:5146 -广西卫视,http://x1x.bid:5146/rtp/239.3.1.39:8300 -广西卫视,http://www.taoli.website:23234/rtp/239.3.1.39:8300 -东南卫视,http://emby.xlangnan.cn:10316/rtp/239.254.201.13:6291 -东南卫视,http://wangfei.uno:9999/rtp/225.1.2.226:11470 -东南卫视,http://b.xiongnas.top:8888/rtp/239.3.1.156:8148 -东南卫视,http://www.sclvip.top:5566/rtp/239.49.8.112:8000 -东南卫视,http://youngx.top:4022/rtp/233.18.204.94:5140 -东南卫视,http://home.scanflove.com:7788/rtp/235.254.198.129:7980 -东南卫视,http://www.maomizi.cn:9530/rtp/239.77.0.146:5146 -东南卫视,http://z.d4p.cn:8000/rtp/239.49.8.112:8000 -东南卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.94:5140 -东南卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.146:5146 -东南卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.108:10286 -东南卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.146:5146 -东南卫视,http://www.wjyu.top:4022/rtp/233.18.204.94:5140 -东南卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.146:5146 -东南卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.146:5146 -东南卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.146:5146 -东南卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.226:11470 -东南卫视,http://marcvision.xyz:8000/rtp/238.1.78.22:6104 -东南卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.146:5146 -东南卫视,http://www.syy3.top:3861/rtp/239.77.0.146:5146 -东南卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.146:5146 -东南卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.22:6104 -东南卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.82:10820 -东南卫视,http://0000505.xyz:8888/rtp/239.76.245.190:1234 -东南卫视,http://0000505.xyz:8888/rtp/239.76.252.190:9000 -东南卫视,http://sdray.gicp.net:8822/rtp/239.16.20.82:10820 -东南卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.042:5540 -东南卫视,http://www.yyf1991.top:9999/rtp/233.18.204.94:5140 -东南卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.108:10286 -东南卫视,http://server.juzhijian.com:8822/rtp/239.16.20.82:10820 -东南卫视,http://zhangkx717.cn:9999/rtp/239.69.1.108:10286 -东南卫视,http://a.xiongnas.top:8888/rtp/239.3.1.156:8148 -东南卫视,http://nas.iszbd.com:4022/rtp/225.0.4.200:7980 -东南卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.146:5146 -海南卫视,http://emby.xlangnan.cn:10316/rtp/239.254.201.125:6288 -海南卫视,http://wangfei.uno:9999/rtp/225.1.2.107:11620 -海南卫视,http://b.xiongnas.top:8888/rtp/239.3.1.45:8304 -海南卫视,http://www.sclvip.top:5566/rtp/239.49.8.83:8000 -海南卫视,http://home.scanflove.com:7788/rtp/235.254.198.44:1452 -海南卫视,http://www.maomizi.cn:9530/rtp/239.253.43.35:5146 -海南卫视,http://hongzhijiaoyu.net:8188/rtp/239.253.43.35:5146 -海南卫视,http://www.negative.top:50000/rtp/233.50.200.165:5140 -海南卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.151:10542 -海南卫视,http://pr.19760929.xyz:9688/rtp/239.253.43.35:5146 -海南卫视,http://vp.maomizi.cc:9530/rtp/239.253.43.35:5146 -海南卫视,http://ds3622.guangyuan.site:8188/rtp/239.253.43.35:5146 -海南卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.253.43.35:5146 -海南卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.107:11620 -海南卫视,http://marcvision.xyz:8000/rtp/238.1.79.49:4504 -海南卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.253.43.35:5146 -海南卫视,http://www.syy3.top:3861/rtp/239.253.43.35:5146 -海南卫视,http://alist.guangyuan.site:8188/rtp/239.253.43.35:5146 -海南卫视,http://www.marcvision.xyz:8000/rtp/238.1.79.49:4504 -海南卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.97:10970 -海南卫视,http://sdray.gicp.net:8822/rtp/239.16.20.97:10970 -海南卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.035:5540 -海南卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.151:10542 -海南卫视,http://server.juzhijian.com:8822/rtp/239.16.20.97:10970 -海南卫视,http://zhangkx717.cn:9999/rtp/239.69.1.151:10542 -海南卫视,http://a.xiongnas.top:8888/rtp/239.3.1.45:8304 -海南卫视,http://wmh.wmh.ink:6633/rtp/239.253.43.35:5146 -海南卫视,http://iptv.xxika.net:8188/rtp/239.253.43.35:5146 - -河北卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.174:6000 -河北卫视,http://wangfei.uno:9999/rtp/225.1.2.106:11614 -河北卫视,http://b.xiongnas.top:8888/rtp/239.3.1.148:8072 -河北卫视,http://www.sclvip.top:5566/rtp/239.49.8.114:8000 -河北卫视,http://youngx.top:4022/rtp/233.18.204.103:5140 -河北卫视,http://home.scanflove.com:7788/rtp/235.254.198.184:7980 -河北卫视,http://www.maomizi.cn:9530/rtp/239.77.1.214:5146 -河北卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.103:5140 -河北卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.214:5146 -河北卫视,http://www.negative.top:50000/rtp/233.50.201.140:5140 -河北卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.113:9616 -河北卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.214:5146 -河北卫视,http://www.wjyu.top:4022/rtp/233.18.204.103:5140 -河北卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.214:5146 -河北卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.214:5146 -河北卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.214:5146 -河北卫视,http://marcvision.xyz:8000/rtp/238.1.78.245:7832 -河北卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.214:5146 -河北卫视,http://www.syy3.top:3861/rtp/239.77.1.214:5146 -河北卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.214:5146 -河北卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.245:7832 -河北卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.88:10880 -河北卫视,http://0000505.xyz:8888/rtp/239.76.245.199:1234 -河北卫视,http://0000505.xyz:8888/rtp/239.76.252.199:9000 -河北卫视,http://sdray.gicp.net:8822/rtp/239.16.20.88:10880 -河北卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.052:5540 -河北卫视,http://www.yyf1991.top:9999/rtp/233.18.204.103:5140 -河北卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.113:9616 -河北卫视,http://server.juzhijian.com:8822/rtp/239.16.20.88:10880 -河北卫视,http://zhangkx717.cn:9999/rtp/239.254.96.113:9616 -河北卫视,http://a.xiongnas.top:8888/rtp/239.3.1.148:8072 -河北卫视,http://nas.iszbd.com:4022/rtp/225.0.4.174:7980 -河北卫视,http://www.rongrong.me:14022/rtp/233.18.204.103:5140 -河北卫视,http://wmh.wmh.ink:6633/rtp/239.77.1.214:5146 - -河南卫视,http://emby.xlangnan.cn:10316/rtp/239.254.201.16:7174 -河南卫视,http://wangfei.uno:9999/rtp/225.1.2.99:10588 -河南卫视,http://b.xiongnas.top:8888/rtp/239.3.1.50:8184 -河南卫视,http://www.sclvip.top:5566/rtp/239.49.8.29:8000 -河南卫视,http://youngx.top:4022/rtp/233.18.204.105:5140 -河南卫视,http://home.scanflove.com:7788/rtp/235.254.198.26:1380 -河南卫视,http://www.maomizi.cn:9530/rtp/239.77.0.17:5146 -河南卫视,http://z.d4p.cn:8000/rtp/239.49.8.29:8000 -河南卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.105:5140 -河南卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.17:5146 -河南卫视,http://www.negative.top:50000/rtp/233.50.201.144:5140 -河南卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.168:10644 -河南卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.17:5146 -河南卫视,http://www.wjyu.top:4022/rtp/233.18.204.105:5140 -河南卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.17:5146 -河南卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.17:5146 -河南卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.17:5146 -河南卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.99:10588 -河南卫视,http://marcvision.xyz:8000/rtp/238.1.79.65:4632 -河南卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.17:5146 -河南卫视,http://www.syy3.top:3861/rtp/239.77.0.17:5146 -河南卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.17:5146 -河南卫视,http://www.marcvision.xyz:8000/rtp/238.1.79.65:4632 -河南卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.21:10210 -河南卫视,http://0000505.xyz:8888/rtp/239.76.253.202:9000 -河南卫视,http://0000505.xyz:8888/rtp/239.76.246.202:1234 -河南卫视,http://sdray.gicp.net:8822/rtp/239.16.20.21:10210 -河南卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.056:5540 -河南卫视,http://www.yyf1991.top:9999/rtp/233.18.204.105:5140 -河南卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.168:10644 -河南卫视,http://server.juzhijian.com:8822/rtp/239.16.20.21:10210 -湖北卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.164:6000 -湖北卫视,http://wangfei.uno:9999/rtp/225.1.2.90:10534 -湖北卫视,http://b.xiongnas.top:8888/rtp/239.3.1.138:8044 -湖北卫视,http://www.sclvip.top:5566/rtp/239.49.8.8:9632 -湖北卫视,http://youngx.top:4022/rtp/233.18.204.92:5140 -湖北卫视,http://home.scanflove.com:7788/rtp/235.254.198.72:1564 -湖北卫视,http://www.maomizi.cn:9530/rtp/239.77.0.95:5146 -湖北卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.92:5140 -湖北卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.95:5146 -湖北卫视,http://www.negative.top:50000/rtp/233.50.201.114:5140 -湖北卫视,http://nas.lyfkai.cn:19999/rtp/239.254.96.115:8664 -湖北卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.95:5146 -湖北卫视,http://www.wjyu.top:4022/rtp/233.18.204.92:5140 -湖北卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.95:5146 -湖北卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.95:5146 -湖北卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.95:5146 -湖北卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.90:10534 -湖北卫视,http://marcvision.xyz:8000/rtp/238.1.78.168:7216 -湖北卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.95:5146 -湖北卫视,http://www.syy3.top:3861/rtp/239.77.0.95:5146 -湖北卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.95:5146 -湖北卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.168:7216 -湖北卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.87:10870 -湖北卫视,http://0000505.xyz:8888/rtp/239.76.246.193:1234 -湖北卫视,http://0000505.xyz:8888/rtp/239.76.253.193:9000 -湖北卫视,http://sdray.gicp.net:8822/rtp/239.16.20.87:10870 -湖北卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.040:5540 -湖北卫视,http://www.yyf1991.top:9999/rtp/233.18.204.92:5140 -湖北卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.254.96.115:8664 -湖北卫视,http://server.juzhijian.com:8822/rtp/239.16.20.87:10870 -湖北卫视,http://zhangkx717.cn:9999/rtp/239.254.96.115:8664 -湖北卫视,http://a.xiongnas.top:8888/rtp/239.3.1.138:8044 -湖北卫视,http://nas.iszbd.com:4022/rtp/225.0.4.217:7980 -湖北卫视,http://www.rongrong.me:14022/rtp/233.18.204.92:5140 -湖北卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.95:5146 - -江西卫视,http://emby.xlangnan.cn:10316/rtp/239.254.201.12:6290 -江西卫视,http://wangfei.uno:9999/rtp/225.1.2.77:11602 -江西卫视,http://b.xiongnas.top:8888/rtp/239.3.1.123:8164 -江西卫视,http://www.sclvip.top:5566/rtp/239.49.8.111:8000 -江西卫视,http://youngx.top:4022/rtp/233.18.204.95:5140 -江西卫视,http://home.scanflove.com:7788/rtp/235.254.198.29:1392 -江西卫视,http://www.maomizi.cn:9530/rtp/239.77.1.219:5146 -江西卫视,http://liuwenxiaokevin.top:14044/rtp/233.18.204.95:5140 -江西卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.1.219:5146 -江西卫视,http://www.negative.top:50000/rtp/233.50.201.145:5140 -江西卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.126:10394 -江西卫视,http://pr.19760929.xyz:9688/rtp/239.77.1.219:5146 -江西卫视,http://www.wjyu.top:4022/rtp/233.18.204.95:5140 -江西卫视,http://vp.maomizi.cc:9530/rtp/239.77.1.219:5146 -江西卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.1.219:5146 -江西卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.1.219:5146 -江西卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.77:11602 -江西卫视,http://marcvision.xyz:8000/rtp/238.1.78.26:6136 -江西卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.1.219:5146 -江西卫视,http://www.syy3.top:3861/rtp/239.77.1.219:5146 -江西卫视,http://alist.guangyuan.site:8188/rtp/239.77.1.219:5146 -江西卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.26:6136 -江西卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.89:10890 -江西卫视,http://0000505.xyz:8888/rtp/239.76.245.225:1234 -江西卫视,http://sdray.gicp.net:8822/rtp/239.16.20.89:10890 -江西卫视,http://www.yyf1991.top:9999/rtp/233.18.204.95:5140 -江西卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.126:10394 -江西卫视,http://server.juzhijian.com:8822/rtp/239.16.20.89:10890 -江西卫视,http://zhangkx717.cn:9999/rtp/239.69.1.126:10394 -江西卫视,http://a.xiongnas.top:8888/rtp/239.3.1.123:8164 -江西卫视,http://nas.iszbd.com:4022/rtp/225.0.4.203:7980 -江西卫视,http://www.rongrong.me:14022/rtp/233.18.204.95:5140 -江西卫视,http://wmh.wmh.ink:6633/rtp/239.77.1.219:5146 - -四川卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.202:6325 -四川卫视,http://wangfei.uno:9999/rtp/225.1.2.108:11626 -四川卫视,http://b.xiongnas.top:8888/rtp/239.3.1.29:8288 -四川卫视,http://www.sclvip.top:5566/rtp/239.49.8.110:8000 -四川卫视,http://home.scanflove.com:7788/rtp/235.254.198.175:7980 -四川卫视,http://www.maomizi.cn:9530/rtp/239.77.0.159:5146 -四川卫视,http://z.d4p.cn:8000/rtp/239.49.8.110:8000 -四川卫视,http://hongzhijiaoyu.net:8188/rtp/239.77.0.159:5146 -四川卫视,http://www.negative.top:50000/rtp/233.50.201.139:5140 -四川卫视,http://nas.lyfkai.cn:19999/rtp/239.69.1.169:10650 -四川卫视,http://pr.19760929.xyz:9688/rtp/239.77.0.159:5146 -四川卫视,http://vp.maomizi.cc:9530/rtp/239.77.0.159:5146 -四川卫视,http://ds3622.guangyuan.site:8188/rtp/239.77.0.159:5146 -四川卫视,http://lbyjlt.vv5678.cn:8880/rtp/239.77.0.159:5146 -四川卫视,http://hnzznas.xgpuplay.eu.org:8818/rtp/225.1.2.108:11626 -四川卫视,http://marcvision.xyz:8000/rtp/238.1.78.30:6168 -四川卫视,http://www.hongzhijiaoyu.net:8188/rtp/239.77.0.159:5146 -四川卫视,http://www.syy3.top:3861/rtp/239.77.0.159:5146 -四川卫视,http://alist.guangyuan.site:8188/rtp/239.77.0.159:5146 -四川卫视,http://www.marcvision.xyz:8000/rtp/238.1.78.30:6168 -四川卫视,http://esxi.juzhijian.com:8822/rtp/239.16.20.86:10860 -四川卫视,http://0000505.xyz:8888/rtp/239.76.253.91:9000 -四川卫视,http://0000505.xyz:8888/rtp/239.76.246.91:1234 -四川卫视,http://sdray.gicp.net:8822/rtp/239.16.20.86:10860 -四川卫视,http://nas.yzzdxc.cn:16666/rtp/239.37.0.041:5540 -四川卫视,http://xu3791vg3503.vicp.fun:8808/rtp/239.69.1.169:10650 -四川卫视,http://server.juzhijian.com:8822/rtp/239.16.20.86:10860 -四川卫视,http://zhangkx717.cn:9999/rtp/239.69.1.169:10650 -四川卫视,http://a.xiongnas.top:8888/rtp/239.3.1.29:8288 -四川卫视,http://nas.iszbd.com:4022/rtp/225.0.4.204:7980 -四川卫视,http://wmh.wmh.ink:6633/rtp/239.77.0.159:5146 -四川卫视,http://x1x.bid:5146/rtp/239.3.1.29:8288 -四川卫视,http://iptv.xxika.net:8188/rtp/239.77.0.159:5146 -四川卫视,http://www.taoli.website:23234/rtp/239.3.1.29:8288 -四川卫视,http://yanshifen.top:8889/rtp/239.77.0.159:5146 - -重庆卫视,http://emby.xlangnan.cn:10316/rtp/239.254.200.203:6323 -重庆卫视,http://wangfei.uno:9999/rtp/225.1.2.75:11590 -重庆卫视,http://hiliu.myds.me:18088/rtp/239.69.1.149:10530 -重庆卫视,http://b.xiongnas.top:8888/rtp/239.3.1.122:8160 -重庆卫视,http://www.sclvip.top:5566/rtp/239.49.8.57:9830 -重庆卫视,http://youngx.top:4022/rtp/233.18.204.100:5140 - - - - - - -央卫频道3,#genre# -CCTV1,http://39.165.39.49:19901/tsfile/live/1001_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV2,http://39.165.39.49:19901/tsfile/live/1002_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV3,http://39.165.39.49:19901/tsfile/live/1003_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV4,http://39.165.39.49:19901/tsfile/live/1004_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV5,http://39.165.39.49:19901/tsfile/live/1005_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV6,http://39.165.39.49:19901/tsfile/live/1006_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV7,http://39.165.39.49:19901/tsfile/live/1007_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV8,http://39.165.39.49:19901/tsfile/live/1008_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV9,http://39.165.39.49:19901/tsfile/live/1009_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV10,http://39.165.39.49:19901/tsfile/live/1010_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV11,http://39.165.39.49:19901/tsfile/live/1011_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV12,http://39.165.39.49:19901/tsfile/live/1000_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV13,http://39.165.39.49:19901/tsfile/live/1084_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV14,http://39.165.39.49:19901/tsfile/live/1085_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV15,http://39.165.39.49:19901/tsfile/live/1086_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV17,http://39.165.39.49:19901/tsfile/live/1088_1.m3u8?key=txiptv&playlive=0&authid=0 -CCTV5+,http://39.165.39.49:19901/tsfile/live/1089_1.m3u8?key=txiptv&playlive=0&authid=0 -中国教育,http://39.165.39.49:19901/tsfile/live/1090_1.m3u8?key=txiptv&playlive=0&authid=0 -河南卫视,http://39.165.39.49:19901/tsfile/live/1105_1.m3u8?key=txiptv&playlive=0&authid=0 -浙江卫视,http://39.165.39.49:19901/tsfile/live/1127_1.m3u8?key=txiptv&playlive=0&authid=0 -东方卫视,http://39.165.39.49:19901/tsfile/live/1128_1.m3u8?key=txiptv&playlive=0&authid=0 -江苏卫视,http://39.165.39.49:19901/tsfile/live/1129_1.m3u8?key=txiptv&playlive=0&authid=0 -北京卫视,http://39.165.39.49:19901/tsfile/live/1130_1.m3u8?key=txiptv&playlive=0&authid=0 -广东卫视,http://39.165.39.49:19901/tsfile/live/1131_1.m3u8?key=txiptv&playlive=0&authid=0 -山东卫视,http://39.165.39.49:19901/tsfile/live/1133_1.m3u8?key=txiptv&playlive=0&authid=0 -安徽卫视,http://39.165.39.49:19901/tsfile/live/1134_1.m3u8?key=txiptv&playlive=0&authid=0 -湖南卫视,http://39.165.39.49:19901/tsfile/live/1140_1.m3u8?key=txiptv&playlive=0&authid=0 -深圳卫视,http://39.165.39.49:19901/tsfile/live/1141_1.m3u8?key=txiptv&playlive=0&authid=0 -湖北卫视,http://39.165.39.49:19901/tsfile/live/1143_1.m3u8?key=txiptv&playlive=0&authid=0 -东南卫视,http://39.165.39.49:19901/tsfile/live/1149_1.m3u8?key=txiptv&playlive=0&authid=0 -金鹰卡通,http://39.165.39.49:19901/tsfile/live/1156_1.m3u8?key=txiptv&playlive=0&authid=0 -嘉佳卡通,http://39.165.39.49:19901/tsfile/live/1157_1.m3u8?key=txiptv&playlive=0&authid=0 -卡酷动画,http://39.165.39.49:19901/tsfile/live/1158_1.m3u8?key=txiptv&playlive=0&authid=0 -炫动卡通,http://39.165.39.49:19901/tsfile/live/1159_1.m3u8?key=txiptv&playlive=0&authid=0 -优漫卡通,http://39.165.39.49:19901/tsfile/live/1092_1.m3u8?key=txiptv&playlive=0&authid=0 -文体旅游,http://39.165.39.49:19901/tsfile/live/1094_1.m3u8?key=txiptv&playlive=0&authid=0 - - - - - 咪咕标清,#genre# CCTV-01咪咕,http://rihou.cc:555/tv/[mg]CCTV-01 CCTV-02咪咕,http://rihou.cc:555/tv/[mg]CCTV-02 @@ -1314,138 +109,6 @@ CGTN-法咪咕,http://rihou.cc:555/tv/[mg]CGTN-法 -咪咕标清2,#genre# -CCTV1综合,http://wfenf.x3322.net:7788/608807420 -CCTV2财经,http://wfenf.x3322.net:7788/631780532 -CCTV3综艺,http://wfenf.x3322.net:7788/624878271 -CCTV4中文国际,http://wfenf.x3322.net:7788/631780421 -CCTV5体育,http://wfenf.x3322.net:7788/641886683 -CCTV5+体育赛事,http://wfenf.x3322.net:7788/641886773 -CCTV6电影,http://wfenf.x3322.net:7788/624878396 -CCTV7国防军事,http://wfenf.x3322.net:7788/673168121 -CCTV8电视剧,http://wfenf.x3322.net:7788/624878356 -CCTV9纪录,http://wfenf.x3322.net:7788/673168140 -CCTV10科教,http://wfenf.x3322.net:7788/624878405 -CCTV11戏曲,http://wfenf.x3322.net:7788/667987558 -CCTV12社会与法,http://wfenf.x3322.net:7788/673168185 -CCTV13新闻,http://wfenf.x3322.net:7788/608807423 -CCTV14少儿,http://wfenf.x3322.net:7788/624878440 -CCTV15音乐,http://wfenf.x3322.net:7788/673168223 -CCTV17农业农村,http://wfenf.x3322.net:7788/673168256 -CCTV4欧洲,http://wfenf.x3322.net:7788/608807419 -CCTV4美洲,http://wfenf.x3322.net:7788/608807416 -CGTN外语纪录,http://wfenf.x3322.net:7788/609006487 -CGTN阿拉伯语,http://wfenf.x3322.net:7788/609154345 -CGTN西班牙语,http://wfenf.x3322.net:7788/609006450 -CGTN法语,http://wfenf.x3322.net:7788/609006476 -CGTN俄语,http://wfenf.x3322.net:7788/609006446 -老故事,http://wfenf.x3322.net:7788/884121956 -发现之旅,http://wfenf.x3322.net:7788/624878970 -中学生,http://wfenf.x3322.net:7788/708869532 -CGTN,http://wfenf.x3322.net:7788/609017205 - -东方卫视,http://wfenf.x3322.net:7788/651632648 -江苏卫视,http://wfenf.x3322.net:7788/623899368 -广东卫视,http://wfenf.x3322.net:7788/608831231 -北京卫视,http://wfenf.x3322.net:7788/630287636 -辽宁卫视,http://wfenf.x3322.net:7788/630291707 -河北卫视,http://wfenf.x3322.net:7788/962042070 -江西卫视,http://wfenf.x3322.net:7788/783847495 -河南卫视,http://wfenf.x3322.net:7788/790187291 -陕西卫视,http://wfenf.x3322.net:7788/738910838 -大湾区卫视,http://wfenf.x3322.net:7788/608917627 -湖北卫视,http://wfenf.x3322.net:7788/947472496 -吉林卫视,http://wfenf.x3322.net:7788/947472500 -青海卫视,http://wfenf.x3322.net:7788/947472506 -东南卫视,http://wfenf.x3322.net:7788/849116810 -海南卫视,http://wfenf.x3322.net:7788/947472502 -海峡卫视,http://wfenf.x3322.net:7788/849119120 -中国农林卫视,http://wfenf.x3322.net:7788/956904896 -兵团卫视,http://wfenf.x3322.net:7788/956923145 -宁夏卫视,http://wfenf.x3322.net:7788/738910535 -重庆卫视,http://wfenf.x3322.net:7788/738910914 -三沙卫视,http://wfenf.x3322.net:7788/961023778 - -上海新闻综合,http://wfenf.x3322.net:7788/651632657 -上视东方影视,http://wfenf.x3322.net:7788/617290047 -上海第一财经,http://wfenf.x3322.net:7788/608780988 -南京新闻综合频道,http://wfenf.x3322.net:7788/838109047 -南京教科频道,http://wfenf.x3322.net:7788/838153729 -南京十八频道,http://wfenf.x3322.net:7788/838151753 -体育休闲频道,http://wfenf.x3322.net:7788/626064707 -江苏城市频道,http://wfenf.x3322.net:7788/626064714 -江苏国际,http://wfenf.x3322.net:7788/626064674 -江苏教育,http://wfenf.x3322.net:7788/628008321 -江苏影视频道,http://wfenf.x3322.net:7788/626064697 -江苏综艺频道,http://wfenf.x3322.net:7788/626065193 -公共新闻频道,http://wfenf.x3322.net:7788/626064693 -盐城新闻综合,http://wfenf.x3322.net:7788/639731825 -淮安新闻综合,http://wfenf.x3322.net:7788/639731826 -泰州新闻综合,http://wfenf.x3322.net:7788/639731818 -连云港新闻综合,http://wfenf.x3322.net:7788/639731715 -宿迁新闻综合,http://wfenf.x3322.net:7788/639731832 -徐州新闻综合,http://wfenf.x3322.net:7788/639731747 -优漫卡通频道,http://wfenf.x3322.net:7788/626064703 -江阴新闻综合,http://wfenf.x3322.net:7788/955227979 -南通新闻综合,http://wfenf.x3322.net:7788/955227985 -宜兴新闻综合,http://wfenf.x3322.net:7788/955227996 -溧水新闻综合,http://wfenf.x3322.net:7788/639737327 -陕西银龄频道,http://wfenf.x3322.net:7788/956909362 -陕西都市青春频道,http://wfenf.x3322.net:7788/956909358 -陕西秦腔频道,http://wfenf.x3322.net:7788/956909303 -陕西新闻资讯频道,http://wfenf.x3322.net:7788/956909289 -财富天下,http://wfenf.x3322.net:7788/956923159 -镇江新闻综合,http://wfenf.x3322.net:7788/639731783 -海南广播电视总台新闻频道,http://wfenf.x3322.net:7788/962067517 -海南广播电视总台自贸频道,http://wfenf.x3322.net:7788/962045226 -海南广播电视总台社会与法频道,http://wfenf.x3322.net:7788/962045223 -海南广播电视总台文旅频道,http://wfenf.x3322.net:7788/962067526 -海南广播电视总台少儿频道,http://wfenf.x3322.net:7788/962067523 - -赛事最经典,http://wfenf.x3322.net:7788/646596895 -体坛名栏汇,http://wfenf.x3322.net:7788/629943305 -四海钓鱼,http://wfenf.x3322.net:7788/637444975 -陕西体育休闲频道,http://wfenf.x3322.net:7788/956909356 -24小时城市联赛轮播台,http://wfenf.x3322.net:7788/915512915 -武术世界,http://wfenf.x3322.net:7788/958475359 -快乐垂钓,http://wfenf.x3322.net:7788/961930263 -建党105周年巡礼,http://wfenf.x3322.net:7788/713600957 -经典香港电影,http://wfenf.x3322.net:7788/625703337 -新片放映厅,http://wfenf.x3322.net:7788/619495952 -CHC影迷电影,http://wfenf.x3322.net:7788/952383261 -CHC动作电影,http://wfenf.x3322.net:7788/644368714 -CHC家庭影院,http://wfenf.x3322.net:7788/644368373 -和美乡途轮播台,http://wfenf.x3322.net:7788/713591450 -南方影视,http://wfenf.x3322.net:7788/614961829 -中国天气,http://wfenf.x3322.net:7788/959986621 -CETV1,http://wfenf.x3322.net:7788/923287154 -CETV2,http://wfenf.x3322.net:7788/923287211 -CETV4,http://wfenf.x3322.net:7788/923287339 -山东教育,http://wfenf.x3322.net:7788/609154353 -熊猫频道01高清,http://wfenf.x3322.net:7788/609158151 -熊猫频道1,http://wfenf.x3322.net:7788/608933610 -熊猫频道2,http://wfenf.x3322.net:7788/608933640 -熊猫频道3,http://wfenf.x3322.net:7788/608934619 -熊猫频道4,http://wfenf.x3322.net:7788/608934721 -熊猫频道5,http://wfenf.x3322.net:7788/608935104 -熊猫频道6,http://wfenf.x3322.net:7788/608935797 -熊猫频道7,http://wfenf.x3322.net:7788/609169286 -熊猫频道8,http://wfenf.x3322.net:7788/609169287 -熊猫频道9,http://wfenf.x3322.net:7788/609169226 -熊猫频道10,http://wfenf.x3322.net:7788/609169285 -最强综艺趴,http://wfenf.x3322.net:7788/629942228 -嘉佳卡通,http://wfenf.x3322.net:7788/614952364 -经典动画大集合,http://wfenf.x3322.net:7788/629942219 -新动漫,http://wfenf.x3322.net:7788/961930269 -新动力量创一流,http://wfenf.x3322.net:7788/713589837 -中华特产,http://wfenf.x3322.net:7788/959986618 -环球旅游,http://wfenf.x3322.net:7788/958475356 - - - - - - 央卫视频,#genre# CCTV-1HD,http://38.75.136.137:98/gslb/dsdqpub/cctv1hd.m3u8?auth=testpub diff --git a/cpu_iy3/lib/jd4k.js b/cpu_iy3/lib/jd4k.js new file mode 100644 index 00000000..b251c368 --- /dev/null +++ b/cpu_iy3/lib/jd4k.js @@ -0,0 +1,1729 @@ +const _0x24a000 = _0x3bf3; +(function (_0x4af1bf, _0x354faf) { + const _0x10067b = _0x3bf3, _0x4787fe = _0x4af1bf(); + while (!![]) { + try { + const _0x4356d7 = -parseInt(_0x10067b(0x35d)) / (0x869 * -0x1 + -0x2509 * 0x1 + 0x2d73) * (parseInt(_0x10067b(0x24d)) / (0x112 * 0xe + -0x1d * 0x89 + 0x8b * 0x1)) + -parseInt(_0x10067b(0x3bd)) / (0x3f * -0x5e + 0x1596 + 0x18f) + -parseInt(_0x10067b(0x2f5)) / (0x22aa + -0x255e + -0x57 * -0x8) * (parseInt(_0x10067b(0x1e5)) / (0x1c5d + 0x769 + -0x23c1)) + -parseInt(_0x10067b(0x3c1)) / (0x1 * -0xcff + -0x1e62 + -0x29 * -0x10f) * (parseInt(_0x10067b(0x3ad)) / (0x1b46 * -0x1 + 0xf85 + 0xbc8)) + -parseInt(_0x10067b(0x34a)) / (-0x2576 + -0x1f4d + -0x44cb * -0x1) * (-parseInt(_0x10067b(0x295)) / (-0x2 * 0x7d1 + 0x1 * 0x13d5 + 0x1 * -0x42a)) + parseInt(_0x10067b(0x246)) / (0x43 * 0x59 + -0x2638 + 0x1 * 0xef7) + -parseInt(_0x10067b(0x234)) / (0x2 * 0x11dc + -0x1e02 + 0x1 * -0x5ab) * (-parseInt(_0x10067b(0x21f)) / (0x1 * -0xa75 + 0x119 * 0x15 + -0xc8c)); + if (_0x4356d7 === _0x354faf) + break; + else + _0x4787fe['push'](_0x4787fe['shift']()); + } catch (_0x531b5c) { + _0x4787fe['push'](_0x4787fe['shift']()); + } + } +}(_0x30bd, -0x1 * -0x192eb + -0xa95 * -0x1a7 + -0x7b329)); +import { + Crypto, + _ +} from 'assets://js/lib/cat.js'; +let host = '', header = { 'User-Agent': _0x24a000(0x269) + _0x24a000(0x2e1) }, siteKey = '', siteType = '', siteJx = ''; +const urlPattern1 = /api\.php\/.*?\/vod/, urlPattern2 = /api\.php\/.+?\.vod/, parsePattern = /\/.+\\?.+=/, parsePattern1 = /.*(url|v|vid|php\?id)=/, parsePattern2 = /https?:\/\/[^\/]*/, htmlVideoKeyMatch = [ + /player=new/, + /
_0x50fda5; + }, + 'AEWJN': function (_0x34e794, _0x24610e, _0x529315, _0x31bacd) { + return _0x34e794(_0x24610e, _0x529315, _0x31bacd); + }, + 'Knznh': function (_0x4f4e7d, _0x5a0aac) { + return _0x4f4e7d !== _0x5a0aac; + }, + 'ViinS': function (_0x595f7e, _0x159136) { + return _0x595f7e(_0x159136); + } + }; + try { + let _0xabb5ea = siteJx[_0x314f8e]; + !_0xabb5ea && (siteJx[_0x5ed43f(0x3b3) + _0x5ed43f(0x2f2)]('*') ? _0xabb5ea = siteJx['*'] : _0xabb5ea = []); + _0x46895d[_0x5ed43f(0x28d)](_0xabb5ea[_0x5ed43f(0x2d3)], 0x6 * -0x2c7 + 0xf * -0x1a5 + 0xdc7 * 0x3) && (_0xabb5ea = [_0x46895d[_0x5ed43f(0x27e)]]); + if (_0x46895d[_0x5ed43f(0x24b)](_0xabb5ea[_0x5ed43f(0x2d3)], -0xf * 0x73 + 0x13df + -0xd22 * 0x1)) { + const _0xc1b189 = await _0x46895d[_0x5ed43f(0x285)](getFinalVideo, _0x314f8e, _0xabb5ea, _0x533915); + if (_0x46895d[_0x5ed43f(0x3c2)](_0xc1b189, null)) + return JSON[_0x5ed43f(0x3a2)](_0xc1b189); + } + if (_0x46895d[_0x5ed43f(0x334)](isVideoFormat, _0x533915)) { + const _0x2016c3 = { + 'parse': 0x1, + 'playUrl': '', + 'url': _0x533915 + }; + return JSON[_0x5ed43f(0x3a2)](_0x2016c3); + } else { + const _0x59b4d5 = { + 'parse': 0x1, + 'jx': '1', + 'url': _0x533915 + }; + return JSON[_0x5ed43f(0x3a2)](_0x59b4d5); + } + } catch (_0x15f170) { + SpiderDebug[_0x5ed43f(0x24a)](_0x15f170); + } + return ''; +} +async function search(_0x15b8fa, _0x588e3d) { + const _0xc070a9 = _0x24a000, _0x24ff97 = { + 'rAAqR': _0xc070a9(0x288), + 'gHEas': _0xc070a9(0x2cf) + 'od', + 'PPjsc': function (_0x4c022d, _0x4ebd2b) { + return _0x4c022d(_0x4ebd2b); + }, + 'nAAlp': function (_0x1196f9, _0x523142, _0x215206) { + return _0x1196f9(_0x523142, _0x215206); + }, + 'Yoody': function (_0x40a0f3, _0x527133, _0x5f956b) { + return _0x40a0f3(_0x527133, _0x5f956b); + }, + 'Qzbyi': function (_0xf70d91, _0x5d6ade) { + return _0xf70d91(_0x5d6ade); + }, + 'AhyMI': function (_0x42d25e, _0x371898) { + return _0x42d25e instanceof _0x371898; + }, + 'raJIH': function (_0x2a22fd, _0x2de3f5) { + return _0x2a22fd instanceof _0x2de3f5; + }, + 'bfaLF': function (_0x8207e7, _0x21fb6c) { + return _0x8207e7 !== _0x21fb6c; + } + }; + try { + if (host[_0xc070a9(0x39f)](_0x24ff97[_0xc070a9(0x26f)]) || host[_0xc070a9(0x39f)](_0x24ff97[_0xc070a9(0x28c)])) { + const _0x26ec58 = host + (_0xc070a9(0x324) + _0xc070a9(0x28e)) + _0x24ff97[_0xc070a9(0x294)](encodeURIComponent, _0x15b8fa) + _0xc070a9(0x237), _0x1c1ca8 = await _0x24ff97[_0xc070a9(0x247)](request, _0x26ec58, _0x24ff97[_0xc070a9(0x294)](getHeaders, _0x26ec58)), _0xc6c488 = JSON[_0xc070a9(0x213)](_0x1c1ca8), _0x1ead5c = []; + if (_0xc6c488[_0xc070a9(0x394)] && Array[_0xc070a9(0x315)](_0xc6c488[_0xc070a9(0x394)])) + for (const _0x284ed3 of _0xc6c488[_0xc070a9(0x394)]) { + _0x1ead5c[_0xc070a9(0x332)]({ + 'vod_id': _0x284ed3[_0xc070a9(0x3c3)], + 'vod_name': _0x284ed3[_0xc070a9(0x2b8)], + 'vod_pic': _0x284ed3[_0xc070a9(0x290)] || '', + 'vod_remarks': _0x284ed3[_0xc070a9(0x346) + 's'] || '' + }); + } + return JSON[_0xc070a9(0x3a2)]({ 'list': _0x1ead5c }); + } else { + const _0x4c1fc9 = host, _0x3631b2 = _0x24ff97[_0xc070a9(0x247)](getSearchUrl, _0x4c1fc9, _0x24ff97[_0xc070a9(0x294)](encodeURIComponent, _0x15b8fa)), _0x15e390 = await _0x24ff97[_0xc070a9(0x369)](request, _0x3631b2, _0x24ff97[_0xc070a9(0x2a1)](getHeaders, _0x3631b2)), _0x59d1cc = JSON[_0xc070a9(0x213)](_0x15e390); + let _0x136112 = null; + const _0x1337a6 = []; + if (_0x24ff97[_0xc070a9(0x3ac)](_0x59d1cc[_0xc070a9(0x394)], Array)) + _0x136112 = _0x59d1cc[_0xc070a9(0x394)]; + else { + if (_0x24ff97[_0xc070a9(0x2bc)](_0x59d1cc[_0xc070a9(0x339)], Object) && _0x24ff97[_0xc070a9(0x3ac)](_0x59d1cc[_0xc070a9(0x339)][_0xc070a9(0x394)], Array)) + _0x136112 = _0x59d1cc[_0xc070a9(0x339)][_0xc070a9(0x394)]; + else + _0x24ff97[_0xc070a9(0x2bc)](_0x59d1cc[_0xc070a9(0x339)], Array) && (_0x136112 = _0x59d1cc[_0xc070a9(0x339)]); + } + if (_0x24ff97[_0xc070a9(0x2ee)](_0x136112, null)) + for (const _0x152e86 of _0x136112) { + if (_0x152e86[_0xc070a9(0x3c3)]) { + const _0x49ee8a = { + 'vod_id': _0x152e86[_0xc070a9(0x3c3)], + 'vod_name': _0x152e86[_0xc070a9(0x2b8)], + 'vod_pic': _0x152e86[_0xc070a9(0x290)], + 'vod_remarks': _0x152e86[_0xc070a9(0x346) + 's'] + }; + _0x1337a6[_0xc070a9(0x332)](_0x49ee8a); + } else { + const _0x467d07 = { + 'vod_id': _0x152e86[_0xc070a9(0x3b6)], + 'vod_name': _0x152e86[_0xc070a9(0x1e9)], + 'vod_pic': _0x152e86[_0xc070a9(0x3ba)], + 'vod_remarks': _0x152e86[_0xc070a9(0x258)] + }; + _0x1337a6[_0xc070a9(0x332)](_0x467d07); + } + } + const _0x1e4c19 = { 'list': _0x1337a6 }; + return JSON[_0xc070a9(0x3a2)](_0x1e4c19); + } + } catch (_0x334adf) { + SpiderDebug[_0xc070a9(0x24a)](_0x334adf); + } + return ''; +} +async function getFinalVideo(_0x356707, _0x398327, _0x2ef122) { + const _0x12dc27 = _0x24a000, _0x44bf01 = { + 'KPgHF': function (_0x55b24f, _0x2ecff3) { + return _0x55b24f === _0x2ecff3; + }, + 'WCCoT': function (_0x2ce219, _0x446505) { + return _0x2ce219 === _0x446505; + }, + 'QIbLN': _0x12dc27(0x1fb), + 'XjiyL': function (_0x451dd4, _0x2b6510) { + return _0x451dd4 + _0x2b6510; + }, + 'eFJbi': function (_0xe7aa93, _0x51184b, _0x539572, _0x540f7d) { + return _0xe7aa93(_0x51184b, _0x539572, _0x540f7d); + }, + 'cchWu': function (_0x5d7821, _0x2a0a3c, _0x143221) { + return _0x5d7821(_0x2a0a3c, _0x143221); + }, + 'emPiw': function (_0x242abc, _0x178c18) { + return _0x242abc !== _0x178c18; + }, + 'HHlAe': _0x12dc27(0x366), + 'snexY': _0x12dc27(0x2e3), + 'oRses': _0x12dc27(0x352) + }; + let _0xcd3790 = ''; + for (const _0x5cb301 of _0x398327) { + if (_0x44bf01[_0x12dc27(0x200)](_0x5cb301, '') || _0x44bf01[_0x12dc27(0x205)](_0x5cb301, _0x44bf01[_0x12dc27(0x2a5)])) + continue; + const _0x2f83f6 = _0x44bf01[_0x12dc27(0x30c)](_0x5cb301, _0x2ef122), _0x4b7b47 = await _0x44bf01[_0x12dc27(0x219)](request, _0x2f83f6, null, -0x3 * 0x13f + -0x1 * 0x4d12 + 0x243 * 0x35); + let _0x5e80c0 = null; + try { + _0x5e80c0 = _0x44bf01[_0x12dc27(0x2c1)](jsonParse, _0x2ef122, _0x4b7b47); + } catch (_0x684857) { + } + if (_0x44bf01[_0x12dc27(0x2a3)](_0x5e80c0, null) && _0x5e80c0[_0x12dc27(0x3b3) + _0x12dc27(0x2f2)](_0x44bf01[_0x12dc27(0x364)]) && _0x5e80c0[_0x12dc27(0x3b3) + _0x12dc27(0x2f2)](_0x44bf01[_0x12dc27(0x3a7)])) + return _0x5e80c0[_0x12dc27(0x2e3)] = JSON[_0x12dc27(0x3a2)](_0x5e80c0[_0x12dc27(0x2e3)]), _0x5e80c0; + if (_0x4b7b47[_0x12dc27(0x39f)](_0x44bf01[_0x12dc27(0x2df)])) { + let _0x259a20 = ![]; + for (const _0x4410e4 of htmlVideoKeyMatch) { + if (_0x4410e4[_0x12dc27(0x36e)](_0x4b7b47)) { + _0x259a20 = !![]; + break; + } + } + _0x259a20 && (_0xcd3790 = _0x5cb301); + } + } + if (_0x44bf01[_0x12dc27(0x2a3)](_0xcd3790, '')) { + const _0x425204 = { + 'parse': 0x0, + 'playUrl': '', + 'url': _0x2ef122 + }; + return JSON[_0x12dc27(0x3a2)](_0x425204); + } + return null; +} +function genPlayList(_0x2a68f0, _0x17eead, _0x2951b7, _0x47b9eb, _0x800257) { + const _0x1d5b05 = _0x24a000, _0x37e1eb = { + 'qFCgy': _0x1d5b05(0x288), + 'muyni': _0x1d5b05(0x2cf) + 'od', + 'VdBFp': _0x1d5b05(0x27c) + 'p', + 'fuavN': _0x1d5b05(0x25c), + 'nqoHH': _0x1d5b05(0x343), + 'TVfJB': function (_0x46f089, _0x2a240f) { + return _0x46f089 > _0x2a240f; + }, + 'Xavsg': _0x1d5b05(0x2c8) + }, _0x15a66c = [], _0x182550 = []; + if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x37c)]) || _0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x383)])) { + const _0x40de27 = _0x17eead[_0x1d5b05(0x394)] && _0x17eead[_0x1d5b05(0x394)][-0x635 + 0x50e * -0x4 + -0x8cf * -0x3] ? _0x17eead[_0x1d5b05(0x394)][0x2 * 0x901 + -0x2382 + 0x1180] : {}; + _0x47b9eb[_0x1d5b05(0x3c3)] = _0x40de27[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x40de27[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x40de27[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x40de27[_0x1d5b05(0x37d)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x40de27[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x40de27[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x40de27[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x40de27[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x40de27[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x40de27[_0x1d5b05(0x227) + 't'] || '', _0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x40de27[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] || '', _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x40de27[_0x1d5b05(0x3a0) + 'rl'] || ''; + return; + } + if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x3a8)]) || _0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x238)])) { + const _0x249ca8 = _0x17eead[_0x1d5b05(0x339)] || {}; + _0x47b9eb[_0x1d5b05(0x3c3)] = _0x249ca8[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x249ca8[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x249ca8[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x249ca8[_0x1d5b05(0x311)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x249ca8[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x249ca8[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x249ca8[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x249ca8[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x249ca8[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x249ca8[_0x1d5b05(0x227) + 't'] || ''; + if (_0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)] && Array[_0x1d5b05(0x315)](_0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)])) + for (const _0x39d1e3 of _0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)]) { + let _0x2f80cc = _0x39d1e3[_0x1d5b05(0x330)]?.[_0x1d5b05(0x314)]() || _0x39d1e3[_0x1d5b05(0x214)]?.[_0x1d5b05(0x314)]() || ''; + if (!_0x2f80cc) + continue; + _0x182550[_0x1d5b05(0x332)](_0x2f80cc), _0x15a66c[_0x1d5b05(0x332)](_0x39d1e3[_0x1d5b05(0x366)] || ''); + if (_0x39d1e3[_0x1d5b05(0x20d)]) { + const _0x2ff516 = parseUrlMap[_0x1d5b05(0x24f)](_0x2f80cc) || []; + !_0x2ff516[_0x1d5b05(0x39f)](_0x39d1e3[_0x1d5b05(0x20d)]) && _0x2ff516[_0x1d5b05(0x332)](_0x39d1e3[_0x1d5b05(0x20d)]), parseUrlMap[_0x1d5b05(0x396)](_0x2f80cc, _0x2ff516); + } + } + } else { + if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x222)])) { + const _0x37e2c6 = _0x17eead[_0x1d5b05(0x339)] || {}; + _0x47b9eb[_0x1d5b05(0x3c3)] = _0x37e2c6[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x37e2c6[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x37e2c6[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x37e2c6[_0x1d5b05(0x311)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x37e2c6[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x37e2c6[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x37e2c6[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x37e2c6[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x37e2c6[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x37e2c6[_0x1d5b05(0x227) + 't'] || ''; + if (_0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)] && Array[_0x1d5b05(0x315)](_0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)])) + for (const _0x1f9806 of _0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)]) { + let _0x292c57 = _0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x3cb)]?.[_0x1d5b05(0x314)]() || _0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x211)]?.[_0x1d5b05(0x314)]() || ''; + if (!_0x292c57) + continue; + _0x182550[_0x1d5b05(0x332)](_0x292c57), _0x15a66c[_0x1d5b05(0x332)](_0x1f9806[_0x1d5b05(0x366)] || ''); + try { + const _0x4a4bc9 = parseUrlMap[_0x1d5b05(0x24f)](_0x292c57) || []; + if (_0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x213)]) { + const _0x3dac95 = _0x1f9806[_0x1d5b05(0x377) + 'o'][_0x1d5b05(0x213)][_0x1d5b05(0x265)](','); + _0x3dac95[_0x1d5b05(0x1e6)](_0x4dc07e => { + const _0x404f67 = _0x1d5b05; + _0x4dc07e && !_0x4a4bc9[_0x404f67(0x39f)](_0x4dc07e) && _0x4a4bc9[_0x404f67(0x332)](_0x4dc07e); + }); + } + if (_0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x32d)]) { + const _0x57c8f0 = _0x1f9806[_0x1d5b05(0x377) + 'o'][_0x1d5b05(0x32d)][_0x1d5b05(0x265)](','); + _0x57c8f0[_0x1d5b05(0x1e6)](_0x522ba3 => { + const _0x5f1935 = _0x1d5b05; + _0x522ba3 && !_0x4a4bc9[_0x5f1935(0x39f)](_0x522ba3) && _0x4a4bc9[_0x5f1935(0x332)](_0x522ba3); + }); + } + parseUrlMap[_0x1d5b05(0x396)](_0x292c57, _0x4a4bc9); + } catch (_0x35c48f) { + SpiderDebug[_0x1d5b05(0x24a)](_0x35c48f); + } + } + } else { + if (urlPattern1[_0x1d5b05(0x36e)](_0x2a68f0)) { + const _0x6e5bc5 = _0x17eead[_0x1d5b05(0x394)] && _0x17eead[_0x1d5b05(0x394)][0x1448 + -0x19fc + -0x1 * -0x5b4] ? _0x17eead[_0x1d5b05(0x394)][-0x704 * -0x5 + 0x29 * -0xb5 + -0x617 * 0x1] : {}; + _0x47b9eb[_0x1d5b05(0x3c3)] = _0x6e5bc5[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x6e5bc5[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x6e5bc5[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x6e5bc5[_0x1d5b05(0x37d)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x6e5bc5[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x6e5bc5[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x6e5bc5[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x6e5bc5[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x6e5bc5[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x6e5bc5[_0x1d5b05(0x227) + 't'] || '', _0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x6e5bc5[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] || '', _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x6e5bc5[_0x1d5b05(0x3a0) + 'rl'] || ''; + } + } + } + _0x37e1eb[_0x1d5b05(0x30d)](_0x182550[_0x1d5b05(0x2d3)], -0x417 * 0x9 + -0x2472 + 0x186b * 0x3) && _0x37e1eb[_0x1d5b05(0x30d)](_0x15a66c[_0x1d5b05(0x2d3)], -0x1bc * 0x15 + -0x26b8 + 0x4b24) && (_0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x182550[_0x1d5b05(0x365)](_0x37e1eb[_0x1d5b05(0x2be)]), _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x15a66c[_0x1d5b05(0x365)](_0x37e1eb[_0x1d5b05(0x2be)])); +} +function jsonParse(_0x2bcad8, _0x2e7bc8) { + const _0x4a9b6b = _0x24a000, _0x54fefc = { + 'glzca': _0x4a9b6b(0x339), + 'SXiUp': function (_0x5d899b, _0x8ff4ce) { + return _0x5d899b === _0x8ff4ce; + }, + 'mqFNW': _0x4a9b6b(0x345), + 'hXQXU': _0x4a9b6b(0x366), + 'qaLZN': function (_0x304f89, _0x4f96a0) { + return _0x304f89 + _0x4f96a0; + }, + 'SyFuQ': _0x4a9b6b(0x1fd), + 'wWTGM': _0x4a9b6b(0x292), + 'opiXu': function (_0x16486e, _0x45288d) { + return _0x16486e(_0x45288d); + }, + 'GMucY': function (_0x55cf35, _0x5b1ec7, _0x56a7e3) { + return _0x55cf35(_0x5b1ec7, _0x56a7e3); + }, + 'VVWwW': _0x4a9b6b(0x2e3), + 'zMWEf': _0x4a9b6b(0x310), + 'fuDvD': _0x4a9b6b(0x255), + 'AAtXX': _0x4a9b6b(0x39e), + 'Ojjqt': _0x4a9b6b(0x2cb), + 'rrjLd': _0x4a9b6b(0x261), + 'xjYPA': function (_0x138833, _0x134ff4) { + return _0x138833 > _0x134ff4; + }, + 'UZCOD': _0x4a9b6b(0x2e4), + 'PeDZZ': _0x4a9b6b(0x287), + 'cCmOD': function (_0xe7c3fe, _0x6c71de) { + return _0xe7c3fe > _0x6c71de; + }, + 'clYHp': function (_0x34da34, _0x278ac6) { + return _0x34da34 + _0x278ac6; + }, + 'ZrFqI': function (_0x57a7fe, _0x1920c9, _0x45bdb2, _0x4ed88c) { + return _0x57a7fe(_0x1920c9, _0x45bdb2, _0x4ed88c); + } + }; + try { + let _0x654842 = JSON[_0x4a9b6b(0x213)](_0x2e7bc8); + _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x32f)]) && _0x54fefc[_0x4a9b6b(0x27d)](typeof _0x654842[_0x4a9b6b(0x339)], _0x54fefc[_0x4a9b6b(0x325)]) && !_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x1e8)]) && (_0x654842 = _0x654842[_0x4a9b6b(0x339)]); + let _0x100c47 = _0x654842[_0x4a9b6b(0x366)]; + _0x100c47[_0x4a9b6b(0x2c6)]('//') && (_0x100c47 = _0x54fefc[_0x4a9b6b(0x2eb)](_0x54fefc[_0x4a9b6b(0x245)], _0x100c47)); + if (!_0x100c47[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2c6)](_0x54fefc[_0x4a9b6b(0x322)])) + return null; + if (_0x54fefc[_0x4a9b6b(0x27d)](_0x100c47, _0x2bcad8)) { + if (_0x54fefc[_0x4a9b6b(0x3b8)](isVip, _0x100c47) || !_0x54fefc[_0x4a9b6b(0x3b8)](isVideoFormat, _0x100c47)) + return null; + } + if (_0x54fefc[_0x4a9b6b(0x22e)](isBlackVodUrl, _0x2bcad8, _0x100c47)) + return null; + let _0xcda3cd = {}; + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x224)])) + _0xcda3cd = _0x654842[_0x4a9b6b(0x2e3)]; + else { + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x29e)])) + _0xcda3cd = _0x654842[_0x4a9b6b(0x310)]; + else { + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x3ca)])) + _0xcda3cd = _0x654842[_0x4a9b6b(0x255)]; + else + _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x39a)]) && (_0xcda3cd = _0x654842[_0x4a9b6b(0x39e)]); + } + } + let _0x2e9070 = ''; + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x3b9)])) + _0x2e9070 = _0x654842[_0x54fefc[_0x4a9b6b(0x3b9)]]; + else + _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x2a4)]) && (_0x2e9070 = _0x654842[_0x54fefc[_0x4a9b6b(0x2a4)]]); + _0x54fefc[_0x4a9b6b(0x25a)](_0x2e9070[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2d3)], -0x60f * 0x1 + 0x12 * -0x164 + 0x7 * 0x471) && (_0xcda3cd[_0x54fefc[_0x4a9b6b(0x2a4)]] = _0x54fefc[_0x4a9b6b(0x2eb)]('\x20', _0x2e9070)); + let _0x530de6 = ''; + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x297)])) + _0x530de6 = _0x654842[_0x4a9b6b(0x2e4)]; + else + _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x207)]) && (_0x530de6 = _0x654842[_0x4a9b6b(0x287)]); + _0x54fefc[_0x4a9b6b(0x281)](_0x530de6[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2d3)], 0x18ce + -0x22ae + 0x9e0) && (_0xcda3cd[_0x54fefc[_0x4a9b6b(0x207)]] = _0x54fefc[_0x4a9b6b(0x1f4)]('\x20', _0x530de6)); + _0xcda3cd = _0x54fefc[_0x4a9b6b(0x243)](fixJsonVodHeader, _0xcda3cd, _0x2bcad8, _0x100c47); + const _0x27e9a5 = { + 'header': _0xcda3cd, + 'url': _0x100c47, + 'parse': '0' + }; + return _0x27e9a5; + } catch (_0x174821) { + SpiderDebug[_0x4a9b6b(0x24a)](_0x174821); + } + return null; +} +function isVip(_0x12df4f) { + const _0x1cd01d = _0x24a000, _0x2ec382 = { + 'updKI': _0x1cd01d(0x2c9), + 'XOpkJ': _0x1cd01d(0x3a6), + 'iOaGQ': _0x1cd01d(0x306), + 'uIZrh': _0x1cd01d(0x2f6), + 'maOml': _0x1cd01d(0x21e), + 'kJixo': _0x1cd01d(0x2a6), + 'UgQzk': _0x1cd01d(0x31d), + 'zyeHF': _0x1cd01d(0x22c), + 'GPmSe': _0x1cd01d(0x282) + 'om', + 'HIEhJ': _0x1cd01d(0x318) + 'm', + 'SvZuD': _0x1cd01d(0x2fe), + 'SaoFF': function (_0x49391c, _0x475da1) { + return _0x49391c < _0x475da1; + }, + 'dhhxf': function (_0x4f647c, _0x40da9b) { + return _0x4f647c === _0x40da9b; + }, + 'SSpmn': _0x1cd01d(0x3c9) + 'a_', + 'SajNK': _0x1cd01d(0x3c9) + 'w_', + 'IKQGq': _0x1cd01d(0x3c9) + 'v_' + }; + try { + let _0x59a0c5 = ![]; + const _0x472579 = new URL(_0x12df4f)[_0x1cd01d(0x3b4)], _0x39662c = [ + _0x2ec382[_0x1cd01d(0x21c)], + _0x2ec382[_0x1cd01d(0x385)], + _0x2ec382[_0x1cd01d(0x38b)], + _0x2ec382[_0x1cd01d(0x34b)], + _0x2ec382[_0x1cd01d(0x2c0)], + _0x2ec382[_0x1cd01d(0x1f8)], + _0x2ec382[_0x1cd01d(0x26c)], + _0x2ec382[_0x1cd01d(0x2c3)], + _0x2ec382[_0x1cd01d(0x3c7)], + _0x2ec382[_0x1cd01d(0x2dd)], + _0x2ec382[_0x1cd01d(0x391)] + ]; + for (let _0x587e2f = 0x1168 * -0x1 + -0x2 * -0xffa + -0xe8c; _0x2ec382[_0x1cd01d(0x29f)](_0x587e2f, _0x39662c[_0x1cd01d(0x2d3)]); _0x587e2f++) { + if (_0x472579[_0x1cd01d(0x39f)](_0x39662c[_0x587e2f])) { + if (_0x2ec382[_0x1cd01d(0x358)](_0x39662c[_0x587e2f], _0x2ec382[_0x1cd01d(0x21c)])) { + if (_0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x267)]) || _0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x33a)]) || _0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x333)])) { + _0x59a0c5 = !![]; + break; + } + } else { + _0x59a0c5 = !![]; + break; + } + } + } + return _0x59a0c5; + } catch (_0x576cf8) { + SpiderDebug[_0x1cd01d(0x24a)](_0x576cf8); + } + return ![]; +} +function isBlackVodUrl(_0x307605, _0x697c5d) { + const _0x4a2c61 = _0x24a000, _0x27d7bc = { + 'gudMv': _0x4a2c61(0x2ad), + 'FRrZt': _0x4a2c61(0x3be) + }; + return _0x697c5d[_0x4a2c61(0x39f)](_0x27d7bc[_0x4a2c61(0x34c)]) || _0x697c5d[_0x4a2c61(0x39f)](_0x27d7bc[_0x4a2c61(0x210)]); +} +function fixJsonVodHeader(_0x194079, _0x3e179a, _0x56db4f) { + const _0x555e90 = _0x24a000, _0x3e9dd1 = { + 'GlESc': function (_0x2d4a85, _0x14b753) { + return _0x2d4a85 === _0x14b753; + }, + 'dixTK': _0x555e90(0x2b1) + 'om', + 'owLGb': _0x555e90(0x287), + 'UKmVu': _0x555e90(0x261), + 'wLZlp': _0x555e90(0x1fe) + '.0', + 'yLRcH': _0x555e90(0x342), + 'hhBdZ': _0x555e90(0x2f4), + 'jIZRt': _0x555e90(0x2fb) + _0x555e90(0x2d6) + _0x555e90(0x22f), + 'AQtGT': function (_0x35b12f, _0x2200a0) { + return _0x35b12f + _0x2200a0; + }, + 'tVGhB': _0x555e90(0x3b0) + _0x555e90(0x21d) + _0x555e90(0x2ae) + _0x555e90(0x26d) + _0x555e90(0x24e) + _0x555e90(0x37a) + _0x555e90(0x206) + _0x555e90(0x3c4) + _0x555e90(0x20e) + _0x555e90(0x360) + _0x555e90(0x38c) + _0x555e90(0x2e7) + }; + _0x3e9dd1[_0x555e90(0x326)](_0x194079, null) && (_0x194079 = {}); + if (_0x3e179a[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x260)])) + _0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = '\x20', _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x29b)]; + else { + if (_0x56db4f[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x30b)])) + _0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = '\x20', _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x29b)]; + else + _0x3e179a[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x27a)]) && (_0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = _0x3e9dd1[_0x555e90(0x209)], _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x335)]('\x20', _0x3e9dd1[_0x555e90(0x363)])); + } + return _0x194079; +} +const snifferMatch = /http((?!http).){26,}?\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\?.*|http((?!http).){26,}\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){26,}\/m3u8\?pt=m3u8.*|http((?!http).)*?default\.ixigua\.com\/.*|http((?!http).)*?cdn-tos[^\?]*|http((?!http).)*?\/obj\/tos[^\?]*|http.*?\/player\/m3u8play\.php\?url=.*|http.*?\/player\/.*?[pP]lay\.php\?url=.*|http.*?\/playlist\/m3u8\/\?vid=.*|http.*?\.php\?type=m3u8&.*|http.*?\/download.aspx\?.*|http.*?\/api\/up_api.php\?.*|https.*?\.66yk\.cn.*|http((?!http).)*?netease\.com\/file\/.*/; +function isVideoFormat(_0x5515b3) { + const _0xf7bf44 = _0x24a000, _0x2fce53 = { + 'HdgCs': _0xf7bf44(0x3b7), + 'iPFTd': _0xf7bf44(0x1ef) + }; + if (snifferMatch[_0xf7bf44(0x36e)](_0x5515b3)) + return !_0x5515b3[_0xf7bf44(0x39f)](_0x2fce53[_0xf7bf44(0x309)]) || !_0x5515b3[_0xf7bf44(0x39f)](_0x2fce53[_0xf7bf44(0x1ee)]); + return ![]; +} +function isVideo(_0x507319) { + const _0x1fc38a = _0x24a000, _0x2030df = { + 'zjKSG': _0x1fc38a(0x350), + 'omoGP': _0x1fc38a(0x35c) + }; + return !_0x507319[_0x1fc38a(0x39f)](_0x2030df[_0x1fc38a(0x357)]) && !_0x507319[_0x1fc38a(0x39f)](_0x2030df[_0x1fc38a(0x248)]); +} +function UA(_0x59c882) { + const _0x1c26ca = _0x24a000, _0x800c4e = { + 'KVRHH': _0x1c26ca(0x343), + 'FVRLu': _0x1c26ca(0x286) + '.0', + 'dZwJv': _0x1c26ca(0x3b0) + _0x1c26ca(0x21d) + _0x1c26ca(0x2ae) + _0x1c26ca(0x26d) + _0x1c26ca(0x24e) + _0x1c26ca(0x37a) + _0x1c26ca(0x206) + _0x1c26ca(0x3c4) + _0x1c26ca(0x20e) + _0x1c26ca(0x360) + _0x1c26ca(0x38c) + _0x1c26ca(0x2e7) + }; + if (_0x59c882[_0x1c26ca(0x39f)](_0x800c4e[_0x1c26ca(0x289)])) + return _0x800c4e[_0x1c26ca(0x39c)]; + return _0x800c4e[_0x1c26ca(0x305)]; +} +function getCateUrl(_0x23db0c) { + const _0x49974e = _0x24a000, _0x37953d = { + 'ECjej': _0x49974e(0x27c) + 'p', + 'sFIgg': _0x49974e(0x25c), + 'TJcyc': function (_0xdc8f68, _0x11b1f5) { + return _0xdc8f68 + _0x11b1f5; + }, + 'BxtWY': _0x49974e(0x2c4), + 'tMugk': _0x49974e(0x343), + 'YouNd': function (_0x4b91da, _0x11cfe1) { + return _0x4b91da + _0x11cfe1; + }, + 'GRdgl': _0x49974e(0x367) + }; + if (_0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x2d0)]) || _0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x29c)])) + return _0x37953d[_0x49974e(0x235)](_0x23db0c, _0x37953d[_0x49974e(0x33c)]); + else + return _0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x32e)]) ? _0x37953d[_0x49974e(0x236)](_0x23db0c, _0x37953d[_0x49974e(0x381)]) : ''; +} +function getPlayUrlPrefix(_0x5ee424) { + const _0x1bf8f8 = _0x24a000, _0x598264 = { + 'FSokj': _0x1bf8f8(0x27c) + 'p', + 'FPdLA': _0x1bf8f8(0x25c), + 'JQGUp': function (_0xdfc607, _0x448366) { + return _0xdfc607 + _0x448366; + }, + 'ToKis': _0x1bf8f8(0x348) + _0x1bf8f8(0x2a7), + 'NaZIK': _0x1bf8f8(0x343), + 'hggTv': function (_0x4737db, _0x8a0e91) { + return _0x4737db + _0x8a0e91; + }, + 'rcDwJ': _0x1bf8f8(0x30f) + _0x1bf8f8(0x22b) + }; + if (_0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x323)]) || _0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x2a2)])) + return _0x598264[_0x1bf8f8(0x299)](_0x5ee424, _0x598264[_0x1bf8f8(0x3b5)]); + else + return _0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x21b)]) ? _0x598264[_0x1bf8f8(0x2de)](_0x5ee424, _0x598264[_0x1bf8f8(0x398)]) : ''; +} +function getRecommendUrl(_0x80e8f1) { + const _0x43bed3 = _0x24a000, _0x5b36fd = { + 'TOllB': _0x43bed3(0x27c) + 'p', + 'PVTeb': _0x43bed3(0x25c), + 'zyflE': function (_0x5b4b9d, _0x36c3c2) { + return _0x5b4b9d + _0x36c3c2; + }, + 'ijImY': _0x43bed3(0x268) + _0x43bed3(0x31b), + 'EfLao': _0x43bed3(0x343), + 'Sebfw': function (_0x1c1df5, _0x470f1b) { + return _0x1c1df5 + _0x470f1b; + }, + 'SdUcg': _0x43bed3(0x291) + }; + if (_0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x354)]) || _0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x2ca)])) + return _0x5b36fd[_0x43bed3(0x2b0)](_0x80e8f1, _0x5b36fd[_0x43bed3(0x336)]); + else + return _0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x23b)]) ? _0x5b36fd[_0x43bed3(0x3b1)](_0x80e8f1, _0x5b36fd[_0x43bed3(0x2b4)]) : ''; +} +function _0x30bd() { + const _0x2b0aa4 = [ + 'Rhngk', + '0\x20(Macinto', + 'nqoHH', + 'Udbgi', + 'VVWwW', + 'vod_url_wi', + 'comic+4K=m', + 'vod_conten', + 'vod_area', + 'bkKAx', + '分类+全部=+电影=', + 'd_id=', + 'acfun.cn', + '分类接口错误:', + 'GMucY', + 'i.com/', + '?ac=detail', + 'hQLKD', + 'UKmVu', + 'Uqurg', + '11bSKqkq', + 'TJcyc', + 'YouNd', + '&pg=1', + 'fuavN', + 'Zelfl', + '+2008+2007', + 'EfLao', + 'limit', + 'vod_actor', + 'XhjKd', + 'ist&t=', + 'gINFD', + '?ac=list&z', + '匪+犯罪+动画+奇幻', + 'ZrFqI', + 'sh;\x20Intel\x20', + 'SyFuQ', + '6057730KXKKrO', + 'nAAlp', + 'omoGP', + '+2024+2023', + 'log', + 'zlCKO', + '?type=', + '10ifJwJp', + ')\x20AppleWeb', + 'get', + '?wd=', + 'th_player', + 'nDVeB', + 'MJeua', + 'nFrDW', + 'headers', + 'area', + 'tvplay+综艺=', + 'state', + 'indexOf', + 'xjYPA', + 'lass=', + 'xgapp', + 'search?tex', + 'mWrNJ', + 'axNZh', + 'dixTK', + 'User-Agent', + 'eXwPu', + 'pg=#PN#', + 'ome/91.0.4', + 'split', + 'AdIkD', + 'SSpmn', + 'index_vide', + 'okhttp/3.1', + '+2016+2015', + '&page=#PN#', + 'UgQzk', + 'Win64;\x20x64', + 'RZVZb', + 'rAAqR', + 'FMcfW', + 'qhbab', + 'qvaVO', + 'fBrnR', + 'ts+评分=scor', + 'vqyhb', + 'uUBbz', + 'SKgeb', + 'tvshow+动漫=', + 'FEuLQ', + 'hhBdZ', + 'lang', + 'api.php/ap', + 'SXiUp', + 'rQSdz', + 'OdHdL', + 'bkfnv', + 'cCmOD', + 'bilibili.c', + 'uzruO', + '+2006+2005', + 'AEWJN', + 'okhttp/4.1', + 'Referer', + '/vod', + 'KVRHH', + '大+其他\x0a筛选yea', + 'fcPwA', + 'gHEas', + 'rfYvZ', + 'ist&wd=', + 'KqkGD', + 'vod_pic', + '/vodPhbAll', + 'http', + 'UlRrv', + 'PPjsc', + '9IUFsEu', + '+2012+2011', + 'UZCOD', + 'xVjfI', + 'JQGUp', + 'WodPN', + 'wLZlp', + 'sFIgg', + '+大陆+香港+台湾+', + 'zMWEf', + 'SaoFF', + 'qrmQn', + 'Qzbyi', + 'FPdLA', + 'emPiw', + 'rrjLd', + 'QIbLN', + 'mgtv.com', + 'il?id=', + 'ovie_4k+体育', + 'HHuLq', + '+农村+惊悚+惊悚+', + '=tiyu\x0a筛选cl', + 'vod_list', + '973973.xyz', + '\x20NT\x2010.0;\x20', + '=1&area=&t', + 'zyflE', + 'www.mgtv.c', + '+2000', + 'IWfGL', + 'SdUcg', + '科幻+剧情+战争+警', + 'umjti', + '+2018+2017', + 'vod_name', + 'eCaVc', + 'nvSRb', + 'fkHDy', + 'raJIH', + '&pg=', + 'Xavsg', + 'xaxYD', + 'maOml', + 'cchWu', + 'class&star', + 'zyeHF', + 'nav?token=', + 'wovvt', + 'startsWith', + 'VeDky', + '$$$', + 'iqiyi.com', + 'PVTeb', + 'user-agent', + 'lpEGG', + 'vod_direct', + 'pagecount', + '/provide/v', + 'ECjej', + 'https://ji', + 'OIKvw', + 'length', + 'vlist', + 'fari/537.3', + 'ww.bilibil', + 'ea&type=筛选', + 'Mac\x20OS\x20X\x201', + 'QDURc', + '伦理+情色+福利+三', + 'y=c87681c9', + '筛选area&lan', + 'HIEhJ', + 'hggTv', + 'oRses', + '+爱情+恐怖+动作+', + '2.11', + 'jIVVu', + 'header', + 'referer', + 'replace', + 'video?tid=', + '37.36', + 'YTcha', + 'type_exten', + '筛选area+全部=', + 'qaLZN', + '3d5e430cac', + 'znjdK', + 'bfaLF', + 'IKCWR', + 'g=筛选lang&y', + 'QZvys', + 'erty', + 'fIzpG', + 'bilibili', + '4oTuTQS', + 'le.com', + 'vod_play_l', + 'zMZmQ', + 'class', + '472.114\x20Sa', + '\x20https://w', + 'it=18&page', + 'PzBoQ', + 'pptv.com', + 'JpyoV', + 'GGHOc', + 'OvREh', + 'AsjQf', + 'UwOqb', + '1aa5&url=', + 'dZwJv', + 'youku.com', + 'ofHAn', + 'ulXQF', + 'HdgCs', + 'HUsMa', + 'yLRcH', + 'XjiyL', + 'TVfJB', + 'zFyTh', + '/detail?vo', + 'Header', + 'vod_class', + '+2010+2009', + 'IFEDw', + 'trim', + 'isArray', + 'eXDqH', + 'TmtUN', + 'baofeng.co', + 'KRVeJ', + '537.36\x20(KH', + 'o?token=', + 'IpeiC', + 'sohu.com', + 'wpdZs', + '+2014+2013', + 'rDTqC', + 'WNSZb', + 'wWTGM', + 'FSokj', + '?ac=videol', + 'mqFNW', + 'GlESc', + 'EsiSO', + 'fUjyK', + '+2002+2001', + 'ghVBe', + 'mEBLG', + 'vod_year', + 'parse2', + 'tMugk', + 'glzca', + 'code', + '+2022+2021', + 'push', + 'IKQGq', + 'ViinS', + 'AQtGT', + 'ijImY', + 'host', + 'ext', + 'data', + 'SajNK', + 'MAPTF', + 'BxtWY', + 'floor', + 'xIeyb', + 'fmHZd', + 'ear=筛选year', + 'exi.jdyx.p', + 'titan.mgtv', + '.vod', + 'hPgPi', + 'object', + 'vod_remark', + 'MWcjN', + 'video_deta', + 'ro/api/?ke', + '11069064LnYXCB', + 'uIZrh', + 'gudMv', + 'vod_play_f', + 'VoCNI', + '美国+英国+法国+日', + '.mp4', + 'stype', + ' { + const _0x53867c = _0x4dd129, _0x8beb43 = { + 'TSUgZ': function (_0x52410f, _0x64397c) { + const _0x2a0b08 = _0x3bf3; + return _0x1bb544[_0x2a0b08(0x275)](_0x52410f, _0x64397c); + }, + 'FMcfW': _0x1bb544[_0x53867c(0x303)], + 'OvREh': function (_0x17e635, _0x1e79bc) { + const _0x2b8dff = _0x53867c; + return _0x1bb544[_0x2b8dff(0x3aa)](_0x17e635, _0x1e79bc); + }, + 'RZVZb': function (_0x2aff9c, _0x16add9, _0x39fb37, _0x56dec0) { + const _0x399614 = _0x53867c; + return _0x1bb544[_0x399614(0x380)](_0x2aff9c, _0x16add9, _0x39fb37, _0x56dec0); + } + }; + try { + const _0x5b9b85 = _0x2c154b[_0x4410f9]; + _0x1bb544[_0x53867c(0x20f)](_0x4410f9, _0x4dc412) && Array[_0x53867c(0x315)](_0x5b9b85) && _0xe7aee[_0x53867c(0x332)](_0x5b9b85), _0x1bb544[_0x53867c(0x20f)](typeof _0x5b9b85, _0x1bb544[_0x53867c(0x303)]) && _0x1bb544[_0x53867c(0x1f0)](_0x5b9b85, null) && (Array[_0x53867c(0x315)](_0x5b9b85) ? _0x5b9b85[_0x53867c(0x1e6)](_0xce021c => { + const _0x7a8860 = _0x53867c; + _0x8beb43[_0x7a8860(0x3bc)](typeof _0xce021c, _0x8beb43[_0x7a8860(0x270)]) && _0x8beb43[_0x7a8860(0x301)](_0xce021c, null) && _0x8beb43[_0x7a8860(0x26e)](findJsonArray, _0xce021c, _0x4dc412, _0xe7aee); + }) : _0x1bb544[_0x53867c(0x380)](findJsonArray, _0x5b9b85, _0x4dc412, _0xe7aee)); + } catch (_0x161cd2) { + SpiderDebug[_0x53867c(0x24a)](_0x161cd2); + } + }); +} +function jsonArr2Str(_0x2ac5a3) { + const _0x171e1b = _0x24a000, _0x3f6d96 = { + 'IFEDw': function (_0x584b3a, _0x1079df) { + return _0x584b3a < _0x1079df; + } + }, _0x36becd = []; + for (let _0x29367c = -0x1 * -0x1987 + 0x1 * -0x1323 + -0x664; _0x3f6d96[_0x171e1b(0x313)](_0x29367c, _0x2ac5a3[_0x171e1b(0x2d3)]); _0x29367c++) { + try { + _0x36becd[_0x171e1b(0x332)](_0x2ac5a3[_0x29367c]); + } catch (_0x3e4b7e) { + SpiderDebug[_0x171e1b(0x24a)](_0x3e4b7e); + } + } + return _0x36becd[_0x171e1b(0x365)](','); +} +function getHeaders(_0x2dbbbb) { + const _0x690d7 = _0x24a000, _0x11947b = { + 'OdHdL': _0x690d7(0x261), + 'VeDky': function (_0x4325bb, _0x1c5140) { + return _0x4325bb(_0x1c5140); + } + }, _0x24e5fe = {}; + return _0x24e5fe[_0x11947b[_0x690d7(0x27f)]] = _0x11947b[_0x690d7(0x2c7)](UA, _0x2dbbbb), _0x24e5fe; +} +function isJsonString(_0x52901c) { + const _0x44dab5 = _0x24a000; + try { + JSON[_0x44dab5(0x213)](_0x52901c); + } catch (_0x568d34) { + return ![]; + } + return !![]; +} +export function __jsEvalReturn() { + return { + 'init': init, + 'home': home, + 'homeVod': homeVod, + 'category': category, + 'detail': detail, + 'play': play, + 'search': search + }; +} \ No newline at end of file diff --git a/cpu_iy3/lib/jhdj.js b/cpu_iy3/lib/jhdj.js new file mode 100644 index 00000000..0ad0959d --- /dev/null +++ b/cpu_iy3/lib/jhdj.js @@ -0,0 +1,1669 @@ +/* +@header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '聚合短剧', + lang: 'cat' +}) +*/ + +import { Crypto as CryptoJS } from 'assets://js/lib/cat.js'; + +let debug = 1; +let siteName = '聚合短剧'; +let xingya_headers = {}; +let niuniu_headers = {}; +let niuniu_token = ''; +let niuniu_access_token = ''; +let hema_headers = {}; + +// 搜索缓存 +const searchCache = new Map(); +const CACHE_TTL = 5 * 60 * 1000; + +// 分类排除规则 +const cate_remove = ['分类排除', '软鸭', '碎片', '锦鲤', '番茄', '甜圈']; +const UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36"; + +const aggConfig = { + keys: 'd3dGiJc651gSQ8w1', + searchLimit: 20, + searchTimeout: 8000, + charMap: { + '+': 'P', '/': 'X', '0': 'M', '1': 'U', '2': 'l', '3': 'E', '4': 'r', '5': 'Y', '6': 'W', '7': 'b', '8': 'd', '9': 'J', + 'A': '9', 'B': 's', 'C': 'a', 'D': 'I', 'E': '0', 'F': 'o', 'G': 'y', 'H': '_', 'I': 'H', 'J': 'G', 'K': 'i', 'L': 't', + 'M': 'g', 'N': 'N', 'O': 'A', 'P': '8', 'Q': 'F', 'R': 'k', 'S': '3', 'T': 'h', 'U': 'f', 'V': 'R', 'W': 'q', 'X': 'C', + 'Y': '4', 'Z': 'p', 'a': 'm', 'b': 'B', 'c': 'O', 'd': 'u', 'e': 'c', 'f': '6', 'g': 'K', 'h': 'x', 'i': '5', 'j': 'T', + 'k': '-', 'l': '2', 'm': 'z', 'n': 'S', 'o': 'Z', 'p': '1', 'q': 'V', 'r': 'v', 's': 'j', 't': 'Q', 'u': '7', 'v': 'D', + 'w': 'w', 'x': 'n', 'y': 'L', 'z': 'e' + }, + headers: { + json: { 'User-Agent': 'okhttp/4.10.0', 'Content-Type': 'application/json' }, + form: { 'User-Agent': 'okhttp/4.10.0', 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }, + niuniu: { 'Cache-Control': 'no-cache', 'Content-Type': 'application/json;charset=UTF-8', 'User-Agent': 'okhttp/4.12.0' }, + baidu: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': UA }, + hema: { + 'datas': 'e5f22c6e2c82fe001738cb9ce4696eab0556d064a55aef402e0fbe6b29a083f6538e4567de38e67de2071a49d9751526bfba45314e1fd4702b11c76ab9a3b5f873262854ba66e6715ed51364dbc6ee62c7180e047fcbcdbfd49874fc8f28674b16d90ca71a02de76c70598e0b75e647c37c2c19287e49be5f2a259d727dfc4df3d28802388bf3c356576b342e17e30a2ab74859263dba4d1c8eba79990d22d60d60927fdacb2addf2f0eaadd8887585ca2eb87f603faf0c207dda18cf67dc25b2199d303baff9e6605b3314a7d2631f62864f48619daceb9452f2b7b0667773553741856df030cca68af3c57810f983d452bb428ef5fc32206aef4865ae06c629bee7f5135547304acc7ef4e7c6df887308f2e79c493fd2ee03488722861b5bb51b09cb8911dfc92c288d94e601c066d2f9d612ad2c8d4eeb4920b1d44aff3e13fd75229b857f64925df1cf12f75a00d438c422ec1726462b915903f1dd1f4bb7cdf82cc15a6d507f80c789903e710f39a62aef073f3f93a6c681e75d295428aa290d7e98f82e7e9ad6e2b23d9086dfe8c63c5d8550b13fd61a77291473a8bdd43c7c2639f264be69d9d07f0585de4342a399275a64e7d1d4400b8ed4421a2f289f622e40cdd1cfc916a0b9ce747c924ac33e32d24b91ed5d64772d6ad6896412f52724006eabf12aaecfd6e81dad432c7b3800bbf793a1c375e3e7b4fb3b097724b5fc88a8c9bcf3dbc10cbdb252965', + 'Content-Type': 'text/plain' + }, + haokan: { + 'User-Agent': UA, + 'Talos-Module-Name': 'shortDrama', + 'Talos-Module-Version': '1.0.71.1', + 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', + 'Cookie': 'BAIDUCUID=giHCu0azv80G8SfQ0avU8gaaH8jfiv86ju2MugiR2i8-k3a35avAa1_mA' + } + } +}; + +// ==================== URL配置 ==================== +const rule = { + 百度: { + host: 'https://mbd.baidu.com', + detailHost: 'https://sv.baidu.com', + list: '/feedapi/v1/videoserver/playlets/list?service=bdbox', + search: '/feedapi/v1/videoserver/playlets/search?service=bdbox', + detail: '/haokan/ui-video/playlet/rec/detail?log=vhk&tn=1020970b&ctn=1008350n&blur=1', + play: '/appui/api?cmd=video/relate&log=vhk&tn=1020970b&ctn=1008350n&blur=1' + }, + 七猫: { + host: 'https://api-store.qmplaylet.com', + list: '/api/v1/playlet/index', + detail: 'https://api-read.qmplaylet.com/player/api/v1/playlet/info', + search: '/api/v1/playlet/search' + }, + 星芽: { + host: 'https://app.whjzjx.cn', + list: '/cloud/v2/theater/home_page?theater_class_id', + detail: '/v2/theater_parent/detail', + search: '/v3/search', + login: 'https://u.shytkjgs.com/user/v1/account/login' + }, + 西饭: { + host: 'https://xifan-api-cn.youlishipin.com', + list: '/xifan/drama/portalPage', + detail: '/xifan/drama/getDuanjuInfo', + search: '/xifan/search/getSearchList' + }, + 牛牛: { + host: 'https://new.tianjinzhitongdaohe.com', + list: '/api/v1/app/screen/screenMovie', + detail: '/api/v1/app/play/movieDetails', + search: '/api/v1/app/search/searchMovie', + desc: '/api/v1/app/play/movieDesc', + visitor: '/api/v1/app/user/visitorInfo', + login: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/user/login?siteid=5627189', + detail2: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/shortplay/detail?siteid=5627189', + unlock: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/pay/ad_unlock?siteid=5627189' + }, + 围观: { + host: 'https://api.drama.9ddm.com', + list: '/drama/home/shortVideoTags?version_code=1500&os_type=1', + detail: '/drama/home/shortVideoDetail?version_code=1500&os_type=1', + search: '/drama/home/search?version_code=1500&os_type=1' + }, + 河马: { + host: 'https://freevideo.zqqds.cn', + list: '/free-video-portal/portal/1121', + detail: '/free-video-portal/portal/1131', + episode: '/free-video-portal/portal/1132', + play: '/free-video-portal/portal/1133', + search: '/free-video-portal/portal/1803' + }, + 星星: { + host: 'http://read.api.duodutek.com', + list: '/novel-api/app/pageModel/getResourceById', + detail: '/novel-api/basedata/book/getChapterList' + }, + 好看: { + host: 'https://sv.baidu.com', + list: '/haokan/ui-feed/playletTagsFeed?osbranch=a0', + home: '/haokan/ui-feed/playletShelfFeed?osbranch=a0', + detail_list: '/appui/api?osbranch=a0', + detail: '/haokan/ui-video/playlet/rec/detail?osbranch=a0', + play: '/appui/api?osbranch=a0', + search: '/haokan/ui-interact/playlet/search/sugs?osbranch=a0' + } +}; + +const platformList = [ + { name: '百度短剧', id: '百度' }, + { name: '七猫短剧', id: '七猫' }, + { name: '星芽短剧', id: '星芽' }, + { name: '西饭短剧', id: '西饭' }, + { name: '牛牛短剧', id: '牛牛' }, + { name: '围观短剧', id: '围观' }, + { name: '河马短剧', id: '河马' }, + { name: '星星短剧', id: '星星' }, + { name: '好看短剧', id: '好看' } +]; + +const ruleFilterDef = { + 百度: { area: '新剧' }, + 七猫: { area: '0' }, + 星芽: { area: '1' }, + 西饭: { area: '68@都市' }, + 牛牛: { area: '现言' }, + 围观: { area: '' }, + 河马: { area: '308' }, + 星星: { area: '1287' }, + 好看: { area: '1' } +}; + +// ==================== 筛选配置 ==================== +const filterOptions = { + "七猫": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "全部", "v": "" }, + { "n": "推荐", "v": "0" }, + { "n": "新剧", "v": "-1" }, + { "n": "都市情感", "v": "1273" }, + { "n": "古装", "v": "1272" }, + { "n": "都市", "v": "571" }, + { "n": "玄幻仙侠", "v": "1286" }, + { "n": "奇幻", "v": "570" }, + { "n": "乡村", "v": "590" }, + { "n": "民国", "v": "573" }, + { "n": "年代", "v": "572" }, + { "n": "青春校园", "v": "1288" }, + { "n": "武侠", "v": "371" }, + { "n": "科幻", "v": "594" }, + { "n": "末世", "v": "556" }, + { "n": "二次元", "v": "1289" }, + { "n": "逆袭", "v": "400" }, + { "n": "穿越", "v": "373" }, + { "n": "复仇", "v": "795" }, + { "n": "系统", "v": "787" }, + { "n": "权谋", "v": "790" }, + { "n": "重生", "v": "784" }, + { "n": "女性成长", "v": "1294" }, + { "n": "打脸虐渣", "v": "716" }, + { "n": "闪婚", "v": "480" }, + { "n": "强者回归", "v": "402" }, + { "n": "追妻火葬场", "v": "715" }, + { "n": "家庭", "v": "670" }, + { "n": "马甲", "v": "558" }, + { "n": "职场", "v": "724" }, + { "n": "宫斗", "v": "343" }, + { "n": "高手下山", "v": "1299" }, + { "n": "娱乐明星", "v": "1295" }, + { "n": "异能", "v": "727" }, + { "n": "宅斗", "v": "342" }, + { "n": "替身", "v": "712" }, + { "n": "穿书", "v": "338" }, + { "n": "商战", "v": "723" }, + { "n": "种田经商", "v": "1291" }, + { "n": "伦理", "v": "1293" }, + { "n": "社会话题", "v": "1290" }, + { "n": "致富", "v": "492" }, + { "n": "偷听心声", "v": "1258" }, + { "n": "脑洞", "v": "526" }, + { "n": "豪门总裁", "v": "624" }, + { "n": "萌宝", "v": "356" }, + { "n": "战神", "v": "527" }, + { "n": "真假千金", "v": "812" }, + { "n": "赘婿", "v": "36" }, + { "n": "神医", "v": "1269" }, + { "n": "神豪", "v": "37" }, + { "n": "小人物", "v": "1296" }, + { "n": "团宠", "v": "545" }, + { "n": "欢喜冤家", "v": "464" }, + { "n": "女帝", "v": "617" }, + { "n": "银发", "v": "1297" }, + { "n": "兵王", "v": "28" }, + { "n": "虐恋", "v": "16" }, + { "n": "甜宠", "v": "21" }, + { "n": "悬疑", "v": "27" }, + { "n": "搞笑", "v": "793" }, + { "n": "灵异", "v": "1287" } + ] + }], + "牛牛": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "全部", "v": "" }, + { "n": "现言", "v": "现言" }, + { "n": "古言", "v": "古言" }, + { "n": "历史", "v": "历史" }, + { "n": "都市", "v": "都市" }, + { "n": "活动", "v": "活动" }, + { "n": "逆袭", "v": "逆袭" }, + { "n": "豪门", "v": "豪门" }, + { "n": "现代言情", "v": "现代言情" }, + { "n": "战神", "v": "战神" }, + { "n": "甜宠", "v": "甜宠" }, + { "n": "穿越", "v": "穿越" }, + { "n": "古装", "v": "古装" }, + { "n": "虐心", "v": "虐心" }, + { "n": "神医", "v": "神医" }, + { "n": "赘婿", "v": "赘婿" }, + { "n": "亲情", "v": "亲情" }, + { "n": "复仇", "v": "复仇" }, + { "n": "玄幻", "v": "玄幻" }, + { "n": "古代言情", "v": "古代言情" }, + { "n": "热血", "v": "热血" }, + { "n": "动作", "v": "动作" }, + { "n": "喜剧", "v": "喜剧" }, + { "n": "悬疑", "v": "悬疑" }, + { "n": "军事", "v": "军事" }, + { "n": "二次元", "v": "二次元" }, + { "n": "未来", "v": "未来" }, + { "n": "快速穿越", "v": "快速穿越" }, + { "n": "烧脑", "v": "烧脑" }, + { "n": "治愈", "v": "治愈" }, + { "n": "其他剧情", "v": "其他剧情" } + ] + }], + "百度": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "新剧", "v": "新剧" }, + { "n": "限时免费", "v": "限时免费" }, + { "n": "精选", "v": "精选" }, + { "n": "独播", "v": "独播" }, + { "n": "全部", "v": "全部题材" }, + { "n": "神医", "v": "神医" }, + { "n": "连续剧", "v": "连续剧" }, + { "n": "都市", "v": "都市" }, + { "n": "现代言情", "v": "现代言情" }, + { "n": "异能", "v": "异能" }, + { "n": "逆袭", "v": "逆袭" }, + { "n": "甜宠", "v": "甜宠" }, + { "n": "总裁", "v": "总裁" }, + { "n": "萌宝", "v": "萌宝" }, + { "n": "战神", "v": "战神" }, + { "n": "宫斗宅斗", "v": "宫斗宅斗" }, + { "n": "神豪", "v": "神豪" }, + { "n": "虐恋", "v": "虐恋" }, + { "n": "闪婚", "v": "闪婚" }, + { "n": "玄幻", "v": "玄幻" }, + { "n": "穿越重生", "v": "穿越重生" }, + { "n": "年代", "v": "年代" }, + { "n": "家庭伦理", "v": "家庭伦理" }, + { "n": "古代言情", "v": "古代言情" }, + { "n": "武侠武打", "v": "武侠武打" }, + { "n": "赘婿", "v": "赘婿" }, + { "n": "单元剧", "v": "单元剧" }, + { "n": "青春校园", "v": "青春校园" }, + { "n": "历史架空", "v": "历史架空" }, + { "n": "王妃", "v": "王妃" }, + { "n": "鉴宝", "v": "鉴宝" }, + { "n": "科幻", "v": "科幻" }, + { "n": "军旅战争", "v": "军旅战争" }, + { "n": "种田", "v": "种田" } + ] + }], + "围观": [{ + "key": "area", + "name": "分类", + "value": [{ "n": "全部", "v": "" }] + }], + "星芽": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "剧场", "v": "1" }, + { "n": "热播剧", "v": "2" }, + { "n": "会员专享", "v": "8" }, + { "n": "星选好剧", "v": "7" }, + { "n": "新剧", "v": "3" }, + { "n": "阳光剧场", "v": "5" } + ] + }], + "西饭": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "都市", "v": "68@都市" }, + { "n": "青春", "v": "68@青春" }, + { "n": "现代言情", "v": "81@现代言情" }, + { "n": "豪门", "v": "81@豪门" }, + { "n": "大女主", "v": "80@大女主" }, + { "n": "逆袭", "v": "79@逆袭" }, + { "n": "打脸虐渣", "v": "79@打脸虐渣" }, + { "n": "穿越", "v": "81@穿越" } + ] + }], + "河马": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "推荐", "v": "308" }, + { "n": "新剧", "v": "309" }, + { "n": "逆袭", "v": "310" }, + { "n": "恋爱", "v": "311" }, + { "n": "强者回归", "v": "312" }, + { "n": "豪门恩怨", "v": "313" }, + { "n": "古装", "v": "314" }, + { "n": "重生", "v": "315" }, + { "n": "萌宝", "v": "316" }, + { "n": "复仇", "v": "317" }, + { "n": "神医", "v": "318" }, + { "n": "高手下山", "v": "319" }, + { "n": "超能悬疑", "v": "320" }, + { "n": "传承觉醒", "v": "321" }, + { "n": "神豪", "v": "322" }, + { "n": "民国", "v": "323" } + ] + }], + "星星": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "甜宠", "v": "1287" }, + { "n": "逆袭", "v": "1288" }, + { "n": "热血", "v": "1289" }, + { "n": "现代", "v": "1290" }, + { "n": "古代", "v": "1291" } + ] + }], + "好看": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "热播剧", "v": "1" }, + { "n": "新剧", "v": "2" }, + { "n": "战神", "v": "1001" }, + { "n": "神豪", "v": "2001" }, + { "n": "神医", "v": "1002" }, + { "n": "甜宠", "v": "1007" }, + { "n": "赘婿", "v": "1003" }, + { "n": "穿越重生", "v": "2004" }, + { "n": "异能", "v": "2005" }, + { "n": "虐恋", "v": "1006" }, + { "n": "宫斗宅斗", "v": "2006" }, + { "n": "玄幻", "v": "2009" } + ] + }] +}; + +// 河马分类标签映射 +const hemaTagIds = { + "308": "", "309": "", "310": "417,473,474,464", "311": "462,466", "312": "476", + "313": "585,616", "314": "444,468", "315": "417,439,464,465", "316": "589", + "317": "416,439,463,465", "318": "438", "319": "417,474,464", "320": "439,442,443,445,465,470", + "321": "417,473,474,464", "322": "472,475,585", "323": "590" +}; + +// 西饭搜索固定session参数 +const XIFAN_SESSION_PARAMS = 'session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY2ODk4NiIsInVuIjoiT1BHX2U5ODQ4NTgzZmM4ZjQzZTJhZjc5ZTcxNjRmZTE5Y2JjIiwiZnQiOiIxNzQwNjY4OTg2In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjM0MDU3ODE4OTgxNDk5OTA0LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjY4OTg2LCJ1bm0iOiJPUEdfZTk4NDg1ODNmYzhmNDNlMmFmNzllNzE2NGZlMTljYmMiLCJpZCI6ImVhZGE1NmEyZWEzYTE0YmMwMzE3ZDc2ZmVjODJjNzc3IiwiZXhwIjoxNzQxMjczNzg2LCJkYyI6ImJqaHQifQ.IwuI0gK077RF4G10JRxgxx4GCG502vR8Z0W9EV4kd-c'; + +// ==================== 日志函数 ==================== +function log(level, tag, msg) { + if (!debug) return; + const prefix = { 0: '🔍', 1: '✅', 2: '⚠️', 3: '❌' }[level] || '📝'; + console.log(`${prefix}【${tag}】 ${msg}`); +} + +function logTime(start, label) { + if (!debug) return; + console.log(`⏱️【${label}】耗时: ${Date.now() - start}ms`); +} + +// ==================== 七猫公共函数 ==================== +async function getQmParamsAndSign() { + let sessionId = Math.floor(Date.now()).toString(); + let data = { + "static_score": "0.8", + "uuid": "00000000-7fc7-08dc-0000-000000000000", + "device-id": "20250220125449b9b8cac84c2dd3d035c9052a2572f7dd0122edde3cc42a70", + "mac": "", + "sourceuid": "aa7de295aad621a6", + "refresh-type": "0", + "model": "22021211RC", + "wlb-imei": "", + "client-id": "aa7de295aad621a6", + "brand": "Redmi", + "oaid": "", + "oaid-no-cache": "", + "sys-ver": "12", + "trusted-id": "", + "phone-level": "H", + "imei": "", + "wlb-uid": "aa7de295aad621a6", + "session-id": sessionId + }; + let jsonStr = JSON.stringify(data); + let base64Str = base64Encode(jsonStr).replace(/[\r\n\s]/g, ''); + let qmParams = ''; + for (let c of base64Str) qmParams += aggConfig.charMap[c] || c; + let paramsStr = `AUTHORIZATION=app-version=10001application-id=com.duoduo.readchannel=unknownis-white=net-env=5platform=androidqm-params=${qmParams}reg=${aggConfig.keys}`; + let sign = await md5(paramsStr); + log(0, '七猫', `qmParams生成成功`); + return { qmParams, sign }; +} + +async function getQiMaoHeaders() { + let { qmParams, sign } = await getQmParamsAndSign(); + return { + 'net-env': '5', 'reg': '', 'channel': 'unknown', 'is-white': '', + 'platform': 'android', 'application-id': 'com.duoduo.read', 'AUTHORIZATION': '', + 'app-version': '10001', 'user-agent': 'okhttp/4.10.0', + 'qm-params': qmParams, 'sign': sign, 'Content-Type': 'application/json' + }; +} + +// ==================== 缓存管理 ==================== +const loginCache = new Map(); +const LOGIN_CACHE_TTL = 24 * 60 * 60 * 1000; + +function generateDeviceId() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + let r = Math.random() * 16 | 0; + let v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +} + +function getSearchCache(key) { + const cached = searchCache.get(key); + if (cached && Date.now() - cached.time < CACHE_TTL) { + log(0, '缓存', `命中: ${key}`); + return cached.data; + } + return null; +} + +function setSearchCache(key, data) { + searchCache.set(key, { data, time: Date.now() }); +} + +// ==================== 初始化 ==================== +async function init(cfg) { + const start = Date.now(); + log(1, '初始化', `========== ${siteName} ==========`); + + // 星芽登录 + try { + const response = await request(rule.星芽.login, { + method: 'POST', + headers: { 'User-Agent': 'okhttp/4.10.0', 'platform': '1', 'Content-Type': 'application/json' }, + data: { device: '24250683a3bdb3f118dff25ba4b1cba1a' } + }); + const res = JSON.parse(response || '{}'); + const token = res?.data?.token || res?.token || res?.access_token; + xingya_headers = token ? { ...aggConfig.headers.json, authorization: token } : aggConfig.headers.json; + log(token ? 1 : 2, '星芽', token ? `登录成功` : `登录失败`); + } catch (e) { + xingya_headers = aggConfig.headers.json; + log(2, '星芽', `异常: ${e.message}`); + } + + // 牛牛初始化 + const nnDeviceId = generateDeviceId(); + log(0, '牛牛', `设备ID: ${nnDeviceId}`); + + try { + let tkhtml = await request(rule.牛牛.host + rule.牛牛.visitor, { + method: 'GET', + headers: { "deviceid": nnDeviceId, "token": "", "User-Agent": "okhttp/4.12.0", "client": "app", "devicetype": "Android", "Content-Type": "application/json" } + }); + let tkRes = JSON.parse(tkhtml || '{}'); + niuniu_token = tkRes.data?.token || ''; + log(niuniu_token ? 1 : 2, '牛牛', niuniu_token ? `访客token成功` : `访客token失败`); + niuniu_headers = { ...aggConfig.headers.niuniu, "token": niuniu_token, "deviceid": nnDeviceId }; + } catch (e) { + log(2, '牛牛', `访客token异常: ${e.message}`); + niuniu_headers = { ...aggConfig.headers.niuniu, "deviceid": nnDeviceId }; + } + + // 牛牛广告解锁 + try { + let t = String(Math.floor(Date.now() / 1000)); + let body = `ac=wifi&os=Android&vod_version=1.10.21.6-tob&os_version=9&type=1&clientVersion=v5.2.5&uuid=Y4WNZ3SAWK7MAJMH7CXCDHJ4VMPVFRZQTBSIA4XTYO4AWEUHIK6Q01&resolution=1280*2618&openudid=889edced38f1069b&dt=Pixel%204&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&os_api=28&install_id=1549688030634536&device_brand=google&sdk_version=1.1.3.0&package_name=com.niuniu.ztdh.app&siteid=5627189&dev_log_aid=667431&oaid=×tamp=${t}`; + let nonce = "VX1KKGtoBDCi1fB1"; + let signature = hmacSHA256(t + nonce + body, 'aceaa47f96b4875d446b2e1d97e03bbb'); + let encbdoy = aesEncryptECB(body, 'dafdb3d2a5c343d6'); + let response = await request(rule.牛牛.login, { + method: "POST", + headers: { 'X-Salt': '786774955F', 'X-Nonce': nonce, 'X-Timestamp': t, 'X-Signature': signature, 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/4.10.0' }, + data: encbdoy + }); + if (response) { + let logindata = aesDecryptECB(response, 'dafdb3d2a5c343d6'); + let accesstoken = JSON.parse(logindata || '{}'); + niuniu_access_token = accesstoken.data?.access_token || ''; + log(niuniu_access_token ? 1 : 2, '牛牛', niuniu_access_token ? `广告token成功` : `广告token失败`); + } + } catch (e) { + log(2, '牛牛', `广告解锁异常: ${e.message}`); + } + + // 河马初始化 + hema_headers = { ...aggConfig.headers.hema, 'User-Agent': 'okhttp/4.10.0' }; + log(1, '河马', `初始化成功`); + + logTime(start, 'init'); + return true; +} + +// ==================== 首页分类 ==================== +function home(filter) { + const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name))); + const classes = platForms.map(item => ({ + type_name: item.name, + type_id: item.id, + type_flag: '[CFS][SUBSITE2][FILTERBAR]' + })); + + const filters = {}; + platForms.forEach(item => { + if (filterOptions[item.id]) filters[item.id] = filterOptions[item.id]; + }); + + log(0, '首页', `分类数: ${classes.length}`); + return JSON.stringify({ class: classes, filters: filters }); +} + +// ==================== 首页推荐 ==================== +async function homeVod() { + const start = Date.now(); + const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name))); + const randomPlat = platForms[Math.floor(Math.random() * platForms.length)]; + const randomArea = ruleFilterDef[randomPlat.id]?.area || ''; + const categoryResult = await category(randomPlat.id, 1, { area: randomArea }, {}); + const categoryList = JSON.parse(categoryResult).list || []; + log(1, '首页推荐', `返回 ${categoryList.length} 条`); + logTime(start, 'homeVod'); + return JSON.stringify({ list: categoryList }); +} + +// ==================== 分类列表 ==================== +async function category(tid, pg, filter, extend) { + const start = Date.now(); + const page = pg || 1; + const area = filter?.area || extend?.area || ruleFilterDef[tid]?.area || ''; + const videos = []; + const platRule = rule[tid]; + + log(0, '分类', `${tid} page=${page} area=${area}`); + + switch (tid) { + case '七猫': { + let params = { operation: 1, playlet_privacy: 1 }; + if (area && area !== '0' && area !== '') params.tag_id = area; + if (page > 1) params.next_id = page; + + const keys = Object.keys(params).sort(); + let signStr = keys.map(k => `${k}=${params[k]}`).join('') + aggConfig.keys; + params.sign = await md5(signStr); + + const url = `${platRule.host}${platRule.list}?${buildUrlQuery(params)}`; + const headers = await getQiMaoHeaders(); + const response = await request(url, { method: 'GET', headers }); + + if (response) { + const res = JSON.parse(response); + const items = res.data?.list || []; + log(0, '七猫', `获取 ${items.length} 条`); + items.forEach(item => { + videos.push({ + vod_id: `七猫@${encodeURIComponent(item.playlet_id)}`, + vod_name: item.title || '', + vod_pic: item.image_link || '', + vod_remarks: `七猫短剧 | ${item.total_episode_num || 0}集`, + vod_content: item.tags || '' + }); + }); + } + break; + } + case '百度': { + let sub = ["新剧", "限时免费", "精选", "独播"].includes(area) ? area : "新剧"; + let tcsub = area === "全部" || area === "全部题材" ? "" : area; + let t = Math.floor(Date.now() / 1000); + let version = await md5(t + "v2"); + + const postData = { + 'data': JSON.stringify({ + "data": { + "extRequest": { "flow_tabid": "13" }, + "from": "feed", + "page": "channel_video_landing", + "pd": "feed", + "refreshIndex": parseInt(page), + "cursor": "", + "theme": "", + "timestamp": t, + "version": version, + "themes": [ + { "kind": "综合", "names": [sub] }, + { "kind": "题材", "names": [tcsub] } + ] + } + }) + }; + + let html = await request(`${platRule.host}${platRule.list}`, { + method: 'POST', + headers: aggConfig.headers.baidu, + data: postData + }); + let res = JSON.parse(html); + let items = res.data?.items || []; + log(0, '百度', `获取 ${items.length} 条`); + items.slice(0, 20).forEach(it => { + videos.push({ + vod_id: `百度@${it.collId}`, + vod_name: it.title || '未知短剧', + vod_pic: it.img || '', + vod_remarks: '百度短剧 | ' + (it.updateStatus || "更新中"), + vod_content: it.description || '' + }); + }); + break; + } + case '星芽': { + const url = `${platRule.host}${platRule.list}=${area}&type=1&class2_ids=0&page_num=${page}&page_size=24`; + const response = await request(url, { headers: xingya_headers }); + const res = JSON.parse(response); + const items = res.data?.list || []; + log(0, '星芽', `获取 ${items.length} 条`); + items.forEach(it => { + videos.push({ + vod_id: `星芽@${it.theater.id}`, + vod_name: it.theater.title || '', + vod_pic: it.theater.cover_url || '', + vod_remarks: '星芽短剧 | ' + (it.theater.total ? `${it.theater.total}集` : ''), + vod_content: `播放量:${it.theater.play_amount_str || 0}` + }); + }); + break; + } + case '西饭': { + const [typeId, typeName] = area.split('@'); + const ts = Math.floor(Date.now() / 1000); + const url = `${platRule.host}${platRule.list}?reqType=aggregationPage&offset=${(page - 1) * 30}&categoryId=${typeId}&quickEngineVersion=-1&scene=&categoryNames=${encodeURIComponent(typeName)}&categoryVersion=1&density=1.5&pageID=page_theater&version=2001001&androidVersionCode=28&requestId=${ts}aa498144140ef297&appId=drama&teenMode=false&userBaseMode=false&${XIFAN_SESSION_PARAMS}`; + + const response = await request(url, { headers: aggConfig.headers.form }); + const res = JSON.parse(response); + let count = 0; + (res.result?.elements || []).forEach(soup => { + (soup.contents || []).forEach(vod => { + const dj = vod.duanjuVo || {}; + videos.push({ + vod_id: `西饭@${dj.duanjuId}#${dj.source}`, + vod_name: dj.title || '', + vod_pic: dj.coverImageUrl || '', + vod_remarks: '西饭短剧 | ' + (dj.total ? `${dj.total}集` : ''), + vod_content: dj.desc || '' + }); + count++; + }); + }); + log(0, '西饭', `获取 ${count} 条`); + break; + } + case '牛牛': { + let condition = { "typeId": "S1" }; + if (area && area !== '全部' && area !== '') condition.classify = area; + + const postData = { "condition": condition, "pageNum": page, "pageSize": 24 }; + const response = await request(`${platRule.host}${platRule.list}`, { + method: 'POST', + headers: niuniu_headers, + data: postData + }); + const res = JSON.parse(response); + const items = res.data?.records || []; + log(0, '牛牛', `获取 ${items.length} 条`); + items.forEach(item => { + videos.push({ + vod_id: `牛牛@${item.id}`, + vod_name: item.name || '', + vod_pic: item.cover || '', + vod_remarks: '牛牛短剧 | ' + (item.totalEpisode ? `${item.totalEpisode}集` : ''), + vod_content: item.description || '' + }); + }); + break; + } + case '围观': { + const postData = { "audience": "全部受众", "page": page, "pageSize": 30, "searchWord": "", "subject": "全部主题" }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: aggConfig.headers.json, + data: postData + }); + const res = JSON.parse(response); + const items = (res.code === 200 && res.data) ? res.data : []; + log(0, '围观', `获取 ${items.length} 条`); + items.forEach(it => { + videos.push({ + vod_id: `围观@${it.oneId}`, + vod_name: it.title || '未知短剧', + vod_pic: it.vertPoster || it.horizonPoster || '', + vod_remarks: '围观短剧 | ' + `集数:${it.episodeCount || 0}`, + vod_content: it.description || '' + }); + }); + break; + } + case '河马': { + try { + const sub = area || '308'; + const tagIds = hemaTagIds[sub] || ''; + const bodys = JSON.stringify({ + "recSwitch": true, "channelId": sub, "tagIds": tagIds, + "cnxhFlag": page - 1, "playListFlag": true, + "watchRecords": ["41000103722_572752006"] + }); + const body = hemaEncrypt(bodys); + const response = await request(`${platRule.host}${platRule.list}`, { + method: 'POST', + headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, + data: body + }); + const res = JSON.parse(response); + const dehtml = res.data; + if (dehtml) { + const hmdata = hemaDecrypt(dehtml); + if (hmdata && hmdata !== '{}') { + const hmlist = JSON.parse(hmdata).columnData || []; + hmlist.forEach(videoDataArray => { + (videoDataArray.videoData || []).forEach(video => { + videos.push({ + vod_id: `河马@${video.bookId}`, + vod_name: video.bookName || '', + vod_pic: video.coverWap || video.coverCutWap, + vod_remarks: `河马短剧 | 更新${video.updateNum || 0}集`, + vod_content: video.introduction || '' + }); + }); + }); + } + } + } catch (e) { + log(2, '河马', e.message); + } + break; + } + case '星星': { + const postData = { + "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0", + "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb", + "channel": "oppo19", "osType": "android", "version": "20", + "token": "202509271001001446030204698626", "resourceId": area, + "pageNum": String(page), "pageSize": "20" + }; + const response = await request(`${platRule.host}${platRule.list}`, { + method: 'GET', headers: aggConfig.headers.form, data: postData + }); + try { + const res = JSON.parse(response); + const items = res.data?.datalist || []; + log(0, '星星', `获取 ${items.length} 条`); + items.forEach(vod => { + videos.push({ + vod_id: `星星@${vod.id}@${encodeURIComponent(vod.introduction || '')}`, + vod_name: vod.name || '', + vod_pic: vod.icon || '', + vod_remarks: `星星短剧 | ${vod.heat || 0}万播放`, + vod_content: vod.introduction || '' + }); + }); + } catch (e) { + log(2, '星星', e.message); + } + break; + } + case '好看': { + const postData = { "tag_id": area, "rn": "20", "pn": page }; + const response = await request(`${platRule.host}${platRule.list}`, { + method: 'POST', headers: aggConfig.headers.haokan, data: postData + }); + try { + const res = JSON.parse(response); + const items = res.data?.list || []; + log(0, '好看', `获取 ${items.length} 条`); + items.forEach(item => { + videos.push({ + vod_id: `好看@${item.playlet_id}`, + vod_name: item.playlet_title || '', + vod_pic: item.playlet_poster || '', + vod_remarks: `好看短剧 | ${item.episodes_num_text || ''}`, + vod_content: item.tags ? item.tags.join('·') : '' + }); + }); + } catch (e) { + log(2, '好看', e.message); + } + break; + } + } + + log(1, '分类', `${tid} 返回 ${videos.length} 条`); + logTime(start, 'category'); + return JSON.stringify({ list: videos, page, pagecount: page + 1, limit: videos.length, total: videos.length * (page + 1) }); +} + +// ==================== 详情 ==================== +async function detail(id) { + const parts = id.split('@'); + const platform = parts[0]; + const did = parts.slice(1).join('@'); + const platRule = rule[platform]; + let vod = {}; + + log(0, '详情', `${platform} ${did.substring(0, 50)}`); + + switch (platform) { + case '七猫': { + const didDecoded = decodeURIComponent(did); + const sign = await md5(`playlet_id=${didDecoded}${aggConfig.keys}`); + const url = `${platRule.detail}?playlet_id=${didDecoded}&sign=${sign}`; + const headers = await getQiMaoHeaders(); + const response = await request(url, { method: 'GET', headers }); + const data = JSON.parse(response || '{}').data || {}; + vod = { + vod_id: id, vod_name: data.title || '未知标题', + vod_pic: data.image_link || '', vod_remarks: `${data.tags || ''} ${data.total_episode_num || 0}集`, + vod_content: data.intro || '未知剧情', vod_play_from: '七猫短剧', + vod_play_url: (data.play_list || []).map(it => `${it.sort}$${it.video_url}`).join('#') + }; + break; + } + case '百度': { + const postData = { "playlet_id": did, "vid": "undefined" }; + let html = await request(`${platRule.detailHost}${platRule.detail}`, { + method: 'POST', headers: aggConfig.headers.baidu, data: postData + }); + let res = JSON.parse(html); + let dthtml = res.data || {}; + let vids = dthtml.vid_list || []; + let playArr = vids.map((vid, index) => `第${index + 1}集$${did}@${vid}`); + vod = { + vod_id: id, vod_name: dthtml.playlet_title || '未知短剧', + vod_pic: dthtml.playlet_poster || '', + vod_content: `热度值:${dthtml.hot_value || 0}\n题材:${dthtml.tag_text || ''}\n集数:${dthtml.episodes_num || 0}\n简介:${dthtml.description || ''}`, + vod_remarks: `共${vids.length || 0}集`, vod_play_from: "百度短剧", + vod_play_url: playArr.join('#') + }; + break; + } + case '星芽': { + const detailUrl = `${platRule.host}${platRule.detail}?theater_parent_id=${did}`; + const response = await request(detailUrl, { headers: xingya_headers }); + const res = JSON.parse(response); + if (res.code === 'ok' && res.data) { + const data = res.data; + const playUrls = (data.theaters || []).map(item => `第${item.num}集$${item.son_video_url}`).join('#'); + vod = { + vod_id: id, vod_name: data.title || '未知剧名', + vod_pic: data.cover_url || '', vod_remarks: data.is_over === 2 ? '连载中' : '已完结', + vod_content: data.introduction || data.desc || '', + vod_play_from: '星芽短剧', vod_play_url: playUrls || '暂无播放地址$0' + }; + } + break; + } + case '西饭': { + const [duanjuId, source] = did.split('#'); + const url = `${platRule.host}${platRule.detail}?duanjuId=${duanjuId}&source=${source}`; + const response = await request(url, { headers: aggConfig.headers.form }); + const res = JSON.parse(response); + const data = res.result || {}; + const playUrls = (data.episodeList || []).map(ep => `${ep.index}$${ep.playUrl}`).join('#'); + vod = { + vod_id: id, vod_name: data.title || '', vod_pic: data.coverImageUrl || '', + vod_content: data.desc || '未知', + vod_remarks: data.updateStatus === 'over' ? `${data.total || 0}集 已完结` : `更新${data.total || 0}集`, + vod_play_from: '西饭短剧', vod_play_url: playUrls + }; + break; + } + case '牛牛': { + const descData = await request(`${platRule.host}${platRule.desc}`, { + method: 'POST', headers: niuniu_headers, data: { "id": did, "typeId": "S1" } + }); + const descRes = JSON.parse(descData); + const descInfo = descRes.data || {}; + const listData = await request(`${platRule.host}${platRule.detail}`, { + method: 'POST', headers: niuniu_headers, data: { "id": did, "source": 0, "typeId": "S1", "userId": "546932" } + }); + const listRes = JSON.parse(listData); + const listInfo = listRes.data || {}; + + let playUrls = ''; + if (listInfo.url && listInfo.episodeList && listInfo.episodeList.length > 0) { + playUrls = (listInfo.episodeList || []).map(ep => `${ep.episode}$${did}+${ep.id}`).join('#'); + } else if (listInfo.thirdPlayId) { + let thirdPlayId = listInfo.thirdPlayId; + let data1 = "not_include=0&lock_free=1&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&dt=22021211RC&os_api=31&install_id=1496879012031075&sdk_version=1.1.3.0&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498494&direction=0&ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&count=1&index=1&shortplay_id=" + thirdPlayId + "&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&device_brand=Redmi&package_name=com.niuniu.ztdh.app"; + try { + let html1 = await niuniuPost(rule.牛牛.detail2, data1, "1"); + if (html1 && html1.data && html1.data.episode_right_list) { + playUrls = html1.data.episode_right_list.map(it => { + let lockType = it.lock_type || 'free'; + return `第${it.index}集$${it.index}+${lockType}+${thirdPlayId}`; + }).join('#'); + } + } catch (e) { log(2, '牛牛详情', e.message); } + } + vod = { + vod_id: id, vod_name: descInfo.name || listInfo.name || '未知名称', + vod_pic: descInfo.cover || listInfo.cover || '', + vod_content: `类型:${descInfo.classify || ''}\n评分:${descInfo.score || ''}\n简介:${descInfo.introduce || ''}`, + vod_remarks: `共${descInfo.totalEpisode || listInfo.totalEpisode || 0}集`, + vod_play_from: '牛牛短剧', vod_play_url: playUrls || '暂无播放地址$0' + }; + break; + } + case '围观': { + const response = await request(`${platRule.host}${platRule.detail}&oneId=${did}&page=1&pageSize=1000`, { + headers: aggConfig.headers.form + }); + const res = JSON.parse(response); + if (res.code === 200 && res.data) { + const data = res.data || []; + const firstEpisode = data[0] || {}; + vod = { + vod_id: id, vod_name: firstEpisode.title || '', + vod_pic: firstEpisode.vertPoster || firstEpisode.horizonPoster || '', + vod_remarks: `共${data.length || 0}集`, + vod_content: `播放量:${firstEpisode.viewCount || 0} 收藏:${firstEpisode.collectionCount || 0} 评论:${firstEpisode.commentCount || 0}`, + vod_play_from: '围观短剧', + vod_play_url: data.map(ep => { + let playSetting = ep.playSetting || ep.videoClarityList || []; + try { if (typeof playSetting === 'string') playSetting = JSON.parse(playSetting); } catch (e) { } + const url = (playSetting.find(item => item.name === '1080P')?.url || playSetting.find(item => item.name === '720P')?.url || ''); + return `第${ep.playOrder || 1}集$${url}`; + }).filter(ep => ep.split('$')[1]).join('#') + }; + } + break; + } + case '河马': { + const bookId = did; + const body = hemaEncrypt(JSON.stringify({ "bookId": bookId })); + const detailResponse = await request(`${platRule.host}${platRule.detail}`, { + method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: body + }); + const detailRes = JSON.parse(detailResponse); + const detailHtml = detailRes.data; + const postdata = hemaDecrypt(detailHtml); + const videoInfo = JSON.parse(postdata).videoInfo || {}; + + const episodeBody = hemaEncrypt(JSON.stringify({ "bookId": bookId, "chapterMin": videoInfo.updateNum || 0, "chapterMax": videoInfo.chapterIndex || 0 })); + const episodeResponse = await request(`${platRule.host}${platRule.episode}`, { + method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: episodeBody + }); + const episodeRes = JSON.parse(episodeResponse); + const episodeHtml = episodeRes.data; + const playdata = hemaDecrypt(episodeHtml); + const chapterList = JSON.parse(playdata).chapterList || []; + + const playUrls = chapterList.map(item => `${item.chapterName}$${item.chapterId}++${item.chapterIndex}++${bookId}`).join('#'); + vod = { + vod_id: id, vod_name: videoInfo.bookName || '未知剧名', + vod_pic: videoInfo.coverWap, vod_remarks: videoInfo.finishStatusCn || `更新至${videoInfo.updateNum || 0}集`, + vod_content: videoInfo.introduction || '暂无简介', + vod_play_from: '河马短剧', vod_play_url: playUrls || '暂无播放地址$0' + }; + break; + } + case '星星': { + const partsArr = did.split('@'); + const bookId = partsArr[0]; + const contentDesc = decodeURIComponent(partsArr[1] || ''); + const postData = { + "bookId": bookId, "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0", + "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb", "channel": "oppo19", + "osType": "android", "version": "20", "token": "202509271001001446030204698626" + }; + const response = await request(`${platRule.host}${platRule.detail}`, { + method: 'GET', headers: aggConfig.headers.form, data: postData + }); + try { + const res = JSON.parse(response); + const data = res.data || []; + const playUrls = data.map((vodItem, index) => { + const playUrl = vodItem.shortPlayList?.[0]?.chapterShortPlayVoList?.[0]?.shortPlayUrl || ''; + return playUrl ? `第${index + 1}集$${playUrl}` : null; + }).filter(Boolean).join('#'); + vod = { vod_id: id, vod_name: '星星短剧', vod_content: contentDesc, vod_play_from: '星星短剧', vod_play_url: playUrls || '暂无播放地址$0' }; + } catch (e) { log(2, '星星详情', e.message); } + break; + } + case '好看': { + const commonlistId = Date.now().toString().substring(0, 13); + const innerParams = `enable_enter_playlet=0&seek_time=0&hotspot=0&auto_show_hot_point_panel=0&type=playlet&commonlist_id=${commonlistId}&scene=&vid=&enable_atlas=0&mark_pn=&uk=&ctime=0&from=playlet_new&id=${did}&rn=10&pn=1&direction=3`; + const listResponse = await request(`${platRule.host}${platRule.detail_list}`, { + method: 'POST', headers: aggConfig.headers.haokan, data: { "video/commonlist": innerParams } + }); + try { + const resObj = JSON.parse(listResponse); + const firstVideo = resObj['video/commonlist']?.data?.results?.[0]; + const vid = firstVideo?.content?.vid; + const detailResponse = await request(`${platRule.host}${platRule.detail}`, { + method: 'POST', headers: aggConfig.headers.haokan, data: { "vid": vid, "playlet_id": did } + }); + const detailDataObj = JSON.parse(detailResponse).data || {}; + let vidList = detailDataObj.vid_list || []; + if (vidList.length === 0 && detailDataObj.results) vidList = detailDataObj.results.map(item => item.vid); + const playList = vidList.map((v, i) => `第${i + 1}集$${did}@${v}`).join('#'); + vod = { + vod_id: id, vod_name: detailDataObj.playlet_title || '', vod_pic: detailDataObj.playlet_poster || '', + vod_remarks: (detailDataObj.hot_value || '') + '播放·' + (detailDataObj.episodes_num || '') + '集', + vod_content: detailDataObj.description || '', vod_play_from: '好看短剧', vod_play_url: playList + }; + } catch (e) { log(2, '好看详情', e.message); } + break; + } + } + + return JSON.stringify({ list: [vod] }); +} + +// ==================== 搜索 ==================== +// ==================== 搜索 ==================== +async function cfs(siteId, wd, pg) { + const start = Date.now(); + const page = pg || 1; + const searchLimit = aggConfig.searchLimit; + const searchTimeout = aggConfig.searchTimeout; + let results = []; + + const cacheKey = `${siteId}_${wd}_${page}`; + const cachedResult = getSearchCache(cacheKey); + if (cachedResult) { + return cachedResult; + } + + log(0, '搜索', `${siteId} 关键词: ${wd}, 页码: ${page}`); + + const platformItem = platformList.find(p => p.id === siteId); + if (platformItem && cate_remove.some(word => new RegExp(word, 'i').test(platformItem.name))) { + log(2, '搜索', `跳过平台: ${siteId}`); + return JSON.stringify({ list: [], page, pagecount: page + 1, limit: 0, total: 0 }); + } + + const platRule = rule[siteId]; + + switch (siteId) { + case '百度': { + const requestUrl = `${platRule.host}${platRule.search}`; + const postData = { + "data": { + "query": wd, + "page": page, + "attribute": ["title"], + "fe_page_type": "search", + "extra": { + "tab_id": "216", + "flow_tabid": "13", + "shortplay_source": "feed", + "from": "feed", + "tab_type": "搜索", + "sub_template": "playlet_search_result" + } + } + }; + + let html = await request(requestUrl, { + method: 'POST', + headers: aggConfig.headers.baidu, + data: postData, + timeout: searchTimeout + }); + + let res = JSON.parse(html); + let items = res.data?.itemList || res.data?.data?.itemList || res.itemList || res.data?.list || res.list || []; + log(0, '百度搜索', `获取到 ${items.length} 条`); + results = items.map(it => ({ + vod_id: `百度@${it.nid?.split("_")[1] || it.collId || ''}`, + vod_name: it.title || '未知短剧', + vod_pic: it.img || '', + vod_remarks: '百度短剧 | ' + (it.collNum || it.updateStatus || "搜索短剧"), + vod_content: it.description || '' + })); + break; + } + + case '七猫': { + try { + const trackId = 'ec1280db127955061754851657967'; + let signString = `extend=page=${page}read_preference=0track_id=${trackId}wd=${wd}${aggConfig.keys}`; + let sign = await md5(signString); + const encodedKey = encodeURIComponent(wd); + const url = `${platRule.host}${platRule.search}?extend=&page=${page}&wd=${encodedKey}&read_preference=0&track_id=${trackId}&sign=${sign}`; + const headers = await getQiMaoHeaders(); + const response = await request(url, { method: 'GET', headers, timeout: searchTimeout }); + const res = JSON.parse(response || '{}'); + let items = res.data?.list || res.list || []; + log(0, '七猫搜索', `获取到 ${items.length} 条`); + results = items.map(item => ({ + vod_id: `七猫@${encodeURIComponent(item.playlet_id || item.id || '')}`, + vod_name: item.title || '未知标题', + vod_pic: item.image_link || item.cover || '', + vod_remarks: '七猫短剧 | ' + (item.tags || '') + ' ' + (item.total_episode_num ? `${item.total_episode_num}集` : ''), + vod_content: item.intro || '' + })); + } catch (e) { + log(2, '七猫搜索', e.message); + } + break; + } + + case '星芽': { + const postData = { "text": wd }; + const requestUrl = `${platRule.host}${platRule.search}`; + const response = await request(requestUrl, { + method: 'POST', + headers: xingya_headers, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = res.data?.theater?.search_data || []; + log(0, '星芽搜索', `获取到 ${items.length} 条`); + results = items.map(item => ({ + vod_id: `星芽@${item.id}`, + vod_name: item.title || '', + vod_pic: item.cover_url || '', + vod_remarks: '星芽短剧 | ' + (item.total ? `${item.total}集` : ''), + vod_content: item.introduction || '' + })); + break; + } + + case '西饭': { + const ts = Math.floor(Date.now() / 1000); + const url = `${platRule.host}${platRule.search}?keyword=${encodeURIComponent(wd)}&pageIndex=${page}&version=2001001&androidVersionCode=28&requestId=${ts}ea3a14bc0317d76f&appId=drama&teenMode=false&userBaseMode=false&${XIFAN_SESSION_PARAMS}`; + const response = await request(url, { headers: aggConfig.headers.form, timeout: searchTimeout }); + const res = JSON.parse(response || '{}'); + let items = []; + if (res.result?.elements) { + res.result.elements.forEach(soup => { + if (soup.contents) { + soup.contents.forEach(vod => { + const dj = vod.duanjuVo || {}; + items.push({ + vod_id: `西饭@${dj.duanjuId || ''}#${dj.source || ''}`, + vod_name: dj.title || '未知标题', + vod_pic: dj.coverImageUrl || '', + vod_remarks: '西饭短剧 | ' + (dj.total ? `${dj.total}集` : ''), + vod_content: '' + }); + }); + } + }); + } + log(0, '西饭搜索', `获取到 ${items.length} 条`); + results = items; + break; + } + + case '牛牛': { + const postData = { + "condition": { "typeId": "S1", "value": wd }, + "pageNum": page, + "pageSize": searchLimit + }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: niuniu_headers, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = res.data?.records || []; + log(0, '牛牛搜索', `获取到 ${items.length} 条`); + results = items.map(item => ({ + vod_id: `牛牛@${item.id}`, + vod_name: item.name || '', + vod_pic: item.cover || '', + vod_remarks: '牛牛短剧 | ' + (item.totalEpisode ? `${item.totalEpisode}集` : ''), + vod_content: '' + })); + break; + } + + case '围观': { + const postData = { + "audience": "", + "page": page, + "pageSize": 30, + "searchWord": wd, + "subject": "" + }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: aggConfig.headers.json, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = (res.code === 200 && res.data) ? res.data : []; + log(0, '围观搜索', `获取到 ${items.length} 条`); + results = items.map(it => ({ + vod_id: `围观@${it.oneId || ''}`, + vod_name: it.title || '未知标题', + vod_pic: it.vertPoster || it.horizonPoster || '', + vod_remarks: '围观短剧 | 集数:' + (it.episodeCount || 0), + vod_content: it.description || '' + })); + break; + } + + case '河马': { + try { + const hmbody = JSON.stringify({ + "keyword": wd, + "page": page, + "size": searchLimit + }); + const encryptedBody = hemaEncrypt(hmbody); + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: hema_headers, + data: encryptedBody, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const xmres = res.data; + if (xmres) { + const dexmres = hemaDecrypt(xmres); + if (dexmres && dexmres !== '{}') { + const xmlist = JSON.parse(dexmres).searchVos || []; + log(0, '河马搜索', `获取到 ${xmlist.length} 条`); + results = xmlist.map(video => ({ + vod_id: `河马@${video.bookId}`, + vod_name: video.bookName || '', + vod_pic: (video.coverWap || '') + '@Referer=', + vod_remarks: `河马短剧 | 共${video.updateNum || 0}集`, + vod_content: video.introduction || '' + })); + } + } + } catch (e) { + log(2, '河马搜索', e.message); + } + break; + } + + case '星星': { + try { + const postData = { + "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0", + "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb", + "channel": "oppo19", + "osType": "android", + "version": "20", + "token": "202509271001001446030204698626", + "keyWord": wd, + "pageNum": String(page), + "pageSize": String(searchLimit) + }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'GET', + headers: aggConfig.headers.json, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = res.data?.datalist || []; + log(0, '星星搜索', `获取到 ${items.length} 条`); + results = items.map(vod => ({ + vod_id: `星星@${vod.id}@${encodeURIComponent(vod.introduction || '')}`, + vod_name: vod.name || '', + vod_pic: vod.icon || '', + vod_remarks: `星星短剧 | ${vod.heat || 0}万播放`, + vod_content: vod.introduction || '' + })); + } catch (e) { + log(2, '星星搜索', e.message); + } + break; + } + + case '好看': { + try { + const postData = { "search_word": wd }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: aggConfig.headers.haokan, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = res.data || []; + log(0, '好看搜索', `获取到 ${items.length} 条`); + results = items.map(item => ({ + vod_id: `好看@${item.id}`, + vod_name: item.title || '', + vod_pic: item.cover_url || '', + vod_remarks: '好看短剧 | ' + (item.tag ? item.tag.replace(/\//g, '·') : ''), + vod_content: '' + })); + } catch (e) { + log(2, '好看搜索', e.message); + } + break; + } + } + + // 关键词过滤 + const keywordRegex = new RegExp(wd, "i"); + let filteredResults = []; + for (let item of results) { + if (item.vod_name && keywordRegex.test(item.vod_name)) { + filteredResults.push(item); + } + } + + log(0, `${siteId}搜索`, `原始 ${results.length} 条,匹配后 ${filteredResults.length} 条`); + logTime(start, 'cfs'); + + const resultJson = JSON.stringify({ + list: filteredResults, + page: page, + pagecount: page + 1, + limit: filteredResults.length, + total: filteredResults.length * (page + 1) + }); + + setSearchCache(cacheKey, resultJson); + return resultJson; +} + +// ==================== 全局搜索 ==================== +async function search(wd, quick, pg) { + const start = Date.now(); + const videos = []; + const page = pg || 1; + + log(1, '全局搜索', `关键词: ${wd}, 页码: ${page}`); + + const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name))); + log(0, '全局搜索', `共 ${platForms.length} 个平台待搜索`); + + const searchPromises = platForms.map(async (platform) => { + try { + const result = await cfs(platform.id, wd, page); + return JSON.parse(result).list || []; + } catch (e) { + log(2, '全局搜索', `${platform.id} 异常: ${e.message}`); + return []; + } + }); + + const searchResults = await Promise.all(searchPromises); + + let totalResults = 0; + const hasResultPlats = []; + const noResultPlats = []; + + searchResults.forEach((list, idx) => { + const platform = platForms[idx]; + const count = list.length; + totalResults += count; + if (count > 0) { + hasResultPlats.push(`${platform.name}(${count}条)`); + } else { + noResultPlats.push(platform.name); + } + videos.push(...list); + }); + + if (hasResultPlats.length > 0) { + log(1, '搜索结果', `有结果: ${hasResultPlats.join(', ')}`); + } else { + log(2, '搜索结果', `无结果`); + } + + if (noResultPlats.length > 0) { + log(2, '搜索结果', `无结果平台: ${noResultPlats.join(', ')}`); + } + + log(1, '搜索结果汇总', `共 ${totalResults} 条`); + + // 关键词过滤 + const keywordRegex = new RegExp(wd, "i"); + let filteredResults = []; + for (let item of videos) { + if (item.vod_name && keywordRegex.test(item.vod_name)) { + filteredResults.push(item); + } + } + + log(1, '全局搜索', `原始 ${videos.length} 条,过滤后 ${filteredResults.length} 条`); + logTime(start, 'search'); + + return JSON.stringify({ + list: filteredResults, + page: page, + pagecount: page + 1, + limit: filteredResults.length, + total: filteredResults.length * (page + 1) + }); +} +// ==================== 播放 ==================== +async function play(flag, id, flags) { + log(0, '播放', `${flag} ${id.substring(0, 50)}`); + + if (/好看|百度/.test(flag)) { + let parts = id.split('@'); + let playletId = parts[0]; + let vid = parts[1]; + + if (/好看/.test(flag)) { + const innerParams = `method=post&vid=${vid}&immersive_mode=v4_5&tplname=feed_small_video&tag=playlet_talos&tab=detail&external_from=&is_dp_video=0&immersive_square_type=3&video_set_id=${playletId}&play_screen_type=1&play_volume_type=2&play_external_device_type=1`; + const response = await request(`${rule.好看.host}${rule.好看.play}`, { + method: 'POST', headers: aggConfig.headers.haokan, data: { "video/relate": innerParams } + }); + try { + const videoData = JSON.parse(response)['video/relate']?.data?.cur_video || {}; + const urlMap = {}; + if (videoData.clarityUrl) videoData.clarityUrl.forEach(c => { if (c.title && c.url) urlMap[c.title] = c.url; }); + if (videoData.video_list) Object.entries(videoData.video_list).forEach(([k, v]) => { if (!urlMap[k]) urlMap[k] = v; }); + const sortedQualities = Object.keys(urlMap).sort((a, b) => { + const order = { '4k': 0, '2k': 1, '高清': 2, '蓝光': 3, '超清': 4, '标清': 5 }; + return (order[a] ?? 999) - (order[b] ?? 999); + }); + const playUrls = []; + sortedQualities.forEach(q => playUrls.push(q, urlMap[q])); + if (playUrls.length > 0) return JSON.stringify({ parse: 0, url: playUrls }); + } catch (e) { } + return JSON.stringify({ parse: 0, url: id }); + } + + if (/百度/.test(flag)) { + const response = await request(`${rule.百度.detailHost}${rule.百度.play}`, { + method: 'POST', headers: aggConfig.headers.baidu, data: { "method": "post", "vid": vid } + }); + let json = JSON.parse(response)["video/relate"]?.data?.cur_video; + if (!json?.clarityUrl) return JSON.stringify({ parse: 0, url: id }); + let urls = json.clarityUrl.filter(item => item.url && item.title).map(item => ({ title: item.title, url: item.url, order: { '蓝光': 1, '超清': 2, '标清': 3 }[item.title] || 999 })).sort((a, b) => a.order - b.order).flatMap(item => [item.title, item.url]); + return JSON.stringify({ parse: urls.length > 0 ? 0 : 1, url: urls.length > 0 ? urls : id }); + } + } + + if (/河马/.test(flag)) { + try { + let arr = id.split("++"); + let chapterId = arr[0], bookId = arr[2]; + let fsbody = JSON.stringify({ "bookId": bookId, "chapterId": chapterId, "unClockType": "pay", "confirmPay": 2, "autoPayFlag": true, "omap": { "channelName": "精选", "logId": "17a6500357709bb2547e1e122b438cfc", "originName": "书城", "recId": "bigdata_rec", "scene": "nsc_727", "sceneId": "dzmf_video_sc_reco", "strategyId": "g6y6b5sq" } }); + let fsbodyEnc = hemaEncrypt(fsbody); + let response = await request(rule.河马.host + rule.河马.play, { + method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: fsbodyEnc + }); + let res = JSON.parse(response); + let fshtml = res.data; + if (fshtml) { + let fsdata = hemaDecrypt(fshtml); + if (fsdata && fsdata !== '{}') { + let parsed = JSON.parse(fsdata); + if (parsed.chaptersPayType == '免费') { + let url = parsed.chapterInfo?.[0]?.content?.m3u8720p || []; + if (url) return JSON.stringify({ parse: 0, url: url }); + } + } + } + let playurl = "https://api.cenguigui.cn/api/duanju/hema.php?book_id=" + bookId + "&video_id=" + chapterId + "&type=mp4"; + return JSON.stringify({ parse: 0, url: playurl + '#isVideo=true#' }); + } catch (e) { + return JSON.stringify({ parse: 0, url: id }); + } + } + + if (/牛牛/.test(flag)) { + const inputArr = id.split('+'); + if (inputArr.length === 2) { + let ep = inputArr[0].match(/\d+/)?.[0] || ""; + let videoId = inputArr[1]; + let response = await request(`${rule.牛牛.host}/api/v1/app/play/movieDetails`, { + method: 'POST', headers: niuniu_headers, data: { "id": videoId, "source": 0, "typeId": "S1", "userId": "546932", "episodeId": ep } + }); + let result = JSON.parse(response); + if (result.code == 200 && result.data?.url) return JSON.stringify({ parse: 0, url: result.data.url }); + } else if (inputArr.length === 3) { + let index = inputArr[0], lock_type = inputArr[1], thirdPlayId = inputArr[2]; + let data1 = `not_include=0&lock_free=1&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&dt=22021211RC&os_api=31&install_id=1496879012031075&sdk_version=1.1.3.0&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498494&direction=0&ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&count=1&index=1&shortplay_id=${thirdPlayId}&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&device_brand=Redmi&package_name=com.niuniu.ztdh.app`; + if (lock_type === "free") { + let frhtml = await niuniuPost(rule.牛牛.detail2, data1, index); + if (frhtml?.data?.list?.[0]) { + let url = base64Decode(frhtml.data.list[0].video_model.video_list.video_1.main_url); + return JSON.stringify({ parse: 0, url }); + } + } else { + let unlockData = `ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&lock_ad=3&lock_free=3&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&shortplay_id=${thirdPlayId}&dt=22021211RC&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&lock_index=21&os_api=31&install_id=1496879012031075&device_brand=Redmi&sdk_version=1.1.3.0&package_name=com.niuniu.ztdh.app&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498493`; + await niuniuPost(rule.牛牛.unlock, unlockData, index); + let unhtml = await niuniuPost(rule.牛牛.detail2, data1, index); + if (unhtml?.data?.list?.[0]) { + let url = base64Decode(unhtml.data.list[0].video_model.video_list.video_1.main_url); + return JSON.stringify({ parse: 0, url }); + } + } + } + return JSON.stringify({ parse: 0, url: id }); + } + + if (/围观/.test(flag)) { + try { + let playSetting = typeof id === 'string' ? JSON.parse(id) : id; + let urls = []; + if (playSetting.super) urls.push("超清", playSetting.super); + if (playSetting.high) urls.push("高清", playSetting.high); + if (playSetting.normal) urls.push("流畅", playSetting.normal); + return JSON.stringify({ parse: 0, url: urls.length ? urls : id }); + } catch (e) { + return JSON.stringify({ parse: 0, url: id }); + } + } + + return JSON.stringify({ parse: 0, url: id }); +} + +// ==================== 工具函数 ==================== +function buildUrlQuery(params) { + return Object.keys(params).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`).join('&'); +} + +async function md5(str) { + return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex).toLowerCase(); +} + +function base64Encode(text) { + return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text)); +} + +function base64Decode(text) { + return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text)); +} + +function hmacSHA256(data, key) { + return CryptoJS.HmacSHA256(data, key).toString(CryptoJS.enc.Hex); +} + +function aesEncryptECB(text, keyStr) { + let key = CryptoJS.enc.Utf8.parse(keyStr); + return CryptoJS.AES.encrypt(text, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); +} + +function aesDecryptECB(ciphertext, keyStr) { + let key = CryptoJS.enc.Utf8.parse(keyStr); + return CryptoJS.AES.decrypt(ciphertext, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); +} + +function hemaEncrypt(plaintext) { + let key = CryptoJS.enc.Hex.parse("647a6b6a67667978677368796c677a6d"); + let iv = CryptoJS.enc.Hex.parse("6170697570646f776e65646372797074"); + let encrypted = CryptoJS.AES.encrypt(plaintext, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); + return encrypted.ciphertext.toString(CryptoJS.enc.Hex).toUpperCase(); +} + +function hemaDecrypt(word) { + let key = CryptoJS.enc.Hex.parse("647a6b6a67667978677368796c677a6d"); + let iv = CryptoJS.enc.Hex.parse("6170697570646f776e65646372797074"); + let srcs = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(word)); + let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); + return decrypt.toString(CryptoJS.enc.Utf8); +} + +async function niuniuPost(url1, data1, index) { + let t10 = String(Math.floor(Date.now() / 1000)); + let X_Nonce = "X9UknYKtLa3DmtjC"; + let body1 = data1.replace(/&lock_free=\d+/, "&lock_free=1").replace(/×tamp=\d+/, "×tamp=" + t10).replace(/&count=\d+/, "&count=1").replace(/&index=\d+/, "&index=" + index).replace(/&lock_ad=\d+/, "&lock_ad=1").replace(/&lock_index=\d+/, "&lock_index=" + index); + let body2 = aesEncryptECB(body1, 'ce49b18dd4e0a4d8'); + let signature = hmacSHA256(t10 + X_Nonce + body1, 'aceaa47f96b4875d446b2e1d97e03bbb'); + let res = await request(url1, { + method: 'POST', + headers: { 'X-Salt': 'FD8188A8D5', 'X-Nonce': X_Nonce, 'X-Timestamp': t10, 'X-Access-Token': niuniu_access_token, 'X-Signature': signature, 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/4.12.0' }, + data: body2 + }); + if (!res) return {}; + try { return JSON.parse(aesDecryptECB(res, 'ce49b18dd4e0a4d8')); } catch (e) { return {}; } +} + +async function request(url, options = {}) { + let reqHeaders = { ...aggConfig.headers.form, ...options.headers }; + let finalUrl = url; + let requestData = options.data; + let useBody = false; + + // POST + 字符串 + form类型 → 直接作为body发送(保留空格,牛牛接口需要) + if (options.method === 'POST' && typeof options.data === 'string' && reqHeaders['Content-Type']?.includes('form')) { + useBody = true; + } + + // GET请求处理 + if ((options.method === 'GET' || !options.method) && options.data && !useBody) { + let queryData = options.data; + if (typeof queryData === 'string') { + try { queryData = JSON.parse(queryData); } catch (e) { queryData = {}; } + } + finalUrl = url + (url.includes('?') ? '&' : '?') + buildUrlQuery(queryData); + requestData = null; + } + + // 确定postType(关键!告诉req如何处理data) + let postType = ''; + if (!useBody && options.data) { + let ct = reqHeaders['Content-Type'] || ''; + postType = ct.includes('json') ? 'json' : (ct.includes('form') ? 'form' : ''); + } + + try { + const res = await req(finalUrl, { + method: options.method || 'GET', + headers: reqHeaders, + ...(useBody ? { body: requestData } : { data: requestData, postType: postType }), + timeout: options.timeout || 15000 + }); + return res?.content || res?.data || res; + } catch (e) { + log(2, '请求', e.message); + return null; + } +} + +// ==================== 导出 ==================== +export function __jsEvalReturn() { + return { init, home, homeVod, category, detail, play, search }; +} \ No newline at end of file diff --git a/cpu_iy3/lib/mwcy.js b/cpu_iy3/lib/mwcy.js new file mode 100644 index 00000000..bb8f941a --- /dev/null +++ b/cpu_iy3/lib/mwcy.js @@ -0,0 +1,589 @@ +/** + * title: "喵物次元", + * logo: "https://www.mwcy.net/favicon.ico", + * more: { + * sourceTag: "动漫" + * } + */ +import { Crypto, load, _ } from 'assets://js/lib/cat.js'; + +const HOST = 'https://www.mwcy.net'; +const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'; + +let siteKey = "", siteType = "", sourceKey = "", ext = ""; + +function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype; + sourceKey = cfg.sourceKey; + ext = cfg.ext; + // 如果ext传入则覆盖HOST(保持兼容) + if (ext && ext.indexOf('http') == 0) HOST = ext; +} + +// ==================== 辅助函数 ==================== +function fixUrl(url) { + if (!url) return ''; + url = url.trim(); + if (url.startsWith('//')) return 'https:' + url; + if (url.startsWith('/')) return HOST + url; + return url; +} + +function cleanText(text) { + if (!text) return ''; + return text.replace(/\s+/g, ' ').trim(); +} + +function isVideoFormat(url) { + if (!url) return false; + return /\.(m3u8|mp4|mkv|flv|avi|mov|wmv|webm)(\?.*)?$/i.test(url); +} + +// ==================== 1. 首页内容与筛选配置 ==================== +function home(filter) { + // 固定分类(6个) + const classes = [ + { type_id: "1", type_name: "番剧" }, + { type_id: "22", type_name: "连载新番" }, + { type_id: "24", type_name: "国漫" }, + { type_id: "2", type_name: "剧场" }, + { type_id: "25", type_name: "欧美动漫" }, + { type_id: "26", type_name: "4K专区" } + ]; + + // ---- 公共筛选选项 ---- + // 年份:当前年份往前30年 + 更早 + const yearList = (() => { + const years = [{ n: "全部", v: "" }]; + const currentYear = new Date().getFullYear(); + for (let y = currentYear; y >= currentYear - 30; y--) { + years.push({ n: String(y), v: String(y) }); + } + years.push({ n: "更早", v: "更早" }); + return years; + })(); + + // 字母 + const letterList = (() => { + const letters = [{ n: "全部", v: "" }]; + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''); + chars.forEach(c => letters.push({ n: c, v: c })); + letters.push({ n: "0-9", v: "0-9" }); + return letters; + })(); + + // 排序 + const orderList = [ + { n: "最新", v: "time" }, + { n: "最热", v: "hits" }, + { n: "评分", v: "score" } + ]; + + // 地区(用于剧场、欧美动漫) + const areaList = [ + { n: "全部", v: "" }, + { n: "大陆", v: "大陆" }, + { n: "香港", v: "香港" }, + { n: "台湾", v: "台湾" }, + { n: "美国", v: "美国" }, + { n: "法国", v: "法国" }, + { n: "英国", v: "英国" }, + { n: "日本", v: "日本" }, + { n: "韩国", v: "韩国" }, + { n: "德国", v: "德国" }, + { n: "泰国", v: "泰国" }, + { n: "印度", v: "印度" }, + { n: "意大利", v: "意大利" }, + { n: "西班牙", v: "西班牙" }, + { n: "加拿大", v: "加拿大" }, + { n: "其他", v: "其他" } + ]; + + // ---- 按分类配置筛选器 ---- + const filters = { + "1": [ // 番剧 + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "22": [ // 连载新番 + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "24": [ // 国漫 + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "2": [ // 剧场 + { key: "area", name: "地区", value: areaList }, + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "25": [ // 欧美动漫 + { key: "area", name: "地区", value: areaList }, + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "26": [ // 4K专区 + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ] + }; + + return JSON.stringify({ class: classes, filters: filters }); +} + +// ==================== 2. 首页推荐视频 ==================== +async function homeVod() { + try { + const res = await req(HOST, { headers: { 'User-Agent': UA } }); + const $ = load(res.content); + + // 定位“十月新番”区域 + let section = null; + $('.box-width.wow.fadeInUp .title .title-h').each((i, el) => { + if ($(el).text().trim() === '十月新番') { + section = $(el).closest('.box-width').find('.public-r'); + return false; + } + }); + if (!section) { + section = $('.public-list-box.public-pic-b').parent(); + } + + const items = section ? section.find('.public-list-box.public-pic-b') : $('.public-list-box.public-pic-b'); + const videos = []; + const seen = new Set(); + + items.each((i, el) => { + const $el = $(el); + const $link = $el.find('a.public-list-exp'); + const href = $link.attr('href'); + if (!href || !href.startsWith('/bangumi/')) return; + const title = $el.find('.time-title').text().trim() || $link.attr('title') || ''; + const pic = $link.find('img').attr('data-src') || $link.find('img').attr('src') || ''; + const remarks = $el.find('.public-list-prb').text().trim() || ''; + if (title && href) { + const vod_id = href.startsWith('http') ? href : HOST + href; + if (!seen.has(vod_id)) { + seen.add(vod_id); + videos.push({ vod_id, vod_name: title, vod_pic: pic, vod_remarks: remarks }); + } + } + }); + + return JSON.stringify({ list: videos }); + } catch (e) { + console.log('homeVod error:', e); + return null; + } +} + +// ==================== 3. 分类内容爬取 ==================== +async function category(tid, pg, filter, extend) { + if (pg <= 0) pg = 1; + extend = extend || {}; + const area = extend.area || ''; + const year = extend.year || ''; + const letter = extend.letter || ''; + const order = extend.order || ''; + + // 构建URL + let url = `${HOST}/show/${tid}`; + const parts = []; + if (area) parts.push(`area/${encodeURIComponent(area)}`); + if (order) parts.push(`by/${encodeURIComponent(order)}`); + if (letter) parts.push(`letter/${encodeURIComponent(letter)}`); + if (year) parts.push(`year/${encodeURIComponent(year)}`); + if (pg > 1) parts.push(`page/${pg}`); + + if (parts.length > 0) { + url += '/' + parts.join('/') + '.html'; + } else { + url += (pg === 1 ? '.html' : `/page/${pg}.html`); + } + + + try { + const res = await req(url, { headers: { 'User-Agent': UA } }); + const $ = load(res.content); + + // 解析视频列表(多级兜底) + let items = $('.public-list-box.public-pic-b'); + if (!items.length) items = $('.public-list-div').parent(); + + const videos = []; + const seen = new Set(); + + items.each((i, el) => { + const $el = $(el); + const $link = $el.find('a.public-list-exp'); + const href = $link.attr('href'); + if (!href) return; + + let vod_id = href; + if (!href.startsWith('http')) vod_id = HOST + href; + // 如果是 /play/ 链接,转换为 /bangumi/ + if (href.startsWith('/play/')) { + const match = href.match(/^\/play\/([^-]+)/); + if (match) { + vod_id = HOST + `/bangumi/${match[1]}.html`; + } else { + return; + } + } else if (!href.startsWith('/bangumi/')) { + return; + } + + const title = $el.find('.time-title').text().trim() || $link.attr('title') || ''; + const pic = $link.find('img').attr('data-src') || $link.find('img').attr('src') || ''; + const remarks = $el.find('.public-list-prb').text().trim() || ''; + if (title && vod_id && !seen.has(vod_id)) { + seen.add(vod_id); + videos.push({ + vod_id, + vod_name: title, + vod_pic: fixUrl(pic), + vod_remarks: remarks + }); + } + }); + + // 提取总页数 + let pagecount = 1; + const pageTip = $('.page-tip').text().trim(); + if (pageTip) { + const match = pageTip.match(/当前\d+\/(\d+)页/); + if (match) pagecount = parseInt(match[2]) || 1; + } + if (pagecount === 1) { + const lastPage = $('.page-link').last().attr('href'); + if (lastPage) { + const m = lastPage.match(/page\/(\d+)\.html/); + if (m) pagecount = parseInt(m[1]) || 1; + } + } + + return JSON.stringify({ + list: videos, + page: pg, + pagecount: pagecount, + limit: 20, + total: videos.length + }); + } catch (e) { + console.log('category error:', e); + return JSON.stringify({ list: [] }); + } +} + +// ==================== 4. 搜索功能 ==================== +async function search(wd) { + try { + const encoded = encodeURIComponent(wd); + const url = `${HOST}/search/wd/${encoded}.html`; + + const res = await req(url, { headers: { 'User-Agent': UA } }); + const $ = load(res.content); + + // 搜索页结果使用 .vod-detail.search-list + let items = $('.vod-detail.search-list'); + if (!items.length) items = $('.vod-detail'); + + const videos = []; + const seen = new Set(); + + items.each((i, el) => { + const $el = $(el); + // 标题和链接 + let title = ''; + let vod_id = ''; + const titleEl = $el.find('h3.slide-info-title'); + if (titleEl.length) title = titleEl.text().trim(); + + const linkEl = $el.find('a[target="_blank"]'); + if (linkEl.length) { + const href = linkEl.attr('href'); + if (href) { + if (href.startsWith('/bangumi/')) { + vod_id = HOST + href; + } else if (href.startsWith('/play/')) { + const match = href.match(/^\/play\/([^-]+)/); + if (match) vod_id = HOST + `/bangumi/${match[1]}.html`; + } + } + if (!title) title = linkEl.text().trim(); + } + if (!title) { + // 从其他位置找 + const altTitle = $el.find('.slide-info-title').text().trim(); + if (altTitle) title = altTitle; + } + + const pic = $el.find('.detail-pic img').attr('data-src') || $el.find('.detail-pic img').attr('src') || ''; + const remarks = $el.find('.slide-info-remarks').first().text().trim() || ''; + + if (title && vod_id && !seen.has(vod_id)) { + seen.add(vod_id); + videos.push({ + vod_id, + vod_name: title, + vod_pic: fixUrl(pic), + vod_remarks: remarks + }); + } + }); + + // 总页数 + let pagecount = 1; + const pageTip = $('.page-tip').text().trim(); + if (pageTip) { + const match = pageTip.match(/当前\d+\/(\d+)页/); + if (match) pagecount = parseInt(match[2]) || 1; + } + return JSON.stringify({ + list: videos, + page: 1, + pagecount: pagecount, + limit: 20, + total: videos.length + }); + } catch (e) { + console.log('search error:', e); + return JSON.stringify({ list: [] }); + } +} + +// ==================== 5. 详情页解析 ==================== +async function detail(id) { + try { + const url = id.startsWith('http') ? id : HOST + id; + const res = await req(url, { headers: { 'User-Agent': UA } }); + const $ = load(res.content); + + // 标题 + let vod_name = $('h3.slide-info-title').text().trim(); + if (!vod_name) vod_name = $('.player-title-link').text().trim(); + if (!vod_name) vod_name = $('title').text().replace(/^.*? - /, '').replace(/ - .*$/, ''); + + // 封面 + let vod_pic = $('.detail-pic img').attr('data-src') || $('.detail-pic img').attr('src') || ''; + if (!vod_pic) vod_pic = $('.vod-detail .detail-pic img').attr('data-src') || ''; + + // 简介 + let vod_content = $('#height_limit').text().trim() || $('.vod-news .text').first().text().trim() || ''; + + // 元数据:年份、地区、类型 + let vod_year = '', vod_area = ''; + $('.slide-info .slide-info-remarks a').each((i, el) => { + const text = $(el).text().trim(); + if (/^\d{4}$/.test(text)) vod_year = text; + else if (['日本','大陆','香港','台湾','美国','英国','韩国','法国','德国','泰国','印度','意大利','西班牙','加拿大','其他'].includes(text)) { + vod_area = text; + } + }); + // 类型 + // ---- 提取演员和导演 ---- + let vod_actor = '', vod_director = '', type_name = ''; + + // 方式1:从 .slide-info.partition 中提取 + $('.slide-info.partition').each((i, el) => { + const $el = $(el); + + // 类型 + const typeStrong = $el.find('strong:contains("类型")'); + if (typeStrong.length) { + const typeLinks = typeStrong.nextAll('a').map((j, a) => $(a).text().trim()).get(); + if (typeLinks.length) type_name = typeLinks.join(','); + } + // 导演 + const dirStrong = $el.find('strong:contains("导演")'); + if (dirStrong.length) { + const dirLinks = dirStrong.nextAll('a').map((j, a) => $(a).text().trim()).get(); + if (dirLinks.length) vod_director = dirLinks.join(','); + } + // 演员 + const actorStrong = $el.find('strong:contains("演员")'); + if (actorStrong.length) { + const actorLinks = actorStrong.nextAll('a').map((j, a) => $(a).text().trim()).get(); + if (actorLinks.length) vod_actor = actorLinks.join(','); + } + }); + + // ---- 播放源与剧集 ---- + const playFrom = []; + const playUrls = []; + + // 获取线路名称 + const sourceNames = []; + $('.anthology-tab a').each((i, el) => { + let name = $(el).text().trim(); + name = name.replace(/]*>.*?<\/i>/, '').replace(/ /g, '').replace(/]*>.*?<\/span>/, '').trim(); + if (name) sourceNames.push(name); + }); + if (!sourceNames.length) { + $('.vod-playerUrl').each((i, el) => { + let name = $(el).text().trim(); + name = name.replace(/]*>.*?<\/i>/, '').replace(/]*>.*?<\/span>/, '').trim(); + if (name) sourceNames.push(name); + }); + } + + const boxes = $('.anthology-list-box'); + if (boxes.length && sourceNames.length) { + boxes.each((idx, box) => { + const name = sourceNames[idx] || ('线路' + (idx+1)); + const episodes = []; + $(box).find('ul.anthology-list-play li a').each((j, ep) => { + const $ep = $(ep); + let epName = $ep.find('span').text().trim() || $ep.text().trim(); + let href = $ep.attr('href'); + if (epName && href) { + href = fixUrl(href); + episodes.push(epName + '$' + href); + } + }); + if (episodes.length) { + playFrom.push(name); + playUrls.push(episodes.join('#')); + } + }); + } + + if (!playFrom.length) { + const singleBox = $('.anthology-list-play'); + if (singleBox.length) { + const episodes = []; + singleBox.find('li a').each((j, ep) => { + const $ep = $(ep); + let epName = $ep.find('span').text().trim() || $ep.text().trim(); + let href = $ep.attr('href'); + if (epName && href) { + href = fixUrl(href); + episodes.push(epName + '$' + href); + } + }); + if (episodes.length) { + playFrom.push('默认线路'); + playUrls.push(episodes.join('#')); + } + } + } + + const vod = { + vod_id: id, + vod_name, + vod_pic: fixUrl(vod_pic), + type_name, + vod_actor: vod_actor, + vod_director: vod_director, + vod_year, + vod_area, + vod_remarks: '', + vod_content, + vod_play_from: playFrom.join('$$$'), + vod_play_url: playUrls.join('$$$') + }; + + return JSON.stringify({ list: [vod] }); + } catch (e) { + console.log('detail error:', e); + return null; + } +} + +// ==================== 6. 播放链接解析 ==================== +async function play(flag, id, flags) { + try { + const playUrl = id.startsWith('http') ? id : HOST + id; + const res = await req(playUrl, { headers: { 'User-Agent': UA } }); + const html = res.content; + + const match = html.match(/player_.*?=([^]*?) { + try { + const apiUrl = `https://player.catw.moe${apiPath}${encodeURIComponent(videoUrl)}&_t=${Date.now()}`; + const res = await req(apiUrl, { headers: { 'User-Agent': UA } }); + const html = res.content; + // 提取 uid + const uidMatch = html.match(/"uid"\s*:\s*"([^"]+)"/); + const uid = uidMatch ? uidMatch[1] : null; + console.log('uid:', uid); + // 提取 url (ConFig 根层级那个长字符串) + const urlMatch = html.match(/"url"\s*:\s*"([^"]+)"/); + const url = urlMatch ? urlMatch[1] : null; + console.log('url:', url); + if (!uid || !url) { + console.log('[喵物次元] ConFig 缺少 uid 或 url'); + return null; + } + + const realUrl = decryptEcUrl(url, uid); + if (realUrl) { + return { url: realUrl, ua: UA }; + } + return null; + } catch (e) { + return null; + } + }; + + let parsed = await tryParse('/player/ec.php?code=qw&if=1&url='); + if (!parsed) parsed = await tryParse('/art.php?url='); + + if (parsed) { + return JSON.stringify({ + parse: 0, + url: parsed.url, + header: { 'User-Agent': parsed.ua } + }); + } + + return JSON.stringify({ parse: 1, url: playUrl }); + } catch (e) { + return JSON.stringify({ parse: 1, url: id }); + } +} + +function decryptEcUrl(encryptedBase64, uid) { + try { + const aesKey = '2890' + uid + 'tB959C'; + const aesIv = '2F131BE91247866E'; + // aesX(算法, 加密?false=解密, 数据, 输入是Base64?, key, iv, 输出是Base64?) + const realUrl = aesX('AES/CBC/PKCS7', false, encryptedBase64, true, aesKey, aesIv, false); + console.log(realUrl) + return realUrl; + } catch (e) { + return null; + } +} + +// ==================== 导出 ==================== +export function __jsEvalReturn() { + return { + init, + home, + homeVod, + category, + detail, + play, + search + }; +} \ No newline at end of file diff --git a/cpu_iy3/lib/qmdj.py b/cpu_iy3/lib/qmdj.py new file mode 100644 index 00000000..7d64d491 --- /dev/null +++ b/cpu_iy3/lib/qmdj.py @@ -0,0 +1,518 @@ +# coding=utf-8 +# !/usr/bin/python + +""" + +作者 丢丢喵推荐 🚓 内容均从互联网收集而来 仅供交流学习使用 版权归原创者所有 如侵犯了您的权益 请通知作者 将及时删除侵权内容 + ====================Diudiumiao==================== + +""" + +from Crypto.Util.Padding import unpad +from Crypto.Util.Padding import pad +from urllib.parse import unquote +from Crypto.Cipher import ARC4 +from urllib.parse import quote +from base.spider import Spider +from Crypto.Cipher import AES +from datetime import datetime +from bs4 import BeautifulSoup +from base64 import b64decode +import urllib.request +import urllib.parse +import datetime +import binascii +import requests +import hashlib +import base64 +import json +import time +import sys +import re +import os + +sys.path.append('..') + +xurl = "https://api-store.qmplaylet.com" + +xurl1 = "https://api-read.qmplaylet.com" + +keys = "d3dGiJc651gSQ8w1" + +data = { + "static_score": "0.8", + "uuid": "00000000-7fc7-08dc-0000-000000000000", + "device-id": "20250220125449b9b8cac84c2dd3d035c9052a2572f7dd0122edde3cc42a70", + "mac": "", + "sourceuid": "aa7de295aad621a6", + "refresh-type": "0", + "model": "22021211RC", + "wlb-imei": "", + "client-id": "aa7de295aad621a6", + "brand": "Redmi", + "oaid": "", + "oaid-no-cache": "", + "sys-ver": "12", + "trusted-id": "", + "phone-level": "H", + "imei": "", + "wlb-uid": "aa7de295aad621a6", + "session-id": str(int(time.time() * 1000)), + } + +json_str = json.dumps(data, separators=(',', ':')) +encoded = base64.b64encode(json_str.encode()).decode() + +char_map = { + '+': 'P', '/': 'X', '0': 'M', '1': 'U', '2': 'l', '3': 'E', '4': 'r', + '5': 'Y', '6': 'W', '7': 'b', '8': 'd', '9': 'J', 'A': '9', 'B': 's', + 'C': 'a', 'D': 'I', 'E': '0', 'F': 'o', 'G': 'y', 'H': '_', 'I': 'H', + 'J': 'G', 'K': 'i', 'L': 't', 'M': 'g', 'N': 'N', 'O': 'A', 'P': '8', + 'Q': 'F', 'R': 'k', 'S': '3', 'T': 'h', 'U': 'f', 'V': 'R', 'W': 'q', + 'X': 'C', 'Y': '4', 'Z': 'p', 'a': 'm', 'b': 'B', 'c': 'O', 'd': 'u', + 'e': 'c', 'f': '6', 'g': 'K', 'h': 'x', 'i': '5', 'j': 'T', 'k': '-', + 'l': '2', 'm': 'z', 'n': 'S', 'o': 'Z', 'p': '1', 'q': 'V', 'r': 'v', + 's': 'j', 't': 'Q', 'u': '7', 'v': 'D', 'w': 'w', 'x': 'n', 'y': 'L', + 'z': 'e' + } + +qm_params = '' +for c in encoded: + qm_params += char_map.get(c, c) + +params_str = ( + "AUTHORIZATION=" + + "app-version=10001" + + "application-id=com.duoduo.read" + + "channel=unknown" + + "is-white=" + + "net-env=5" + + "platform=android" + + f"qm-params={qm_params}" + + f"reg={keys}" + ) + +signs = hashlib.md5(params_str.encode()).hexdigest() + +headerx = { + 'net-env': '5', + 'reg': '', + 'channel': 'unknown', + 'is-white': '', + 'platform': 'android', + 'application-id': 'com.duoduo.read', + 'authorization': '', + 'app-version': '10001', + 'user-agent': 'webviewversion/0', + 'qm-params': qm_params, + 'sign': signs + } + +headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36' + } + +# 全局变量用于缓存百度跳转信息 +baidu_name_cache = "" +baidu_jump_cache = "" + +class Spider(Spider): + global xurl + global xurl1 + global keys + global headerx + global headers + global baidu_name_cache + global baidu_jump_cache + + def getName(self): + return "首页" + + def init(self, extend): + global baidu_name_cache, baidu_jump_cache + # 初始化时获取百度跳转信息并缓存 + try: + response = requests.get(url='https://m.baidu.com/', headers=headers, timeout=5) + response.encoding = 'utf-8' + code = response.text + baidu_name_cache = self.extract_middle_text(code, "s1='", "'", 0) + baidu_jump_cache = self.extract_middle_text(code, "s2='", "'", 0) + except: + baidu_name_cache = "" + baidu_jump_cache = "" + + def isVideoFormat(self, url): + pass + + def manualVideoCheck(self): + pass + + def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''): + if pl == 3: + plx = [] + while True: + start_index = text.find(start_str) + if start_index == -1: + break + end_index = text.find(end_str, start_index + len(start_str)) + if end_index == -1: + break + middle_text = text[start_index + len(start_str):end_index] + plx.append(middle_text) + text = text.replace(start_str + middle_text + end_str, '') + if len(plx) > 0: + purl = '' + for i in range(len(plx)): + matches = re.findall(start_index1, plx[i]) + output = "" + for match in matches: + match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1]) + if match3: + number = match3.group(1) + else: + number = 0 + if 'http' not in match[0]: + output += f"#{match[1]}${number}{xurl}{match[0]}" + else: + output += f"#{match[1]}${number}{match[0]}" + output = output[1:] + purl = purl + output + "$$$" + purl = purl[:-3] + return purl + else: + return "" + else: + start_index = text.find(start_str) + if start_index == -1: + return "" + end_index = text.find(end_str, start_index + len(start_str)) + if end_index == -1: + return "" + + if pl == 0: + middle_text = text[start_index + len(start_str):end_index] + return middle_text.replace("\\", "") + + if pl == 1: + middle_text = text[start_index + len(start_str):end_index] + matches = re.findall(start_index1, middle_text) + if matches: + jg = ' '.join(matches) + return jg + + if pl == 2: + middle_text = text[start_index + len(start_str):end_index] + matches = re.findall(start_index1, middle_text) + if matches: + new_list = [f'{item}' for item in matches] + jg = '$$$'.join(new_list) + return jg + + def homeContent(self, filter): + result = {"class": []} + + sign_string = f"operation=1playlet_privacy=1tag_id=0{keys}" + sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest() + + url = f"{xurl}/api/v1/playlet/index?tag_id=0&playlet_privacy=1&operation=1&sign={sign}" + detail = requests.get(url=url, headers=headerx) + detail.encoding = "utf-8" + data = detail.json() + + duoxuan = ['0', '1', '2', '3', '4'] + for duo in duoxuan: + js = data['data']['tag_categories'][int(duo)]['tags'] + + for vod in js: + + name = vod['tag_name'] + if "推荐" in name: + continue + + id = vod['tag_id'] + + result["class"].append({"type_id": id, "type_name": "" + name}) + + return result + + def homeVideoContent(self): + videos = [] + + sign_string = f"operation=1playlet_privacy=1tag_id=0{keys}" + sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest() + + url = f"{xurl}/api/v1/playlet/index?tag_id=0&playlet_privacy=1&operation=1&sign={sign}" + detail = requests.get(url=url, headers=headerx) + detail.encoding = "utf-8" + data = detail.json() + + data = data['data']['list'] + + for vod in data: + + # 获取标题,确保不为空 + name = vod.get('title', '') + if not name: + name = vod.get('name', '未知标题') + name = str(name).strip() + + # 获取ID + id = vod.get('playlet_id', '') + if not id: + id = vod.get('id', '') + + # 获取封面 + pic = vod.get('image_link', '') + if not pic: + pic = vod.get('cover', '') + + # 获取热度值作为备注 + remark = vod.get('hot_value', '') + if not remark: + remark = vod.get('view_count', '') + + video = { + "vod_id": str(id), + "vod_name": name, + "vod_pic": pic, + "vod_remarks": str(remark) if remark else '' + } + videos.append(video) + + result = {'list': videos} + return result + + def categoryContent(self, cid, pg, filter, ext): + result = {} + videos = [] + + if pg: + page = int(pg) + else: + page = 1 + + if page == 1: + sign_string = f"operation=1playlet_privacy=1tag_id={cid}{keys}" + sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest() + url = f'{xurl}/api/v1/playlet/index?tag_id={cid}&playlet_privacy=1&operation=1&sign={sign}' + + else: + sign_string = f"next_id={str(page)}operation=1playlet_privacy=1tag_id={cid}{keys}" + sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest() + url = f'{xurl}/api/v1/playlet/index?tag_id={cid}&next_id={str(page)}&playlet_privacy=1&operation=1&sign={sign}' + + detail = requests.get(url=url, headers=headerx) + detail.encoding = "utf-8" + data = detail.json() + + data = data['data']['list'] + + for vod in data: + + name = vod.get('title', '') + if not name: + name = vod.get('name', '未知标题') + name = str(name).strip() + + id = vod.get('playlet_id', '') + if not id: + id = vod.get('id', '') + + pic = vod.get('image_link', '') + if not pic: + pic = vod.get('cover', '') + + remark = vod.get('hot_value', '') + if not remark: + remark = vod.get('view_count', '') + + video = { + "vod_id": str(id), + "vod_name": name, + "vod_pic": pic, + "vod_remarks": str(remark) if remark else '' + } + videos.append(video) + + result = {'list': videos} + result['page'] = pg + result['pagecount'] = 9999 + result['limit'] = 90 + result['total'] = 999999 + return result + + def detailContent(self, ids): + did = ids[0] + result = {} + videos = [] + xianlu = '七猫专线' # 统一使用七猫专线 + bofang = '' + + sign_string = f"playlet_id={did}{keys}" + sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest() + + urls = f'{xurl1}/player/api/v1/playlet/info?playlet_id={did}&sign={sign}' + detail = requests.get(url=urls, headers=headerx) + detail.encoding = "utf-8" + detail = detail.json() + + # 获取标题(使用API返回的标题) + title = detail.get('data', {}).get('title', '') + if not title: + title = detail.get('data', {}).get('name', '未知标题') + + blurb = detail.get('data', {}).get('intro') or "暂无剧情简介" + content = '剧情📢' + str(blurb) + + jisu = detail.get('data', {}).get('total_episode_num', '未知') + jisu = str(jisu) + '全集' + + leixing = detail.get('data', {}).get('tags', '未知') + + remarks = str(leixing) + " " + str(jisu) + + # 使用七猫的播放列表 + soup = detail.get('data', {}).get('play_list', []) + + if soup: + for sou in soup: + video_url = sou.get('video_url', '') + sort_name = sou.get('sort', '') + if video_url and sort_name: + bofang = bofang + str(sort_name) + '$' + str(video_url) + '#' + bofang = bofang[:-1] if bofang else '' + else: + # 如果没有播放列表,使用跳转链接 + global baidu_jump_cache + bofang = baidu_jump_cache + + videos.append({ + "vod_id": str(did), + "vod_name": str(title), + "vod_remarks": remarks, + "vod_content": content, + "vod_play_from": xianlu, + "vod_play_url": bofang + }) + + result['list'] = videos + return result + + def playerContent(self, flag, id, vipFlags): + result = {} + play_url = "" + + # 获取百度跳转信息(使用缓存) + global baidu_jump_cache + baidu_jump = baidu_jump_cache + + # 判断是否是外部跳转链接(百度等) + if 'baidu.com' in str(id) or 'tuios.com' in str(id) or 'qmplaylet' in str(id): + # 如果是外部跳转链接,直接使用 + play_url = str(id) + # 判断是否是直接的HTTP链接 + elif str(id).startswith('http'): + play_url = str(id) + # 如果是内部播放ID,需要重新获取详情 + else: + try: + # 获取该ID对应的详情信息 + sign_string = f"playlet_id={id}{keys}" + sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest() + detail_url = f'{xurl1}/player/api/v1/playlet/info?playlet_id={id}&sign={sign}' + detail_response = requests.get(url=detail_url, headers=headerx, timeout=5) + detail_response.encoding = "utf-8" + detail_data = detail_response.json() + + # 获取标题 + title = detail_data.get('data', {}).get('title', '') + if not title: + title = detail_data.get('data', {}).get('name', '') + + # 统一使用七猫专线的播放列表 + play_list = detail_data.get('data', {}).get('play_list', []) + + if play_list: + for idx, item in enumerate(play_list): + video_url = item.get('video_url', '') + sort_name = item.get('sort', '') + if video_url and sort_name: + if play_url: + play_url += '#' + play_url += str(sort_name) + '$' + str(video_url) + else: + # 如果没有play_list,使用原始ID + play_url = str(id) + + except Exception as e: + # 如果出错,使用跳转链接或原始ID + play_url = baidu_jump if baidu_jump else str(id) + + result["parse"] = 0 + result["playUrl"] = '' + result["url"] = play_url if play_url else str(id) + result["header"] = headers + + return result + + def searchContentPage(self, key, quick, pg): + result = {} + videos = [] + + if pg: + page = int(pg) + else: + page = 1 + + sign_string = f"extend=page={str(page)}read_preference=0track_id=ec1280db127955061754851657967wd={key}{keys}" + sign = hashlib.md5(sign_string.encode('utf-8')).hexdigest() + + url = f'{xurl}/api/v1/playlet/search?extend=&page={str(page)}&wd={key}&read_preference=0&track_id=ec1280db127955061754851657967&sign={sign}' + detail = requests.get(url=url, headers=headerx) + detail.encoding = "utf-8" + detail = detail.json() + + data = detail['data']['list'] + + for vod in data: + + name = vod.get('title', '') + if not name: + name = vod.get('name', '未知标题') + name = re.sub(r'<[^>]+>', '', str(name)) + name = ' '.join(name.split()) + + id = vod.get('id', '') + + pic = vod.get('image_link', '') + if not pic: + pic = vod.get('cover', '') + + remark = vod.get('total_num', '') + + video = { + "vod_id": str(id), + "vod_name": name, + "vod_pic": pic, + "vod_remarks": str(remark) if remark else '' + } + videos.append(video) + + result['list'] = videos + result['page'] = pg + result['pagecount'] = 9999 + result['limit'] = 90 + result['total'] = 999999 + return result + + def searchContent(self, key, quick, pg="1"): + return self.searchContentPage(key, quick, '1') + + def localProxy(self, params): + if params['type'] == "m3u8": + return self.proxyM3u8(params) + elif params['type'] == "media": + return self.proxyMedia(params) + elif params['type'] == "ts": + return self.proxyTs(params) + return None \ No newline at end of file diff --git a/cpu_iy3/lib/qxdj.py b/cpu_iy3/lib/qxdj.py new file mode 100644 index 00000000..c12e403e --- /dev/null +++ b/cpu_iy3/lib/qxdj.py @@ -0,0 +1,343 @@ +# coding = utf-8 +# !/usr/bin/python + +""" +""" + +from Crypto.Util.Padding import unpad +from Crypto.Util.Padding import pad +from urllib.parse import unquote +from Crypto.Cipher import ARC4 +from urllib.parse import quote +from base.spider import Spider +from Crypto.Cipher import AES +from bs4 import BeautifulSoup +from base64 import b64decode +import urllib.request +import urllib.parse +import binascii +import requests +import base64 +import json +import time +import sys +import re +import os + +sys.path.append('..') + +xurl = "https://app.whjzjx.cn" + +headers = { + 'User-Agent': 'Linux; Android 12; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.101 Mobile Safari/537.36' + } + +headerf = { + "platform": "1", + "user_agent": "Mozilla/5.0 (Linux; Android 9; V1938T Build/PQ3A.190705.08211809; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Safari/537.36", + "content-type": "application/json; charset=utf-8" + } + +times = int(time.time() * 1000) + +data = { + "device": "2a50580e69d38388c94c93605241fb306", + "package_name": "com.jz.xydj", + "android_id": "ec1280db12795506", + "install_first_open": True, + "first_install_time": 1752505243345, + "last_update_time": 1752505243345, + "report_link_url": "", + "authorization": "", + "timestamp": times + } + +plain_text = json.dumps(data, separators=(',', ':'), ensure_ascii=False) + +key = "B@ecf920Od8A4df7" +key_bytes = key.encode('utf-8') +plain_bytes = plain_text.encode('utf-8') +cipher = AES.new(key_bytes, AES.MODE_ECB) +padded_data = pad(plain_bytes, AES.block_size) +ciphertext = cipher.encrypt(padded_data) +encrypted = base64.b64encode(ciphertext).decode('utf-8') + +response = requests.post("https://u.shytkjgs.com/user/v3/account/login", headers=headerf, data=encrypted) +response_data = response.json() +Authorization = response_data['data']['token'] + +headerx = { + 'authorization': Authorization, + 'platform': '1', + 'version_name': '3.8.3.1' + } + +class Spider(Spider): + global xurl + global headerx + global headers + + def getName(self): + return "首页" + + def init(self, extend): + pass + + def isVideoFormat(self, url): + pass + + def manualVideoCheck(self): + pass + + def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''): + if pl == 3: + plx = [] + while True: + start_index = text.find(start_str) + if start_index == -1: + break + end_index = text.find(end_str, start_index + len(start_str)) + if end_index == -1: + break + middle_text = text[start_index + len(start_str):end_index] + plx.append(middle_text) + text = text.replace(start_str + middle_text + end_str, '') + if len(plx) > 0: + purl = '' + for i in range(len(plx)): + matches = re.findall(start_index1, plx[i]) + output = "" + for match in matches: + match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1]) + if match3: + number = match3.group(1) + else: + number = 0 + if 'http' not in match[0]: + output += f"#{match[1]}${number}{xurl}{match[0]}" + else: + output += f"#{match[1]}${number}{match[0]}" + output = output[1:] + purl = purl + output + "$$$" + purl = purl[:-3] + return purl + else: + return "" + else: + start_index = text.find(start_str) + if start_index == -1: + return "" + end_index = text.find(end_str, start_index + len(start_str)) + if end_index == -1: + return "" + + if pl == 0: + middle_text = text[start_index + len(start_str):end_index] + return middle_text.replace("\\", "") + + if pl == 1: + middle_text = text[start_index + len(start_str):end_index] + matches = re.findall(start_index1, middle_text) + if matches: + jg = ' '.join(matches) + return jg + + if pl == 2: + middle_text = text[start_index + len(start_str):end_index] + matches = re.findall(start_index1, middle_text) + if matches: + new_list = [f'{item}' for item in matches] + jg = '$$$'.join(new_list) + return jg + + def homeContent(self, filter): + result = {} + result = {"class": [{"type_id": "1", "type_name": "七星剧场"}, + {"type_id": "3", "type_name": "七星新剧"}, + {"type_id": "2", "type_name": "七星热播"}, + {"type_id": "7", "type_name": "七星星选"}, + {"type_id": "5", "type_name": "七星阳光"}], + } + + return result + + def homeVideoContent(self): + videos = [] + + url= f'{xurl}/v1/theater/home_page?theater_class_id=1&class2_id=4&page_num=1&page_size=24' + detail = requests.get(url=url, headers=headerx) + detail.encoding = "utf-8" + if detail.status_code == 200: + data = detail.json() + + for vod in data['data']['list']: + + name = vod['theater']['title'] + + id = vod['theater']['id'] + + pic = vod['theater']['cover_url'] + + remark = vod['theater']['play_amount_str'] + + video = { + "vod_id": id, + "vod_name": name, + "vod_pic": pic, + "vod_remarks": remark + } + videos.append(video) + + result = {'list': videos} + return result + + def categoryContent(self, cid, pg, filter, ext): + result = {} + videos = [] + + url = f'{xurl}/v1/theater/home_page?theater_class_id={cid}&page_num={pg}&page_size=24' + detail = requests.get(url=url,headers=headerx) + detail.encoding = "utf-8" + if detail.status_code == 200: + data = detail.json() + + for vod in data['data']['list']: + + name = vod['theater']['title'] + + id = vod['theater']['id'] + + pic = vod['theater']['cover_url'] + + remark = vod['theater']['theme'] + + video = { + "vod_id": id, + "vod_name": name, + "vod_pic": pic, + "vod_remarks": remark + } + videos.append(video) + + result = {'list': videos} + result['page'] = pg + result['pagecount'] = 9999 + result['limit'] = 90 + result['total'] = 999999 + return result + + def detailContent(self, ids): + did = ids[0] + result = {} + videos = [] + xianlu = '' + bofang = '' + + url = f'{xurl}/v2/theater_parent/detail?theater_parent_id={did}' + detail = requests.get(url=url, headers=headerx) + detail.encoding = "utf-8" + if detail.status_code == 200: + data = detail.json() + + url = 'https://fs-im-kefu.7moor-fs1.com/ly/4d2c3f00-7d4c-11e5-af15-41bf63ae4ea0/1732707176882/jiduo.txt' + response = requests.get(url) + response.encoding = 'utf-8' + code = response.text + name = self.extract_middle_text(code, "s1='", "'", 0) + Jumps = self.extract_middle_text(code, "s2='", "'", 0) + + content = '剧情:' + data['data']['introduction'] + + area = data['data']['desc_tags'][0] + + remarks = data['data']['filing'] + + # 修复剧集只有一集的问题 - 检查theaters数据是否存在且不为空 + if 'theaters' in data['data'] and data['data']['theaters']: + for sou in data['data']['theaters']: + id = sou['son_video_url'] + name = sou['num'] + bofang = bofang + str(name) + '$' + id + '#' + + bofang = bofang[:-1] if bofang.endswith('#') else bofang + xianlu = '七星' + else: + # 如果没有theaters数据,检查是否有单个视频URL + if 'video_url' in data['data'] and data['data']['video_url']: + bofang = '1$' + data['data']['video_url'] + xianlu = '七星' + else: + bofang = Jumps + xianlu = '1' + + videos.append({ + "vod_id": did, + "vod_content": content, + "vod_remarks": remarks, + "vod_area": area, + "vod_play_from": xianlu, + "vod_play_url": bofang + }) + + result['list'] = videos + return result + + def playerContent(self, flag, id, vipFlags): + + result = {} + result["parse"] = 0 + result["playUrl"] = '' + result["url"] = id + result["header"] = headers + return result + + def searchContentPage(self, key, quick, page): + result = {} + videos = [] + + payload = { + "text": key + } + + url = f"{xurl}/v3/search" + detail = requests.post(url=url, headers=headerx, json=payload) + if detail.status_code == 200: + detail.encoding = "utf-8" + data = detail.json() + + for vod in data['data']['theater']['search_data']: + + name = vod['title'] + + id = vod['id'] + + pic = vod['cover_url'] + + remark = vod['score_str'] + + video = { + "vod_id": id, + "vod_name": name, + "vod_pic": pic, + "vod_remarks": remark + } + videos.append(video) + + result['list'] = videos + result['page'] = page + result['pagecount'] = 9999 + result['limit'] = 90 + result['total'] = 999999 + return result + + def searchContent(self, key, quick, pg="1"): + return self.searchContentPage(key, quick, '1') + + def localProxy(self, params): + if params['type'] == "m3u8": + return self.proxyM3u8(params) + elif params['type'] == "media": + return self.proxyMedia(params) + elif params['type'] == "ts": + return self.proxyTs(params) + return None \ No newline at end of file diff --git a/cpu_iy3/lib/shanzha.py b/cpu_iy3/lib/shanzha.py new file mode 100644 index 00000000..29443a13 --- /dev/null +++ b/cpu_iy3/lib/shanzha.py @@ -0,0 +1,330 @@ +# -*- coding: utf-8 -*- +# by @嗷呜 +import json +import random +import sys +from base64 import b64encode, b64decode +from concurrent.futures import ThreadPoolExecutor + +# 引入 RSA 加解密所需模块 +from Crypto.PublicKey import RSA +from Crypto.Cipher import PKCS1_v1_5 + +sys.path.append('..') +from base.spider import Spider + +class Spider(Spider): + + def init(self, extend=""): + did = self.getdid() + self.headers.update({'deviceId': did}) + token = self.gettk() + self.headers.update({'token': token}) + + def getName(self): + pass + + def isVideoFormat(self, url): + pass + + def manualVideoCheck(self): + pass + + def destroy(self): + pass + + # 1. 修改为主机域名 + host = 'http://qkys.qukanwh.com' + + # 2. 同步原脚本的配置请求头 + headers = { + 'HOST': 'qkys.qukanwh.com', + 'User-Agent': 'okhttp/4.12.0', + 'client': 'app', + 'deviceType': 'Android', + 'Referer': '' + } + + # 3. 导入原脚本中的 RSA 密钥对与配置 + publicKey_str = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoYt0BP77U+DM08BiI/QbSRIfxijXo85BTPqIM1Ow8BNwhLETzRIZ+dEwdWDbydG/PspgBAfRpGaYVdJYtvaC2JnoO8+Ik6qMWojfEJxSFLa0Pb0A892tun4gsxoEMjcreZ+YGyaBxAfqX0BSMfdrOgIYaZQjYrw9TRLlUT31QoQIDAQAB\n-----END PUBLIC KEY-----" + privateKey_str = "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCquQQ5r6+yJI8CDFkXRp8vUsdD45ov8EP12ooLs56ca2DQXaSNGS9910bAPVA9chkp0mKIvKqjAsHz5Tl9EeNPblarGEeJUIxpxZtiSqNTpvtiD/TjhpzuHYic7RAfQ/h7p/ypE8ymU42pYjsB5t26Mv6XgkLV+jzrSf73HlCuS0iMyLmt6zz3Mw9izM13EpB8iFLtfbbYymycKTx4RAmPQLwhNGex/AlUIYxXP4R2yyaa4W6mEtc6aME2QuzJFxPgP3HJ9NBx/LWVn4skxWjZ7zg+VRQRHnjyVaSLu3Z5gN5ITWCyE32qaHJa6WBahZj5jWhRyAG1bQ+xKJa8lBL5AgMBAAECggEAUwv9SjJ0PSwbhNuM2w23kcWquROWhYtTA91zGY4esehqB/IFgb2mpIh8Gje5OKqwIu/8jpd4SiOlRYdUF8sD0DfUYRZGdj2AkFNX6tBz8tVfo6wvbB6naA1lzzBij1L5JO3qsjS3cJFkb+kg2yP66AC2Z+0tpfk8eRhdtshAZwfcd1DEGt1uAvYL1eaUK9HRvpt9lPeGcHERDl2hBd4uyaF0K1O+zF9y59nYbTySWPxRZq3sFEE85xRMlstD7YZi7W2gKvMFRD4/FKmrZ3m7aKJRITtyKOyyPcYmepNv3Qv7kk59Pg38n2WWQ0Ra/bCH3E48YNCnQvZMpitkTfJhoQKBgQDbnROOYTP8OTJ6f/qhoGjxeO3x1VOaOp8l0x7b0SCfoqNGS0Cyiqj72BmJtPMPqSTjn6MmNzqbg1KOdhXyzNozs+i5ccW1M56j96mr5I/Z0FpE3oyIHNfDDBlf9M8YQqEF9oYxniYYft9oapO7cRQkHER6qpvnHTavwlv4m78CXwKBgQDHAjs2YlpKDdI1lcbZJCc7TwtH+Pd2bUki8YXafWNcPhITQHbOZjr310eK1QJC6GJncjkOqbX7yv3ivvTO35FZTQhuA1xEG1P00FG8bE0tHYPIwQHi9y0eA5cieMdo8E6XYria1mw/3fqSQEsfZyJlR32JQIoGAipM8iO1X2nZpwKBgDkMFIhnt5lNQk+P7wsNIDWZtDWdtJnboHuy29E+Abt2A/O+mI/IdRz2hau/1WO8DFkUnszOi+rZshhPlGP90rCbi1igtTrcrdjp/KkqNjPea5R4OwkgdOu1uOG0NheXNzzVTQaWjk7Opjn5dWa7eP/oV+GFb/oZHJuLYVizHGsBAoGADA7rjZEKDYCm4w5PPSr+oY5ZjaPdQrS+gLqHtMRyN82fBMGcMUdqfUfzEstzVqCEDeaS5HuOBlK3bXzKkppjUTjksN3NQmcxgBz7RuJ9DqXCLXDcb2cwuafYCYOt+YLOEEgwDVm+t2P44dG5e46hO+fICH/7nP+WlpD5buz4GfMCgYB57r3g/6hi9WUDnfc7ZAzWMqR0EhJVYKYy+KFEtdIPzhkkIHq5RASe88E9kzoGoZFdb3tIjvGZWcHerirrqWkMsuQtP/Qi0zjieid5tAPj+r4kbiCVTw0E0jnmPBzGInQi7lpeTTKnG1fbyS5lBS+WmHfIuzpECgCkxhaT+LJJkg==\n-----END PRIVATE KEY-----" + + # RSA 公钥加密实现 + def rsa_encrypt(self, text): + try: + key = RSA.import_key(self.publicKey_str) + cipher = PKCS1_v1_5.new(key) + cipher_text = cipher.encrypt(text.encode('utf-8')) + return b64encode(cipher_text).decode('utf-8') + except Exception as e: + print(f"RSA加密失败: {e}") + return "" + + # RSA 私钥解密实现 + def rsa_decrypt(self, text): + try: + key = RSA.import_key(self.privateKey_str) + cipher = PKCS1_v1_5.new(key) + raw_bytes = b64decode(text.encode('utf-8')) + + decrypted = b"" + offset = 0 + while offset < len(raw_bytes): + chunk = raw_bytes[offset:offset + 256] + decrypted += cipher.decrypt(chunk, None) + offset += 256 + return decrypted.decode('utf-8') + except Exception as e: + print(f"RSA解密失败: {e}") + return "" + + def homeContent(self, filter): + data = self.post(f"{self.host}/api/v1/app/screen/screenType", headers=self.headers).json() + result = {} + cate = { + "类型": "type", + "地区": "area", + "年份": "year" + } + sort = { + 'key': 'sort', + 'name': '排序', + 'value': [{'n': '最新', 'v': 'NEWEST'}, {'n': '热门', 'v': 'HOT'}, {'n': '收藏', 'v': 'COLLECT'}] + } + classes = [] + filters = {} + for k in data.get('data', []): + classes.append({ + 'type_name': k['name'], + 'type_id': str(k['id']) + }) + filters[str(k['id'])] = [] + for v in k.get('children', []): + if v['name'] in cate: + filters[str(k['id'])].append({ + 'name': v['name'], + 'key': cate[v['name']], + 'value': [{'n': i['name'], 'v': i['name']} for i in v.get('children', [])] + }) + filters[str(k['id'])].append(sort) + result['class'] = classes + result['filters'] = filters + return result + + def homeVideoContent(self): + jdata = { + "condition": { + "sreecnTypeEnum": "NEWEST" + }, + "pageNum": 1, + "pageSize": 40 + } + data = self.post(f"{self.host}/api/v1/app/screen/screenMovie", headers=self.headers, json=jdata).json() + return {'list': self.getlist(data.get('data', {}).get('records', []))} + + def categoryContent(self, tid, pg, filter, extend): + # 保持最纯粹的条件字段,移除任何空字符串占位 + condition = { + 'sreecnTypeEnum': 'NEWEST', + 'typeId': int(tid) if str(tid).isdigit() else tid + } + + if extend: + if 'sort' in extend: + condition['sreecnTypeEnum'] = extend.pop('sort') + condition.update(extend) + + jdata = { + 'condition': condition, + 'pageNum': int(pg), + 'pageSize': 40, + } + + try: + data = self.post(f"{self.host}/api/v1/app/screen/screenMovie", headers=self.headers, json=jdata).json() + result = {} + if data and data.get('data') and 'records' in data['data']: + result['list'] = self.getlist(data['data']['records']) + else: + result['list'] = [] + result['page'] = pg + result['pagecount'] = 9999 + result['limit'] = 40 + result['total'] = 999999 + return result + except Exception as e: + print(f"分类获取错误: {e}") + return {'list': [], 'page': pg} + + def detailContent(self, ids): + ids = ids[0].split('@@') + jdata = {"id": int(ids[0]), "typeId": ids[-1]} + v = self.post(f"{self.host}/api/v1/app/play/movieDesc", headers=self.headers, json=jdata).json() + v = v.get('data', {}) + vod = { + 'type_name': v.get('typeId', ''), + 'vod_year': v.get('year', ''), + 'vod_area': v.get('area', ''), + 'vod_actor': v.get('star', ''), + 'vod_director': v.get('director', ''), + 'vod_content': v.get('introduce', ''), + 'vod_play_from': '', + 'vod_play_url': '' + } + + play_params = { + "id": int(ids[0]), + "source": 0, + "typeId": ids[-1] + } + encrypt_payload = {"key": self.rsa_encrypt(json.dumps(play_params))} + + c_res = self.post(f"{self.host}/api/v1/app/play/movieDetails", headers=self.headers, json=encrypt_payload).json() + decrypted_play_str = self.rsa_decrypt(c_res.get('data', '')) + if not decrypted_play_str: + return {'list': [vod]} + + decrypted_play_data = json.loads(decrypted_play_str) + l = decrypted_play_data.get('moviePlayerList', []) + if not l: + return {'list': [vod]} + + n = {str(i['id']): i['moviePlayerName'] for i in l} + + m = play_params.copy() + m.update({'playerId': l[0]['id']}) + + first_source_payload = {"key": self.rsa_encrypt(json.dumps(m))} + first_res = self.post(f"{self.host}/api/v1/app/play/movieDetails", headers=self.headers, json=first_source_payload).json() + + decrypted_first_str = self.rsa_decrypt(first_res.get('data', '')) + if decrypted_first_str: + decrypted_first_episode = json.loads(decrypted_first_str) + pd = self.getv(m, decrypted_first_episode.get('episodeList', [])) + else: + pd = {} + + if len(l) > 1: + with ThreadPoolExecutor(max_workers=len(l)-1) as executor: + future_to_player = {executor.submit(self.getd, play_params, player): player for player in l[1:]} + for future in future_to_player: + try: + o, p = future.result() + if p: + pd.update(self.getv(o, p)) + except Exception as e: + print(f"多线路请求失败: {e}") + w, e = [], [] + for i, x in pd.items(): + if x: + w.append(n.get(i, '未知线路')) + e.append(x) + vod['vod_play_from'] = '$$$'.join(w) + vod['vod_play_url'] = '$$$'.join(e) + return {'list': [vod]} + + def searchContent(self, key, quick, pg="1"): + jdata = { + "condition": { + "value": str(key) + }, + "pageNum": int(pg), + "pageSize": 40 + } + try: + data = self.post(f"{self.host}/api/v1/app/search/searchMovie", headers=self.headers, json=jdata).json() + return {'list': self.getlist(data.get('data', {}).get('records', [])), 'page': pg} + except Exception as e: + print(f"搜索请求失败: {e}") + return {'list': [], 'page': pg} + + def playerContent(self, flag, id, vipFlags): + raw_id_str = self.d64(id) + if not raw_id_str: + return {'parse': 0, 'url': ''} + jdata = json.loads(raw_id_str) + encrypt_payload = {"key": self.rsa_encrypt(json.dumps(jdata))} + data = self.post(f"{self.host}/api/v1/app/play/movieDetails", headers=self.headers, json=encrypt_payload).json() + + try: + decrypted_url_data = json.loads(self.rsa_decrypt(data.get('data', ''))) + playerUrl = decrypted_url_data.get('url', '') + if not playerUrl: + return {'parse': 0, 'url': ''} + + params = {'playerUrl': playerUrl, 'playerId': jdata['playerId']} + pd = self.fetch(f"{self.host}/api/v1/app/play/analysisMovieUrl", headers=self.headers, params=params).json() + url, p = pd.get('data', ''), 0 + except Exception as e: + print(f"解析流媒体直链失败: {e}") + url, p = "", 0 + return {'parse': p, 'url': url, 'header': {'User-Agent': 'okhttp/4.12.0'}} + + def localProxy(self, param): + pass + + def liveContent(self, url): + pass + + def gettk(self): + self.headers.update({'deviceId': self.getdid()}) + try: + data = self.fetch(f"{self.host}/api/v1/app/user/visitorInfo", headers=self.headers).json() + return data.get('data', {}).get('token', '') + except: + return "" + + def getdid(self): + did = self.getCache('ldid') + if not did: + hex_chars = '0123456789abcdef' + did = ''.join(random.choice(hex_chars) for _ in range(16)) + self.setCache('ldid', did) + return did + + def getd(self, jdata, player): + x = jdata.copy() + x.update({'playerId': player['id']}) + encrypt_payload = {"key": self.rsa_encrypt(json.dumps(x))} + response = self.post(f"{self.host}/api/v1/app/play/movieDetails", headers=self.headers, json=encrypt_payload).json() + decrypted_str = self.rsa_decrypt(response.get('data', '')) + if decrypted_str: + decrypted_episode = json.loads(decrypted_str) + return x, decrypted_episode.get('episodeList', []) + return x, [] + + def getv(self, d, c): + f = {str(d['playerId']): ''} + g = [] + for i in c: + j = d.copy() + j.update({'episodeId': i['id']}) + g.append(f"{i['episode']}${self.e64(json.dumps(j))}") + f[str(d['playerId'])] = '#'.join(g) + return f + + def getlist(self, data): + videos = [] + for i in data: + if not i.get('id'): + continue + videos.append({ + 'vod_id': f"{i['id']}@@{i.get('typeId', '')}", + 'vod_name': i.get('name', ''), + 'vod_pic': i.get('cover', ''), + 'vod_year': i.get('year', ''), + 'vod_remarks': i.get('totalEpisode', '') + }) + return videos + + def e64(self, text): + try: + return b64encode(text.encode('utf-8')).decode('utf-8') + except: + return "" + + def d64(self, encoded_text): + try: + return b64decode(encoded_text.encode('utf-8')).decode('utf-8') + except: + return "" diff --git a/cpu_iy3/lib/yins.png b/cpu_iy3/lib/yins.png new file mode 100644 index 00000000..f80ec8af --- /dev/null +++ b/cpu_iy3/lib/yins.png @@ -0,0 +1,38 @@ +[ + { + "original": "你好1983", + "mapped": "你好1983(2026)" + }, + { + "original": "海市蜃楼", + "mapped": "海市蜃楼(2025)" + }, + { + "original": "凡人修仙传:重返天南", + "mapped": "凡人修仙传(2020)" + }, + { + "original": "凡人修仙传重返天南", + "mapped": "凡人修仙传(2020)" + }, + { + "original": "你是迟来的欢喜", + "mapped": "你是迟来的欢喜 (2026)" + }, + { + "original": "爱情怎么翻译?", + "mapped": "爱情怎么翻译?" + }, + { + "original": "凡人修仙传:慕兰之战", + "mapped": "凡人修仙传(2020)" + }, + { + "original": "凡人修仙传慕兰之战", + "mapped": "凡人修仙传(2020)" + }, + { + "original": "凡人修仙传年番4", + "mapped": "凡人修仙传(2020)" + } +] \ No newline at end of file diff --git a/cpu_iy3/lib/yszb.png b/cpu_iy3/lib/yszb.png index 2c26bb6c..5025792d 100644 --- a/cpu_iy3/lib/yszb.png +++ b/cpu_iy3/lib/yszb.png @@ -8,7 +8,5 @@ https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/lib/ds.png #AI·测试2 https://gh-proxy.com/https://raw.githubusercontent.com/develop202/migu_video/refs/heads/main/interface.txt -#AI·测试3 -https://ds65.tv1288.xyz -#AI·测试4 -https://nos.netease.com/ysf/3d75a78a0fc7ede372c03598d6d10367.m3u \ No newline at end of file +#AI·无意云空间 +https://ym.wya6.cn/dszb/bf \ No newline at end of file diff --git a/cpu_iy3/lib/去看吧.png b/cpu_iy3/lib/去看吧.png new file mode 100644 index 00000000..4ba1eb3b --- /dev/null +++ b/cpu_iy3/lib/去看吧.png @@ -0,0 +1,19 @@ +muban.vfed.二级.title = 'h1&&Text;.fed-col-md3--span:eq(0)&&Text'; +muban.vfed.二级.desc = '.fed-col-md3:eq(3)&&Text;;;.fed-col-md6:eq(0)&&Text;.fed-col-md6--span:eq(1)&&Text'; +var rule = { + title: '去看吧', + 模板:'vfed', + host: 'https://www.k9dm.com', + // url: '/index.php/vod/show/id/fyclass/page/fypage.html', + url: '/index.php/vod/show/id/fyclassfyfilter.html', + filterable:1,//是否启用分类筛选, + filter_url:'{{fl.area}}{{fl.by}}{{fl.class}}/page/fypage{{fl.year}}', + filter:{ + "33":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], + "21":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], + "50":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], + "24":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], + "22":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"/area/日本"},{"n":"欧美","v":"/area/欧美"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}] + }, + class_parse: '.fed-pops-list:eq(0)&&li:gt(0):lt(6);a&&Text;a&&href;.*/(.*?).html', +} \ No newline at end of file diff --git a/cpu_iy3/lib/爱听音乐.py b/cpu_iy3/lib/爱听音乐.py index 28c99ddd..1d63895d 100644 --- a/cpu_iy3/lib/爱听音乐.py +++ b/cpu_iy3/lib/爱听音乐.py @@ -1,240 +1,502 @@ -import re -import sys -from base64 import b64encode, b64decode -from urllib.parse import quote, unquote -from pyquery import PyQuery as pq -from requests import Session, adapters -from urllib3.util.retry import Retry -from concurrent.futures import ThreadPoolExecutor, as_completed -sys.path.append('..') -from base.spider import Spider - -class Spider(Spider): - def init(self, extend=""): - self.host = "https://www.22a5.com" - self.session = Session() - adapter = adapters.HTTPAdapter(max_retries=Retry(total=3, backoff_factor=0.5, status_forcelist=[429, 500, 502, 503, 504]), pool_connections=20, pool_maxsize=50) - self.session.mount("http://", adapter) - self.session.mount("https://", adapter) - self.headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36"} - self.session.headers.update(self.headers) - - def getName(self): return "爱听音乐" - def isVideoFormat(self, url): return bool(re.search(r'\.(m3u8|mp4|mp3|m4a|flv)(\?|$)', url or "", re.I)) - def manualVideoCheck(self): return False - def destroy(self): self.session.close() - - def homeContent(self, filter): - classes = [{"type_name": n, "type_id": i} for n, i in [("歌手","/singerlist/index/index/index/index.html"), ("TOP榜单","/list/top.html"), ("新歌榜","/list/new.html"), ("电台","/radiolist/index.html"), ("高清MV","/mvlist/oumei.html"), ("专辑","/albumlist/index.html"), ("歌单","/playtype/index.html")]] - filters = {p: d for p in [c["type_id"] for c in classes if "singer" not in c["type_id"]] if (d := self._fetch_filters(p))} - - if "/radiolist/index.html" not in filters: - filters["/radiolist/index.html"] = [{"key": "id", "name": "分类", "value": [{"n": n, "v": v} for n,v in zip(["最新","最热","有声小说","相声","音乐","情感","国漫","影视","脱口秀","历史","儿童","教育","八卦","推理","头条"], ["index","hot","novel","xiangyi","music","emotion","game","yingshi","talkshow","history","children","education","gossip","tuili","headline"])]}] - - filters["/singerlist/index/index/index/index.html"] = [ - {"key": "area", "name": "地区", "value": [{"n": n, "v": v} for n,v in [("全部","index"),("华语","huayu"),("欧美","oumei"),("韩国","hanguo"),("日本","ribrn")]]}, - {"key": "sex", "name": "性别", "value": [{"n": n, "v": v} for n,v in [("全部","index"),("男","male"),("女","girl"),("组合","band")]]}, - {"key": "genre", "name": "流派", "value": [{"n": n, "v": v} for n,v in [("全部","index"),("流行","liuxing"),("电子","dianzi"),("摇滚","yaogun"),("嘻哈","xiha"),("R&B","rb"),("民谣","minyao"),("爵士","jueshi"),("古典","gudian")]]}, - {"key": "char", "name": "字母", "value": [{"n": n, "v": v} for n,v in [("全部","index")] + [{"n": chr(i), "v": chr(i).lower()} for i in range(65, 91)]]} - ] - return {"class": classes, "filters": filters, "list": []} - - def homeVideoContent(self): return {"list": []} - - def categoryContent(self, tid, pg, filter, extend): - pg = int(pg or 1) - url = tid - if "/singerlist/" in tid: - p = tid.split('/') - if len(p) >= 6: - url = "/".join(p[:2] + [extend.get(k, p[i]) for i, k in enumerate(["area", "sex", "genre"], 2)] + [f"{extend.get('char', 'index')}.html"]) - elif "id" in extend and extend["id"] not in ["index", "top"]: - url = tid.replace("index.html", f"{extend['id']}.html").replace("top.html", f"{extend['id']}.html") - if url == tid: url = f"{tid.rsplit('/', 1)[0]}/{extend['id']}.html" - - if pg > 1: - sep = "/" if any(x in url for x in ["/singerlist/", "/radiolist/", "/mvlist/", "/playtype/", "/list/"]) else "_" - url = re.sub(r'(_\d+|/\d+)?\.html$', f'{sep}{pg}.html', url) - - doc = self.getpq(url) - return {"list": self._parse_list(doc(".play_list li, .video_list li, .pic_list li, .singer_list li, .ali li, .layui-row li, .base_l li"), tid), "page": pg, "pagecount": 9999, "limit": 90, "total": 999999} - - def searchContent(self, key, quick, pg="1"): - return {"list": self._parse_list(self.getpq(f"/so/{quote(key)}/{pg}.html")(".base_l li, .play_list li"), "search"), "page": int(pg)} - - def detailContent(self, ids): - url = self._abs(ids[0]) - doc = self.getpq(url) - vod = {"vod_id": url, "vod_name": self._clean(doc("h1").text() or doc("title").text()), "vod_pic": self._abs(doc(".djpg img, .pic img, .djpic img").attr("src")), "vod_play_from": "爱听音乐", "vod_content": ""} - - if any(x in url for x in ["/playlist/", "/album/", "/list/", "/singer/", "/special/", "/radio/", "/radiolist/"]): - eps = self._get_eps(doc) - page_urls = {self._abs(a.attr("href")) for a in doc(".page a, .dede_pages a, .pagelist a").items() if a.attr("href") and "javascript" not in a.attr("href")} - {url} - if page_urls: - with ThreadPoolExecutor(max_workers=5) as ex: - for r in as_completed([ex.submit(lambda u: self._get_eps(self.getpq(u)), u) for u in sorted(page_urls, key=lambda x: int(re.search(r'[_\/](\d+)\.html', x).group(1)) if re.search(r'[_\/](\d+)\.html', x) else 0)]): - eps.extend(r.result() or []) - if eps: - vod.update({"vod_play_from": "播放列表", "vod_play_url": "#".join(eps)}) - return {"list": [vod]} - - play_list = [] - if mid := re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', url): - lrc_url = f"{self.host}/plug/down.php?ac=music&lk=lrc&id={mid.group(2)}" - play_list = [f"播放${self.e64('0@@@@' + url + '|||' + lrc_url)}"] - - elif vid := re.search(r'/(video|mp4)/([^/]+)\.html', url): - with ThreadPoolExecutor(max_workers=3) as ex: - fs = {ex.submit(self._api, "/plug/down.php", {"ac": "vplay", "id": vid.group(2), "q": q}): n for n, q in [("蓝光", 1080), ("超清", 720), ("高清", 480)]} - play_list = [f"{fs[f]}${self.e64('0@@@@'+u)}" for f in as_completed(fs) if (u := f.result())] - play_list.sort(key=lambda x: {"蓝":0, "超":1, "高":2}.get(x[0], 3)) - - vod["vod_play_url"] = "#".join(play_list) if play_list else f"解析失败${self.e64('1@@@@'+url)}" - return {"list": [vod]} - - def playerContent(self, flag, id, vipFlags): - raw = self.d64(id).split("@@@@")[-1] - url, subt = raw.split("|||") if "|||" in raw else (raw, "") - url = url.replace(r"\/", "/") - - if ".html" in url and not self.isVideoFormat(url): - if mid := re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', url): - if r_url := self._api("/js/play.php", method="POST", data={"id": mid.group(2), "type": "music"}, headers={"Referer": url.replace("http://","https://"), "X-Requested-With": "XMLHttpRequest"}): - url = r_url if ".php" not in r_url else url - elif vid := re.search(r'/(video|mp4)/([^/]+)\.html', url): - with ThreadPoolExecutor(max_workers=3) as ex: - for f in as_completed([ex.submit(self._api, "/plug/down.php", {"ac": "vplay", "id": vid.group(2), "q": q}) for q in [1080, 720, 480]]): - if v_url := f.result(): - url = v_url; break - - result = {"parse": 0, "url": url, "header": {"User-Agent": self.headers["User-Agent"]}} - if "22a5.com" in url: result["header"]["Referer"] = self.host + "/" - - # OK影视3.6.5+支持LRC格式滚动歌词 - if subt: - try: - r = self.session.get(subt, headers={"Referer": self.host + "/"}, timeout=5) - lrc_content = r.text - if lrc_content: - # 过滤广告内容 - lrc_content = self._filter_lrc_ads(lrc_content) - result["lrc"] = lrc_content - except: - pass - - return result - - def _filter_lrc_ads(self, lrc_text): - """过滤LRC歌词中的广告内容""" - lines = lrc_text.splitlines() - filtered_lines = [] - - # 广告关键词模式 - ad_patterns = [ - r'欢迎来访.*', - r'本站.*', - r'.*广告.*', - r'QQ群.*', - r'.*www\..*', - r'.*http.*', - r'.*\.com.*', - r'.*\.cn.*', - r'.*\.net.*', - r'.*音乐网.*', - r'.*提供.*', - r'.*下载.*', - ] - - for line in lines: - # 保留时间标签行,但过滤掉广告文本 - if re.match(r'\[\d{2}:\d{2}', line): - # 检查是否包含广告 - is_ad = False - for pattern in ad_patterns: - if re.search(pattern, line, re.IGNORECASE): - is_ad = True - break - - if not is_ad: - filtered_lines.append(line) - else: - # 非时间标签行(可能是元数据),保留 - filtered_lines.append(line) - - return '\n'.join(filtered_lines) - - def localProxy(self, param): - url = unquote(param.get("url", "")) - type_ = param.get("type") - - if type_ == "img": - return [200, "image/jpeg", self.session.get(url, headers={"Referer": self.host + "/"}, timeout=5).content, {}] - - elif type_ == "lrc": - try: - r = self.session.get(url, headers={"Referer": self.host + "/"}, timeout=5) - # 同时过滤代理中的广告 - lrc_content = r.text - lrc_content = self._filter_lrc_ads(lrc_content) - return [200, "application/octet-stream", lrc_content.encode('utf-8'), {}] - except: - return [404, "text/plain", "Error", {}] - - return None - - def _parse_list(self, items, tid=""): - res = [] - for li in items.items(): - a = li("a").eq(0) - if not (href := a.attr("href")) or href == "/" or any(x in href for x in ["/user/", "/login/", "javascript"]): continue - if not (name := self._clean(li(".name").text() or a.attr("title") or a.text())): continue - pic = self._abs((li("img").attr("src") or "").replace('120', '500')) - res.append({"vod_id": self._abs(href), "vod_name": name, "vod_pic": f"{self.getProxyUrl()}&url={pic}&type=img" if pic else "", "style": {"type": "oval" if "/singer/" in href else ("list" if any(x in tid for x in ["/list/", "/playtype/", "/albumlist/"]) else "rect"), "ratio": 1 if "/singer/" in href else 1.33}}) - return res - - def _get_eps(self, doc): - eps = [] - for li in doc(".play_list li, .song_list li, .music_list li").items(): - if not (a := li("a").eq(0)).attr("href") or not re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', a.attr("href")): continue - full_url = self._abs(a.attr("href")) - - lrc_part = "" - mid = re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', full_url) - if mid: - lrc_url = f"{self.host}/plug/down.php?ac=music&lk=lrc&id={mid.group(2)}" - lrc_part = f"|||{lrc_url}" - - eps.append(f"{self._clean(a.text() or li('.name').text())}${self.e64('0@@@@' + full_url + lrc_part)}") - return eps - - def _clean(self, text): return re.sub(r'(爱玩音乐网|视频下载说明|视频下载地址|www\.2t58\.com|MP3免费下载|LRC歌词下载|全部歌曲|\[第\d+页\]|刷新|每日推荐|最新|热门|推荐|MV|高清|无损)', '', text or "", flags=re.I).strip() - - def _fetch_filters(self, url): - doc, filters = self.getpq(url), [] - for i, group in enumerate([doc(s) for s in [".ilingku_fl", ".class_list", ".screen_list", ".box_list", ".nav_list"] if doc(s)]): - opts, seen = [{"n": "全部", "v": "top" if "top" in url else "index"}], set() - for a in group("a").items(): - if (v := (a.attr("href") or "").split("?")[0].rstrip('/').split('/')[-1].replace('.html','')) and v not in seen: - opts.append({"n": a.text().strip(), "v": v}); seen.add(v) - if len(opts) > 1: filters.append({"key": f"id{i}" if i else "id", "name": "分类", "value": opts}) - return filters - - def _api(self, path, params=None, method="GET", headers=None, data=None): - try: - h = self.headers.copy() - if headers: h.update(headers) - r = (self.session.post if method == "POST" else self.session.get)(f"{self.host}{path}", params=params, data=data, headers=h, timeout=10, allow_redirects=False) - if loc := r.headers.get("Location"): return self._abs(loc.strip()) - return self._abs(r.json().get("url", "").replace(r"\/", "/")) or (r.text.strip() if r.text.strip().startswith("http") else "") - except: return "" - - def getpq(self, url): - import time - for _ in range(2): - try: return pq(self.session.get(self._abs(url), timeout=5).text) - except: time.sleep(0.1) - return pq("") - - def _abs(self, url): return url if url.startswith("http") else (f"{self.host}{'/' if not url.startswith('/') else ''}{url}" if url else "") - def e64(self, text): return b64encode(text.encode("utf-8")).decode("utf-8") - def d64(self, text): return b64decode(text.encode("utf-8")).decode("utf-8") \ No newline at end of file +# -*- coding: utf-8 -*- +# 修复:歌手不显示歌手图片 +# by:垃圾星河 +# 代码指导:嗷呜呜呜呜 +# 增加:自动人机验证绕过 + +import re +import sys +import time +from base64 import b64encode, b64decode +from urllib.parse import quote, unquote +from pyquery import PyQuery as pq +from requests import Session, adapters +from urllib3.util.retry import Retry +from concurrent.futures import ThreadPoolExecutor, as_completed + +sys.path.append('..') +from base.spider import Spider + + +class Spider(Spider): + def init(self, extend=""): + self.host = "https://www.22a5.com" + self.session = Session() + adapter = adapters.HTTPAdapter( + max_retries=Retry(total=3, backoff_factor=0.5, status_forcelist=[429, 500, 502, 503, 504]), + pool_connections=20, + pool_maxsize=50 + ) + self.session.mount("http://", adapter) + self.session.mount("https://", adapter) + self.headers = { + "User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36" + } + self.session.headers.update(self.headers) + + def getName(self): + return "爱听音乐" + + def isVideoFormat(self, url): + return bool(re.search(r'\.(m3u8|mp4|mp3|m4a|flv)(\?|$)', url or "", re.I)) + + def manualVideoCheck(self): + return False + + def destroy(self): + self.session.close() + + # ==================== 新增人机验证绕过 ==================== + + def _bypass_verification(self, url, response_text): + """若当前页面是人机验证,自动提交勾选""" + if '安全人机验证' not in response_text and 'human_check' not in response_text: + return None + + # 提取 csrf_token(支持多种格式) + token_match = re.search(r'name="csrf_token"\s+value="([^"]+)"', response_text) + if not token_match: + print("[爱听音乐] 未找到 csrf_token,跳过绕过") + return None + token = token_match.group(1) + + # 构造提交数据 + data = { + 'csrf_token': token, + 'human_check': 'on' + } + + try: + # 发送 POST 请求,自动跟随重定向 + post_resp = self.session.post(url, data=data, allow_redirects=True, timeout=10) + print("[爱听音乐] 人机验证已绕过") + return post_resp + except Exception as e: + print(f"[爱听音乐] 人机验证提交失败: {e}") + return None + + def getpq(self, url): + """获取页面并自动处理人机验证(重试3次)""" + full_url = self._abs(url) + + for attempt in range(3): + try: + resp = self.session.get(full_url, timeout=5) + + # 若遇到验证页,尝试绕过 + if '安全人机验证' in resp.text or 'human_check' in resp.text: + print("[爱听音乐] 检测到人机验证,尝试自动绕过...") + bypass_resp = self._bypass_verification(full_url, resp.text) + if bypass_resp: + # 验证成功后,返回最终页面(可能是重定向后的目标) + return pq(bypass_resp.text) + else: + # 绕过失败,等待后重试 + time.sleep(1) + continue + else: + # 正常页面直接返回 + return pq(resp.text) + + except Exception as e: + print(f"[爱听音乐] 请求失败 (尝试 {attempt+1}/3): {e}") + time.sleep(0.5 * (attempt + 1)) + + # 全部失败,返回空文档 + return pq("") + + # ==================== 原有功能(保持不变) ==================== + + def homeContent(self, filter): + classes = [ + {"type_name": n, "type_id": i} + for n, i in [ + ("歌手", "/singerlist/index/index/index/index.html"), + ("TOP榜单", "/list/top.html"), + ("新歌榜", "/list/new.html"), + ("电台", "/radiolist/index.html"), + ("高清MV", "/mvlist/oumei.html"), + ("专辑", "/albumlist/index.html"), + ("歌单", "/playtype/index.html") + ] + ] + filters = {} + for p in [c["type_id"] for c in classes if "singer" not in c["type_id"]]: + d = self._fetch_filters(p) + if d: + filters[p] = d + + if "/radiolist/index.html" not in filters: + filters["/radiolist/index.html"] = [{ + "key": "id", + "name": "分类", + "value": [ + {"n": n, "v": v} + for n, v in zip( + ["最新", "最热", "有声小说", "相声", "音乐", "情感", "国漫", "影视", "脱口秀", "历史", "儿童", "教育", "八卦", "推理", "头条"], + ["index", "hot", "novel", "xiangyi", "music", "emotion", "game", "yingshi", "talkshow", "history", + "children", "education", "gossip", "tuili", "headline"] + ) + ] + }] + + filters["/singerlist/index/index/index/index.html"] = [ + { + "key": "area", + "name": "地区", + "value": [ + {"n": "全部", "v": "index"}, + {"n": "华语", "v": "huayu"}, + {"n": "欧美", "v": "oumei"}, + {"n": "韩国", "v": "hanguo"}, + {"n": "日本", "v": "ribrn"} + ] + }, + { + "key": "sex", + "name": "性别", + "value": [ + {"n": "全部", "v": "index"}, + {"n": "男", "v": "male"}, + {"n": "女", "v": "girl"}, + {"n": "组合", "v": "band"} + ] + }, + { + "key": "genre", + "name": "流派", + "value": [ + {"n": "全部", "v": "index"}, + {"n": "流行", "v": "liuxing"}, + {"n": "电子", "v": "dianzi"}, + {"n": "摇滚", "v": "yaogun"}, + {"n": "嘻哈", "v": "xiha"}, + {"n": "R&B", "v": "rb"}, + {"n": "民谣", "v": "minyao"}, + {"n": "爵士", "v": "jueshi"}, + {"n": "古典", "v": "gudian"} + ] + } + ] + return {"class": classes, "filters": filters, "list": []} + + def homeVideoContent(self): + return {"list": []} + + def categoryContent(self, tid, pg, filter, extend): + pg = int(pg or 1) + url = tid + if "/singerlist/" in tid: + parts = tid.split('/') + if len(parts) >= 6: + url = "/".join(parts[:2] + [extend.get(k, parts[i]) for i, k in enumerate(["area", "sex", "genre"], 2)] + + [f"{extend.get('char', 'index')}.html"]) + elif "id" in extend and extend["id"] not in ["index", "top"]: + url = tid.replace("index.html", f"{extend['id']}.html").replace("top.html", f"{extend['id']}.html") + if url == tid: + url = f"{tid.rsplit('/', 1)[0]}/{extend['id']}.html" + + if pg > 1: + sep = "/" if any(x in url for x in ["/singerlist/", "/radiolist/", "/mvlist/", "/playtype/", "/list/"]) else "_" + url = re.sub(r'(_\d+|/\d+)?\.html$', f'{sep}{pg}.html', url) + + doc = self.getpq(url) + items = doc(".play_list li, .video_list li, .pic_list li, .singer_list li, .ali li, .layui-row li, .base_l li") + return { + "list": self._parse_list(items, tid), + "page": pg, + "pagecount": 9999, + "limit": 90, + "total": 999999 + } + + def searchContent(self, key, quick, pg="1"): + doc = self.getpq(f"/so/{quote(key)}/{pg}.html") + items = doc(".base_l li, .play_list li") + return { + "list": self._parse_list(items, "search"), + "page": int(pg) + } + + def detailContent(self, ids): + url = self._abs(ids[0]) + doc = self.getpq(url) + vod = { + "vod_id": url, + "vod_name": self._clean(doc("h1").text() or doc("title").text()), + "vod_pic": self._abs(doc(".djpg img, .pic img, .djpic img").attr("src")), + "vod_play_from": "爱听音乐", + "vod_content": "" + } + + if any(x in url for x in ["/playlist/", "/album/", "/list/", "/singer/", "/special/", "/radio/", "/radiolist/"]): + eps = self._get_eps(doc) + page_urls = { + self._abs(a.attr("href")) + for a in doc(".page a, .dede_pages a, .pagelist a").items() + if a.attr("href") and "javascript" not in a.attr("href") + } - {url} + if page_urls: + with ThreadPoolExecutor(max_workers=5) as ex: + futures = [] + for u in sorted(page_urls, key=lambda x: int(re.search(r'[_/](\d+)\.html', x).group(1)) if re.search( + r'[_/](\d+)\.html', x) else 0): + futures.append(ex.submit(lambda uu: self._get_eps(self.getpq(uu)), u)) + for f in as_completed(futures): + eps.extend(f.result() or []) + if eps: + vod.update({ + "vod_play_from": "播放列表", + "vod_play_url": "#".join(eps) + }) + return {"list": [vod]} + + play_list = [] + if mid := re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', url): + lrc_url = f"{self.host}/plug/down.php?ac=music&lk=lrc&id={mid.group(2)}" + play_list = [f"播放${self.e64('0@@@@' + url + '|||' + lrc_url)}"] + + elif vid := re.search(r'/(video|mp4)/([^/]+)\.html', url): + with ThreadPoolExecutor(max_workers=3) as ex: + fs = { + ex.submit(self._api, "/plug/down.php", {"ac": "vplay", "id": vid.group(2), "q": q}): n + for n, q in [("蓝光", 1080), ("超清", 720), ("高清", 480)] + } + play_list = [f"{fs[f]}${self.e64('0@@@@'+u)}" for f in as_completed(fs) if (u := f.result())] + play_list.sort(key=lambda x: {"蓝": 0, "超": 1, "高": 2}.get(x[0], 3)) + + vod["vod_play_url"] = "#".join(play_list) if play_list else f"解析失败${self.e64('1@@@@'+url)}" + return {"list": [vod]} + + def playerContent(self, flag, id, vipFlags): + raw = self.d64(id).split("@@@@")[-1] + url, subt = raw.split("|||") if "|||" in raw else (raw, "") + url = url.replace(r"\/", "/") + + if ".html" in url and not self.isVideoFormat(url): + if mid := re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', url): + if r_url := self._api("/js/play.php", method="POST", data={"id": mid.group(2), "type": "music"}, + headers={"Referer": url.replace("http://", "https://"), + "X-Requested-With": "XMLHttpRequest"}): + url = r_url if ".php" not in r_url else url + elif vid := re.search(r'/(video|mp4)/([^/]+)\.html', url): + with ThreadPoolExecutor(max_workers=3) as ex: + for f in as_completed( + [ex.submit(self._api, "/plug/down.php", {"ac": "vplay", "id": vid.group(2), "q": q}) for q in + [1080, 720, 480]]): + if v_url := f.result(): + url = v_url + break + + result = {"parse": 0, "url": url, "header": {"User-Agent": self.headers["User-Agent"]}} + if "22a5.com" in url: + result["header"]["Referer"] = self.host + "/" + + # OK影视3.6.5+支持LRC格式滚动歌词 + if subt: + try: + r = self.session.get(subt, headers={"Referer": self.host + "/"}, timeout=5) + lrc_content = r.text + if lrc_content: + lrc_content = self._filter_lrc_ads(lrc_content) + result["lrc"] = lrc_content + except: + pass + + return result + + def _filter_lrc_ads(self, lrc_text): + """过滤LRC歌词中的广告内容""" + lines = lrc_text.splitlines() + filtered_lines = [] + + # 广告关键词模式 + ad_patterns = [ + r'欢迎来访.*', + r'本站.*', + r'.*广告.*', + r'QQ群.*', + r'.*www\..*', + r'.*http.*', + r'.*\.com.*', + r'.*\.cn.*', + r'.*\.net.*', + r'.*音乐网.*', + r'.*提供.*', + r'.*下载.*', + ] + + for line in lines: + if re.match(r'\[\d{2}:\d{2}', line): + is_ad = False + for pattern in ad_patterns: + if re.search(pattern, line, re.IGNORECASE): + is_ad = True + break + if not is_ad: + filtered_lines.append(line) + else: + filtered_lines.append(line) + + return '\n'.join(filtered_lines) + + def localProxy(self, param): + url = unquote(param.get("url", "")) + type_ = param.get("type") + + if type_ == "img": + try: + headers = { + "Referer": "https://www.baidu.com/", + "User-Agent": self.headers["User-Agent"], + "Accept": "image/webp,image/apng,image/*,*/*;q=0.8", + "Accept-Language": "zh-CN,zh;q=0.9" + } + resp = self.session.get(url, headers=headers, timeout=10) + return [200, "image/jpeg", resp.content, {}] + except Exception as e: + print(f"图片代理失败: {e}") + return [404, "text/plain", b"", {}] + + elif type_ == "lrc": + try: + r = self.session.get(url, headers={"Referer": self.host + "/"}, timeout=5) + lrc_content = r.text + lrc_content = self._filter_lrc_ads(lrc_content) + return [200, "application/octet-stream", lrc_content.encode('utf-8'), {}] + except: + return [404, "text/plain", "Error", {}] + + return None + + # ==================== 辅助方法 ==================== + + def _parse_list(self, items, tid=""): + """解析列表项,修复歌手头像 - 直接返回原始图片URL""" + res = [] + for li in items.items(): + a = li("a").eq(0) + if not (href := a.attr("href")) or href == "/" or any(x in href for x in ["/user/", "/login/", "javascript"]): + continue + if not (name := self._clean(li(".name").text() or a.attr("title") or a.text())): + continue + + is_singer = "/singer/" in href or "/singerlist" in tid + + pic = "" + src = "" + + if is_singer: + img = li(".pic img").eq(0) + src = img.attr("src") or "" + if not src: + img = li("img").eq(0) + src = img.attr("src") or "" + else: + img = li("img").eq(0) + src = img.attr("src") or "" + if not src: + img = li(".pic img").eq(0) + src = img.attr("src") or "" + + if src: + if src.startswith('//'): + src = 'https:' + src + elif src.startswith('/'): + src = self.host + src + pic = src + + res.append({ + "vod_id": self._abs(href), + "vod_name": name, + "vod_pic": pic, + "style": { + "type": "oval" if is_singer else ("list" if any( + x in tid for x in ["/list/", "/playtype/", "/albumlist/"]) else "rect"), + "ratio": 1 if is_singer else 1.33 + } + }) + return res + + def _get_eps(self, doc): + eps = [] + for li in doc(".play_list li, .song_list li, .music_list li").items(): + a = li("a").eq(0) + href = a.attr("href") + if not href or not re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', href): + continue + full_url = self._abs(href) + + lrc_part = "" + mid = re.search(r'/(song|mp3|radio|radiolist|radioplay)/([^/]+)\.html', full_url) + if mid: + lrc_url = f"{self.host}/plug/down.php?ac=music&lk=lrc&id={mid.group(2)}" + lrc_part = f"|||{lrc_url}" + + eps.append(f"{self._clean(a.text() or li('.name').text())}${self.e64('0@@@@' + full_url + lrc_part)}") + return eps + + def _clean(self, text): + return re.sub( + r'(爱玩音乐网|视频下载说明|视频下载地址|www\.2t58\.com|MP3免费下载|LRC歌词下载|全部歌曲|\[第\d+页\]|刷新|每日推荐|最新|热门|推荐|MV|高清|无损)', + '', + text or '', + flags=re.I + ).strip() + + def _fetch_filters(self, url): + doc = self.getpq(url) + filters = [] + for i, group in enumerate([ + doc(".ilingku_fl"), + doc(".class_list"), + doc(".screen_list"), + doc(".box_list"), + doc(".nav_list") + ]): + if group: + opts = [{"n": "全部", "v": "top" if "top" in url else "index"}] + seen = set() + for a in group("a").items(): + v = (a.attr("href") or "").split("?")[0].rstrip('/').split('/')[-1].replace('.html', '') + if v and v not in seen: + opts.append({"n": a.text().strip(), "v": v}) + seen.add(v) + if len(opts) > 1: + filters.append({"key": f"id{i}" if i else "id", "name": "分类", "value": opts}) + return filters + + def _api(self, path, params=None, method="GET", headers=None, data=None): + try: + h = self.headers.copy() + if headers: + h.update(headers) + r = (self.session.post if method == "POST" else self.session.get)( + f"{self.host}{path}", + params=params, + data=data, + headers=h, + timeout=10, + allow_redirects=False + ) + if loc := r.headers.get("Location"): + return self._abs(loc.strip()) + return self._abs(r.json().get("url", "").replace(r"\/", "/")) or (r.text.strip() if r.text.strip().startswith( + "http") else "") + except: + return "" + + def _abs(self, url): + if not url: + return "" + if url.startswith("http"): + return url + if url.startswith("//"): + return "https:" + url + return f"{self.host}{'/' if not url.startswith('/') else ''}{url}" + + def e64(self, text): + return b64encode(text.encode("utf-8")).decode("utf-8") + + def d64(self, text): + return b64decode(text.encode("utf-8")).decode("utf-8") \ No newline at end of file diff --git a/cpu_iy3/spider.jar b/cpu_iy3/spider.jar index 20ce7839..d9faf44f 100644 Binary files a/cpu_iy3/spider.jar and b/cpu_iy3/spider.jar differ diff --git a/cpu_iy3/version.txt b/cpu_iy3/version.txt index 035854e4..47068190 100644 --- a/cpu_iy3/version.txt +++ b/cpu_iy3/version.txt @@ -1 +1 @@ -06.29 \ No newline at end of file +07.03 \ No newline at end of file diff --git a/cpu_iy3/天神IY.png b/cpu_iy3/天神IY.png index 073a8be5..24301b81 100644 Binary files a/cpu_iy3/天神IY.png and b/cpu_iy3/天神IY.png differ diff --git a/cpu_iy3/天神小屋.png b/cpu_iy3/天神小屋.png index add74c0b..4be9ee59 100644 --- a/cpu_iy3/天神小屋.png +++ b/cpu_iy3/天神小屋.png @@ -1 +1 @@ -[{"name":"推荐","list":[{"name":"本地库【ff】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"❤下载过,才能用"},{"name":"备用库【ff】","url":"https://wget.la/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"❤下载过,才能用"}]},{"name":"播放源下载(❤下载过,才能用)","list":[{"name":"本地【vox】","url":"http://xw.123234567.xyz:60255/jiduo/vox本地包.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"最新版本"},{"name":"本地库【ff】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.06.17版"},{"name":"备用库【ff】","url":"https://wget.la/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.06.17版"},{"name":"本地【小虎斑】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/小虎斑.zip","icon":"https://img0.baidu.com/it/u=3403550249,2192222310&fm=253&fmt=auto?w=800&h=804","version":"15.8.4"},{"name":"缘起【天神IY】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/缘起【天神IY】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.06.29版"},{"name":"真心全量包1","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/真心20250402-全量包1.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2025.4.2版"},{"name":"真心全量包2","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/真心20250402-全量包2.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2025.4.2版"},{"name":"真心增量包","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地【真心】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.04.25版"},{"name":"本地【PG】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地【PG】1.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"20260427-0913版"}]},{"name":"简易手机版软件下载,并在线可安装","list":[{"name":"天神IY手机版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY手机版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_64位"},{"name":"倾心壁纸","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/倾心壁纸_1.4.7","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/倾心壁纸.png","version":"1.4.7_手机64位"},{"name":"Via原版","url":"https://res.viayoo.com/v1/via-release-cn.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/Via.png","version":"官方最新版"},{"name":"Via非原版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/Via_6.4.0内置脚本版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/Via.png","version":"6.4.0_内置脚本"},{"name":"MT管理器","url":"https://pan.mt2.cn/mt/MT2.18.3-clone-target28.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/MT管理器.png","version":"2.18.3_原共存版"},{"name":"MT管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/MT管理器_2.14.5部分破解版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/MT管理器.png","version":"2.14.5_部分破解"},{"name":"NP管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/NP管理器_3.1.25.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/NP管理器.png","version":"3.1.25_原版"},{"name":"WiFi万能钥匙","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/万能钥匙_1.1.39.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/WiFi万能钥匙.png","version":"1.1.39_破解版"},{"name":"蓝牙遥控","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/蓝牙遥控_2.0.9.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/蓝牙遥控器.png","version":"2.0.9_原版"}]},{"name":"其他软件下载,去文件管理器查找、安装","list":[{"name":"无意云Pro版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/无意云手机版341.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/无意云.png","version":"3.4.1_手机非共存"},{"name":"无意云Pro版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/无意云电视版341.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/无意云.png","version":"3.4.1_电视非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_电视32位"},{"name":"天神IY海信版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY海信版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视64位版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_电视64位"},{"name":"天神IY电视全内置版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视全内置版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_内置32位"},{"name":"天神IY海信全内置版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY海信全内置版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_内置非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视版250.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"2.5.0_安卓4.+版"},{"name":"小白文件管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/小白文件管理器_2.8.0(TV版).zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/小白文件管理器.png","version":"2.8.0_电视版"},{"name":"天神仓","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神仓617.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"6.1.7_180电视版"},{"name":"天神仓海信版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神仓海信版617.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"6.1.7_海信非共存"},{"name":"1DM+","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/1DM+_v17.2.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/1DM.png","version":"17.2_手机版"},{"name":"洛雪音乐","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/洛雪音乐888.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/洛雪音乐.png","version":"8.8.8_手机版"},{"name":"阅读","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/阅读合集325.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/阅读.png","version":"3.25_手机版"},{"name":"家庭KTV","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/家庭KTV115.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/家庭KTV.png","version":"1.1.5_电视版"}]}] \ No newline at end of file +[{"name":"推荐","list":[{"name":"本地库【ff】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"❤下载过,才能用"},{"name":"备用库【ff】","url":"https://wget.la/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"❤下载过,才能用"}]},{"name":"播放源下载(❤下载过,才能用)","list":[{"name":"本地【vox】","url":"http://xw.123234567.xyz:60255/jiduo/vox本地包.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"最新版本"},{"name":"本地库【ff】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.07.03版"},{"name":"备用库【ff】","url":"https://wget.la/https://raw.githubusercontent.com/IY-CPU/test/main/本地库【ff】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.07.03版"},{"name":"本地【小虎斑】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/小虎斑.zip","icon":"https://img0.baidu.com/it/u=3403550249,2192222310&fm=253&fmt=auto?w=800&h=804","version":"15.8.4"},{"name":"缘起【天神IY】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/缘起【天神IY】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.07.03版"},{"name":"真心全量包1","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/真心20250402-全量包1.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2025.4.2版"},{"name":"真心全量包2","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/真心20250402-全量包2.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2025.4.2版"},{"name":"真心增量包","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地【真心】.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"2026.04.25版"},{"name":"本地【PG】","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/本地【PG】1.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/源.png","version":"20260427-0913版"}]},{"name":"简易手机版软件下载,并在线可安装","list":[{"name":"天神IY手机版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY手机版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_64位"},{"name":"倾心壁纸","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/倾心壁纸_1.4.7","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/倾心壁纸.png","version":"1.4.7_手机64位"},{"name":"Via原版","url":"https://res.viayoo.com/v1/via-release-cn.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/Via.png","version":"官方最新版"},{"name":"Via非原版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/Via_6.4.0内置脚本版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/Via.png","version":"6.4.0_内置脚本"},{"name":"MT管理器","url":"https://pan.mt2.cn/mt/MT2.18.3-clone-target28.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/MT管理器.png","version":"2.18.3_原共存版"},{"name":"MT管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/MT管理器_2.14.5部分破解版.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/MT管理器.png","version":"2.14.5_部分破解"},{"name":"NP管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/NP管理器_3.1.25.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/NP管理器.png","version":"3.1.25_原版"},{"name":"WiFi万能钥匙","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/万能钥匙_1.1.39.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/WiFi万能钥匙.png","version":"1.1.39_破解版"},{"name":"蓝牙遥控","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/蓝牙遥控_2.0.9.apk","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/蓝牙遥控器.png","version":"2.0.9_原版"}]},{"name":"其他软件下载,去文件管理器查找、安装","list":[{"name":"无意云Pro版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/无意云手机版341.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/无意云.png","version":"3.4.1_手机非共存"},{"name":"无意云Pro版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/无意云电视版341.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/无意云.png","version":"3.4.1_电视非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_电视32位"},{"name":"天神IY海信版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY海信版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视64位版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_电视64位"},{"name":"天神IY电视全内置版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视全内置版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_内置32位"},{"name":"天神IY海信全内置版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY海信全内置版.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"5.1.6_内置非共存"},{"name":"天神IY电视版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神IY电视版250.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"2.5.0_安卓4.+版"},{"name":"小白文件管理器","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/文件/小白文件管理器_2.8.0(TV版).zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/小白文件管理器.png","version":"2.8.0_电视版"},{"name":"天神仓","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神仓617.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"6.1.7_180电视版"},{"name":"天神仓海信版","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/天神仓海信版617.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/天神IY.png","version":"6.1.7_海信非共存"},{"name":"1DM+","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/1DM+_v17.2.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/1DM.png","version":"17.2_手机版"},{"name":"洛雪音乐","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test/main/洛雪音乐888.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/洛雪音乐.png","version":"8.8.8_手机版"},{"name":"阅读","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/test1/main/阅读合集325.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/阅读.png","version":"3.25_手机版"},{"name":"家庭KTV","url":"https://ghfile.geekertao.top/https://raw.githubusercontent.com/IY-CPU/IY/main/家庭KTV115.zip","icon":"https://gh-proxy.com/https://raw.githubusercontent.com/IY-CPU/IY/main/封面/家庭KTV.png","version":"1.1.5_电视版"}]}] \ No newline at end of file diff --git a/cpu_iy3/缘起【天神IY】.zip b/cpu_iy3/缘起【天神IY】.zip index d12b94e9..b88b89d6 100644 Binary files a/cpu_iy3/缘起【天神IY】.zip and b/cpu_iy3/缘起【天神IY】.zip differ diff --git a/jaychouqq/demo1.json b/jaychouqq/demo1.json index d7b7edf3..ec9f754d 100644 --- a/jaychouqq/demo1.json +++ b/jaychouqq/demo1.json @@ -14,6 +14,7 @@ { "name": "豆瓣高分", "url": "&type=movie&tag=豆瓣高分&page_start={{page-1}}" }, { "name": "华语", "url": "&type=movie&tag=华语&page_start={{page-1}}" }, { "name": "欧美", "url": "&type=movie&tag=欧美&page_start={{page-1}}" }, + { "name": "情色", "url": "&type=movie&tag=情色&page_start={{page-1}}" }, { "name": "韩国", "url": "&type=movie&tag=韩国&page_start={{page-1}}" } ], "list": { diff --git a/jaychouqq/yingshi/js7/bddj.js b/jaychouqq/yingshi/js7/bddj.js new file mode 100644 index 00000000..0a56d801 --- /dev/null +++ b/jaychouqq/yingshi/js7/bddj.js @@ -0,0 +1,436 @@ +/* +@header({ + searchable: 1, + filterable: 0, + quickSearch: 1, + title: '百度短剧', + lang: 'cat' +}) +*/ +import { Crypto as CryptoJS } from 'assets://js/lib/cat.js'; + +let key = '百度短剧'; +let siteName = ''; +let siteKey = ''; +let siteType = 0; +let shuaCache = []; + +let UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36"; +let clarity_order = {'蓝光': 1, '超清': 2, '标清': 3}; + +// ==================== URL配置集中管理 ==================== +let rule = { + host: 'https://mbd.baidu.com', + detailHost: 'https://sv.baidu.com', + listUrl: '/feedapi/v1/videoserver/playlets/list?service=bdbox', + searchUrl: '/feedapi/v1/videoserver/playlets/search?service=bdbox', + detailUrl: '/haokan/ui-video/playlet/rec/detail?log=vhk&tn=1020970b&ctn=1008350n&blur=1', + playUrl: '/appui/api?cmd=video/relate&log=vhk&tn=1020970b&ctn=1008350n&blur=1', +}; + +function init(cfg) { + siteName = (cfg.skey?.split('_')[1] || cfg.skey) || (cfg.key?.split('_')[1] || cfg.key) || '未知'; + siteKey = cfg.skey; + siteType = cfg.stype; +} + +function home(filter) { + let he = ["全部", "新剧", "限时免费", "精选", "独播"]; + let ticailist = [ + "神医", "连续剧", "都市", "现代言情", "异能", "逆袭", "甜宠", "总裁", "萌宝", "战神", "宫斗宅斗", "神豪", + "虐恋", "闪婚", "玄幻", "穿越重生", "年代", "家庭伦理", "古代言情", "武侠武打", "赘婿", "单元剧", "青春校园", + "历史架空", "王妃", "鉴宝", "科幻", "军旅战争", "种田" + ]; + + let classes = he.map(name => ({ + type_id: name, + type_name: name + })); + + classes = classes.concat(ticailist.map(name => ({ + type_id: name === "全部" ? "全部题材" : name, + type_name: name + }))); + + return JSON.stringify({ + class: classes, + filters: {} + }); +} + +async function homeVod() { + const categoryResult = await category('新剧', 1, {}, {}); + const categoryList = JSON.parse(categoryResult).list; + + return JSON.stringify({ + list: [ + { + vod_id: 'shua', + vod_name: '发现精彩', + vod_pic: 'https://t8.baidu.com/it/u=615012979,225344800&fm=193' + }, + ...categoryList + ] + }); +} + +/** + * 合并请求函数 - 统一处理 data 和 body,支持 form-urlencoded 和 JSON + */ +async function request(url, options = {}) { + try { + console.log(`【${siteName}】${options.method || 'GET'} ${url.split('?')[0]}`); + + // 准备基础配置 + let requestConfig = { + method: options.method || 'GET', + headers: { "User-Agent": UA, ...options.headers } + }; + + // 获取内容类型 + let contentType = requestConfig.headers['Content-Type'] || ''; + + // 辅助函数:将对象转换为字符串 + function stringifyData(data, format) { + if (format.includes('json')) { + return JSON.stringify(data); + } else { + // 默认 form-urlencoded + const parts = []; + for (let key in data) { + let value = data[key]; + if (typeof value === 'object' && value !== null) { + value = JSON.stringify(value); + } + parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); + } + return parts.join('&'); + } + } + + // 处理数据 - 无论 data 还是 body,统一处理 + let requestData = options.data || options.body; + + if (requestData) { + if (typeof requestData === 'string') { + // 已经是字符串,直接使用 + requestConfig.body = requestData; + } else if (typeof requestData === 'object') { + // 对象,根据内容类型转换 + if (!contentType) { + // 没有指定内容类型,默认 form-urlencoded + contentType = 'application/x-www-form-urlencoded'; + requestConfig.headers['Content-Type'] = contentType; + } + requestConfig.body = stringifyData(requestData, contentType); + } + } + + const res = await req(url, requestConfig); + return res.content || ''; + } catch (e) { + console.log(`【${siteName}】请求失败: ${e.message}`); + return ''; + } +} + +async function category(tid, pg, filter, extend) { + pg = pg <= 0 ? 1 : pg; + let sub = ["新剧", "限时免费", "精选", "独播"].includes(tid) ? tid : "新剧"; + let tcsub = tid === "全部" || tid === "全部题材" ? "" : tid; + + let t = Math.floor(Date.now() / 1000); + let version = await md5(t + "v2"); + + // 直接传对象 + let postData = { + 'data': { + "data": { + "extRequest": { "flow_tabid": "13" }, + "from": "feed", + "page": "channel_video_landing", + "pd": "feed", + "refreshIndex": pg, + "cursor": "", + "theme": "", + "timestamp": t, + "version": version, + "themes": [ + { "kind": "综合", "names": [sub] }, + { "kind": "题材", "names": [tcsub] } + ] + } + } + }; + + let html = await request(`${rule.host}${rule.listUrl}`, { + method: 'POST', + headers: { + "Connection": "Keep-Alive", + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: postData // 可以用 data + }); + + let res = JSON.parse(html); + let items = res.data.items; + + let videos = items.map(it => ({ + vod_id: it.collId, + vod_name: it.title, + vod_pic: it.img, + vod_remarks: it.updateStatus, + vod_content: it.description + })); + + return JSON.stringify({ + page: pg, + pagecount: pg + 1, + limit: 20, + total: items.length * (pg + 1), + list: videos + }); +} + +async function detail(id) { + if (id === 'shua') { + return JSON.stringify({ + list: [{ + vod_id: 'shua', + vod_name: '发现精彩', + vod_pic: 'https://t8.baidu.com/it/u=615012979,225344800&fm=193', + vod_play_from: '百度短剧', + vod_play_url: '刷刷看$shua', + vod_tag: '[SHUA][JUMP][V]' + }] + }); + } + + // 也可以用 body + let html = await request(`${rule.detailHost}${rule.detailUrl}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: { // body 传对象也会自动处理 + playlet_id: id, + vid: "undefined" + } + }); + + let res = JSON.parse(html); + let dthtml = res.data; + let vids = dthtml.vid_list; + let playArr = vids.map((vid, index) => `第${index + 1}集$${vid}`); + + const vod = { + vod_id: id, + vod_name: dthtml.playlet_title, + vod_pic: dthtml.playlet_poster, + vod_content: dthtml.description, + vod_remarks: `共${vids.length}集 热度值:${dthtml.hot_value} 集数:${dthtml.episodes_num}`, + vod_director: dthtml.tag_text, + vod_year: dthtml.create_time, + vod_play_from: "百度短剧", + vod_play_url: playArr.join('#') + }; + + return JSON.stringify({ list: [vod] }); +} + +async function play(flag, id, flags) { + if (id == 'shua') { + if (shuaCache.length == 0) { + const randomPage = getRnd(1, 20); + const categories = ["新剧", "限时免费", "精选", "独播"]; + const randomCate = categories[Math.floor(Math.random() * categories.length)]; + + const categoryResult = await category(randomCate, randomPage, {}, {}); + const res = JSON.parse(categoryResult); + const videos = []; + + for (const it of res.list.slice(0, 10)) { + const detailResult = await detail(it.vod_id); + const detailObj = JSON.parse(detailResult); + const vod = detailObj.list[0]; + + const match = vod.vod_remarks.match(/(\d+)/); + const episodeCount = match[1]; + + videos.push({ + parse: 0, + url: it.vod_id, + shuaTitle: vod.vod_name, + shuaDes: '共' + episodeCount + '集 | ' + vod.vod_content.replace(/\s/g, ''), + shuaActions: { play: it.vod_id }, + errorPlayNext: true + }); + } + shuaCache.push(...videos); + } + + const cache = shuaCache.shift(); + const detailResult = await detail(cache.url); + const detailObj = JSON.parse(detailResult); + const vod = detailObj.list[0]; + + const playUrls = vod.vod_play_url.split('#'); + const firstEpisode = playUrls[0]; + const vid = firstEpisode.split('$')[1]; + + const playHtml = await request(`${rule.detailHost}${rule.playUrl}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: { // 用 data 或 body 都可以 + method: "post", + vid: vid + } + }); + + const playRes = JSON.parse(playHtml); + const playJson = playRes["video/relate"].data.cur_video; + const urls = []; + + for (const item of playJson.clarityUrl) { + urls.push({ + title: item.title, + url: item.url, + order: clarity_order[item.title] || 999 + }); + } + urls.sort(function (a, b) { return a.order - b.order; }); + cache.url = urls[0].url; + + return JSON.stringify(cache); + } + + const html = await request(`${rule.detailHost}${rule.playUrl}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: { // body 传对象 + method: "post", + vid: id + } + }); + + const res = JSON.parse(html); + const json = res["video/relate"].data.cur_video; + const urls = []; + + for (const item of json.clarityUrl) { + urls.push({ + title: item.title, + url: item.url, + order: clarity_order[item.title] || 999 + }); + } + urls.sort(function (a, b) { return a.order - b.order; }); + + const flat = []; + for (const item of urls) { + flat.push(item.title); + flat.push(item.url); + } + + return JSON.stringify({ + parse: 0, + url: flat, + header: { + 'User-Agent': UA, + 'Referer': rule.host + } + }); +} + +async function search(wd, quick, pg) { + pg = pg <= 0 ? 1 : pg; + + let postData = { + 'data': { + "data": { + "query": wd, + "page": pg, + "attribute": ["title"], + "fe_page_type": "search", + "extra": { + "tab_id": "216", + "flow_tabid": "13", + "shortplay_source": "feed", + "from": "feed", + "tab_type": "搜索", + "sub_template": "playlet_search_result" + } + } + } + }; + + let html = await request(`${rule.host}${rule.searchUrl}`, { + method: 'POST', + headers: { + "Connection": "Keep-Alive", + "Accept-Encoding": "gzip", + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: postData // 用 data + }); + + let res = JSON.parse(html); + let items = res.data.itemList; + + let videos = items.map(it => ({ + vod_id: it.nid.split("_")[1], + vod_name: it.title, + vod_pic: it.img, + vod_remarks: it.collNum + '集', + vod_content: it.description + })); + + return JSON.stringify({ + page: pg, + pagecount: pg + 1, + limit: 20, + total: items.length * (pg + 1), + list: videos + }); +} + +function getRnd(min, max, hexNum, isUpper) { + var r = parseInt(Math.random() * (max - min + 1) + min, 10); + if (hexNum) { + r = isUpper ? r.toString(hexNum).toUpperCase() : r.toString(hexNum); + } + return r; +} + +async function md5(str) { + return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex).toLowerCase(); +} + +async function action(action, value) { + if (action === 'shuaPlay') { + return JSON.stringify({ + action: { + actionId: '__detail__', + ids: value, + keep: true + } + }); + } +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search, + action: action + }; +} \ No newline at end of file diff --git a/jaychouqq/yingshi/js7/jd4k.js b/jaychouqq/yingshi/js7/jd4k.js new file mode 100644 index 00000000..b251c368 --- /dev/null +++ b/jaychouqq/yingshi/js7/jd4k.js @@ -0,0 +1,1729 @@ +const _0x24a000 = _0x3bf3; +(function (_0x4af1bf, _0x354faf) { + const _0x10067b = _0x3bf3, _0x4787fe = _0x4af1bf(); + while (!![]) { + try { + const _0x4356d7 = -parseInt(_0x10067b(0x35d)) / (0x869 * -0x1 + -0x2509 * 0x1 + 0x2d73) * (parseInt(_0x10067b(0x24d)) / (0x112 * 0xe + -0x1d * 0x89 + 0x8b * 0x1)) + -parseInt(_0x10067b(0x3bd)) / (0x3f * -0x5e + 0x1596 + 0x18f) + -parseInt(_0x10067b(0x2f5)) / (0x22aa + -0x255e + -0x57 * -0x8) * (parseInt(_0x10067b(0x1e5)) / (0x1c5d + 0x769 + -0x23c1)) + -parseInt(_0x10067b(0x3c1)) / (0x1 * -0xcff + -0x1e62 + -0x29 * -0x10f) * (parseInt(_0x10067b(0x3ad)) / (0x1b46 * -0x1 + 0xf85 + 0xbc8)) + -parseInt(_0x10067b(0x34a)) / (-0x2576 + -0x1f4d + -0x44cb * -0x1) * (-parseInt(_0x10067b(0x295)) / (-0x2 * 0x7d1 + 0x1 * 0x13d5 + 0x1 * -0x42a)) + parseInt(_0x10067b(0x246)) / (0x43 * 0x59 + -0x2638 + 0x1 * 0xef7) + -parseInt(_0x10067b(0x234)) / (0x2 * 0x11dc + -0x1e02 + 0x1 * -0x5ab) * (-parseInt(_0x10067b(0x21f)) / (0x1 * -0xa75 + 0x119 * 0x15 + -0xc8c)); + if (_0x4356d7 === _0x354faf) + break; + else + _0x4787fe['push'](_0x4787fe['shift']()); + } catch (_0x531b5c) { + _0x4787fe['push'](_0x4787fe['shift']()); + } + } +}(_0x30bd, -0x1 * -0x192eb + -0xa95 * -0x1a7 + -0x7b329)); +import { + Crypto, + _ +} from 'assets://js/lib/cat.js'; +let host = '', header = { 'User-Agent': _0x24a000(0x269) + _0x24a000(0x2e1) }, siteKey = '', siteType = '', siteJx = ''; +const urlPattern1 = /api\.php\/.*?\/vod/, urlPattern2 = /api\.php\/.+?\.vod/, parsePattern = /\/.+\\?.+=/, parsePattern1 = /.*(url|v|vid|php\?id)=/, parsePattern2 = /https?:\/\/[^\/]*/, htmlVideoKeyMatch = [ + /player=new/, + /
_0x50fda5; + }, + 'AEWJN': function (_0x34e794, _0x24610e, _0x529315, _0x31bacd) { + return _0x34e794(_0x24610e, _0x529315, _0x31bacd); + }, + 'Knznh': function (_0x4f4e7d, _0x5a0aac) { + return _0x4f4e7d !== _0x5a0aac; + }, + 'ViinS': function (_0x595f7e, _0x159136) { + return _0x595f7e(_0x159136); + } + }; + try { + let _0xabb5ea = siteJx[_0x314f8e]; + !_0xabb5ea && (siteJx[_0x5ed43f(0x3b3) + _0x5ed43f(0x2f2)]('*') ? _0xabb5ea = siteJx['*'] : _0xabb5ea = []); + _0x46895d[_0x5ed43f(0x28d)](_0xabb5ea[_0x5ed43f(0x2d3)], 0x6 * -0x2c7 + 0xf * -0x1a5 + 0xdc7 * 0x3) && (_0xabb5ea = [_0x46895d[_0x5ed43f(0x27e)]]); + if (_0x46895d[_0x5ed43f(0x24b)](_0xabb5ea[_0x5ed43f(0x2d3)], -0xf * 0x73 + 0x13df + -0xd22 * 0x1)) { + const _0xc1b189 = await _0x46895d[_0x5ed43f(0x285)](getFinalVideo, _0x314f8e, _0xabb5ea, _0x533915); + if (_0x46895d[_0x5ed43f(0x3c2)](_0xc1b189, null)) + return JSON[_0x5ed43f(0x3a2)](_0xc1b189); + } + if (_0x46895d[_0x5ed43f(0x334)](isVideoFormat, _0x533915)) { + const _0x2016c3 = { + 'parse': 0x1, + 'playUrl': '', + 'url': _0x533915 + }; + return JSON[_0x5ed43f(0x3a2)](_0x2016c3); + } else { + const _0x59b4d5 = { + 'parse': 0x1, + 'jx': '1', + 'url': _0x533915 + }; + return JSON[_0x5ed43f(0x3a2)](_0x59b4d5); + } + } catch (_0x15f170) { + SpiderDebug[_0x5ed43f(0x24a)](_0x15f170); + } + return ''; +} +async function search(_0x15b8fa, _0x588e3d) { + const _0xc070a9 = _0x24a000, _0x24ff97 = { + 'rAAqR': _0xc070a9(0x288), + 'gHEas': _0xc070a9(0x2cf) + 'od', + 'PPjsc': function (_0x4c022d, _0x4ebd2b) { + return _0x4c022d(_0x4ebd2b); + }, + 'nAAlp': function (_0x1196f9, _0x523142, _0x215206) { + return _0x1196f9(_0x523142, _0x215206); + }, + 'Yoody': function (_0x40a0f3, _0x527133, _0x5f956b) { + return _0x40a0f3(_0x527133, _0x5f956b); + }, + 'Qzbyi': function (_0xf70d91, _0x5d6ade) { + return _0xf70d91(_0x5d6ade); + }, + 'AhyMI': function (_0x42d25e, _0x371898) { + return _0x42d25e instanceof _0x371898; + }, + 'raJIH': function (_0x2a22fd, _0x2de3f5) { + return _0x2a22fd instanceof _0x2de3f5; + }, + 'bfaLF': function (_0x8207e7, _0x21fb6c) { + return _0x8207e7 !== _0x21fb6c; + } + }; + try { + if (host[_0xc070a9(0x39f)](_0x24ff97[_0xc070a9(0x26f)]) || host[_0xc070a9(0x39f)](_0x24ff97[_0xc070a9(0x28c)])) { + const _0x26ec58 = host + (_0xc070a9(0x324) + _0xc070a9(0x28e)) + _0x24ff97[_0xc070a9(0x294)](encodeURIComponent, _0x15b8fa) + _0xc070a9(0x237), _0x1c1ca8 = await _0x24ff97[_0xc070a9(0x247)](request, _0x26ec58, _0x24ff97[_0xc070a9(0x294)](getHeaders, _0x26ec58)), _0xc6c488 = JSON[_0xc070a9(0x213)](_0x1c1ca8), _0x1ead5c = []; + if (_0xc6c488[_0xc070a9(0x394)] && Array[_0xc070a9(0x315)](_0xc6c488[_0xc070a9(0x394)])) + for (const _0x284ed3 of _0xc6c488[_0xc070a9(0x394)]) { + _0x1ead5c[_0xc070a9(0x332)]({ + 'vod_id': _0x284ed3[_0xc070a9(0x3c3)], + 'vod_name': _0x284ed3[_0xc070a9(0x2b8)], + 'vod_pic': _0x284ed3[_0xc070a9(0x290)] || '', + 'vod_remarks': _0x284ed3[_0xc070a9(0x346) + 's'] || '' + }); + } + return JSON[_0xc070a9(0x3a2)]({ 'list': _0x1ead5c }); + } else { + const _0x4c1fc9 = host, _0x3631b2 = _0x24ff97[_0xc070a9(0x247)](getSearchUrl, _0x4c1fc9, _0x24ff97[_0xc070a9(0x294)](encodeURIComponent, _0x15b8fa)), _0x15e390 = await _0x24ff97[_0xc070a9(0x369)](request, _0x3631b2, _0x24ff97[_0xc070a9(0x2a1)](getHeaders, _0x3631b2)), _0x59d1cc = JSON[_0xc070a9(0x213)](_0x15e390); + let _0x136112 = null; + const _0x1337a6 = []; + if (_0x24ff97[_0xc070a9(0x3ac)](_0x59d1cc[_0xc070a9(0x394)], Array)) + _0x136112 = _0x59d1cc[_0xc070a9(0x394)]; + else { + if (_0x24ff97[_0xc070a9(0x2bc)](_0x59d1cc[_0xc070a9(0x339)], Object) && _0x24ff97[_0xc070a9(0x3ac)](_0x59d1cc[_0xc070a9(0x339)][_0xc070a9(0x394)], Array)) + _0x136112 = _0x59d1cc[_0xc070a9(0x339)][_0xc070a9(0x394)]; + else + _0x24ff97[_0xc070a9(0x2bc)](_0x59d1cc[_0xc070a9(0x339)], Array) && (_0x136112 = _0x59d1cc[_0xc070a9(0x339)]); + } + if (_0x24ff97[_0xc070a9(0x2ee)](_0x136112, null)) + for (const _0x152e86 of _0x136112) { + if (_0x152e86[_0xc070a9(0x3c3)]) { + const _0x49ee8a = { + 'vod_id': _0x152e86[_0xc070a9(0x3c3)], + 'vod_name': _0x152e86[_0xc070a9(0x2b8)], + 'vod_pic': _0x152e86[_0xc070a9(0x290)], + 'vod_remarks': _0x152e86[_0xc070a9(0x346) + 's'] + }; + _0x1337a6[_0xc070a9(0x332)](_0x49ee8a); + } else { + const _0x467d07 = { + 'vod_id': _0x152e86[_0xc070a9(0x3b6)], + 'vod_name': _0x152e86[_0xc070a9(0x1e9)], + 'vod_pic': _0x152e86[_0xc070a9(0x3ba)], + 'vod_remarks': _0x152e86[_0xc070a9(0x258)] + }; + _0x1337a6[_0xc070a9(0x332)](_0x467d07); + } + } + const _0x1e4c19 = { 'list': _0x1337a6 }; + return JSON[_0xc070a9(0x3a2)](_0x1e4c19); + } + } catch (_0x334adf) { + SpiderDebug[_0xc070a9(0x24a)](_0x334adf); + } + return ''; +} +async function getFinalVideo(_0x356707, _0x398327, _0x2ef122) { + const _0x12dc27 = _0x24a000, _0x44bf01 = { + 'KPgHF': function (_0x55b24f, _0x2ecff3) { + return _0x55b24f === _0x2ecff3; + }, + 'WCCoT': function (_0x2ce219, _0x446505) { + return _0x2ce219 === _0x446505; + }, + 'QIbLN': _0x12dc27(0x1fb), + 'XjiyL': function (_0x451dd4, _0x2b6510) { + return _0x451dd4 + _0x2b6510; + }, + 'eFJbi': function (_0xe7aa93, _0x51184b, _0x539572, _0x540f7d) { + return _0xe7aa93(_0x51184b, _0x539572, _0x540f7d); + }, + 'cchWu': function (_0x5d7821, _0x2a0a3c, _0x143221) { + return _0x5d7821(_0x2a0a3c, _0x143221); + }, + 'emPiw': function (_0x242abc, _0x178c18) { + return _0x242abc !== _0x178c18; + }, + 'HHlAe': _0x12dc27(0x366), + 'snexY': _0x12dc27(0x2e3), + 'oRses': _0x12dc27(0x352) + }; + let _0xcd3790 = ''; + for (const _0x5cb301 of _0x398327) { + if (_0x44bf01[_0x12dc27(0x200)](_0x5cb301, '') || _0x44bf01[_0x12dc27(0x205)](_0x5cb301, _0x44bf01[_0x12dc27(0x2a5)])) + continue; + const _0x2f83f6 = _0x44bf01[_0x12dc27(0x30c)](_0x5cb301, _0x2ef122), _0x4b7b47 = await _0x44bf01[_0x12dc27(0x219)](request, _0x2f83f6, null, -0x3 * 0x13f + -0x1 * 0x4d12 + 0x243 * 0x35); + let _0x5e80c0 = null; + try { + _0x5e80c0 = _0x44bf01[_0x12dc27(0x2c1)](jsonParse, _0x2ef122, _0x4b7b47); + } catch (_0x684857) { + } + if (_0x44bf01[_0x12dc27(0x2a3)](_0x5e80c0, null) && _0x5e80c0[_0x12dc27(0x3b3) + _0x12dc27(0x2f2)](_0x44bf01[_0x12dc27(0x364)]) && _0x5e80c0[_0x12dc27(0x3b3) + _0x12dc27(0x2f2)](_0x44bf01[_0x12dc27(0x3a7)])) + return _0x5e80c0[_0x12dc27(0x2e3)] = JSON[_0x12dc27(0x3a2)](_0x5e80c0[_0x12dc27(0x2e3)]), _0x5e80c0; + if (_0x4b7b47[_0x12dc27(0x39f)](_0x44bf01[_0x12dc27(0x2df)])) { + let _0x259a20 = ![]; + for (const _0x4410e4 of htmlVideoKeyMatch) { + if (_0x4410e4[_0x12dc27(0x36e)](_0x4b7b47)) { + _0x259a20 = !![]; + break; + } + } + _0x259a20 && (_0xcd3790 = _0x5cb301); + } + } + if (_0x44bf01[_0x12dc27(0x2a3)](_0xcd3790, '')) { + const _0x425204 = { + 'parse': 0x0, + 'playUrl': '', + 'url': _0x2ef122 + }; + return JSON[_0x12dc27(0x3a2)](_0x425204); + } + return null; +} +function genPlayList(_0x2a68f0, _0x17eead, _0x2951b7, _0x47b9eb, _0x800257) { + const _0x1d5b05 = _0x24a000, _0x37e1eb = { + 'qFCgy': _0x1d5b05(0x288), + 'muyni': _0x1d5b05(0x2cf) + 'od', + 'VdBFp': _0x1d5b05(0x27c) + 'p', + 'fuavN': _0x1d5b05(0x25c), + 'nqoHH': _0x1d5b05(0x343), + 'TVfJB': function (_0x46f089, _0x2a240f) { + return _0x46f089 > _0x2a240f; + }, + 'Xavsg': _0x1d5b05(0x2c8) + }, _0x15a66c = [], _0x182550 = []; + if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x37c)]) || _0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x383)])) { + const _0x40de27 = _0x17eead[_0x1d5b05(0x394)] && _0x17eead[_0x1d5b05(0x394)][-0x635 + 0x50e * -0x4 + -0x8cf * -0x3] ? _0x17eead[_0x1d5b05(0x394)][0x2 * 0x901 + -0x2382 + 0x1180] : {}; + _0x47b9eb[_0x1d5b05(0x3c3)] = _0x40de27[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x40de27[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x40de27[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x40de27[_0x1d5b05(0x37d)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x40de27[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x40de27[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x40de27[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x40de27[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x40de27[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x40de27[_0x1d5b05(0x227) + 't'] || '', _0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x40de27[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] || '', _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x40de27[_0x1d5b05(0x3a0) + 'rl'] || ''; + return; + } + if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x3a8)]) || _0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x238)])) { + const _0x249ca8 = _0x17eead[_0x1d5b05(0x339)] || {}; + _0x47b9eb[_0x1d5b05(0x3c3)] = _0x249ca8[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x249ca8[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x249ca8[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x249ca8[_0x1d5b05(0x311)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x249ca8[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x249ca8[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x249ca8[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x249ca8[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x249ca8[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x249ca8[_0x1d5b05(0x227) + 't'] || ''; + if (_0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)] && Array[_0x1d5b05(0x315)](_0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)])) + for (const _0x39d1e3 of _0x249ca8[_0x1d5b05(0x225) + _0x1d5b05(0x251)]) { + let _0x2f80cc = _0x39d1e3[_0x1d5b05(0x330)]?.[_0x1d5b05(0x314)]() || _0x39d1e3[_0x1d5b05(0x214)]?.[_0x1d5b05(0x314)]() || ''; + if (!_0x2f80cc) + continue; + _0x182550[_0x1d5b05(0x332)](_0x2f80cc), _0x15a66c[_0x1d5b05(0x332)](_0x39d1e3[_0x1d5b05(0x366)] || ''); + if (_0x39d1e3[_0x1d5b05(0x20d)]) { + const _0x2ff516 = parseUrlMap[_0x1d5b05(0x24f)](_0x2f80cc) || []; + !_0x2ff516[_0x1d5b05(0x39f)](_0x39d1e3[_0x1d5b05(0x20d)]) && _0x2ff516[_0x1d5b05(0x332)](_0x39d1e3[_0x1d5b05(0x20d)]), parseUrlMap[_0x1d5b05(0x396)](_0x2f80cc, _0x2ff516); + } + } + } else { + if (_0x2a68f0[_0x1d5b05(0x39f)](_0x37e1eb[_0x1d5b05(0x222)])) { + const _0x37e2c6 = _0x17eead[_0x1d5b05(0x339)] || {}; + _0x47b9eb[_0x1d5b05(0x3c3)] = _0x37e2c6[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x37e2c6[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x37e2c6[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x37e2c6[_0x1d5b05(0x311)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x37e2c6[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x37e2c6[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x37e2c6[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x37e2c6[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x37e2c6[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x37e2c6[_0x1d5b05(0x227) + 't'] || ''; + if (_0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)] && Array[_0x1d5b05(0x315)](_0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)])) + for (const _0x1f9806 of _0x37e2c6[_0x1d5b05(0x2f7) + _0x1d5b05(0x3a1)]) { + let _0x292c57 = _0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x3cb)]?.[_0x1d5b05(0x314)]() || _0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x211)]?.[_0x1d5b05(0x314)]() || ''; + if (!_0x292c57) + continue; + _0x182550[_0x1d5b05(0x332)](_0x292c57), _0x15a66c[_0x1d5b05(0x332)](_0x1f9806[_0x1d5b05(0x366)] || ''); + try { + const _0x4a4bc9 = parseUrlMap[_0x1d5b05(0x24f)](_0x292c57) || []; + if (_0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x213)]) { + const _0x3dac95 = _0x1f9806[_0x1d5b05(0x377) + 'o'][_0x1d5b05(0x213)][_0x1d5b05(0x265)](','); + _0x3dac95[_0x1d5b05(0x1e6)](_0x4dc07e => { + const _0x404f67 = _0x1d5b05; + _0x4dc07e && !_0x4a4bc9[_0x404f67(0x39f)](_0x4dc07e) && _0x4a4bc9[_0x404f67(0x332)](_0x4dc07e); + }); + } + if (_0x1f9806[_0x1d5b05(0x377) + 'o']?.[_0x1d5b05(0x32d)]) { + const _0x57c8f0 = _0x1f9806[_0x1d5b05(0x377) + 'o'][_0x1d5b05(0x32d)][_0x1d5b05(0x265)](','); + _0x57c8f0[_0x1d5b05(0x1e6)](_0x522ba3 => { + const _0x5f1935 = _0x1d5b05; + _0x522ba3 && !_0x4a4bc9[_0x5f1935(0x39f)](_0x522ba3) && _0x4a4bc9[_0x5f1935(0x332)](_0x522ba3); + }); + } + parseUrlMap[_0x1d5b05(0x396)](_0x292c57, _0x4a4bc9); + } catch (_0x35c48f) { + SpiderDebug[_0x1d5b05(0x24a)](_0x35c48f); + } + } + } else { + if (urlPattern1[_0x1d5b05(0x36e)](_0x2a68f0)) { + const _0x6e5bc5 = _0x17eead[_0x1d5b05(0x394)] && _0x17eead[_0x1d5b05(0x394)][0x1448 + -0x19fc + -0x1 * -0x5b4] ? _0x17eead[_0x1d5b05(0x394)][-0x704 * -0x5 + 0x29 * -0xb5 + -0x617 * 0x1] : {}; + _0x47b9eb[_0x1d5b05(0x3c3)] = _0x6e5bc5[_0x1d5b05(0x3c3)] || _0x800257, _0x47b9eb[_0x1d5b05(0x2b8)] = _0x6e5bc5[_0x1d5b05(0x2b8)] || '', _0x47b9eb[_0x1d5b05(0x290)] = _0x6e5bc5[_0x1d5b05(0x290)] || '', _0x47b9eb[_0x1d5b05(0x37d)] = _0x6e5bc5[_0x1d5b05(0x37d)] || '', _0x47b9eb[_0x1d5b05(0x32c)] = _0x6e5bc5[_0x1d5b05(0x32c)] || '', _0x47b9eb[_0x1d5b05(0x228)] = _0x6e5bc5[_0x1d5b05(0x228)] || '', _0x47b9eb[_0x1d5b05(0x346) + 's'] = _0x6e5bc5[_0x1d5b05(0x346) + 's'] || '', _0x47b9eb[_0x1d5b05(0x23d)] = _0x6e5bc5[_0x1d5b05(0x23d)] || '', _0x47b9eb[_0x1d5b05(0x2cd) + 'or'] = _0x6e5bc5[_0x1d5b05(0x2cd) + 'or'] || '', _0x47b9eb[_0x1d5b05(0x227) + 't'] = _0x6e5bc5[_0x1d5b05(0x227) + 't'] || '', _0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x6e5bc5[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] || '', _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x6e5bc5[_0x1d5b05(0x3a0) + 'rl'] || ''; + } + } + } + _0x37e1eb[_0x1d5b05(0x30d)](_0x182550[_0x1d5b05(0x2d3)], -0x417 * 0x9 + -0x2472 + 0x186b * 0x3) && _0x37e1eb[_0x1d5b05(0x30d)](_0x15a66c[_0x1d5b05(0x2d3)], -0x1bc * 0x15 + -0x26b8 + 0x4b24) && (_0x47b9eb[_0x1d5b05(0x34d) + _0x1d5b05(0x3bf)] = _0x182550[_0x1d5b05(0x365)](_0x37e1eb[_0x1d5b05(0x2be)]), _0x47b9eb[_0x1d5b05(0x3a0) + 'rl'] = _0x15a66c[_0x1d5b05(0x365)](_0x37e1eb[_0x1d5b05(0x2be)])); +} +function jsonParse(_0x2bcad8, _0x2e7bc8) { + const _0x4a9b6b = _0x24a000, _0x54fefc = { + 'glzca': _0x4a9b6b(0x339), + 'SXiUp': function (_0x5d899b, _0x8ff4ce) { + return _0x5d899b === _0x8ff4ce; + }, + 'mqFNW': _0x4a9b6b(0x345), + 'hXQXU': _0x4a9b6b(0x366), + 'qaLZN': function (_0x304f89, _0x4f96a0) { + return _0x304f89 + _0x4f96a0; + }, + 'SyFuQ': _0x4a9b6b(0x1fd), + 'wWTGM': _0x4a9b6b(0x292), + 'opiXu': function (_0x16486e, _0x45288d) { + return _0x16486e(_0x45288d); + }, + 'GMucY': function (_0x55cf35, _0x5b1ec7, _0x56a7e3) { + return _0x55cf35(_0x5b1ec7, _0x56a7e3); + }, + 'VVWwW': _0x4a9b6b(0x2e3), + 'zMWEf': _0x4a9b6b(0x310), + 'fuDvD': _0x4a9b6b(0x255), + 'AAtXX': _0x4a9b6b(0x39e), + 'Ojjqt': _0x4a9b6b(0x2cb), + 'rrjLd': _0x4a9b6b(0x261), + 'xjYPA': function (_0x138833, _0x134ff4) { + return _0x138833 > _0x134ff4; + }, + 'UZCOD': _0x4a9b6b(0x2e4), + 'PeDZZ': _0x4a9b6b(0x287), + 'cCmOD': function (_0xe7c3fe, _0x6c71de) { + return _0xe7c3fe > _0x6c71de; + }, + 'clYHp': function (_0x34da34, _0x278ac6) { + return _0x34da34 + _0x278ac6; + }, + 'ZrFqI': function (_0x57a7fe, _0x1920c9, _0x45bdb2, _0x4ed88c) { + return _0x57a7fe(_0x1920c9, _0x45bdb2, _0x4ed88c); + } + }; + try { + let _0x654842 = JSON[_0x4a9b6b(0x213)](_0x2e7bc8); + _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x32f)]) && _0x54fefc[_0x4a9b6b(0x27d)](typeof _0x654842[_0x4a9b6b(0x339)], _0x54fefc[_0x4a9b6b(0x325)]) && !_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x1e8)]) && (_0x654842 = _0x654842[_0x4a9b6b(0x339)]); + let _0x100c47 = _0x654842[_0x4a9b6b(0x366)]; + _0x100c47[_0x4a9b6b(0x2c6)]('//') && (_0x100c47 = _0x54fefc[_0x4a9b6b(0x2eb)](_0x54fefc[_0x4a9b6b(0x245)], _0x100c47)); + if (!_0x100c47[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2c6)](_0x54fefc[_0x4a9b6b(0x322)])) + return null; + if (_0x54fefc[_0x4a9b6b(0x27d)](_0x100c47, _0x2bcad8)) { + if (_0x54fefc[_0x4a9b6b(0x3b8)](isVip, _0x100c47) || !_0x54fefc[_0x4a9b6b(0x3b8)](isVideoFormat, _0x100c47)) + return null; + } + if (_0x54fefc[_0x4a9b6b(0x22e)](isBlackVodUrl, _0x2bcad8, _0x100c47)) + return null; + let _0xcda3cd = {}; + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x224)])) + _0xcda3cd = _0x654842[_0x4a9b6b(0x2e3)]; + else { + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x29e)])) + _0xcda3cd = _0x654842[_0x4a9b6b(0x310)]; + else { + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x3ca)])) + _0xcda3cd = _0x654842[_0x4a9b6b(0x255)]; + else + _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x39a)]) && (_0xcda3cd = _0x654842[_0x4a9b6b(0x39e)]); + } + } + let _0x2e9070 = ''; + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x3b9)])) + _0x2e9070 = _0x654842[_0x54fefc[_0x4a9b6b(0x3b9)]]; + else + _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x2a4)]) && (_0x2e9070 = _0x654842[_0x54fefc[_0x4a9b6b(0x2a4)]]); + _0x54fefc[_0x4a9b6b(0x25a)](_0x2e9070[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2d3)], -0x60f * 0x1 + 0x12 * -0x164 + 0x7 * 0x471) && (_0xcda3cd[_0x54fefc[_0x4a9b6b(0x2a4)]] = _0x54fefc[_0x4a9b6b(0x2eb)]('\x20', _0x2e9070)); + let _0x530de6 = ''; + if (_0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x297)])) + _0x530de6 = _0x654842[_0x4a9b6b(0x2e4)]; + else + _0x654842[_0x4a9b6b(0x3b3) + _0x4a9b6b(0x2f2)](_0x54fefc[_0x4a9b6b(0x207)]) && (_0x530de6 = _0x654842[_0x4a9b6b(0x287)]); + _0x54fefc[_0x4a9b6b(0x281)](_0x530de6[_0x4a9b6b(0x314)]()[_0x4a9b6b(0x2d3)], 0x18ce + -0x22ae + 0x9e0) && (_0xcda3cd[_0x54fefc[_0x4a9b6b(0x207)]] = _0x54fefc[_0x4a9b6b(0x1f4)]('\x20', _0x530de6)); + _0xcda3cd = _0x54fefc[_0x4a9b6b(0x243)](fixJsonVodHeader, _0xcda3cd, _0x2bcad8, _0x100c47); + const _0x27e9a5 = { + 'header': _0xcda3cd, + 'url': _0x100c47, + 'parse': '0' + }; + return _0x27e9a5; + } catch (_0x174821) { + SpiderDebug[_0x4a9b6b(0x24a)](_0x174821); + } + return null; +} +function isVip(_0x12df4f) { + const _0x1cd01d = _0x24a000, _0x2ec382 = { + 'updKI': _0x1cd01d(0x2c9), + 'XOpkJ': _0x1cd01d(0x3a6), + 'iOaGQ': _0x1cd01d(0x306), + 'uIZrh': _0x1cd01d(0x2f6), + 'maOml': _0x1cd01d(0x21e), + 'kJixo': _0x1cd01d(0x2a6), + 'UgQzk': _0x1cd01d(0x31d), + 'zyeHF': _0x1cd01d(0x22c), + 'GPmSe': _0x1cd01d(0x282) + 'om', + 'HIEhJ': _0x1cd01d(0x318) + 'm', + 'SvZuD': _0x1cd01d(0x2fe), + 'SaoFF': function (_0x49391c, _0x475da1) { + return _0x49391c < _0x475da1; + }, + 'dhhxf': function (_0x4f647c, _0x40da9b) { + return _0x4f647c === _0x40da9b; + }, + 'SSpmn': _0x1cd01d(0x3c9) + 'a_', + 'SajNK': _0x1cd01d(0x3c9) + 'w_', + 'IKQGq': _0x1cd01d(0x3c9) + 'v_' + }; + try { + let _0x59a0c5 = ![]; + const _0x472579 = new URL(_0x12df4f)[_0x1cd01d(0x3b4)], _0x39662c = [ + _0x2ec382[_0x1cd01d(0x21c)], + _0x2ec382[_0x1cd01d(0x385)], + _0x2ec382[_0x1cd01d(0x38b)], + _0x2ec382[_0x1cd01d(0x34b)], + _0x2ec382[_0x1cd01d(0x2c0)], + _0x2ec382[_0x1cd01d(0x1f8)], + _0x2ec382[_0x1cd01d(0x26c)], + _0x2ec382[_0x1cd01d(0x2c3)], + _0x2ec382[_0x1cd01d(0x3c7)], + _0x2ec382[_0x1cd01d(0x2dd)], + _0x2ec382[_0x1cd01d(0x391)] + ]; + for (let _0x587e2f = 0x1168 * -0x1 + -0x2 * -0xffa + -0xe8c; _0x2ec382[_0x1cd01d(0x29f)](_0x587e2f, _0x39662c[_0x1cd01d(0x2d3)]); _0x587e2f++) { + if (_0x472579[_0x1cd01d(0x39f)](_0x39662c[_0x587e2f])) { + if (_0x2ec382[_0x1cd01d(0x358)](_0x39662c[_0x587e2f], _0x2ec382[_0x1cd01d(0x21c)])) { + if (_0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x267)]) || _0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x33a)]) || _0x12df4f[_0x1cd01d(0x39f)](_0x2ec382[_0x1cd01d(0x333)])) { + _0x59a0c5 = !![]; + break; + } + } else { + _0x59a0c5 = !![]; + break; + } + } + } + return _0x59a0c5; + } catch (_0x576cf8) { + SpiderDebug[_0x1cd01d(0x24a)](_0x576cf8); + } + return ![]; +} +function isBlackVodUrl(_0x307605, _0x697c5d) { + const _0x4a2c61 = _0x24a000, _0x27d7bc = { + 'gudMv': _0x4a2c61(0x2ad), + 'FRrZt': _0x4a2c61(0x3be) + }; + return _0x697c5d[_0x4a2c61(0x39f)](_0x27d7bc[_0x4a2c61(0x34c)]) || _0x697c5d[_0x4a2c61(0x39f)](_0x27d7bc[_0x4a2c61(0x210)]); +} +function fixJsonVodHeader(_0x194079, _0x3e179a, _0x56db4f) { + const _0x555e90 = _0x24a000, _0x3e9dd1 = { + 'GlESc': function (_0x2d4a85, _0x14b753) { + return _0x2d4a85 === _0x14b753; + }, + 'dixTK': _0x555e90(0x2b1) + 'om', + 'owLGb': _0x555e90(0x287), + 'UKmVu': _0x555e90(0x261), + 'wLZlp': _0x555e90(0x1fe) + '.0', + 'yLRcH': _0x555e90(0x342), + 'hhBdZ': _0x555e90(0x2f4), + 'jIZRt': _0x555e90(0x2fb) + _0x555e90(0x2d6) + _0x555e90(0x22f), + 'AQtGT': function (_0x35b12f, _0x2200a0) { + return _0x35b12f + _0x2200a0; + }, + 'tVGhB': _0x555e90(0x3b0) + _0x555e90(0x21d) + _0x555e90(0x2ae) + _0x555e90(0x26d) + _0x555e90(0x24e) + _0x555e90(0x37a) + _0x555e90(0x206) + _0x555e90(0x3c4) + _0x555e90(0x20e) + _0x555e90(0x360) + _0x555e90(0x38c) + _0x555e90(0x2e7) + }; + _0x3e9dd1[_0x555e90(0x326)](_0x194079, null) && (_0x194079 = {}); + if (_0x3e179a[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x260)])) + _0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = '\x20', _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x29b)]; + else { + if (_0x56db4f[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x30b)])) + _0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = '\x20', _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x29b)]; + else + _0x3e179a[_0x555e90(0x39f)](_0x3e9dd1[_0x555e90(0x27a)]) && (_0x194079[_0x3e9dd1[_0x555e90(0x1fc)]] = _0x3e9dd1[_0x555e90(0x209)], _0x194079[_0x3e9dd1[_0x555e90(0x232)]] = _0x3e9dd1[_0x555e90(0x335)]('\x20', _0x3e9dd1[_0x555e90(0x363)])); + } + return _0x194079; +} +const snifferMatch = /http((?!http).){26,}?\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\?.*|http((?!http).){26,}\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){26,}\/m3u8\?pt=m3u8.*|http((?!http).)*?default\.ixigua\.com\/.*|http((?!http).)*?cdn-tos[^\?]*|http((?!http).)*?\/obj\/tos[^\?]*|http.*?\/player\/m3u8play\.php\?url=.*|http.*?\/player\/.*?[pP]lay\.php\?url=.*|http.*?\/playlist\/m3u8\/\?vid=.*|http.*?\.php\?type=m3u8&.*|http.*?\/download.aspx\?.*|http.*?\/api\/up_api.php\?.*|https.*?\.66yk\.cn.*|http((?!http).)*?netease\.com\/file\/.*/; +function isVideoFormat(_0x5515b3) { + const _0xf7bf44 = _0x24a000, _0x2fce53 = { + 'HdgCs': _0xf7bf44(0x3b7), + 'iPFTd': _0xf7bf44(0x1ef) + }; + if (snifferMatch[_0xf7bf44(0x36e)](_0x5515b3)) + return !_0x5515b3[_0xf7bf44(0x39f)](_0x2fce53[_0xf7bf44(0x309)]) || !_0x5515b3[_0xf7bf44(0x39f)](_0x2fce53[_0xf7bf44(0x1ee)]); + return ![]; +} +function isVideo(_0x507319) { + const _0x1fc38a = _0x24a000, _0x2030df = { + 'zjKSG': _0x1fc38a(0x350), + 'omoGP': _0x1fc38a(0x35c) + }; + return !_0x507319[_0x1fc38a(0x39f)](_0x2030df[_0x1fc38a(0x357)]) && !_0x507319[_0x1fc38a(0x39f)](_0x2030df[_0x1fc38a(0x248)]); +} +function UA(_0x59c882) { + const _0x1c26ca = _0x24a000, _0x800c4e = { + 'KVRHH': _0x1c26ca(0x343), + 'FVRLu': _0x1c26ca(0x286) + '.0', + 'dZwJv': _0x1c26ca(0x3b0) + _0x1c26ca(0x21d) + _0x1c26ca(0x2ae) + _0x1c26ca(0x26d) + _0x1c26ca(0x24e) + _0x1c26ca(0x37a) + _0x1c26ca(0x206) + _0x1c26ca(0x3c4) + _0x1c26ca(0x20e) + _0x1c26ca(0x360) + _0x1c26ca(0x38c) + _0x1c26ca(0x2e7) + }; + if (_0x59c882[_0x1c26ca(0x39f)](_0x800c4e[_0x1c26ca(0x289)])) + return _0x800c4e[_0x1c26ca(0x39c)]; + return _0x800c4e[_0x1c26ca(0x305)]; +} +function getCateUrl(_0x23db0c) { + const _0x49974e = _0x24a000, _0x37953d = { + 'ECjej': _0x49974e(0x27c) + 'p', + 'sFIgg': _0x49974e(0x25c), + 'TJcyc': function (_0xdc8f68, _0x11b1f5) { + return _0xdc8f68 + _0x11b1f5; + }, + 'BxtWY': _0x49974e(0x2c4), + 'tMugk': _0x49974e(0x343), + 'YouNd': function (_0x4b91da, _0x11cfe1) { + return _0x4b91da + _0x11cfe1; + }, + 'GRdgl': _0x49974e(0x367) + }; + if (_0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x2d0)]) || _0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x29c)])) + return _0x37953d[_0x49974e(0x235)](_0x23db0c, _0x37953d[_0x49974e(0x33c)]); + else + return _0x23db0c[_0x49974e(0x39f)](_0x37953d[_0x49974e(0x32e)]) ? _0x37953d[_0x49974e(0x236)](_0x23db0c, _0x37953d[_0x49974e(0x381)]) : ''; +} +function getPlayUrlPrefix(_0x5ee424) { + const _0x1bf8f8 = _0x24a000, _0x598264 = { + 'FSokj': _0x1bf8f8(0x27c) + 'p', + 'FPdLA': _0x1bf8f8(0x25c), + 'JQGUp': function (_0xdfc607, _0x448366) { + return _0xdfc607 + _0x448366; + }, + 'ToKis': _0x1bf8f8(0x348) + _0x1bf8f8(0x2a7), + 'NaZIK': _0x1bf8f8(0x343), + 'hggTv': function (_0x4737db, _0x8a0e91) { + return _0x4737db + _0x8a0e91; + }, + 'rcDwJ': _0x1bf8f8(0x30f) + _0x1bf8f8(0x22b) + }; + if (_0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x323)]) || _0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x2a2)])) + return _0x598264[_0x1bf8f8(0x299)](_0x5ee424, _0x598264[_0x1bf8f8(0x3b5)]); + else + return _0x5ee424[_0x1bf8f8(0x39f)](_0x598264[_0x1bf8f8(0x21b)]) ? _0x598264[_0x1bf8f8(0x2de)](_0x5ee424, _0x598264[_0x1bf8f8(0x398)]) : ''; +} +function getRecommendUrl(_0x80e8f1) { + const _0x43bed3 = _0x24a000, _0x5b36fd = { + 'TOllB': _0x43bed3(0x27c) + 'p', + 'PVTeb': _0x43bed3(0x25c), + 'zyflE': function (_0x5b4b9d, _0x36c3c2) { + return _0x5b4b9d + _0x36c3c2; + }, + 'ijImY': _0x43bed3(0x268) + _0x43bed3(0x31b), + 'EfLao': _0x43bed3(0x343), + 'Sebfw': function (_0x1c1df5, _0x470f1b) { + return _0x1c1df5 + _0x470f1b; + }, + 'SdUcg': _0x43bed3(0x291) + }; + if (_0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x354)]) || _0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x2ca)])) + return _0x5b36fd[_0x43bed3(0x2b0)](_0x80e8f1, _0x5b36fd[_0x43bed3(0x336)]); + else + return _0x80e8f1[_0x43bed3(0x39f)](_0x5b36fd[_0x43bed3(0x23b)]) ? _0x5b36fd[_0x43bed3(0x3b1)](_0x80e8f1, _0x5b36fd[_0x43bed3(0x2b4)]) : ''; +} +function _0x30bd() { + const _0x2b0aa4 = [ + 'Rhngk', + '0\x20(Macinto', + 'nqoHH', + 'Udbgi', + 'VVWwW', + 'vod_url_wi', + 'comic+4K=m', + 'vod_conten', + 'vod_area', + 'bkKAx', + '分类+全部=+电影=', + 'd_id=', + 'acfun.cn', + '分类接口错误:', + 'GMucY', + 'i.com/', + '?ac=detail', + 'hQLKD', + 'UKmVu', + 'Uqurg', + '11bSKqkq', + 'TJcyc', + 'YouNd', + '&pg=1', + 'fuavN', + 'Zelfl', + '+2008+2007', + 'EfLao', + 'limit', + 'vod_actor', + 'XhjKd', + 'ist&t=', + 'gINFD', + '?ac=list&z', + '匪+犯罪+动画+奇幻', + 'ZrFqI', + 'sh;\x20Intel\x20', + 'SyFuQ', + '6057730KXKKrO', + 'nAAlp', + 'omoGP', + '+2024+2023', + 'log', + 'zlCKO', + '?type=', + '10ifJwJp', + ')\x20AppleWeb', + 'get', + '?wd=', + 'th_player', + 'nDVeB', + 'MJeua', + 'nFrDW', + 'headers', + 'area', + 'tvplay+综艺=', + 'state', + 'indexOf', + 'xjYPA', + 'lass=', + 'xgapp', + 'search?tex', + 'mWrNJ', + 'axNZh', + 'dixTK', + 'User-Agent', + 'eXwPu', + 'pg=#PN#', + 'ome/91.0.4', + 'split', + 'AdIkD', + 'SSpmn', + 'index_vide', + 'okhttp/3.1', + '+2016+2015', + '&page=#PN#', + 'UgQzk', + 'Win64;\x20x64', + 'RZVZb', + 'rAAqR', + 'FMcfW', + 'qhbab', + 'qvaVO', + 'fBrnR', + 'ts+评分=scor', + 'vqyhb', + 'uUBbz', + 'SKgeb', + 'tvshow+动漫=', + 'FEuLQ', + 'hhBdZ', + 'lang', + 'api.php/ap', + 'SXiUp', + 'rQSdz', + 'OdHdL', + 'bkfnv', + 'cCmOD', + 'bilibili.c', + 'uzruO', + '+2006+2005', + 'AEWJN', + 'okhttp/4.1', + 'Referer', + '/vod', + 'KVRHH', + '大+其他\x0a筛选yea', + 'fcPwA', + 'gHEas', + 'rfYvZ', + 'ist&wd=', + 'KqkGD', + 'vod_pic', + '/vodPhbAll', + 'http', + 'UlRrv', + 'PPjsc', + '9IUFsEu', + '+2012+2011', + 'UZCOD', + 'xVjfI', + 'JQGUp', + 'WodPN', + 'wLZlp', + 'sFIgg', + '+大陆+香港+台湾+', + 'zMWEf', + 'SaoFF', + 'qrmQn', + 'Qzbyi', + 'FPdLA', + 'emPiw', + 'rrjLd', + 'QIbLN', + 'mgtv.com', + 'il?id=', + 'ovie_4k+体育', + 'HHuLq', + '+农村+惊悚+惊悚+', + '=tiyu\x0a筛选cl', + 'vod_list', + '973973.xyz', + '\x20NT\x2010.0;\x20', + '=1&area=&t', + 'zyflE', + 'www.mgtv.c', + '+2000', + 'IWfGL', + 'SdUcg', + '科幻+剧情+战争+警', + 'umjti', + '+2018+2017', + 'vod_name', + 'eCaVc', + 'nvSRb', + 'fkHDy', + 'raJIH', + '&pg=', + 'Xavsg', + 'xaxYD', + 'maOml', + 'cchWu', + 'class&star', + 'zyeHF', + 'nav?token=', + 'wovvt', + 'startsWith', + 'VeDky', + '$$$', + 'iqiyi.com', + 'PVTeb', + 'user-agent', + 'lpEGG', + 'vod_direct', + 'pagecount', + '/provide/v', + 'ECjej', + 'https://ji', + 'OIKvw', + 'length', + 'vlist', + 'fari/537.3', + 'ww.bilibil', + 'ea&type=筛选', + 'Mac\x20OS\x20X\x201', + 'QDURc', + '伦理+情色+福利+三', + 'y=c87681c9', + '筛选area&lan', + 'HIEhJ', + 'hggTv', + 'oRses', + '+爱情+恐怖+动作+', + '2.11', + 'jIVVu', + 'header', + 'referer', + 'replace', + 'video?tid=', + '37.36', + 'YTcha', + 'type_exten', + '筛选area+全部=', + 'qaLZN', + '3d5e430cac', + 'znjdK', + 'bfaLF', + 'IKCWR', + 'g=筛选lang&y', + 'QZvys', + 'erty', + 'fIzpG', + 'bilibili', + '4oTuTQS', + 'le.com', + 'vod_play_l', + 'zMZmQ', + 'class', + '472.114\x20Sa', + '\x20https://w', + 'it=18&page', + 'PzBoQ', + 'pptv.com', + 'JpyoV', + 'GGHOc', + 'OvREh', + 'AsjQf', + 'UwOqb', + '1aa5&url=', + 'dZwJv', + 'youku.com', + 'ofHAn', + 'ulXQF', + 'HdgCs', + 'HUsMa', + 'yLRcH', + 'XjiyL', + 'TVfJB', + 'zFyTh', + '/detail?vo', + 'Header', + 'vod_class', + '+2010+2009', + 'IFEDw', + 'trim', + 'isArray', + 'eXDqH', + 'TmtUN', + 'baofeng.co', + 'KRVeJ', + '537.36\x20(KH', + 'o?token=', + 'IpeiC', + 'sohu.com', + 'wpdZs', + '+2014+2013', + 'rDTqC', + 'WNSZb', + 'wWTGM', + 'FSokj', + '?ac=videol', + 'mqFNW', + 'GlESc', + 'EsiSO', + 'fUjyK', + '+2002+2001', + 'ghVBe', + 'mEBLG', + 'vod_year', + 'parse2', + 'tMugk', + 'glzca', + 'code', + '+2022+2021', + 'push', + 'IKQGq', + 'ViinS', + 'AQtGT', + 'ijImY', + 'host', + 'ext', + 'data', + 'SajNK', + 'MAPTF', + 'BxtWY', + 'floor', + 'xIeyb', + 'fmHZd', + 'ear=筛选year', + 'exi.jdyx.p', + 'titan.mgtv', + '.vod', + 'hPgPi', + 'object', + 'vod_remark', + 'MWcjN', + 'video_deta', + 'ro/api/?ke', + '11069064LnYXCB', + 'uIZrh', + 'gudMv', + 'vod_play_f', + 'VoCNI', + '美国+英国+法国+日', + '.mp4', + 'stype', + ' { + const _0x53867c = _0x4dd129, _0x8beb43 = { + 'TSUgZ': function (_0x52410f, _0x64397c) { + const _0x2a0b08 = _0x3bf3; + return _0x1bb544[_0x2a0b08(0x275)](_0x52410f, _0x64397c); + }, + 'FMcfW': _0x1bb544[_0x53867c(0x303)], + 'OvREh': function (_0x17e635, _0x1e79bc) { + const _0x2b8dff = _0x53867c; + return _0x1bb544[_0x2b8dff(0x3aa)](_0x17e635, _0x1e79bc); + }, + 'RZVZb': function (_0x2aff9c, _0x16add9, _0x39fb37, _0x56dec0) { + const _0x399614 = _0x53867c; + return _0x1bb544[_0x399614(0x380)](_0x2aff9c, _0x16add9, _0x39fb37, _0x56dec0); + } + }; + try { + const _0x5b9b85 = _0x2c154b[_0x4410f9]; + _0x1bb544[_0x53867c(0x20f)](_0x4410f9, _0x4dc412) && Array[_0x53867c(0x315)](_0x5b9b85) && _0xe7aee[_0x53867c(0x332)](_0x5b9b85), _0x1bb544[_0x53867c(0x20f)](typeof _0x5b9b85, _0x1bb544[_0x53867c(0x303)]) && _0x1bb544[_0x53867c(0x1f0)](_0x5b9b85, null) && (Array[_0x53867c(0x315)](_0x5b9b85) ? _0x5b9b85[_0x53867c(0x1e6)](_0xce021c => { + const _0x7a8860 = _0x53867c; + _0x8beb43[_0x7a8860(0x3bc)](typeof _0xce021c, _0x8beb43[_0x7a8860(0x270)]) && _0x8beb43[_0x7a8860(0x301)](_0xce021c, null) && _0x8beb43[_0x7a8860(0x26e)](findJsonArray, _0xce021c, _0x4dc412, _0xe7aee); + }) : _0x1bb544[_0x53867c(0x380)](findJsonArray, _0x5b9b85, _0x4dc412, _0xe7aee)); + } catch (_0x161cd2) { + SpiderDebug[_0x53867c(0x24a)](_0x161cd2); + } + }); +} +function jsonArr2Str(_0x2ac5a3) { + const _0x171e1b = _0x24a000, _0x3f6d96 = { + 'IFEDw': function (_0x584b3a, _0x1079df) { + return _0x584b3a < _0x1079df; + } + }, _0x36becd = []; + for (let _0x29367c = -0x1 * -0x1987 + 0x1 * -0x1323 + -0x664; _0x3f6d96[_0x171e1b(0x313)](_0x29367c, _0x2ac5a3[_0x171e1b(0x2d3)]); _0x29367c++) { + try { + _0x36becd[_0x171e1b(0x332)](_0x2ac5a3[_0x29367c]); + } catch (_0x3e4b7e) { + SpiderDebug[_0x171e1b(0x24a)](_0x3e4b7e); + } + } + return _0x36becd[_0x171e1b(0x365)](','); +} +function getHeaders(_0x2dbbbb) { + const _0x690d7 = _0x24a000, _0x11947b = { + 'OdHdL': _0x690d7(0x261), + 'VeDky': function (_0x4325bb, _0x1c5140) { + return _0x4325bb(_0x1c5140); + } + }, _0x24e5fe = {}; + return _0x24e5fe[_0x11947b[_0x690d7(0x27f)]] = _0x11947b[_0x690d7(0x2c7)](UA, _0x2dbbbb), _0x24e5fe; +} +function isJsonString(_0x52901c) { + const _0x44dab5 = _0x24a000; + try { + JSON[_0x44dab5(0x213)](_0x52901c); + } catch (_0x568d34) { + return ![]; + } + return !![]; +} +export function __jsEvalReturn() { + return { + 'init': init, + 'home': home, + 'homeVod': homeVod, + 'category': category, + 'detail': detail, + 'play': play, + 'search': search + }; +} \ No newline at end of file diff --git a/jaychouqq/yingshi/js7/jhdj.js b/jaychouqq/yingshi/js7/jhdj.js new file mode 100644 index 00000000..0ad0959d --- /dev/null +++ b/jaychouqq/yingshi/js7/jhdj.js @@ -0,0 +1,1669 @@ +/* +@header({ + searchable: 1, + filterable: 1, + quickSearch: 1, + title: '聚合短剧', + lang: 'cat' +}) +*/ + +import { Crypto as CryptoJS } from 'assets://js/lib/cat.js'; + +let debug = 1; +let siteName = '聚合短剧'; +let xingya_headers = {}; +let niuniu_headers = {}; +let niuniu_token = ''; +let niuniu_access_token = ''; +let hema_headers = {}; + +// 搜索缓存 +const searchCache = new Map(); +const CACHE_TTL = 5 * 60 * 1000; + +// 分类排除规则 +const cate_remove = ['分类排除', '软鸭', '碎片', '锦鲤', '番茄', '甜圈']; +const UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36"; + +const aggConfig = { + keys: 'd3dGiJc651gSQ8w1', + searchLimit: 20, + searchTimeout: 8000, + charMap: { + '+': 'P', '/': 'X', '0': 'M', '1': 'U', '2': 'l', '3': 'E', '4': 'r', '5': 'Y', '6': 'W', '7': 'b', '8': 'd', '9': 'J', + 'A': '9', 'B': 's', 'C': 'a', 'D': 'I', 'E': '0', 'F': 'o', 'G': 'y', 'H': '_', 'I': 'H', 'J': 'G', 'K': 'i', 'L': 't', + 'M': 'g', 'N': 'N', 'O': 'A', 'P': '8', 'Q': 'F', 'R': 'k', 'S': '3', 'T': 'h', 'U': 'f', 'V': 'R', 'W': 'q', 'X': 'C', + 'Y': '4', 'Z': 'p', 'a': 'm', 'b': 'B', 'c': 'O', 'd': 'u', 'e': 'c', 'f': '6', 'g': 'K', 'h': 'x', 'i': '5', 'j': 'T', + 'k': '-', 'l': '2', 'm': 'z', 'n': 'S', 'o': 'Z', 'p': '1', 'q': 'V', 'r': 'v', 's': 'j', 't': 'Q', 'u': '7', 'v': 'D', + 'w': 'w', 'x': 'n', 'y': 'L', 'z': 'e' + }, + headers: { + json: { 'User-Agent': 'okhttp/4.10.0', 'Content-Type': 'application/json' }, + form: { 'User-Agent': 'okhttp/4.10.0', 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }, + niuniu: { 'Cache-Control': 'no-cache', 'Content-Type': 'application/json;charset=UTF-8', 'User-Agent': 'okhttp/4.12.0' }, + baidu: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': UA }, + hema: { + 'datas': 'e5f22c6e2c82fe001738cb9ce4696eab0556d064a55aef402e0fbe6b29a083f6538e4567de38e67de2071a49d9751526bfba45314e1fd4702b11c76ab9a3b5f873262854ba66e6715ed51364dbc6ee62c7180e047fcbcdbfd49874fc8f28674b16d90ca71a02de76c70598e0b75e647c37c2c19287e49be5f2a259d727dfc4df3d28802388bf3c356576b342e17e30a2ab74859263dba4d1c8eba79990d22d60d60927fdacb2addf2f0eaadd8887585ca2eb87f603faf0c207dda18cf67dc25b2199d303baff9e6605b3314a7d2631f62864f48619daceb9452f2b7b0667773553741856df030cca68af3c57810f983d452bb428ef5fc32206aef4865ae06c629bee7f5135547304acc7ef4e7c6df887308f2e79c493fd2ee03488722861b5bb51b09cb8911dfc92c288d94e601c066d2f9d612ad2c8d4eeb4920b1d44aff3e13fd75229b857f64925df1cf12f75a00d438c422ec1726462b915903f1dd1f4bb7cdf82cc15a6d507f80c789903e710f39a62aef073f3f93a6c681e75d295428aa290d7e98f82e7e9ad6e2b23d9086dfe8c63c5d8550b13fd61a77291473a8bdd43c7c2639f264be69d9d07f0585de4342a399275a64e7d1d4400b8ed4421a2f289f622e40cdd1cfc916a0b9ce747c924ac33e32d24b91ed5d64772d6ad6896412f52724006eabf12aaecfd6e81dad432c7b3800bbf793a1c375e3e7b4fb3b097724b5fc88a8c9bcf3dbc10cbdb252965', + 'Content-Type': 'text/plain' + }, + haokan: { + 'User-Agent': UA, + 'Talos-Module-Name': 'shortDrama', + 'Talos-Module-Version': '1.0.71.1', + 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', + 'Cookie': 'BAIDUCUID=giHCu0azv80G8SfQ0avU8gaaH8jfiv86ju2MugiR2i8-k3a35avAa1_mA' + } + } +}; + +// ==================== URL配置 ==================== +const rule = { + 百度: { + host: 'https://mbd.baidu.com', + detailHost: 'https://sv.baidu.com', + list: '/feedapi/v1/videoserver/playlets/list?service=bdbox', + search: '/feedapi/v1/videoserver/playlets/search?service=bdbox', + detail: '/haokan/ui-video/playlet/rec/detail?log=vhk&tn=1020970b&ctn=1008350n&blur=1', + play: '/appui/api?cmd=video/relate&log=vhk&tn=1020970b&ctn=1008350n&blur=1' + }, + 七猫: { + host: 'https://api-store.qmplaylet.com', + list: '/api/v1/playlet/index', + detail: 'https://api-read.qmplaylet.com/player/api/v1/playlet/info', + search: '/api/v1/playlet/search' + }, + 星芽: { + host: 'https://app.whjzjx.cn', + list: '/cloud/v2/theater/home_page?theater_class_id', + detail: '/v2/theater_parent/detail', + search: '/v3/search', + login: 'https://u.shytkjgs.com/user/v1/account/login' + }, + 西饭: { + host: 'https://xifan-api-cn.youlishipin.com', + list: '/xifan/drama/portalPage', + detail: '/xifan/drama/getDuanjuInfo', + search: '/xifan/search/getSearchList' + }, + 牛牛: { + host: 'https://new.tianjinzhitongdaohe.com', + list: '/api/v1/app/screen/screenMovie', + detail: '/api/v1/app/play/movieDetails', + search: '/api/v1/app/search/searchMovie', + desc: '/api/v1/app/play/movieDesc', + visitor: '/api/v1/app/user/visitorInfo', + login: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/user/login?siteid=5627189', + detail2: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/shortplay/detail?siteid=5627189', + unlock: 'https://csj-sp.csjdeveloper.com/csj_sp/api/v1/pay/ad_unlock?siteid=5627189' + }, + 围观: { + host: 'https://api.drama.9ddm.com', + list: '/drama/home/shortVideoTags?version_code=1500&os_type=1', + detail: '/drama/home/shortVideoDetail?version_code=1500&os_type=1', + search: '/drama/home/search?version_code=1500&os_type=1' + }, + 河马: { + host: 'https://freevideo.zqqds.cn', + list: '/free-video-portal/portal/1121', + detail: '/free-video-portal/portal/1131', + episode: '/free-video-portal/portal/1132', + play: '/free-video-portal/portal/1133', + search: '/free-video-portal/portal/1803' + }, + 星星: { + host: 'http://read.api.duodutek.com', + list: '/novel-api/app/pageModel/getResourceById', + detail: '/novel-api/basedata/book/getChapterList' + }, + 好看: { + host: 'https://sv.baidu.com', + list: '/haokan/ui-feed/playletTagsFeed?osbranch=a0', + home: '/haokan/ui-feed/playletShelfFeed?osbranch=a0', + detail_list: '/appui/api?osbranch=a0', + detail: '/haokan/ui-video/playlet/rec/detail?osbranch=a0', + play: '/appui/api?osbranch=a0', + search: '/haokan/ui-interact/playlet/search/sugs?osbranch=a0' + } +}; + +const platformList = [ + { name: '百度短剧', id: '百度' }, + { name: '七猫短剧', id: '七猫' }, + { name: '星芽短剧', id: '星芽' }, + { name: '西饭短剧', id: '西饭' }, + { name: '牛牛短剧', id: '牛牛' }, + { name: '围观短剧', id: '围观' }, + { name: '河马短剧', id: '河马' }, + { name: '星星短剧', id: '星星' }, + { name: '好看短剧', id: '好看' } +]; + +const ruleFilterDef = { + 百度: { area: '新剧' }, + 七猫: { area: '0' }, + 星芽: { area: '1' }, + 西饭: { area: '68@都市' }, + 牛牛: { area: '现言' }, + 围观: { area: '' }, + 河马: { area: '308' }, + 星星: { area: '1287' }, + 好看: { area: '1' } +}; + +// ==================== 筛选配置 ==================== +const filterOptions = { + "七猫": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "全部", "v": "" }, + { "n": "推荐", "v": "0" }, + { "n": "新剧", "v": "-1" }, + { "n": "都市情感", "v": "1273" }, + { "n": "古装", "v": "1272" }, + { "n": "都市", "v": "571" }, + { "n": "玄幻仙侠", "v": "1286" }, + { "n": "奇幻", "v": "570" }, + { "n": "乡村", "v": "590" }, + { "n": "民国", "v": "573" }, + { "n": "年代", "v": "572" }, + { "n": "青春校园", "v": "1288" }, + { "n": "武侠", "v": "371" }, + { "n": "科幻", "v": "594" }, + { "n": "末世", "v": "556" }, + { "n": "二次元", "v": "1289" }, + { "n": "逆袭", "v": "400" }, + { "n": "穿越", "v": "373" }, + { "n": "复仇", "v": "795" }, + { "n": "系统", "v": "787" }, + { "n": "权谋", "v": "790" }, + { "n": "重生", "v": "784" }, + { "n": "女性成长", "v": "1294" }, + { "n": "打脸虐渣", "v": "716" }, + { "n": "闪婚", "v": "480" }, + { "n": "强者回归", "v": "402" }, + { "n": "追妻火葬场", "v": "715" }, + { "n": "家庭", "v": "670" }, + { "n": "马甲", "v": "558" }, + { "n": "职场", "v": "724" }, + { "n": "宫斗", "v": "343" }, + { "n": "高手下山", "v": "1299" }, + { "n": "娱乐明星", "v": "1295" }, + { "n": "异能", "v": "727" }, + { "n": "宅斗", "v": "342" }, + { "n": "替身", "v": "712" }, + { "n": "穿书", "v": "338" }, + { "n": "商战", "v": "723" }, + { "n": "种田经商", "v": "1291" }, + { "n": "伦理", "v": "1293" }, + { "n": "社会话题", "v": "1290" }, + { "n": "致富", "v": "492" }, + { "n": "偷听心声", "v": "1258" }, + { "n": "脑洞", "v": "526" }, + { "n": "豪门总裁", "v": "624" }, + { "n": "萌宝", "v": "356" }, + { "n": "战神", "v": "527" }, + { "n": "真假千金", "v": "812" }, + { "n": "赘婿", "v": "36" }, + { "n": "神医", "v": "1269" }, + { "n": "神豪", "v": "37" }, + { "n": "小人物", "v": "1296" }, + { "n": "团宠", "v": "545" }, + { "n": "欢喜冤家", "v": "464" }, + { "n": "女帝", "v": "617" }, + { "n": "银发", "v": "1297" }, + { "n": "兵王", "v": "28" }, + { "n": "虐恋", "v": "16" }, + { "n": "甜宠", "v": "21" }, + { "n": "悬疑", "v": "27" }, + { "n": "搞笑", "v": "793" }, + { "n": "灵异", "v": "1287" } + ] + }], + "牛牛": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "全部", "v": "" }, + { "n": "现言", "v": "现言" }, + { "n": "古言", "v": "古言" }, + { "n": "历史", "v": "历史" }, + { "n": "都市", "v": "都市" }, + { "n": "活动", "v": "活动" }, + { "n": "逆袭", "v": "逆袭" }, + { "n": "豪门", "v": "豪门" }, + { "n": "现代言情", "v": "现代言情" }, + { "n": "战神", "v": "战神" }, + { "n": "甜宠", "v": "甜宠" }, + { "n": "穿越", "v": "穿越" }, + { "n": "古装", "v": "古装" }, + { "n": "虐心", "v": "虐心" }, + { "n": "神医", "v": "神医" }, + { "n": "赘婿", "v": "赘婿" }, + { "n": "亲情", "v": "亲情" }, + { "n": "复仇", "v": "复仇" }, + { "n": "玄幻", "v": "玄幻" }, + { "n": "古代言情", "v": "古代言情" }, + { "n": "热血", "v": "热血" }, + { "n": "动作", "v": "动作" }, + { "n": "喜剧", "v": "喜剧" }, + { "n": "悬疑", "v": "悬疑" }, + { "n": "军事", "v": "军事" }, + { "n": "二次元", "v": "二次元" }, + { "n": "未来", "v": "未来" }, + { "n": "快速穿越", "v": "快速穿越" }, + { "n": "烧脑", "v": "烧脑" }, + { "n": "治愈", "v": "治愈" }, + { "n": "其他剧情", "v": "其他剧情" } + ] + }], + "百度": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "新剧", "v": "新剧" }, + { "n": "限时免费", "v": "限时免费" }, + { "n": "精选", "v": "精选" }, + { "n": "独播", "v": "独播" }, + { "n": "全部", "v": "全部题材" }, + { "n": "神医", "v": "神医" }, + { "n": "连续剧", "v": "连续剧" }, + { "n": "都市", "v": "都市" }, + { "n": "现代言情", "v": "现代言情" }, + { "n": "异能", "v": "异能" }, + { "n": "逆袭", "v": "逆袭" }, + { "n": "甜宠", "v": "甜宠" }, + { "n": "总裁", "v": "总裁" }, + { "n": "萌宝", "v": "萌宝" }, + { "n": "战神", "v": "战神" }, + { "n": "宫斗宅斗", "v": "宫斗宅斗" }, + { "n": "神豪", "v": "神豪" }, + { "n": "虐恋", "v": "虐恋" }, + { "n": "闪婚", "v": "闪婚" }, + { "n": "玄幻", "v": "玄幻" }, + { "n": "穿越重生", "v": "穿越重生" }, + { "n": "年代", "v": "年代" }, + { "n": "家庭伦理", "v": "家庭伦理" }, + { "n": "古代言情", "v": "古代言情" }, + { "n": "武侠武打", "v": "武侠武打" }, + { "n": "赘婿", "v": "赘婿" }, + { "n": "单元剧", "v": "单元剧" }, + { "n": "青春校园", "v": "青春校园" }, + { "n": "历史架空", "v": "历史架空" }, + { "n": "王妃", "v": "王妃" }, + { "n": "鉴宝", "v": "鉴宝" }, + { "n": "科幻", "v": "科幻" }, + { "n": "军旅战争", "v": "军旅战争" }, + { "n": "种田", "v": "种田" } + ] + }], + "围观": [{ + "key": "area", + "name": "分类", + "value": [{ "n": "全部", "v": "" }] + }], + "星芽": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "剧场", "v": "1" }, + { "n": "热播剧", "v": "2" }, + { "n": "会员专享", "v": "8" }, + { "n": "星选好剧", "v": "7" }, + { "n": "新剧", "v": "3" }, + { "n": "阳光剧场", "v": "5" } + ] + }], + "西饭": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "都市", "v": "68@都市" }, + { "n": "青春", "v": "68@青春" }, + { "n": "现代言情", "v": "81@现代言情" }, + { "n": "豪门", "v": "81@豪门" }, + { "n": "大女主", "v": "80@大女主" }, + { "n": "逆袭", "v": "79@逆袭" }, + { "n": "打脸虐渣", "v": "79@打脸虐渣" }, + { "n": "穿越", "v": "81@穿越" } + ] + }], + "河马": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "推荐", "v": "308" }, + { "n": "新剧", "v": "309" }, + { "n": "逆袭", "v": "310" }, + { "n": "恋爱", "v": "311" }, + { "n": "强者回归", "v": "312" }, + { "n": "豪门恩怨", "v": "313" }, + { "n": "古装", "v": "314" }, + { "n": "重生", "v": "315" }, + { "n": "萌宝", "v": "316" }, + { "n": "复仇", "v": "317" }, + { "n": "神医", "v": "318" }, + { "n": "高手下山", "v": "319" }, + { "n": "超能悬疑", "v": "320" }, + { "n": "传承觉醒", "v": "321" }, + { "n": "神豪", "v": "322" }, + { "n": "民国", "v": "323" } + ] + }], + "星星": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "甜宠", "v": "1287" }, + { "n": "逆袭", "v": "1288" }, + { "n": "热血", "v": "1289" }, + { "n": "现代", "v": "1290" }, + { "n": "古代", "v": "1291" } + ] + }], + "好看": [{ + "key": "area", + "name": "分类", + "value": [ + { "n": "热播剧", "v": "1" }, + { "n": "新剧", "v": "2" }, + { "n": "战神", "v": "1001" }, + { "n": "神豪", "v": "2001" }, + { "n": "神医", "v": "1002" }, + { "n": "甜宠", "v": "1007" }, + { "n": "赘婿", "v": "1003" }, + { "n": "穿越重生", "v": "2004" }, + { "n": "异能", "v": "2005" }, + { "n": "虐恋", "v": "1006" }, + { "n": "宫斗宅斗", "v": "2006" }, + { "n": "玄幻", "v": "2009" } + ] + }] +}; + +// 河马分类标签映射 +const hemaTagIds = { + "308": "", "309": "", "310": "417,473,474,464", "311": "462,466", "312": "476", + "313": "585,616", "314": "444,468", "315": "417,439,464,465", "316": "589", + "317": "416,439,463,465", "318": "438", "319": "417,474,464", "320": "439,442,443,445,465,470", + "321": "417,473,474,464", "322": "472,475,585", "323": "590" +}; + +// 西饭搜索固定session参数 +const XIFAN_SESSION_PARAMS = 'session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY2ODk4NiIsInVuIjoiT1BHX2U5ODQ4NTgzZmM4ZjQzZTJhZjc5ZTcxNjRmZTE5Y2JjIiwiZnQiOiIxNzQwNjY4OTg2In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjM0MDU3ODE4OTgxNDk5OTA0LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjY4OTg2LCJ1bm0iOiJPUEdfZTk4NDg1ODNmYzhmNDNlMmFmNzllNzE2NGZlMTljYmMiLCJpZCI6ImVhZGE1NmEyZWEzYTE0YmMwMzE3ZDc2ZmVjODJjNzc3IiwiZXhwIjoxNzQxMjczNzg2LCJkYyI6ImJqaHQifQ.IwuI0gK077RF4G10JRxgxx4GCG502vR8Z0W9EV4kd-c'; + +// ==================== 日志函数 ==================== +function log(level, tag, msg) { + if (!debug) return; + const prefix = { 0: '🔍', 1: '✅', 2: '⚠️', 3: '❌' }[level] || '📝'; + console.log(`${prefix}【${tag}】 ${msg}`); +} + +function logTime(start, label) { + if (!debug) return; + console.log(`⏱️【${label}】耗时: ${Date.now() - start}ms`); +} + +// ==================== 七猫公共函数 ==================== +async function getQmParamsAndSign() { + let sessionId = Math.floor(Date.now()).toString(); + let data = { + "static_score": "0.8", + "uuid": "00000000-7fc7-08dc-0000-000000000000", + "device-id": "20250220125449b9b8cac84c2dd3d035c9052a2572f7dd0122edde3cc42a70", + "mac": "", + "sourceuid": "aa7de295aad621a6", + "refresh-type": "0", + "model": "22021211RC", + "wlb-imei": "", + "client-id": "aa7de295aad621a6", + "brand": "Redmi", + "oaid": "", + "oaid-no-cache": "", + "sys-ver": "12", + "trusted-id": "", + "phone-level": "H", + "imei": "", + "wlb-uid": "aa7de295aad621a6", + "session-id": sessionId + }; + let jsonStr = JSON.stringify(data); + let base64Str = base64Encode(jsonStr).replace(/[\r\n\s]/g, ''); + let qmParams = ''; + for (let c of base64Str) qmParams += aggConfig.charMap[c] || c; + let paramsStr = `AUTHORIZATION=app-version=10001application-id=com.duoduo.readchannel=unknownis-white=net-env=5platform=androidqm-params=${qmParams}reg=${aggConfig.keys}`; + let sign = await md5(paramsStr); + log(0, '七猫', `qmParams生成成功`); + return { qmParams, sign }; +} + +async function getQiMaoHeaders() { + let { qmParams, sign } = await getQmParamsAndSign(); + return { + 'net-env': '5', 'reg': '', 'channel': 'unknown', 'is-white': '', + 'platform': 'android', 'application-id': 'com.duoduo.read', 'AUTHORIZATION': '', + 'app-version': '10001', 'user-agent': 'okhttp/4.10.0', + 'qm-params': qmParams, 'sign': sign, 'Content-Type': 'application/json' + }; +} + +// ==================== 缓存管理 ==================== +const loginCache = new Map(); +const LOGIN_CACHE_TTL = 24 * 60 * 60 * 1000; + +function generateDeviceId() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + let r = Math.random() * 16 | 0; + let v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +} + +function getSearchCache(key) { + const cached = searchCache.get(key); + if (cached && Date.now() - cached.time < CACHE_TTL) { + log(0, '缓存', `命中: ${key}`); + return cached.data; + } + return null; +} + +function setSearchCache(key, data) { + searchCache.set(key, { data, time: Date.now() }); +} + +// ==================== 初始化 ==================== +async function init(cfg) { + const start = Date.now(); + log(1, '初始化', `========== ${siteName} ==========`); + + // 星芽登录 + try { + const response = await request(rule.星芽.login, { + method: 'POST', + headers: { 'User-Agent': 'okhttp/4.10.0', 'platform': '1', 'Content-Type': 'application/json' }, + data: { device: '24250683a3bdb3f118dff25ba4b1cba1a' } + }); + const res = JSON.parse(response || '{}'); + const token = res?.data?.token || res?.token || res?.access_token; + xingya_headers = token ? { ...aggConfig.headers.json, authorization: token } : aggConfig.headers.json; + log(token ? 1 : 2, '星芽', token ? `登录成功` : `登录失败`); + } catch (e) { + xingya_headers = aggConfig.headers.json; + log(2, '星芽', `异常: ${e.message}`); + } + + // 牛牛初始化 + const nnDeviceId = generateDeviceId(); + log(0, '牛牛', `设备ID: ${nnDeviceId}`); + + try { + let tkhtml = await request(rule.牛牛.host + rule.牛牛.visitor, { + method: 'GET', + headers: { "deviceid": nnDeviceId, "token": "", "User-Agent": "okhttp/4.12.0", "client": "app", "devicetype": "Android", "Content-Type": "application/json" } + }); + let tkRes = JSON.parse(tkhtml || '{}'); + niuniu_token = tkRes.data?.token || ''; + log(niuniu_token ? 1 : 2, '牛牛', niuniu_token ? `访客token成功` : `访客token失败`); + niuniu_headers = { ...aggConfig.headers.niuniu, "token": niuniu_token, "deviceid": nnDeviceId }; + } catch (e) { + log(2, '牛牛', `访客token异常: ${e.message}`); + niuniu_headers = { ...aggConfig.headers.niuniu, "deviceid": nnDeviceId }; + } + + // 牛牛广告解锁 + try { + let t = String(Math.floor(Date.now() / 1000)); + let body = `ac=wifi&os=Android&vod_version=1.10.21.6-tob&os_version=9&type=1&clientVersion=v5.2.5&uuid=Y4WNZ3SAWK7MAJMH7CXCDHJ4VMPVFRZQTBSIA4XTYO4AWEUHIK6Q01&resolution=1280*2618&openudid=889edced38f1069b&dt=Pixel%204&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&os_api=28&install_id=1549688030634536&device_brand=google&sdk_version=1.1.3.0&package_name=com.niuniu.ztdh.app&siteid=5627189&dev_log_aid=667431&oaid=×tamp=${t}`; + let nonce = "VX1KKGtoBDCi1fB1"; + let signature = hmacSHA256(t + nonce + body, 'aceaa47f96b4875d446b2e1d97e03bbb'); + let encbdoy = aesEncryptECB(body, 'dafdb3d2a5c343d6'); + let response = await request(rule.牛牛.login, { + method: "POST", + headers: { 'X-Salt': '786774955F', 'X-Nonce': nonce, 'X-Timestamp': t, 'X-Signature': signature, 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/4.10.0' }, + data: encbdoy + }); + if (response) { + let logindata = aesDecryptECB(response, 'dafdb3d2a5c343d6'); + let accesstoken = JSON.parse(logindata || '{}'); + niuniu_access_token = accesstoken.data?.access_token || ''; + log(niuniu_access_token ? 1 : 2, '牛牛', niuniu_access_token ? `广告token成功` : `广告token失败`); + } + } catch (e) { + log(2, '牛牛', `广告解锁异常: ${e.message}`); + } + + // 河马初始化 + hema_headers = { ...aggConfig.headers.hema, 'User-Agent': 'okhttp/4.10.0' }; + log(1, '河马', `初始化成功`); + + logTime(start, 'init'); + return true; +} + +// ==================== 首页分类 ==================== +function home(filter) { + const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name))); + const classes = platForms.map(item => ({ + type_name: item.name, + type_id: item.id, + type_flag: '[CFS][SUBSITE2][FILTERBAR]' + })); + + const filters = {}; + platForms.forEach(item => { + if (filterOptions[item.id]) filters[item.id] = filterOptions[item.id]; + }); + + log(0, '首页', `分类数: ${classes.length}`); + return JSON.stringify({ class: classes, filters: filters }); +} + +// ==================== 首页推荐 ==================== +async function homeVod() { + const start = Date.now(); + const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name))); + const randomPlat = platForms[Math.floor(Math.random() * platForms.length)]; + const randomArea = ruleFilterDef[randomPlat.id]?.area || ''; + const categoryResult = await category(randomPlat.id, 1, { area: randomArea }, {}); + const categoryList = JSON.parse(categoryResult).list || []; + log(1, '首页推荐', `返回 ${categoryList.length} 条`); + logTime(start, 'homeVod'); + return JSON.stringify({ list: categoryList }); +} + +// ==================== 分类列表 ==================== +async function category(tid, pg, filter, extend) { + const start = Date.now(); + const page = pg || 1; + const area = filter?.area || extend?.area || ruleFilterDef[tid]?.area || ''; + const videos = []; + const platRule = rule[tid]; + + log(0, '分类', `${tid} page=${page} area=${area}`); + + switch (tid) { + case '七猫': { + let params = { operation: 1, playlet_privacy: 1 }; + if (area && area !== '0' && area !== '') params.tag_id = area; + if (page > 1) params.next_id = page; + + const keys = Object.keys(params).sort(); + let signStr = keys.map(k => `${k}=${params[k]}`).join('') + aggConfig.keys; + params.sign = await md5(signStr); + + const url = `${platRule.host}${platRule.list}?${buildUrlQuery(params)}`; + const headers = await getQiMaoHeaders(); + const response = await request(url, { method: 'GET', headers }); + + if (response) { + const res = JSON.parse(response); + const items = res.data?.list || []; + log(0, '七猫', `获取 ${items.length} 条`); + items.forEach(item => { + videos.push({ + vod_id: `七猫@${encodeURIComponent(item.playlet_id)}`, + vod_name: item.title || '', + vod_pic: item.image_link || '', + vod_remarks: `七猫短剧 | ${item.total_episode_num || 0}集`, + vod_content: item.tags || '' + }); + }); + } + break; + } + case '百度': { + let sub = ["新剧", "限时免费", "精选", "独播"].includes(area) ? area : "新剧"; + let tcsub = area === "全部" || area === "全部题材" ? "" : area; + let t = Math.floor(Date.now() / 1000); + let version = await md5(t + "v2"); + + const postData = { + 'data': JSON.stringify({ + "data": { + "extRequest": { "flow_tabid": "13" }, + "from": "feed", + "page": "channel_video_landing", + "pd": "feed", + "refreshIndex": parseInt(page), + "cursor": "", + "theme": "", + "timestamp": t, + "version": version, + "themes": [ + { "kind": "综合", "names": [sub] }, + { "kind": "题材", "names": [tcsub] } + ] + } + }) + }; + + let html = await request(`${platRule.host}${platRule.list}`, { + method: 'POST', + headers: aggConfig.headers.baidu, + data: postData + }); + let res = JSON.parse(html); + let items = res.data?.items || []; + log(0, '百度', `获取 ${items.length} 条`); + items.slice(0, 20).forEach(it => { + videos.push({ + vod_id: `百度@${it.collId}`, + vod_name: it.title || '未知短剧', + vod_pic: it.img || '', + vod_remarks: '百度短剧 | ' + (it.updateStatus || "更新中"), + vod_content: it.description || '' + }); + }); + break; + } + case '星芽': { + const url = `${platRule.host}${platRule.list}=${area}&type=1&class2_ids=0&page_num=${page}&page_size=24`; + const response = await request(url, { headers: xingya_headers }); + const res = JSON.parse(response); + const items = res.data?.list || []; + log(0, '星芽', `获取 ${items.length} 条`); + items.forEach(it => { + videos.push({ + vod_id: `星芽@${it.theater.id}`, + vod_name: it.theater.title || '', + vod_pic: it.theater.cover_url || '', + vod_remarks: '星芽短剧 | ' + (it.theater.total ? `${it.theater.total}集` : ''), + vod_content: `播放量:${it.theater.play_amount_str || 0}` + }); + }); + break; + } + case '西饭': { + const [typeId, typeName] = area.split('@'); + const ts = Math.floor(Date.now() / 1000); + const url = `${platRule.host}${platRule.list}?reqType=aggregationPage&offset=${(page - 1) * 30}&categoryId=${typeId}&quickEngineVersion=-1&scene=&categoryNames=${encodeURIComponent(typeName)}&categoryVersion=1&density=1.5&pageID=page_theater&version=2001001&androidVersionCode=28&requestId=${ts}aa498144140ef297&appId=drama&teenMode=false&userBaseMode=false&${XIFAN_SESSION_PARAMS}`; + + const response = await request(url, { headers: aggConfig.headers.form }); + const res = JSON.parse(response); + let count = 0; + (res.result?.elements || []).forEach(soup => { + (soup.contents || []).forEach(vod => { + const dj = vod.duanjuVo || {}; + videos.push({ + vod_id: `西饭@${dj.duanjuId}#${dj.source}`, + vod_name: dj.title || '', + vod_pic: dj.coverImageUrl || '', + vod_remarks: '西饭短剧 | ' + (dj.total ? `${dj.total}集` : ''), + vod_content: dj.desc || '' + }); + count++; + }); + }); + log(0, '西饭', `获取 ${count} 条`); + break; + } + case '牛牛': { + let condition = { "typeId": "S1" }; + if (area && area !== '全部' && area !== '') condition.classify = area; + + const postData = { "condition": condition, "pageNum": page, "pageSize": 24 }; + const response = await request(`${platRule.host}${platRule.list}`, { + method: 'POST', + headers: niuniu_headers, + data: postData + }); + const res = JSON.parse(response); + const items = res.data?.records || []; + log(0, '牛牛', `获取 ${items.length} 条`); + items.forEach(item => { + videos.push({ + vod_id: `牛牛@${item.id}`, + vod_name: item.name || '', + vod_pic: item.cover || '', + vod_remarks: '牛牛短剧 | ' + (item.totalEpisode ? `${item.totalEpisode}集` : ''), + vod_content: item.description || '' + }); + }); + break; + } + case '围观': { + const postData = { "audience": "全部受众", "page": page, "pageSize": 30, "searchWord": "", "subject": "全部主题" }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: aggConfig.headers.json, + data: postData + }); + const res = JSON.parse(response); + const items = (res.code === 200 && res.data) ? res.data : []; + log(0, '围观', `获取 ${items.length} 条`); + items.forEach(it => { + videos.push({ + vod_id: `围观@${it.oneId}`, + vod_name: it.title || '未知短剧', + vod_pic: it.vertPoster || it.horizonPoster || '', + vod_remarks: '围观短剧 | ' + `集数:${it.episodeCount || 0}`, + vod_content: it.description || '' + }); + }); + break; + } + case '河马': { + try { + const sub = area || '308'; + const tagIds = hemaTagIds[sub] || ''; + const bodys = JSON.stringify({ + "recSwitch": true, "channelId": sub, "tagIds": tagIds, + "cnxhFlag": page - 1, "playListFlag": true, + "watchRecords": ["41000103722_572752006"] + }); + const body = hemaEncrypt(bodys); + const response = await request(`${platRule.host}${platRule.list}`, { + method: 'POST', + headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, + data: body + }); + const res = JSON.parse(response); + const dehtml = res.data; + if (dehtml) { + const hmdata = hemaDecrypt(dehtml); + if (hmdata && hmdata !== '{}') { + const hmlist = JSON.parse(hmdata).columnData || []; + hmlist.forEach(videoDataArray => { + (videoDataArray.videoData || []).forEach(video => { + videos.push({ + vod_id: `河马@${video.bookId}`, + vod_name: video.bookName || '', + vod_pic: video.coverWap || video.coverCutWap, + vod_remarks: `河马短剧 | 更新${video.updateNum || 0}集`, + vod_content: video.introduction || '' + }); + }); + }); + } + } + } catch (e) { + log(2, '河马', e.message); + } + break; + } + case '星星': { + const postData = { + "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0", + "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb", + "channel": "oppo19", "osType": "android", "version": "20", + "token": "202509271001001446030204698626", "resourceId": area, + "pageNum": String(page), "pageSize": "20" + }; + const response = await request(`${platRule.host}${platRule.list}`, { + method: 'GET', headers: aggConfig.headers.form, data: postData + }); + try { + const res = JSON.parse(response); + const items = res.data?.datalist || []; + log(0, '星星', `获取 ${items.length} 条`); + items.forEach(vod => { + videos.push({ + vod_id: `星星@${vod.id}@${encodeURIComponent(vod.introduction || '')}`, + vod_name: vod.name || '', + vod_pic: vod.icon || '', + vod_remarks: `星星短剧 | ${vod.heat || 0}万播放`, + vod_content: vod.introduction || '' + }); + }); + } catch (e) { + log(2, '星星', e.message); + } + break; + } + case '好看': { + const postData = { "tag_id": area, "rn": "20", "pn": page }; + const response = await request(`${platRule.host}${platRule.list}`, { + method: 'POST', headers: aggConfig.headers.haokan, data: postData + }); + try { + const res = JSON.parse(response); + const items = res.data?.list || []; + log(0, '好看', `获取 ${items.length} 条`); + items.forEach(item => { + videos.push({ + vod_id: `好看@${item.playlet_id}`, + vod_name: item.playlet_title || '', + vod_pic: item.playlet_poster || '', + vod_remarks: `好看短剧 | ${item.episodes_num_text || ''}`, + vod_content: item.tags ? item.tags.join('·') : '' + }); + }); + } catch (e) { + log(2, '好看', e.message); + } + break; + } + } + + log(1, '分类', `${tid} 返回 ${videos.length} 条`); + logTime(start, 'category'); + return JSON.stringify({ list: videos, page, pagecount: page + 1, limit: videos.length, total: videos.length * (page + 1) }); +} + +// ==================== 详情 ==================== +async function detail(id) { + const parts = id.split('@'); + const platform = parts[0]; + const did = parts.slice(1).join('@'); + const platRule = rule[platform]; + let vod = {}; + + log(0, '详情', `${platform} ${did.substring(0, 50)}`); + + switch (platform) { + case '七猫': { + const didDecoded = decodeURIComponent(did); + const sign = await md5(`playlet_id=${didDecoded}${aggConfig.keys}`); + const url = `${platRule.detail}?playlet_id=${didDecoded}&sign=${sign}`; + const headers = await getQiMaoHeaders(); + const response = await request(url, { method: 'GET', headers }); + const data = JSON.parse(response || '{}').data || {}; + vod = { + vod_id: id, vod_name: data.title || '未知标题', + vod_pic: data.image_link || '', vod_remarks: `${data.tags || ''} ${data.total_episode_num || 0}集`, + vod_content: data.intro || '未知剧情', vod_play_from: '七猫短剧', + vod_play_url: (data.play_list || []).map(it => `${it.sort}$${it.video_url}`).join('#') + }; + break; + } + case '百度': { + const postData = { "playlet_id": did, "vid": "undefined" }; + let html = await request(`${platRule.detailHost}${platRule.detail}`, { + method: 'POST', headers: aggConfig.headers.baidu, data: postData + }); + let res = JSON.parse(html); + let dthtml = res.data || {}; + let vids = dthtml.vid_list || []; + let playArr = vids.map((vid, index) => `第${index + 1}集$${did}@${vid}`); + vod = { + vod_id: id, vod_name: dthtml.playlet_title || '未知短剧', + vod_pic: dthtml.playlet_poster || '', + vod_content: `热度值:${dthtml.hot_value || 0}\n题材:${dthtml.tag_text || ''}\n集数:${dthtml.episodes_num || 0}\n简介:${dthtml.description || ''}`, + vod_remarks: `共${vids.length || 0}集`, vod_play_from: "百度短剧", + vod_play_url: playArr.join('#') + }; + break; + } + case '星芽': { + const detailUrl = `${platRule.host}${platRule.detail}?theater_parent_id=${did}`; + const response = await request(detailUrl, { headers: xingya_headers }); + const res = JSON.parse(response); + if (res.code === 'ok' && res.data) { + const data = res.data; + const playUrls = (data.theaters || []).map(item => `第${item.num}集$${item.son_video_url}`).join('#'); + vod = { + vod_id: id, vod_name: data.title || '未知剧名', + vod_pic: data.cover_url || '', vod_remarks: data.is_over === 2 ? '连载中' : '已完结', + vod_content: data.introduction || data.desc || '', + vod_play_from: '星芽短剧', vod_play_url: playUrls || '暂无播放地址$0' + }; + } + break; + } + case '西饭': { + const [duanjuId, source] = did.split('#'); + const url = `${platRule.host}${platRule.detail}?duanjuId=${duanjuId}&source=${source}`; + const response = await request(url, { headers: aggConfig.headers.form }); + const res = JSON.parse(response); + const data = res.result || {}; + const playUrls = (data.episodeList || []).map(ep => `${ep.index}$${ep.playUrl}`).join('#'); + vod = { + vod_id: id, vod_name: data.title || '', vod_pic: data.coverImageUrl || '', + vod_content: data.desc || '未知', + vod_remarks: data.updateStatus === 'over' ? `${data.total || 0}集 已完结` : `更新${data.total || 0}集`, + vod_play_from: '西饭短剧', vod_play_url: playUrls + }; + break; + } + case '牛牛': { + const descData = await request(`${platRule.host}${platRule.desc}`, { + method: 'POST', headers: niuniu_headers, data: { "id": did, "typeId": "S1" } + }); + const descRes = JSON.parse(descData); + const descInfo = descRes.data || {}; + const listData = await request(`${platRule.host}${platRule.detail}`, { + method: 'POST', headers: niuniu_headers, data: { "id": did, "source": 0, "typeId": "S1", "userId": "546932" } + }); + const listRes = JSON.parse(listData); + const listInfo = listRes.data || {}; + + let playUrls = ''; + if (listInfo.url && listInfo.episodeList && listInfo.episodeList.length > 0) { + playUrls = (listInfo.episodeList || []).map(ep => `${ep.episode}$${did}+${ep.id}`).join('#'); + } else if (listInfo.thirdPlayId) { + let thirdPlayId = listInfo.thirdPlayId; + let data1 = "not_include=0&lock_free=1&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&dt=22021211RC&os_api=31&install_id=1496879012031075&sdk_version=1.1.3.0&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498494&direction=0&ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&count=1&index=1&shortplay_id=" + thirdPlayId + "&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&device_brand=Redmi&package_name=com.niuniu.ztdh.app"; + try { + let html1 = await niuniuPost(rule.牛牛.detail2, data1, "1"); + if (html1 && html1.data && html1.data.episode_right_list) { + playUrls = html1.data.episode_right_list.map(it => { + let lockType = it.lock_type || 'free'; + return `第${it.index}集$${it.index}+${lockType}+${thirdPlayId}`; + }).join('#'); + } + } catch (e) { log(2, '牛牛详情', e.message); } + } + vod = { + vod_id: id, vod_name: descInfo.name || listInfo.name || '未知名称', + vod_pic: descInfo.cover || listInfo.cover || '', + vod_content: `类型:${descInfo.classify || ''}\n评分:${descInfo.score || ''}\n简介:${descInfo.introduce || ''}`, + vod_remarks: `共${descInfo.totalEpisode || listInfo.totalEpisode || 0}集`, + vod_play_from: '牛牛短剧', vod_play_url: playUrls || '暂无播放地址$0' + }; + break; + } + case '围观': { + const response = await request(`${platRule.host}${platRule.detail}&oneId=${did}&page=1&pageSize=1000`, { + headers: aggConfig.headers.form + }); + const res = JSON.parse(response); + if (res.code === 200 && res.data) { + const data = res.data || []; + const firstEpisode = data[0] || {}; + vod = { + vod_id: id, vod_name: firstEpisode.title || '', + vod_pic: firstEpisode.vertPoster || firstEpisode.horizonPoster || '', + vod_remarks: `共${data.length || 0}集`, + vod_content: `播放量:${firstEpisode.viewCount || 0} 收藏:${firstEpisode.collectionCount || 0} 评论:${firstEpisode.commentCount || 0}`, + vod_play_from: '围观短剧', + vod_play_url: data.map(ep => { + let playSetting = ep.playSetting || ep.videoClarityList || []; + try { if (typeof playSetting === 'string') playSetting = JSON.parse(playSetting); } catch (e) { } + const url = (playSetting.find(item => item.name === '1080P')?.url || playSetting.find(item => item.name === '720P')?.url || ''); + return `第${ep.playOrder || 1}集$${url}`; + }).filter(ep => ep.split('$')[1]).join('#') + }; + } + break; + } + case '河马': { + const bookId = did; + const body = hemaEncrypt(JSON.stringify({ "bookId": bookId })); + const detailResponse = await request(`${platRule.host}${platRule.detail}`, { + method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: body + }); + const detailRes = JSON.parse(detailResponse); + const detailHtml = detailRes.data; + const postdata = hemaDecrypt(detailHtml); + const videoInfo = JSON.parse(postdata).videoInfo || {}; + + const episodeBody = hemaEncrypt(JSON.stringify({ "bookId": bookId, "chapterMin": videoInfo.updateNum || 0, "chapterMax": videoInfo.chapterIndex || 0 })); + const episodeResponse = await request(`${platRule.host}${platRule.episode}`, { + method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: episodeBody + }); + const episodeRes = JSON.parse(episodeResponse); + const episodeHtml = episodeRes.data; + const playdata = hemaDecrypt(episodeHtml); + const chapterList = JSON.parse(playdata).chapterList || []; + + const playUrls = chapterList.map(item => `${item.chapterName}$${item.chapterId}++${item.chapterIndex}++${bookId}`).join('#'); + vod = { + vod_id: id, vod_name: videoInfo.bookName || '未知剧名', + vod_pic: videoInfo.coverWap, vod_remarks: videoInfo.finishStatusCn || `更新至${videoInfo.updateNum || 0}集`, + vod_content: videoInfo.introduction || '暂无简介', + vod_play_from: '河马短剧', vod_play_url: playUrls || '暂无播放地址$0' + }; + break; + } + case '星星': { + const partsArr = did.split('@'); + const bookId = partsArr[0]; + const contentDesc = decodeURIComponent(partsArr[1] || ''); + const postData = { + "bookId": bookId, "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0", + "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb", "channel": "oppo19", + "osType": "android", "version": "20", "token": "202509271001001446030204698626" + }; + const response = await request(`${platRule.host}${platRule.detail}`, { + method: 'GET', headers: aggConfig.headers.form, data: postData + }); + try { + const res = JSON.parse(response); + const data = res.data || []; + const playUrls = data.map((vodItem, index) => { + const playUrl = vodItem.shortPlayList?.[0]?.chapterShortPlayVoList?.[0]?.shortPlayUrl || ''; + return playUrl ? `第${index + 1}集$${playUrl}` : null; + }).filter(Boolean).join('#'); + vod = { vod_id: id, vod_name: '星星短剧', vod_content: contentDesc, vod_play_from: '星星短剧', vod_play_url: playUrls || '暂无播放地址$0' }; + } catch (e) { log(2, '星星详情', e.message); } + break; + } + case '好看': { + const commonlistId = Date.now().toString().substring(0, 13); + const innerParams = `enable_enter_playlet=0&seek_time=0&hotspot=0&auto_show_hot_point_panel=0&type=playlet&commonlist_id=${commonlistId}&scene=&vid=&enable_atlas=0&mark_pn=&uk=&ctime=0&from=playlet_new&id=${did}&rn=10&pn=1&direction=3`; + const listResponse = await request(`${platRule.host}${platRule.detail_list}`, { + method: 'POST', headers: aggConfig.headers.haokan, data: { "video/commonlist": innerParams } + }); + try { + const resObj = JSON.parse(listResponse); + const firstVideo = resObj['video/commonlist']?.data?.results?.[0]; + const vid = firstVideo?.content?.vid; + const detailResponse = await request(`${platRule.host}${platRule.detail}`, { + method: 'POST', headers: aggConfig.headers.haokan, data: { "vid": vid, "playlet_id": did } + }); + const detailDataObj = JSON.parse(detailResponse).data || {}; + let vidList = detailDataObj.vid_list || []; + if (vidList.length === 0 && detailDataObj.results) vidList = detailDataObj.results.map(item => item.vid); + const playList = vidList.map((v, i) => `第${i + 1}集$${did}@${v}`).join('#'); + vod = { + vod_id: id, vod_name: detailDataObj.playlet_title || '', vod_pic: detailDataObj.playlet_poster || '', + vod_remarks: (detailDataObj.hot_value || '') + '播放·' + (detailDataObj.episodes_num || '') + '集', + vod_content: detailDataObj.description || '', vod_play_from: '好看短剧', vod_play_url: playList + }; + } catch (e) { log(2, '好看详情', e.message); } + break; + } + } + + return JSON.stringify({ list: [vod] }); +} + +// ==================== 搜索 ==================== +// ==================== 搜索 ==================== +async function cfs(siteId, wd, pg) { + const start = Date.now(); + const page = pg || 1; + const searchLimit = aggConfig.searchLimit; + const searchTimeout = aggConfig.searchTimeout; + let results = []; + + const cacheKey = `${siteId}_${wd}_${page}`; + const cachedResult = getSearchCache(cacheKey); + if (cachedResult) { + return cachedResult; + } + + log(0, '搜索', `${siteId} 关键词: ${wd}, 页码: ${page}`); + + const platformItem = platformList.find(p => p.id === siteId); + if (platformItem && cate_remove.some(word => new RegExp(word, 'i').test(platformItem.name))) { + log(2, '搜索', `跳过平台: ${siteId}`); + return JSON.stringify({ list: [], page, pagecount: page + 1, limit: 0, total: 0 }); + } + + const platRule = rule[siteId]; + + switch (siteId) { + case '百度': { + const requestUrl = `${platRule.host}${platRule.search}`; + const postData = { + "data": { + "query": wd, + "page": page, + "attribute": ["title"], + "fe_page_type": "search", + "extra": { + "tab_id": "216", + "flow_tabid": "13", + "shortplay_source": "feed", + "from": "feed", + "tab_type": "搜索", + "sub_template": "playlet_search_result" + } + } + }; + + let html = await request(requestUrl, { + method: 'POST', + headers: aggConfig.headers.baidu, + data: postData, + timeout: searchTimeout + }); + + let res = JSON.parse(html); + let items = res.data?.itemList || res.data?.data?.itemList || res.itemList || res.data?.list || res.list || []; + log(0, '百度搜索', `获取到 ${items.length} 条`); + results = items.map(it => ({ + vod_id: `百度@${it.nid?.split("_")[1] || it.collId || ''}`, + vod_name: it.title || '未知短剧', + vod_pic: it.img || '', + vod_remarks: '百度短剧 | ' + (it.collNum || it.updateStatus || "搜索短剧"), + vod_content: it.description || '' + })); + break; + } + + case '七猫': { + try { + const trackId = 'ec1280db127955061754851657967'; + let signString = `extend=page=${page}read_preference=0track_id=${trackId}wd=${wd}${aggConfig.keys}`; + let sign = await md5(signString); + const encodedKey = encodeURIComponent(wd); + const url = `${platRule.host}${platRule.search}?extend=&page=${page}&wd=${encodedKey}&read_preference=0&track_id=${trackId}&sign=${sign}`; + const headers = await getQiMaoHeaders(); + const response = await request(url, { method: 'GET', headers, timeout: searchTimeout }); + const res = JSON.parse(response || '{}'); + let items = res.data?.list || res.list || []; + log(0, '七猫搜索', `获取到 ${items.length} 条`); + results = items.map(item => ({ + vod_id: `七猫@${encodeURIComponent(item.playlet_id || item.id || '')}`, + vod_name: item.title || '未知标题', + vod_pic: item.image_link || item.cover || '', + vod_remarks: '七猫短剧 | ' + (item.tags || '') + ' ' + (item.total_episode_num ? `${item.total_episode_num}集` : ''), + vod_content: item.intro || '' + })); + } catch (e) { + log(2, '七猫搜索', e.message); + } + break; + } + + case '星芽': { + const postData = { "text": wd }; + const requestUrl = `${platRule.host}${platRule.search}`; + const response = await request(requestUrl, { + method: 'POST', + headers: xingya_headers, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = res.data?.theater?.search_data || []; + log(0, '星芽搜索', `获取到 ${items.length} 条`); + results = items.map(item => ({ + vod_id: `星芽@${item.id}`, + vod_name: item.title || '', + vod_pic: item.cover_url || '', + vod_remarks: '星芽短剧 | ' + (item.total ? `${item.total}集` : ''), + vod_content: item.introduction || '' + })); + break; + } + + case '西饭': { + const ts = Math.floor(Date.now() / 1000); + const url = `${platRule.host}${platRule.search}?keyword=${encodeURIComponent(wd)}&pageIndex=${page}&version=2001001&androidVersionCode=28&requestId=${ts}ea3a14bc0317d76f&appId=drama&teenMode=false&userBaseMode=false&${XIFAN_SESSION_PARAMS}`; + const response = await request(url, { headers: aggConfig.headers.form, timeout: searchTimeout }); + const res = JSON.parse(response || '{}'); + let items = []; + if (res.result?.elements) { + res.result.elements.forEach(soup => { + if (soup.contents) { + soup.contents.forEach(vod => { + const dj = vod.duanjuVo || {}; + items.push({ + vod_id: `西饭@${dj.duanjuId || ''}#${dj.source || ''}`, + vod_name: dj.title || '未知标题', + vod_pic: dj.coverImageUrl || '', + vod_remarks: '西饭短剧 | ' + (dj.total ? `${dj.total}集` : ''), + vod_content: '' + }); + }); + } + }); + } + log(0, '西饭搜索', `获取到 ${items.length} 条`); + results = items; + break; + } + + case '牛牛': { + const postData = { + "condition": { "typeId": "S1", "value": wd }, + "pageNum": page, + "pageSize": searchLimit + }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: niuniu_headers, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = res.data?.records || []; + log(0, '牛牛搜索', `获取到 ${items.length} 条`); + results = items.map(item => ({ + vod_id: `牛牛@${item.id}`, + vod_name: item.name || '', + vod_pic: item.cover || '', + vod_remarks: '牛牛短剧 | ' + (item.totalEpisode ? `${item.totalEpisode}集` : ''), + vod_content: '' + })); + break; + } + + case '围观': { + const postData = { + "audience": "", + "page": page, + "pageSize": 30, + "searchWord": wd, + "subject": "" + }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: aggConfig.headers.json, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = (res.code === 200 && res.data) ? res.data : []; + log(0, '围观搜索', `获取到 ${items.length} 条`); + results = items.map(it => ({ + vod_id: `围观@${it.oneId || ''}`, + vod_name: it.title || '未知标题', + vod_pic: it.vertPoster || it.horizonPoster || '', + vod_remarks: '围观短剧 | 集数:' + (it.episodeCount || 0), + vod_content: it.description || '' + })); + break; + } + + case '河马': { + try { + const hmbody = JSON.stringify({ + "keyword": wd, + "page": page, + "size": searchLimit + }); + const encryptedBody = hemaEncrypt(hmbody); + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: hema_headers, + data: encryptedBody, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const xmres = res.data; + if (xmres) { + const dexmres = hemaDecrypt(xmres); + if (dexmres && dexmres !== '{}') { + const xmlist = JSON.parse(dexmres).searchVos || []; + log(0, '河马搜索', `获取到 ${xmlist.length} 条`); + results = xmlist.map(video => ({ + vod_id: `河马@${video.bookId}`, + vod_name: video.bookName || '', + vod_pic: (video.coverWap || '') + '@Referer=', + vod_remarks: `河马短剧 | 共${video.updateNum || 0}集`, + vod_content: video.introduction || '' + })); + } + } + } catch (e) { + log(2, '河马搜索', e.message); + } + break; + } + + case '星星': { + try { + const postData = { + "productId": "2a8c14d1-72e7-498b-af23-381028eb47c0", + "vestId": "2be070e0-c824-4d0e-a67a-8f688890cadb", + "channel": "oppo19", + "osType": "android", + "version": "20", + "token": "202509271001001446030204698626", + "keyWord": wd, + "pageNum": String(page), + "pageSize": String(searchLimit) + }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'GET', + headers: aggConfig.headers.json, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = res.data?.datalist || []; + log(0, '星星搜索', `获取到 ${items.length} 条`); + results = items.map(vod => ({ + vod_id: `星星@${vod.id}@${encodeURIComponent(vod.introduction || '')}`, + vod_name: vod.name || '', + vod_pic: vod.icon || '', + vod_remarks: `星星短剧 | ${vod.heat || 0}万播放`, + vod_content: vod.introduction || '' + })); + } catch (e) { + log(2, '星星搜索', e.message); + } + break; + } + + case '好看': { + try { + const postData = { "search_word": wd }; + const response = await request(`${platRule.host}${platRule.search}`, { + method: 'POST', + headers: aggConfig.headers.haokan, + data: postData, + timeout: searchTimeout + }); + const res = JSON.parse(response || '{}'); + const items = res.data || []; + log(0, '好看搜索', `获取到 ${items.length} 条`); + results = items.map(item => ({ + vod_id: `好看@${item.id}`, + vod_name: item.title || '', + vod_pic: item.cover_url || '', + vod_remarks: '好看短剧 | ' + (item.tag ? item.tag.replace(/\//g, '·') : ''), + vod_content: '' + })); + } catch (e) { + log(2, '好看搜索', e.message); + } + break; + } + } + + // 关键词过滤 + const keywordRegex = new RegExp(wd, "i"); + let filteredResults = []; + for (let item of results) { + if (item.vod_name && keywordRegex.test(item.vod_name)) { + filteredResults.push(item); + } + } + + log(0, `${siteId}搜索`, `原始 ${results.length} 条,匹配后 ${filteredResults.length} 条`); + logTime(start, 'cfs'); + + const resultJson = JSON.stringify({ + list: filteredResults, + page: page, + pagecount: page + 1, + limit: filteredResults.length, + total: filteredResults.length * (page + 1) + }); + + setSearchCache(cacheKey, resultJson); + return resultJson; +} + +// ==================== 全局搜索 ==================== +async function search(wd, quick, pg) { + const start = Date.now(); + const videos = []; + const page = pg || 1; + + log(1, '全局搜索', `关键词: ${wd}, 页码: ${page}`); + + const platForms = platformList.filter(item => !cate_remove.some(word => new RegExp(word, 'i').test(item.name))); + log(0, '全局搜索', `共 ${platForms.length} 个平台待搜索`); + + const searchPromises = platForms.map(async (platform) => { + try { + const result = await cfs(platform.id, wd, page); + return JSON.parse(result).list || []; + } catch (e) { + log(2, '全局搜索', `${platform.id} 异常: ${e.message}`); + return []; + } + }); + + const searchResults = await Promise.all(searchPromises); + + let totalResults = 0; + const hasResultPlats = []; + const noResultPlats = []; + + searchResults.forEach((list, idx) => { + const platform = platForms[idx]; + const count = list.length; + totalResults += count; + if (count > 0) { + hasResultPlats.push(`${platform.name}(${count}条)`); + } else { + noResultPlats.push(platform.name); + } + videos.push(...list); + }); + + if (hasResultPlats.length > 0) { + log(1, '搜索结果', `有结果: ${hasResultPlats.join(', ')}`); + } else { + log(2, '搜索结果', `无结果`); + } + + if (noResultPlats.length > 0) { + log(2, '搜索结果', `无结果平台: ${noResultPlats.join(', ')}`); + } + + log(1, '搜索结果汇总', `共 ${totalResults} 条`); + + // 关键词过滤 + const keywordRegex = new RegExp(wd, "i"); + let filteredResults = []; + for (let item of videos) { + if (item.vod_name && keywordRegex.test(item.vod_name)) { + filteredResults.push(item); + } + } + + log(1, '全局搜索', `原始 ${videos.length} 条,过滤后 ${filteredResults.length} 条`); + logTime(start, 'search'); + + return JSON.stringify({ + list: filteredResults, + page: page, + pagecount: page + 1, + limit: filteredResults.length, + total: filteredResults.length * (page + 1) + }); +} +// ==================== 播放 ==================== +async function play(flag, id, flags) { + log(0, '播放', `${flag} ${id.substring(0, 50)}`); + + if (/好看|百度/.test(flag)) { + let parts = id.split('@'); + let playletId = parts[0]; + let vid = parts[1]; + + if (/好看/.test(flag)) { + const innerParams = `method=post&vid=${vid}&immersive_mode=v4_5&tplname=feed_small_video&tag=playlet_talos&tab=detail&external_from=&is_dp_video=0&immersive_square_type=3&video_set_id=${playletId}&play_screen_type=1&play_volume_type=2&play_external_device_type=1`; + const response = await request(`${rule.好看.host}${rule.好看.play}`, { + method: 'POST', headers: aggConfig.headers.haokan, data: { "video/relate": innerParams } + }); + try { + const videoData = JSON.parse(response)['video/relate']?.data?.cur_video || {}; + const urlMap = {}; + if (videoData.clarityUrl) videoData.clarityUrl.forEach(c => { if (c.title && c.url) urlMap[c.title] = c.url; }); + if (videoData.video_list) Object.entries(videoData.video_list).forEach(([k, v]) => { if (!urlMap[k]) urlMap[k] = v; }); + const sortedQualities = Object.keys(urlMap).sort((a, b) => { + const order = { '4k': 0, '2k': 1, '高清': 2, '蓝光': 3, '超清': 4, '标清': 5 }; + return (order[a] ?? 999) - (order[b] ?? 999); + }); + const playUrls = []; + sortedQualities.forEach(q => playUrls.push(q, urlMap[q])); + if (playUrls.length > 0) return JSON.stringify({ parse: 0, url: playUrls }); + } catch (e) { } + return JSON.stringify({ parse: 0, url: id }); + } + + if (/百度/.test(flag)) { + const response = await request(`${rule.百度.detailHost}${rule.百度.play}`, { + method: 'POST', headers: aggConfig.headers.baidu, data: { "method": "post", "vid": vid } + }); + let json = JSON.parse(response)["video/relate"]?.data?.cur_video; + if (!json?.clarityUrl) return JSON.stringify({ parse: 0, url: id }); + let urls = json.clarityUrl.filter(item => item.url && item.title).map(item => ({ title: item.title, url: item.url, order: { '蓝光': 1, '超清': 2, '标清': 3 }[item.title] || 999 })).sort((a, b) => a.order - b.order).flatMap(item => [item.title, item.url]); + return JSON.stringify({ parse: urls.length > 0 ? 0 : 1, url: urls.length > 0 ? urls : id }); + } + } + + if (/河马/.test(flag)) { + try { + let arr = id.split("++"); + let chapterId = arr[0], bookId = arr[2]; + let fsbody = JSON.stringify({ "bookId": bookId, "chapterId": chapterId, "unClockType": "pay", "confirmPay": 2, "autoPayFlag": true, "omap": { "channelName": "精选", "logId": "17a6500357709bb2547e1e122b438cfc", "originName": "书城", "recId": "bigdata_rec", "scene": "nsc_727", "sceneId": "dzmf_video_sc_reco", "strategyId": "g6y6b5sq" } }); + let fsbodyEnc = hemaEncrypt(fsbody); + let response = await request(rule.河马.host + rule.河马.play, { + method: 'POST', headers: { ...hema_headers, 'Content-Type': 'application/x-www-form-urlencoded' }, data: fsbodyEnc + }); + let res = JSON.parse(response); + let fshtml = res.data; + if (fshtml) { + let fsdata = hemaDecrypt(fshtml); + if (fsdata && fsdata !== '{}') { + let parsed = JSON.parse(fsdata); + if (parsed.chaptersPayType == '免费') { + let url = parsed.chapterInfo?.[0]?.content?.m3u8720p || []; + if (url) return JSON.stringify({ parse: 0, url: url }); + } + } + } + let playurl = "https://api.cenguigui.cn/api/duanju/hema.php?book_id=" + bookId + "&video_id=" + chapterId + "&type=mp4"; + return JSON.stringify({ parse: 0, url: playurl + '#isVideo=true#' }); + } catch (e) { + return JSON.stringify({ parse: 0, url: id }); + } + } + + if (/牛牛/.test(flag)) { + const inputArr = id.split('+'); + if (inputArr.length === 2) { + let ep = inputArr[0].match(/\d+/)?.[0] || ""; + let videoId = inputArr[1]; + let response = await request(`${rule.牛牛.host}/api/v1/app/play/movieDetails`, { + method: 'POST', headers: niuniu_headers, data: { "id": videoId, "source": 0, "typeId": "S1", "userId": "546932", "episodeId": ep } + }); + let result = JSON.parse(response); + if (result.code == 200 && result.data?.url) return JSON.stringify({ parse: 0, url: result.data.url }); + } else if (inputArr.length === 3) { + let index = inputArr[0], lock_type = inputArr[1], thirdPlayId = inputArr[2]; + let data1 = `not_include=0&lock_free=1&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&dt=22021211RC&os_api=31&install_id=1496879012031075&sdk_version=1.1.3.0&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498494&direction=0&ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&count=1&index=1&shortplay_id=${thirdPlayId}&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&device_brand=Redmi&package_name=com.niuniu.ztdh.app`; + if (lock_type === "free") { + let frhtml = await niuniuPost(rule.牛牛.detail2, data1, index); + if (frhtml?.data?.list?.[0]) { + let url = base64Decode(frhtml.data.list[0].video_model.video_list.video_1.main_url); + return JSON.stringify({ parse: 0, url }); + } + } else { + let unlockData = `ac=mobile&os=Android&vod_version=1.10.21.6-tob&os_version=12&lock_ad=3&lock_free=3&type=1&clientVersion=v5.2.5&uuid=6IDYUSASPQY5BBVACWQW3LLTPV4V7DE26UOCX5TZTVUGX4VUJNXQ01&resolution=1080*2320&openudid=82f4175d577a2939&shortplay_id=${thirdPlayId}&dt=22021211RC&sha1=46121F77CE2FCAD3DBC3B9EC8A24908C1A8AD6D9&lock_index=21&os_api=31&install_id=1496879012031075&device_brand=Redmi&sdk_version=1.1.3.0&package_name=com.niuniu.ztdh.app&siteid=5627189&dev_log_aid=667431&oaid=abec0dfff623201b×tamp=1752498493`; + await niuniuPost(rule.牛牛.unlock, unlockData, index); + let unhtml = await niuniuPost(rule.牛牛.detail2, data1, index); + if (unhtml?.data?.list?.[0]) { + let url = base64Decode(unhtml.data.list[0].video_model.video_list.video_1.main_url); + return JSON.stringify({ parse: 0, url }); + } + } + } + return JSON.stringify({ parse: 0, url: id }); + } + + if (/围观/.test(flag)) { + try { + let playSetting = typeof id === 'string' ? JSON.parse(id) : id; + let urls = []; + if (playSetting.super) urls.push("超清", playSetting.super); + if (playSetting.high) urls.push("高清", playSetting.high); + if (playSetting.normal) urls.push("流畅", playSetting.normal); + return JSON.stringify({ parse: 0, url: urls.length ? urls : id }); + } catch (e) { + return JSON.stringify({ parse: 0, url: id }); + } + } + + return JSON.stringify({ parse: 0, url: id }); +} + +// ==================== 工具函数 ==================== +function buildUrlQuery(params) { + return Object.keys(params).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`).join('&'); +} + +async function md5(str) { + return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex).toLowerCase(); +} + +function base64Encode(text) { + return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text)); +} + +function base64Decode(text) { + return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text)); +} + +function hmacSHA256(data, key) { + return CryptoJS.HmacSHA256(data, key).toString(CryptoJS.enc.Hex); +} + +function aesEncryptECB(text, keyStr) { + let key = CryptoJS.enc.Utf8.parse(keyStr); + return CryptoJS.AES.encrypt(text, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(); +} + +function aesDecryptECB(ciphertext, keyStr) { + let key = CryptoJS.enc.Utf8.parse(keyStr); + return CryptoJS.AES.decrypt(ciphertext, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); +} + +function hemaEncrypt(plaintext) { + let key = CryptoJS.enc.Hex.parse("647a6b6a67667978677368796c677a6d"); + let iv = CryptoJS.enc.Hex.parse("6170697570646f776e65646372797074"); + let encrypted = CryptoJS.AES.encrypt(plaintext, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); + return encrypted.ciphertext.toString(CryptoJS.enc.Hex).toUpperCase(); +} + +function hemaDecrypt(word) { + let key = CryptoJS.enc.Hex.parse("647a6b6a67667978677368796c677a6d"); + let iv = CryptoJS.enc.Hex.parse("6170697570646f776e65646372797074"); + let srcs = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(word)); + let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); + return decrypt.toString(CryptoJS.enc.Utf8); +} + +async function niuniuPost(url1, data1, index) { + let t10 = String(Math.floor(Date.now() / 1000)); + let X_Nonce = "X9UknYKtLa3DmtjC"; + let body1 = data1.replace(/&lock_free=\d+/, "&lock_free=1").replace(/×tamp=\d+/, "×tamp=" + t10).replace(/&count=\d+/, "&count=1").replace(/&index=\d+/, "&index=" + index).replace(/&lock_ad=\d+/, "&lock_ad=1").replace(/&lock_index=\d+/, "&lock_index=" + index); + let body2 = aesEncryptECB(body1, 'ce49b18dd4e0a4d8'); + let signature = hmacSHA256(t10 + X_Nonce + body1, 'aceaa47f96b4875d446b2e1d97e03bbb'); + let res = await request(url1, { + method: 'POST', + headers: { 'X-Salt': 'FD8188A8D5', 'X-Nonce': X_Nonce, 'X-Timestamp': t10, 'X-Access-Token': niuniu_access_token, 'X-Signature': signature, 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/4.12.0' }, + data: body2 + }); + if (!res) return {}; + try { return JSON.parse(aesDecryptECB(res, 'ce49b18dd4e0a4d8')); } catch (e) { return {}; } +} + +async function request(url, options = {}) { + let reqHeaders = { ...aggConfig.headers.form, ...options.headers }; + let finalUrl = url; + let requestData = options.data; + let useBody = false; + + // POST + 字符串 + form类型 → 直接作为body发送(保留空格,牛牛接口需要) + if (options.method === 'POST' && typeof options.data === 'string' && reqHeaders['Content-Type']?.includes('form')) { + useBody = true; + } + + // GET请求处理 + if ((options.method === 'GET' || !options.method) && options.data && !useBody) { + let queryData = options.data; + if (typeof queryData === 'string') { + try { queryData = JSON.parse(queryData); } catch (e) { queryData = {}; } + } + finalUrl = url + (url.includes('?') ? '&' : '?') + buildUrlQuery(queryData); + requestData = null; + } + + // 确定postType(关键!告诉req如何处理data) + let postType = ''; + if (!useBody && options.data) { + let ct = reqHeaders['Content-Type'] || ''; + postType = ct.includes('json') ? 'json' : (ct.includes('form') ? 'form' : ''); + } + + try { + const res = await req(finalUrl, { + method: options.method || 'GET', + headers: reqHeaders, + ...(useBody ? { body: requestData } : { data: requestData, postType: postType }), + timeout: options.timeout || 15000 + }); + return res?.content || res?.data || res; + } catch (e) { + log(2, '请求', e.message); + return null; + } +} + +// ==================== 导出 ==================== +export function __jsEvalReturn() { + return { init, home, homeVod, category, detail, play, search }; +} \ No newline at end of file diff --git a/jaychouqq/yingshi/js7/mwcy.js b/jaychouqq/yingshi/js7/mwcy.js new file mode 100644 index 00000000..bb8f941a --- /dev/null +++ b/jaychouqq/yingshi/js7/mwcy.js @@ -0,0 +1,589 @@ +/** + * title: "喵物次元", + * logo: "https://www.mwcy.net/favicon.ico", + * more: { + * sourceTag: "动漫" + * } + */ +import { Crypto, load, _ } from 'assets://js/lib/cat.js'; + +const HOST = 'https://www.mwcy.net'; +const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'; + +let siteKey = "", siteType = "", sourceKey = "", ext = ""; + +function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype; + sourceKey = cfg.sourceKey; + ext = cfg.ext; + // 如果ext传入则覆盖HOST(保持兼容) + if (ext && ext.indexOf('http') == 0) HOST = ext; +} + +// ==================== 辅助函数 ==================== +function fixUrl(url) { + if (!url) return ''; + url = url.trim(); + if (url.startsWith('//')) return 'https:' + url; + if (url.startsWith('/')) return HOST + url; + return url; +} + +function cleanText(text) { + if (!text) return ''; + return text.replace(/\s+/g, ' ').trim(); +} + +function isVideoFormat(url) { + if (!url) return false; + return /\.(m3u8|mp4|mkv|flv|avi|mov|wmv|webm)(\?.*)?$/i.test(url); +} + +// ==================== 1. 首页内容与筛选配置 ==================== +function home(filter) { + // 固定分类(6个) + const classes = [ + { type_id: "1", type_name: "番剧" }, + { type_id: "22", type_name: "连载新番" }, + { type_id: "24", type_name: "国漫" }, + { type_id: "2", type_name: "剧场" }, + { type_id: "25", type_name: "欧美动漫" }, + { type_id: "26", type_name: "4K专区" } + ]; + + // ---- 公共筛选选项 ---- + // 年份:当前年份往前30年 + 更早 + const yearList = (() => { + const years = [{ n: "全部", v: "" }]; + const currentYear = new Date().getFullYear(); + for (let y = currentYear; y >= currentYear - 30; y--) { + years.push({ n: String(y), v: String(y) }); + } + years.push({ n: "更早", v: "更早" }); + return years; + })(); + + // 字母 + const letterList = (() => { + const letters = [{ n: "全部", v: "" }]; + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''); + chars.forEach(c => letters.push({ n: c, v: c })); + letters.push({ n: "0-9", v: "0-9" }); + return letters; + })(); + + // 排序 + const orderList = [ + { n: "最新", v: "time" }, + { n: "最热", v: "hits" }, + { n: "评分", v: "score" } + ]; + + // 地区(用于剧场、欧美动漫) + const areaList = [ + { n: "全部", v: "" }, + { n: "大陆", v: "大陆" }, + { n: "香港", v: "香港" }, + { n: "台湾", v: "台湾" }, + { n: "美国", v: "美国" }, + { n: "法国", v: "法国" }, + { n: "英国", v: "英国" }, + { n: "日本", v: "日本" }, + { n: "韩国", v: "韩国" }, + { n: "德国", v: "德国" }, + { n: "泰国", v: "泰国" }, + { n: "印度", v: "印度" }, + { n: "意大利", v: "意大利" }, + { n: "西班牙", v: "西班牙" }, + { n: "加拿大", v: "加拿大" }, + { n: "其他", v: "其他" } + ]; + + // ---- 按分类配置筛选器 ---- + const filters = { + "1": [ // 番剧 + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "22": [ // 连载新番 + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "24": [ // 国漫 + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "2": [ // 剧场 + { key: "area", name: "地区", value: areaList }, + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "25": [ // 欧美动漫 + { key: "area", name: "地区", value: areaList }, + { key: "year", name: "年份", value: yearList }, + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ], + "26": [ // 4K专区 + { key: "letter", name: "字母", value: letterList }, + { key: "order", name: "排序", value: orderList } + ] + }; + + return JSON.stringify({ class: classes, filters: filters }); +} + +// ==================== 2. 首页推荐视频 ==================== +async function homeVod() { + try { + const res = await req(HOST, { headers: { 'User-Agent': UA } }); + const $ = load(res.content); + + // 定位“十月新番”区域 + let section = null; + $('.box-width.wow.fadeInUp .title .title-h').each((i, el) => { + if ($(el).text().trim() === '十月新番') { + section = $(el).closest('.box-width').find('.public-r'); + return false; + } + }); + if (!section) { + section = $('.public-list-box.public-pic-b').parent(); + } + + const items = section ? section.find('.public-list-box.public-pic-b') : $('.public-list-box.public-pic-b'); + const videos = []; + const seen = new Set(); + + items.each((i, el) => { + const $el = $(el); + const $link = $el.find('a.public-list-exp'); + const href = $link.attr('href'); + if (!href || !href.startsWith('/bangumi/')) return; + const title = $el.find('.time-title').text().trim() || $link.attr('title') || ''; + const pic = $link.find('img').attr('data-src') || $link.find('img').attr('src') || ''; + const remarks = $el.find('.public-list-prb').text().trim() || ''; + if (title && href) { + const vod_id = href.startsWith('http') ? href : HOST + href; + if (!seen.has(vod_id)) { + seen.add(vod_id); + videos.push({ vod_id, vod_name: title, vod_pic: pic, vod_remarks: remarks }); + } + } + }); + + return JSON.stringify({ list: videos }); + } catch (e) { + console.log('homeVod error:', e); + return null; + } +} + +// ==================== 3. 分类内容爬取 ==================== +async function category(tid, pg, filter, extend) { + if (pg <= 0) pg = 1; + extend = extend || {}; + const area = extend.area || ''; + const year = extend.year || ''; + const letter = extend.letter || ''; + const order = extend.order || ''; + + // 构建URL + let url = `${HOST}/show/${tid}`; + const parts = []; + if (area) parts.push(`area/${encodeURIComponent(area)}`); + if (order) parts.push(`by/${encodeURIComponent(order)}`); + if (letter) parts.push(`letter/${encodeURIComponent(letter)}`); + if (year) parts.push(`year/${encodeURIComponent(year)}`); + if (pg > 1) parts.push(`page/${pg}`); + + if (parts.length > 0) { + url += '/' + parts.join('/') + '.html'; + } else { + url += (pg === 1 ? '.html' : `/page/${pg}.html`); + } + + + try { + const res = await req(url, { headers: { 'User-Agent': UA } }); + const $ = load(res.content); + + // 解析视频列表(多级兜底) + let items = $('.public-list-box.public-pic-b'); + if (!items.length) items = $('.public-list-div').parent(); + + const videos = []; + const seen = new Set(); + + items.each((i, el) => { + const $el = $(el); + const $link = $el.find('a.public-list-exp'); + const href = $link.attr('href'); + if (!href) return; + + let vod_id = href; + if (!href.startsWith('http')) vod_id = HOST + href; + // 如果是 /play/ 链接,转换为 /bangumi/ + if (href.startsWith('/play/')) { + const match = href.match(/^\/play\/([^-]+)/); + if (match) { + vod_id = HOST + `/bangumi/${match[1]}.html`; + } else { + return; + } + } else if (!href.startsWith('/bangumi/')) { + return; + } + + const title = $el.find('.time-title').text().trim() || $link.attr('title') || ''; + const pic = $link.find('img').attr('data-src') || $link.find('img').attr('src') || ''; + const remarks = $el.find('.public-list-prb').text().trim() || ''; + if (title && vod_id && !seen.has(vod_id)) { + seen.add(vod_id); + videos.push({ + vod_id, + vod_name: title, + vod_pic: fixUrl(pic), + vod_remarks: remarks + }); + } + }); + + // 提取总页数 + let pagecount = 1; + const pageTip = $('.page-tip').text().trim(); + if (pageTip) { + const match = pageTip.match(/当前\d+\/(\d+)页/); + if (match) pagecount = parseInt(match[2]) || 1; + } + if (pagecount === 1) { + const lastPage = $('.page-link').last().attr('href'); + if (lastPage) { + const m = lastPage.match(/page\/(\d+)\.html/); + if (m) pagecount = parseInt(m[1]) || 1; + } + } + + return JSON.stringify({ + list: videos, + page: pg, + pagecount: pagecount, + limit: 20, + total: videos.length + }); + } catch (e) { + console.log('category error:', e); + return JSON.stringify({ list: [] }); + } +} + +// ==================== 4. 搜索功能 ==================== +async function search(wd) { + try { + const encoded = encodeURIComponent(wd); + const url = `${HOST}/search/wd/${encoded}.html`; + + const res = await req(url, { headers: { 'User-Agent': UA } }); + const $ = load(res.content); + + // 搜索页结果使用 .vod-detail.search-list + let items = $('.vod-detail.search-list'); + if (!items.length) items = $('.vod-detail'); + + const videos = []; + const seen = new Set(); + + items.each((i, el) => { + const $el = $(el); + // 标题和链接 + let title = ''; + let vod_id = ''; + const titleEl = $el.find('h3.slide-info-title'); + if (titleEl.length) title = titleEl.text().trim(); + + const linkEl = $el.find('a[target="_blank"]'); + if (linkEl.length) { + const href = linkEl.attr('href'); + if (href) { + if (href.startsWith('/bangumi/')) { + vod_id = HOST + href; + } else if (href.startsWith('/play/')) { + const match = href.match(/^\/play\/([^-]+)/); + if (match) vod_id = HOST + `/bangumi/${match[1]}.html`; + } + } + if (!title) title = linkEl.text().trim(); + } + if (!title) { + // 从其他位置找 + const altTitle = $el.find('.slide-info-title').text().trim(); + if (altTitle) title = altTitle; + } + + const pic = $el.find('.detail-pic img').attr('data-src') || $el.find('.detail-pic img').attr('src') || ''; + const remarks = $el.find('.slide-info-remarks').first().text().trim() || ''; + + if (title && vod_id && !seen.has(vod_id)) { + seen.add(vod_id); + videos.push({ + vod_id, + vod_name: title, + vod_pic: fixUrl(pic), + vod_remarks: remarks + }); + } + }); + + // 总页数 + let pagecount = 1; + const pageTip = $('.page-tip').text().trim(); + if (pageTip) { + const match = pageTip.match(/当前\d+\/(\d+)页/); + if (match) pagecount = parseInt(match[2]) || 1; + } + return JSON.stringify({ + list: videos, + page: 1, + pagecount: pagecount, + limit: 20, + total: videos.length + }); + } catch (e) { + console.log('search error:', e); + return JSON.stringify({ list: [] }); + } +} + +// ==================== 5. 详情页解析 ==================== +async function detail(id) { + try { + const url = id.startsWith('http') ? id : HOST + id; + const res = await req(url, { headers: { 'User-Agent': UA } }); + const $ = load(res.content); + + // 标题 + let vod_name = $('h3.slide-info-title').text().trim(); + if (!vod_name) vod_name = $('.player-title-link').text().trim(); + if (!vod_name) vod_name = $('title').text().replace(/^.*? - /, '').replace(/ - .*$/, ''); + + // 封面 + let vod_pic = $('.detail-pic img').attr('data-src') || $('.detail-pic img').attr('src') || ''; + if (!vod_pic) vod_pic = $('.vod-detail .detail-pic img').attr('data-src') || ''; + + // 简介 + let vod_content = $('#height_limit').text().trim() || $('.vod-news .text').first().text().trim() || ''; + + // 元数据:年份、地区、类型 + let vod_year = '', vod_area = ''; + $('.slide-info .slide-info-remarks a').each((i, el) => { + const text = $(el).text().trim(); + if (/^\d{4}$/.test(text)) vod_year = text; + else if (['日本','大陆','香港','台湾','美国','英国','韩国','法国','德国','泰国','印度','意大利','西班牙','加拿大','其他'].includes(text)) { + vod_area = text; + } + }); + // 类型 + // ---- 提取演员和导演 ---- + let vod_actor = '', vod_director = '', type_name = ''; + + // 方式1:从 .slide-info.partition 中提取 + $('.slide-info.partition').each((i, el) => { + const $el = $(el); + + // 类型 + const typeStrong = $el.find('strong:contains("类型")'); + if (typeStrong.length) { + const typeLinks = typeStrong.nextAll('a').map((j, a) => $(a).text().trim()).get(); + if (typeLinks.length) type_name = typeLinks.join(','); + } + // 导演 + const dirStrong = $el.find('strong:contains("导演")'); + if (dirStrong.length) { + const dirLinks = dirStrong.nextAll('a').map((j, a) => $(a).text().trim()).get(); + if (dirLinks.length) vod_director = dirLinks.join(','); + } + // 演员 + const actorStrong = $el.find('strong:contains("演员")'); + if (actorStrong.length) { + const actorLinks = actorStrong.nextAll('a').map((j, a) => $(a).text().trim()).get(); + if (actorLinks.length) vod_actor = actorLinks.join(','); + } + }); + + // ---- 播放源与剧集 ---- + const playFrom = []; + const playUrls = []; + + // 获取线路名称 + const sourceNames = []; + $('.anthology-tab a').each((i, el) => { + let name = $(el).text().trim(); + name = name.replace(/]*>.*?<\/i>/, '').replace(/ /g, '').replace(/]*>.*?<\/span>/, '').trim(); + if (name) sourceNames.push(name); + }); + if (!sourceNames.length) { + $('.vod-playerUrl').each((i, el) => { + let name = $(el).text().trim(); + name = name.replace(/]*>.*?<\/i>/, '').replace(/]*>.*?<\/span>/, '').trim(); + if (name) sourceNames.push(name); + }); + } + + const boxes = $('.anthology-list-box'); + if (boxes.length && sourceNames.length) { + boxes.each((idx, box) => { + const name = sourceNames[idx] || ('线路' + (idx+1)); + const episodes = []; + $(box).find('ul.anthology-list-play li a').each((j, ep) => { + const $ep = $(ep); + let epName = $ep.find('span').text().trim() || $ep.text().trim(); + let href = $ep.attr('href'); + if (epName && href) { + href = fixUrl(href); + episodes.push(epName + '$' + href); + } + }); + if (episodes.length) { + playFrom.push(name); + playUrls.push(episodes.join('#')); + } + }); + } + + if (!playFrom.length) { + const singleBox = $('.anthology-list-play'); + if (singleBox.length) { + const episodes = []; + singleBox.find('li a').each((j, ep) => { + const $ep = $(ep); + let epName = $ep.find('span').text().trim() || $ep.text().trim(); + let href = $ep.attr('href'); + if (epName && href) { + href = fixUrl(href); + episodes.push(epName + '$' + href); + } + }); + if (episodes.length) { + playFrom.push('默认线路'); + playUrls.push(episodes.join('#')); + } + } + } + + const vod = { + vod_id: id, + vod_name, + vod_pic: fixUrl(vod_pic), + type_name, + vod_actor: vod_actor, + vod_director: vod_director, + vod_year, + vod_area, + vod_remarks: '', + vod_content, + vod_play_from: playFrom.join('$$$'), + vod_play_url: playUrls.join('$$$') + }; + + return JSON.stringify({ list: [vod] }); + } catch (e) { + console.log('detail error:', e); + return null; + } +} + +// ==================== 6. 播放链接解析 ==================== +async function play(flag, id, flags) { + try { + const playUrl = id.startsWith('http') ? id : HOST + id; + const res = await req(playUrl, { headers: { 'User-Agent': UA } }); + const html = res.content; + + const match = html.match(/player_.*?=([^]*?) { + try { + const apiUrl = `https://player.catw.moe${apiPath}${encodeURIComponent(videoUrl)}&_t=${Date.now()}`; + const res = await req(apiUrl, { headers: { 'User-Agent': UA } }); + const html = res.content; + // 提取 uid + const uidMatch = html.match(/"uid"\s*:\s*"([^"]+)"/); + const uid = uidMatch ? uidMatch[1] : null; + console.log('uid:', uid); + // 提取 url (ConFig 根层级那个长字符串) + const urlMatch = html.match(/"url"\s*:\s*"([^"]+)"/); + const url = urlMatch ? urlMatch[1] : null; + console.log('url:', url); + if (!uid || !url) { + console.log('[喵物次元] ConFig 缺少 uid 或 url'); + return null; + } + + const realUrl = decryptEcUrl(url, uid); + if (realUrl) { + return { url: realUrl, ua: UA }; + } + return null; + } catch (e) { + return null; + } + }; + + let parsed = await tryParse('/player/ec.php?code=qw&if=1&url='); + if (!parsed) parsed = await tryParse('/art.php?url='); + + if (parsed) { + return JSON.stringify({ + parse: 0, + url: parsed.url, + header: { 'User-Agent': parsed.ua } + }); + } + + return JSON.stringify({ parse: 1, url: playUrl }); + } catch (e) { + return JSON.stringify({ parse: 1, url: id }); + } +} + +function decryptEcUrl(encryptedBase64, uid) { + try { + const aesKey = '2890' + uid + 'tB959C'; + const aesIv = '2F131BE91247866E'; + // aesX(算法, 加密?false=解密, 数据, 输入是Base64?, key, iv, 输出是Base64?) + const realUrl = aesX('AES/CBC/PKCS7', false, encryptedBase64, true, aesKey, aesIv, false); + console.log(realUrl) + return realUrl; + } catch (e) { + return null; + } +} + +// ==================== 导出 ==================== +export function __jsEvalReturn() { + return { + init, + home, + homeVod, + category, + detail, + play, + search + }; +} \ No newline at end of file diff --git a/jaychouqq/yingshi/json1/4K在线.json b/jaychouqq/yingshi/json1/4K在线.json new file mode 100644 index 00000000..012dbc1c --- /dev/null +++ b/jaychouqq/yingshi/json1/4K在线.json @@ -0,0 +1,19 @@ + +{ + "作者":"20260317", + "站名":"4K在线-永久发布页https://4kfabuye.top/", + "主页url": "https://bbibi.cc/", + "请求头": "User-Agent$MOBILE_UA", + "简介":"description\" content=\"&&\"", + "线路二次截取": "播放地址&&", + "线路数组": "", + "线路标题": ">&&<", + "播放数组": "text-muted col-pd\">&&", + "标题": "alt=\"&&\"", + "图片": "https://+src=\"https*src=&&\"", + "副标题": "update\">&&
+icon-star2\">&&
", + "链接前缀": "https://www.4kvm.org", + "链接": "href=\"&&\"", + "导演": "导演*>&&", + "主演": "主演*>&&", + "简介": "👉【提醒:请不要相信视频中的广告以免上当受骗!】,+description\" content=\"&&\"", + "线路数组": "se-q'>&&", + "线路标题": "专线", + "多线数组": "se-q'>&&", + "多线链接": "href=\"&&\"", + "搜索url": "https://www.4kvm.org/search?q={wd}", + "搜索模式": "1", + "搜索数组": "[包含:/play/]", + "搜索标题": "alt=\"&&\"", + "搜索图片": "https://+src=\"https*src=&&\"", + "搜索链接前缀": "https://www.4kvm.org", + "搜索链接": "href=\"&&\"", + "倒序": "0", + "播放列表": "[包含:/play/]", + "播放标题": "&&&&", +"图片": "src=\"&&\"", +"标题":"class=\"title\">&&", + "副标题": "hdtag\">&&<", + + "搜索模式": "1", + "搜索url": "/aueteso.php?searchword={wd}", + "搜索数组": "mb-0\">&&", + "搜索图片": "空", + "搜索标题": "text-danger\">&&<", + "搜索链接": "data-href=\"&&\"", + + "影片地区": "地区:&&

", + "影片类型": "分类:&&

", + "导演": "导演:&&

", + "主演": "主演:&&

", + "简介": "

&&

", + + "线路数组": "&&small>", + "线路标题": ">&&<[替换:『*』>>空#:>>空]", + + "播放数组": "", + + "筛选":{ +"Movie":[ + {"key":"class","name":"剧情","value":[ + {"n":"全部","v":""}, + {"n":"喜剧片","v":"/xjp"}, + {"n":"动作片","v":"/dzp"}, + {"n":"爱情片","v":"/aqp"}, + {"n":"科幻片","v":"/khp"}, + {"n":"恐怖片","v":"/kbp"}, + {"n":"惊悚片","v":"/jsp"}, + {"n":"战争片","v":"/zzp"}, + {"n":"剧情片","v":"/jqp"}]}], + +"Tv":[ + {"key":"class","name":"剧情","value":[ + {"n":"全部","v":""}, + {"n":"美剧","v":"/oumei"}, + {"n":"韩剧","v":"/hanju"}, + {"n":"日剧","v":"/riju"}, + {"n":"泰剧","v":"/yataiju"}, + {"n":"网剧","v":"/wangju"}, + {"n":"台剧","v":"/taiju"}, + {"n":"国产","v":"/neidi"}, + {"n":"港剧","v":"/tvbgj"}, + {"n":"英剧","v":"/yingju"}]}], + +"Zy":[ + {"key":"class","name":"剧情","value":[ + {"n":"全部","v":""}, + {"n":"国综","v":"/guozong"}, + {"n":"韩综","v":"/hanzong"}, + {"n":"美综","v":"/meizong"}]}], + +"Dm":[ + {"key":"class","name":"剧情","value":[ + {"n":"全部","v":""}, + {"n":"动画","v":"/donghua"}, + {"n":"日漫","v":"/riman"}, + {"n":"国漫","v":"/guoman"}, + {"n":"美漫","v":"/meiman"}]}], + +"qita":[ + {"key":"class","name":"剧情","value":[ + {"n":"全部","v":""}, + {"n":"记录片","v":"/Jlp"}, + {"n":"经典片","v":"/Jdp"}, + {"n":"经典剧","v":"/Jdj"}, + {"n":"网大电影","v":"/wlp"}, + {"n":"国产老电影","v":"/laodianying"}]}]} +} \ No newline at end of file diff --git a/jaychouqq/yingshi/json1/CNN影视.json b/jaychouqq/yingshi/json1/CNN影视.json new file mode 100644 index 00000000..af881137 --- /dev/null +++ b/jaychouqq/yingshi/json1/CNN影视.json @@ -0,0 +1,34 @@ + { + "站名": "🎈️CNN影视🎈", + "播放请求头": "User-Agent$Mozilla/5.0", + "二次截取": "videoList*[&&]", + "数组": "{&&}", + "图片": "https://obs.3688baihuo.com/+huo.com/&&\"", + "标题": "\"vodName\":\"&&\"", + "副标题": "vodRemarks\":\"(&&\"", + "链接": "\"vodId\":&&,", + "链接前缀": "https://m.shunhengdf.com/detail/", + "简介": "简介:&&\"", + + "搜索url": "https://m.shunhengdf.com/vod/search/{wd}", + "搜索副标题": "class=\"boottom\"*
&&", + "线路标题": ">&&>nid\":/1/]", + "播放列表":"{&&}", + "播放标题":"name\":\"&&\"", + + "播放链接前缀":"https://m.shunhengdf.com/vod/play/+data\":{\"vodId\":&&,", + "播放链接":"nid\":&&,", + "倒序":"0", + "跳转解析":"", + "跳转播放链接":"", + + "分类url":"https://m.shunhengdf.com/vod/show/id/{cateId}/class/{class}/area/{area}/year/{year}/page/{catePg}", + + "分类":"电影$1#电视剧$2#综艺$3#动漫$4" + + +} \ No newline at end of file diff --git a/jaychouqq/yingshi/json1/Vidhub视频库.json b/jaychouqq/yingshi/json1/Vidhub视频库.json new file mode 100644 index 00000000..fc124c44 --- /dev/null +++ b/jaychouqq/yingshi/json1/Vidhub视频库.json @@ -0,0 +1,138 @@ +//写法思路来海阔视界,xpath筛选。本人是海阔用户,所以搬了海阔的jsoup写法过来。2022年9月17日 +//jsoup规则写法请查阅海阔视界或者海阔影视相关教程。不支持js写法 +//本文档为完整模板,请不要去无中生有添加多余的键值参数。 +{ + //规则名 + "title": "Vidhub视频库", + //作者 + "author": "香雅情", + //请求头UA,键名$键值,每一组用#分开,不填则默认okhttp/3.12.11,可填MOBILE_UA或PC_UA使用内置的手机版或电脑版UA + //多个请求头参数写法示例,"User-Agent$PC_UA#Referer$http://ww.baidu.com#Cookie$ser=ok",每一组用#分开。 + //习惯查看手机源码写建议用手机版UA,习惯查看PC版源码写建议用电脑版UA + "Headers":"PC_UA", + //图片是否需要代理 + "PicNeedProxy":"0", + //是否开启获取首页数据,0关闭,1开启 + "homeContent":"1", + //首页推荐数据获取链接 + "rcmed_url": "https://vidhub.tv", + //首页列表数组截取。 + "home_arr_rule": "body&&.module-items", + //首页片单列表数组定位。 + "hmepi_arr_rule": ".module-item:not(:contains(伦理片))", + //首页片单信息jsoup与正则截取写法切换,只作用于html网页,1为jsoup写法(默认),0为正则截取写法 + "home_is_jsoup":"1", + + //分类链接起始页码,禁止负数和含小数点。 + "firstpage": "1", + //分类链接,{cateId}是分类,{catePg}是页码,第一页没有页码的可以这样写 第二页链接[firstPage=第一页的链接] + "class_url": "https://vidhub.tv/vodshow/{cateId}--hits------{catePg}---.html[firstPage=https://vidhub.tv/vodshow/{cateId}--hits---------.html]", + //分类名,分类1&分类2&分类3 + "class_name": "电影&电视剧&动漫&综艺", + //分类名替换词,替换词1&替换词2&替换词3,替换词包含英文&的用两个中文&&代替,示例:&&id=0&&&id=1 + "class_value": "1&2&4&3", + //筛选数据,json格式,参考xpath的筛选写法 + "filterdata":{}, + + //分类页面截取数据模式,0为json,其它数字为普通网页。 + "cat_mode": "1", + //分类列表数组定位,最多支持3层,能力有限,不是所有页面都能支持 + "cat_arr_rule": ".module-items&&.module-item:not(:contains(伦理片))", + //分类片单信息jsoup与xb截取写法切换,只作用于html网页,1为jsoup写法(默认),0为xb写法 + "cat_is_jsoup":"1", + //分类片单标题 + "cat_title": "a&&title", + //分类片单链接 + "cat_url": "a&&href", + //分类片单图片,支持自定义图片链接 + "cat_pic": ".lazyloaded&&data-src", + //分类片单副标题 + "cat_subtitle":".module-item-text&&Text", + //分类片单链接补前缀 + "cat_prefix": "https://vidhub.tv", + //分类片单链接补后缀 + "cat_suffix": "", + + //搜索请求头参数,不填则默认okhttp/3.12.11,可填MOBILE_UA或PC_UA使用内置的手机版或电脑版UA + //多个请求头参数写法示例,键名$键值,每一组用#分开。"User-Agent$PC_UA#Referer$http://ww.baidu.com#Cookie$ser=ok"。 + "SHeaders":"User-Agent$PC_UA", + //搜索链接,搜索关键字用{wd}表示,post请求的最后面加;post + //POST链接示例 http://www.lezhutv.com/index.php?m=vod-search;post + "search_url": "https://vidhub.tv/index.php/ajax/suggest?mid=1&wd={wd}&limit=50", + //POST搜索body,填写搜索关键字的键值,一般常见的是searchword和wd,不是POST搜索的可留空或删除。 + "sea_PtBody":"wd={wd}&search=", + + //搜索截取模式,0为json搜索,只支持列表在list数组里的,其它数字为网页截取。 + "search_mode": "0", + //搜索列表数组定位,不填默认内置list,最多支持3层,能力有限,不是所有页面都能支持。 + "sea_arr_rule": "list", + //搜索片单信息jsoup与xb截取写法切换,只作用于html网页,1为jsoup写法(默认),0为xb写法 + "sea_is_jsoup":"1", + //搜索片单图片,支持自定义图片链接 + "sea_pic": "pic", + //搜索片单标题 + "sea_title": "name", + //搜索片单链接 + "sea_url": "id", + //搜索片单副标题 + "sea_subtitle":"", + //搜索片单链接补前缀 + "search_prefix": "https://vidhub.tv/voddetail/", + //搜索片单链接补后缀,这个一般json搜索的需要 + "search_suffix": ".html", + + //片单链接是否直接播放,0否,1分类片单链接直接播放,2详情选集链接直接播放。 + //设置成直接播放后,后面3个参数请注意该留空的请务必留空。 + "force_play": "0", + //直接播放链接补前缀 + "play_prefix": "https://live.52sf.ga/huya/", + //直接播放链接补后缀,设置为#isVideo=true#可强制识别为视频链接 + "play_suffix": "#isVideo=true#", + //直接播放链接设置请求头,只对直链视频有效,每一组用#分开 + "play_header": "authority$ku.peizq.online#Referer$https://play.peizq.online", + + //项目信息jsoup与xb截取写法切换,1为jsoup写法(默认),0为xb写法 + "proj_is_jsoup":"1", + //类型数据,截取前缀&&截取后缀 + "proj_cate": ".video-info&&.video-info-aux&&Text", + //年代数据,截取前缀&&截取后缀 + "proj_year": ".video-info&&.video-info-items,2&&Text", + //地区数据,截取前缀&&截取后缀 + "proj_area": "", + //演员数据,截取前缀&&截取后缀 + "proj_actor": ".video-info&&.video-info-items,1&&Text", + //简介内容,截取前缀&&截取后缀 + "proj_plot": ".video-info&&.video-info-content&&Text", + + //线路截取区域,如果不需要请把tab_title或tab_arr_rule置空或者全部不要填。 + //线路截取数组 + "tab_arr_rule": ".module-tab-items&&.module-tab-item", + //线路标题,截取前缀&&截取后缀 + "tab_title": "Text", + + //列表数组截取,必须 + "list_arr_rule": "body&&.module-player-list", + //集数数组截取,必须 + "epi_arr_rule": ".scroll-content&&a", + //集数标题,截取前缀&&截取后缀 + "epi_title": "Text", + //集数链接,截取前缀&&截取后缀 + "epi_url": "href", + //选集是否反转显示 + "epi_reverse": "0", + //集数链接补前缀 + "epiurl_prefix": "https://vidhub.tv", + //集数链接补后缀 + "epiurl_suffix": "", + + //下面几个参数请勿乱用。否则可能会有副作用。 + //分析网页源码中有