🐱Pixiv小喵

https://app-api.pixiv.net/

AHa-hahahahaha (14320)09/14 00:07

修复部分问题




为什么max版在加载有图片的章节时,


在未加载完图片的情况下翻页


不会显示“数据加载中…”阻止你翻页


而是能直接翻到下一章啊?

二维码导入
{
    "bookSourceComment": "✨ 本喵基于以下版本整合而来:\n\n⭐ 洛娅橙原版:Pixiv 小说书源的早期基础版本。\n\n⭐ 添加翻译功能的版本:由不知名人士在洛娅橙原版基础上添加了微软翻译功能,后来又被加入了商业推广广告(虽说本喵感觉是一个人干的,但本喵也没有证据嘛~)。\n\n⭐ laizhiyu 大佬修复版:修复了网络直连问题,并替换为三引擎翻译模块(必应\/腾讯\/AI),彻底解决翻译失效问题。感谢 laizhiyu 大佬的辛勤付出!\n\n⭐ 猫猫黛西(由 DeepSeek 全程代劳):基于以上版本,去除所有广告,进行了界面优化和功能调整。\n\n⚠️ 使用3.26版本,推荐阅读 lyc。\n\n🐱 本喵也不知道自己有没有把 AI 翻译功能移坏,但你要是发现了 bug,可以反馈给本喵哦~\n   不过嘛~本喵没有留下任何联系方式,嘻嘻~\n   哎呀~本喵还是心善的啦~只要你把这个书源丢给 AI,本喵自然就会出现~ ฅ(^ω^ฅ)\n\n\n感谢所有为开源做出贡献的大佬们!(ฅ´ω`ฅ)",
    "bookSourceGroup": "Pixiv",
    "bookSourceName": "🐱Pixiv小喵",
    "bookSourceType": 0,
    "bookSourceUrl": "https:\/\/app-api.pixiv.net\/",
    "bookUrlPattern": "http:\/\/localhost\/|https:\/\/www.pixiv.net\/novel\/series\/\\d{3,}",
    "concurrentRate": "3\/2000",
    "customButton": true,
    "customOrder": 3,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": true,
    "exploreUrl": "@js:\nlet banben = \"1.1.9\";\nvar curPage = (typeof page !== 'undefined') ? page : 1;\nvar obj = {\n    '动态': { key: '动态', initUrl: 'https:\/\/app-api.pixiv.net\/v1\/novel\/follow?restrict=public', fb: 0.2 },\n    '推荐': { key: '推荐', initUrl: 'https:\/\/app-api.pixiv.net\/v1\/novel\/recommended?include_privacy_policy=true&filter=for_android&include_ranking_novels=true', fb: 0.2 },\n    '追更': { key: '追更', initUrl: 'https:\/\/app-api.pixiv.net\/v1\/watchlist\/novel', fb: 0.2 },\n    '收藏·公开': { key: '收藏·公开', initUrl: (function(){var id = source.getLoginInfoMap().get('id'); return 'https:\/\/app-api.pixiv.net\/v1\/user\/bookmarks\/novel?user_id=' + id + '&restrict=public';})(), fb: 0.4, wb: 1 },\n    '收藏·私密': { key: '收藏·私密', initUrl: (function(){var id = source.getLoginInfoMap().get('id'); return 'https:\/\/app-api.pixiv.net\/v1\/user\/bookmarks\/novel?user_id=' + id + '&restrict=private';})(), fb: 0.4 },\n    'R-18·日': { key: 'R-18·日', initUrl: 'https:\/\/app-api.pixiv.net\/v1\/novel\/ranking?filter=for_android&mode=day_r18', fb: 0.2, wb: 1 },\n    'R-18·AI': { key: 'R-18·AI', initUrl: 'https:\/\/app-api.pixiv.net\/v1\/novel\/ranking?filter=for_android&mode=week_ai_r18', fb: 0.2 },\n    'R-18·周': { key: 'R-18·周', initUrl: 'https:\/\/app-api.pixiv.net\/v1\/novel\/ranking?filter=for_android&mode=week_r18', fb: 0.2 }\n};\nfunction getTagUrl(tagKey, initUrl) {\n    if (curPage == 1) {\n        var separator = initUrl.indexOf('?') === -1 ? '?' : '&';\n        var taggedUrl = initUrl + separator + '_tag=' + encodeURIComponent(tagKey);\n        return gethd(taggedUrl);\n    } else {\n        var nurlKey = 'nurl_' + tagKey;\n        var nurl = source.get(nurlKey);\n        if (nurl && nurl !== 'http:\/\/127.0.0.1') return gethd(nurl);\n        else {\n            var separator = initUrl.indexOf('?') === -1 ? '?' : '&';\n            var taggedUrl = initUrl + separator + '_tag=' + encodeURIComponent(tagKey);\n            return gethd(taggedUrl);\n        }\n    }\n}\nvar sort = [];\nfunction push(title, tagKey, initUrl, fg, wrap, fb) {\n    var url = getTagUrl(tagKey, initUrl);\n    sort.push({ \"title\": title, \"url\": url, \"style\": { layout_flexGrow: fg || 1, layout_flexBasisPercent: (fb !== undefined) ? fb : -1, layout_wrapBefore: wrap ? true : false } });\n}\nfor (var x in obj) { var item = obj[x]; push(x, item.key, item.initUrl, item.fg, item.wb, item.fb); }\nJSON.stringify(sort);",
    "header": "@js:\n(()=>{ let headers = gethd(); return JSON.stringify(headers); })();",
    "jsLib": "sleep = Packages.java.lang.Thread.sleep;\nua = 'PixivAndroidApp\/5.0.166 (Android 14; RMX3366)';\nappv = '5.0.166';\na_l = 'zh-CN';\nBUA = 'Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/131.0.0.0 Safari\/537.36';\n\nvar cacheSaveSeconds = 30*24*60*60;\nvar cacheTempSeconds = 10*60*1000;\nfunction cacheGetAndSet(key, supplyFunc, requestUpdate) {\n\ttry {\n\t\tvar entry = null;\n\t\ttry { entry = cache.getFromMemory(key); } catch(e) { entry = null; }\n\t\tif (!entry) {\n\t\t\ttry { var disk = cache.get(key); if (disk) { try { entry = JSON.parse(disk); } catch(e) { entry = null; } } } catch(e) { entry = null; }\n\t\t}\n\t\tvar now = Date.now();\n\t\tvar isExpired = entry && entry.t && (now >= entry.t + cacheTempSeconds);\n\t\trequestUpdate = requestUpdate || isExpired;\n\t\tif (!entry || requestUpdate) {\n\t\t\tvar value = null;\n\t\t\ttry { value = supplyFunc(); } catch(e) { value = null; }\n\t\t\tif (value != null && value !== '') {\n\t\t\t\tentry = {t: now, v: value};\n\t\t\t\ttry { cache.putMemory(key, entry); } catch(e) {}\n\t\t\t\ttry { cache.put(key, JSON.stringify(entry), cacheSaveSeconds); } catch(e) {}\n\t\t\t} else { return null; }\n\t\t}\n\t\treturn entry && entry.v;\n\t} catch(e) { return null; }\n}\n\nfunction pxParseSidFromBookUrl(bu) {\n    try {\n        var s = String(bu || '');\n        var bm = s.match(\/base64,([A-Za-z0-9+\/=]+)\/);\n        if (!bm) return '';\n        var b64 = bm[1];\n        var decoded = '';\n        try {\n            var bytes = Packages.java.util.Base64.getDecoder().decode(b64);\n            decoded = new Packages.java.lang.String(bytes, 'UTF-8');\n        } catch (e1) {\n            try {\n                var bytes2 = Packages.java.util.Base64.getUrlDecoder().decode(b64);\n                decoded = new Packages.java.lang.String(bytes2, 'UTF-8');\n            } catch (e2) { return ''; }\n        }\n        if (!decoded) return '';\n        var sm = decoded.match(\/[?&]_px_sid=([^&]+)\/);\n        if (sm && sm[1]) {\n            try { return decodeURIComponent(sm[1]); } catch (e) { return sm[1]; }\n        }\n        if (\/novel\\\/series\\\/(\\d+)\/.test(decoded)) return decoded.match(\/novel\\\/series\\\/(\\d+)\/)[1];\n        if (\/series_id=(\\d+)\/.test(decoded)) return decoded.match(\/series_id=(\\d+)\/)[1];\n        if (\/[?&]id=\\d+\/.test(decoded)) return '🇨🇳';\n    } catch (e) {}\n    return '';\n}\n\nbiaoq = new RegExp('^(?:NTR|NTL|修仙|奇幻|后宫|纯爱|隐奸|乱伦|乱交|母女.?|母子|父女|幼女|姐弟|人妻|正太|足交|口交|肛交|丝袜|催眠|系统|原创|续写|软饭流|修罗场|规则怪谈|女性视角|性开放世界|奸尸|冰恋|.?重口)$','i');\n\nfunction timemd5(time) {\n\tvar saltStr = time + '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c';\n\ttry { var jv = this.java || (typeof java !== 'undefined' ? java : null); if (jv && jv.md5Encode) return jv.md5Encode(saltStr); } catch(e) {}\n\tvar md = Packages.java.security.MessageDigest.getInstance(\"MD5\");\n\tmd.update(new Packages.java.lang.String(saltStr).getBytes(\"UTF-8\"));\n\tvar dg = md.digest();\n\tvar hx = '';\n\tfor (var di = 0; di < dg.length; di++) { var bv = dg[di] & 0xFF; hx += (bv < 16 ? '0' : '') + bv.toString(16); }\n\treturn hx;\n}\n\nfunction gethd(url='',ck='') {\n\tif (url && url.startsWith('http:\/\/127.')) return 'data:;base64,';\n\tconst {java, source} = this;\nlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet hash = this.timemd5(time);\nlet atk = source.getLoginHeader()||'';\nif(atk) atk = String('Bearer '+atk);\nlet headers = { 'x-client-time': time, 'User-Agent': ua, 'accept-language': a_l, 'authorization': atk, 'app-os': 'Android', 'app-os-version': 'Android 14', 'app-version': appv, 'x-client-hash': hash, 'cookie': '' };\nck!='' && (headers['cookie']=ck);\nurl=url.replace(\"app-api.pixiv.net\",\"210.140.139.155\");\nurl && (headers['host']='app-api.pixiv.net');\nif (url=='') return headers;\nelse if (url.startsWith('data')) return url;\nelse { delete headers['x-client-time']; delete headers['x-client-hash']; return url + ',' + JSON.stringify({'headers':headers}); }\n}\n\nfunction leng(str) {\n\tlet length = 0;\n\tconst fuhao = ',.?!:;()[]\"';\n\tconst fuhao2 = '📘';\n\tfor (let char of str) { if (fuhao.includes(char)) length += 0.5; else if (fuhao2.includes(char)) length += 2; else length += 1; }\n\treturn length;\n}\n\nfunction gethdi(url='') {\n\turl=url.replace(\"i.pximg.net\",\"210.140.139.133\");\n\tlet imgoptions = { headers: { 'User-Agent': 'PixivIOSApp\/5.8.0', 'accept-encoding': 'gzip, br', 'referer': 'https:\/\/app-api.pixiv.net\/', 'host': 'i.pximg.net' } };\n\treturn url+','+JSON.stringify(imgoptions);\n}\n\nfunction copy(txt) {\n\tlet htm = `data:text\/html;charset=utf-8,<html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>body{display:flex;flex-direction:column;justify-content:center;align-items:center;height:60vh;}<\/style><\/head><body><textarea id=\"copyt\" rows=\"3\">${txt}<\/textarea><br><button id=\"btn1\" onclick=\"copy()\">复制<\/button><script>document.addEventListener(\"DOMContentLoaded\",function(){const textarea=document.getElementById(\"copyt\");textarea.style.height=\"auto\";textarea.style.height=textarea.scrollHeight+\"px\";});function copy(){const cpt=document.getElementById(\"copyt\");cpt.select();document.execCommand(\"copy\");}<\/script><\/body><\/html>`;\n\tthis.java.startBrowser(htm,'复制');\n}\n\nfunction lookc(lyc) {\nconst [title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz] = lyc;\n\tlet htm = `<html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>table{width:100%;table-layout:fixed;text-align:center;margin:0 auto;word-break:break-all;}td img{width:100%;height:100%;object-fit:contain;}.cap{text-align:left;text-indent:2em;}a{text-decoration:none;}p{margin:0.2em auto;}<\/style><\/head><body><table border=\"1\" cellspacing=\"0\"><tr><th colspan=\"6\">标题:<a href=\"https:\/\/www.pixiv.net\/novel\/show.php?id=${id}\">${title}<\/a><\/th><\/tr><tr><td colspan=\"4\">作者:<a href=\"https:\/\/www.pixiv.net\/users\/${uid}\">${unm}<\/a>${ugz=='true' ? '<span style=\"font-size: 0.7em;\"> (已关注)<\/span>' : ''}<\/td><td colspan=\"2\"><img src=\"${uim}\"><\/td><\/tr>${sTitle!='' ? ('<tr><td colspan=\"6\">小说:《'+sTitle+'》'+'<\/td><\/tr>') : ''}<tr><td>喜欢<\/td><td>${xh}<\/td><td>收藏<\/td><td>${sc}<\/td><td>观看<\/td><td>${gk}<\/td><\/tr><tr><td>时间<\/td><td colspan=\"5\">${cdate}<\/td><\/tr><td>标签<\/td><td colspan=\"5\">${tags}<\/td><\/tr>${caption!='' ? ('<tr><td>简介<\/td><td class=\"cap\" colspan=\"5\">'+caption+'<\/td><\/tr>') : ''}<\/table><br><\/body><\/html>`;\nthis.java.startBrowser(`data:text\/html;charset=utf-8,${encodeURIComponent(htm)}`,'信息');\n}\n\nfunction isDarkTheme() {\n    try { return \/dark\/i.test(String(java.getThemeConfig())); } catch (e) { return false; }\n}\n\nvar PX_MAIN_JS = `var D = window.__DATA__ || {};\nvar allComments = D.comments || [];\nvar novelId = String(D.novelId || '');\nvar hasLogin = !!D.hasLogin;\nvar token = String(D.token || '');\nvar myId = String(D.myId || '');\nvar apiTime = String(D.apiTime || '');\nvar apiHash = String(D.apiHash || '');\nvar defaultTheme = String(D.theme || 'light');\nvar ua = 'PixivAndroidApp\/5.0.166 (Android 14; RMX3366)';\nvar a_l = 'zh-CN';\nvar appv = '5.0.166';\nvar currentSort = 'newest';\nfunction esc(s){ var d = document.createElement('div'); d.textContent = String(s == null ? '' : s); return d.innerHTML; }\nfunction pad(n){ return n < 10 ? '0' + n : String(n); }\nfunction fmtDate(s){ if(!s) return ''; try { var d = new Date(s); if(isNaN(d.getTime())) return String(s).slice(0,16).replace('T',' '); return d.getFullYear() + '-' + pad(d.getMonth()+1) + '-' + pad(d.getDate()) + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes()); } catch(e){ return ''; } }\nfunction buildHeaders(){ return { 'x-client-time': apiTime, 'User-Agent': ua, 'accept-language': a_l, 'authorization': 'Bearer ' + token, 'app-os': 'Android', 'app-os-version': 'Android 14', 'app-version': appv, 'x-client-hash': apiHash, 'host': 'app-api.pixiv.net' }; }\nfunction buildComment(c, isReply){ if(!c) return ''; var u = c.user || {}; var av = (u.profile_image_urls && (u.profile_image_urls.medium || u.profile_image_urls.px_50x50)) || ''; if(av) av = av.replace('i.pximg.net','pximg.hakurei.cc'); var nm = u.name || '匿名'; var dt = fmtDate(c.date || ''); var st = (c.stamp && (c.stamp.stamp_id || (c.stamp.stamp && c.stamp.stamp.stamp_id))) || ''; var cid = String(c.id || ''); var isOwn = !!(myId && u.id && String(u.id) === String(myId)); var h = ''; h += '<div class=\"comment' + (isReply ? ' reply-item' : '') + '\" data-cid=\"' + esc(cid) + '\">'; h += '<div class=\"comment-header\">'; if(av) h += '<img class=\"avatar\" src=\"' + esc(av) + '\" loading=\"lazy\" onerror=\"this.removeAttribute(&quot;src&quot;)\">'; else h += '<div class=\"avatar\"><\/div>'; h += '<span class=\"name\">' + esc(nm) + '<\/span>'; h += '<span class=\"date\">' + esc(dt) + '<\/span>'; h += '<\/div>'; if(st){ h += '<img class=\"stamp\" src=\"https:\/\/s.pximg.net\/common\/images\/stamp\/generated-stamps\/' + esc(String(st)) + '_s.jpg\" loading=\"lazy\">'; } else if(c.comment){ h += '<div class=\"content\">' + esc(c.comment) + '<\/div>'; } else { h += '<div class=\"content muted\">(表情贴图,请到 Pixiv App 查看)<\/div>'; } if(isOwn && !isReply){ h += '<div class=\"actions\"><button class=\"act-del\" data-action=\"del\" data-cid=\"' + esc(cid) + '\" aria-label=\"删除评论\"><svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"><\/polyline><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"><\/path><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"><\/line><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"><\/line><\/svg><\/button><\/div>'; } if(!isReply && c.replies && c.replies.length > 0){ var total = c.replies.length; h += '<div class=\"replies-wrap\"><div class=\"replies-list\">'; for(var i = 0; i < c.replies.length; i++){ var cls = (i >= 3) ? ' hidden-reply' : ''; h += '<div class=\"reply-container' + cls + '\">' + buildComment(c.replies[i], true) + '<\/div>'; } h += '<\/div>'; if(total > 3){ h += '<button class=\"expand-btn\" data-action=\"expand\">展开全部 ' + total + ' 条回复<\/button>'; } h += '<\/div>'; } h += '<\/div>'; return h; }\nfunction render(){ var list = document.getElementById('comment-list'); var arr = allComments.slice(); if(currentSort === 'oldest') arr.reverse(); if(!arr.length){ list.innerHTML = '<div class=\"empty\"><span class=\"icon\">💭<\/span>暂无评论<\/div>'; document.getElementById('comment-count').textContent = ''; return; } var html = ''; for(var i = 0; i < arr.length; i++) html += buildComment(arr[i], false); list.innerHTML = html; document.getElementById('comment-count').textContent = '(' + allComments.length + ')'; }\nfunction setSort(m){ currentSort = m; document.getElementById('btn-newest').classList.toggle('active', m === 'newest'); document.getElementById('btn-oldest').classList.toggle('active', m === 'oldest'); render(); }\nfunction toggleTheme(){ var c = document.body.getAttribute('data-theme') || defaultTheme; var n = c === 'dark' ? 'light' : 'dark'; document.body.setAttribute('data-theme', n); try { localStorage.setItem('comment-theme', n); } catch(e){} }\nfunction toast(msg){ var t = document.getElementById('toast'); t.textContent = msg; t.classList.add('show'); clearTimeout(t._t); t._t = setTimeout(function(){ t.classList.remove('show'); }, 2500); }\nfunction showDialog(){ if(!hasLogin || !token){ toast('请先登录'); return; } document.getElementById('dialog').classList.add('active'); setTimeout(function(){ document.getElementById('comment-input').focus(); }, 100); }\nfunction hideDialog(){ document.getElementById('dialog').classList.remove('active'); document.getElementById('comment-input').value = ''; document.getElementById('input-count').textContent = '0'; }\nfunction delComment(cid, btn){ if(!hasLogin || !token){ toast('请先登录'); return; } if(!confirm('确定删除?')) return; var url = 'https:\/\/210.140.139.155\/v1\/novel\/comment\/delete'; var body = 'comment_id=' + encodeURIComponent(cid); btn.disabled = true; if(typeof postAwait !== 'function'){ toast('组件未就绪'); btn.disabled = false; return; } postAwait(url, body, JSON.stringify(buildHeaders()), 30000).then(function(rb){ try { var r = JSON.parse(rb); if(r.error){ toast('失败:' + (r.message || '')); btn.disabled = false; } else { toast('✓ 已删除'); var it = btn.closest('.comment'); if(it) it.remove(); } } catch(e){ toast('失败:' + e); btn.disabled = false; } }).catch(function(e){ toast('失败:' + (e && e.message ? e.message : e)); btn.disabled = false; }); }\nfunction submitComment(){ if(!hasLogin || !token){ toast('请先登录'); return; } var inp = document.getElementById('comment-input'); var t = inp.value.trim(); if(!t){ toast('请输入内容'); inp.focus(); return; } if(t.length > 140){ toast('不能超过 140 字'); return; } var b = document.getElementById('submit-btn'); b.disabled = true; b.textContent = '发送中...'; if(typeof postAwait !== 'function'){ toast('组件未就绪'); b.disabled = false; b.textContent = '提交'; return; } var url = 'https:\/\/210.140.139.155\/v1\/novel\/comment\/add'; var body = 'novel_id=' + encodeURIComponent(novelId) + '&comment=' + encodeURIComponent(t); postAwait(url, body, JSON.stringify(buildHeaders()), 30000).then(function(rb){ try { var r = JSON.parse(rb); if(r.error){ toast('失败:' + (r.message || '')); } else { hideDialog(); toast('✓ 发送成功'); } } catch(e){ toast('失败:' + e); } b.disabled = false; b.textContent = '提交'; }).catch(function(e){ toast('失败:' + (e && e.message ? e.message : e)); b.disabled = false; b.textContent = '提交'; }); }\nfunction initUI(){ document.addEventListener('click', function(e){ var btn = e.target.closest('[data-action]'); if(!btn) return; var act = btn.getAttribute('data-action'); var cid = btn.getAttribute('data-cid') || ''; if(act === 'del') delComment(cid, btn); else if(act === 'sort') setSort(btn.getAttribute('data-sort') || 'newest'); else if(act === 'theme') toggleTheme(); else if(act === 'dialog') showDialog(); else if(act === 'expand'){ var w = btn.closest('.replies-wrap'); if(!w) return; var hs = w.querySelectorAll('.hidden-reply'); for(var i = 0; i < hs.length; i++) hs[i].classList.remove('hidden-reply'); btn.remove(); } }); var c = document.getElementById('btn-cancel'); if(c) c.addEventListener('click', hideDialog); var s = document.getElementById('submit-btn'); if(s) s.addEventListener('click', submitComment); var inp = document.getElementById('comment-input'); if(inp) inp.addEventListener('input', function(){ document.getElementById('input-count').textContent = inp.value.length; }); var dlg = document.getElementById('dialog'); if(dlg) dlg.addEventListener('click', function(e){ if(e.target.id === 'dialog') hideDialog(); }); try { var sv = localStorage.getItem('comment-theme'); if(sv === 'light' || sv === 'dark') document.body.setAttribute('data-theme', sv); else document.body.setAttribute('data-theme', defaultTheme); } catch(e){ document.body.setAttribute('data-theme', defaultTheme); } if(!hasLogin || !token){ var f = document.getElementById('fab'); if(f) f.classList.add('hidden'); } render(); }\nif(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', initUI); } else { initUI(); }\n`;\n\nfunction buildCommentsHtml(comments, novelId, hasLogin, token, myId, apiTime, apiHash) {\n    var dark = isDarkTheme();\n    var dataObj = { comments: comments || [], novelId: String(novelId || ''), hasLogin: !!hasLogin, token: String(token || ''), myId: String(myId || ''), apiTime: String(apiTime || ''), apiHash: String(apiHash || ''), theme: dark ? 'dark' : 'light' };\n    var dataEnc = encodeURIComponent(JSON.stringify(dataObj));\n    var codeEnc = encodeURIComponent(PX_MAIN_JS);\n    var css = '*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}body{margin:0;padding:14px;font-family:-apple-system,BlinkMacSystemFont,\"PingFang SC\",sans-serif;background:#f2f3f5;color:#1a1d23;font-size:14px;line-height:1.6;padding-bottom:88px}body[data-theme=\"dark\"]{background:#1a1a1a;color:#e8e8e8}body[data-theme=\"dark\"] .comment{background:#2b2b2b}body[data-theme=\"dark\"] .toolbar{background:#1a1a1a;border-color:#3a3a3a}body[data-theme=\"dark\"] .toolbar button{background:#2b2b2b;color:#e8e8e8}body[data-theme=\"dark\"] .replies-wrap{background:#232323}body[data-theme=\"dark\"] .dialog-box{background:#2b2b2b}body[data-theme=\"dark\"] .dialog-box textarea{background:#1f1f1f;color:#e8e8e8;border-color:#3a3a3a}body[data-theme=\"dark\"] .btn-cancel{background:#1a1a1a;color:#e8e8e8;border-color:#3a3a3a}.header{padding:0 0 6px;font-size:16px;font-weight:700;display:flex;align-items:center;gap:6px}.header .count{color:#8a8f99;font-size:13px;font-weight:400}.toolbar{position:sticky;top:-14px;margin:0 -14px;padding:8px 14px;background:#f2f3f5;display:flex;gap:6px;align-items:center;border-bottom:1px solid #ebecef;z-index:10}.toolbar button{padding:6px 14px;border:1px solid transparent;background:#fff;color:#1a1d23;border-radius:20px;font-size:12px;cursor:pointer;font-weight:600;transition:all .2s;box-shadow:0 1px 3px rgba(0,0,0,0.06)}.toolbar button.active{background:linear-gradient(135deg,#ef625a,#ff8a65);color:#fff;box-shadow:0 3px 10px rgba(239,98,90,0.35)}.toolbar .spacer{flex:1}.comment{position:relative;background:#fff;border-radius:12px;padding:12px 14px 48px 14px;margin-bottom:10px;margin-top:6px}.comment-header{display:flex;align-items:center;gap:8px;margin-bottom:8px}.avatar{width:32px;height:32px;border-radius:50%;flex:0 0 32px;background:#ebecef;object-fit:cover}.name{font-weight:600;font-size:14px}.date{color:#8a8f99;font-size:12px;margin-left:auto}.content{font-size:14px;line-height:1.65;word-break:break-word;white-space:pre-wrap}.content.muted{color:#8a8f99;font-style:italic}.stamp{max-width:120px;display:block}.empty{text-align:center;color:#8a8f99;padding:60px 20px;font-size:14px}.empty .icon{font-size:40px;display:block;margin-bottom:10px}.actions{position:absolute;right:12px;bottom:12px;margin:0;display:flex;gap:8px}.actions button.act-del{width:36px;height:36px;padding:0;border:1px solid rgba(231,76,60,0.25);border-radius:50%;background:rgba(231,76,60,0.08);color:#e74c3c;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .15s;box-shadow:0 1px 3px rgba(231,76,60,0.15)}.actions button.act-del:hover{background:rgba(231,76,60,0.18);transform:scale(1.08)}.actions button.act-del:active{transform:scale(.95)}.actions button.act-del:disabled{opacity:.5;cursor:not-allowed;transform:none}.replies-wrap{margin-top:8px;padding:8px 10px;background:#fafafa;border-radius:8px;border-left:3px solid #ef625a}.reply-item{background:transparent;padding:8px 0;margin:0;border-radius:0;border-bottom:1px dashed #ebecef;box-shadow:none;position:static}.reply-item:last-child{border-bottom:none;padding-bottom:0}.reply-item .avatar{width:26px;height:26px;flex:0 0 26px}.reply-item .name{font-size:13px}.reply-item .date{font-size:11px}.reply-item .content{font-size:13px;line-height:1.55}.hidden-reply{display:none}.expand-btn{display:block;width:100%;margin-top:6px;padding:7px;border:1px dashed #ebecef;background:transparent;color:#ef625a;border-radius:8px;font-size:12px;cursor:pointer;font-weight:500}.fab{position:fixed;right:20px;bottom:20px;width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg,#ef625a,#ff8a65);color:#fff;border:none;box-shadow:0 6px 16px rgba(239,98,90,0.4);font-size:22px;cursor:pointer;z-index:999;display:flex;align-items:center;justify-content:center;transition:all .25s}.fab.hidden{display:none}.dialog{position:fixed;inset:0;background:rgba(0,0,0,0.5);display:none;align-items:center;justify-content:center;z-index:1000}.dialog.active{display:flex}.dialog-box{background:#fff;border-radius:14px;padding:18px;width:88%;max-width:420px;box-shadow:0 8px 24px rgba(0,0,0,0.3)}.dialog-title{font-size:16px;font-weight:700;margin-bottom:12px}.dialog-box textarea{width:100%;min-height:100px;padding:10px;box-sizing:border-box;border:1px solid #ebecef;border-radius:8px;background:#fff;color:#1a1d23;font-size:14px;resize:vertical;font-family:inherit;outline:none}.dialog-hint{font-size:11px;color:#8a8f99;margin-top:4px;text-align:right}.dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:14px}.dialog-actions button{padding:10px 24px;border-radius:12px;border:none;font-size:14px;font-weight:600;cursor:pointer}.btn-cancel{background:#f2f3f5;color:#1a1d23;border:1px solid #ebecef}.btn-submit{background:linear-gradient(135deg,#ef625a,#ff8a65);color:#fff;box-shadow:0 3px 10px rgba(239,98,90,0.3)}.btn-submit:disabled{opacity:.5;cursor:not-allowed}.toast{position:fixed;top:20px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,.8);color:#fff;padding:10px 16px;border-radius:8px;font-size:13px;z-index:2000;opacity:0;transition:opacity .3s;pointer-events:none;max-width:80%;text-align:center}.toast.show{opacity:1}#js-error{color:#e74c3c;padding:20px;font-size:13px;display:none;line-height:1.6}';\n    var body = '<div class=\"header\">💬 评论 <span class=\"count\" id=\"comment-count\"><\/span><\/div><div class=\"toolbar\"><button id=\"btn-newest\" class=\"active\" data-action=\"sort\" data-sort=\"newest\">🕐 最新<\/button><button id=\"btn-oldest\" class=\"active\" data-action=\"sort\" data-sort=\"oldest\">🕰 最早<\/button><span class=\"spacer\"><\/span><button id=\"btn-theme\" data-action=\"theme\">🌓<\/button><\/div><div id=\"comment-list\"><\/div><div id=\"js-error\"><\/div><button class=\"fab\" id=\"fab\" data-action=\"dialog\">✏️<\/button><div class=\"dialog\" id=\"dialog\"><div class=\"dialog-box\"><div class=\"dialog-title\">发表评论<\/div><textarea id=\"comment-input\" maxlength=\"140\" placeholder=\"说点什么吧...\"><\/textarea><div class=\"dialog-hint\"><span id=\"input-count\">0<\/span>\/140<\/div><div class=\"dialog-actions\"><button class=\"btn-cancel\" id=\"btn-cancel\">取消<\/button><button class=\"btn-submit\" id=\"submit-btn\">提交<\/button><\/div><\/div><\/div><div class=\"toast\" id=\"toast\"><\/div>';\n    var bootstrap = '<script id=\"px-data\" type=\"text\/plain\">' + dataEnc + '<\\\/script><script id=\"px-code\" type=\"text\/plain\">' + codeEnc + '<\\\/script><script>(function(){try{var dr=decodeURIComponent(document.getElementById(\"px-data\").textContent);var cr=decodeURIComponent(document.getElementById(\"px-code\").textContent);window.__DATA__=JSON.parse(dr);(new Function(cr))();}catch(e){var el=document.getElementById(\"js-error\");if(el){el.style.display=\"block\";el.textContent=\"⚠️ \"+e.message;}}})();<\\\/script>';\n    return '<!DOCTYPE html><html lang=\"zh-CN\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no\"><title>评论<\/title><style>' + css + '<\/style><\/head><body>' + body + bootstrap + '<\/body><\/html>';\n}\n\nfunction fetchReplies(commentId) {\n    const {java, cache, source} = this;\n    var url = 'https:\/\/app-api.pixiv.net\/v1\/novel\/comment\/replies?comment_id=' + commentId + '&offset=0&limit=30';\n    try {\n        var resp = java.ajax(gethd.call(this, url));\n        if (!resp) return [];\n        var data = JSON.parse(resp);\n        if (data.error) return [];\n        return data.replies || [];\n    } catch(e) {\n        try { java.log('获取回复失败 comment_id=' + commentId + ':' + e); } catch(e2) {}\n        return [];\n    }\n}\n\nfunction showComments(overrideNovelId) {\n    const {java, cache, source} = this;\n    var novelId = String(overrideNovelId || '');\n    if (!novelId) { try { novelId = String(cache.get('pxid') || ''); } catch (e) {} }\n    if (!novelId) { try { java.longToast('请先刷新正文再查看评论'); } catch (e) {} return; }\n    try { java.toast('💬 正在加载评论...'); } catch (e) {}\n    var url = 'https:\/\/app-api.pixiv.net\/v1\/novel\/comments?novel_id=' + novelId + '&offset=0&limit=30';\n    var resp = '';\n    try { resp = java.ajax(gethd.call(this, url)); } catch (e) { try { java.longToast('评论获取失败:' + e); } catch (e2) {} return; }\n    if (!resp) { try { java.longToast('评论为空'); } catch (e) {} return; }\n    var data = null;\n    try { data = JSON.parse(resp); } catch (e) { data = null; }\n    if (!data) { try { java.longToast('评论解析失败'); } catch (e) {} return; }\n    if (data.error) { try { java.longToast('评论获取失败:' + (data.message || '未登录')); } catch (e) {} return; }\n    var comments = data.comments || [];\n    var payload = [];\n    var replyBudget = 5;\n    for (var i = 0; i < comments.length; i++) {\n        var c = comments[i];\n        var item = { id: c.id, comment: c.comment, date: c.date, user: c.user, has_replies: c.has_replies, stamp: c.stamp, replies: [] };\n        if (c.has_replies && replyBudget > 0) { var replies = fetchReplies.call(this, c.id); if (replies && replies.length > 0) { item.replies = replies; } replyBudget--; }\n        payload.push(item);\n    }\n    var atk = '';\n    try { atk = String(source.getLoginHeader() || ''); } catch (e) { atk = ''; }\n    var hasLogin = !!atk;\n    var myId = '';\n    try { myId = String(source.getLoginInfoMap().get('id') || ''); } catch (e) { myId = ''; }\n    var _d = new Date();\n    function _pad(n) { return (n < 10 ? '0' : '') + n; }\n    var apiTime = _d.getUTCFullYear() + '-' + _pad(_d.getUTCMonth() + 1) + '-' + _pad(_d.getUTCDate()) + 'T' + _pad(_d.getUTCHours()) + ':' + _pad(_d.getUTCMinutes()) + ':' + _pad(_d.getUTCSeconds()) + '+00:00';\n    var apiHash = '';\n    try { apiHash = String(timemd5.call(this, apiTime)); } catch (e) { apiHash = ''; }\n    var html = buildCommentsHtml.call(this, payload, novelId, hasLogin, atk, myId, apiTime, apiHash);\n    var config = JSON.stringify({ state: 3, heightPercentage: 0.85, widthPercentage: 1, isDraggable: true, skipCollapsed: true, expandedCornersRadius: 16, backgroundDimAmount: 0.4, dismissOnTouchOutside: true });\n    var preloadJs = 'try{window.java=java;}catch(e){};try{window.run=run;}catch(e){};try{window.postAwait=postAwait;}catch(e){};try{window.ajaxAwait=ajaxAwait;}catch(e){};try{window.getAwait=getAwait;}catch(e){};';\n    try { java.showBrowser('https:\/\/app-api.pixiv.net\/', html, preloadJs, config); }\n    catch (e) { try { java.startBrowser('data:text\/html;charset=utf-8,' + encodeURIComponent(html), '评论'); } catch (e2) { try { java.longToast('评论打开失败:' + e); } catch (e3) {} } }\n}\n\nvar util={open(url,title,msg){if(msg){this.java.longToast(\"\\n\"+msg);this.sleep(300)}url&&this.java.startBrowser(url,title||\"\")},getMaxLen(texts,max){max=max||5E4;for(var len=0,all=0;len<texts.length;len++)if(len>1E3||(all+=texts[len].Text.length)>max){len--;break}return len},splitByMaxLenAdjustLines(str,maxLen){const parts=[];let remaining=str;maxLen=maxLen||5E4;while(remaining.length>maxLen){let part=remaining.slice(0,maxLen);let rest=remaining.slice(maxLen);let lastNewlineIndex=part.lastIndexOf(\"\\n\");if(lastNewlineIndex===-1){parts.push(part);remaining=rest}else{let firstPart=part.slice(0,lastNewlineIndex+1);let movedPart=part.slice(lastNewlineIndex+1);parts.push(firstPart);remaining=movedPart+rest}}remaining.length>0&&parts.push(remaining);return parts},api:{auth:\"https:\/\/edge.microsoft.com\/translate\/auth\",translate:\"https:\/\/api.cognitive.microsofttranslator.com\/translate?from\\x3d{from}\\x26to\\x3d{to}\\x26api-version\\x3d3.0\"},isJa:(str,n)=>\/[\\u30a1-\\u30f6\\u3041-\\u3093\\uff66-\\uff9d\\uff9e\\uff9f][\\u30a1-\\u9fa5]\/.test((n=n||100)>0?String(str).substring(0,n):str),isEn:(str,n)=>!\/[\\u30a1-\\u30f6\\u3041-\\u3093\\uff66-\\uff9d\\uff9e\\uff9f\\u4e00-\\u9fa5]{2}\/.test((n=n||100)>0?String(str).substring(0,n):str),noZh:(k,n)=>{n=n||100;if(util.isJa(k,n)){util.lang_zh=\"\\u65e5\\u8bed\";util.lang=\"ja\";return true}else if(util.isEn(k,n)){util.lang_zh=\"\\u82f1\\u8bed\";util.lang=\"en\";return true}else return false},fixImg(str){let obj={\"\\uff1a\":\":\",\"\\uff0c\":\",\",\"\\u201c\":'\"',\"\\u201d\":'\"'};return str.replace(\/<img .+>\/g,$=>$.replace(\/[\\u201c\\u201d\\uff1a\\uff0c]\/g,x=>obj[x]))},objfy:(x,y,z)=>JSON.stringify(x,y||null,z||2),getAuth(isNew){const {cache,java}=this;if(!isNew){var auth=cache.getFromMemory(\"auth\");if(auth){let t=+auth.slice(0,13),k=auth.slice(14);if(k&&Date.now()-t<6E5)return k}}auth=java.ajax(util.api.auth)+\"\";cache.putMemory(\"auth\",`${Date.now()}#${auth}`);return auth},filterReg:\/^[\\x00-@\\[-`{-~\\uff01-\\uff20]+$|^\\s*[\\x00-\\u2e7f]\\s*$\/,logProp(ox){let obj={};Object.keys(ox).forEach(x=>{let v=ox[x];if(typeof v===\"function\"){v=v.toString();try{obj[x]=[v,ox[x]()]}catch{obj[x]=v}}else obj[x]=v});this.java.log(JSON.stringify(obj,null,2))},\nbingCred(){const{java}=this;let h=String(java.get(\"https:\/\/cn.bing.com\/translator\",{\"User-Agent\":BUA}).body());let ig=h.match(\/IG:\"([A-Za-z0-9]{32})\"\/),ap=h.match(\/params_AbusePreventionHelper\\s*=\\s*\\[([^\\]]+)\\]\/);if(!ig||!ap)throw\"必应凭据获取失败\";let p=ap[1].split(\",\");return{ig:ig[1],key:p[0].replace(\/[\"\\s]\/g,\"\"),tk:p[1].replace(\/[\"\\s]\/g,\"\")}},bingT(texts,from){const{java}=this;let c=util.bingCred.call(this),out=[];for(let i=0;i<texts.length;i++){var tx=\"\";if(texts[i])for(let t=0;t<2&&!tx;t++){try{tx=JSON.parse(String(java.post(\"https:\/\/cn.bing.com\/ttranslatev3?isVertical=1&&IG=\"+c.ig+\"&IID=translator.5027\",\"fromLang=\"+((from||util.lang)===\"en\"?\"en\":\"ja\")+\"&to=zh-Hans&text=\"+encodeURIComponent(texts[i])+\"&token=\"+c.tk+\"&key=\"+c.key+\"&tryFetchingGenderDebiasedTranslations=true\",{\"content-type\":\"application\/x-www-form-urlencoded\",\"referer\":\"https:\/\/cn.bing.com\/translator\",\"x-requested-with\":\"XMLHttpRequest\",\"User-Agent\":BUA}).body()))[0].translations[0].text}catch(e){tx=\"\"}if(!tx){if(t)tx=texts[i];else{sleep(700);c=util.bingCred.call(this)}}}out.push(tx||texts[i]);if(i<texts.length-1)sleep(120)}return out},\ntxT(texts,from){const{java,source}=this;let lgm=source.getLoginInfoMap(),msKey=util.lgKey(lgm,\"微软密钥\").replace(\/\\s\/g,\"\");let to=\"zh\";if(msKey.length>10){let result=[];for(let i=0;i<texts.length;){let batch=[];let total=0;while(i<texts.length&&batch.length<50&&(total+=texts[i].length)<=20000){batch.push({Text:texts[i]});i++}let reqBody=JSON.stringify(batch);let r=java.post(\"https:\/\/api.cognitive.microsofttranslator.com\/translate?api-version=3.0&to=\"+to,reqBody,{\"content-type\":\"application\/json\",\"Ocp-Apim-Subscription-Key\":msKey});let j=JSON.parse(String(r.body()));for(let k=0;k<j.length;k++)result.push(j[k].translations[0].text)}return result}let result=[];for(let i=0;i<texts.length;){let batch=[];let total=0;while(i<texts.length&&batch.length<8&&(total+=texts[i].length)<=4000){batch.push(texts[i]);i++}let reqBody=JSON.stringify({header:{fn:\"auto_translation\",session:\"\",client_key:\"browser-chromium-131.0.0.0\"},type:\"plain\",model_category:1,text_domain:0,source:{lang:(from||\"ja\"),text_list:batch},target:{lang:\"zh\"}});let r=java.post(\"https:\/\/transmart.qq.com\/api\/imt\",reqBody,{\"content-type\":\"application\/json\",\"referer\":\"https:\/\/transmart.qq.com\/\"});let j=JSON.parse(String(r.body()));if(j.header.ret_code==\"succ\"&&j.auto_translation&&j.auto_translation.length==batch.length){result=result.concat(j.auto_translation)}else{for(let k=0;k<batch.length;k++){let mm=java.ajax(\"https:\/\/api.mymemory.translated.net\/get?q=\"+encodeURIComponent(batch[k])+\"&langpair=\"+((from||util.lang)===\"en\"?\"en\":\"ja\")+\"|zh-CN\");let mj=JSON.parse(mm);result.push(mj.responseData?mj.responseData.translatedText:batch[k])}}}return result},\naiT(texts,from){const{java,source}=this;let m=source.getLoginInfoMap(),au=util.lgKey(m,\"AI接口地址\"),ak=util.lgKey(m,\"AI密钥\"),am=util.lgKey(m,\"AI模型\");if(!au)throw\"AI翻译未配置:请先在登录界面填写「AI接口地址」,再点「AI翻译测试」验证\";if(!ak)java.toast(\"@⚠️未填写AI密钥:部分平台(如opencode)无需token可直接使用,若你的平台需要凭据请到登录界面填写「AI密钥」\");if(!am)am=\"gpt-4o-mini\";let u=au.replace(\/\\\/+$\/,\"\");if(!\/\\\/chat\\\/completions$\/.test(u))u+=\/\\\/v\\d+$\/.test(u)?\"\/chat\/completions\":\"\/v1\/chat\/completions\";let srcLang=(from||util.lang)===\"en\"?\"英语\":\"日语\",out=[];for(let i=0;i<texts.length;i++){var tx=\"\";if(texts[i])for(let t=0;t<2&&!tx;t++){try{let body=JSON.stringify({model:am,temperature:0.2,messages:[{role:\"system\",content:\"你是专业的小说翻译引擎。用户提供的文本是\"+srcLang+\"原文,请精准翻译成**简体中文**。严格规则:(1)只输出简体中文译文本身;(2)禁止任何解释、注释、拼音、原文片段或引号包装;(3)必须保留原文的换行与段落结构;(4)若原文已是中文则原样返回;(5)禁止把目标语言写成日文\/英文\/任何非中文语言。\"},{role:\"user\",content:texts[i]}]});let hd={\"content-type\":\"application\/json\",\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 14)\"};if(ak)hd.authorization=\"Bearer \"+ak;let j=JSON.parse(String(java.post(u,body,hd,120000).body()));let c=j.choices&&j.choices[0]&&j.choices[0].message&&j.choices[0].message.content;tx=c?String(c).replace(\/^\\s+|\\s+$\/g,\"\"):\"\";if(!tx)throw j.error&&j.error.message||\"空响应\";var _k=(tx.match(\/[\\u3040-\\u309f\\u30a0-\\u30ff]\/g)||[]).length;if(srcLang===\"日语\"&&_k>0&&_k\/tx.length>0.25){java.log(\"AI译文仍以日文为主(\"+_k+\"\/\"+tx.length+\"):\"+tx.substring(0,40));throw \"译文中日文占比过高\"}}catch(e){tx=\"\";if(t)java.log(\"AI翻译第\"+(i+1)+\"段失败:\"+e);else sleep(900)}}out.push(tx||texts[i]);if(i<texts.length-1)sleep(150)}return out},\naiTest(){try{let r=util.aiT.call(this,[\"これはAI翻訳の接続テストです。こんにちは、世界。\"],\"ja\");this.java.longToast(\"🤖 翻译测试成功!\\n\\n\" + r[0])}catch(e){this.java.longToast(\"❌ 翻译测试失败\\n\\n原因:\" + e + \"\\n\\n排查:\\n① AI接口地址 如 https:\/\/api.deepseek.com (无需\/v1,自动补全)\\n② AI密钥 sk-开头(可选:需凭据的平台才填,opencode等免token平台留空)\\n③ AI模型名如 gpt-4o-mini \/ deepseek-chat\\n④ 手机网络能否直连该服务\")}},\ntranslateTexts(_texts,option){const {java,source}=this;try{option=option||{};let {from,to}=option;var texts=_texts;if(typeof texts===\"string\"){if(texts.length<10&&!util.filterReg.test(texts))return[texts];texts=util.splitByMaxLenAdjustLines(texts,2000)}if(!(texts&&texts.length))throw\"Invalid input!\";to=(to==\"zh-hans\"||to==\"zh-CN\"||to==\"zh\"||!to)?\"zh\":to;var teng=source.get(\"teng\")+\"\";if(teng===\"ai\")return util.aiT.call(this,texts,from);if(teng===\"tx\")return util.txT.call(this,texts,from);return util.bingT.call(this,texts,from)}catch(e){e=\"@\\u7ffb\\u8bd1\\u5931\\u8d25\\uff1a\\n\"+e;java.log(e);java.toast(e);return typeof _texts===\"string\"?[_texts]:(_texts&&_texts.length?_texts.slice():[])}},\nlgKey(m,pre){try{if(!m)return\"\";var ks=null;try{if(m.keySet){var it=m.keySet().iterator();ks=[];while(it.hasNext())ks.push(String(it.next()))}else ks=Object.keys(m)}catch(e){ks=Object.keys(m)}if(!ks||!ks.length)return\"\";for(var i=0;i<ks.length;i++){var k=String(ks[i]);if(k.indexOf(pre)===0){var v=\"\";try{v=String(m.get?(m.get(k)||\"\"):(m[k]||\"\"))}catch(e2){v=String(m[k]||\"\")}v=v.replace(\/^\\s+|\\s+$\/g,\"\");if(v)return v}}}catch(e){}return\"\"},\nxq_trans(){const {java,book}=this;if(String(book.intro||'').indexOf('<useweb>')>=0){try{var v0=this.getTrans();if(v0!==0&&util.noZh(book.name)){var a0=util.translateTexts.call(this,[book.name],{});if(a0&&a0[0])book.name=a0[0];java.put(\"lang\",util.lang);}}catch(eR){}return}let val=this.getTrans();if(val!==0){let needTag=this.source.get(\"bq\")!='0';let intro=needTag?String(book.intro).replace(\/^\\s*#.*\\n\\s*\/,\"\"):book.intro+\"\";let ks=intro.split(\/\\n\\s*\/);if(needTag){var tags=(java.get(\"tags\")+\"\").replace(\/^\\[|\\]$\/g,\"\").split(\/,\\s*\/).join(\"\\uff0c\");ks.unshift(tags)}ks.unshift(book.name,book.author);if(util.noZh(intro+book.name)){let start=needTag?3:2;let arr=this.translate(ks,{start:start});let tagStr=needTag?`\\u6807\\u7b7e(\\u8bd1)\\uff1a#${arr[2].replace(\/\\uff0c\/g,\" #\")}\\n\\u539f\\u6807\\u7b7e\\uff1a#${tags.replace(\/\\uff0c\/g,\" #\")}\\n`:\"\";book.name=arr[0];book.intro=`\\u3000\\u3000\\u7ffb\\u8bd1\\uff1a\\u6a21\\u5f0f${val}\\u3001${util.lang_zh}\\n\\u539f\\u6807\\u9898\\uff1a${ks[0]}\\n\\u4f5c\\u8005(\\u8bd1)\\uff1a${arr[1]}\\n${tagStr}${\"\\u2014\".repeat(24)}\\n${arr.slice(start).join(\"\\n\").replace(\/\\uff1a\\\/\/g,\":\/\")}`.replace(\/\\n\\s*\/g,\"$\\x26\\u3000\\u3000\");java.put(\"lang\",util.lang)}}},\nmulu_trans(list){list=list||this.result;const {java}=this;if(java.get(\"sid\")!=\"\\ud83c\\udde8\\ud83c\\uddf3\"&&java.get(\"lang\")+\"\")if(list.length>0){let titles=Array.from(list,x=>x.title);let ts=this.translate(titles,{forced:1});Array.from(list,(x,i)=>{x.title=ts[i]||x.title})}return list},tihuan_trans(str){str=str||this.result;str=util.noZh(str)?util.fixImg(this.translate(str)):str;return str}};\n\nfunction translate(str,option){str=str||this.result;let val=this.getTrans();let isStr=!!str.split;let fn=util.translateTexts.bind(this);if(option&&option.forced||val==1)var res=fn(str,option);else if(val==0)return isStr?str:str.join(\"\\n\");else if(val==2){let arr=isStr?str.split(\"\\n\"):str;res=fn(arr,option);for(let i=option&&option.start||0,n=res.length;i<n;i++){let x=res[i];res[i]=\/^<img .+>$\/.test(x)?arr[i]:`${arr[i]}${x.length>6?\"\\n\":\"\"}\\ud83d\\udd04\\ufe0f${x}`}}return isStr?res.join(\"\\n\"):res}\n\nfunction getTrans(){let s=this.source.get(\"trans\")+\"\";if(s===\"\"){this.source.put(\"trans\",0);return 0}return isNaN(s=+s)?0:s}\n\nfunction checkOverAccess() {\n    const {java, cache, source} = this;\n    let lastCheck = cache.get('overAccessCheckTime');\n    let now = Date.now();\n    if (lastCheck && (now - lastCheck) < 4*60*60*1000) return;\n    cache.put('overAccessCheckTime', now);\n    try {\n        let url = 'https:\/\/www.pixiv.net\/rpc\/index.php?mode=latest_message_threads2&num=5&lang=zh';\n        let resp = java.ajax(gethd(url));\n        if (!resp) return;\n        let data = JSON.parse(resp);\n        if (data.error) return;\n        let threads = data.body.message_threads || [];\n        let msg = threads.find(item => item.thread_name === 'pixiv事務局');\n        if (msg && (now - msg.modified_at*1000) < 3*24*60*60*1000) {\n            let time = new Date(msg.modified_at*1000);\n            let timeStr = time.toLocaleString();\n            java.longToast(`⚠️ 您于 ${timeStr} 触发 Pixiv 过度访问,请修改密码并重新登录。`);\n        }\n    } catch(e) {}\n}\n\nfunction pxOauth(postBody) {\n\tconst {java} = this;\n\tlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\n\tlet hash = timemd5(time);\n\tlet req = 'POST \/auth\/token HTTP\/1.1\\r\\nHost: oauth.secure.pixiv.net\\r\\n'+'User-Agent: '+ua+'\\r\\n'+'content-type: application\/x-www-form-urlencoded\\r\\n'+'x-client-time: '+time+'\\r\\nx-client-hash: '+hash+'\\r\\n'+'accept-language: '+a_l+'\\r\\napp-os: Android\\r\\napp-os-version: Android 14\\r\\napp-version: '+appv+'\\r\\n'+'Content-Length: '+postBody.length+'\\r\\nConnection: close\\r\\n\\r\\n'+postBody;\n\tlet sf = Packages.javax.net.ssl.SSLSocketFactory.getDefault();\n\tlet ips = ['210.140.139.155','210.140.139.152','210.140.139.158','210.140.139.161'];\n\tlet sock = null, lastErr = '';\n\tfor (let i = 0; i < ips.length; i++) {\n\t\ttry {\n\t\t\tlet addr = Packages.java.net.InetAddress.getByName(ips[i]);\n\t\t\tsock = sf.createSocket(addr, 443);\n\t\t\tsock.setSoTimeout(12000);\n\t\t\tlet os = sock.getOutputStream();\n\t\t\tos.write(new Packages.java.lang.String(req).getBytes('UTF-8'));\n\t\t\tos.flush();\n\t\t\tlet rd = new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(sock.getInputStream(),'UTF-8'));\n\t\t\tlet sb = new Packages.java.lang.StringBuilder();\n\t\t\tlet line;\n\t\t\twhile ((line = rd.readLine()) != null) { sb.append(line); sb.append('\\n'); }\n\t\t\treturn String(sb.toString());\n\t\t} catch(e) { lastErr = e; try { if (sock != null) sock.close(); } catch(e2) {} }\n\t}\n\tthrow lastErr == '' ? 'oauth直连失败:无可用IP' : lastErr;\n}",
    "lastUpdateTime": "1789315654251",
    "loginCheckJs": "if (result.code() == 400) {\n\tsource.login();\n\tsleep(500);\n\tlet url = gethd(result.url());\n\tresult = java.connect(url);\n\t}\nif (result.code() == 200) {\n    checkOverAccess();\n}\nresult",
    "loginUi": "[ \n     {\n        name: \"下载pixEz(支持插画、回复评论等)\",\n        type: \"button\",\n        action: \"https:\/\/gh-proxy.org\/https:\/\/github.com\/Notsfsssf\/pixez-flutter\",\n        \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1 }\n    },\n    { name: \"token\", type: \"text\" },\n    { name: \"token说明\", type: \"button\", action: \"java.longToast(`\\ntoken说明:\\n填写该值后点击右上角√进行登录\\n可以通过获取token按钮得到(不需要跳转app)\\n阅读正式版无法支持获取token功能`);\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"获取token\", type: \"button\", action: \"Login()\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"id\", type: \"text\" },\n    { name: \"id说明\", type: \"button\", action: \"java.longToast(`\\nid说明:\\n登录时该值为空会自动填写该值,这是登录账号的ID(可手动更改)。\\n发现页的收藏分类加载的该ID的收藏`);\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2 } },\n    { name: \"搜索说明\", type: \"button\", action: \"java.longToast(`\\n搜索说明:\\n默认使用关键词搜索\\n输入小说id号显示对应的小说\\n输入“正文@许斌”搜索正文含许斌的小说\\n输入“作者@69559022”搜索指定id作者的书\\n输入“@作者名”搜索该作者的作品(优先精确匹配,区分大小写)`);\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2 } },\n    { name: \"书名\", type: \"text\" },\n    { name: \"↑追更该书\", type: \"button\", action: \"scz(3)\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": -1 } },\n    { name: \"复制id\", type: \"button\", action: \"fuzhi(2)\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.2 } },\n    { name: \"取消追更\", type: \"button\", action: \"scz(30)\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": -1 } },\n    { name: \"章节\", type: \"text\" },\n    { name: \"↑收藏该章\", type: \"button\", action: \"scz(1,'public')\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"取消收藏\", type: \"button\", action: \"scz(10)\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"↑私密收藏\", type: \"button\", action: \"scz(1,'private')\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"详情\", type: \"button\", action: \"caption()\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"作者\", type: \"text\" },\n    { name: \"↑关注作者\", type: \"button\", action: \"scz(2)\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"取消关注\", type: \"button\", action: \"scz(20)\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"↑私密关注\", type: \"button\", action: \"scz(2,'private')\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4, \"layout_wrapBefore\": true } },\n    { name: \"复制id\", type: \"button\", action: \"fuzhi(1)\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"购买token\", type: \"button\", action: \"java.longToast('喵~购买链接被本喵挠掉啦!请勿轻信任何购买渠道,保护好你的小钱钱(๑•̀ㅂ•́)و✧')\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 1 } },\n    { name: \"查看设置\", type: \"button\", action: \"showSettings()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"(ฅ´ω`ฅ)\", type: \"button\", action: \"showCatBlessing()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"🖼️图片显示\", type: \"button\", action: \"toggleImg()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"🔢补充序号\", type: \"button\", action: \"xvhao()\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"📝简介标签\", type: \"button\", action: \"biaoqian()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"📄章首描述\", type: \"button\", action: \"toggleCaption()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"🎀分割线式\", type: \"button\", action: \"cycleDividerStyle()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"😊表情显示\", type: \"button\", action: \"toggleEmoji()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"🔊注音替换\", type: \"button\", action: \"toggleRuby()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"📐特殊语法\", type: \"button\", action: \"toggleSyntax()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"📘书名标识\", type: \"button\", action: \"gongcun()\", style: { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"📖按钮说明\", type: \"button\", action: \"showButtonHelp()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"书源介绍\", type: \"button\", action: \"showSourceIntro()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"微软密钥(Azure·仅腾讯模式生效)\", type: \"text\" },\n    { name: \"AI接口地址(OpenAI兼容)\", type: \"text\" },\n    { name: \"AI密钥(OpenAI兼容·可选)\", type: \"text\" },\n    { name: \"AI模型(OpenAI兼容·选填)\", type: \"text\" },\n    { name: \"🌐翻译模式\", type: \"button\", action: \"changeTrans()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"🤖翻译测试\", type: \"button\", action: \"util.aiTest.call(this)\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"🔁翻译引擎\", type: \"button\", action: \"changeEng()\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"📖翻译说明\", type: \"button\", action: \"java.longToast(`\\n自动翻译日语\/英语为简体中文。\\n\\n【模式】点「🌐翻译模式」循环切换:关闭(默认) → 自动识别 → 对照显示。\\n\\n【引擎】点「🔁翻译引擎」循环切换:\\n🟢必应翻译:免密钥、国内直连,开箱即用;\\n🔵腾讯TranSmart:填了「微软密钥」就走 Azure 官方通道,质量更稳;没填密钥则走腾讯自有引擎(失败自动降级 MyMemory);\\n🤖AI大模型:OpenAI 兼容接口,需填「AI接口地址」(如 https:\/\/api.deepseek.com ,\/v1 自动补全),「AI密钥」可选(部分平台免token),「AI模型」选填默认 gpt-4o-mini。\\n\\n填完 AI 配置请点「🤖翻译测试」验证连通性。\\n\\n本喵不知道ai翻译功能被没被咱移坏 \\n╮(︶﹏︶)╭`)\", \"style\": { \"layout_flexGrow\": 1, \"layout_flexBasisPercent\": 0.4 } },\n    { name: \"屏蔽标签\", type: \"text\" }\n]",
    "loginUrl": "function gongcun() {let gc = source.get('gc');if(gc!='0') {source.put('gc','0');java.toast('⚫已关闭\\n不会添加📘');}else {source.put('gc','1');java.toast('🟢已开启\\n书名开头会有📘符号');}}\nfunction xvhao() {let xh = source.get('xh');if(xh!='0') {source.put('xh','0');java.toast('⚫已关闭\\n不会补充序号');}else {source.put('xh','1');java.toast('🟢已开启\\n会自动补充章节名序号');}}\nfunction biaoqian() {let bq = source.get('bq');if(bq!='0') {source.put('bq','0');java.toast('⚫已关闭\\n不会显示简介标签');}else {source.put('bq','1');java.toast('🟢已开启\\n会在简介显示作品标签');}}\nfunction toggleImg() {let mode = source.get('imgMode') + '';if (mode === '' || mode === 'show') {source.put('imgMode', 'hide');java.toast('⚫ 关闭');} else if (mode === 'hide') {source.put('imgMode', 'link');java.toast('🔗 链接');} else {source.put('imgMode', 'show');java.toast('🟢 显示');}java.reLoginView();}\nfunction toggleCaption() {let val = source.get('showCaption');if (val != '0') {source.put('showCaption', '0');java.toast('⚫ 已关闭章首描述');} else {source.put('showCaption', '1');java.toast('🟢 已开启章首描述');}java.reLoginView();}\nfunction toggleRuby() {let val = source.get('rubyReplace');if (val != '0') {source.put('rubyReplace', '0');java.toast('⚫ 已关闭注音替换\\n本喵也不知道有什么用哦~ 想看效果的话,再点一次开启就好啦!');} else {source.put('rubyReplace', '1');java.toast('🟢 已开启注音替换\\n本喵也不知道有什么用哦~ 你自己试试看就知道啦!(ฅ´ω`ฅ)');}java.reLoginView();}\nfunction toggleEmoji() {let val = source.get('showEmoji');if (val != '0') {source.put('showEmoji', '0');java.toast('⚫ 已关闭表情\/印章显示\\n本喵也不知道有什么用哦~ 想看效果的话,再点一次开启就好啦!');} else {source.put('showEmoji', '1');java.toast('🟢 已开启表情\/印章显示\\n本喵也不知道有什么用哦~ 你自己试试看就知道啦!(ฅ´ω`ฅ)');}java.reLoginView();}\nfunction toggleSyntax() {let val = source.get('showSyntax');if (val != '0') {source.put('showSyntax', '0');java.toast('⚫ 已关闭特殊语法补充\\n本喵也不知道有什么用哦~ 想看效果的话,再点一次开启就好啦!');} else {source.put('showSyntax', '1');java.toast('🟢 已开启特殊语法补充([chapter:][jump:][[jumpuri:]]等)\\n本喵也不知道有什么用哦~ 你自己试试看就知道啦!(ฅ´ω`ฅ)');}java.reLoginView();}\nfunction cycleDividerStyle() {let mode = parseInt(source.get('dividerMode'));if (isNaN(mode)) mode = 3;let styles = ['','━━━━━━━━━━━━━━━━','━━━ (=^・^=) ━━━ ( =^・^= ) ━━━','━━━ ฅ(^ω^ฅ) ━━━ ฅ(^ω^ฅ) ━━━','—— 这 · 里 · 是 · 分 · 割 · 线 ——'];mode = (mode + 1) % 5;source.put('dividerMode', mode);if (mode == 0) {java.toast('🎀 分割线式\\n已关闭');} else {java.toast('🎀 分割线式\\n' + styles[mode]);}}\nfunction showSettings() {let gc = source.get('gc') != '0' ? '🟢开启' : '⚫关闭';let xh = source.get('xh') != '0' ? '🟢开启' : '⚫关闭';let bq = source.get('bq') != '0' ? '🟢开启' : '⚫关闭';let imgMode = source.get('imgMode') + '';if (imgMode === '') imgMode = 'show';let imgModeMap = {'show':'🟢显示','hide':'⚫关闭','link':'🔗链接'};let noImg = imgModeMap[imgMode] || imgModeMap['show'];let trans = String(source.get('trans') || '0');if (trans !== '0' && trans !== '1' && trans !== '2') trans = '0';let transMap = {'0':'⚫关闭(默认)','1':'🟢自动识别','2':'🟢对照显示'};let transStr = transMap[trans];let showCaption = source.get('showCaption') != '0' ? '🟢开启' : '⚫关闭';let rubyReplace = source.get('rubyReplace') != '0' ? '🟢开启' : '⚫关闭';let showEmoji = source.get('showEmoji') != '0' ? '🟢开启' : '⚫关闭';let showSyntax = source.get('showSyntax') != '0' ? '🟢开启' : '⚫关闭';let dividerMode = parseInt(source.get('dividerMode'));if (isNaN(dividerMode)) dividerMode = 3;let modeNames = ['⚫关闭', '━━━━━━━━━', '━(=^・^=)━', '━ฅ(^ω^ฅ)━', '——分割线——'];let modeDisplay = modeNames[dividerMode] || modeNames[3];let teng = source.get('teng') + '';let tengMap = {'bing':'🟢必应翻译(免密钥)','tx':'🔵腾讯TranSmart','ai':'🤖AI大模型(OpenAI兼容)'};let tengStr = tengMap[teng] || '🟢必应翻译(免密钥)';let msg = '\\n🖼️图片显示:' + noImg + '\\n🔢补充序号:' + xh + '\\n📝简介标签:' + bq + '\\n📄章首描述:' + showCaption + '\\n😊表情显示:' + showEmoji + '\\n🔊注音替换:' + rubyReplace + '\\n📐特殊语法:' + showSyntax + '\\n📘书名标识:' + gc + '\\n🌐翻译模式:' + transStr + '\\n🔁翻译引擎:' + tengStr + '\\n🎀分割线式:' + modeDisplay;java.longToast(msg);}\nfunction showSourceIntro() {let intro = '📖 本小说书源基于以下版本合并修改:\\n\\n' + '✨ 洛娅橙原版:\\n' + '   Pixiv 小说书源的早期基础版本。\\n\\n' + '✨ 添加翻译功能的版本:\\n' + '   由不知名人士在洛娅橙原版基础上添加了微软翻译功能,\\n' + '   后来又被加入了商业推广广告。\\n\\n' + '✨ laizhiyu 修复版:\\n' + '   修复了网络直连问题,并替换为三引擎翻译模块\\n' + '   (必应\/腾讯\/AI),彻底解决翻译失效问题。\\n\\n' + '✨ 猫猫黛西(由 DeepSeek 全程代劳):\\n' + '   基于以上版本,去除所有广告,\\n' + '   进行了界面优化和功能调整。\\n\\n' + '感谢所有为开源做出贡献的大佬们!(ฅ´ω`ฅ)';java.longToast(intro);}\nfunction showButtonHelp() {let msg = '📖 按钮功能说明\\n\\n' + '本喵也不知道咱加的按钮有没有用,但你可以点开试试~\\n\\n' + '🖼️ 图片显示:切换正文中插图的显示\/隐藏\\n' + '🔢 补充序号:自动为章节名添加序号\\n' + '📝 简介标签:在书籍简介中显示标签\\n' + '📄 章首描述:在正文前显示小说前言\/简介\\n' + '🎀 分割线式:循环切换4种小猫风格分割线\\n' + '😊 表情显示:将(表情代码)替换为表情图片\\n' + '🔊 注音替换:将[[rb:汉字>读音]]替换为汉字(读音)\\n' + '📐 特殊语法:支持[chapter:][jump:][[jumpuri:]]等\\n' + '📘 书名标识:在书名前添加📘符号\\n' + '🌐 翻译模式:关闭\/自动识别\/对照显示 三态循环\\n' + '🔁 翻译引擎:必应\/腾讯\/AI 三引擎循环切换\\n' + '🤖 翻译测试:验证AI翻译配置是否连通\\n' + '📖 翻译说明:查看详细的翻译使用说明';java.longToast(msg);}\nfunction changeTrans(){let n = this.getTrans();let v = n > 1 ? 0 : n + 1;this.source.put('trans', v);let modeDesc = v == 0 ? '⚫ 关闭(默认)' : (v == 1 ? '🟢 自动识别' : '🟢 对照显示');java.toast('🌐 翻译模式:' + modeDesc);}\nfunction changeEng(){var c = this.source.get('teng') + '';if (c !== 'tx' && c !== 'ai') c = 'bing';var v = c === 'bing' ? 'tx' : (c === 'tx' ? 'ai' : 'bing');this.source.put('teng', v);var engMap = {'bing': '🟢 必应翻译(免密钥·国内直连)','tx': '🔵 腾讯TranSmart(微软密钥走Azure官方)','ai': '🤖 AI大模型(OpenAI兼容,AI密钥可选)'};java.toast('🔁 翻译引擎:\\n' + engMap[v]);}\nfunction login() {let Info = source.getLoginInfoMap();try {let tk = Info.token;if (!tk || tk == '') throw 'TOKEN为空,请先填写';let body = `client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&grant_type=refresh_token&refresh_token=${tk}&include_policy=true`;let rr;try {rr = pxOauth(body);} catch(err) {java.log('px oauth直连失败,回退常规请求:'+err);let time2 = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);let headers = {'User-Agent': ua,'content-type': 'application\/x-www-form-urlencoded','x-client-hash': timemd5(time2),'accept-language': a_l,'app-version': appv,'app-os-version': 'Android 6.0','x-client-time': time2,'app-os': 'Android','host': 'oauth.secure.pixiv.net'};let url = 'https:\/\/oauth.secure.pixiv.net\/auth\/token';url = url.replace(\"oauth.secure.pixiv.net\",\"210.140.139.155\");rr = String(java.post(url,body,headers).body());}if (rr.indexOf('{') >= 0) rr = rr.substring(rr.indexOf('{'));let atk = rr.match(\/\"access_token\"[:\\s\"]+([^\"]+)\/)[1];source.putLoginHeader(atk);if (Info.id=='') {Info.id = com.jayway.jsonpath.JsonPath.read(rr, \"$.user.id\");}source.putLoginInfo(JSON.stringify(Info));} catch(err) {java.toast('\\n💔登录失败');java.log('px登录失败:'+err);sleep(600);}}\nfunction scz(x, restrict) {let headers = gethd();let url = \"https:\/\/210.140.139.155\/\";let body,nm,tt,ttt;if (x==1) { url += 'v2\/novel\/bookmark\/add'; let id = cache.get('pxid'); if (id=='') ttt='请刷新章节'; body = 'novel_id='+id+'&restrict=' + (restrict || 'public'); nm = source.getLoginInfoMap().get('章节'); tt= (restrict=='private'? '私密收藏' : '公开收藏'); } else if(x==2) { url += 'v1\/user\/follow\/add'; let uid = cache.get('pxuid'); if (uid=='') ttt='请刷新章节或详情页'; body = 'user_id='+uid+'&restrict=' + (restrict || 'public'); nm = source.getLoginInfoMap().get('作者'); tt= (restrict=='private'? '私密关注' : '公开关注'); } else if(x==10) { url += 'v1\/novel\/bookmark\/delete'; let id = String(cache.get('pxid')); body = id ? 'novel_id='+id : ''; nm = source.getLoginInfoMap().get('章节'); tt='取消收藏'; } else if(x==20) { url += 'v1\/user\/follow\/delete'; let uid = String(cache.get('pxuid')); body = uid ? 'user_id='+uid : ''; nm = source.getLoginInfoMap().get('作者'); tt='取消关注'; } else if(x==3) { url += 'v1\/watchlist\/novel\/add'; let sid = cache.get('pxsid'); if (sid=='') ttt='请刷新详情页'; body = 'series_id='+sid; nm = source.getLoginInfoMap().get('书名'); tt='追更'; } else if(x==30) { url += 'v1\/watchlist\/novel\/delete'; let sid = String(cache.get('pxsid')); body = sid ? 'series_id='+sid : ''; nm = source.getLoginInfoMap().get('书名'); tt='取消追更'; }try {if (ttt) {java.longToast(ttt);throw 't空';}if (!body) throw 'b空';headers['host']='app-api.pixiv.net';let jg = java.post(url,body,headers).statusCode();if (jg!=200) throw tt+'响应码异常';else java.longToast(`\\n已${tt}:\\n${nm}`);} catch(e) {if (!ttt) java.toast(`\\n${tt}失败`);java.log(e);}}\nfunction reck() {source.removeLoginHeader();cookie.removeCookie('https:\/\/accounts.pixiv.net');cookie.removeCookie('https:\/\/accounts.google.com');cookie.removeCookie('https:\/\/api.weibo.com');}\nfunction Login() {let rkey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';let cv='';for (let i = 0; i < 128; i++) {let ra = Math.floor(Math.random()*rkey.length);cv+=rkey.charAt(ra);}let aly = new JavaImporter(Packages.cn.hutool.crypto.digest.Digester,Packages.cn.hutool.core.codec.Base64,Packages.cn.hutool.crypto.digest.DigestAlgorithm);with (aly) {let asBs = Packages.java.lang.String(cv).getBytes(\"US-ASCII\");let digester = new Digester(DigestAlgorithm.SHA256);let hashBs = digester.digest(asBs);var codeChallenge = Base64.encodeUrlSafe(hashBs);}let urllg =`https:\/\/app-api.pixiv.net\/web\/v1\/login?code_challenge=${codeChallenge}&code_challenge_method=S256&client=pixiv-android`;reck();let wbua=java.getWebViewUA().replaceAll(\"; wv| Version\\\\\/4.0\",'')+'';if (\/HUA\\\\s*WEI\/i.test(wbua)) wbua=\"Mozilla\/5.0 (Linux; Android 14; RMX3366 Build\/UKQ1.230924.001) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/135.0.7049.100 Mobile Safari\/537.36\";let bb=java.startBrowserAwait(urllg+`,{\"headers\":{\"User-Agent\": \"${wbua}\"}}`,'登录',false).body();let code;if (bb.includes('<title>Online com')) {sleep(600);java.toast('稍等');let over = java.webViewGetOverrideUrl(bb,'https:\/\/app-api.pixiv.net\/','','pixiv:.*');code = over.match(\/code=([^&]+)\/);}reck();let token;if (code) {let tkurl = 'https:\/\/oauth.secure.pixiv.net\/auth\/token';let headers = gethd();let body = `code_verifier=${cv}&code=${code[1]}&grant_type=authorization_code&redirect_uri=https:\/\/app-api.pixiv.net\/web\/v1\/users\/auth\/pixiv\/callback&client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&include_policy=true`;let tkr = java.post(tkurl,body,headers);token = tkr.body().match(\/refresh_token\":\"([^\"]+)\/);}if (token) {let htm = `data:text\/html;charset=utf-8,<html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>h2{text-align:center;line-height:6;}textarea{font-size:12px;width:96%;margin:10px 2%;padding:6px;}.ann{display:flex;justify-content:center;align-items:center;height:50vh;}button{background-color:rgb(76,175,80);color:white;border:none;border-radius:4px;height:6vh;width:30vw;font-size:16px;}<\/style><\/head><body><h2>Token获取成功🥳<\/h2><textarea readonly id=\"copyt\" rows=\"3\">${token[1]}<\/textarea><p style=\"font-size: 12px;\">请复制粘贴到登录界面的token框,然后点击√进行登录<\/p><div class=\"ann\"><button id=\"btn1\" onclick=\"copy()\">复制<\/button><\/div><script>function copy(){const cpt=document.getElementById(\"copyt\");cpt.select();document.execCommand(\"copy\");}<\/script><\/body><\/html>`;java.startBrowser(htm,'获取token');java.log(token[1]);} else {sleep(700);java.toast('获取失败😭');}}\nfunction fuzhi(x) {if (x==1) {let uid = cache.get('pxuid');copy(uid);}if (x==2) {let sid = cache.get('pxsid');copy(sid);}}\nfunction caption() {let lyc=cache.getFromMemory('pxcjj');if (lyc) lookc(lyc);else java.longToast('请刷新正文');}\nfunction showCatBlessing() {var catBlessings = ['猫猫祝你今天心情超好~ 多笑笑,好运自然来喵!(ฅ´ω`ฅ)','愿猫猫的柔软治愈你~ 今天也要好好吃饭、好好休息喵!','猫猫保佑你嘎嘎!今天更容易发现生活中的小确幸哦~','愿你像猫猫一样慵懒又幸福,鱼干自由,阳光满屋喵!','猫猫说:你今天超棒的!继续保持,好运正在路上喵~','愿你今天眼睛亮亮的,发现更多美好,烦恼统统退散喵!','猫猫赐你一天好心情buff!不易低落,不易烦躁,开心一整天喵!','愿你今天皮肤光滑、心情愉悦,像猫猫一样优雅又自在喵!','猫猫觉得你很有眼缘~ 今天运气会变好,惊喜等着你喵!','愿你今天精神饱满,做事顺顺利利,猫猫在背后保佑你喵!','哈!(ᗒᗣᗕ)՞','愿你今天说话都特别顺溜,好运buff已到位,冲鸭!'];var idx = Math.floor(Math.random() * catBlessings.length);java.longToast('猫猫黛西:' + catBlessings[idx]);}",
    "respondTime": 180705,
    "ruleBookInfo": {
        "author": "$.novel_series_detail.user.name\n<js>\nlet uid = java.get('uid');\nlet auth = result || String(book.author).replace(\/[@\\u200b]+\/,'');\nif (uid == '') {uid = java.getString('$.novel_series_detail.user.id');}\nlet Info=source.getLoginInfoMap();\nInfo['作者'] = '@' + auth;\ncache.put('pxuid',uid);\nsource.putLoginInfo(JSON.stringify(Info));\n'@' + auth\n<\/js>",
        "canReName": "1",
        "init": "<js>\nvar sid = java.get('sid');\nlet i = String(book.bookUrl).includes('https:\/');\nif (i) { sid = String(book.bookUrl).match(\/\\d{3,}$\/);}\nif (!sid) {\n\ttry {\n\t\tvar _psid = pxParseSidFromBookUrl(String(book.bookUrl));\n\t\tif (_psid) sid = _psid;\n\t} catch(ePs) { java.log('解析 bookUrl 里的 sid 失败:' + ePs); }\n}\nif (sid) { try { java.put('sid', sid); } catch(eP) {} }\ncache.deleteMemory('pxcjj');\n\n\/\/ ====== 富文本详情页 ======\nfunction _pxEsc(s){ return String(s==null?'':s).replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\\x22\/g,'&quot;').replace(\/'\/g,'&#39;'); }\nfunction _pxCleanCaption(raw) {\n    var s = String(raw || '');\n    s = s.replace(\/<br\\s*\\\/?>\/gi, String.fromCharCode(10));\n    s = s.replace(\/<a\\s+[^>]*href\\s*=\\s*[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\\/a>\/gi, function(m, url, text) {\n        var t = String(text).replace(\/<[^>]+>\/g, '').replace(\/^\\s+|\\s+$\/g, '');\n        if (!t || t === url || t.indexOf(url) >= 0) return url;\n        return t + '(' + url + ')';\n    });\n    s = s.replace(\/<\\\/?(?:a|strong|b|i|em|u|s|strike|span|div|p|code|pre|font|sub|sup)\\b[^>]*>\/gi, '');\n    s = s.replace(\/&lt;\/g, '<').replace(\/&gt;\/g, '>').replace(\/&quot;\/g, '\"').replace(\/&#39;\/g, \"'\").replace(\/&nbsp;\/g, ' ').replace(\/&amp;\/g, '&');\n    return s;\n}\nfunction _pxIcon(name){\n  var P={\n    intro:'<path d=\"M5 5.5A3.5 3.5 0 018.5 2H11a3 3 0 013 3v15a3 3 0 00-3-3H8.5A3.5 3.5 0 005 20.5zM19 5.5A3.5 3.5 0 0015.5 2H14v18a3 3 0 013-3h2.5A3.5 3.5 0 0123 20.5v-15z\"\/>',\n    data:'<path d=\"M4 20V10m6 10V4m6 16v-7m6 7V7\"\/><path d=\"M2 22h22\"\/>',\n    author:'<circle cx=\"12\" cy=\"8\" r=\"4\"\/><path d=\"M4.5 22a7.5 7.5 0 0115 0\"\/>',\n    tags:'<path d=\"M20.5 13.5L13 21l-10-10V3h8z\"\/><circle cx=\"8\" cy=\"8\" r=\"1.5\"\/>',\n    source:'<path d=\"M10 13a5 5 0 007 0l3-3a5 5 0 00-7-7l-2 2\"\/><path d=\"M14 11a5 5 0 00-7 0l-3 3a5 5 0 007 7l2-2\"\/>'\n  };\n  return '<svg viewBox=\"0 0 26 26\" style=\"width:20px;height:20px;flex:0 0 20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round\">'+(P[name]||P.intro)+'<\/svg>';\n}\nfunction _pxSection(name,title,body){\n  if(!body) return '';\n  return '<section style=\"padding:14px 0;border-top:1px solid rgba(128,128,128,.24)\">'\n    + '<div style=\"display:flex;align-items:center;gap:8px;margin:0 0 9px;font-size:16px;line-height:1.3;font-weight:700\">'\n    + _pxIcon(name)+'<span>'+title+'<\/span><\/div>'+body+'<\/section>';\n}\nfunction _pxFacts(items){\n  var h='';\n  items.forEach(function(it){\n    var v=String(it[1]==null?'':it[1]).trim();\n    if(v) h+='<div style=\"display:flex;min-width:0;gap:8px;align-items:baseline;flex:1 1 145px\">'\n      +'<span style=\"flex:0 0 auto;font-size:12px;opacity:.68\">'+_pxEsc(it[0])+'<\/span>'\n      +'<strong style=\"font-size:14px;line-height:1.55;font-weight:500;word-break:break-word\">'+_pxEsc(v)+'<\/strong><\/div>';\n  });\n  return h?'<div style=\"display:flex;flex-wrap:wrap;gap:8px 18px\">'+h+'<\/div>':'';\n}\nfunction _pxChips(vals){\n  if(!vals||!vals.length) return '';\n  return '<div style=\"display:flex;flex-wrap:wrap;gap:7px\">'+vals.map(function(v){\n    return '<span style=\"display:inline-flex;align-items:center;min-height:27px;padding:3px 10px;border:1px solid rgba(127,127,127,.24);border-radius:7px;background:rgba(127,127,127,.10);font-size:13px\">'+_pxEsc(v)+'<\/span>';\n  }).join('')+'<\/div>';\n}\nfunction _pxWord(n){ n=Number(n||0); return n? (n>=10000?(Math.round(n\/1000)\/10)+'万字':n+'字') : ''; }\nfunction _pxTagList(){\n  var out=[];\n  try{\n    var tr=String(java.get('tags')||'').replace(\/^\\[|\\]$\/g,'').trim();\n    if(tr) out=tr.split(\/,\\s*\/).filter(function(x){return x;});\n  }catch(e){}\n  return out;\n}\nfunction _pxSplitParagraphs(text) {\n    var s = String(text || '').replace(\/<br\\s*\\\/?>\/gi, String.fromCharCode(10));\n    var lines = s.split(String.fromCharCode(10));\n    var ps = [];\n    for (var i = 0; i < lines.length; i++) {\n        var line = lines[i].trim();\n        if (line) ps.push(line);\n    }\n    return ps;\n}\nfunction _pxHash(s) {\n    s = String(s || '');\n    var h = 0;\n    for (var i = 0; i < s.length; i++) {\n        h = ((h << 5) - h + s.charCodeAt(i)) | 0;\n    }\n    return String(h);\n}\nfunction _pxTranslateParagraphsCached(paras, mode) {\n    if (!mode || !paras || !paras.length) return [];\n    try {\n        var joined = paras.join(String.fromCharCode(10));\n        if (!util.noZh(joined)) return [];\n        java.put(\"lang\", util.lang);\n        var teng = String(source.get('teng') || 'bing');\n        var cKey = 'px_trans_' + mode + '_' + teng + '_' + _pxHash(joined) + '_' + joined.length;\n        var cached = null;\n        try { cached = cache.getFromMemory(cKey); } catch(e0) { cached = null; }\n        if (cached) {\n            try {\n                var arrMem = (typeof cached === 'string') ? JSON.parse(cached) : cached;\n                if (Array.isArray(arrMem) && arrMem.length === paras.length) return arrMem;\n            } catch(e1) {}\n        }\n        try {\n            var disk = cache.get(cKey);\n            if (disk) {\n                var arrDisk = JSON.parse(disk);\n                if (Array.isArray(arrDisk) && arrDisk.length === paras.length) {\n                    try { cache.putMemory(cKey, disk); } catch(eM) {}\n                    return arrDisk;\n                }\n            }\n        } catch(e2) {}\n        var ctx = { java: java, source: source, cache: cache, cookie: cookie };\n        var res = util.translateTexts.call(ctx, paras, {});\n        if (!Array.isArray(res)) res = [String(res)];\n        var out = [];\n        for (var i = 0; i < paras.length; i++) out.push(res[i] || paras[i]);\n        try {\n            var serialized = JSON.stringify(out);\n            cache.put(cKey, serialized, 7 * 24 * 60 * 60);\n            cache.putMemory(cKey, serialized);\n        } catch(e3) {}\n        return out;\n    } catch (e) { return []; }\n}\nfunction _pxFormatCaption(orig, transArray, mode) {\n    var origParas = _pxSplitParagraphs(orig);\n    if (!origParas.length) return '';\n    var trArr = Array.isArray(transArray) ? transArray : [];\n    var html = '';\n    var oStyle = 'margin:0 0 4px 0;font-size:13px;line-height:1.65;color:#8a8f99;word-break:break-word;';\n    var tStylePlain = 'margin:0 0 12px 0;font-size:15px;line-height:1.75;word-break:break-word;';\n    var tStyleGroup = 'margin:0 0 16px 0;font-size:15px;line-height:1.75;word-break:break-word;';\n    var i;\n    if (mode === 1 && trArr.length) {\n        for (i = 0; i < origParas.length; i++) {\n            var t1 = _pxEsc(trArr[i] || origParas[i]);\n            html += '<p style=\"' + tStylePlain + '\">' + t1 + '<\/p>';\n        }\n    } else if (mode === 2 && trArr.length) {\n        for (i = 0; i < origParas.length; i++) {\n            var o1 = _pxEsc(origParas[i]);\n            var tr1 = _pxEsc(trArr[i] || '');\n            html += '<div style=\"margin:0 0 14px 0;\">';\n            html += '<p style=\"' + oStyle + '\">' + o1 + '<\/p>';\n            html += '<p style=\"' + tStyleGroup + '\">' + (tr1 || o1) + '<\/p>';\n            html += '<\/div>';\n        }\n    } else {\n        for (i = 0; i < origParas.length; i++) {\n            var o2 = _pxEsc(origParas[i]);\n            html += '<p style=\"' + tStylePlain + '\">' + o2 + '<\/p>';\n        }\n    }\n    return '<div style=\"padding-left:12px;border-left:3px solid #ef625a;margin-top:4px;\">' + html + '<\/div>';\n}\nfunction _pxIntroHtml(isSingle, extra){\n  extra = extra || {};\n  var d = extra.detail || {};\n  var caption = _pxCleanCaption(String(d.caption || java.get('jianjie') || ''));\n  var transCaptionArr = extra.captionTransArr || [];\n  var transMode = Number(extra.transMode || 0);\n  var origName = String(extra.origName || '');\n  var tags = _pxTagList();\n  var ov = d.isOriginal;\n  var isOrigStr = (ov === true || String(ov) === 'true') ? '是' : ((ov === false || String(ov) === 'false') ? '否' : '');\n  var out = '<useweb><div style=\"width:100%;padding:2px 5px 18px;box-sizing:border-box;color:inherit;font-family:sans-serif\">';\n\n  var introBody = '';\n  if (transMode > 0 && origName && transCaptionArr.length > 0) {\n    introBody += '<div style=\"text-align:center;margin:0 0 14px 0;\"><span style=\"display:inline-block;padding:3px 12px;background:rgba(128,128,128,.12);border-radius:12px;font-size:13px;color:#8a8f99;line-height:1.5;\">《' + _pxEsc(origName) + '》<\/span><\/div>';\n  }\n  introBody += _pxFormatCaption(caption, transCaptionArr, transMode);\n  out += _pxSection('intro','作品简介', introBody);\n\n  if(tags.length && source.get('bq')!='0'){\n    out += _pxSection('tags','题材标签', _pxChips(tags));\n  }\n\n  out += _pxSection('author','作者信息', _pxFacts([\n    ['作者', d.uname],\n    ['作者ID', d.uid]\n  ]));\n\n  out += _pxSection('source','来源信息', _pxFacts([\n    ['平台','Pixiv'],\n    ['单篇ID', isSingle ? (extra.novelId || '') : ''],\n    ['系列ID', isSingle ? '' : (extra.sid || '')]\n  ]));\n\n  out += _pxSection('data','作品数据', _pxFacts([\n    ['字数', _pxWord(d.count)],\n    ['类型', isSingle ? '单篇' : '系列'],\n    ['篇章数', d.pubCount ? d.pubCount+'篇' : ''],\n    ['原创', isOrigStr]\n  ]));\n\n  out += '<\/div><\/useweb>';\n  return out;\n}\n\/\/ ====== 富文本详情页 END ======\n\nif (sid == '🇨🇳') {\n\tlet Info=source.getLoginInfoMap();\n\tlet bkn = String(book.name);\n\tvar _pxDecoded = java.hexDecodeToString(result);\n\tvar _pxIdM = _pxDecoded.match(\/[?&]id=(\\d+)\/);\n\tlet id = _pxIdM ? _pxIdM[1] : _pxDecoded.match(\/\\d+$\/)[0];\n\tInfo['书名'] = '';\n\tcache.put('pxsid','');\n\tInfo['章节'] = bkn;\n\tcache.put('pxid',id);\n\tsource.putLoginInfo(JSON.stringify(Info));\n\t\n\tvar _singleDetail = { uname: String(book.author||'').replace(\/^@\/,'') };\n\ttry {\n\t\tvar _sdUrl = 'https:\/\/app-api.pixiv.net\/v2\/novel\/detail?novel_id=' + id;\n\t\tvar _sdResp = null;\n\t\ttry {\n\t\t\t_sdResp = cacheGetAndSet('novel_' + id, function() {\n\t\t\t\ttry { return java.ajax(gethd(_sdUrl)); } catch(eInner) { return null; }\n\t\t\t});\n\t\t} catch(eCache) { _sdResp = null; }\n\t\tif (!_sdResp) {\n\t\t\ttry { _sdResp = java.ajax(gethd(_sdUrl)); } catch(eAjax) { _sdResp = null; }\n\t\t}\n\t\tif (_sdResp) {\n\t\t\tvar _sd = JSON.parse(_sdResp);\n\t\t\tvar _n = _sd.novel || {};\n\t\t\tvar _u = _n.user || {};\n\t\t\t_singleDetail = {\n\t\t\t\tuname: _u.name || _singleDetail.uname,\n\t\t\t\tuid: _u.id || '',\n\t\t\t\tcount: _n.text_length || '',\n\t\t\t\tisOriginal: _n.is_original,\n\t\t\t\tcaption: (typeof _n.caption === 'string') ? _n.caption : ''\n\t\t\t};\n\t\t\tif (typeof _n.caption === 'string' && _n.caption !== '') java.put('jianjie', _n.caption);\n\t\t\tif ((book.coverUrl == null || book.coverUrl == '') && _n.image_urls && _n.image_urls.large) {\n\t\t\t\tbook.coverUrl = gethdi(_n.image_urls.large);\n\t\t\t}\n\t\t\tif (_u.id) cache.put('pxuid', String(_u.id));\n\t\t\tif (_u.name) book.author = '@' + _u.name;\n\t\t}\n\t} catch(eSingle) { java.log('单篇详情加载失败:' + eSingle); }\n\t\n\tvar _transMode = 0;\n\ttry { _transMode = parseInt(source.get('trans')) || 0; } catch(eT) {}\n\tvar _captionOrig = '';\n\ttry { _captionOrig = _pxCleanCaption(String(_singleDetail.caption || java.get('jianjie') || '')); } catch(eC) {}\n\tvar _captionTransArr = _transMode ? _pxTranslateParagraphsCached(_pxSplitParagraphs(_captionOrig), _transMode) : [];\n\tvar _origName = String(book.name || '').replace(\/^📘\/, '').trim();\n\t\n\tbook.intro = _pxIntroHtml(true, { detail: _singleDetail, novelId: id, sid: '', captionTransArr: _captionTransArr, transMode: _transMode, origName: _origName });\n\trr='1';\n} else {\nlet url = 'https:\/\/app-api.pixiv.net\/v2\/novel\/series?series_id=' + sid;\nbook.bookUrl = `data:;base64,${java.base64Encode(url)},{\"type\":\"px\"}`;\nrr = null;\ntry {\n\trr = cacheGetAndSet('series_' + sid, function() {\n\t\ttry {\n\t\t\tlet jg = java.connect(gethd(url));\n\t\t\tlet r = jg.body();\n\t\t\tif (jg.code() == 400) { source.login(); Packages.java.lang.Thread.sleep(500); r = java.ajax(gethd(url)); }\n\t\t\treturn r || null;\n\t\t} catch(err) { return null; }\n\t});\n} catch(e) { rr = null; }\nif (!rr) {\n\ttry {\n\t\tlet jg = java.connect(gethd(url));\n\t\trr = jg.body();\n\t\tif (jg.code() == 400) { source.login(); Packages.java.lang.Thread.sleep(500); rr = java.ajax(gethd(url)); }\n\t} catch(err) { rr = '{}'; java.toast('详情页链接加载失败' + sid); }\n}\nif (!rr) rr = '{}';\njava.setContent(rr);\ntry {\nlet tm = java.getString('$.novel_series_latest_novel.create_date');\nlet d = new Date(tm);\nd = java.timeFormatUTC(d,'yy\/MM\/dd',8*60*60*1000);\nbook.kind = String(book.kind).replace(\/\\d+\\\/\\d+\\\/\\d+|$\/,d).replace('null','');\n} catch(err) {java.toast('详情页内容错误');}\nlet bkn = String(java.getString('$.novel_series_detail.title')).replace(\/^《(.+)》$\/,'$1');\nbook.name = bkn.replace(\/[((].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[))](?=\\s*[一-ꀀ])\/,'');\nif (book.name == '') {\n\tlet txte = java.getString('$..user_message',rr);\n\tjava.longToast('\\n未获取到书名\\n'+txte);\n} else {\n\tlet Info=source.getLoginInfoMap();\n\tInfo['书名'] = book.name;\n\tcache.put('pxsid',sid);\n\tInfo['章节'] = '';\n\tcache.put('pxid','');\n\tsource.putLoginInfo(JSON.stringify(Info));\n\tif (source.get('gc') != '0') book.name='📘'+book.name;\n}\nif (book.coverUrl == null) {\n\tlet img = java.getString('$.novel_series_latest_novel.image_urls.large');\n\tbook.coverUrl = gethdi(img);\n}\nlet jianjie = _pxCleanCaption(java.getString('$.novel_series_detail.caption'));\n\nvar _transMode2 = 0;\ntry { _transMode2 = parseInt(source.get('trans')) || 0; } catch(eT2) {}\nvar _captionTransArr2 = _transMode2 ? _pxTranslateParagraphsCached(_pxSplitParagraphs(jianjie), _transMode2) : [];\nvar _origName2 = String(book.name || '').replace(\/^📘\/, '').trim();\n\nbook.intro = _pxIntroHtml(false, {\n\tdetail: {\n\t\tcaption: jianjie,\n\t\tcount: java.getString('$.novel_series_detail.total_character_count'),\n\t\tuname: java.getString('$.novel_series_detail.user.name'),\n\t\tuid: java.getString('$.novel_series_detail.user.id'),\n\t\tpubCount: java.getString('$.novel_series_detail.content_count') || java.getString('$.novel_series_detail.published_content_count') || java.getString('$.novel_series_detail.total'),\n\t\tisOriginal: java.getString('$.novel_series_detail.is_original')\n\t},\n\tsid: String(sid),\n\tcaptionTransArr: _captionTransArr2,\n\ttransMode: _transMode2,\n\torigName: _origName2\n});\njava.put('jianjie',jianjie);\njava.put(\"bookr\",rr);\n}\nutil.xq_trans.call(this);\nrr\n<\/js>",
        "lastChapter": "$.novel_series_latest_novel.title##[【《]?{{book.name}}[》】]?",
        "tocUrl": "@js:book.bookUrl",
        "wordCount": "$.novel_series_detail.total_character_count"
    },
    "ruleContent": {
        "callBackJs": "if (event == \"clickCustomButton\") {\n    var __novelId = '';\n    try {\n        var __cu = String(chapter.url || '');\n        var __m = __cu.match(\/[?&]?id=(\\d+)\/);\n        if (__m) __novelId = __m[1];\n    } catch (e) {}\n    if (!__novelId) {\n        try { __novelId = String(cache.get('pxid') || ''); } catch (e) {}\n    }\n    showComments.call(this, __novelId);\n    true;\n} else if (event == \"longClickCustomButton\") {\n    java.open(\"login\");\n    true;\n}",
        "content": "script.0@html\n<js>\nlet rr = result.match(\/novel:\\s*({.+})\/)[1];\nlet id = String(chapter.url).match(\/\\d+(?=$|,)\/)[0];\nlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nif (inn==0) {\nlet rra = result.match(\/authorDetails:\\s*({.+})\/)[1];\nlet uid = java.getString('$..userId',rra);\nlet unm = java.getString('$..userName',rra);\nlet uim = java.getString('$..url',rra);\nuim = uim.replace('i.pximg.net','pximg.hakurei.cc');\nlet ugz = java.getString('$..isFollowed',rra);\nlet tags = java.getStringList('$..tags[*]',rr);\ntags = Array.from(tags).map(x => `#${x}`).join(' ');\nlet caption = String(java.getString('$..caption',rr));\ncaption = caption ? '<p>'+caption.replace(\/(?:<br \\\/>)+\/g, '<\/p><p>')+'<\/p>' : '';\nlet cdate = java.getString('$..cdate',rr);\nlet xh = java.getString('$..rating.like',rr);\nlet sc = java.getString('$..rating.bookmark',rr);\nlet gk = java.getString('$..rating.view',rr);\nlet title = java.getString('$.title',rr);\nlet sTitle = java.getString('$.seriesTitle',rr);\ncache.putMemory('pxcjj',[title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz]);\ncache.put('pxuid',uid);\ncache.put('pxid',id);\nlet Info=source.getLoginInfoMap();\nlet sid = java.get('sid');\nif (sid != '🇨🇳') {\n\tInfo['书名']=String(book.name).replace(\/^📘\/,'');\n\tcache.put('pxsid',sid);} else {\n\tInfo['书名']='';\n\tcache.put('pxsid','');}\nInfo['章节'] = chapter.title;\nInfo['作者'] = book.author;\nsource.putLoginInfo(JSON.stringify(Info));\n}\nlet urls = java.getString('$..urls',rr);\nlet tt = String(java.getString('$.text',rr));\nlet imgMode = source.get('imgMode') + '';\nif (imgMode === '') imgMode = 'show';\nfunction makeImg(rawUrl, label) {\n    if (!rawUrl || rawUrl == 'null') return '';\n    if (imgMode === 'hide') return '';\n    if (imgMode === 'link') return '\\n\\n🖼️ ' + (label || '图片') + ':' + rawUrl + '\\n\\n';\n    return '<img src=\"' + gethdi(rawUrl) + '\" style=\"max-width:100%;height:auto;\"\/>';\n}\nlet img1 = tt.match(\/\\[uploadedimage\\:\\d+\\]\/g)||'';\nlet img2 = tt.match(\/\\[pixivimage\\:[\\d\\-]+\\]\/g)||'';\nfor (x of img1) {\n\tlet id = x.match(\/\\d+\/)[0];\n\tlet url = java.getString('$..'+id+'.urls.original',rr);\n\tlet re = new RegExp('\\\\[uploadedimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re, makeImg(url, '上传图片'));\n\t}\nfor (x of img2) {\n\tlet m = x.match(\/\\[pixivimage\\:(\\d+)(?:\\-(\\d+))?\\]\/);\n\tif (!m) continue;\n\tlet illustId = m[1];\n\tlet order = m[2] ? parseInt(m[2]) : 1;\n\tlet url = java.getString('$..'+illustId+'..images.original',rr);\n\tif (url=='null' || !url) url = java.getString('$..'+illustId+'..images.medium',rr);\n\tif (url=='null' || !url) {\n\t\tlet arResp = null;\n\t\ttry {\n\t\t\tarResp = cacheGetAndSet('illust_' + illustId, function() {\n\t\t\t\ttry { return java.ajax(gethd('https:\/\/app-api.pixiv.net\/v1\/illust\/detail?illust_id=' + illustId)); }\n\t\t\t\tcatch(e) { return null; }\n\t\t\t});\n\t\t} catch(e) { arResp = null; }\n\t\tif (!arResp) {\n\t\t\ttry { arResp = java.ajax(gethd('https:\/\/app-api.pixiv.net\/v1\/illust\/detail?illust_id=' + illustId)); }\n\t\t\tcatch(e) { arResp = null; }\n\t\t}\n\t\tif (arResp) {\n\t\t\ttry {\n\t\t\t\tlet ar = JSON.parse(arResp);\n\t\t\t\tif (ar && ar.illust && ar.illust.meta_single_page && ar.illust.meta_single_page.original_image_url) {\n\t\t\t\t\turl = ar.illust.meta_single_page.original_image_url;\n\t\t\t\t} else if (ar && ar.illust && ar.illust.meta_pages && ar.illust.meta_pages[order-1]) {\n\t\t\t\t\turl = ar.illust.meta_pages[order-1].image_urls.original;\n\t\t\t\t}\n\t\t\t} catch(e) {}\n\t\t}\n\t}\n\tif (url && url != 'null' && order > 1) {\n\t\turl = url.replace(\/_p0\/, '_p' + (order - 1));\n\t}\n\tlet re = new RegExp('\\\\[pixivimage\\\\:' + illustId + (m[2] ? '\\\\-' + m[2] : '') + '\\\\]');\n\ttt = tt.replace(re, makeImg(url, 'Pixiv 插画'));\n\t}\ntt = tt.replaceAll('[newpage]','\\n—换页符—\\n');\ntt = tt.replace(\/\\[\\[jumpuri\\:(.+)\\>(.+)\\]\\]\/g, '🖇️$1($2)');\nif (source.get('showEmoji') != '0') {\n    let emojiMap = {\n        'normal': 101, 'surprise': 102, 'series': 103, 'heaven': 104, 'happy': 105,\n        'excited': 106, 'sing': 107, 'cry': 108, 'normal2': 201, 'shame2': 202,\n        'love2': 203, 'interesting2': 204, 'blush2': 205, 'fire2': 206, 'angry2': 207,\n        'shine2': 208, 'panic2': 209, 'normal3': 301, 'satisfaction3': 302, 'surprise3': 303,\n        'smile3': 304, 'shock3': 305, 'gaze3': 306, 'wink3': 307, 'happy3': 308,\n        'excited3': 309, 'love3': 310, 'normal4': 401, 'surprise4': 402, 'series4': 403,\n        'love4': 404, 'shine4': 405, 'sweet4': 406, 'shame4': 407, 'sleep4': 408,\n        'heart': 501, 'teardrop': 502, 'star': 503\n    };\n    tt = tt.replace(\/\\(([a-zA-Z0-9_]+)\\)\/g, function(match, key) {\n        if (emojiMap.hasOwnProperty(key)) {\n            let imgUrl = 'https:\/\/s.pximg.net\/common\/images\/emoji\/' + emojiMap[key] + '.png';\n            return '<img src=\"' + imgUrl + ',{\\'style\\':\\'text\\'}\"\/>';\n        }\n        return match;\n    });\n}\nif (source.get('showSyntax') != '0') {\n    tt = tt.replace(\/\\[chapter:(.*?)\\]\/g, '<h3>$1<\/h3>');\n    tt = tt.replace(\/\\[jump:(\\d+)\\]\/g, '跳转至第 $1 节');\n}\nif (source.get('showCaption') != '0') {\n    let cap = String(java.getString('$.caption',rr));\n    if (cap) {\n        let capHtml = cap.replace(\/(?:<br \\\/>)+\/g, '<\/p><p>');\n        let mode = parseInt(source.get('dividerMode'));\n        if (isNaN(mode)) mode = 3;\n        let divider = '';\n        if (mode > 0) {\n            let styles = [\n                '',\n                '<p>━━━━━━━━━━━━━━━━<\/p>',\n                '<p>━━━ (=^・^=) ━━━ ( =^・^= ) ━━━<\/p>',\n                '<p>━━━ ฅ(^ω^ฅ) ━━━ ฅ(^ω^ฅ) ━━━<\/p>',\n                '<p>—— 这 · 里 · 是 · 分 · 割 · 线 ——<\/p>'\n            ];\n            divider = styles[mode] || '';\n        }\n        tt = '<p>' + capHtml + '<\/p>' + divider + tt;\n    }\n}\nif (source.get('rubyReplace') != '0') {\n    tt = tt.replace(\/\\[\\[rb:(.*?)>(.*?)\\]\\]\/g, '$1($2)');\n}\ntt\n<\/js>",
        "replaceRegex": "@js:util.tihuan_trans.call(this);"
    },
    "ruleExplore": {
        "author": "@js:\nlet uid = java.getString('$.user.id');\njava.put('uid',uid);\n'@' + java.getString('$.user.name');",
        "bookList": "<js>\nvar tag = '默认';\ntry { var m = baseUrl.match(\/[?&]_tag=([^&]+)\/); if (m) tag = decodeURIComponent(m[1]); } catch(e) {}\nif (baseUrl.startsWith('http:\/\/127.') || baseUrl === 'data:;base64,') { rr = [{}]; }\nelse {\n    let nurl = java.getString('$.next_url');\n    if (nurl == '') { java.toast('发现页到底了'); source.put('nurl_' + tag, 'http:\/\/127.0.0.1'); }\n    else { source.put('nurl_' + tag, nurl); }\n    if (baseUrl.includes('\/watchlist\/novel') ) { rr = java.getElement(\"$.series\"); }\n    else { rr = java.getElement(\"$.novels\");}\n}\nrr\n<\/js>",
        "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nlet rr = 'https:\/\/app-api.pixiv.net\/webview\/v2\/novel?id=' + id;\nif (baseUrl.includes('\/watchlist\/novel') ) { sid = id; if (source.get('gc')!='0') book.name='📘'+book.name; }\nelse if (sid=='') {sid='🇨🇳';}\nelse { let jj = java.get('jianjie'); java.put('jianjie',book.name+'\\n'+jj); }\nvar _sidMark = (sid && sid != '') ? String(sid) : '🇨🇳';\nrr = rr + (rr.indexOf('?') >= 0 ? '&' : '?') + '_px_sid=' + encodeURIComponent(_sidMark);\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n<\/js>",
        "coverUrl": "<js>\nif (baseUrl.includes('\/watchlist\/novel') ) {url = java.getString('$.url');}\nelse {url = java.getString('$.image_urls.large');}\ngethdi(url);\n<\/js>",
        "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n<\/js>",
        "kind": "@js:\nif (baseUrl.includes('\/watchlist\/novel') ) {\n\trrr = '';\n\tjava.put('tags','');\n\ttm = java.getString('$.last_published_content_datetime');\n\t} else {\n\t\tlet tags=java.get('tags');\n\t\trr=String(tags).slice(1,-1).split(', ');\n\t\trrr = rr.filter(i => biaoq.test(i) );\n\t\trr.forEach(x=>{\n\t\t\tif (x=='萝莉') { if (!rrr.includes('幼女')) rrr.unshift(x);}\n\t\t\telse if (['熟女','淫妻'].includes(x)) { if (!rrr.includes('人妻')) rrr.unshift(x);}\n\t\t\telse if (['仙侠','古风','武侠'].includes(x) && !rrr.some(y=>\/[修仙古风武侠]{2}\/.test(y))) { rrr.unshift(x);}\n\t\t});\n\t\ttm = java.getString('$.create_date');\n}\nlet d=new Date(tm);\nd=java.timeFormatUTC(d,'yy\/MM\/dd',8*60*60*1000);\nrrr.toString()+','+d",
        "name": "@js:\nresult = String(java.getString('$.title'));\nlet bookn = String(java.getString('$.series.title')).replace(\/^《(.+)》$\/,'$1');\nif (bookn != '') {\n\tjava.put('jianjie', '《'+bookn+'》\\n');\n\tresult = result.replace(bookn,'♸').replace(\/[《【]?♸[】》]?\/,'')||result;\n\t}\nresult = result.replace(\/[((].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[))](?=\\s*[一-ꀀ])\/,'').replace(\/《(.+)》\/,'$1');\nlet tags = java.getStringList('$.tags..name');\njava.put('tags',tags);\ntags=String(tags).slice(1,-1).split(\/, |\\\/\/);\nlet bptag=source.getLoginInfoMap()['屏蔽标签']||'';\nif (bptag!='') {\n\tbptag = String(bptag).split(\/[,\\|]\/).map(x=>x.replace('#',''))\nfor (let char of tags)\nif (bptag.includes(char)) result=''\n}\nresult",
        "wordCount": "$.text_length"
    },
    "ruleSearch": {
        "author": "<js>\n{{(source.ruleExplore.author).replace('@js:','')}}\n<\/js>",
        "bookList": "<js>\npage=cache.getFromMemory('pxpage');\ncache.deleteMemory('pxpage');\nif (baseUrl.startsWith('http:\/\/127.') || baseUrl === 'data:;base64,') {rr = [{}];}\nelse {\nrr = java.getElement('$.novels');\nnurl = java.getString('$.next_url');\nif (rr.length<6&&page==1&&nurl!='') {\n\tsleep(500);\n\trs = java.ajax(gethd(nurl));\n\tjava.setContent(rs)\n\trrr = java.getElement('$.novels');\n\trr.addAll(rrr);\n\tnurl = java.getString('$.next_url');\n}\nif (nurl == '') { java.toast('搜索页到底了'); source.put('nurls','http:\/\/127.0.0.1'); }\nelse {source.put('nurls',nurl);}\n}\nrr\n<\/js>",
        "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nif (sid=='') { sid='🇨🇳'; }\nelse { let jj = java.get('jianjie'); java.put('jianjie',book.name+'\\n'+jj); }\nlet rr = 'https:\/\/app-api.pixiv.net\/webview\/v2\/novel?id=' + id;\nrr = rr + (rr.indexOf('?') >= 0 ? '&' : '?') + '_px_sid=' + encodeURIComponent(String(sid));\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n<\/js>",
        "coverUrl": "$.image_urls.large\n<js>\ngethdi(result);\n<\/js>",
        "intro": "<js>\nlet jj = java.get('jianjie');\nlet rr = '\\n' + java.getString('$.caption');\nlet rs = java.htmlFormat(rr);\njava.put('jianjie',rs);\njj + rs\n<\/js>",
        "kind": "<js>\n{{(source.ruleExplore.kind).replace('@js:','')}}\n<\/js>",
        "name": "<js>\n{{(source.ruleExplore.name).replace('@js:','')}}\n<\/js>",
        "wordCount": "$.text_length"
    },
    "ruleToc": {
        "chapterList": "<js>\nlet sid = java.get('sid');\nif (!sid) {\n\ttry { sid = pxParseSidFromBookUrl(String(book.bookUrl)); } catch(eP) {}\n\tif (sid) { try { java.put('sid', sid); } catch(eP2) {} }\n}\nif (sid == '🇨🇳') {result=[result];}\nelse {\n\ttry {\n\t\tlet url = java.hexDecodeToString(result);\nlet bookr=java.get('bookr')+'';\nif (!bookr) {\n\tlet rs=java.connect(gethd(url));\n\tif (rs.code() == 400) { source.login(); sleep(500); rs=java.connect(gethd(url));}\nbookr=rs.body();}\n\t\tjava.setContent(bookr);\n\t\tjava.put('bookr','');\n\t\t} catch(e){}\nresult = java.getElement('$.novels');\n}\nutil.mulu_trans.call(this);\nresult\n<\/js>",
        "chapterName": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') {cc=book.name;}\nelse {\nlet title = java.getString('$.title');\ntitle = String(title).replace(\/[((].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[))](?=\\s*[一-ꀀ])\/,'');\nlet bkn=String(book.name).replace(\/^📘|[。?!]+$\/g,'');\ncc = title.replace(bkn,'♸').replace(\/[《【]♸[。?!]*[】》]\\s*|♸[。?!\\s]*\/,'')||title;\n\t}\nif (source.get('xh')!='0') { cc='▫️'+cc; }\n\tcc\n<\/js>",
        "chapterUrl": "<js>\nlet sid = java.get('sid');\nif (sid == '🇨🇳') { uu=java.hexDecodeToString(result); book.putCustomVariable('这是单贴,链接:'+uu); }\nelse { let id = java.getString('$.id'); uu='https:\/\/app-api.pixiv.net\/webview\/v2\/novel?id=' + id; }\ngethd(uu);\n<\/js>",
        "formatJs": "title.replace(\/^▫️(?![第序]|#?第?[\\d零一二三四五六七八九十百千]+[章回])\/,'第'+index+'章 ').replace(\/^▫️\/,'');",
        "nextTocUrl": "$.next_url\n<js>\nif (result!='[]') { result=gethd(result[0]); } else { result=[]; }\nresult\n<\/js>",
        "updateTime": "$.create_date\n<js>\nif (result) { let d=new Date(result); upt=java.timeFormatUTC(d,\"yyyy\/MM\/dd HH:mm\",8*60*60*1000); }\nelse '';\n<\/js>"
    },
    "searchUrl": "<js>\nif (page == 1) {\ncache.putMemory('pxpage',page);\n        if (\/^\\u200b\/.test(key)) {\n            let uid = cache.getFromMemory('pxuid');\n            if (uid=='') java.longToast('\\n请刷新书籍');\n            else url = 'https:\/\/app-api.pixiv.net\/v1\/user\/novels?filter=for_android&user_id=' + uid;}\n        else if (key.startsWith('@')) {\n            let name = key.slice(1).trim();\n            if (!name) { java.longToast('\\n请输入作者名'); url = 'http:\/\/127.0.0.1'; }\n            else {\n                try {\n                    let searchUserUrl = 'https:\/\/app-api.pixiv.net\/v1\/search\/user?word=' + encodeURIComponent(name);\n                    let resp = null;\n                    try { resp = cacheGetAndSet('search_user_v3_' + name, function() { try { return java.ajax(gethd(searchUserUrl)); } catch(e) { return null; } }); } catch(e) { resp = null; }\n                    if (!resp) { try { resp = java.ajax(gethd(searchUserUrl)); } catch(e) { resp = null; } }\n                    if (!resp) throw '无法获取作者信息';\n                    let data = JSON.parse(resp);\n                    let users = data.user_previews || [];\n                    if (users.length == 0) { java.longToast('\\n未找到该作者:' + name); url = 'http:\/\/127.0.0.1'; }\n                    else {\n                        let lowerName = name.toLowerCase();\n                        let exactMatch = null; let ciMatch = null;\n                        for (let i = 0; i < users.length; i++) {\n                            let un = String(users[i].user.name);\n                            if (un === name) { exactMatch = users[i]; break; }\n                            if (!ciMatch && un.toLowerCase() === lowerName) { ciMatch = users[i]; }\n                        }\n                        let picked = exactMatch || ciMatch || users[0];\n                        let uid = picked.user.id;\n                        url = 'https:\/\/app-api.pixiv.net\/v1\/user\/novels?filter=for_android&user_id=' + uid;\n                    }\n                } catch(e) { java.longToast('\\n搜索作者失败:' + e); url = 'http:\/\/127.0.0.1'; }\n            }\n        }\n        else if (key.startsWith('作者@')) {\n            let uid = key.slice(3);\n            if (!\/^\\d{3,}$\/.test(uid)) java.longToast('\\n请输入正确的id');\n            else url = 'https:\/\/app-api.pixiv.net\/v1\/user\/novels?filter=for_android&user_id='+uid;\t}\n        else if (\/\\d{5,}$\/.test(key) ) {\n            let sid = key.match(\/\\d+$\/)[0];\n            java.put('sid',sid);\n            if (key.startsWith('作者')) java.longToast('\\n请输入正确的搜索格式');\n            else url = `data:;base64,${java.base64Encode(sid)},{\"type\":\"\"}`;}\n        else if (key.startsWith('正文@')) { url = 'https:\/\/app-api.pixiv.net\/v1\/search\/novel?filter=for_android&merge_plain_keyword_results=true&sort=date_desc&search_target=text&word='+key.slice(3);}\n        else { url = 'https:\/\/app-api.pixiv.net\/v1\/search\/novel?filter=for_android&merge_plain_keyword_results=true&word='+key;}\nsource.put('nurls','http:\/\/127.0.0.1');\n} else {url = source.get('nurls');}\ngethd(url)\n<\/js>",
    "weight": 0
}
广告