🌈pixiv小说

https://pixiv小说.luoyacheng.ip-ddns.com##测试版

jiajunjin (10775)1天前

对洛娅橙大佬pixiv进行修改,增加了漫画发现,搜索未还是小说,登录详情按钮无法对漫画部分生效,其他基本兼容
二维码导入
{
    "bookSourceComment": "漫画详情未增加,搜索未增加,大部分漫画功能实现",
    "bookSourceGroup": "🙈,pixiv",
    "bookSourceName": "🌈pixiv小说",
    "bookSourceType": 0,
    "bookSourceUrl": "https:\/\/pixiv小说.luoyacheng.ip-ddns.com##测试版",
    "bookUrlPattern": "http:\/\/localhost\/|https:\/\/www.pixiv.net\/novel\/series\/\\d{3,}",
    "concurrentRate": "3\/2000",
    "customOrder": 0,
    "enabled": true,
    "enabledCookieJar": false,
    "enabledExplore": true,
    "exploreUrl": "@js:\nvar loginInfo = JSON.parse(source.getLoginInfo() || \"{}\");\n\nlet banben=\"1.1.9\";\nvar obj = {\n\t\"►漫画◄\": {\n        \"url\": ``,\n        \"fb\": 1\n    },\n\"动态\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https:\/\/app-api.pixiv.net\/v2\/illust\/follow?restrict=all';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n\"推荐\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https:\/\/app-api.pixiv.net\/v1\/illust\/recommended?filter=for_ios&include_ranking_label=true';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"收藏\": {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https:\/\/app-api.pixiv.net\/v1\/user\/bookmarks\/illust?user_id='+id+'&restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"wb\": 1\n    },\n    \"追更\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https:\/\/app-api.pixiv.net\/v1\/watchlist\/manga';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"►小说◄\": {\n        \"url\": ``,\n        \"fb\": 1\n    },\n    \"动 态\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https:\/\/app-api.pixiv.net\/v1\/novel\/follow?restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"推 荐\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https:\/\/app-api.pixiv.net\/v1\/novel\/recommended?include_privacy_policy=true&filter=for_android&include_ranking_novels=true';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"收 藏\": {\n        \"url\": `{{\n            if (page == 1) {\n                let id = source.getLoginInfoMap().get('id');\n                url = 'https:\/\/app-api.pixiv.net\/v1\/user\/bookmarks\/novel?user_id='+id+'&restrict=public';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"wb\": 1\n    },\n    \"追 更\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https:\/\/app-api.pixiv.net\/v1\/watchlist\/novel';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`\n    },\n    \"ⅹⅷ\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https:\/\/app-api.pixiv.net\/v1\/novel\/ranking?filter=for_android&mode=day_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"wb\": 1,\n        \"fb\": 0.25\n    },\n    \"ⅹⅷ_AI\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https:\/\/app-api.pixiv.net\/v1\/novel\/ranking?filter=for_android&mode=week_ai_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"fb\": 0.25\n    },\n    \"ⅹⅷ_WK\": {\n        \"url\": `{{\n            if (page == 1) {\n                url = 'https:\/\/app-api.pixiv.net\/v1\/novel\/ranking?filter=for_android&mode=week_r18';\n            } else {url = source.get('nurl');}\n            url=gethd(url);\n        }}`,\n        \"fb\": 0.25\n    }\n};\n\nif (loginInfo && loginInfo[\"tag\"] && typeof loginInfo[\"tag\"] === \"string\") {\n    var tagArr = loginInfo[\"tag\"].split(\/[,,|]\/);\n    var validTagArr = [];\n    for (var i = 0; i < tagArr.length; i++) {\n        var tag = tagArr[i].trim();\n        if (tag !== \"\") {\n            validTagArr.push(tag);\n        }\n    }\n    for (var j = 0; j < validTagArr.length; j++) {\n        var item = validTagArr[j];\n        var key = item;\n        var urlTemplate = \"{{if (page == 1) {url = 'https:\/\/app-api.pixiv.net\/v1\/search\/novel?filter=for_android&merge_plain_keyword_results=true&word=\" + item + \"';} else {url = source.get('nurl');} url=gethd(url);}}\";\n        obj[key] = { url: urlTemplate };\n    }\n}\n\n\nvar sort = [];\npush = (title, url, fg, wrap, fb) => sort.push({\n    \"title\": title,\n    \"url\": url,\n    \"style\": {\n      layout_flexGrow: fg || 1,\n      layout_flexBasisPercent: fb||-1,\n      layout_wrapBefore: wrap ? true : false\n     }\n  });\n\nfor (x in obj) {\npush(x, obj[x].url, obj[x].fg, obj[x].wb, obj[x].fb);\n}\nJSON.stringify(sort);",
    "header": "@js:\n(()=>{\n\tlet headers = gethd();\n\treturn JSON.stringify(headers);\n})();",
    "jsLib": "\/\/参考自开源项目:pixez-flutter🙏\nsleep = Packages.java.lang.Thread.sleep;\nua = 'PixivAndroidApp\/5.0.166 (Android 14; RMX3366)';\nappv = '5.0.166';\na_l = 'zh-CN';\n\nbiaoq = new RegExp('^(?:NTR|NTL|修仙|奇幻|后宫|纯爱|隐奸|乱伦|乱交|母女.?|母子|父女|幼女|姐弟|人妻|正太|足交|口交|肛交|丝袜|催眠|系统|原创|续写|软饭流|修罗场|规则怪谈|女性视角|性开放世界|奸尸|冰恋|.?重口)$','i');\n\nfunction timemd5(time) {\n\tconst {java, source} = this;\nlet salt = '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c';\nlet hash = java.md5Encode(time + salt);\n\treturn hash;\n}\n\nfunction gethd(url='',ck='') {\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 = {\n    'x-client-time': time,\n    \t'User-Agent': ua,\n    \t'accept-language': a_l,\n    \t'authorization': atk,\n    \t'app-os': 'Android',\n    \t'app-os-version': 'Android 14',\n    \t'app-version': appv,\n    'x-client-hash': hash,\n    'cookie': ''\n    \t }\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 {\n\tdelete headers['x-client-time'];\n\tdelete headers['x-client-hash'];\n\treturn url + ',' + JSON.stringify({'headers':headers});}\n};\n\n\nfunction leng(str) {\n\tlet length = 0;\n\tconst fuhao = ',.?!:;()[]\"';\n\tconst fuhao2 = '📘';\n\tfor (let char of str) {\n\t\tif (fuhao.includes(char) ) length += 0.5;\n\t\telse if (fuhao2.includes(char) ) length += 2;\n\t\telse length += 1;\n\t\t}\n\t\treturn length;\n}\n\nfunction gethdi(url='') {\turl=url.replace(\"i.pximg.net\",\"210.140.139.133\");\nlet imgoptions = {\n  headers: {\n    'User-Agent': 'PixivIOSApp\/5.8.0',\n    'accept-encoding': 'gzip, br',\n    'referer': 'https:\/\/app-api.pixiv.net\/',\n    'host': 'i.pximg.net'\n    }\n  };\n  return url+','+JSON.stringify(imgoptions);\n }\n \nfunction copy(txt) {\n\tlet htm = `data:text\/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\nbody {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 60vh;}\n<\/style>\n<\/head>\n<body>\n<textarea id=\"copyt\" rows=\"3\">${txt}<\/textarea>\n<br>\n<button id=\"btn1\" onclick=\"copy()\">复制<\/button>\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\nconst textarea = document.getElementById(\"copyt\");\ntextarea.style.height = \"auto\";\ntextarea.style.height = textarea.scrollHeight + \"px\";});\nfunction copy() {\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ndocument.execCommand(\"copy\");}\n<\/script>\n<\/body><\/html>`;\nthis.java.startBrowser(htm,'复制');\n\t}\n\n\nfunction lookc(lyc) {\nconst [title,uid,unm,uim,tags,caption,cdate,xh,sc,gk,sTitle,id,ugz] = lyc;\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\twidth: 100%;\n\ttable-layout: fixed;\n\ttext-align: center;\n\tmargin: 0 auto;\n\tword-break: break-all;\n\t}\ntd img {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: contain;\n\t}\n.cap {\n\t text-align: left;\n\t text-indent: 2em;\n\t}\na {text-decoration: none;}\np {margin: 0.2em auto;}\n<\/style>\n<\/head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<tr>\n<th colspan=\"6\">标题:<a href=\"https:\/\/www.pixiv.net\/novel\/show.php?id=${id}\">${title}<\/a><\/th>\n<\/tr>\n<tr>\n<td colspan=\"4\">\n作者:<a href=\"https:\/\/www.pixiv.net\/users\/${uid}\">${unm}<\/a>\n${ugz=='true' ? '<span style=\"font-size: 0.7em;\"> (已关注)<\/span>' : ''}\n<\/td>\n<td colspan=\"2\"><img src=\"${uim}\"><\/td>\n<\/tr>\n${sTitle!='' ? ('<tr><td colspan=\"6\">小说:《'+sTitle+'》'+'<\/td><\/tr>') : ''}\n<tr>\n<td>喜欢<\/td>\n<td>${xh}<\/td>\n<td>收藏<\/td>\n<td>${sc}<\/td>\n<td>观看<\/td>\n<td>${gk}<\/td>\n<\/tr>\n<tr>\n<td>时间<\/td>\n<td colspan=\"5\">${cdate}<\/td>\n<\/tr>\n<td>标签<\/td>\n<td colspan=\"5\">${tags}<\/td>\n<\/tr>\n${caption!='' ? ('<tr><td>简介<\/td><td class=\"cap\" colspan=\"5\">'+caption+'<\/td><\/tr>') : ''}\n<\/table>\n<br>\n<script>\n\n<\/script>\n<\/body><\/html>`;\nlet java=this.java;\njava.startBrowser(`data:text\/html;base64,${java.base64Encode(htm)}`,'信息');\n}\n\nfunction gengxin(){\nconst {java, source} = this;\n\tlet url0='https:\/\/gitee.com\/lyc486\/yuedu2\/commits\/main\/书源\/pixiv小说\/pixiv.json?browser_history=0&page=1&per=3';\n\tlet rr0=java.get(url0,{'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body();\n\tlet \tgxlrr = com.jayway.jsonpath.JsonPath.read(rr0, '$.list[0:3].title');\n\tlet [gxlr, gxlr2, gxlr3] = gxlrr;\n\tlet banben =   String(source.exploreUrl).match(\/let banben=\"([\\d\\.]+)\"\/)[1];\n\tgxlr=String(gxlr).split(\/^([^\\-]+)-\/);\n\tgxlr[0]=='' ? '' : gxlr=['','0',gxlr[0]];\n\tlet gxts;\n\tif (gxlr[1]>banben){gxts=['更新','0,140,186'];}\n\telse {gxts= ['导入','76,175,80'];};\n\tlet htm = `<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\ttext-align: center;\n\tmargin: 0 auto;\n\t}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;\n\t}\nbutton {\n\tbackground-color: rgb(${gxts[1]});\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\t}\nbutton span {\n  cursor: pointer;\n  display: inline-block;\n  position: relative;\n  transition: 0.4s;\n}\nbutton span:after {\n  content: '>';\n  position: absolute;\n  opacity: 0;\n  top: 0;\n  right: 30px;\n  transition: 0.2s;\n}\nbutton:active span {\n  padding-right: 20px;\n}\nbutton:active span:after {\n  opacity: 1;\n  right: -40px;\n}\n<\/style>\n<\/head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<th colspan=\"2\">最新日志:${gxlr[2]}<\/th>\n<tr>\n<td>仓库版本:${gxlr[1]}<\/td>\n<td>本地版本:${banben}<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" style=\"text-align: left;\">往期日志:${gxlr2}<br>     ${gxlr3}<\/td>\n<\/tr>\n<\/table>\n<div class=\"ann\">\n<a href=\"legado:\/\/import\/importonline?src=https:\/\/github.com\/Luoyacheng\/yuedu\/raw\/main\/书源\/pixiv小说\/pixiv.json\">\n<button><span>${gxts[0]}<\/span><\/button>\n<\/a>\n<\/div>\n<a href=\"legado:\/\/import\/importonline?src=https:\/\/cdn.jsdelivr.net\/gh\/Luoyacheng\/yuedu@main\/书源\/pixiv小说\/pixiv.json\" style=\"font-size: 10px;\">备用链接<\/a>\n<\/body>\n<\/html>`;\nif(typeof this.book=='undefined'||gxts[0]=='更新') java.startBrowser(`data:text\/html;base64,${java.base64Encode(htm)}`,'px更新');\r\n}\nfunction fankui(){\tthis.java.startBrowser('https:\/\/github.com\/Luoyacheng\/yuedu\/discussions\/categories\/b-pixiv?discussions_q=','px反馈');\n}",
    "lastUpdateTime": "1761992198936",
    "loginCheckJs": "\/\/java.toast('登录检查:'+result);\n\nif (result.code() == 400) {\n\tsource.login();\n\tsleep(500);\n\tlet url = gethd(result.url());\n\tresult = java.connect(url);\n\t}\nresult",
    "loginUi": "[\n    {\n        name: \"token\",\n        type: \"text\"\n    },\n    {\n        name: \"token说明\",\n        type: \"button\",\n        action: \"java.longToast(`\ntoken说明:\n填写该值后点击右上角√进行登录\n可以通过获取token按钮得到(不需要跳转app)\n阅读正式版无法支持获取token功能`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"获取token\",\n        type: \"button\",\n        action: \"Login()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"id\",\n        type: \"text\"\n    },\n    {\n        name: \"id说明\",\n        type: \"button\",\n        action: \"java.longToast(`\nid说明:\n登录时该值为空会自动填写该值,这是登录账号的ID(可手动更改)。\n发现页的收藏分类加载的该ID的收藏`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"搜索说明\",\n        type: \"button\",\n        action: \"java.longToast(`\n搜索说明:\n默认使用关键词搜索\n输入小说id号显示对应的小说\n输入“正文@许斌”搜索正文含许斌的小说\n输入“作者@69559022”搜索指定id作者的书`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    {\n        name: \"书名\",\n        type: \"text\"\n    },\n     {\n        name: \"↑追更该书\",\n        type: \"button\",\n        action: \"scz(3)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消追更\",\n        type: \"button\",\n        action: \"scz(30)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"章节\",\n        type: \"text\"\n    },\n    {\n        name: \"↑收藏该章\",\n        type: \"button\",\n        action: \"scz(1)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"详情\",\n        type: \"button\",\n        action: \"caption()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消收藏\",\n        type: \"button\",\n        action: \"scz(10)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"作者\",\n        type: \"text\"\n    },\n    {\n        name: \"↑关注作者\",\n        type: \"button\",\n        action: \"scz(2)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n     {\n        name: \"复制id\",\n        type: \"button\",\n        action: \"fuzhi(1)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n     {\n        name: \"取消关注\",\n        type: \"button\",\n        action: \"scz(20)\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"📘书名标识\",\n        type: \"button\",\n        action: \"gongcun()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"反馈\",\n        type: \"button\",\n        action: \"fankui()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    \t{\n        name: \"版本更新\",\n        type: \"button\",\n        action: \"gengxin()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"🫧补充序号\",\n        type: \"button\",\n        action: \"xvhao()\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    {\n        name: \"占位\",\n        type: \"button\",\n        action: \"java.longToast(`这里没有东西`);\",\n        style: {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n        }\n    },\n    \t{\n        name: \"书源介绍\",\n        type: \"button\",\n        action: \"java.startBrowser('https:\/\/luoyacheng.cloudns.ch\/#P站','介绍');\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    },\n    \t{\n        name: \"#简介标签\",\n        type: \"button\",\n        action: \"biaoqian()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": -1\n        }\n    }, \n    {\n    \t  name: \"tag\",\n    \t  type: \"text\"\n     },\n         {\n        name: \"屏蔽tag\",\n        type: \"text\"\n    }\n]",
    "loginUrl": "function gongcun() {\nlet gc = source.get('gc');\nif(gc!=1) {source.put('gc',1);java.toast('🟢已开启\\n书名开头会有📘符号');}\nelse {source.put('gc',0);java.toast('⚫已关闭\\n不会添加📘');}\n\t}\nfunction xvhao() {\nlet xh = source.get('xh');\nif(xh!=1) {source.put('xh',1);java.toast('🟢已开启\\n会自动补充章节名序号');}\nelse {source.put('xh',0);java.toast('⚫已关闭\\n不会补充序号');}\n\t}\nfunction biaoqian() {\nlet bq = source.get('bq');\nif(bq!=1) {source.put('bq',1);java.toast('🟢已开启\\n会在简介显示作品标签');}\nelse {source.put('bq',0);java.toast('⚫已关闭\\n不会显示简介标签');}\n\t}\n\nfunction login() {\nlet time = java.timeFormatUTC(Date.now(),\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\",8*60*60*1000);\nlet hash = timemd5(time);\n\tlet headers = {\n    'User-Agent': 'PixivAndroidApp\/5.0.155 (Android 6.0; Pixel C)',\n    'content-type': 'application\/x-www-form-urlencoded',\n    'x-client-hash': hash,\n    'accept-language': a_l,\n    'app-version': appv,\n    'app-os-version': 'Android 6.0',\n    'x-client-time': time,\n    'app-os': 'Android'\n  };    \n  let url = 'https:\/\/oauth.secure.pixiv.net\/auth\/token';\n  headers['host']='oauth.secure.pixiv.net';\n  url =url.replace(\"oauth.secure.pixiv.net\",\"210.140.139.155\");\n    let Info = source.getLoginInfoMap();\n    \n  try {\n  let tk = Info.token;\n  let body = `client_id=MOBrBDS8blbauoSck0ZfDbtuzpyT&client_secret=lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj&grant_type=refresh_token&refresh_token=${tk}&include_policy=true`;\n\tlet rr = java.post(url,body,headers).body();\n\tlet atk = rr.match(\/\"access_token\"[:\\s\"]+([^\"]+)\/)[1];\n\tsource.putLoginHeader(atk);\n\tif (Info.id=='') {\n\t\tInfo.id = com.jayway.jsonpath.JsonPath.read(rr, \"$.user.id\");}\n\tsource.putLoginInfo(JSON.stringify(Info));\n\t\/\/java.toast('\\n😆登录成功');\n\t} catch(err) {\n\t\tjava.toast('\\n💔登录失败');\n\t\tjava.log('px登录失败:'+err);\n  \tsleep(600);}\n}\n\nfunction scz(x) {\n\tlet headers = gethd();\n\t\/\/let url = 'https:\/\/app-api.pixiv.net\/';\n\tlet url = \"https:\/\/210.140.139.155\/\";\n\tlet body,nm,tt,ttt;\n\tlet yes = cache.get('yes');\n\tif (x==1) {\n\t \tlet id = cache.get('pxid');\n\t \tif (id=='') ttt='请刷新章节';\nif (yes == 2) {\n\t url += 'v2\/illust\/bookmark\/add';\n\t \tbody = 'illust_id='+id+'&restrict=public';\n} else {\n\t url += 'v2\/novel\/bookmark\/add';\n\t \tbody = 'novel_id='+id+'&restrict=public';\n}\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt='收藏';\n\t } else if (x==2) {\n\t \turl += 'v1\/user\/follow\/add';\n\t \tlet uid = cache.get('pxuid');\n\t \tif (uid=='') ttt='请刷新章节或详情页';\n\t \tbody = 'user_id='+uid+'&restrict=public';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='关注';\n\t \t} else if(x==10) {\n\t \tlet id = String(cache.get('pxid'));\n\t \tif (yes == 2) {\n\t url += 'v1\/illust\/bookmark\/delete';\n\t \tbody = id ? 'illust_id='+id : '';\n} else {\n\t \turl += 'v1\/novel\/bookmark\/delete';\n\t \tbody = id ? 'novel_id='+id : '';\n\t \t}\n\t \tnm = source.getLoginInfoMap().get('章节');\n\t \ttt='取消收藏😅';\n\t \t} else if(x==20) {\n\t \turl += 'v1\/user\/follow\/delete';\n\t \tlet uid = String(cache.get('pxuid'));\n\t \tbody = uid ? 'user_id='+uid : '';\n\t \tnm = source.getLoginInfoMap().get('作者');\n\t \ttt='取消关注😅';\n\t \t} else if(x==3) {\n\t \t\n\t \tlet sid = cache.get('pxsid');\n\t \tif (sid=='') ttt='请刷新详情页';\n\t \tif (yes == 2) {\n\t url += 'v1\/watchlist\/manga\/add';\n\t \tbody = 'series_id='+sid;\n} else {\n\turl += 'v1\/watchlist\/novel\/add';\n\t \tbody = 'series_id='+sid;\n\t \t}\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='追更';\n\t \t} else if(x==30) {\n\t \tlet sid = String(cache.get('pxsid'));\n\t \tif (yes == 2) {\n\t url += 'v1\/watchlist\/manga\/delete';\n\t \tbody = sid ? 'series_id='+sid : '';\n} else {\n\turl += 'v1\/watchlist\/novel\/delete';\n\t \tbody = sid ? 'series_id='+sid : '';\n\t \t}\n\t \tnm = source.getLoginInfoMap().get('书名');\n\t \ttt='取消追更😅';\n\t \t}\n\n\ttry {\n\t\tif (ttt) {java.longToast(ttt);throw 't空';}\n\t\tif (!body) throw 'b空';\n\t\theaders['host']='app-api.pixiv.net';\n\t\tlet jg = java.post(url,body,headers).statusCode();\n\t\tif (jg!=200) throw tt+'响应码异常';\n\t\telse java.longToast(`\\n已${tt}:\\n${nm}`);\n\t\t} catch(e) {\n\t\t\tif (!ttt) java.toast(`\\n${tt}失败`);\n\t\t\tjava.log(e);}\n\t}\n\nfunction reck() {\nsource.removeLoginHeader();\ncookie.removeCookie('https:\/\/accounts.pixiv.net');\ncookie.removeCookie('https:\/\/accounts.google.com');\ncookie.removeCookie('https:\/\/api.weibo.com');\n\t}\n\nfunction Login() {\nlet rkey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\nlet cv='';\nfor (let i = 0; i < 128; i++) {\n\tlet ra = Math.floor(Math.random()*rkey.length);\n\tcv+=rkey.charAt(ra);}\n\nlet aly = new JavaImporter(\nPackages.cn.hutool.crypto.digest.Digester,\nPackages.cn.hutool.core.codec.Base64,\nPackages.cn.hutool.crypto.digest.DigestAlgorithm);\nwith (aly) {\n\t\/\/转ASCII数组\n\tlet asBs =  Packages.java.lang.String(cv).getBytes(\"US-ASCII\");\n\t\/\/创建SHA256并计算\n\tlet digester = new Digester(DigestAlgorithm.SHA256);\n\tlet hashBs = digester.digest(asBs);\n\t\/\/Base64URL编码并移除填充\n\tvar codeChallenge  = Base64.encodeUrlSafe(hashBs);\n}\n\nlet urllg =`https:\/\/app-api.pixiv.net\/web\/v1\/login?code_challenge=${codeChallenge}&code_challenge_method=S256&client=pixiv-android`;\nreck();\n\/\/防止重定向错误,清书源cookie。也需要手动清内置浏览器cookie\n\nlet wbua=java.getWebViewUA().replaceAll(\"; wv| Version\\\/4.0\",'')+'';\nif (\/HUA\\s*WEI\/i.test(wbua))\nwbua=\"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\";\n\nlet bb=java.startBrowserAwait(urllg+`,{\n\"headers\":{\n\t\"User-Agent\": \"${wbua}\"\n\t}}`,'登录',false).body();\nlet code;\nif (bb.includes('<title>Online com')) {\nsleep(600);\njava.toast('稍等');\nlet over = java.webViewGetOverrideUrl(bb,'https:\/\/app-api.pixiv.net\/','','pixiv:.*');\ncode = over.match(\/code=([^&]+)\/);\n}\nreck();\n\nlet token;\nif (code) {\nlet tkurl = 'https:\/\/oauth.secure.pixiv.net\/auth\/token';\nlet headers = gethd();\nlet 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`;\nlet tkr = java.post(tkurl,body,headers);\n\/\/java.log(tkr.body());\ntoken = tkr.body().match(\/refresh_token\":\"([^\"]+)\/);\n}\n\nif (token) {\nlet htm = `data:text\/html;charset=utf-8,<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>\nh2 {\n\ttext-align: center;\n\tline-height: 6;}\ntextarea {\n\tfont-size: 12px;\n\twidth: 96%;\n\tmargin: 10px 2%;\n\tpadding: 6px;}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;}\nbutton {\n\tbackground-color: rgb(76,175,80);\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\ttransition: font-size 0.3s;\n\tfont-size: 16px;}\n.an-s {\n\tfont-size: 12px;}\n.alert-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: rgba(0, 0, 0, 0.6);\n\tdisplay: none;\n\tjustify-content: center;\n\talign-items: center;\n\tz-index: 9999;}\n\/* 对话框主体 *\/\n.alert-box {\n\tbackground: rgb(232,234,246);\n\tpadding: 10px;\n\tborder-radius: 12px;\n\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tmin-width: 100px;\n\ttext-align: center;}\n<\/style><\/head>\n<body>\n<div class=\"alert-overlay\" id=\"alertO\">\n <div class=\"alert-box\">\n  <p>已复制到剪贴板:<\/p>\n  <p id=\"alertM\" style=\"font-size: 12px;\"><\/p>\n <\/div>\n<\/div>\n<h2>Token获取成功🥳<\/h2>\n<textarea readonly id=\"copyt\" rows=\"3\">${token[1]}<\/textarea>\n<p style=\"font-size: 12px;\">请复制粘贴到登录界面的token框,然后点击√进行登录<\/p>\n<div class=\"ann\">\n<button id=\"btn1\" onclick=\"copy()\">复制<\/button>\n<\/div>\n<script>\nfunction showAlert(txt, time) {\nconst overlay = document.getElementById('alertO');\nconst message = document.getElementById('alertM');\nmessage.textContent = txt;\noverlay.style.display = 'flex';\nif (time > 0) {\n\tsetTimeout(() => {\n\t\toverlay.style.display = 'none';\n\t\t}, time);\n\t}\n}\nfunction copy() {\nconst btn = document.getElementById('btn1');\nbtn.classList.add('an-s');\nconst cpt = document.getElementById(\"copyt\");\ncpt.select();\ntry {\n    const cpy = document.execCommand(\"copy\");\n    if (cpy.length<9) throw '异常';\n    showAlert(cpt.value, 1000);\n  } catch (e) {alert(\"复制失败,请手动复制\");}\nsetTimeout(() => {\n\tbtn.classList.remove('an-s');\n\t}, 450);\n}\n<\/script>\n<\/body><\/html>`;\n\njava.startBrowser(htm,'获取token');\njava.log(token[1]); \/\/留一份到日志\t\n\t} else {sleep(700);java.toast('获取失败😭');}\n}\n\nfunction fuzhi(x) {\n\tif (x==1) {\n\tlet uid = cache.get('pxuid');\n\tcopy(uid);}\n\tif (x==2) {\n\tlet sid = cache.get('pxsid');\n\tcopy(sid);}\n\t}\n\nfunction caption() {\n\tlet lyc=cache.getFromMemory('pxcjj');\n\tif (lyc) lookc(lyc);\n\telse java.longToast('请刷新正文');\n\t}",
    "respondTime": 229699,
    "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'\\u200b' + auth\n<\/js>",
        "canReName": "1",
        "init": "<js>\nvar sid = java.get('sid');\nvar id = java.get('id');\nlet yes = java.get('yes');\nlet i = String(book.bookUrl).includes('https:\/');\nif (i) { sid = String(book.bookUrl).match(\/\\d{3,}$\/);}\n\ncache.deleteMemory('pxcjj'); \/\/仅通过正文打开详情,防错\nif (sid == '🇨🇳') {\n\tlet Info=source.getLoginInfoMap();\n\tlet bkn = String(book.name);\n\tInfo['书名'] = '';\n\tcache.put('pxsid','');\n\tInfo['章节'] = bkn;\n\tcache.put('pxid',id);\n\tsource.putLoginInfo(JSON.stringify(Info));\n\tlet length = leng(bkn);\t\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(\/, \/g,' #').replace('[','#').replace(']','\\n\\n'):'') + (length>18?('《'+book.name+'》\\n'):'') + java.get('jianjie');\n\trr='1';\n\n} else {\n\tif (yes==2) {\n\turl = 'https:\/\/app-api.pixiv.net\/v1\/illust\/series?illust_series_id=' + sid;\n\t\t} else {\n url = 'https:\/\/app-api.pixiv.net\/v2\/novel\/series?series_id=' + sid;\n}\n\/\/修正bookurl\nbook.bookUrl = `data:;base64,${java.base64Encode(url)},{\"type\":\"px\"}`;\n\ntry {\n\njg = java.connect(gethd(url));\nrr = jg.body();\nif (jg.code() == 400) {\n\tsource.login();\n\tPackages.java.lang.Thread.sleep(500);\n\trr = java.ajax(gethd(url));\n\t}\n\n} catch(err) {\n\trr={};\n\tjava.toast('详情页链接加载失败'+sid);\n\t}\n\n\/\/设置解析结果\njava.setContent(rr);\n\n\n\/\/更新更新时间\ntry {\nlet tm = '';\nif (yes==2){\ntm = java.getString('$.illust_series_first_illust.create_date');\n} else {\n tm = java.getString('$.novel_series_latest_novel.create_date');\n}\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('详情页内容错误');}\n\n\/\/获取书名并净化\nlet bkn = '';\nif (yes==2){\nbkn = String(java.getString('$.illust_series_detail.title')).replace(\/^《(.+)》$\/,'$1');\nbook.name = bkn.replace(\/[((].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[))](?=\\s*[一-ꀀ])\/,'');\n} else {\nbkn = String(java.getString('$.novel_series_detail.title')).replace(\/^《(.+)》$\/,'$1');\nbook.name = bkn.replace(\/[((].{0,9}((?:仙侠|纯爱|后宫|萝莉).?){3,}.{0,9}[))](?=\\s*[一-ꀀ])\/,'');\n}\n\/\/java.log('┌获取书名\\n[99:99.999] └'+book.name);\n\n\/\/获取书名失败\nif (book.name == '') {\n\t\/\/效果,unicode转字符\n\t\/\/ let ee = JSON.stringify(JSON.parse(rr) );\n\tlet txte = java.getString('$..user_message',rr);\n\t\/\/弹出提示,sid相应序列不存在\n\tjava.longToast('\\n未获取到书名\\n'+txte);\n\t} else {\n\t\n\t\/\/放入书名\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\t\n\t\/\/同名共存\n\tif (source.get('gc') == 1) book.name='📘'+book.name;\n\t}\n\n\/\/补充封面链接\nif (book.coverUrl == null) {\n\tlet img = java.getString('$.novel_series_latest_novel.image_urls.large');\n\tbook.coverUrl = gethdi(img);\n\t\t\n\/\/java.log('┌获取封面\\n[99:99.999] └'+book.coverUrl);\n}\n\n\/\/计算书名长度\nlet length = leng(String(book.name));\n\/\/大于18个全角字符\nif (length > 18) length= '《'+String(book.name).replace(\/^📘\/,'')+'》\\n';\nelse length = '';\nlet jianjie = java.getString('$.novel_series_detail.caption');\nbook.intro = (source.get('bq')==1?String(java.get('tags')).replace(\/, \/g,' #').replace('[','#').replace(']','\\n\\n'):'') + length + java.get('jianjie');\njava.put('jianjie',jianjie);\njava.put(\"bookr\",rr);\n}\n\nrr\n<\/js>",
        "lastChapter": "$.novel_series_latest_novel.title##[【《]?{{book.name}}[》】]?",
        "tocUrl": "@js:book.bookUrl",
        "wordCount": "$.novel_series_detail.total_character_count"
    },
    "ruleContent": {
        "content": "<js>\nlet yes = java.get('yes');\nlet cid =java.get('cid');\ncache.put('yes',yes)\nif (yes==2) {\n\tconst jsonStr = java.hexDecodeToString(result);\n\t\/\/java.log(jsonStr)\n\tlet id = java.get('id');\n\tcache.put('pxid',id);\n\tlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nif (inn==0) {\n\tlet 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','');}\n\nInfo['章节'] = chapter.title;\nInfo['作者'] = book.author.replace('\\u200b','');\n\/\/放入UI界面\nsource.putLoginInfo(JSON.stringify(Info));\n}\nvar fixed = jsonStr;\nfixed = fixed.replace(\"{image_urls={\", \"{\\\"image_urls\\\": {\");\nfixed = fixed.replace(\"square_medium=\", \"\\\"square_medium\\\":\\\"\");\nfixed = fixed.replace(\"medium=\", \"\\\"medium\\\":\\\"\");\nfixed = fixed.replace(\"large=\", \"\\\"large\\\":\\\"\");\nfixed = fixed.replace(\"original=\", \"\\\"original\\\":\\\"\");\nfixed = fixed.replace(\".jpg,\", \".jpg\\\", \");\nfixed = fixed.replace(\".jpg}}\", \".jpg\\\"}}\");\nfixed = fixed.replace(\".png,\", \".png\\\", \"); \n​fixed = fixed.replace(\".png}}\", \".png\\\"}}\");\nfixed = fixed.replace(\"}\\n{\", \"},\\n{\");\nfixed = \"[\" + fixed + \"]\";\nfixed= fixed.replace(\/ \/g, ''); \nfixed = fixed.replace(\/\\s+\/g, ' '); \n\/\/java.log(fixed)\nvar imageArray = [];\ntry {\n  imageArray = JSON.parse(fixed);\n} catch (e) {\njava.log(\"错误\")\n}\nvar cctv = \"\";\nfor (var i = 0; i < imageArray.length; i++) {\n  if (imageArray[i] && imageArray[i].image_urls && imageArray[i].image_urls.medium) {\n    cctv += '<img src=\"' + gethdi(imageArray[i].image_urls.large) + '\"\/>';\n    cctv+= \"\\n\";\n  } else {\n    cctv += \"第\" + (i + 1) + \"张:数据异常\\n\";\n  }\n}\njava.log(cctv);\n\t} else {\n\tlet result = java.getString('script.0@html');\nlet rr = result.match(\/novel:\\s*({.+})\/)[1];\nlet id = String(chapter.url).match(\/\\d+(?=$|,)\/)[0];\n\nlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nif (inn==0) {\nlet rra = result.match(\/authorDetails:\\s*({.+})\/)[1];\n\/\/作者信息\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);\n\/\/作品信息\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);\n\/\/放入信息\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();\n\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','');}\n\nInfo['章节'] = chapter.title;\nInfo['作者'] = book.author.replace('\\u200b','');\n\/\/放入UI界面\nsource.putLoginInfo(JSON.stringify(Info));\n}\n\nlet urls = java.getString('$..urls',rr);\nlet tt = String(java.getString('$.text',rr));\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,'<img src=\"'+gethdi(url)+'\"\/>');\n\t}\nfor (x of img2) {\n\tlet id = x.match(\/[\\d\\-]+\/)[0];\n\tlet url = java.getString('$..'+id+'..images.original',rr);\n\tif (url=='null') url = java.getString('$..'+id+'..images.medium',rr);\n\tlet re = new RegExp('\\\\[pixivimage\\\\:'+id+'\\\\]');\n\ttt = tt.replace(re,'<img src=\"'+gethdi(url)+'\"\/>');\n\t}\ntt.replaceAll('[newpage]','\\n—换页符—\\n').replace(\/\\[\\[jumpuri\\:(.+)\\>.+\\]\\]\/,'🖇️$1🖇️')\n}\n<\/js>",
        "imageStyle": "SINGLE"
    },
    "ruleExplore": {
        "author": "@js:\nlet uid = java.getString('$.user.id');\njava.put('uid',uid);\njava.getString('$.user.name');",
        "bookList": "<js>\nlet yes = 1;\nif (baseUrl.startsWith('http:\/\/127.0') ) {\n\trr = [{}];\n\t} else {\nlet nurl = java.getString('$.next_url');\nif (nurl == '') {\n\tjava.toast('发现页到底了');\n\tsource.put('nurl','http:\/\/127.0.0.1');\n\t}\nelse {\n\tsource.put('nurl',nurl);\n\t}\n\tif (baseUrl.includes('illust')) {\n\t\trr = java.getElement(\"$.illusts\");\n\t\tyes = 2;\n\t\t} else if (baseUrl.includes('\/watchlist\/') ) {\n\trr = java.getElement(\"$.series\");\n\t} else { rr = java.getElement(\"$.novels\");}\n}\nif (baseUrl.includes('manga')) {\n\tyes = 2;\n\t}\njava.put('yes',yes);\nrr\n<\/js>",
        "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nlet cid = java.getString('$.meta_pages');\nif (baseUrl.includes('illust')) {\n\t\trr = 'https:\/\/app-api.pixiv.net\/webview\/v2\/novel?id=' + id;\n\t\tif (sid=='') {\n  \tif (cid=='') {\n  \t\tcid = java.getString('$.image_urls')\ncid=cid.replace(\"{square_medium\", \"{image_urls={square_medium\");\n                       cid=cid.replace(\"}\",\"}}\")\n\t\trr = cid;\n\t\t} else {\n\t\trr = cid;\n\t\t\t}\n\t\t\t}\n\t\t} else {\n  rr = 'https:\/\/app-api.pixiv.net\/webview\/v2\/novel?id=' + id;\n}\n\nif (baseUrl.includes('\/watchlist\/') ) {\n\tsid = id;\n\tif (source.get('gc')=='1') book.name='📘'+book.name;\n}\nelse if (sid=='') {sid='🇨🇳';}\nelse {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n}\njava.put('id',id);\njava.put('sid',sid);\n`data:;base64,${java.base64Encode(rr)},{\"type\":\"px\"}`\n<\/js>",
        "coverUrl": "<js>\nif (baseUrl.includes('\/watchlist\/') ) {url = java.getString('$.url');}\nelse {\nurl = java.getString('$.image_urls.large')\n;}\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\/') ) {\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=='萝莉') {\n\t\t\t\tif (!rrr.includes('幼女')) rrr.unshift(x);}\n\t\t\telse if (['熟女','淫妻'].includes(x)) {\n\t\t\t\tif (!rrr.includes('人妻')) rrr.unshift(x);}\n\t\t\telse if (['仙侠','古风','武侠'].includes(x) && !rrr.some(y=>\/[修仙古风武侠]{2}\/.test(y))) {\n\t\t\t\t\trrr.unshift(x);}\n\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);\n\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');\n\nlet tags = java.getStringList('$.tags..name');\njava.put('tags',tags);\ntags=String(tags).slice(1,-1).split(\/, |\\\/\/);\nlet bptag=source.getLoginInfoMap()['屏蔽tag']||'';\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.')) {rr = [{}];}\n\nelse {\nrr = java.getElement('$.novels');\nnurl = java.getString('$.next_url');\nif (rr.length<6&&page==1&&nurl!='') {\n\t\/\/处理不触发下一页且有nurl的情况\n\tsleep(500);\n\trs = java.ajax(gethd(nurl));\n\tjava.setContent(rs)\n\trrr = java.getElement('$.novels');\n\t\/\/合并对象函数,可直接用\n\trr.addAll(rrr);\n\tnurl = java.getString('$.next_url');\n}\n\nif (nurl == '') {\n\tjava.toast('搜索页到底了');\n\tsource.put('nurls','http:\/\/127.0.0.1');\n\t} else {source.put('nurls',nurl);}\n\n}\nrr\n<\/js>",
        "bookUrl": "<js>\nlet id = java.getString('$.id');\nlet sid = java.getString('$.series.id');\nif (sid=='') {\n\tsid='🇨🇳';\n\t} else {\n\tlet jj = java.get('jianjie');\n\tjava.put('jianjie',book.name+'\\n'+jj);\n\t}\nlet rr = 'https:\/\/app-api.pixiv.net\/webview\/v2\/novel?id=' + id;\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');\nlet yes = java.get('yes');\nif (yes == 2) {\n    book.type = 64;\n    } else {\n    book.type = 8;\n}\nif (sid == '🇨🇳') {result=[result];}\nelse {\n\ttry {\n\t\tlet url = java.hexDecodeToString(result);\n\t\t\/\/下一页会报错,直接跳过\nlet bookr=java.get('bookr')+'';\nif (!bookr) {\n\tlet rs=java.connect(gethd(url));\n\tif (rs.code() == 400) {\n\t\tsource.login();\n\t\tsleep(500);\n\t\trs=java.connect(gethd(url));}\nbookr=rs.body();}\n\t\tjava.setContent(bookr);\n\t\tjava.put('bookr',''); \/\/保证单目录时进行刷新\n\t\t} catch(e){}\n\t\tif (yes==2) {\n\t\t\ttargetVar = java.getElement('$.illusts');\n\t\t\tstandardArr = Array.isArray(targetVar) ?targetVar : Array.from(targetVar);\n\t\t\tresult = standardArr.slice(0).reverse();\n\t\t\t} else {\nresult = java.getElement('$.novels');\n}\n}\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,'');\n\/\/消除后不剩字则不消除\ncc = title.replace(bkn,'♸').replace(\/[《【]♸[。?!]*[】》]\\s*|♸[。?!\\s]*\/,'')||title;\n\t}\nif (source.get('xh')==1) {\n\tcc='▫️'+cc;\n}\n\tcc\n<\/js>",
        "chapterUrl": "<js>\nlet sid = java.get('sid');\nlet yes = java.get('yes');\nif (sid == '🇨🇳') {\n\tif (yes ==2) { \t\n\t\tlet url = java.hexDecodeToString(result);\n\t\t`data:;base64,${java.base64Encode(url)},{\"type\":\"px\"}` } else {\n\t\tuu=java.hexDecodeToString(result);\n\t\tbook.putCustomVariable('这是单贴,链接:'+uu);\n\t\tgethd(uu);\n\t\t}\n\t}\nelse {\n\tlet id = java.getString('$.id');\n\tjava.put('id',id)\n\tcid = java.getString('$.meta_pages')\n\tif (yes == 2) {\n\t\tif (cid=='') {\n\t\t\tcid = java.getString('$.image_urls');\n                        cid=cid.replace(\"{square_medium\", \"{image_urls={square_medium\");\n                       cid=cid.replace(\"}\",\"}}\")\n\t\t\tuu = cid;\n\t`data:;base64,${java.base64Encode(uu)},{\"type\":\"px\"}`\n\t\t\t} else {\n\tuu = cid;\n\t`data:;base64,${java.base64Encode(uu)},{\"type\":\"px\"}`\n\t}\n\t\t} else {\nuu='https:\/\/app-api.pixiv.net\/webview\/v2\/novel?id=' + id;\ngethd(uu);\n}\n}\n<\/js>",
        "formatJs": "title.replace(\/^▫️(?![第序]|#?第?[\\d零一二三四五六七八九十百千]+[章回])\/,'第'+index+'章 ').replace(\/^▫️\/,'');",
        "nextTocUrl": "$.next_url\n<js>\nif (result!='[]') {\nresult=gethd(result[0]);\n}else{result=[];}\nresult\n<\/js>",
        "updateTime": "$.create_date\n<js>\nif (result) {\nlet d=new Date(result);\nupt=java.timeFormatUTC(d,\"yyyy\/MM\/dd HH:mm\",8*60*60*1000);\n}\nelse '';\n<\/js>"
    },
    "searchUrl": "<js>\nif (page == 1) {\ncache.putMemory('pxpage',page);\n\t\tif (\/^\\u200b\/.test(key)) {\n\t\t\tlet uid = cache.getFromMemory('pxuid');\n\t\t\tif (uid=='') java.longToast('\\n请刷新书籍');\n\t\t\telse url = 'https:\/\/app-api.pixiv.net\/v1\/user\/novels?filter=for_android&user_id=' + uid;}\n\t\telse if (key.startsWith('作者@')) {\n\t\t\tlet uid = key.slice(3);\n\t\t\tif (!\/^\\d{3,}$\/.test(uid)) java.longToast('\\n请输入正确的id');\n\t\t\telse url = 'https:\/\/app-api.pixiv.net\/v1\/user\/novels?filter=for_android&user_id='+uid;\t}\n\t\telse if (\/\\d{5,}$\/.test(key) ) {\n\t\t\tlet sid = key.match(\/\\d+$\/)[0];\n\t\t\tjava.put('sid',sid);\n\t\t\tif (key.startsWith('作者')) java.longToast('\\n请输入正确的搜索格式');\n\t\t\telse url = `data:;base64,${java.base64Encode(sid)},{\"type\":\"\"}`;}\n\t\telse if (key.startsWith('正文@')) {\n\t\t\turl = '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\t\telse { 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\n} else {url = source.get('nurls');}\ngethd(url)\n<\/js>",
    "weight": 0
}
广告