🔞 Pixiv 漫画
https://www.pixiv.net/manga#2025-05-21
md420 (10091)1天前
⚠️需准备VPN/代理,搜索免登录,发现需登录,但建议登录以免被限制或屏蔽部分作品的展示
⚠️注意*这是更新于2025-05-21的相对旧版,功能正常,发布旧版原因是原作者最新版本js报错,尚未修复暂不能使用
Pixiv 漫画(更新📆:2025-05-21)
可用功能:✅搜索✅发现✅添加网址✅订阅源
搜索插画:✅漫画☑️插画❌动图✅标签
发现漫画:✅关注✅追更✅推荐✅发现✅收藏
添加网址:✅Pixiv插画链接✅Pixiv漫画目录
{ "bookSourceComment": "Pixiv 漫画(更新📆:2025-05-21)\n\n可用功能:✅搜索✅发现✅添加网址✅订阅源\n搜索插画:✅漫画☑️插画❌动图✅标签\n发现漫画:✅关注✅追更✅推荐✅发现✅收藏\n添加网址:✅Pixiv插画链接✅Pixiv漫画目录\n订阅用法:点击订阅源打开插画\/漫画目录,【刷新】,点击【加入书架】按钮,添加到书架\n\n书源发布:兽人阅读频道 https:\/\/t.me\/FurryReading\n项目地址:https:\/\/github.com\/windyhusky\/PixivSource\n使用教程:https:\/\/github.com\/windyhusky\/PixivSource\/blob\/main\/doc\/Pixiv.md\n\n规则订阅:import 订阅源\nhttps:\/\/cdn.jsdelivr.net\/gh\/windyhusky\/PixivSource@main\/import.json\nhttps:\/\/raw.githubusercontent.com\/windyhusky\/PixivSource\/main\/import.json\n\n⚙️ 书源设置:\n书源管理 - 编辑书源 - 基本 - 变量说明 - 修改并保存", "bookSourceGroup": "🔞 Pixiv 漫画", "bookSourceName": "🔞 Pixiv 漫画", "bookSourceType": 2, "bookSourceUrl": "https:\/\/www.pixiv.net\/manga#2025-05-21", "bookUrlPattern": "(https?:\/\/)?(www\\.)?pixiv\\.net\/((artworks|user\/\\d+\/series)|ajax\/(illust|series))\/\\d+", "concurrentRate": "180\/60000", "customOrder": 13, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "@js:\nlet SHOW_GENERAL_ILLUST_NEW, SHOW_GENERAL_ILLUST_RANK\ntry {\n settings = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))\n SHOW_GENERAL_ILLUST_NEW = settings.SHOW_GENERAL_ILLUST_NEW \/\/ 发现:最新、企划、约稿显示一般小说\n SHOW_GENERAL_ILLUST_RANK = settings.SHOW_GENERAL_ILLUST_RANK \/\/ 发现:排行榜显示一般小说\n} catch (e) {\n SHOW_GENERAL_ILLUST_NEW = false\n SHOW_GENERAL_ILLUST_RANK = 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\/windyhusky\/PixivSource@main\/pixiv.json\"}\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&content=manga&p={{page}}&format=json\"},\n {\"本周\": \"https:\/\/www.pixiv.net\/ranking.php?mode=weekly_r18&content=manga&p={{page}}&format=json\"},\n {\"R18G\": \"https:\/\/www.pixiv.net\/ranking.php?mode=r18g&content=manga&p={{page}}&format=json\"},\n {\"男性\": \"https:\/\/www.pixiv.net\/ranking.php?mode=male_r18\"},\n {\"女性\": \"https:\/\/www.pixiv.net\/ranking.php?mode=female_r18\"}\n]\n\ngeneralRank = [\n {\"🏆 排行榜单 🏆\": \"\"},\n {\"今日\": \"https:\/\/www.pixiv.net\/ranking.php?mode=daily&content=manga&p={{page}}&format=json\"},\n {\"本周\": \"https:\/\/www.pixiv.net\/ranking.php?mode=weekly&content=manga&p={{page}}&format=json\"},\n {\"本月\": \"https:\/\/www.pixiv.net\/ranking.php?mode=monthly&content=manga&p={{page}}&format=json\"},\n {\"新人\": \"https:\/\/www.pixiv.net\/ranking.php?mode=rookie&content=manga&p={{page}}&format=json\"}\n]\n\nif (SHOW_GENERAL_ILLUST_RANK === true) {\n li = li.concat(generalNew)\n}\nli = li.concat(r18Rank)\nif (SHOW_GENERAL_ILLUST_RANK === true) {\n li = li.concat(generalRank)\n}\n\nli.forEach(item => {\n item.title = Object.keys(item)[0]\n item.url = Object.values(item)[0]\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": "function cacheGetAndSet(cache, key, supplyFunc) {\n let v = cache.get(key)\n if (v === undefined || v === null) {\n v = JSON.stringify(supplyFunc())\n \/\/ 缓存10分钟\n cache.put(key, v, 600)\n }\n return JSON.parse(v)\n}\nfunction isJsonString(str) {\n try {\n if (typeof JSON.parse(str) === \"object\") {\n return true\n }\n } catch(e) {}\n return false\n}\nfunction getAjaxJson(url) {\n const {java, cache} = this\n return cacheGetAndSet(cache, url, () => {\n return JSON.parse(java.ajax(url))\n })\n}\nfunction getWebviewJson(url, parseFunc) {\n const {java, cache} = this\n return cacheGetAndSet(cache, url, () => {\n let html = java.webView(null, url, null)\n return JSON.parse(parseFunc(html))\n })\n}\n\nfunction isLogin() {\n const {java} = this\n let cookie = String(java.getCookie(\"https:\/\/www.pixiv.net\/\", null))\n return cookie.includes(\"first_visit_datetime\")\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=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 return `${url}, {\"headers\": {\"Referer\":\"https:\/\/www.pixiv.net\/\"}}`\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 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}", "lastUpdateTime": "1752822919187", "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\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(`📆 更新时间:${timeFormat(source.lastUpdateTime)}`)\n\n settings = JSON.parse(String(source.variableComment).match(RegExp(\/{([\\s\\S]*?)}\/gm)))\n if (settings !== null) {\n java.log(\"⚙️ 使用自定义设置\")\n } else {\n settings = {}\n settings.CONVERT_CHINESE = true \/\/ 搜索:搜索时进行繁简转换\n settings.SEARCH_ILLUSTS = false \/\/ 搜索插画\n settings.SHOW_ORIGINAL_LINK = true \/\/ 目录处显示源链接,但会增加请求次数\n settings.DEBUG = false \/\/ 调试模式\n java.log(\"⚙️ 使用默认设置(无自定义设置 或 自定义设置有误)\")\n }\n u.CONVERT_CHINESE = settings.CONVERT_CHINESE\n u.SEARCH_ILLUSTS = settings.SEARCH_ILLUSTS\n u.SHOW_ORIGINAL_LINK = settings.SHOW_ORIGINAL_LINK\n u.DEBUG = settings.DEBUG\n\n u.debugFunc = (func) => {\n if (util.DEBUG === true) {\n func()\n }\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 = 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(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(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.vote = function (id, to, dt) {\n id = id || 25245136; let k = 'vote_' + id;\n if (Date.now() > (+dt || 1754e9) || +String(cache.get(k)) > 0) return;\n let b = `https:\/\/www.pixiv.net\/ajax\/novel\/${id}`,\n t = _ => Date.parse(new Date().toLocaleDateString()) + 828e5 - Date.now(),\n f = _ => cache.put(k, '1', Math.min(3600, t() \/ 1e3 | 0)) & java.ajax(b);\n try {\n java.post(b + '\/poll\/answer', `{\"choice_id\":${to || 2}}`, {\n 'x-csrf-token': cache.get('csfrToken') || this.getCsrfToken(),\n 'Cookie': cache.get(\"pixivCookie\") || this.getCookie(),\n 'Content-Type': 'application\/json'\n }).statusCode() === 200 && f();\n } catch (e) {\n String(e).includes('403') && f();\n }\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(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(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 isLogin() && util.vote()\n java.put(\"util\", objStringify(u))\n}\n\nfunction getCsrfToken() {\n let csfrToken\n let html = java.webView(null, \"https:\/\/www.pixiv.net\/\", null)\n try {\n csfrToken = html.match(\/token\\\\\":\\\\\"([a-z0-9]{32})\/)[1]\n } catch (e) {\n csfrToken = null\n }\n \/\/ java.log(csfrToken)\n cache.put(\"csfrToken\", csfrToken) \/\/ 与登录设备有关\n return csfrToken\n}\n\nfunction getCookie() {\n let pixivCookie = String(java.getCookie(\"https:\/\/www.pixiv.net\/\", null))\n if (pixivCookie.includes(\"first_visit_datetime\")) {\n \/\/ java.log(pixivCookie)\n cache.put(\"pixivCookie\", pixivCookie, 60*60)\n return pixivCookie\n } else {\n cache.delete(\"pixivCookie\")\n sleepToast(\"未登录账号(pixivCookie)\")\n return null\n }\n}\n\n\/\/ 获取请求的user id方便其他ajax请求构造\nfunction getPixivUid() {\n let uid = java.getResponse().headers().get(\"x-userid\")\n if (uid != null) {\n cache.put(\"pixiv:uid\", String(uid))\n } else {\n cache.delete(\"pixiv:uid\")\n }\n}\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}\n\npublicFunc()\nif (result.code() === 200) {\n getPixivUid()\n}\njava.getStrResponse(null, null)", "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 illust.detailedUrl = urlIllustUrl(illust.id)\n illust.catalogUrl = urlIllustDetailed(illust.id)\n return illust\n}\n\n(() => {\n try {\n return illustHandler(util.getIllustRes(result))\n } catch (e) {\n java.log(e)\n java.log(`受 Pixiv 的限制,无法获取当前插画的数据`)\n }\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 illustLink = getAjaxJson(urlIllustDetailed(res.id)).body.urls.regular\n for (let order = 0; order < res.pageCount; order++) {\n content.push(`<img src=\"${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()\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 = 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 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" }, "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 getManga() {\n if (JSON.parse(result).error === true) {\n return []\n }\n let illusts = JSON.parse(result).body.illustManga.data\n illusts.forEach(illust => {illust.tags.unshift(\"漫画\")})\n return illusts\n}\n\nfunction getConvertManga() {\n let MAXPAGES = 2, illusts = []\n let novelName = String(java.get(\"key\"))\n let name = java.s2t(java.t2s(java.s2t(novelName)))\n let resp = getAjaxJson(urlSearchManga(name, 1)).body\n java.log(urlSearchManga(name, 1))\n illusts = illusts.concat(resp.illustManga.data)\n \/\/ for (let page = 2; page < resp.lastPage, page < MAXPAGES; page++) {\n \/\/ illusts = illusts.concat(getAjaxJson(urlSearchManga(name, page)).body.illustManga.data)\n \/\/ java.log(urlSearchManga(name, page))\n \/\/ }\n illusts.forEach(illust => {illust.tags.unshift(\"漫画\")})\n return illusts\n}\n\nfunction getIllust() {\n let MAXPAGES = 3, illusts = []\n let name = String(java.get(\"key\"))\n java.log(urlSearchIllust(name, 1))\n let resp = getAjaxJson(urlSearchIllust(name, 1))\n if (resp.error === true) {\n return []\n }\n illusts = illusts.concat(resp.body.illustManga.data)\n for (let page = Number(java.get(\"page\")) + 1; page < resp.body.illustManga.lastPage, page < MAXPAGES; page++) {\n java.log(`正在搜索第${page}页`)\n let resp = getAjaxJson(urlSearchIllust(name, page))\n if (resp.error === true) {\n return []\n }\n illusts = illusts.concat(resp.body.illustManga.data)\n }\n illusts.forEach(illust => {illust.tags.unshift(\"插画\")})\n return illusts\n}\n\n(() => {\n let artworks = []\n artworks = artworks.concat(getManga())\n if (util.CONVERT_CHINESE_CHARACTERS) artworks = artworks.concat(getConvertManga())\n if (util.SEARCH_ILLUSTS) artworks = artworks.concat(getIllust())\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" }, "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.SHOW_ORIGINAL_ILLUST_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: urlIllust(res.id),\n chapterInfo: `${timeTextFormat(res.createDate)}`\n }]\n}\n\nfunction seriesHandler(res) {\n \/\/ todo:漫画目录翻页\n let limit = 12, total = 0, illusts = []\n let seriesId = res.seriesNavData.seriesId\n if (res.seriesId === undefined) {\n total = getAjaxJson(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(urlSeriesDetailed(seriesId, page))\n res = getAjaxJson(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 = 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)\nurlSearchManga(key, page)", "variableComment": "⚙️ 自定义书源设置:\n⚙️ 自定义设置:请在基本-变量说明处修改代码\n⚙️ 自定义设置:将 true 改为 false,或相反\n⚠️ 设置源变量【无法】更改书源自定义设置\n⚠️ 注意不要添加或删除尾随逗号\",\"\n⚠️ 发现页需要长按\"Pixiv\",手动刷新\n以下内容为书源设置:\n{\n\"CONVERT_CHINESE_CHARACTERS\": true,\n\"SEARCH_ILLUSTS\": false,\n\"SHOW_GENERAL_ILLUST_NEW\": false,\n\"SHOW_GENERAL_ILLUST_RANK\": false,\n\"SHOW_ORIGINAL_ILLUST_LINK\": true,\n\"DEBUG\": false\n}\n\n\/\/ CONVERT_CHINESE_CHARACTERS\n\/\/ 搜索:搜索时进行繁简转换\n\/\/ SEARCH_ILLUSTS\n\/\/ 搜索:同时搜索插画\n\/\/ SHOW_GENERAL_ILLUST_NEW\n\/\/ 发现:最新、企划、约稿显示一般漫画\n\/\/ SHOW_GENERAL_ILLUST_RANK\n\/\/ 发现:排行榜显示一般漫画\n\/\/ SHOW_ORIGINAL_ILLUST_LINK\n\/\/ 目录:显示源链接,但会增加请求次数\n\/\/ DEBUG\n\/\/ 调试模式\n\n", "weight": 0 }