🎬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
}
广告