🅿️ Pixiv 漫画

https://www.pixiv.net/manga

DowneyRem (9968)19小时前

🅿️ Pixiv 漫画

书源版本:246
可用功能:搜索发现添加网址订阅源
搜索插画:插画漫画动图标签
发现漫画:关注追更推荐发现收藏
添加网址:插画链接漫画目录
订阅用法:点击订阅源打开插画/漫画目录,【刷新】,点击【加入书架】按钮,添加到书架

书源发布:Pixiv 书源频道 https://t.me/PixivSource
项目地址:https://github.com/DowneyRem/PixivSource
使用教程:https://github.com/DowneyRem/PixivSource/blob/main/doc/Pixiv.md

旧版书源:
https://cdn.jsdelivr.net/gh/DowneyRem/PixivSource@191/pixiv.json
https://raw.githubusercontent.com/DowneyRem/PixivSource/191/pixiv.json

规则订阅:import 订阅源
https://cdn.jsdelivr.net/gh/DowneyRem/PixivSource@main/import.json
https://raw.githubusercontent.com/DowneyRem/PixivSource/main/import.json

⚙️ 书源设置:
书源管理 - 编辑书源 - 基本 - 变量说明 - 修改并保存
二维码导入
{
    "bookSourceComment": "🅿️ Pixiv 漫画(更新📆:2025-11-22)\n\n书源版本:246\n可用功能:✅搜索✅发现✅添加网址✅订阅源\n搜索插画:✅插画✅漫画✅动图✅标签\n发现漫画:✅关注✅追更✅推荐✅发现✅收藏\n添加网址:✅插画链接✅漫画目录\n订阅用法:点击订阅源打开插画\/漫画目录,【刷新】,点击【加入书架】按钮,添加到书架\n\n书源发布:Pixiv 书源频道 https:\/\/t.me\/PixivSource\n项目地址:https:\/\/github.com\/DowneyRem\/PixivSource\n使用教程:https:\/\/github.com\/DowneyRem\/PixivSource\/blob\/main\/doc\/Pixiv.md\n\n旧版书源:\nhttps:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@191\/pixiv.json\nhttps:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/191\/pixiv.json\n\n规则订阅:import 订阅源\nhttps:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/import.json\nhttps:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/import.json\n\n⚙️ 书源设置:\n书源管理 - 编辑书源 - 基本 - 变量说明 - 修改并保存",
    "bookSourceGroup": "🔞 Pixiv 漫画",
    "bookSourceName": "🅿️ Pixiv 漫画",
    "bookSourceType": 2,
    "bookSourceUrl": "https:\/\/www.pixiv.net\/manga",
    "bookUrlPattern": "(https?:\/\/)?(www\\.)?pixiv\\.net\/((artworks|user\/\\d+\/series)|ajax\/(illust|series))\/\\d+",
    "concurrentRate": "3\/2000",
    "customButton": false,
    "customOrder": 2,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": false,
    "exploreUrl": "@js:\nlet SHOW_GENERAL_NEW, SHOW_GENERAL_RANK\ntry {\n    settings = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))\n    SHOW_GENERAL_NEW = settings.SHOW_GENERAL_NEW     \/\/ 发现:最新、企划、约稿显示一般小说\n} catch (e) {\n    SHOW_GENERAL_NEW = false\n}\n\nli = [\n    {\"⭐️ 关注\": \"https:\/\/www.pixiv.net\/ajax\/follow_latest\/illust?p={{page}}&mode=all&lang=zh\"},\n    {\"📃 追更\": \"https:\/\/www.pixiv.net\/ajax\/watch_list\/manga?p={{page}}&new=1&lang=zh\"},\n    {\"💯 推荐\": \"https:\/\/www.pixiv.net\/ajax\/top\/illust?mode=all&lang=zh\"},\n    {\"🔍 发现\": \"https:\/\/www.pixiv.net\/ajax\/illust\/discovery?mode=all&lang=zh\"},\n    {\"❤️ 收藏\": \"https:\/\/www.pixiv.net\/ajax\/user\/{{cache.get(\\\"pixiv:uid\\\")}}\/illusts\/bookmarks?tag=&offset={{(page-1)*24}}&limit=24&rest=show&lang=zh\"},\n    {\"㊙️ 收藏\": \"https:\/\/www.pixiv.net\/ajax\/user\/{{cache.get(\\\"pixiv:uid\\\")}}\/illusts\/bookmarks?tag=&offset={{(page-1)*24}}&limit=24&rest=hide&lang=zh\"},\n    {\"🏠 首页\": \"https:\/\/www.pixiv.net\"},\n    {\"🆙 更新\": \"https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/pixiv.json\"}\n]\n\nr18New = [\n    {\"🆕 最新 企划 约稿 💰\": \"\"},\n    {\"🆕 最新\": \"https:\/\/www.pixiv.net\/ajax\/illust\/new?lastId=0&limit=20&type=manga&r18=true&lang=zh\"},\n    {\"📑 企划\": \"https:\/\/www.pixiv.net\/ajax\/user_event\/portal\/artworks?mode=r18&p={{page}}&lang=zh\"},\n    {\"💰 约稿\": \"https:\/\/www.pixiv.net\/ajax\/commission\/page\/request\/complete\/manga?mode=r18&p={{page}}&lang=zh\"},\n    {\"🔍 发现\": \"https:\/\/www.pixiv.net\/ajax\/illust\/discovery?mode=r18&lang=zh\"},\n]\n\ngeneralNew = [\n    {\"✅ 最新 企划 约稿 ✅\": \"\"},\n    {\"最新\": \"https:\/\/www.pixiv.net\/ajax\/illust\/new?lastId=0&limit=20&type=manga&lang=zh\"},\n    {\"企划\": \"https:\/\/www.pixiv.net\/ajax\/user_event\/portal\/artworks?mode=all&p={{page}}&lang=zh\"},\n    {\"约稿\": \"https:\/\/www.pixiv.net\/ajax\/commission\/page\/request\/complete\/manga?mode=all&p={{page}}&lang=zh\"},\n    {\"发现\": \"https:\/\/www.pixiv.net\/ajax\/illust\/discovery?mode=all&lang=zh\"}\n]\n\nr18Rank = [\n    {\"👑 排行榜单 👑\": \"\"},\n    {\"今日\": \"https:\/\/www.pixiv.net\/ranking.php?mode=daily_r18&p={{page}}&format=json\"},\n    {\"本周\": \"https:\/\/www.pixiv.net\/ranking.php?mode=weekly_r18&p={{page}}&format=json\"},\n    {\"R18G\": \"https:\/\/www.pixiv.net\/ranking.php?mode=r18g&p={{page}}&format=json\"},\n    {\"男性\": \"https:\/\/www.pixiv.net\/ranking.php?mode=male_r18&p={{page}}&format=json\"},\n    {\"女性\": \"https:\/\/www.pixiv.net\/ranking.php?mode=female_r18&p={{page}}&format=json\"}\n]\n\ngeneralRank = [\n    {\"🏆 排行榜单 🏆\": \"\"},\n    {\"今日\": \"https:\/\/www.pixiv.net\/ranking.php?mode=daily&p={{page}}&format=json\"},\n    {\"本周\": \"https:\/\/www.pixiv.net\/ranking.php?mode=weekly&p={{page}}&format=json\"},\n    {\"本月\": \"https:\/\/www.pixiv.net\/ranking.php?mode=monthly&p={{page}}&format=json\"},\n    {\"新人\": \"https:\/\/www.pixiv.net\/ranking.php?mode=rookie&p={{page}}&format=json\"},\n    {\"原创\": \"https:\/\/www.pixiv.net\/ranking.php?mode=original&p={{page}}&format=json\"},\n    {\"A I \": \"https:\/\/www.pixiv.net\/ranking.php?mode=original&p={{page}}&format=json\"},\n    {\"男性\": \"https:\/\/www.pixiv.net\/ranking.php?mode=male&p={{page}}&format=json\"},\n    {\"女性\": \"https:\/\/www.pixiv.net\/ranking.php?mode=female&p={{page}}&format=json\"},\n]\n\nif (SHOW_GENERAL_RANK === true) {\n    li = li.concat(generalNew)\n}\nli = li.concat(r18New)\nli = li.concat(r18Rank)\nli = li.concat(generalRank)\n\nli.forEach(item => {\n    item.title = Object.keys(item)[0]\n    item.url = Object.values(item)[0]\n    if (item.url.includes(\"https:\/\/www.pixiv.net\")) item.url = urlIP(item.url)\n    delete item[Object.keys(item)[0]]\n    item.style = {}\n    item.style.layout_flexGrow = 1\n    item.style.layout_flexShrink = 1\n    item.style.layout_alignSelf = \"auto\"\n    item.style.layout_wrapBefore = \"false\"\n    if (item.url === \"\") {\n        item.style.layout_flexBasisPercent = 1\n    } else {\n        item.style.layout_flexBasisPercent = -1\n    }\n})\n\nJSON.stringify(li)",
    "header": "{\"referer\":\"https:\/\/www.pixiv.net\"}",
    "jsLib": "var cacheSaveSeconds = 7*24*60*60  \/\/ 长期缓存时间 7天\nvar cacheTempSeconds = 10*60*1000  \/\/ 短期缓存 10min\n\nfunction cacheGetAndSet(key, supplyFunc) {\n    const {java, cache} = this\n    let v = cache.get(key)\n    \/\/ 缓存信息错误时,保存 10min 后重新请求\n    if (v && JSON.parse(v).error === true) {\n        if (new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n            cache.delete(key)\n            v = cache.get(key)\n        }\n    }\n    \/\/ 无缓存信息时,进行请求\n    if (v === undefined || v === null) {\n        v = supplyFunc()\n        v.timestamp = new Date().getTime()\n        v = JSON.stringify(v)\n        cache.put(key, v, cacheSaveSeconds)\n    }\n    return JSON.parse(v)\n}\n\nfunction isHtmlString(str) {\n    return str.startsWith(\"<!DOCTYPE html>\")\n}\nfunction isJsonString(str) {\n    try {\n        if (typeof JSON.parse(str) === \"object\") return true\n    } catch(e) {}\n    return false\n}\n\nfunction isLogin() {\n    const {java, cache} = this\n    return !!cache.get(\"csfrToken\")\n}\nfunction getAjaxJson(url, forceUpdate) {\n    const {java, cache} = this\n    let v = cache.get(url)\n    if (forceUpdate || v && new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n        cache.delete(url)\n    }\n    return this.cacheGetAndSet(url, () => {\n        return JSON.parse(java.ajax(url))\n    })\n}\nfunction getAjaxAllJson(urls, forceUpdate) {\n    const {java, cache} = this\n    let v = cache.get(urls)\n    if (forceUpdate || v && new Date().getTime() >= JSON.parse(v).timestamp + cacheTempSeconds) {\n        cache.delete(urls)\n    }\n    return this.cacheGetAndSet(urls, () => {\n        let result = java.ajaxAll(urls).map(resp => JSON.parse(resp.body()))\n        cache.put(urls, JSON.stringify(result), cacheSaveSeconds)\n        for (let i in urls) cache.put(urls[i], JSON.stringify(result[i]), cacheSaveSeconds)\n        return result\n    })\n}\nfunction getWebviewJson(url, parseFunc) {\n    const {java, cache} = this\n    return this.cacheGetAndSet(url, () => {\n        let html = java.webView(null, url, null)\n        return JSON.parse(parseFunc(html))\n    })\n}\n\nfunction urlIP(url) {\n    const {java, cache, source} = this\n    let isIPDirect\n    if (source.bookSourceName.includes(\"备用\") || source.bookSourceName.includes(\"漫画\")) {\n        isIPDirect = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))?.IPDirect || false\n    } else {\n        isIPDirect = JSON.parse(cache.get(\"pixivSettings\")).IPDirect || false\n    }\n\n    if (isIPDirect) {\n        url = url.replace(\"http:\/\/\", \"https:\/\/\").replace(\"www.pixiv.net\", \"210.140.139.155\")\n        let headers = {\n            \/\/ \"User-Agent\": \"Mozilla\/5.0 (Linux; Android 14)\",\n            \/\/ \"X-Requested-With\": \"XMLHttpRequest\",\n            \"Host\": \"www.pixiv.net\",\n            \/\/ \"x-csrf-token\": cache.get(\"csfrToken\") || \"\",\n            \/\/ \"Cookie\": cache.get(\"pixivCookie\") || \"\"\n        }\n        return `${url}, ${JSON.stringify({headers: headers})}`\n    }\n    return url\n}\n\nfunction urlIllustUrl(illustId) {\n    return `https:\/\/www.pixiv.net\/artworks\/${illustId}`\n}\nfunction urlIllustDetailed(illustId) {\n    return `https:\/\/www.pixiv.net\/ajax\/illust\/${illustId}?lang=zh`\n}\nfunction urlIllustsDetailed(userId, idList) {\n    return `https:\/\/www.pixiv.net\/ajax\/user\/${userId}\/illusts?${idList.map(v => \"ids[]=\" + v).join(\"&\")}`\n}\nfunction urlSeriesUrl(userId, seriesId) {\n    return `https:\/\/www.pixiv.net\/user\/${userId}\/series\/${seriesId}`\n}\nfunction urlSeriesDetailed(seriesId, page) {\n    if (page === undefined) page = 1\n    return `https:\/\/www.pixiv.net\/ajax\/series\/${seriesId}?p=${page}&lang=zh`\n}\n\nfunction urlUserAllWorks(userId) {\n    return `https:\/\/www.pixiv.net\/ajax\/user\/${userId}\/profile\/all?lang=zh`\n}\n\nfunction urlSearchArtwork(name, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/search\/artworks\/${encodeURI(name)}?word=${encodeURI(name)}&order=date_d&mode=all&p=${page}&s_mode=s_tc&type=all&lang=zh`\n}\nfunction urlSearchIllust(name, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/search\/artworks\/${encodeURI(name)}?word=${encodeURI(name)}&order=date_d&mode=all&p=${page}&s_mode=s_tc&type=illust&lang=zh`\n}\nfunction urlSearchManga(name, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/search\/artworks\/${encodeURI(name)}?word=${encodeURI(name)}&order=date_d&mode=all&p=${page}&s_mode=s_tc&type=manga&lang=zh`\n}\nfunction urlSearchUgoira(name, page) {\n    return `https:\/\/www.pixiv.net\/ajax\/search\/artworks\/${encodeURI(name)}?word=${encodeURI(name)}&order=date_d&mode=all&p=${page}&s_mode=s_tc&type=ugoira&lang=zh`\n}\n\/\/ 完全匹配用户名\nfunction urlSearchUser(name) {\n    return `https:\/\/www.pixiv.net\/search\/users?nick=${encodeURI(name)}&s_mode=s_usr&nick_mf=1`\n}\n\nfunction urlCoverUrl(url) {\n    const {java, cache, source} = this\n    let isIPDirect\n    if (source.bookSourceName.includes(\"备用\")|| source.bookSourceName.includes(\"漫画\")) {\n        isIPDirect = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))?.IPDirect || false\n    } else {\n        isIPDirect = JSON.parse(cache.get(\"pixivSettings\")).IPDirect || false\n    }\n\n    let headers = {\"Referer\": \"https:\/\/www.pixiv.net\/\"}\n    if (isIPDirect && url.trim()) {\n        if (url.includes(\"i.pximg.net\")) {\n            url = url.replace(\"https:\/\/i.pximg.net\", \"https:\/\/210.140.139.133\")\n            headers.host = \"i.pximg.net\"\n        } else {\n            url = url.replace(\"https:\/\/s.pximg.net\", \"https:\/\/210.140.139.133\")\n            headers.host = \"s.pximg.net\"\n        }\n    }\n    return `${url}, ${JSON.stringify({headers: headers})}`\n}\n\nfunction dateFormat(str) {\n    let addZero = function (num) {\n        return num < 10 ? '0' + num : num;\n    }\n    let time = new Date(str);\n    let Y = time.getFullYear() + \"年\";\n    let M = addZero(time.getMonth() + 1) + \"月\";\n    let D = addZero(time.getDate()) + \"日\";\n    return Y + M + D;\n}\nfunction timeFormat(str) {\n    let addZero = function (num) {\n        return num < 10 ? '0' + num : num;\n    }\n    let time = new Date(str);\n    let YY = time.getFullYear()\n    let MM = addZero(time.getMonth() + 1)\n    let DD = addZero(time.getDate())\n    let hh = addZero(time.getHours())\n    let mm = addZero(time.getMinutes())\n    let ss = addZero(time.getSeconds())\n    return `${YY}-${MM}-${DD} ${hh}:${mm}:${ss}`\n}\nfunction timeTextFormat(text) {\n    return `${text.slice(0, 10)} ${text.slice(11, 19)}`\n}\nfunction sleep(time) {\n    let endTime = new Date().getTime() + time\n    while(true){\n        if (new Date().getTime() > endTime){\n            return;\n        }\n    }\n}\nfunction sleepToast(text, second) {\n    const {java} = this\n    java.log(text)\n    java.longToast(text)\n    if (second === undefined || second <= 2) {second = 2}\n    sleep(1000*second)\n}\n\nfunction updateSource() {\n    const {java, source} = this\n    java.longToast(\"🆙 更新书源\\n\\nJsdelivr CDN 更新有延迟\\nGithub 更新需代理\")\n    let onlineSource, comment, sourceName, sourceNameCapitalize, index = 0\n    if (source.bookSourceUrl.includes(\"pixiv\")) sourceName = \"pixiv\"\n    else if (source.bookSourceUrl.includes(\"furrynovel\")) sourceName = \"linpx\"\n    sourceNameCapitalize = sourceName[0].toUpperCase() + sourceName.substring(1)\n\n    if (source.bookSourceName.includes(\"备用\")) index = 1\n    else if (source.bookSourceName.includes(\"漫画\")) index = 2\n    if (source.bookSourceUrl.includes(\"furrynovel.com\")) {\n        sourceNameCapitalize = \"FurryNovel\"\n        index = 1\n    }\n\n    try {\n        let updateUrl = `https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/${sourceName}.json`\n        onlineSource = JSON.parse(java.get(updateUrl,{'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body())[index]\n        comment = onlineSource.bookSourceComment.split(\"\\n\")\n    } catch (e) {\n        try {\n            let updateUrl = `https:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/${sourceName}.json`\n            onlineSource = JSON.parse(java.get(updateUrl,{'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body())[index]\n            comment = onlineSource.bookSourceComment.split(\"\\n\")\n        } catch (e) {\n            onlineSource = {lastUpdateTime: new Date().getTime()}\n            comment = source.bookSourceComment.split(\"\\n\")\n        }\n    }\n    comment = onlineSource.bookSourceComment.split(\"\\n\")\n    \/\/ onlineSource = source\n    \/\/ comment = source.bookSourceComment.split(\"\\n\")\n\n    let htm = `\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>更新 ${source.bookSourceName} 书源<\/title>\n    <style> \n    table { text-align: center; margin: 0 auto; } .ann { display: flex; justify-content: center; align-items: center; height: 5vh; } \n    button { background-color: rgb(76, 175, 80); color: white; border: none; border-radius: 4px; height: 6vh; width: 30vw; overflow: hidden; } \n    button span { cursor: pointer; display: inline-block; position: relative; transition: 0.4s; } \n    button span:after { content: '>'; position: absolute; opacity: 0; top: 0; right: 30px; transition: 0.2s; } \n    button:active span { padding-right: 20px; } \n    button:active span:after { opacity: 1; right: -40px; }\n    <\/style>\n<\/head>\n\n<body>\n    <table border=\"1\" cellspacing=\"0\">\n        <th colspan=\"2\"> ${source.bookSourceName} 书源 \n        <a href=\"https:\/\/github.com\/DowneyRem\/PixivSource\/blob\/main\/doc\/FurryNovel.md\">🔰 使用指南<\/a>\n        ||<a href=\"https:\/\/github.com\/DowneyRem\/PixivSource\/blob\/main\/doc\/Sponsor.md\">❤️ 赞助开发<\/a>\n        <\/th>\n        <tr>\n            <td>☁️ 远程版本:${onlineSource.bookSourceComment.split(\"\\n\")[2].replace(\"书源版本:\", \"\")}<\/td>\n            <td>📆 更新:${timeFormat(onlineSource.lastUpdateTime)}<\/td>\n        <\/tr>\n        <tr>\n            <td>📥 本地版本:${source.bookSourceComment.split(\"\\n\")[2].replace(\"书源版本:\", \"\")}<\/td>\n            <td>📆 更新:${timeFormat(source.lastUpdateTime)}<\/td>\n        <\/tr> \n        <tr><td colspan=\"2\" style=\"text-align: left;\">${comment.slice(3, 8).join(\"<br>\")}<\/td><\/tr>\n        <tr><td colspan=\"2\" style=\"text-align: left;\">${comment.slice(comment.length-2, comment.length).join(\"<br>\")}<\/td><\/tr>\n    <\/table>\n    \n    <table border=\"0\" cellspacing=\"20\">\n        <th colspan=\"2\"> 更新 ${source.bookSourceName} 书源 <\/th>\n        <tr><td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/${sourceName}.json\">\n            <button><span>更新书源<br>(Jsdelivr CDN)<\/span><\/button>\n            <\/a><\/div><\/td>\n            \n            <td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/cdn.jsdelivr.net\/gh\/DowneyRem\/PixivSource@main\/btsrk.json\">\n            <button><span>更新订阅<br>(Jsdelivr CDN)<\/span><\/button>\n            <\/a><\/div><\/td>\n        <\/tr>\n        \n        <tr><td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/${sourceName}.json\">\n            <button><span>书源链接<br>(GitHub)<\/span><\/button>\n            <\/a><\/div><\/td>\n            \n            <td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/raw.githubusercontent.com\/DowneyRem\/PixivSource\/main\/btsrk.json\">\n            <button><span>订阅链接<br>(GitHub)<\/span><\/button>\n            <\/a><\/div><\/td>\n        <\/tr>\n        \n        <tr><td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/codeberg.org\/DowneyRem\/PixivSource\/raw\/branch\/main\/${sourceName}.json\">\n            <button><span>备用书源链接<br>(Codeberg)<\/span><\/button>\n            <\/a><\/div><\/td>\n            \n            <td><div class=\"ann\">\n            <a href=\"legado:\/\/import\/importonline?src=https:\/\/codeberg.org\/DowneyRem\/PixivSource\/raw\/branch\/main\/btsrk.json\">\n            <button><span>备用订阅链接<br>(Codeberg)<\/span><\/button>\n            <\/a><\/div><\/td>\n        <\/tr>\n    <\/table>\n<\/body>\n<\/html>`\n    java.startBrowser(`data:text\/html;charset=utf-8;base64, ${java.base64Encode(htm)}`, '更新书源')\n    return []\n}",
    "lastUpdateTime": "1763623894212",
    "loginCheckJs": "var util = {}\n\nfunction objStringify(obj) {\n    return JSON.stringify(obj, (n, v) => {\n        if (typeof v == \"function\")\n            return v.toString();\n        return v;\n    });\n}\n\n\/\/ 检测 源阅\n\/\/ 可用 java.ajax() 不可用 java.webview() java.ajaxAll()\n\/\/ 可用 java.getCookie() cache.put() cache.get() 默认值为 undefined\n\/\/ 可用 java.startBrowser() 不可用 java.startBrowserAwaitAwait\n\/\/ 可用 source.bookSourceName source.getVariable() source.setVariable()等\n\/\/ java.getUserAgent() java.getWebViewUA() 目前返回内容相同\nfunction isSourceRead() {\n    let isSourceReadStatus = java.getUserAgent() === java.getWebViewUA()\n    cache.put(\"isSourceRead\", isSourceReadStatus)\n    return isSourceReadStatus\n}\n\/\/ 检测 阅读 正式版 与 Beta 版本\nfunction isLegadoOfficial() {\n    let isLegadoOfficialStatus\n    try {\n        eval('({})?.value')\n        isLegadoOfficialStatus = false\n    } catch (e) {\n        isLegadoOfficialStatus = true\n    }\n    cache.put(\"isLegadoOfficial\", isLegadoOfficialStatus)\n    return isLegadoOfficialStatus\n}\n\/\/ 检测 阅读 Beta 版本 与 LYC 版本\n\/\/ LYC 版本新增函数\n\/\/ java.ajaxTestAll()\n\/\/ java.openVideoPlayer(url: String, title: String, float: Boolean)\n\/\/ cookie.setWebCookie(url,cookie)\n\/\/ source.refreshExplore()\n\/\/ source.refreshJSLib()\nfunction isLegadoLYC() {\n    let isLegadoLYCStatus = (typeof java.ajaxTestAll === \"function\")\n    cache.put(\"isLegadoLYCStatus\", isLegadoLYCStatus)\n    return isLegadoLYCStatus\n}\n\nfunction publicFunc() {\n    let u = {}, settings = {}\n    \/\/ 输出书源信息\n    java.log(`${source.bookSourceComment.split(\"\\n\")[0]}`)\n    java.log(`📌 ${source.bookSourceComment.split(\"\\n\")[2]}`)\n    java.log(`📆 更新时间:${java.timeFormat(source.lastUpdateTime)}`)\n    if (isSourceRead()) {\n        java.log(\"📱 软件平台:🍎 源阅 SourceRead\")\n    } else if (isLegadoOfficial()) {\n        java.log(\"📱 软件平台:🤖 开源阅读 【正式版】\")\n        java.log(\"当前软件为:阅读【正式版】\\n\\n【正式版】已年久失修,不推荐继续使用\\n推荐使用【Beta版】【共存\/新共存版】\\n\\nBeta版本下载链接:\\nhttps:\/\/miaogongzi.lanzout.com\/b01rgkhhe\\n如需更新,可去书源调试界面\\n打开下载链接切换阅读版本\\n\")\n    } else {\n        if (isLegadoLYC()) {\n            java.log(\"📱 软件平台:🤖 开源阅读 Beta\/LYC 版\")\n        } else {\n            java.log(\"📱 软件平台:🤖 开源阅读 Beta 版(未合入 LYC 功能)\")\n        }\n    }\n\n    \/\/ 载入设置\n    settings = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))\n    let isIPDirect = settings?.IPDirect || false\n    if (isIPDirect) java.log(\"✈️ 直连模式:✅ 已开启\")\n\n    if (settings !== null) {\n        java.log(\"⚙️ 使用自定义设置\")\n    } else {\n        settings = {}\n        settings.CONVERT_CHINESE = true     \/\/ 搜索:搜索时进行繁简转换\n        settings.SHOW_ORIGINAL_LINK = true  \/\/ 目录:显示源链接\n        settings.QUALITY_REGULAR = true     \/\/ 正文:图片质量,regular 或 original\n        settings.IPDirect = false           \/\/ 全局:直连模式\n        settings.DEBUG = false              \/\/ 全局:调试模式\n        java.log(\"⚙️ 使用默认设置(无自定义设置 或 自定义设置有误)\")\n    }\n\n    if (settings.IPDirect) {\n        settings.SEARCH_AUTHOR = false       \/\/ 搜索:默认关闭搜索作者名称\n        settings.SHOW_ORIGINAL_LINK = false  \/\/ 目录:不显示章节源链接\n    } else {\n        settings.IPDirect = false\n        settings.SEARCH_AUTHOR = true        \/\/ 搜索:默认关闭搜索作者名称\n        settings.SHOW_ORIGINAL_LINK = true   \/\/ 目录:不显示章节源链接\n    }\n\n    u.settings = settings\n    \/\/ putInCache(\"pixivSettings\", settings)  \/\/ 设置写入缓存\n\n    u.environment = {}\n    u.environment.IS_SOURCEREAD = isSourceRead()\n    u.environment.IS_LEGADO = !isSourceRead()\n    u.environment.IS_LYC_BRUNCH = isLegadoLYC()\n    \/\/ putInCache(\"sourceEnvironment\", u.environment)  \/\/ 设置写入缓存\n\n    u.debugFunc = (func) => {\n        if (util.settings.DEBUG === true) {\n            func()\n        }\n    }\n\n    u.checkStatus = function(status) {\n        if (status === true) return \"✅ 已\"\n        else if (status === false) return \"❌ 未\"\n        else if (status === undefined) return \"🈚️ 无数据:\"\n    }\n\n    u.login = function() {\n        let resp = java.startBrowserAwait(`https:\/\/accounts.pixiv.net\/login,\n    {\"headers\": {\"User-Agent\": \"${java.getWebViewUA()}\"}}`, '登录账号', false)\n        if (resp.code() === 200) {\n            this.getCsrfToken(); this.getCookie()\n        } else {\n            java.log(resp.code()); sleepToast(\"⚠️ 登录失败\")\n        }\n    }\n\n    u.logout = function() {\n        this.removeCookie()\n        java.startBrowser(\"https:\/\/www.pixiv.net\/logout.php\", \"退出账号\")\n        this.removeCookie()\n        sleepToast(`✅ 已退出当前账号\\n\\n退出后请点击右上角的 ✔️ 退出\\n\\n登录请点击【登录账号】进行登录`)\n    }\n\n    u.getCookie = function() {\n        let pixivCookie = String(java.getCookie(\"https:\/\/www.pixiv.net\/\", null))\n        if (isLogin()) cache.put(\"pixivCookie\", pixivCookie, 60*60)  \/\/ 缓存1h\n    }\n\n    u.removeCookie = function() {\n        cookie.removeCookie('https:\/\/www.pixiv.net')\n        cookie.removeCookie('https:\/\/accounts.pixiv.net')\n        cookie.removeCookie('https:\/\/accounts.google.com')\n        cookie.removeCookie('https:\/\/api.weibo.com')\n        cache.delete(\"pixivCookie\")\n        cache.delete(\"pixiv:uid\")\n        cache.delete(\"pixivCsrfToken\")  \/\/ 与登录设备有关\n        cache.delete(\"headers\")\n    }\n\n    \/\/ 获取 Csrf Token,以便进行收藏等请求\n    \/\/ 获取方法来自脚本 Pixiv Previewer\n    \/\/ https:\/\/github.com\/Ocrosoft\/PixivPreviewer\n    \/\/ https:\/\/greasyfork.org\/zh-CN\/scripts\/30766-pixiv-previewer\/code\n    u.getCsrfToken = function() {\n        let pixivCsrfToken = cache.get(\"pixivCsrfToken\")\n        if (!pixivCsrfToken) {\n            let html = java.webView(null, \"https:\/\/www.pixiv.net\/\", null)\n            try {\n                pixivCsrfToken = html.match(\/token\\\\\":\\\\\"([a-z0-9]{32})\/)[1]\n                cache.put(\"pixivCsrfToken\", pixivCsrfToken)  \/\/ 与登录设备有关,无法存储 nul\n            } catch (e) {\n                pixivCsrfToken = null\n                cache.delete(\"pixivCsrfToken\")  \/\/ 与登录设备有关,无法存储 nul\n                \/\/ sleepToast(\"⚠️ 未登录账号(pixivCsrfToken)\")\n            }\n            java.log(`pixivCsrfToken:\\n${pixivCsrfToken}`)\n        }\n        return pixivCsrfToken\n    }\n\n    u.handIllusts = function (illusts) {\n        illusts.forEach(illust => {\n            \/\/ illust.id = illust.id\n            \/\/ illust.title = illust.title\n            \/\/ illust.userName = illust.userName\n            \/\/ illust.tags = illust.tags\n            if (!(illust.tags instanceof Array)) {\n                illust.tags = illust.tags.tags.map(item => item.tag)\n                illust.coverUrl = illust.url = illust.urls.regular  \/\/ 兼容正文搜索\n                illust.updateDate = illust.uploadDate\n            }\n            illust.textCount = null\n            \/\/ illust.pageCount = illust.pageCount\n            \/\/ illust.description = illust.description\n            illust.coverUrl = illust.url\n            illust.detailedUrl = urlIP(urlIllustDetailed(illust.id))\n            \/\/ illust.createDate = illust.createDate\n            \/\/ illust.updateDate = illust.updateDate\n            \/\/ illust.aiType = illust.aiType\n\n            if (illust.seriesNavData === undefined || illust.seriesNavData === null) {\n                illust.latestChapter = illust.title\n            } else {\n                illust.seriesId = illust.seriesNavData.seriesId\n                illust.title = illust.seriesNavData.title\n            }\n\n            if (illust.seriesId !== undefined) {\n                let resp = getAjaxJson(urlIP(urlSeriesDetailed(illust.seriesId))).body\n                let series = resp.illustSeries.filter(item => item.id === illust.seriesId)[0]\n                \/\/ illust.title = illust.title\n                illust.tags = illust.tags.concat(series.tags)\n                illust.latestChapter = resp.thumbnails.illust.filter(item => item.id === series.latestIllustId)[0].title\n                illust.description = series.description\n                if (series.url === undefined) {\n                    let firstChapter = getAjaxJson(urlIP(urlIllustDetailed(series.firstIllustId))).body\n                    illust.coverUrl = firstChapter.urls.regular\n                    illust.tags = illust.tags.concat(firstChapter.tags.tags.map(item => item.tag))\n                }\n                illust.createDate = series.createDate\n                illust.updateDate = series.updateDate\n                illust.total = series.total\n            }\n        })\n        return illusts\n    }\n\n    u.formatIllusts = function (illusts) {\n        illusts.forEach(illust => {\n            illust.title = illust.title.replace(RegExp(\/^\\s+|\\s+$\/g), \"\")\n            illust.tags = Array.from(new Set(illust.tags))\n            illust.tags = illust.tags.join(\",\")\n            illust.coverUrl = urlCoverUrl(illust.coverUrl)\n            illust.createDate = dateFormat(illust.createDate)\n            illust.updateDate = dateFormat(illust.updateDate)\n            if (util.MORE_INFORMATION) {\n                illust.description = `\\n书名:${illust.title}\\n作者:${illust.userName}\\n标签:${illust.tags}\\n页面:${illust.pageCount}\\n上传:${illust.createDate}\\n更新:${illust.updateDate}\\n简介:${illust.description}`\n            } else {\n                illust.description = `\\n${illust.title},共${illust.pageCount}页\\n${illust.description}\\n上传时间:${illust.createDate}\\n更新时间:${illust.updateDate}`\n            }\n        })\n        return illusts\n    }\n\n    u.getIllustRes = function (result) {\n        let illustId = 0, res = {}\n        let isJson = isJsonString(result)\n        let isHtml = result.startsWith(\"<!DOCTYPE html>\")\n        if (!isJson && isHtml) {\n            let pattern1 = \"(https?:\/\/)?(www\\\\.)?pixiv\\\\.net\/(artworks|ajax\/illust)\/(\\\\d+)\"\n            let isIllust = baseUrl.match(new RegExp(pattern1))\n            let pattern2 = \"(https?:\/\/)?(www\\\\.)?pixiv\\\\.net\/(user\/\\\\d+|ajax)\/series\/(\\\\d+)\"\n            let isSeries = baseUrl.match(new RegExp(pattern2))\n\n            if (isIllust) {\n                illustId = isIllust[4]\n            } else if (isSeries) {\n                seriesId = isSeries[4]\n                java.log(`匹配系列ID:${seriesId}`)\n                illustId = getAjaxJson(urlIP(urlSeriesDetailed(seriesId))).body.page.series.reverse()[0].workId\n            }\n        }\n        if (isJson) {\n            res = JSON.parse(result)\n        }\n\n        if (illustId) {\n            java.log(`匹配插画ID:${illustId}`)\n            res = getAjaxJson(urlIP(urlIllustDetailed(illustId)))\n        }\n        if (res.error) {\n            java.log(`无法从 Pixiv 获取当前漫画`)\n            java.log(JSON.stringify(res))\n            return []\n        }\n        return res.body\n    }\n\n    util = u\n    java.put(\"util\", objStringify(u))\n}\n\n\/\/ 获取请求的user id方便其他ajax请求构造\nfunction getPixivUid() {\n    let uid = cache.get(\"pixiv:uid\")\n    if (!uid || String(uid) === \"null\") {\n        let html = java.webView(null, \"https:\/\/www.pixiv.net\/\", null)\n        try {\n            uid = html.match(\/user_id:'(\\d+)'\/)[1]\n        } catch (e) {\n            uid = null\n        }\n        cache.put(\"pixiv:uid\", String(uid))\n    }\n}\n\npublicFunc()\nif (result.code() === 200) {\n    getPixivUid(); util.getCookie(); util.getCsrfToken()\n}\njava.getStrResponse(null, null)",
    "loginUi": "",
    "loginUrl": "https:\/\/accounts.pixiv.net\/login",
    "respondTime": 180000,
    "ruleBookInfo": {
        "author": "userName",
        "canReName": "true",
        "coverUrl": "coverUrl",
        "init": "@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction illustHandler(illust){\n    illust = util.formatIllusts(util.handIllusts([illust]))[0]\n    book.bookUrl = illust.detailedUrl = urlIllustUrl(illust.id)\n    book.tocUrl = illust.catalogUrl = urlIP(urlIllustDetailed(illust.id))\n    return illust\n}\n\n(() => {\n    return illustHandler(util.getIllustRes(result))\n})()",
        "intro": "description",
        "kind": "tags",
        "lastChapter": "latestChapter",
        "name": "title",
        "tocUrl": "catalogUrl"
    },
    "ruleContent": {
        "content": "@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction getContent(res) {\n    let content = [\"\"]\n    \/\/ li = \"mini thumb small regular original\".split(\" \")\n    let quality = util.settings.QUALITY_REGULAR ? \"regular\" : \"original\"\n    let illustLink = getAjaxJson(urlIP(urlIllustDetailed(res.id))).body.urls[quality]\n    for (let order = 0; order < res.pageCount; order++) {\n        content.push(`<img src=\"${urlCoverUrl(illustLink)}\">`)\n        illustLink = illustLink.replace(`_p${order}`, `_p${order + 1}`)\n    }\n    content = content.join(\"\\n\")\n    return content\n}\n\n(function () {\n    return getContent(util.getIllustRes(result))\n})()",
        "imageStyle": "FULL"
    },
    "ruleExplore": {
        "author": "userName",
        "bookList": "@js:\nvar util = objParse(String(java.get(\"util\")))\nvar seriesSet = new Set();  \/\/ 存储seriesID 有BUG无法处理翻页\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction handlerFactory() {\n    if (baseUrl.includes(\"https:\/\/cdn.jsdelivr.net\")) {\n        return () => {updateSource(); return []}\n    }\n    if (!isLogin()) {\n        return handlerNoLogin()\n    }\n    if (baseUrl.includes(\"\/follow_latest\")) {\n        return handlerFollowLatest()\n    }\n    if (baseUrl.includes(\"\/watch_list\")) {\n        return handlerWatchList()\n    }\n    if (baseUrl.includes(\"\/top\")) {\n        return handlerRecommend()\n    }\n    if (baseUrl.includes(\"\/discovery\")) {\n        return handlerDiscovery()\n    }\n    if (baseUrl.includes(\"\/bookmark\")) {\n        return handlerBookMarks()\n    }\n    if (baseUrl.includes(\"\/new\")) {\n        return handlerDiscovery()\n    }\n    if (baseUrl.includes(\"\/commission\/\")) {\n        return handlerFollowLatest()\n    }\n    if (baseUrl.includes(\"\/user_event\/portal\")) {\n        return handlerFollowLatest()\n    }\n    \/\/ 正则匹配网址内容\n    if (baseUrl.includes(\"\/ranking\") && (baseUrl.endsWith(\"json\"))) {\n        return handlerRanking()\n    }\n    if (baseUrl.includes(\"\/ranking\")) {\n        return handlerRegexIllusts()\n    }\n    else {\n        return []\n    }\n}\n\nfunction handlerNoLogin() {\n    return () => {\n        sleepToast(\"此功能需要在书源登录后才能使用\")\n        sleepToast('发现 - 长按\"Pixiv\" - 登录 - 登录账号')\n        return []\n    }\n}\n\n\/\/关注作者,漫画委托,漫画企划\nfunction handlerFollowLatest() {\n    return () => {\n        let res = JSON.parse(result)\n        return util.formatIllusts(util.handIllusts(res.body.thumbnails.illust))\n    }\n}\n\n\/\/ 追更列表\nfunction handlerWatchList() {\n    return () => {\n        let res = JSON.parse(result)\n        \/\/ li =  res.body.page.watchedSeriesIds\n        return util.formatIllusts(util.handIllusts(res.body.thumbnails.illust))\n    }\n}\n\n\/\/ 推荐漫画\nfunction handlerRecommend() {\n    return () => {\n        let res = JSON.parse(result)\n        const recommend = res.body.page.recommend\n        const illusts = res.body.thumbnails.illust\n        let nidSet = new Set(recommend.ids)\n        \/\/ java.log(nidSet.size)\n        let list = illusts.filter(illust => nidSet.has(String(illust.id)))\n        \/\/ java.log(`过滤结果:${JSON.stringify(list)}`)\n        return util.formatIllusts(util.handIllusts(list))\n    }\n}\n\n\/\/发现漫画\nfunction handlerDiscovery() {\n    return () => {\n        let res = JSON.parse(result)\n        return util.formatIllusts(util.handIllusts(res.body.illusts))\n    }\n}\n\n\/\/ 收藏漫画\nfunction handlerBookMarks() {\n    return () => {\n        let res = JSON.parse(result).body.works\n        if (res === undefined || res.length === 0) {\n            \/\/流程无法本环节中止 只能交给下一流程处理\n            return []\n        }\n        return util.formatIllusts(util.handIllusts(res))\n    }\n}\n\n\/\/ 排行榜,顺序相同\nfunction handlerRanking() {\n    return () => {\n        let res = JSON.parse(result)\n        res.contents.forEach(item =>{\n            item.id = item.illust_id\n            \/\/ item.title = item.title\n            item.userName = item.user_name\n            \/\/ item.tags = item.tags\n            item.latestChapter = item.title\n            item.description = null\n            item.coverUrl = item.url\n            item.detailedUrl = urlIP(urlIllustDetailed(item.id))\n            item.createDate = item.updateDate = item.illust_upload_timestamp * 1000\n\n            if (item.illust_series !== false) {\n                let series = item.illust_series\n                item.seriesId = series.illust_series_id\n                item.order = series.illust_series_content_order\n                item.total = series.illust_series_content_count\n                if (item.order === item.total) item.latestChapter = item.title\n                item.title = series.illust_series_title\n                item.description = series.illust_series_caption\n                item.pageCount = series.illust_page_count\n                item.createDate = item.updateDate = series.illust_series_create_datetime\n            }\n        })\n        return util.formatIllusts(util.handIllusts(res.contents))\n    }\n}\n\n\/\/首页,顺序随机\nfunction handlerRegexIllusts() {\n    return () => {\n        let illustIds = []  \/\/ 正则获取网址中的 illustId\n        let matched = result.match(RegExp(\/\\\/artworks\\\/\\d{5,}\/gm))\n        for (let i in matched) {\n            let illustId = matched[i].match(RegExp(\/\\d{5,}\/))[0]\n            if (illustIds.indexOf(illustId) === -1) {\n                illustIds.push(illustId)\n            }\n        }\n        let userIllusts = getWebviewJson(\n            urlIP(urlIllustsDetailed(`${cache.get(\"pixiv:uid\")}`, illustIds)), html => {\n                return (html.match(new RegExp(\">\\\\{.*?}<\"))[0].replace(\">\", \"\").replace(\"<\", \"\"))\n            }).body\n        return util.formatIllusts(util.handIllusts(Object.values(userIllusts)))\n    }\n}\n\n(() => {\n    return handlerFactory()()\n})()",
        "bookUrl": "detailedUrl",
        "coverUrl": "coverUrl",
        "intro": "description",
        "kind": "tags",
        "lastChapter": "latestChapter",
        "name": "title",
        "wordCount": ""
    },
    "ruleSearch": {
        "author": "userName",
        "bookList": "@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction getArtwork() {\n    if (JSON.parse(result).error !== true) {\n        cache.put(urlIP(urlSearchArtwork(java.get(\"key\"), java.get(\"page\"))), result, cacheSaveSeconds)  \/\/ 加入缓存\n        return JSON.parse(result).body.illustManga.data\n    } else {\n        return []\n    }\n}\n\nfunction search(name, page) {\n    let resp = getAjaxJson(urlIP(urlSearchArtwork(name, page)))\n    java.log(urlIP(urlSearchArtwork(name, page)))\n    if (resp.error === true || resp.total === 0) {\n        return {\"data\": [], \"total\":0, \"lastPage\": 0}\n    }\n    return resp.body.illustManga\n}\n\nfunction getConvertArtwork() {\n    let illusts = []\n    let name = String(java.get(\"key\"))\n    let name1 = String(java.s2t(name))\n    let name2 = String(java.t2s(name))\n    if (name1 !== name) illusts = illusts.concat(search(name1, 1).data)\n    if (name2 !== name) illusts = illusts.concat(search(name2, 1).data)\n    return illusts\n}\n\n(() => {\n    let artworks = []\n    artworks = artworks.concat(getArtwork())\n    if (util.settings.CONVERT_CHINESE) artworks = artworks.concat(getConvertArtwork())\n    \/\/ java.log(JSON.stringify(artworks))\n    \/\/ 返回空列表中止流程\n    if (artworks.length === 0) {\n        return []\n    }\n    return util.formatIllusts(util.handIllusts(artworks))\n})()",
        "bookUrl": "detailedUrl",
        "checkKeyWord": "测试",
        "coverUrl": "coverUrl",
        "intro": "description",
        "kind": "tags",
        "lastChapter": "latestChapter",
        "name": "title",
        "wordCount": ""
    },
    "ruleToc": {
        "chapterList": "@js:\nvar util = objParse(String(java.get(\"util\")))\n\nfunction objParse(obj) {\n    return JSON.parse(obj, (n, v) => {\n        if (typeof v == \"string\" && v.match(\"()\")) {\n            return eval(`(${v})`)\n        }\n        return v;\n    })\n}\n\nfunction urlIllust(novelId){\n    if (util.settings.SHOW_ORIGINAL_LINK) {\n        return urlIllustUrl(novelId)\n    } else {\n        return urlIllustDetailed(novelId)\n    }\n}\n\nfunction oneShotHandler(res) {\n    return [{\n        title: res.title.replace(RegExp(\/^\\s+|\\s+$\/g), \"\"),\n        chapterUrl: urlIP(urlIllust(res.id)),\n        chapterInfo: `${timeTextFormat(res.createDate)}`\n    }]\n}\n\nfunction seriesHandler(res) {\n    let limit = 12, total = 0, illusts = []\n    let seriesId = res.seriesNavData.seriesId\n    if (res.seriesId === undefined) {\n        total = getAjaxJson(urlIP(urlSeriesDetailed(res.seriesNavData.seriesId))).body.page.total\n    } else {\n        total = res.total\n    }\n    util.debugFunc(() => {\n        java.log(`本系列 ${seriesId} 一共有${total}章`);\n    })\n\n    \/\/要爬取的总次数\n    let max = (total \/ limit) + 1\n    for (let page = 1; page < max; page++) {\n        \/\/ java.log(urlIP(urlSeriesDetailed(seriesId, page)))\n        res = getAjaxJson(urlIP(urlSeriesDetailed(seriesId, page))).body\n        let illusts_id = res.page.series.map(item => item.workId)\n        illusts = illusts.concat(res.thumbnails.illust.filter(illust => illusts_id.includes(illust.id)))\n    }\n    illusts.reverse().forEach(illust => {\n        illust.title = illust.title.replace(RegExp(\/^\\s+|\\s+$\/g), \"\")\n        illust.chapterUrl = urlIP(urlIllust(illust.id))\n        illust.chapterInfo = timeTextFormat(illust.createDate)\n    })\n    \/\/ java.log(JSON.stringify(illusts))\n    return illusts\n}\n\n(() => {\n    let res = util.getIllustRes(result)\n    if (res.seriesNavData !== null) {\n        return seriesHandler(res)\n    } else {\n        return oneShotHandler(res)\n    }\n})()",
        "chapterName": "title",
        "chapterUrl": "chapterUrl",
        "updateTime": "chapterInfo"
    },
    "searchUrl": "@js:\njava.put(\"key\", key)\njava.put(\"page\", page)\njava.log(`🔍 搜索内容:${key}`)\nurlIP(urlSearchArtwork(key, page))",
    "variableComment": "⚙️ 自定义书源设置:\n⚙️ 自定义设置:请在基本-变量说明处修改代码\n⚙️ 自定义设置:将 true 改为 false,或相反\n⚠️ 设置源变量【无法】更改书源自定义设置\n⚠️ 注意不要添加或删除尾随逗号\",\"\n⚠️ 发现页需要长按\"Pixiv\",手动刷新\n以下内容为书源设置:\n{\n\"CONVERT_CHINESE\": true,\n\"SHOW_GENERAL_NEW\": false,\n\"QUALITY_REGULAR\": true,\n\n\"IPDirect\": false,\n\"DEBUG\": false,\n\n\"SHOW_ORIGINAL_LINK\": true\n}\n\n\/\/ CONVERT_CHINESE\n\/\/ 搜索:搜索时进行繁简转换\n\/\/ SHOW_ORIGINAL_LINK\n\/\/ 目录:显示源链接,但会增加请求次数\n\/\/ QUALITY_REGULAR\n\/\/ 正文:图片质量:是 regular ;否 original\n\n\/\/ IPDirect\n\/\/ 直连模式\n\/\/ DEBUG\n\/\/ 调试模式\n\n\/\/ SHOW_GENERAL_NEW\n\/\/ 发现:最新、企划、约稿显示一般漫画\n\n",
    "weight": 0
}
广告