🎬xanimu成人动漫
https://xanimu.ws/zh-CN/
laizhiyu (6509)11/04 23:53
垃圾网站
{
"bookSourceComment": "★xanimu(2D\/3D成人动漫视频站) v1.0\n【站点】xanimu.art | xanimu.ws(同站双域线路,App网络下 .ws 快 30-60 倍)\n【发布页】https:\/\/x99dh.com(Cloudflare「Just a moment」双层加密跳转页;另有 x99dh.lat\/net\/cc\/pro\/github.io 五个静态跳转镜像)\n【线路】默认 xanimu.ws;登录面板可切换 .art\/.ws、一键从发布页取线(双层 AES-GCM 解密)、测延时自动选最快。\n【搜索】GET \/zh-CN\/?s=关键词(WS线路实测<1s)+ 排序 filter(latest\/most-viewed\/longest,分页用 {pageSlug}\/N\/ 格式)\n【发现】四大板块(推荐\/最新\/最多浏览\/最长)+ 30个热门分类\n【正文】详情页 <video> MP4 直链(high\/low 双清晰度),CDN无Referer校验,App网络直连200\n【风险】无登录;未实测搜索限频(请勿高频搜索);CDN(nosofiles.com)域名变动需更新\n【v1.0】LT版+E版双兼容:@js列表返回JS数组、字段用$.键、发布页解密走javax.crypto(E版无createSymmetricCrypto)\n",
"bookSourceGroup": "🎬视频",
"bookSourceName": "🎬xanimu成人动漫",
"bookSourceType": 4,
"bookSourceUrl": "https:\/\/xanimu.ws\/zh-CN\/",
"bookUrlPattern": "https?:\/\/xanimu\\.(ws|art|net|cc|pro|lat)\/zh-CN\/\\d+[^?]*",
"concurrentRate": "1\/30000",
"customButton": false,
"customOrder": 1,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": false,
"exploreUrl": "@js:\/\/ xanimu exploreUrl JS\nfunction XA_E_base() {\n var b = '';\n try { b = String(source.get('xaHost') || ''); } catch (e) { b = ''; }\n if (!b || b.indexOf('http') !== 0) b = 'https:\/\/xanimu.ws';\n return b.replace(\/\\\/+$\/, '');\n}\nvar PS = '%E6%9C%89%E5%85%B3%E8%AF%A6%E7%BB%86%E4%BF%A1%E6%81%AF%EF%BC%8C%E8%AF%B7%E6%9F%A5%E7%9C%8B%E6%AD%A4%E9%A1%B5%E9%9D%A2%E3%80%82';\nvar CATS = [\n ['推荐', ''], ['最新', 'latest'], ['最多浏览', 'most-viewed'], ['最长', 'longest'],\n ['日本动画片', '16884%E4%B8%AA%E7%81%B5%E9%AD%82'], ['卡通片', '40241%E5%8D%A1%E9%80%9A'],\n ['3D', '5-3d-%E6%97%A0%E5%B0%BD'], ['2D', '36900-2d'], ['毛茸茸', '4-%E6%AF%9B%E8%8C%B8%E8%8C%B8%E7%9A%84%E6%97%A0%E5%B0%BD'],\n ['游戏', '22%E6%B8%B8%E6%88%8F'], ['原神', '40979%E5%85%83%E7%A5%9E%E5%86%B2%E5%87%BB'], ['Pokemon', '24-%E9%83%A8%E7%94%B5%E8%A7%86%E8%8A%82%E7%9B%AE\/26-pokemon'],\n ['Naruto', '614-naruto-2'], ['One Piece', '24-%E9%83%A8%E7%94%B5%E8%A7%86%E8%8A%82%E7%9B%AE\/9466-one-piece'], ['龙珠', '24-%E9%83%A8%E7%94%B5%E8%A7%86%E8%8A%82%E7%9B%AE\/9473-dragon-ball'], ['进击的巨人', '61626%E6%94%BB%E5%87%BB%E6%B3%B0%E5%9D%A6'], ['电锯人', '24-%E9%83%A8%E7%94%B5%E8%A7%86%E8%8A%82%E7%9B%AE\/47870-chainsaw-man'],\n ['柔术海战', '78551-%E6%9F%94%E6%9C%AF%E4%BC%9A%E6%88%98'], ['魅魔', '16704-%E9%AD%85%E9%AD%94'], ['触手', '7%E8%A7%A6%E6%89%8B%E5%8F%98%E6%80%81%E8%89%B2%E6%83%85%E7%89%87'],\n ['扶他', '8-futanari-%E6%97%A0%E5%B0%BD'], ['后宫', '9470-%E5%90%8E%E5%AE%AB%E6%97%A0%E5%B0%BD'], ['乱伦', '6-%E4%B9%B1%E4%BC%A6%E6%97%A0%E5%B0%BD'],\n ['中出', '19-%E4%B8%AD%E5%87%BA%E6%97%A0%E5%B0%BD'], ['HMV', '47441-hmv'], ['MMD', '47420%E6%AF%AB%E7%B1%B3'],\n ['Asmr', '39558-%E9%98%BF%E6%96%AF%E7%8E%9B'], ['漫画', '15410%E6%BC%AB%E7%94%BB'], ['Disney', '9479-disney-%E6%97%A0%E5%B0%BD']\n];\nvar rows = [];\nvar PG = \"{{page === 1 ? '' : '\/\" + PS + \"\/' + page + '\/'}}\";\nfor (var i = 0; i < CATS.length ; i++) {\n var nm = CATS[i][0];\n var slug = CATS[i][1];\n var u;\n if (slug === '') {\n u = XA_E_base() + '\/zh-CN\/' + PG;\n } else if (slug === 'latest' || slug === 'most-viewed' || slug === 'longest') {\n u = XA_E_base() + '\/zh-CN\/' + PG + '?filter=' + slug;\n } else {\n u = XA_E_base() + '\/zh-CN\/' + slug + '\/' + PG;\n }\n rows.push(nm + '::' + u);\n if (i === 3) { rows.push('--- 分类 ---::' + XA_E_base() + '\/zh-CN\/'); }\n}\nrows.join('&&');\n",
"header": "{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/124.0.0.0 Mobile Safari\/537.36\"}",
"lastUpdateTime": "1793807619286",
"loginUi": "[{\"name\": \"xaHost\", \"type\": \"text\", \"action\": \"XA_use(String(result['xaHost']||''));\", \"viewName\": \"XA_hostLabel()\"}, {\"name\": \"📡 一键从发布页获取线路\", \"type\": \"button\", \"action\": \"XA_fetchLines()\"}, {\"name\": \"⏱ 测试延时并自动选最快\", \"type\": \"button\", \"viewName\": \"XA_statusLabel()\", \"action\": \"XA_probeAll()\"}, {\"name\": \"○ xanimu.ws(默认推荐)\", \"type\": \"button\", \"action\": \"XA_use('https:\/\/xanimu.ws')\"}, {\"name\": \"○ xanimu.art(备用)\", \"type\": \"button\", \"action\": \"XA_use('https:\/\/xanimu.art')\"}, {\"name\": \"xaPub\", \"type\": \"text\", \"action\": \"XA_putPub();\", \"viewName\": \"XA_pubLabel()\"}]",
"loginUrl": "\/\/ xanimu login panel functions (V1 static loginUi + viewName dynamic text)\nfunction XA_toast(msg) {\n try { java.toast(String(msg)); } catch (e) {\n try { java.longToast(String(msg)); } catch (e2) {}\n }\n}\nfunction XA_refresh() {\n try { java.reLoginView(false); return; } catch (e) {}\n try { java.reLoginView(); return; } catch (e) {}\n try { java.reUiView(false); return; } catch (e) {}\n try { java.reUiView(); } catch (e) {}\n}\nfunction XA_base() {\n var b = '';\n try { b = String(source.get('xaHost') || ''); } catch (e) { b = ''; }\n if (!b || b.indexOf('http') !== 0) b = 'https:\/\/xanimu.ws';\n return b.replace(\/\\\/+$\/, '');\n}\nfunction XA_use(h) {\n var host = String(h || '').replace(\/\\\/+$\/, '');\n if (host.indexOf('http') !== 0) host = 'https:\/\/' + host;\n try { source.put('xaHost', host); } catch (e) { try { java.put('xaHost', host); } catch (e2) {} }\n XA_toast('已切换线路: ' + host);\n XA_refresh();\n}\nfunction XA_now() { return XA_base(); }\nfunction XA_setPub(v) {\n var p = String(v || '').trim();\n if (!p) p = 'https:\/\/x99dh.com';\n if (p.indexOf('http') !== 0) p = 'https:\/\/' + p;\n try { source.put('xaPub', p); } catch (e) { try { java.put('xaPub', p); } catch (e2) {} }\n XA_toast('发布页已存: ' + p);\n}\nfunction XA_putPub() {\n var v = '';\n try { v = String(result['xaPub'] || ''); } catch (e) { v = ''; }\n if (!v || v.length < 6) v = 'https:\/\/x99dh.com';\n XA_setPub(v);\n}\nfunction XA_hexDec(h) {\n var s = '';\n for (var i = 0; i < h.length; i += 2) {\n s += String.fromCharCode(parseInt(h.substr(i, 2), 16));\n }\n return s;\n}\nfunction XA_xorBytes(a1, a2) {\n var BAOS = Packages.java.io.ByteArrayOutputStream;\n var kb = new BAOS();\n var n = a1.length < a2.length ? a1.length : a2.length;\n for (var i = 0; i < n; i++) {\n kb.write((a1[i] & 0xff) ^ (a2[i] & 0xff));\n }\n return kb.toByteArray();\n}\nfunction XA_gcm(keyBytes, ivBytes, ctBytes) {\n var cipher = Packages.javax.crypto.Cipher.getInstance('AES\/GCM\/NoPadding');\n var key = new Packages.javax.crypto.spec.SecretKeySpec(keyBytes, 'AES');\n var spec = new Packages.javax.crypto.spec.GCMParameterSpec(128, ivBytes);\n cipher.init(Packages.javax.crypto.Cipher.DECRYPT_MODE, key, spec);\n return java.bytesToStr(cipher.doFinal(ctBytes));\n}\nfunction XA_staticDecrypt(inner) {\n var mk = inner.match(\/var k=X\\(B\\(\"([A-Za-z0-9+\\\/=]+)\"\\)\\s*,\\s*B\\(\"([A-Za-z0-9+\\\/=]+)\"\\)\\)\/);\n var mi = inner.match(\/var iv=B\\(\"([A-Za-z0-9+\\\/=]+)\"\\)\/);\n var mc = inner.match(\/var ct=B\\(\"([A-Za-z0-9+\\\/=]{50,})\"\\)\/);\n if (!mk || !mi || !mc) return null;\n var k1 = java.base64DecodeToByteArray(mk[1]);\n var k2 = java.base64DecodeToByteArray(mk[2]);\n var iv = java.base64DecodeToByteArray(mi[1]);\n var ct = java.base64DecodeToByteArray(mc[1]);\n return XA_gcm(XA_xorBytes(k1, k2), iv, ct);\n}\nfunction XA_splitIvCt(all, ivLen) {\n var BAOS = Packages.java.io.ByteArrayOutputStream;\n var iv = new BAOS();\n var ct = new BAOS();\n for (var i = 0; i < all.length; i++) {\n if (i < ivLen) { iv.write(all[i] & 0xff); } else { ct.write(all[i] & 0xff); }\n }\n return { iv: iv.toByteArray(), ct: ct.toByteArray() };\n}\nfunction XA_sealedDecrypt(plain) {\n var mu = plain.match(\/uk\\s*=\\s*C\\(new Uint8Array\\(\\[([\\d,\\s]+)\\]\\)\\s*,\\s*new Uint8Array\\(\\[([\\d,\\s]+)\\]\\)\\)\/);\n var ms = plain.match(\/sealed\\s*=\\s*\\[([\\s\\S]*?)\\];\/);\n if (!mu || !ms) return null;\n var a1 = mu[1].split(',').map(function (x) { return parseInt(x.trim(), 10); });\n var a2 = mu[2].split(',').map(function (x) { return parseInt(x.trim(), 10); });\n var key = XA_xorBytes(a1, a2);\n var list = ms[1].match(\/\"([A-Za-z0-9+\\\/=]{20,})\"\/g) || [];\n var lines = [];\n for (var i = 0; i < list.length; i++) {\n try {\n var all = java.base64DecodeToByteArray(list[i].replace(\/\"\/g, ''));\n var p = XA_splitIvCt(all, 12);\n lines.push(XA_gcm(key, p.iv, p.ct));\n } catch (e) {}\n }\n return lines;\n}\nfunction XA_navSites(pub) {\n var UA = 'Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/124.0.0.0 Mobile Safari\/537.36';\n var body = '';\n try {\n body = String(java.ajax(pub + ',{\"headers\":{\"User-Agent\":\"' + UA + '\"},\"retry\":2}'));\n } catch (e) { body = ''; }\n if (!body || body.length < 500) return [];\n var m = body.match(\/encodedData\\s*=\\s*'([A-Za-z0-9+\\\/=]+)'\/);\n if (!m) return [];\n var raw = '';\n try { raw = java.base64Decode(m[1]); } catch (e2) { raw = ''; }\n if (!raw || raw.indexOf('%5B') < 0 && raw.indexOf('[{') < 0) return [];\n var json = '';\n try { json = decodeURIComponent(raw); } catch (e3) { json = raw; }\n var sites = [];\n try {\n var arr = JSON.parse(json);\n for (var si = 0; si < arr.length; si++) {\n if (arr[si] && arr[si].name && arr[si].url) {\n sites.push({ name: String(arr[si].name), url: String(arr[si].url) });\n }\n }\n } catch (e4) {\n var re = \/\"name\"\\s*:\\s*\"([^\"]+)\"[\\s\\S]{0,400}?\"url\"\\s*:\\s*\"([^\"]+)\"\/g;\n var mm;\n while ((mm = re.exec(json)) !== null) {\n sites.push({ name: mm[1], url: mm[2] });\n }\n }\n return sites;\n}\nfunction XA_linesFromPub(pub) {\n var hosts = [];\n var pubs = [pub, 'https:\/\/x99dh.github.io', 'https:\/\/x99dh.lat', 'https:\/\/x99dh.net'];\n for (var i = 0; i < pubs.length && hosts.length === 0; i++) {\n if (!pubs[i]) continue;\n try {\n var sites = XA_navSites(pubs[i]);\n for (var j = 0; j < sites.length; j++) {\n var u = String(sites[j].url || '');\n if (u.indexOf('xanimu') < 0) continue;\n var mh = u.match(\/https?:\\\/\\\/([^\\\/\\s]+)\/);\n if (mh && hosts.indexOf(mh[1]) < 0) hosts.push(mh[1]);\n }\n } catch (e) {}\n }\n if (hosts.length === 0) { hosts = ['xanimu.ws', 'xanimu.art']; }\n return hosts;\n}\nfunction XA_fetchLines() {\n XA_toast('正在从发布页获取线路...');\n var pub = 'https:\/\/x99dh.com';\n try { pub = String(result['xaPub'] || '') || pub; } catch (e) {}\n if (pub.indexOf('http') !== 0) pub = 'https:\/\/' + pub.replace(\/\\\/+$\/, '');\n var lines = XA_linesFromPub(pub);\n for (var i = 0; i < lines.length; i++) {\n source.put('xaLine' + i, lines[i]);\n }\n source.put('xaLineN', String(lines.length));\n XA_toast('已获取 ' + lines.length + ' 条线路: ' + lines.join(', '));\n XA_refresh();\n}\nfunction XA_probe(host, cb) {\n var UA = 'Mozilla\/5.0 (Linux; Android 13; Pixel 7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/124.0.0.0 Mobile Safari\/537.36';\n var t0 = Date.now();\n try {\n var r = java.connect(host + '\/zh-CN\/', JSON.stringify({ 'User-Agent': UA }), 12000);\n var code = r && r.code ? r.code() : -1;\n var ms = Date.now() - t0;\n var bodyLen = 0;\n try { bodyLen = String(r.body() || '').length; } catch (e) {}\n if (code === 200 && bodyLen > 50000) { return { ok: true, ms: ms }; }\n return { ok: false, ms: ms, why: 'HTTP' + code + '\/' + bodyLen };\n } catch (e2) {\n return { ok: false, ms: Date.now() - t0, why: String(e2).substring(0, 40) };\n }\n}\nfunction XA_statusLabel() {\n var cur = XA_base();\n return '当前: ' + cur.replace('https:\/\/', '');\n}\nfunction XA_hostLabel() {\n return '主站线路(输入或点按钮切换)';\n}\nfunction XA_probeAll() {\n var hosts = [];\n try {\n var n = parseInt(String(source.get('xaLineN') || '0'), 10) || 0;\n for (var i = 0; i < n; i++) {\n var h = String(source.get('xaLine' + i) || '');\n if (h && hosts.indexOf(h) < 0) hosts.push(h);\n }\n } catch (e) {}\n if (hosts.indexOf('xanimu.ws') < 0) hosts.push('xanimu.ws');\n if (hosts.indexOf('xanimu.art') < 0) hosts.push('xanimu.art');\n XA_toast('测延时中, 共 ' + hosts.length + ' 条...');\n var best = null;\n var lines = [];\n for (var j = 0; j < hosts.length; j++) {\n var res = XA_probe('https:\/\/' + hosts[j].replace(\/^https?:\\\/\\\/\/, ''));\n var tag = res.ok ? (res.ms + 'ms') : ('✗ ' + (res.why || '失败'));\n lines.push(hosts[j] + '=' + tag);\n if (res.ok && (!best || res.ms < best.ms)) { best = { host: hosts[j], ms: res.ms }; }\n }\n source.put('xaDelay', lines.join(' | '));\n if (best) {\n source.put('xaHost', 'https:\/\/' + best.host);\n XA_toast('最快: ' + best.host + ' ' + best.ms + 'ms 已切换');\n } else {\n XA_toast('全部线路异常: ' + lines.join(' | '));\n }\n XA_refresh();\n}\nfunction XA_lineLabel(i, def) {\n var cur = XA_base().replace('https:\/\/', '');\n var lab = '';\n try { lab = String(source.get('xaLine' + i) || ''); } catch (e) {}\n if (!lab) lab = def;\n var delay = '';\n try { delay = String(source.get('xaDelay') || ''); } catch (e2) {}\n var dd = '';\n var parts = delay.split(' | ');\n for (var k = 0; k < parts.length; k++) {\n if (parts[k].indexOf(lab) === 0) { dd = parts[k].substring(lab.length + 1); break; }\n }\n var mark = lab === cur ? '●' : '○';\n var fast = '';\n if (dd && dd.indexOf('ms') > 0) {\n var num = parseInt(dd, 10);\n if (num && num < 1500) { fast = ' ⚡'; }\n }\n return mark + ' ' + lab + (dd ? ' ' + dd : '') + fast;\n}\nfunction XA_login() { return 'ok'; }\nfunction XA_pubLabel() {\n return '发布页网址(默认 x99dh.com)';\n}\nfunction login() { return 'ok'; }\n",
"respondTime": 3668,
"ruleBookInfo": {
"author": "b",
"coverUrl": "g",
"init": "@js:(function(){\nvar h=String(result);\nvar m=h.match(\/<h1[^>]*>([\\s\\S]*?)<\\\/h1>\/);\nvar name=m?m[1].replace(\/<[^>]+>\/g,'').trim():'';\nvar v=h.match(\/views-number[^>]*>[\\s\\S]{0,120}?([\\d.,]+[KM]?)[\\s\\S]{0,40}?<\\\/span>\/);\nvar d=h.match(\/duration[^>]*>([^<]+)<\/);\nvar du=h.match(\/length.:.[\\d]+ min\/);\nvar kw=h.match(\/keywords.:.\\s*([^\"']+?)\\s*.,\/);\nvar pom=h.match(\/<video[^>]*\\sposter=.[^\\s\"']+\/);\nvar de=h.match(\/<meta name=.description. content=.([^\\s\"]{10,300})\/);\nvar g='';\nif(pom){var gi=pom[0].indexOf('poster=')+8;g=pom[0].substring(gi).replace(\/[\"']+$\/,'');}\nreturn JSON.stringify({a:name,b:'xanimu',c:(kw?kw[1]:''),d:(v?v[1]:''),e:(d?d[1].trim():''),f:(de?de[1]:''),g:g,h:String(baseUrl||'')});\n})()",
"intro": "f",
"kind": "c",
"lastChapter": "e",
"name": "a",
"tocUrl": "h",
"wordCount": "d"
},
"ruleContent": {
"content": "@js:(function(){\nvar h=String(result);\nvar m=h.match(\/<video[^>]*\\ssrc=.[^\\s\"']+\\.(mp4|m3u8)[^\\s\"']*\/);\nif(!m){m=h.match(\/<source[^>]*\\ssrc=.[^\\s\"']+\\.(mp4|m3u8)[^\\s\"']*\/);}\nif(!m)return '';\nvar u=m[0];\nvar p=u.indexOf('src=');\nu=u.substring(p+5).replace(\/[\\\"']+$\/,'');\nreturn u;\n})()",
"imageStyle": "FULL"
},
"ruleExplore": {},
"ruleSearch": {
"bookList": "class.video-block",
"bookUrl": "tag.a.0@href",
"checkKeyWord": "naruto",
"coverUrl": "tag.img.0@data-src||tag.img.0@src",
"kind": "class.duration@text",
"lastChapter": "class.rating-nolike@text||class.rating@text",
"name": "class.title@text",
"wordCount": "class.views-number@text"
},
"ruleToc": {
"chapterList": "@js:(function(){var out=[];out.push(JSON.stringify({n:String(book&&book.name?book.name:'正片'),u:String(baseUrl||'')}));return out;})()",
"chapterName": "$.n",
"chapterUrl": "$.u"
},
"searchUrl": "@js:(function(){var b='https:\/\/xanimu.ws';try{var v=String(source.get('xaHost')||'');if(v.indexOf('http')===0)b=v.replace(\/\\\/+$\/,'')}catch(e){}return b+\"\/zh-CN\/{{page === 1 ? '' : '\/%E6%9C%89%E5%85%B3%E8%AF%A6%E7%BB%86%E4%BF%A1%E6%81%AF%EF%BC%8C%E8%AF%B7%E6%9F%A5%E7%9C%8B%E6%AD%A4%E9%A1%B5%E9%9D%A2%E3%80%82\/' + page + '\/'}}?s=\"+encodeURIComponent(String(key||''))+',\"retry\":2'})()",
"weight": 0
}