diff --git a/js/18/18.json b/js/18/18.json new file mode 100644 index 0000000..0503fed --- /dev/null +++ b/js/18/18.json @@ -0,0 +1,229 @@ +{ + "spider": "./se.jar;md5;875ce871703d1c382e0498711b9d3ba0", + "logo": "./Q.jpg", + "sites": [ + { + "key": "jable", + "name": "jable", + "type": 3, + "quickSearch": 1, + "searchable": 1, + "changeable": 1, + "filterable": 1, + "timeout": 60, + "style": { + "type": "rect", + "ratio": 1.48}, + "api": "csp_GM", + "ext": { + "userScript": "./drpy_js/jable.user.js", + "debug": false, + "webViewSettings": { + "blockNetworkImage": true, + "blockList": [ + "*.ico*", + "*.png*", + "*.css*", + "https://*.adsco.re/*", + "https://*.googleapis.com/*", + "https://*.googlesyndication.com/*", + "https://*.googletagmanager.com/*", + "https://*.hpyjmp.com/*", + "https://*.magsrv.com/*", + "https://*.mnaspm.com/*", + "https://*.shukriya90.com/*", + "https://*.tapioni.com/*", + "https://*.tsyndicate.com/*", + "https://assets.jable.tv/assets/js/player.js"]}, + "spider": { + "homeContent": { + "loadUrl": "https://jable.tv/"}, + "categoryContent": { + "loadUrl": "https://jable.tv/${tid:-latest-updates}/?from=${pg:-1}${sort_by:-}"}, + "detailContent": { + "loadUrl": "https://jable.tv/videos/${id}/"}, + "searchContent": { + "loadUrl": "https://jable.tv/search/${key}/?from=${pg:-1}"}}} + }, + { + "key": "MissAV", + "name": "MissAV", + "type": 3, + "quickSearch": 1, + "searchable": 1, + "changeable": 1, + "filterable": 1, + "timeout": 60, + "style": { + "type": "rect", + "ratio": 1.49}, + "api": "csp_GM", + "ext": { + "userScript": "./drpy_js/missav.user.js", + "debug": false, + "webViewSettings": { + "blockNetworkImage": true, + "blockList": [ + "*.ico", + "*.png", + "*.css", + "*.svg", + "https://*.cloudflareinsights.com/*", + "https://*.googletagmanager.com/*", + "https://*.ktkjmp.com/*", + "https://*.magsrv.com/*", + "https://*.mnaspm.com/*", + "https://*.myavlive.com/*", + "https://*.recombee.com/*", + "https://*.rmhfrtnd.com/*", + "https://*.trackwilltrk.com/*", + "https://*.tsyndicate.com/*", + "https://missav.com/fonts/*", + "https://tsyndicate.com/*", + "https://hartattenuate.com/*"]}, + "spider": { + "homeContent": { + "loadUrl": "https://missav.ws/cn/"}, + "categoryContent": { + "loadUrl": "https://missav.ws/cn/${tid}?page=${pg:-1}${filter:-}${sort:-}"}, + "detailContent": { + "loadUrl": "https://missav.ws/cn/${id}"}, + "searchContent": { + "loadUrl": "https://missav.ws/cn/search/${key}?page=${pg:-1}"}}} + }, + { + "key": "xojav", + "name": "xojav", + "type": 3, + "quickSearch": 1, + "searchable": 1, + "changeable": 1, + "filterable": 1, + "timeout": 60, + "style": { + "type": "rect", + "ratio": 1.78}, + "api": "csp_GM", + "ext": { + "userScript": "./drpy_js/xojav.user.js", + "debug": false, + "webViewSettings": { + "blockNetworkImage": true, + "blockList": [ + "*.css*", + "*.ico*", + "*.png*", + "*.svg", + "https://*.googleapis.com/*", + "https://*.googletagmanager.com/*", + "https://*.magsrv.com/*", + "https://*.pemsrv.com/*"]}, + "spider": { + "homeContent": { + "loadUrl": "https://xojav.tv/?lang=zh"}, + "categoryContent": { + "loadUrl": "https://xojav.tv/${tid}${sort_by:-}&mode=async&function=get_block&from=${pg:-1}"}, + "detailContent": { + "loadUrl": "https://xojav.tv/videos/${id}"}, + "searchContent": { + "loadUrl": "https://xojav.tv/search/${key}/?mode=async&function=get_block&sort_by=most_relevant&from_videos=${pg:-1}"}}} + }, + { + "key": "missav", + "name": "missav", + "type": 3, + "searchable": 1, + "quickSearch": 0, + "filterable": 0, + "api": "./drpy_js/miss.py", + "ext": { + "site": "https://missav.ai", + "cfgo": "./drpy_js/cf-proxy-linux-arm64", + "plp": "", + "proxy": { + "http": "socks5://192.177.139.220:9000", + "https": "socks5://192.177.139.220:9000"}} + }, + { + "key": "lav", + "name": "lav", + "type": 3, + "api": "./drpy_js/lav.py", + "searchable": 1, + "quickSearch": 1, + "filterable": 0, + "changeable": 0, + "ext": { + "proxy": {}, + "plp": ""} + }, + { + "key": "肉視頻", + "name": "肉視頻", + "type": 3, + "api": "./drpy_js/rou.py", + "searchable": 1, + "quickSearch": 0, + "filterable": 0, + "changeable": 0 + }, + { + "key": "肉视频", + "name": "肉视频2", + "type": 3, + "api": "./drpy_js/rsp.py", + "searchable": 1, + "quickSearch": 1, + "filterable": 0, + "changeable": 0, + "ext": { + "proxy": {}, + "plp": ""} + }, + { + "key": "51吸瓜", + "name": "吃瓜", + "type": 3, + "api": "./drpy_js/吸瓜.py", + "searchable": 1, + "filterable": 0, + "changeable": 0 + }, + { + "key": "py_BadNews", + "name": "BadNews", + "type": 4, + "api": "https://py.doube.eu.org/spider?site=BadNews", + "searchable": 1, + "quickSearch": 0, + "filterable": 0, + "changeable": 0, + "style": { + "type": "rect", + "ratio": 1.5} + }, + { + "key": "py_Miss", + "name": "missAV", + "type": 4, + "api": "https://py.doube.eu.org/spider?site=Miss", + "searchable": 1, + "quickSearch": 0, + "filterable": 0, + "changeable": 0 + }, + { + "key": "py_AiDou", + "name": "AiDou", + "type": 4, + "api": "https://py.doube.eu.org/spider?site=AiDou", + "searchable": 1, + "quickSearch": 0, + "filterable": 0, + "changeable": 0, + "style": { + "type": "rect", + "ratio": 1.5} + } + ] +} diff --git a/js/18/Q.jpg b/js/18/Q.jpg new file mode 100644 index 0000000..bbf5acb Binary files /dev/null and b/js/18/Q.jpg differ diff --git a/js/18/drpy_js/Apple.py b/js/18/drpy_js/Apple.py new file mode 100644 index 0000000..dcc1644 --- /dev/null +++ b/js/18/drpy_js/Apple.py @@ -0,0 +1,140 @@ + +# -*- coding: utf-8 -*- +# by @嗷呜 http://asp.xpgtv.com http://item.xpgcom.com +import sys +sys.path.append('..') +from base.spider import Spider + +class Spider(Spider): + + def init(self, extend=""): + pass + + def isVideoFormat(self, url): + pass + + def manualVideoCheck(self): + pass + + def destroy(self): + pass + + host='http://asp.xpgtv.com' + + headers = { + "User-Agent": "okhttp/3.12.11" + } + + def homeContent(self, filter): + data = self.fetch(f"{self.host}/api.php/v2.vod/androidtypes",headers=self.headers,).json() + dy = { + "classes": "类型", + "areas": "地区", + "years": "年份", + "sortby": "排序", + } + filters = {} + classes = [] + for item in data['data']: + has_non_empty_field = False + item['sortby'] = ['updatetime', 'hits', 'score'] + demos = ['时间', '人气', '评分'] + classes.append({"type_name": item["type_name"], "type_id": str(item["type_id"])}) + for key in dy: + if key in item and len(item[key]) > 1: + has_non_empty_field = True + break + if has_non_empty_field: + filters[str(item["type_id"])] = [] + for dkey in item: + if dkey in dy and len(item[dkey]) > 1: + values = item[dkey] + value_array = [ + {"n": demos[idx] if dkey == "sortby" else value.strip(), "v": value.strip()} + for idx, value in enumerate(values) + if value.strip() != "" + ] + filters[str(item["type_id"])].append( + {"key": dkey, "name": dy[dkey], "value": value_array} + ) + result = {} + result["class"] = classes + result["filters"] = filters + return result + + def homeVideoContent(self): + rsp = self.fetch(f"{self.host}/api.php/v2.main/androidhome", headers=self.headers).json() + videos = [] + for i in rsp['data']['list']:videos.extend(self.getlist(i['list'])) + return {'list':videos} + + def categoryContent(self, tid, pg, filter, extend): + params = { + "page": pg, + "type": tid, + "area":extend.get('areaes',''), + "year":extend.get('yeares',''), + "sortby":extend.get('sortby',''), + "class":extend.get('classes','') + } + params={i:v for i,v in params.items() if v} + rsp = self.fetch(f'{self.host}/api.php/v2.vod/androidfilter10086', headers=self.headers, params=params).json() + result = {} + result['list'] = self.getlist(rsp['data']) + result['page'] = pg + result['pagecount'] = 9999 + result['limit'] = 90 + result['total'] = 999999 + return result + + def detailContent(self, ids): + rsp = self.fetch(f'{self.host}/api.php/v3.vod/androiddetail2?vod_id={ids[0]}', headers=self.headers).json() + v = rsp['data'] + vod = { + 'vod_year':v.get('year'), + 'vod_area':v.get('area'), + 'vod_lang':v.get('lang'), + 'type_name':v.get('className'), + 'vod_actor':v.get('actor'), + 'vod_director':v.get('director'), + 'vod_content':v.get('content'), + 'vod_play_from': '老僧酿酒', + 'vod_play_url': '#'.join([f"{i['key']}${i['url']}" for i in v['urls']]) + } + return {'list':[vod]} + + def searchContent(self, key, quick, pg='1'): + rsp = self.fetch(f'{self.host}/api.php/v2.vod/androidsearch10086?page={pg}&wd={key}', headers=self.headers).json() + return {'list':self.getlist(rsp['data']),'page':pg} + + def playerContent(self, flag, id, vipFlags): + header = { + 'user_id': 'XPGBOX', + 'token2': 'XFxIummRrngadHB4TCzeUaleebTX10Vl/ftCvGLPeI5tN2Y/liZ5tY5e4t8=', + 'version': 'XPGBOX com.phoenix.tv1.5.5', + 'hash': '524f', + 'screenx': '2331', + 'user-agent': 'okhttp/3.12.11', + 'user-agent': 'Lavf/58.12.100', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', + 'token': 'VkxTyy6Krh4hd3lrQySUCJlsDYzzxxBbttphr3DiQNhmJkwoyEEm2YEu8qcOFGz2SmxGbIaSC91pa+8+VE9+SPQjGWY/wnqwKk1McYhsGyVVvHRAF0B1mD7922ara1o3k/EwZ1xyManr90EeUSxI7rPOLBwX5zeOri31MeyDfBnIdhckWld4V1k2ZfZ3QKbN', + 'timestamp': '1749174636', + 'screeny': '1121', + } + if 'http' not in id:id=f"http://c.xpgtv.net/m3u8/{id}.m3u8" + return {"parse": 0, "url": id, "header": header} + + def localProxy(self, param): + pass + + def getlist(self,data): + videos = [] + for vod in data: + r=f"更新至{vod.get('updateInfo')}" if vod.get('updateInfo') else '' + videos.append({ + "vod_id": vod['id'], + "vod_name": vod['name'], + "vod_pic": vod['pic'], + "vod_remarks": r or vod['score'] + }) + return videos \ No newline at end of file diff --git a/js/18/drpy_js/Miss.py b/js/18/drpy_js/Miss.py new file mode 100644 index 0000000..eba8f08 --- /dev/null +++ b/js/18/drpy_js/Miss.py @@ -0,0 +1,407 @@ +# -*- coding: utf-8 -*- +# by @嗷呜 +import os,copy,requests,gzip,json,re,sys,time,uuid +from urllib.parse import unquote +from base64 import b64decode +from Crypto.Hash import SHA1, HMAC +from pyquery import PyQuery as pq +sys.path.append('..') +from base.spider import Spider + + +class Spider(Spider): + + def init(self, extend="{}"): + config = json.loads(extend) + self.process = None + self.host = config['site'] + self.plp = config.get('plp', '') + self.proxy = config.get('proxy', {}) + self.one_mark, gobool = self.start_proxy(config.get('cfgo')) + self.cfproxy = 'http://127.0.0.1:12525?url=' if gobool else '' + self.headers = { + 'referer': f'{self.host}', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0' + } + pass + + def getName(self): + pass + + def isVideoFormat(self, url): + pass + + def manualVideoCheck(self): + pass + + def destroy(self): + pass + + def copy_file(self, source_path): + target_filename = os.path.basename(source_path) + try: + from java.io import File + from java.lang import Class + from java.nio.file import Files, Paths, StandardCopyOption + + source_file = File(source_path) + if not source_file.exists() or not source_file.isFile(): + self.log(f"❌ 源文件不存在: {source_path}") + return False + + python_class = Class.forName("com.chaquo.python.Python") + get_instance_method = python_class.getMethod("getInstance") + python_instance = get_instance_method.invoke(None) + + get_platform_method = python_class.getMethod("getPlatform") + platform = get_platform_method.invoke(python_instance) + + get_application_method = platform.getClass().getMethod("getApplication") + application = get_application_method.invoke(platform) + context = application.getApplicationContext() + files_dir = context.getFilesDir().getAbsolutePath() + target_path = files_dir + "/" + target_filename + + target_file = File(target_path) + if target_file.exists() and target_file.isFile() and target_file.length() == source_file.length(): + target_file.setExecutable(True) + self.log(f"⚠️ 文件已存在: {target_path}") + return target_path + + Files.copy( + Paths.get(source_path), + Paths.get(target_path), + StandardCopyOption.REPLACE_EXISTING + ) + + File(target_path).setExecutable(True) + self.log(f"✅ 复制完成: {target_path}") + return target_path + + except Exception as e: + self.log(f"❌ 复制失败: {e}") + return False + + def start_proxy(self,path, port=12525): + try: + if not path: + msg = "文件不存在" + self.log(msg) + return msg, False + from java.lang import ProcessBuilder + from java.io import File + from android.os import Environment + external_storage = Environment.getExternalStorageDirectory().getAbsolutePath() + absolute_path = os.path.abspath(path) + absolute_path = unquote(external_storage + absolute_path.split('/file')[-1]) + c_file=self.copy_file(absolute_path) + if not c_file: + msg = f"无法复制文件" + self.log(msg) + return msg, False + if self.examine(port): + self.proxy={} + msg = f"✅ 代理已启动:{port}" + self.log(msg) + return msg, True + oder=[c_file, "-port", str(port)] + proxy=self.proxy.get('http','') + if proxy: + oder.extend(['-proxy',proxy]) + pb = ProcessBuilder(oder) + pb.directory(File(c_file).getParentFile()) + self.process = pb.start() + time.sleep(1) + if self.process and self.process.isAlive() and self.examine(port): + self.proxy = {} + msg = f"✅ 代理已启动:{port}" + self.log(msg) + return msg,True + else: + msg = "❌ 代理启动失败" + self.log(msg) + return msg,False + + except Exception as e: + msg = "❌ 启动代理异常" + self.log(f"{msg}: {e}") + return msg, False + + def examine(self,port): + import socket + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(1) + result = sock.connect_ex(('127.0.0.1', int(port))) + sock.close() + if result == 0: + return True + return False + + xhost='https://client-rapi-missav.recombee.com' + + countr='/dm15/cn' + + ccccc='H4sIAAAAAAAAA4uuViqpLEiNz0vMTVWyUlB6Nqfhxf6Jz2ZveTZtg5IORC4zBSSTkmtqaKKfnKefl1quVKuDrm/ahid75zzZ0fV0RxOGPgsLkL6i1JzUxOJULHqnL3i+oPHZ1san7bvQ9ZoZGYL0luYlp+YV5xelpugCDcnGNOPp0s1P9sx4sqPhxfIOVDOAuhOTS4pSi4tTizH1Pd+4++m8bgwd6al5RdiUP+2f+GJhz9OpbRg6chOzU4uAOmIBkkRrDlIBAAA=' + + fts = 'H4sIAAAAAAAAA23P30rDMBQG8FeRXM8X8FVGGZk90rA0HU3SMcZgXjn8V6p2BS2KoOiFAwUn2iK+TBP7GBpYXbG9/c6Pc77TnaABjNHOFtojVIDPUQcx7IJJvl9ydX30GwSYSpN0J4iZgTqJiywrPlN1vm/GJiPMJgGxJaZo2qnc3WXDuZIKMqSwUcX7Ui8O1DJRH3Gldh3CgMM2l31BhNGW8euq3PNFrac+PVNZ2NYzjMrbY53c6/Sm2uwDBczB7mGxqaDTWfkV6atXvXiu4FD2KeHOf3nxViahjv8YxwHYtWfyQ3NvFZYP85oSno3HvYDAiNevPqnosWFHAAPahnU6b2DXY8Jp0bO8QdfEmlo/SBd5PPUBAAA=' + + actfts = 'H4sIAAAAAAAAA5WVS2sUQRRG/0rT6xTcqq5Xiwjm/X6sQxZjbBLRBBeOIEGIIEgWrtwI4lJEQsjGhU6Iv2bGcf6FVUUydW/d1SxT55sDfbpmsn9WP+/e1A+q+rh7dnT8qp6rT3snXTz4N7icXH4OB697L/rxZP+sPo1g+Ot8PPg+vvoyOb+IOJ7Vb+fuqGxkJSrZmMOTexiORDjAGxs3GvDGinCANjp5NPbo4NHYo5PHYI8OHoM9JnkM9pjgMdhjksdijwkeiz02eSz22OCx2GOTx2GPDR6HPS55HPa44HHY45LHY48LHo89Pnk89vjg8djjk6fFHh88bfAcxNXduz/sv0Qvfnz74+/X65lf/OMqfzD9ndF8geYzWijQQkaLBVrMaKlASxktF2g5o5UCrWS0WqDVjNYKtJbReoHWM9oo0EZGmwXazGirQFsZbRdoO6OdAu1ktFug3Yz2CrRH70TvqEN3YvT75+TP+5nvxMNKwf0pCIWur4JwM5spVCAaRJtI9ZQ2IPBPg47UTKkGgb/wJlI7pQYE/ho/QsiCaFv61E+7J338Izj6MJi8+xSefnhzO/PTK1CmGt58G118zM+pDBloPtBk0PBBQwaKDxQZSD6QZAB8QN6UbNlAtmTg+cCTgeMDRwaWDywZ8JKSlJS8pCQlJS8pSUnJS0pSUvKSkpSUvKQkJYGXBFISeEkgJYGXBFISeEkgJYGXBFISeEkgJYGXBFISeEkgJYGXBFISeElI/7QO/gOZ7bAksggAAA==' + def homeContent(self, filter): + one={"vod_name": "go状态","vod_pic": "https://img-blog.csdnimg.cn/6f8b58d3daf14b5696e85c710f18a571.png","action": "action","vod_remarks": self.one_mark,"style": {"type": "rect","ratio": 1.33}} + html = pq(requests.get(f"{self.cfproxy}{self.host}{self.countr}",headers=self.headers,proxies=self.proxy).content) + result = {} + filters = {} + classes=self.ungzip(self.ccccc) + for i in classes: + id=i['type_id'] + filters[id] = copy.deepcopy(self.ungzip(self.fts)) + if 'cn/actresses' in id:filters[id].extend(self.ungzip(self.actfts)) + result['class'] = classes + result['filters'] = filters + result['list'] = self.getlist(html('.grid-cols-2.md\\:grid-cols-3 .thumbnail.group')) + result['list'].insert(0, one) + return result + + def homeVideoContent(self): + pass + + def categoryContent(self, tid, pg, filter, extend): + params={ + 'page':pg + } + ft = { + 'filters': extend.get('filters', ''), + 'sort': extend.get('sort', '') + } + if tid in ['cn/genres', 'cn/makers']: + ft = {} + elif tid == 'cn/actresses': + ft = { + 'height': extend.get('height', ''), + 'cup': extend.get('cup', ''), + 'debut': extend.get('debut', ''), + 'age': extend.get('age', ''), + 'sort': extend.get('sort', '') + } + params.update(ft) + params={k: v for k, v in params.items() if v} + req = requests.Request( + url=f"{self.host}/{tid}", + params=params, + ).prepare() + data=pq(requests.get(f"{self.cfproxy}{req.url}",headers=self.headers,proxies=self.proxy).content) + result = {} + if tid in ['cn/genres', 'cn/makers']: + videos = self.gmsca(data) + elif tid == 'cn/actresses': + videos = self.actca(data) + else: + videos = self.getlist(data('.grid-cols-2.md\\:grid-cols-3 .thumbnail.group')) + result['list'] = videos + result['page'] = pg + result['pagecount'] = 9999 + result['limit'] = 90 + result['total'] = 999999 + return result + + def detailContent(self, ids): + urlllll=f"{self.cfproxy}{self.host}/{ids[0]}" + v=pq(requests.get(urlllll,headers=self.headers,proxies=self.proxy).content) + sctx=v('body script').text() + urls=self.execute_js(sctx) + if not urls:urls=f"嗅探${urlllll}" + c=v('.space-y-2 .text-secondary') + ac,dt,cd,bq=[],[],[],['点击展开↓↓↓\n'] + for i in c.items(): + xxx=i('span').text() + if re.search(r"导演:|发行商:",xxx): + dt.extend(['[a=cr:' + json.dumps({'id': j.attr('href').split('/',3)[-1], 'name': j.text()}) + '/]' + j.text() + '[/a]' for j in i('a').items()]) + elif re.search(r"女优:",xxx): + ac.extend(['[a=cr:' + json.dumps({'id': j.attr('href').split('/',3)[-1], 'name': j.text()}) + '/]' + j.text() + '[/a]' for j in i('a').items()]) + elif re.search(r"类型:|系列:",xxx): + bq.extend(['[a=cr:' + json.dumps({'id': j.attr('href').split('/',3)[-1], 'name': j.text()}) + '/]' + j.text() + '[/a]' for j in i('a').items()]) + elif re.search(r"标籤:",xxx): + cd.extend(['[a=cr:' + json.dumps({'id': j.attr('href').split('/',3)[-1], 'name': j.text()}) + '/]' + j.text() + '[/a]' for j in i('a').items()]) + np={'MissAV':urls,'Recommend':self.getfov(ids[0])} + vod = { + 'type_name': c.eq(-3)('a').text(), + 'vod_year': c.eq(0)('time').text(), + 'vod_remarks': ' '.join(cd), + 'vod_actor': ' '.join(ac), + 'vod_director': ' '.join(dt), + 'vod_content': f"{' '.join(bq)}\n{v('.text-secondary.break-all').text()}" + } + names,plist=[],[] + for i,j in np.items(): + if j: + names.append(i) + plist.append(j) + vod['vod_play_from']='$$$'.join(names) + vod['vod_play_url']='$$$'.join(plist) + return {'list': [vod]} + + def searchContent(self, key, quick, pg="1"): + req = requests.Request( + url=f"{self.host}/search/{key}", + params={'page': pg}, + ).prepare() + data = pq(requests.get(f"{self.cfproxy}{req.url}", headers=self.headers, proxies=self.proxy).content) + return {'list': self.getlist(data('.grid-cols-2.md\\:grid-cols-3 .thumbnail.group')),'page':pg} + + def playerContent(self, flag, id, vipFlags): + p=0 if '.m3u8' in id else 1 + if flag == 'Recommend': + urlllll = f"{self.cfproxy}{self.host}/{id}" + try: + v = pq(requests.get(urlllll, headers=self.headers, proxies=self.proxy).content) + sctx = v('body script').text() + url = self.execute_js(sctx) + if not url: raise Exception("没有找到地址") + p,id=0,url.split('$')[-1] + except: + p,id=1,urlllll + return {'parse': p, 'url': id if p else f"{self.plp}{id}", 'header': self.headers} + + def localProxy(self, param): + pass + + def getlist(self,data): + videos = [] + names,ids=[],[] + for i in data.items(): + k = i('.overflow-hidden.shadow-lg a') + id=k.eq(0).attr('href') + name=i('.text-secondary').text() + if id and id not in ids and name not in names: + ids.append(id) + names.append(name) + videos.append({ + 'vod_id': id.split('/',3)[-1], + 'vod_name': name, + 'vod_pic': k.eq(0)('img').attr('data-src'), + 'vod_year': '' if len(list(k.items())) < 3 else k.eq(1).text(), + 'vod_remarks': k.eq(-1).text(), + 'style': {"type": "rect", "ratio": 1.33} + }) + return videos + + def gmsca(self,data): + acts=[] + for i in data('.grid.grid-cols-2.md\\:grid-cols-3 div').items(): + id=i('.text-nord13').attr('href') + acts.append({ + 'vod_id':id.split('/', 3)[-1] if id else id, + 'vod_name': i('.text-nord13').text(), + 'vod_pic': '', + 'vod_remarks': i('.text-nord10').text(), + 'vod_tag': 'folder', + 'style': {"type": "rect", "ratio": 2} + }) + return acts + + def actca(self,data): + acts=[] + for i in data('.max-w-full ul li').items(): + id=i('a').attr('href') + acts.append({ + 'vod_id': id.split('/', 3)[-1] if id else id, + 'vod_name': i('img').attr('alt'), + 'vod_pic': i('img').attr('src'), + 'vod_year': i('.text-nord10').eq(-1).text(), + 'vod_remarks': i('.text-nord10').eq(0).text(), + 'vod_tag': 'folder', + 'style': {"type": "oval"} + }) + return acts + + def getfov(self, url): + try: + h=self.headers.copy() + ids=url.split('/') + h.update({'referer':f'{self.host}/{url}/'}) + t=str(int(time.time())) + params = { + 'frontend_timestamp': t, + 'frontend_sign': self.getsign(f"/missav-default/batch/?frontend_timestamp={t}"), + } + uid=str(uuid.uuid4()) + json_data = { + 'requests': [ + { + 'method': 'POST', + 'path': f'/recomms/items/{ids[-1]}/items/', + 'params': { + 'targetUserId': uid, + 'count': 13, + 'scenario': 'desktop-watch-next-side', + 'returnProperties': True, + 'includedProperties': [ + 'title_cn', + 'duration', + 'has_chinese_subtitle', + 'has_english_subtitle', + 'is_uncensored_leak', + 'dm', + ], + 'cascadeCreate': True, + }, + }, + { + 'method': 'POST', + 'path': f'/recomms/items/{ids[-1]}/items/', + 'params': { + 'targetUserId': uid, + 'count': 12, + 'scenario': 'desktop-watch-next-bottom', + 'returnProperties': True, + 'includedProperties': [ + 'title_cn', + 'duration', + 'has_chinese_subtitle', + 'has_english_subtitle', + 'is_uncensored_leak', + 'dm', + ], + 'cascadeCreate': True, + }, + }, + ], + 'distinctRecomms': True, + } + data = requests.post(f'{self.xhost}/missav-default/batch/', params=params,headers=h, json=json_data,proxies=self.proxy).json() + vdata=[] + for i in data: + for j in i['json']['recomms']: + if j.get('id'): + vdata.append(f"{j['values']['title_cn']}${j['id']}") + return '#'.join(vdata) + except Exception as e: + self.log(f"获取推荐失败: {e}") + return '' + + def getsign(self, text): + message_bytes = text.encode('utf-8') + key_bytes = b'Ikkg568nlM51RHvldlPvc2GzZPE9R4XGzaH9Qj4zK9npbbbTly1gj9K4mgRn0QlV' + h = HMAC.new(key_bytes, digestmod=SHA1) + h.update(message_bytes) + signature = h.hexdigest() + return signature + + def ungzip(self, data): + result=gzip.decompress(b64decode(data)).decode('utf-8') + return json.loads(result) + + def execute_js(self, jstxt): + js_code = re.search(r"eval\(function\(p,a,c,k,e,d\).*?return p}(.*?)\)\)", jstxt).group(0) + try: + from com.whl.quickjs.wrapper import QuickJSContext + ctx = QuickJSContext.create() + result=ctx.evaluate(f"{js_code}\nsource") + ctx.destroy() + return f"多画质${result}" + except Exception as e: + self.log(f"执行失败: {e}") + return None + + + diff --git a/js/18/drpy_js/cf-proxy-linux-arm64 b/js/18/drpy_js/cf-proxy-linux-arm64 new file mode 100644 index 0000000..a7b2c40 Binary files /dev/null and b/js/18/drpy_js/cf-proxy-linux-arm64 differ diff --git a/js/18/drpy_js/iKanbot.js b/js/18/drpy_js/iKanbot.js new file mode 100644 index 0000000..16ff61a --- /dev/null +++ b/js/18/drpy_js/iKanbot.js @@ -0,0 +1,119 @@ +var 二级=`js: +try { + VOD={}; + let html1 = request(input); + pdfh = jsp.pdfh; + VOD.vod_id = pdfh(html1, "#current_id&&value"); + VOD.vod_name = pdfh(html1, "h2&&Text"); + // VOD.vod_pic = pdfh(html1, ".item-root&&img&&src"); + VOD.vod_pic = pdfh(html1, ".item-root&&img&&data-src"); + // VOD.vod_actor = pdfh(html1, ".celebrity&&Text"); + VOD.vod_actor = pdfh(html1, ".meta:eq(4)&&Text"); + // VOD.vod_area = pdfh(html1, ".country&&Text"); + VOD.vod_area = pdfh(html1, ".meta:eq(3)&&Text"); + // VOD.vod_year = pdfh(html1, ".year&&Text"); + VOD.vod_year = pdfh(html1, ".meta:eq(2)&&Text"); + VOD.vod_remarks = ""; + VOD.vod_director = ""; + VOD.vod_content = ""; + log(VOD); + var v_tks = ''; + // let script = pdfa(html1,'script').find(it=>it.includes('v_tks+=')).replace(/