├── .github ├── ISSUE_TEMPLATE │ ├── 01-bugReport.yaml │ ├── 02-featureRequest.yaml │ ├── 03-questionAsk.yaml │ └── config.yml └── workflows │ └── Refresh.yml ├── .gitignore ├── README.md ├── books.json ├── btsrk.json ├── btsrk ├── base.header.json ├── base.loginUI.json ├── base.loginUrl.js ├── furry.json ├── webview.inject.js └── webview.inject2.js ├── doc ├── Download.md ├── FurryNovel.md ├── Import.md ├── Import2.md ├── ImportBookSource.md ├── ImportRssSource.md ├── Linpx.md ├── Pixiv.md ├── ReadMe.md ├── RemoteBooks.md ├── TooLongToRead.md ├── TroubleShoot.md ├── Version.md ├── WebdavBackup.md └── pic │ ├── AddBookViaFurryNovel1.png │ ├── AddBookViaFurryNovel2.png │ ├── AddBookViaLinpx.png │ ├── AddBookViaPixiv1.png │ ├── AddBookViaPixiv2.png │ ├── AddBookViaUrl1.png │ ├── AddBookViaUrl2.png │ ├── AddBookViaUrl3.png │ ├── DiscoverFurryNovel.png │ ├── DiscoverFurryNovelSort.png │ ├── DiscoverLinpx.png │ ├── DiscoverPixiv.jpg │ ├── DiscoverPixivLikes.jpg │ ├── DiscoverPixivRanking.png │ ├── DownloadLegado.png │ ├── DownloadResource.png │ ├── FurryNovelRaces.png │ ├── FurryNovelWebpage.png │ ├── ImportOnlineBookSource1.jpg │ ├── ImportOnlineBookSource2.jpg │ ├── ImportOnlineBookSource3.jpg │ ├── ImportOnlineRssSource1.png │ ├── ImportOnlineRssSource2.png │ ├── ImportOnlineRssSource3.jpg │ ├── ImportOnlineRssSource4.jpg │ ├── InportBookSourceLinpx.jpg │ ├── InportBookSourceLinpx.png │ ├── InportBookSourcePixiv.jpg │ ├── InportRssSourceBooks.jpg │ ├── InportRssSourceBtsrk.png │ ├── InportRssSourceImport.png │ ├── Legado-Pixiv.png │ ├── Legado-Pixiv1200x800.png │ ├── Legado-Version-Pro.png │ ├── Legado-Version-R18.png │ ├── Legado-Version-iOS.png │ ├── LinpxConvertPixivUrl1.png │ ├── LinpxConvertPixivUrl2.png │ ├── LinpxWebpage.png │ ├── OpenInLegado.png │ ├── OpenInQQ.png │ ├── PixivLogin1.jpg │ ├── PixivLogin2.jpg │ ├── PixivLoginUI.jpg │ ├── PixivNovelRanking.png │ ├── PixivSettingsBirth.png │ ├── PixivSettingsView.png │ ├── RemoteBooksSettings0.png │ ├── RemoteBooksSettings1.png │ ├── RemoteBooksSettings2.png │ ├── RemoteBooksSettings3.png │ ├── RemoteBooksSettings4.png │ ├── RemoteBooksSettings5.png │ ├── RemoteBooksSettings6.png │ ├── RemoteBooksSettings7.png │ ├── ReplaceTurnOff.png │ ├── RssSourceImportLogo.png │ ├── RssSourceImportWebpage.png │ ├── SearchViaFurryNovel.png │ ├── SearchViaLegado.png │ ├── SearchViaLegadoAuthor.jpg │ ├── SearchViaLegadoConvert.jpg │ ├── SearchViaLegadoHashtag.jpg │ ├── SearchViaLegadoWordCountFilter1.jpg │ ├── SearchViaLegadoWordCountFilter2.jpg │ ├── SearchViaLinpx.png │ ├── SearchViaPixiv.png │ ├── SetSourceVariable0.png │ ├── SetSourceVariable1.png │ ├── SetSourceVariable2.png │ ├── SubscribeBoookSourceLinpx.jpg │ ├── SubscribeBoookSourcePixiv.jpg │ ├── SubscribeEntry.png │ ├── SubscribeHomePage.jpg │ ├── SubscribeHomePage.png │ ├── SubscribeRssSourceBtsrk.jpg │ ├── SubscribeRssSourceImport.png │ ├── UpdateSource.jpg │ ├── WebdavBackup0.png │ ├── WebdavBackup1.png │ ├── WebdavBackup2.png │ └── WebdavBackup3.png ├── furrynovel ├── ReadMe.txt ├── base.bookUrlPattern.txt ├── base.header.json ├── base.jsLib.js ├── base.loginCheckJS.js ├── base.variableComment.txt ├── catalog.js ├── content.js ├── detail.js ├── discover.js ├── discover_address.js ├── search.js └── searchUrl.js ├── import.json ├── import ├── Readme.md ├── base.header.json ├── base.loginUrl.js ├── base.sortUrl.js ├── base.sourceComment.txt ├── list.ruleArticles.js ├── list.ruleDescription.js ├── list.ruleImage.js ├── list.ruleLink.js ├── list.rulePubDate.js └── list.ruleTitle.txt ├── linpx.json ├── linpx ├── ReadMe.txt ├── base.bookUrlPattern.txt ├── base.header.json ├── base.jsLib.js ├── base.loginCheckJS.js ├── base.variableComment.txt ├── catalog.js ├── content.js ├── detail.js ├── discover.js ├── discover_address.js ├── search.js └── searchUrl.js ├── normal.json ├── pixiv.json ├── pixiv ├── ReadMe.txt ├── base.bookUrlPattern.txt ├── base.header.json ├── base.jsLib.js ├── base.loginCheckJS.js ├── base.loginUI.json ├── base.loginUrl.js ├── base.variableComment.txt ├── catalog.js ├── content.js ├── detail.js ├── discover.js ├── discover_address.js ├── search.js └── searchUrl.js ├── pixivToc.json ├── pixiv_backup ├── ReadMe.txt ├── base.bookUrlPattern.txt ├── base.header.json ├── base.jsLib.js ├── base.loginCheckJS.js ├── base.variableComment.txt ├── catalog.js ├── content.js ├── detail.js ├── discover.js ├── discover_address.js ├── search.js └── searchUrl.js └── pixiv_illust ├── ReadMe.txt ├── base.bookUrlPattern.txt ├── base.header.json ├── base.jsLib.js ├── base.loginCheckJS.js ├── base.variableComment.txt ├── catalog.js ├── content.js ├── detail.js ├── discover.js ├── discover_address.js ├── search.js └── searchUrl.js /.github/ISSUE_TEMPLATE/01-bugReport.yaml: -------------------------------------------------------------------------------- 1 | name: BUG 提交 / BUG Report 2 | description: 反馈 bug / Report bugs to developers 3 | title: "[BUG]" 4 | labels: ["BUG"] 5 | body: 6 | - type: checkboxes 7 | attributes: 8 | label: 确认 / Assignments 9 | description: 提交issue请确保完成以下前提,否则该issue可能被忽略 / Make sure you read checkboxs below 10 | options: 11 | - label: 最新[测试版](https://github.com/gedoor/legado/actions/workflows/test.yml)依然存在此问题 / Latest beta app does not work 12 | required: true 13 | - label: 此问题和Xposed、Lsposed、Magisk、手机主题、浏览器插件、无障碍服务等无关 / Make sure your machine is not touched by hook frameworks, plugins, accessibility etc 14 | required: true 15 | 16 | - type: textarea 17 | attributes: 18 | label: 问题描述 / Describe Bugs 19 | validations: 20 | required: true 21 | - type: textarea 22 | attributes: 23 | label: 复现步骤 / How to reproduce 24 | validations: 25 | required: true 26 | - type: textarea 27 | attributes: 28 | label: 出现问题的小说链接 / BUG Novels URL Link 29 | placeholder: | 30 | https://www.pixiv.net/novel/show.php?id=123 31 | https://www.pixiv.net/novel/series/123 32 | 33 | - type: checkboxes 34 | attributes: 35 | label: 确认 / Assignment 36 | options: 37 | - label: 已经提交复现所需要的附加资料 / Submit additions related with bugs 38 | required: true 39 | 40 | - type: input 41 | attributes: 42 | label: 阅读版本 / Legado version 43 | description: | 44 | 阅读 - 我的 - 关于- 更新日志 45 | placeholder: "3.22.110823" 46 | validations: 47 | required: true 48 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/02-featureRequest.yaml: -------------------------------------------------------------------------------- 1 | name: 功能请求 / Features 2 | description: 功能请求 / Request new features 3 | title: "[Features]" 4 | labels: ["需求"] 5 | body: 6 | - type: checkboxes 7 | attributes: 8 | label: 确认 / Assignments 9 | description: 提交issue请确保完成以下前提,否则该issue可能被忽略 / Make sure you read checkbox below 10 | options: 11 | - label: 搜索现有issues,不存在相似或相关的issue / No related requests 12 | required: true 13 | 14 | - type: textarea 15 | attributes: 16 | label: 功能描述 / Features 17 | placeholder: 请清晰的、详细的描述你想要的功能 18 | validations: 19 | required: true 20 | - type: textarea 21 | attributes: 22 | label: 附加信息 / Additions 23 | placeholder: 其他的与功能相关的附加信息 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/03-questionAsk.yaml: -------------------------------------------------------------------------------- 1 | name: 提出问题 / Question 2 | description: 提出问题 / Ask a Question 3 | title: "[Question]" 4 | labels: ["问题"] 5 | body: 6 | - type: checkboxes 7 | attributes: 8 | label: 确认 / Assignments 9 | description: 提交 issue 请确保完成以下前提,否则该 issue 可能被忽略 / Make sure you read checkbox below 10 | options: 11 | - label: 搜索现有 issues,不存在相似或相关的 issue;阅读相关 ReadeMe 文档,文档中不存在相关内容(除非内容已失效) / No related issue & ReadMe (Unless the content is expired) 12 | required: true 13 | 14 | - type: textarea 15 | attributes: 16 | label: 你的问题 / your Question 17 | placeholder: 请清晰的、详细的描述你所遇到的问题(如何连接、配置代理不在回答的范围内) 18 | validations: 19 | required: true 20 | - type: textarea 21 | attributes: 22 | label: 附加信息 / Additions 23 | placeholder: 其他相关信息 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: 阅读软件问题 / legado bug & feature 4 | url: https://github.com/gedoor/legado/issues 5 | about: | 6 | 阅读软件问题请优先到 开源阅读 legado 反馈 / Go to Legado to Report bugs or Request features 7 | - name: Linpx 网站问题 / Linpx website bug 8 | url: https://furrynovel.ink/about 9 | about: | 10 | 网站问题请优先到站方反馈 / Go to the Website to Report bugs 11 | -------------------------------------------------------------------------------- /.github/workflows/Refresh.yml: -------------------------------------------------------------------------------- 1 | name: Purge Caches 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | tags: 8 | - 'ver*.*.*' 9 | paths: 10 | - "**.json" 11 | release: 12 | types: [created, edited, published] 13 | workflow_dispatch: 14 | 15 | jobs: 16 | purgeCache1: 17 | name: Purge Pixiv Cache 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Purge Jsdelivr Cache 21 | run: | 22 | result=$(curl -s https://purge.jsdelivr.net/gh/windyhusky/PixivSource@main/pixiv.json) 23 | if echo $result |grep -q 'finished'; then 24 | echo "Pixiv 书源 jsdelivr 缓存更新成功" 25 | else 26 | echo $result 27 | fi 28 | 29 | purgeCache2: 30 | name: Purge Linpx Cache 31 | runs-on: ubuntu-latest 32 | steps: 33 | - name: Purge Jsdelivr Cache 34 | run: | 35 | result=$(curl -s https://purge.jsdelivr.net/gh/windyhusky/PixivSource@main/linpx.json) 36 | if echo $result |grep -q 'finished'; then 37 | echo "Linpx 书源 jsdelivr 缓存更新成功" 38 | else 39 | echo $result 40 | fi 41 | 42 | purgeCache3: 43 | name: Purge BTSRK Cache 44 | runs-on: ubuntu-latest 45 | steps: 46 | - name: Purge Jsdelivr Cache 47 | run: | 48 | result=$(curl -s https://purge.jsdelivr.net/gh/windyhusky/PixivSource@main/btsrk.json) 49 | if echo $result |grep -q 'finished'; then 50 | echo "BTSRK 订阅源 jsdelivr 缓存更新成功" 51 | else 52 | echo $result 53 | fi 54 | 55 | purgeCache4: 56 | name: Purge Books Cache 57 | runs-on: ubuntu-latest 58 | steps: 59 | - name: Purge Jsdelivr Cache 60 | run: | 61 | result=$(curl -s https://purge.jsdelivr.net/gh/windyhusky/PixivSource@main/books.json) 62 | if echo $result |grep -q 'finished'; then 63 | echo "Books 订阅源 jsdelivr 缓存更新成功" 64 | else 65 | echo $result 66 | fi 67 | 68 | purgeCache5: 69 | name: Purge Import Cache 70 | runs-on: ubuntu-latest 71 | steps: 72 | - name: Purge Jsdelivr Cache 73 | run: | 74 | result=$(curl -s https://purge.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json) 75 | if echo $result |grep -q 'finished'; then 76 | echo "Import 订阅源 jsdelivr 缓存更新成功" 77 | else 78 | echo $result 79 | fi 80 | 81 | purgeCache6: 82 | name: Purge Normal Cache 83 | runs-on: ubuntu-latest 84 | steps: 85 | - name: Purge BTSRK Jsdelivr Cache 86 | run: | 87 | result=$(curl -s https://purge.jsdelivr.net/gh/windyhusky/PixivSource@main/normal.json) 88 | if echo $result |grep -q 'finished'; then 89 | echo "Normal 书源 jsdelivr 缓存更新成功" 90 | else 91 | echo $result 92 | fi -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /.test 3 | node_modules 4 | *.pdf -------------------------------------------------------------------------------- /btsrk/base.header.json: -------------------------------------------------------------------------------- 1 | {"User-Agent":"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36 Reader"} -------------------------------------------------------------------------------- /btsrk/base.loginUI.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "\uD83C\uDD7F️ 登录账号", 4 | "type": "button", 5 | "action": "login()", 6 | "style": { 7 | "layout_flexGrow": 1, 8 | "layout_flexBasisPercent": -1 9 | } 10 | }, 11 | { 12 | "name": "⚙️ 账号设置", 13 | "type": "button", 14 | "action": "startPixivSettings()", 15 | "style": { 16 | "layout_flexGrow": 1, 17 | "layout_flexBasisPercent": -1 18 | } 19 | }, 20 | { 21 | "name": "\uD83D\uDD19 退出账号", 22 | "type": "button", 23 | "action": "logout()", 24 | "style": { 25 | "layout_flexGrow": 1, 26 | "layout_flexBasisPercent": -1 27 | } 28 | }, 29 | { 30 | "name": "✉️ 查看私信", 31 | "type": "button", 32 | "action": "startPixivMessages()", 33 | "style": { 34 | "layout_flexGrow": 1, 35 | "layout_flexBasisPercent": -1 36 | } 37 | }, 38 | { 39 | "name": "\uD83D\uDD14 查看通知", 40 | "type": "button", 41 | "action": "startPixivNotification()", 42 | "style": { 43 | "layout_flexGrow": 1, 44 | "layout_flexBasisPercent": -1 45 | } 46 | }, 47 | { 48 | "name": "⭐️ 收藏项目", 49 | "type": "button", 50 | "action": "startGithub()", 51 | "style": { 52 | "layout_flexGrow": 1, 53 | "layout_flexBasisPercent": -1 54 | } 55 | }, 56 | { 57 | "name": "🆙 更新书源", 58 | "type": "button", 59 | "action": "updateSource()", 60 | "style": { 61 | "layout_flexGrow": 1, 62 | "layout_flexBasisPercent": -1 63 | } 64 | }, 65 | { 66 | "name": "\uD83D\uDD30 使用指南", 67 | "type": "button", 68 | "action": "startGithubReadme()", 69 | "style": { 70 | "layout_flexGrow": 1, 71 | "layout_flexBasisPercent": -1 72 | } 73 | }, 74 | { 75 | "name": "\uD83D\uDC1E 反馈问题", 76 | "type": "button", 77 | "action": "startGithubIssue()", 78 | "style": { 79 | "layout_flexGrow": 1, 80 | "layout_flexBasisPercent": -1 81 | } 82 | } 83 | ] -------------------------------------------------------------------------------- /btsrk/base.loginUrl.js: -------------------------------------------------------------------------------- 1 | function sleep(time) { 2 | let endTime = new Date().getTime() + time 3 | while(true){ 4 | if (new Date().getTime() > endTime){ 5 | return; 6 | } 7 | } 8 | } 9 | function sleepToast(text, second) { 10 | const {java} = this 11 | java.log(text) 12 | java.longToast(text) 13 | if (second === undefined || second <= 3) {second = 3} 14 | sleep(1000*second) 15 | } 16 | 17 | function login() { 18 | resp = java.startBrowserAwait(`https://accounts.pixiv.net/login,{"headers": {"User-Agent": "${cache.get("userAgent")}"}}`, '登录账号', false).body() 19 | } 20 | function logout() { 21 | removeCookie() 22 | java.startBrowser("https://www.pixiv.net/logout.php", "退出账号") 23 | removeCookie() 24 | sleepToast(`已退出当前账号\n退出后请点击右上角的✔️退出\n登录请点击“登录账号”进行登录`) 25 | } 26 | function removeCookie() { 27 | cookie.removeCookie('https://www.pixiv.net') 28 | cookie.removeCookie('https://accounts.pixiv.net') 29 | cookie.removeCookie('https://accounts.google.com') 30 | cookie.removeCookie('https://api.weibo.com') 31 | cache.delete("pixivCookie") 32 | cache.delete("csfrToken") // 与登录设备有关 33 | cache.delete("headers") 34 | } 35 | 36 | function getUserAgent() { 37 | let userAgent = String(source.getHeaderMap(true)).slice(12,-1) 38 | cache.put("userAgent", userAgent) 39 | // java.log(userAgent) 40 | return userAgent 41 | } 42 | function startBrowser(url, title) { 43 | let userAgent = cache.get("userAgent") 44 | if (userAgent === null) userAgent = getUserAgent() 45 | java.startBrowser(`${url},{"headers": {${userAgent}}}`, title) 46 | } 47 | function startPixivSettings() { 48 | startBrowser("https://www.pixiv.net/settings/viewing", "账号设置") 49 | } 50 | function startPixivMessages() { 51 | startBrowser("https://www.pixiv.net/messages.php", "查看私信") 52 | } 53 | function startPixivNotification() { 54 | startBrowser("https://www.pixiv.net/notify_all.php", "查看通知") 55 | } 56 | function startPixivMuteUser() { 57 | startBrowser("https://www.pixiv.net/settings/viewing/mute?type=user", "屏蔽用户") 58 | } 59 | function startPixivBlockUsers() { 60 | startBrowser("https://www.pixiv.net/settings/privacy/block-users", "查黑名单") 61 | } 62 | 63 | function startGithub() { 64 | startBrowser("https://github.com/windyhusky/PixivSource", "书源介绍") 65 | } 66 | function startGithubIssue() { 67 | startBrowser("https://github.com/windyhusky/PixivSource/issues", "反馈问题") 68 | } 69 | function startGithubReadme() { 70 | startBrowser("https://github.com/windyhusky/PixivSource/blob/main/doc/Pixiv.md", "使用指南") 71 | } 72 | 73 | function updateSource() { 74 | const {java, source} = this 75 | let onlineSource, comment 76 | try { 77 | let updateUrl = "https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/pixiv.json" 78 | onlineSource = JSON.parse(java.get(updateUrl,{'User-Agent': 'Mozilla/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body())[0] // 第1个书源 79 | comment = onlineSource.bookSourceComment.split("\n") 80 | } catch (e) { 81 | try { 82 | let updateUrl = "https://raw.githubusercontent.com/windyhusky/PixivSource/main/pixiv.json" 83 | onlineSource = JSON.parse(java.get(updateUrl,{'User-Agent': 'Mozilla/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body())[0] // 第1个书源 84 | comment = onlineSource.bookSourceComment.split("\n") 85 | } catch (e) { 86 | onlineSource = {lastUpdateTime: new Date().getTime()} 87 | comment = source.bookSourceComment.split("\n") 88 | } 89 | } 90 | 91 | let htm = `data:text/html; charset=utf-8, 92 | 93 | 94 | 95 | 更新 Pixiv 书源 96 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 |
Pixiv 书源 🔰 使用指南
☁️ 远程仓库版本:${java.timeFormat(onlineSource.lastUpdateTime)}
📥 阅读本地版本:${java.timeFormat(source.lastUpdateTime)}
${comment.slice(2,9).join("
")}
${comment.slice(comment.length-7, comment.length).join("
")}
114 | 115 | 116 | 117 | 121 | 122 | 126 | 127 | 128 | 132 | 133 | 137 | 138 | 139 | 143 | 144 | 148 | 149 |
更新 Pixiv 书源
150 | 151 | `; 152 | java.startBrowser(htm,'更新书源'); 153 | return [] 154 | } -------------------------------------------------------------------------------- /btsrk/furry.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name":"Pixiv", 4 | "link":"https://www.pixiv.net/novel", 5 | "icon":"https://asset.brandfetch.io/idIlKj_n7C/idSsbP7h1m.png" 6 | }, 7 | { 8 | "name":"Linpx", 9 | "link":"https://furrynovel.ink/?from=read", 10 | "icon":"https://furrynovel.ink/apple-touch-icon.png" 11 | }, 12 | { 13 | "name":"兽人控小说站", 14 | "link":"https://www.furrynovel.com/zh/?utm_source=reader", 15 | "icon":"https://www.furrynovel.com/static/icon.png" 16 | }, 17 | { 18 | "name":"兽人控游戏索引", 19 | "link":"https://furrygames.top/zh-cn/list-b.html", 20 | "icon":"https://raw.githubusercontent.com/FurryGamesIndex/games/master/assets/_README/logo.png" 21 | }, 22 | { 23 | "name":"兽人控游戏库", 24 | "link":"https://kemono.games/zh-Hans/explore?sort=latest_update", 25 | "icon":"https://img.srkyxk.com/logo-512x512.png" 26 | }, 27 | { 28 | "name":"兽展日历", 29 | "link":"https://www.furrycons.cn", 30 | "icon":"https://images.furrycons.cn/logo_800x800.png" 31 | }, 32 | { 33 | "name":"兽聚汇总", 34 | "link":"https://www.furryfusion.net", 35 | "icon":"https://www.furryfusion.net/images/LOGO.png" 36 | } 37 | ] -------------------------------------------------------------------------------- /btsrk/webview.inject.js: -------------------------------------------------------------------------------- 1 | if (!/^https:\/\/(so\.toutiao\.com\/search\/?|quark\.sm\.cn\/s|wap\.sogou\.com\/web\/searchList\.jsp|m\.so\.com\/s|cn\.bing\.com\/search|www\.baidu\.com\/s)\?/.test(window.location.href) && !document.getElementById('open-yuedu-bookshelf')) { 2 | const btn = document.createElement('div'); 3 | btn.innerHTML = ``; 7 | document.body.appendChild(btn); 8 | } 9 | 10 | let time, num=0; 11 | const herfs = new Map(); 12 | function onTouchStart(evt) { 13 | for (const el of evt.path) { 14 | if (el.tagName === "A") { 15 | if (el.href !== 'javascript:void(0)') { 16 | const inner = el.href; 17 | herfs.set(el, inner); 18 | el.setAttribute('href', 'javascript:void(0)'); 19 | time = setTimeout(() => { window.open(`legado://import/addToBookshelf?src=${encodeURIComponent(inner)}`, '_blank') 20 | }, 600); 21 | } 22 | break; 23 | } 24 | } 25 | } 26 | 27 | function onTouchEnd(evt) { 28 | if (time) { 29 | clearTimeout(time); 30 | time = undefined; 31 | } 32 | for (const el of evt.path) { 33 | if (el.tagName === "A") { 34 | if (el.href === 'javascript:void(0)') { 35 | const herf = herfs.get(el); 36 | if (herf) { 37 | el.setAttribute('href', herf) 38 | } 39 | } 40 | break; 41 | } 42 | } 43 | } 44 | 45 | function addListener(els){ 46 | Array.from(els, (item) => { 47 | if (item.getAttribute('add-yuedu-bookshelf') !== 'add-yuedu-bookshelf' && item.innerText && item.href && !/^#|^javascript:/.test(item.href)) { 48 | item.setAttribute('add-yuedu-bookshelf', 'add-yuedu-bookshelf'); 49 | item.addEventListener('touchstart', onTouchStart); 50 | item.addEventListener('touchend', onTouchEnd); 51 | item.addEventListener('touchcancel', onTouchEnd); 52 | item.addEventListener('mousedown', onTouchStart); 53 | item.addEventListener('mouseup', onTouchEnd); 54 | } 55 | }); 56 | num= els.length; 57 | } 58 | 59 | function reAdd(){ 60 | const els = document.getElementsByTagName('a'); 61 | if(els.length>num)addListener(els); 62 | } 63 | 64 | reAdd(); 65 | 66 | const observer = new ResizeObserver(reAdd); 67 | observer.observe(document.body); -------------------------------------------------------------------------------- /btsrk/webview.inject2.js: -------------------------------------------------------------------------------- 1 | if (!/^https:\/\/(so\.toutiao\.com\/search\/?|quark\.sm\.cn\/s|wap\.sogou\.com\/web\/searchList\.jsp|m\.so\.com\/s|cn\.bing\.com\/search|www\.baidu\.com\/s)\?/.test(window.location.href) && !document.getElementById('open-yuedu-bookshelf')) { 2 | const btn = document.createElement('div'); 3 | btn.innerHTML = ``; 7 | document.body.appendChild(btn); 8 | 9 | const btn2 = document.createElement('div'); 10 | btn2.innerHTML = ``; 14 | document.body.appendChild(btn2); 15 | 16 | } 17 | 18 | let time,num=0; 19 | const herfs = new Map(); 20 | function onTouchStart(evt) { 21 | for (const el of evt.path) { 22 | if (el.tagName === "A") { 23 | if (el.href !== 'javascript:void(0)') { 24 | const inner = el.href; 25 | herfs.set(el, inner); 26 | el.setAttribute('href', 'javascript:void(0)'); 27 | time = setTimeout(() => { window.open(`legado://import/addToBookshelf?src=${encodeURIComponent(inner)}`, '_blank') 28 | }, 600); 29 | } 30 | break; 31 | } 32 | } 33 | } 34 | function onTouchEnd(evt) { 35 | if (time) { 36 | clearTimeout(time); 37 | time = undefined; 38 | } 39 | for (const el of evt.path) { 40 | if (el.tagName === "A") { 41 | if (el.href === 'javascript:void(0)') { 42 | const herf = herfs.get(el); 43 | if (herf) { 44 | el.setAttribute('href', herf) 45 | } 46 | } 47 | break; 48 | } 49 | } 50 | } 51 | 52 | function addListener(els){ 53 | Array.from(els, (item) => { 54 | if (item.getAttribute('add-yuedu-bookshelf') !== 'add-yuedu-bookshelf' && item.innerText && item.href && !/^#|^javascript:/.test(item.href)) { 55 | item.setAttribute('add-yuedu-bookshelf', 'add-yuedu-bookshelf'); 56 | item.addEventListener('touchstart', onTouchStart); 57 | item.addEventListener('touchend', onTouchEnd); 58 | item.addEventListener('touchcancel', onTouchEnd); 59 | item.addEventListener('mousedown', onTouchStart); 60 | item.addEventListener('mouseup', onTouchEnd); 61 | } 62 | }); 63 | num= els.length; 64 | } 65 | 66 | function reAdd(){ 67 | const els = document.getElementsByTagName('a'); 68 | if(els.length>num)addListener(els); 69 | } 70 | 71 | reAdd(); 72 | 73 | const observer = new ResizeObserver(reAdd); 74 | observer.observe(document.body); -------------------------------------------------------------------------------- /doc/Download.md: -------------------------------------------------------------------------------- 1 | ## 3.下载阅读 2 | 阅读的各个版本,参见[阅读版本](./Version.md)(不重要) 3 | 4 | ### 3.0 书源兼容性 5 | | 阅读版本 | Pixiv 书源 | 更新时间 | Github 导入链接 | 6 | | ---------------------- | --------- | --------- | --------------- | 7 | | 3.25.0527 - 最新版本 | 最新版   | | [Pixiv 书源](https://raw.githubusercontent.com/windyhusky/PixivSource/main/pixiv.json)| 8 | | 3.23.0503 - 3.25.0526 | 1.9.4版本 | 2025.05.28 | [Pixiv 书源](https://raw.githubusercontent.com/windyhusky/PixivSource/7ee2dcd66a7285f6f5cbd0f155713d7b1b6b71a8/pixiv.json) | 9 | | 3.22.0103 - 3.23.0404 | 1.7.4版本 | 2025.02.20 | [Pixiv 书源](https://raw.githubusercontent.com/windyhusky/PixivSource/2d6ced432578f7ff870bdd17292c85a321e3437a/pixiv.json) | 10 | 11 | 12 | | 阅读版本 | Linpx 书源 | 更新时间 | Github 导入链接 | 13 | | ---------------------- | --------- | --------- | --------------- | 14 | | 3.23.0503 - 最新版本 | 最新版   | | [Linpx 书源](https://raw.githubusercontent.com/windyhusky/PixivSource/main/linpx.json) | 15 | | 3.22.0103 - 3.23.0404 | 1.7.4版本 | 2025.02.20 | [Linpx 书源](https://raw.githubusercontent.com/windyhusky/PixivSource/b9041cf4061198e606c749c174aaa7f351e7a569/linpx.json) | 16 | 17 | 18 | ### 3.1 Android 版 19 |
阅读 Android 版 20 | 21 | #### 3.1.1 Android Beta 版 22 | **点击链接,下载安装包并安装,推荐使用共存版** 23 | https://miaogongzi.lanzout.com/b01rgkhhe 24 | 25 | | 下载站点 | 版本 | 备注 | 26 | | ------------------------------------------------------------ | ----- | -------------- | 27 | | [阅读Beta版 蓝奏云](https://miaogongzi.lanzout.com/b01rgkhhe) | 测试版 | 无需代理,无需登录 | 28 | | [Github Action](https://github.com/gedoor/legado/actions) | 测试版 | 需要代理,需要登录 | 29 | | [Telegram 频道](https://t.me/Legado_Channels) | 稳定版 | 需要代理,需要登录 | 30 | | [Telegram 频道(Beta版)](https://t.me/Legado_Beta) | 测试版 | 需要代理,需要登录 | 31 | 32 | 33 |
Android 正式版 & Pro 版 34 | 35 | #### ~~3.1.2 Android 正式版~~ 36 | **Android 正式版已经停止更新,不推荐继续使用** 37 | 38 | | 下载站点 | 版本 | 备注 | 39 | | ------------------------------------------------------------- | ----- | -------------- | 40 | | [喵公子阅读资源](https://yuedu.miaogongzi.net) | 稳定版 | 无需代理,无需登录 | 41 | | [Github Release](https://github.com/gedoor/legado/releases) | 稳定版 | 需要代理,无需登录 | 42 | | [Telegram 频道](https://t.me/Legado_Channels) | 稳定版 | 需要代理,需要登录 | 43 | 44 | 45 | #### ~~3.1.3 阅读 Pro 版~~ 46 | **阅读 Pro 版已经停止更新,不推荐继续使用。所有 Pro 版限定功能已经移植到普通版(2023.11.01)** 47 |
48 |
49 | 50 | 51 | ### 3.2 苹果 iOS 版 52 |
阅读 iOS 版 53 |
阅读官方 iOS 版 54 | 55 | #### ~~3.2.1 官方 iOS 版~~【已停止开发】 56 | 官方 iOS 版已经停止开发 57 | ~~官方正在进行 [iOS版](https://github.com/gedoor/YueDuFlutter) 的测试,[近期在TF测试](https://gedoor.github.io/download) ,最新消息请见:[Telegram 频道(iOS版)](https://t.me/legado_ios)~~ 58 | 59 | | 下载站点 | 备注 | 60 | | ---------------------------------------------------- | ---------- | 61 | | ~~[GitHub](https://github.com/gedoor/YueDuFlutter)~~ | 已经停止开发 | 62 | | ~~[Telegram 频道(iOS版)](https://t.me/legado_ios)~~ | 已经停止开发 | 63 |
64 | 65 | 66 | #### 3.2.2 非官方 iOS 版 67 | 兼容阅读书源的**非官方软件**: 68 | 69 | 70 | | 软件名称 | AppStore | Github | 付费 | 备注 | 71 | |------------ | --------- | ----------------------------------------------- | -------------------------- | ----------------------------- | 72 | | 源阅 | 无 | [源阅](https://github.com/kaich/SourceReadSite) | TestFlight 付费 ¥128 | 兼容阅读书源,【源阅读】的后续版本 | 73 | | 千阅 | [千阅](https://apps.apple.com/app/id1665963317) | 无 | 订阅制 & 永久 ~~¥98~~ ¥199 | 不完全兼容阅读书源 | 74 | | ~~读不舍手~~ | [读不舍手](https://apps.apple.com/app/id1662413517) | 无 | 订阅制 | 不完全兼容阅读书源,广告较多 | 75 | 76 | 77 |
iOS 已下架软件 78 | 79 | #### 3.2.2 iOS 已下架软件 80 | | 软件名称 | AppStore | Github | 备注 | 81 | |------------ | ------------------------------------------------- | --------------------------------------- | -------------- | 82 | | 源阅读 | [源阅读](https://apps.apple.com/app/id1561787704 ) | [源阅读](https://github.com/kaich/Yuedu) | 停止维护,现已下架 | 83 | | ~~青果阅读~~ | [青果阅读](https://apps.apple.com/app/id1142490639) | 无 | 停止维护,现已下架 | 84 | | ~~花火阅读~~ | [花火阅读](https://apps.apple.com/app/id1546631588) | 无 | 停止维护,现已下架 | 85 | | ~~星文阅读~~ | [星文阅读](https://apps.apple.com/app/id1662197753) | 无 | 停止维护,现已下架 | 86 |
87 | 88 | 89 |
iOS 替代软件 90 | 91 | #### 3.2.3 iOS 替代软件 92 | 不兼容阅读书源的,其他换源阅读软件 93 | 94 | | 软件名称 | 备注 | 95 | | ------------------------------------------------------ | -------------------------- | 96 | | [益达](https://github.com/xiaohucode/yidaRule/releases) | 开源(苹果&安卓) | 97 | | [用心读书](https://apps.apple.com/app/id1569793141) | 付费 TestFlight | 98 | | 香色闺阁 | 已下架 | 99 | | 爱阅书香 | 已下架 | 100 |
101 |
102 | 103 | 104 | ### 3.3 服务器版/桌面版 105 | 项目地址:https://github.com/hectorqin/reader 106 |
阅读 服务器版/桌面版 107 | 108 | | 下载站点 | 版本 | 备注 | 109 | | ------------------------------------------------------ | ----- | -------------- | 110 | | [Github](https://github.com/hectorqin/reader/releases) | | 需要代理 | 111 | | [Telegram 频道](https://t.me/facker_channel) | | 需要代理,需要登录 | 112 | | 微信公众号【假装大佬】 | | | 113 |
114 | 115 | 116 | ### 3.4 鸿蒙版【开发中,暂不可用】 117 | 项目地址:https://github.com/mgz0227/legado-Harmony 118 |
阅读 鸿蒙版 119 | 120 | | 下载站点 | 版本 | 备注 | 121 | | ------------------------------------------------------------- | ----- | -------------- | 122 | | [Github](https://github.com/mgz0227/legado-Harmony/releases) | 开发中 | | 123 | | [Gitee](https://gitee.com/mgz0227/legado-Harmony/releases) | 开发中 | | 124 |
125 | -------------------------------------------------------------------------------- /doc/FurryNovel.md: -------------------------------------------------------------------------------- 1 | # FurryNovel 书源的导入与使用 2 | 3 | ### [兽人控小说站](https://www.furrynovel.com) 收录了 Pixiv, Bilibili 的大部分兽人小说 4 | 5 | ## 本书源使用前提 6 | 1. 使用阅读 3.0 版本 7 | 2. ⚠️ 部分区域需要代理(建议先准备好) 8 | 3. 导入 兽人控小说站 的书源、订阅源 9 | 10 | 11 | ## 〇、下载并安装阅读 12 | ### 1.下载阅读 3.0 版本 13 |
14 | ⬇️ 下载阅读 15 | 16 | 点击链接,下载安装包并安装,**推荐使用共存版** 17 | > https://miaogongzi.lanzout.com/b01rgkhhe 18 | > 19 | > 最新下载链接请查看 [下载阅读](./Download.md) 20 | 21 | 22 | ### 2.了解阅读功能与用法 23 | > 请查看[阅读是什么软件?阅读简介](./ReadMe.md) 24 |
25 | 26 | 27 | ## 一、导入书源 & 订阅源 28 | ### 1.导入 兽人控小说站 书源 29 |
30 | ➕ 导入书源 31 | 32 | 复制下方【免代理】书源链接 33 | ``` 34 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/linpx.json 35 | ``` 36 | #### 1.1 打开【订阅】页面,点击【规则订阅】 37 | ![img](./pic/SubscribeEntry.png) 38 | 39 | 40 | #### 1.2 点击加号,粘贴链接,保存订阅 41 | ![img](./pic/SubscribeBoookSourceLinpx.jpg) 42 | 43 | 44 | #### 1.3 点击相应订阅规则,导入并启用/更新书源 45 | ![img](./pic/SubscribeHomePage.jpg) 46 | 47 | **首次点击【订阅规则】 即可导入** 48 | 49 | ![img](./pic/InportBookSourceLinpx.png) 50 | 51 | **导入之后,再次点击则会检查更新** 52 | 53 | > 更多导入方法请查看[如何获取书源?导入书源?](./ImportBookSource.md) 54 |
55 | 56 | 57 | ### 2.导入 兽人控小说站 订阅源 58 |
59 | ➕ 导入订阅源 60 | 61 | 复制下方【免代理】订阅源链接 62 | ``` 63 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/btsrk.json 64 | ``` 65 | #### 2.1 打开【订阅】页面,点击【规则订阅】 66 | ![img](./pic/SubscribeEntry.png) 67 | 68 | 69 | #### 2.2 点击加号,更改规则类型,粘贴链接,保存订阅 70 | **注意这里要把【书源】改成【订阅源】** 71 | 72 | ![img](./pic/SubscribeRssSourceBtsrk.jpg) 73 | 74 | 75 | #### 2.3 点击相应订阅规则,导入并启用/更新书源 76 | ![img](./pic/SubscribeHomePage.jpg) 77 | 78 | **首次点击【订阅规则】 即可导入** 79 | 80 | ![img](./pic/InportRssSourceBtsrk.png) 81 | 82 | **导入之后,再次点击则会检查更新** 83 | 84 | > 更多导入方法请查看[如何导入订阅源](./ImportRssSource.md) 85 |
86 | 87 | 88 | ## 二、确保网站可以访问 89 |
90 | 🌐 检查网站能否访问 91 | 92 | 订阅 - 点击 Linpx / 兽人控小说站 - 打开网站 93 | - 如果可以直接打开,那么一切大功告成! 94 | - **多数网络下,Linpx & 兽人控小说站 无需代理即可访问** 95 | - Linpx & 兽人控小说站 没有账号体系,**无需登录即可使用**,不必做过多的操作 96 | 97 | - 如果 **无法直接打开** 则可以: 98 | - 切换至其他网络(**更换网络运营商、使用流量或 WIFI**)后再尝试 99 | - 开启代理后再尝试 100 |
101 | 102 | 103 | ## 三、添加小说,尽情使用 104 | ### 1.阅读内部搜索 105 |
106 | 🔎 搜索小说 107 | 108 | ✅ 支持搜索:小说名称、系列小说名称、作者名称、小说标签 109 | 110 | ![img](./pic/SearchViaLegado.png) 111 |
112 | 113 | 114 | ### 2.发现更多小说 115 |
116 | ⭐️ 常规功能 117 | 118 | 发现:热门小说、最新小说、随便来点 119 | 120 | ![img](./pic/DiscoverFurryNovel.png) 121 |
122 | 123 | 124 |
🔎 筛选发现 125 | 126 | 发现 - 长按 **"兽人小说站"** - 编辑 - 右上角菜单 - 设置源变量 127 | 128 | ![img](./pic/SetSourceVariable0.png) 129 | 130 | ![img](./pic/SetSourceVariable1.png) 131 | 132 | ![img](./pic/SetSourceVariable2.png) 133 | 134 | 设置源变量:输入标签,保存 135 | ``` 136 | 龙 137 | ``` 138 | 发现 - 长按 **"兽人小说站"** - 刷新 - 查看筛选后的小说 139 | 140 | ![img](./pic/DiscoverFurryNovelSort.png) 141 |
142 | 143 | 144 | ### 3.添加网址 145 |
146 | 🔗 添加网址 147 | 148 | 书架 - 菜单 - 添加网址 - 粘贴小说链接,可以同时添加多个小说的链接 149 | 150 | ![img](./pic/AddBookViaUrl1.png) 151 | ![img](./pic/AddBookViaUrl2.png) 152 | ![img](./pic/AddBookViaUrl3.png) 153 | 154 | 支持 兽人控小说站 多个格式的网址链接: 155 | 156 | ``` 157 | 兽人控小说站 目录链接 158 | https://furrynovel.com/zh/novel/8312 159 | 160 | 兽人控小说站 章节链接 161 | https://furrynovel.com/zh/novel/8312/chapter/33116 162 | 163 | 兽人控小说站 API链接 164 | https://api.furrynovel.com/api/zh/novel/8312 165 | ``` 166 |
167 | 168 | 169 | ### 4.订阅源添加小说 170 |
171 | 🏠 订阅源 172 | 173 | #### 4.1 替代阅读搜索 174 | 受阅读设计的限制,阅读内部搜索不可能完全支持 Linpx的功能。网站的搜索功能更加全面。 175 | 176 | ![img](./pic/SearchViaFurryNovel.png) 177 | 178 | 179 | #### 4.2 替代阅读发现 180 | 阅读内部浏览器打开 Pixiv,即可使用 Pixiv 书源未完成的功能,如排行榜等功能 181 | 182 | ![img](./pic/FurryNovelRaces.png) 183 | 184 | 185 | #### 4.3 添加小说至书架 186 | 在阅读内部浏览器内打开 兽人控小说站 小说页面,点击【添加到书架】按钮即可添加小说到书架 187 | 188 | ![img](./pic/AddBookViaFurryNovel1.png) 189 | ![img](./pic/AddBookViaFurryNovel2.png) 190 |
191 | 192 | 193 | ## 四、故障排查 194 | > 详见:[故障排查与处理](./TroubleShoot.md) 195 |
196 | 🐞 故障排查 197 | 198 | ### 1.没有搜索结果,请自行检查一下内容: 199 | 200 | **⓪检查 兽人控小说站 书源是否导入** 201 | 202 | **①检查 兽人控小说站 书源是否启用** 203 | 204 | **②检查代理是否可用** 205 | 206 | **③检查阅读是否走了代理** 207 | 208 | **④检查网络是否可用** 209 | 210 | **如果上述均无问题,但依然没有搜索结果,那就是书源需要更新了** 211 | 212 | 213 | ### 2.图片无法正常显示 214 | 215 | #### 解决措施:关闭替换净化 216 | ![img](./pic/ReplaceTurnOff.png) 217 |
218 | 219 | 220 | ## 本教程由兽人阅读频道 [@FurryReading](https://t.me/FurryReading) 提供 221 | -------------------------------------------------------------------------------- /doc/Import.md: -------------------------------------------------------------------------------- 1 | ## 使用 import 订阅源导入书源 2 | 3 | ### 0.下载并安装阅读 4 |
5 | ⬇️ 下载阅读 6 | 7 | 点击链接,下载安装包并安装,**推荐使用共存版** 8 | > https://miaogongzi.lanzout.com/b01rgkhhe 9 | > 10 | > 最新下载链接请查看 [下载阅读](./Download.md) 11 |
12 | 13 | ![img](./pic/DownloadLegado.png) 14 | 15 | 16 | ### 1.导入 import 订阅源 17 | 如已导入 import 订阅源 ,则可略过 18 | 19 |
20 | ➕ 导入 import 订阅源 21 | 22 | 复制下方【免代理】订阅源链接 23 | ``` 24 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json 25 | ``` 26 | #### 1.1 打开【订阅】页面,点击【规则订阅】 27 | ![img](./pic/SubscribeEntry.png) 28 | 29 | 30 | #### 1.2 点击加号,更改规则类型,粘贴链接,保存订阅 31 | **注意这里要把【书源】改成【订阅源】** 32 | 33 | ![img](./pic/SubscribeRssSourceImport.png) 34 | 35 | 36 | #### 1.3 点击相应订阅规则,导入并启用/更新书源 37 | ![img](./pic/SubscribeHomePage.png) 38 | 39 | **首次点击【订阅规则】 即可导入** 40 | 41 | ![img](./pic/InportRssSourceImport.png) 42 | 43 | **导入之后,再次点击则会检查更新** 44 |
45 | 46 | 47 | ### 2.导入书源 & 订阅源 48 |
49 | ➕ 导入书源 & 订阅源 50 | 51 | > 更多方法详见: 52 | > **[导入书源](./ImportBookSource.md)** & 53 | > **[导入订阅源](./ImportRssSource.md)** 54 | 55 | #### 2.1 打开“书源订阅” 56 | 点击 “书源订阅”( import 订阅源) 57 | 58 | ![img](./pic/RssSourceImportLogo.png) 59 | 60 | 点击相应书源/订阅源,导入该源 61 | 62 | ![img](./pic/RssSourceImportWebpage.png) 63 | 64 | 65 | #### 2.2 导入相关资源 66 | 点击书源,导入书源,**导入之后,再次点击则会检查更新** 67 | 68 | ![img](./pic/InportBookSourcePixiv.jpg) 69 | 70 | 点击订阅源,导入订阅源,**导入之后,再次点击则会检查更新** 71 | 72 | ![img](./pic/InportRssSourceBtsrk.png) 73 |
74 | 75 | 76 | ### 3.使用书源,畅享阅读 77 | > ### 1. [阅读使用教程(太长不看版)](./TooLongToRead.md) 78 | >> #### 1.1 [Pixiv 书源的导入与使用](./Pixiv.md) 79 | >> #### 1.2 [Linpx 书源的导入与使用](./Linpx.md) 80 | >> #### 1.3 [兽人控小说站 书源的导入与使用](./FurryNovel.md) 81 | >> #### 1.4 搜索小说、查看订阅,畅享阅读 82 | > ### 2. [添加远程书籍](./Remotebooks),畅享阅读 83 | > ### 3. [设置 Webdav 备份](./WebdavBackup.md) 84 | > ### 4. [故障排查与处理](./TroubleShoot.md) 85 | 86 | 87 | ## 本教程由兽人阅读频道 [@FurryReading](https://t.me/FurryReading) 提供 -------------------------------------------------------------------------------- /doc/Import2.md: -------------------------------------------------------------------------------- 1 | ## 3.导入源 2 | 3 | > **[书源导入使用-太长不看版](./TolongToRead.md)** 4 | > 5 | > **[使用 Import 订阅源导入源](./Import.md)** 6 | > 7 | > **[导入书源](./ImportBookSource.md)** & 8 | > **[导入订阅源](./ImportRssSource.md)** 9 | > 10 | > 11 | -------------------------------------------------------------------------------- /doc/ImportBookSource.md: -------------------------------------------------------------------------------- 1 | ## 2.导入书源 2 | 3 | ## 2.0 书源(订阅源)来源 4 | - [Legado|开源阅读 | 频道](https://t.me/legado_channels) 5 | - [三千书源](https://shuyuan.yiove.com) 6 | - [喵公子书源管理](http://yuedu.miaogongzi.net/gx.html) 7 | - [阅读 APP 源](https://legado.aoaostar.com/) 8 | - [一程书源/订阅源](https://flowus.cn/share/923f5a35-6dcf-47d1-b8eb-b9c5ef3ed39b/) 9 | - [源仓库](https://www.yckceo.com/yuedu/shuyuan/index.html) 10 | - 其他网络来源 11 | 12 | 13 | ## 2.1 导入书源 14 | 15 | 请【**开启代理**】后,复制下面的【书源】链接 16 | ``` 17 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/pixiv.json 18 | ``` 19 | ``` 20 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/linpx.json 21 | ``` 22 | 以下导入方法任选其一即可 23 |
A. 文件导入 24 | 25 | ### A.文件导入更简单 26 | #### 1.下载书源/订阅源文件 27 | Chrome 等浏览器可以打开 [这个网址](https://github.com/windyhusky/PixivSource) ,选择 **链接另存为** 或 **下载链接**,下载相应书源 28 | 29 | 30 | #### 2.使用阅读打开 31 | 点击书源,选择用阅读打开 32 | 33 | ![img](pic/OpenInLegado.png) 34 | 35 | 36 | #### 3.导入完成并启用书源/订阅源 37 | ![img](./pic/InportBookSourcePixiv.jpg) 38 |
39 | 40 | 41 |
B. 规则订阅 42 | 43 | ### B.规则订阅易更新 44 | #### 1. 打开【订阅】页面,点击【规则订阅】 45 | ![img](./pic/SubscribeEntry.png) 46 | 47 | 48 | #### 2. 点击加号,粘贴链接,保存订阅 49 | ![img](./pic/SubscribeBoookSourcePixiv.jpg) 50 | 51 | 52 | #### 3. 点击相应订阅规则,导入并启用/更新书源 53 | ![img](./pic/SubscribeHomePage.jpg) 54 | 55 | **首次点击【订阅规则】 即可导入** 56 | 57 | ![img](./pic/InportBookSourcePixiv.jpg) 58 | 59 | **导入之后,再次点击则会检查更新** 60 |
61 | 62 | 63 |
C. 网络导入 64 | 65 | ### C.网络导入也方便 66 | #### 1.打开【我的】页面,点击【书源管理】 67 | ![img](./pic/ImportOnlineBookSource1.jpg) 68 | 69 | 70 | #### 2.点击右上角的三点菜单,选择【网络导入】 71 | ![img](./pic/ImportOnlineBookSource2.jpg) 72 | 73 | 74 | #### 3.粘贴书源链接,点击确定 75 | ![img](./pic/ImportOnlineBookSource3.jpg) 76 | 77 | 78 | #### 4.导入完成并启用书源 79 | **如果导入失败,请开启代理,或过段时间重试** 80 | 81 | ![img](./pic/InportBookSourcePixiv.jpg) 82 |
83 | 84 | 85 |
D. Schema 链接导入 86 | 87 | ### D.Schema 链接导入最方便【适用于书源提供方】 88 | 大多点击链接一键导入书源/订阅源,都是是采用了这种方式,如:**[喵公子书源管理](http://yuedu.miaogongzi.net/gx.html)** 89 | 90 | #### 0.【书源提供方】为按钮等添加链接 91 | 大多一键导入书源/订阅源,都是采用了这种方式 92 | > ``` 93 | > 可通过url唤起阅读进行一键导入,url格式: legado://import/{path}?src={url} 94 | > path类型: bookSource,rssSource,replaceRule,textTocRule,httpTTS,theme,readConfig,addToBookshelf 95 | > path类型解释: 书源,订阅源,替换规则,本地txt小说目录规则,在线朗读引擎,主题,阅读排版,添加到书架 96 | > legado://import/addToBookshelf?src={url} 97 | > ``` 98 | > 自官方API:https://github.com/gedoor/legado#api- 99 | 100 | 101 | 导入 Pixiv 书源的连接如下: 102 | ``` 103 | yuedu://booksource/importonline?src=https://raw.githubusercontent.com/windyhusky/PixivSource/main/pixiv.json 104 | ``` 105 | ``` 106 | legado://import/bookSource?src=https://raw.githubusercontent.com/windyhusky/PixivSource/main/pixiv.json 107 | ``` 108 | 109 | #### 1.手机浏览器内点击链接,跳转阅读 110 | 浏览器打开:**[喵公子书源管理](http://yuedu.miaogongzi.net/gx.html)** 111 | 112 | 一键导入按钮的链接,即为下面这条链接: 113 | ``` 114 | yuedu://booksource/importonline?src=https://cdn05042023.gitlink.org.cn/api/v1/repos/yi-c/yd/raw/sy.json?ref=master&access_token=92edf695d430562349cbfac4009fda6ad36817dd 115 | ``` 116 | 117 | 点击链接,跳转阅读 118 | ![img](pic/OpenInLegado.png) 119 | 120 | #### 2.导入完成并启用书源 121 | ![img](./pic/InportBookSourcePixiv.jpg) 122 |
123 | 124 | 125 |
E. 书源订阅( import 订阅源) 126 | 127 | ### E.书源订阅( import 订阅源) 128 | 如果你已经导入了【书源订阅】( import 订阅源),则可以用其导入书源 129 | 130 | #### 1.打开“书源订阅” 131 | 点击 “书源订阅”( import 订阅源) 132 | 133 | ![img](./pic/RssSourceImportLogo.png) 134 | 135 | 点击相应书源/订阅源,导入该源 136 | 137 | ![img](./pic/RssSourceImportWebpage.png) 138 | 139 | 140 | #### 2.导入相关资源 141 | 点击书源,导入书源 142 | 143 | ![img](./pic/InportBookSourceLinpx.png) 144 | 145 | 点击订阅源,导入订阅源 146 | 147 | ![img](./pic/InportRssSourceBtsrk.png) 148 |
149 | 150 | 151 | ## 2.2 确认启用书源 152 | ![img](https://telegra.ph/file/7b866f92fa9b556818206.png) 153 | 154 | 转载网站一般无需登录,基本上到这里就可以回到主页面,搜索书名看小说了 155 | 156 | **正版付费网站,以及一些登陆后才能看所有小说的网站,都需要登录账号** 157 | 158 | 159 | ## 2.3 登录账号 160 |
登陆账号 161 | 162 | ### 0.【根据需要】开启代理工具 163 | 此处略过,请自行学习,**最好开启【全局代理】** 164 | 165 | 166 | ### 1.找到需要登录的书源 167 | **点击右上角的三点菜单,选择【登录】,登录你的账号** 168 | 169 | ![img](./pic/PixivLogin1.jpg) 170 | 171 | 172 | ### 2.登录你的账号 173 | 登录成功后,点击右上角的对勾,关闭登录页面 174 | 175 | ![img](./pic/PixivLogin2.jpg) 176 | 177 | 对于Pixiv而言,**如果需要验证码,请更换代理,或过段时间再次尝试** 178 |
-------------------------------------------------------------------------------- /doc/ImportRssSource.md: -------------------------------------------------------------------------------- 1 | ## 3.导入订阅源 2 | 3 | ## 3.0 订阅源来源 4 | - [Legado|开源阅读 | 频道](https://t.me/legado_channels) 5 | - [源仓库](https://www.yckceo.com/yuedu/rss/index.html) 6 | > **更多方式请查看[书源获取方式](./ImportBookSource.md),一般二者会同时提供** 7 | 8 | 书源分享【订阅源】: 9 | - [喵公子订阅源](https://yd.mgz6.com) 10 | - [阅读 APP 源](https://legado.aoaostar.com) 11 | - [一程 阅读合集](https://flowus.cn/share/923f5a35-6dcf-47d1-b8eb-b9c5ef3ed39b) 12 | 13 | 14 | ## 3.1 导入订阅源 15 | 以下导入方法任选其一即可 16 | 17 |
18 | A. 文件导入 19 | 20 | ### A.文件导入更简单 21 | #### 1.下载书源/订阅源文件 22 | ``` 23 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/btsrk.json 24 | ``` 25 | ``` 26 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/books.json 27 | ``` 28 | 29 | #### 2.使用阅读打开 30 | 点击书源,选择用阅读打开 31 | 32 | ![img](pic/OpenInLegado.png) 33 | 34 | #### 3.导入完成并启用书源/订阅源 35 | ![img](./pic/InportRssSourceBtsrk.png) 36 |
37 | 38 | 39 |
40 | B. 规则订阅 41 | 42 | ### B.规则订阅易更新 43 | 【**开启代理**】后,复制下方的订阅源链接 44 | ``` 45 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/btsrk.json 46 | ``` 47 | ``` 48 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/books.json 49 | ``` 50 | #### 1. 打开【订阅】页面,点击【规则订阅】 51 | ![img](./pic/SubscribeEntry.png) 52 | 53 | #### 2. 点击加号,更改规则类型,粘贴链接,保存订阅 54 | **注意这里要把【书源】改成【订阅源】** 55 | 56 | ![img](./pic/SubscribeRssSourceBtsrk.jpg) 57 | 58 | 59 | #### 3. 点击相应订阅规则,导入并启用/更新书源 60 | ![img](./pic/SubscribeHomePage.jpg) 61 | 62 | **首次点击【订阅规则】 即可导入** 63 | ![img](./pic/InportRssSourceBtsrk.png) 64 | **导入之后,再次点击则会检查更新** 65 |
66 | 67 | 68 |
69 | C. 网络导入 70 | 71 | ### C.网络导入也方便 72 | 请【**开启代理**】后,复制下面的【订阅书源】链接 73 | - btsrk 订阅源 74 | ``` 75 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/btsrk.json 76 | ``` 77 | - 书源分享 订阅源 78 | ``` 79 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/books.json 80 | ``` 81 | 82 | #### 1.打开【订阅】页面,点击右上角【设置】 83 | ![img](pic/ImportOnlineRssSource1.png) 84 | 85 | #### 2.点击右上角的三点菜单,选择【网络导入】 86 | ![img](pic/ImportOnlineRssSource2.png) 87 | 88 | #### 3.粘贴订阅源链接,点击确定 89 | ![img](pic/ImportOnlineRssSource3.jpg) 90 | 91 | #### 4.导入完成并启用订阅源 92 | ![img](./pic/InportRssSourceBtsrk.png) 93 | 94 | ![img](pic/ImportOnlineRssSource4.jpg) 95 | 96 | **无法网络导入时,请尝试开启代理,或过段时间重试** 97 |
98 | 99 | 100 |
101 | D. Schema 链接导入 102 | 103 | ### D.Schema 链接导入 104 | 大多一键导入书源/订阅源,都是采用了这种方式 105 | 106 | #### 0.【书源提供方】为按钮等添加链接 107 | > ``` 108 | > 可通过url唤起阅读进行一键导入,url格式: legado://import/{path}?src={url} 109 | > path类型: bookSource,rssSource,replaceRule,textTocRule,httpTTS,theme,readConfig,addToBookshelf 110 | > path类型解释: 书源,订阅源,替换规则,本地txt小说目录规则,在线朗读引擎,主题,阅读排版,添加到书架 111 | > legado://import/addToBookshelf?src={url} 112 | > ``` 113 | > 自官方API:https://github.com/gedoor/legado#api- 114 | 115 | 导入 Pixiv 订阅源的连接如下: 116 | ``` 117 | yuedu://rsssource/importonline?src=https://raw.githubusercontent.com/windyhusky/PixivSource/main/btsrk.json 118 | ``` 119 | ``` 120 | legado://import/rssSource?src=https://raw.githubusercontent.com/windyhusky/PixivSource/main/btsrk.json 121 | ``` 122 | 123 | #### 1.点击链接,跳转阅读 124 | 浏览器打开:**[喵公子订阅源](https://dy.mgz6.com)** 125 | 126 | 一键导入按钮的链接,即为下面这条链接: 127 | ``` 128 | yuedu://rsssource/importonline?src=http://yuedu.miaogongzi.net/shuyuan/miaogongziDY.json 129 | ``` 130 | 点击链接,跳转阅读 131 | ![img](pic/OpenInLegado.png) 132 | 133 | #### 2.选择订阅源并导入 134 | 135 | ![img](./pic/InportRssSourceBtsrk.png) 136 |
137 | 138 | 139 |
140 | E. 书源订阅( import 订阅源) 141 | 142 | ### E.书源订阅( import 订阅源) 143 | 如果你已经导入了【书源订阅】( import 订阅源),则可以用其导入书源 144 | 145 | #### 1.打开“书源订阅” 146 | 点击 “书源订阅”( import 订阅源) 147 | 148 | ![img](./pic/RssSourceImportLogo.png) 149 | 150 | 点击相应书源/订阅源,导入该源 151 | 152 | ![img](./pic/RssSourceImportWebpage.png) 153 | 154 | 155 | #### 2.导入相关资源 156 | 点击书源,导入书源 157 | 158 | ![img](./pic/InportBookSourceLinpx.png) 159 | 160 | 点击订阅源,导入订阅源 161 | 162 | ![img](./pic/InportRssSourceBtsrk.png) 163 |
-------------------------------------------------------------------------------- /doc/Linpx.md: -------------------------------------------------------------------------------- 1 | # Linpx 书源的导入与使用 2 | 3 | ### [Linpx](http://www.furrynovel.ink) 是第三方 免代理 Pixiv 小说镜像站,主要内容为**兽人小说** 4 | 5 | ## 本书源使用前提 6 | 1. 使用阅读 3.0 版本 7 | 2. ⚠️ 部分区域需要代理(建议准备) 8 | 3. 导入 Linpx 的书源、订阅源 9 | 10 | 11 | ## 〇、下载并安装阅读 12 | ### 1.下载阅读 3.0 版本 13 |
14 | ⬇️ 下载阅读 15 | 16 | 点击链接,下载安装包并安装,**推荐使用共存版** 17 | > https://miaogongzi.lanzout.com/b01rgkhhe 18 | > 19 | > 最新下载链接请查看 [下载阅读](./Download.md) 20 | 21 | 22 | ### 2.了解阅读功能与用法 23 | > 请查看[阅读是什么软件?阅读简介](./ReadMe.md) 24 |
25 | 26 | 27 | ## 一、导入书源 & 订阅源 28 | ### 1.导入 Linpx 书源 29 |
30 | ➕ 导入书源 31 | 32 | 复制下方【免代理】书源链接 33 | ``` 34 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/linpx.json 35 | ``` 36 | #### 1.1 打开【订阅】页面,点击【规则订阅】 37 | ![img](./pic/SubscribeEntry.png) 38 | 39 | 40 | #### 1.2 点击加号,粘贴链接,保存订阅 41 | ![img](./pic/SubscribeBoookSourceLinpx.jpg) 42 | 43 | 44 | #### 1.3 点击相应订阅规则,导入并启用/更新书源 45 | ![img](./pic/SubscribeHomePage.jpg) 46 | 47 | **首次点击【订阅规则】 即可导入** 48 | 49 | ![img](./pic/InportBookSourceLinpx.jpg) 50 | 51 | **导入之后,再次点击则会检查更新** 52 | 53 | > 更多导入方法请查看[如何获取书源?导入书源?](./ImportBookSource.md) 54 |
55 | 56 | 57 | ### 2.导入 Linpx 订阅源 58 |
59 | ➕ 导入订阅源 60 | 61 | 复制下方【免代理】订阅源链接 62 | ``` 63 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/btsrk.json 64 | ``` 65 | #### 2.1 打开【订阅】页面,点击【规则订阅】 66 | ![img](./pic/SubscribeEntry.png) 67 | 68 | 69 | #### 2.2 点击加号,更改规则类型,粘贴链接,保存订阅 70 | **注意这里要把【书源】改成【订阅源】** 71 | 72 | ![img](./pic/SubscribeRssSourceBtsrk.jpg) 73 | 74 | 75 | #### 2.3 点击相应订阅规则,导入并启用/更新书源 76 | ![img](./pic/SubscribeHomePage.jpg) 77 | 78 | **首次点击【订阅规则】 即可导入** 79 | 80 | ![img](./pic/InportRssSourceBtsrk.png) 81 | 82 | **导入之后,再次点击则会检查更新** 83 | 84 | > 更多导入方法请查看[如何导入订阅源](./ImportRssSource.md) 85 |
86 | 87 | 88 | ## 二、确保网站可以访问 89 |
90 | 🌐 检查网站能否访问 91 | 92 | 订阅 - 点击 Linpx / 兽人控小说站 - 打开网站 93 | - 如果可以直接打开,那么一切大功告成! 94 | - **多数网络下,Linpx & 兽人控小说站 无需代理即可访问** 95 | - Linpx & 兽人控小说站 没有账号体系,**无需登录即可使用**,不必做过多的操作 96 | 97 | - 如果 **无法直接打开** 则可以: 98 | - 切换至其他网络(**更换网络运营商、使用流量或 WIFI**)后再尝试 99 | - 开启代理后再尝试 100 |
101 | 102 | 103 | ## 三、添加小说,尽情使用 104 | ### 1.阅读内部搜索 105 |
106 | 🔎 搜索小说 107 | 108 | - ✅ 支持搜索:小说名称、作者名称、小说标签、小说链接 109 | - ⚠️ 暂不支持:系列小说名称 110 | 111 | ![img](./pic/SearchViaLegado.png) 112 |
113 | 114 | 115 | ### 2.发现更多小说 116 |
117 | ⭐️ 常规功能 118 | 119 | 发现:推荐作者、最新小说 120 | 121 | ![img](./pic/DiscoverLinpx.png) 122 |
123 | 124 | 125 | ### 3.添加网址 126 |
127 | 🔗 添加网址 128 | 129 | 书架 - 菜单 - 添加网址 - 粘贴小说链接,可以同时添加多个小说的链接 130 | 131 | ![img](./pic/AddBookViaUrl1.png) 132 | ![img](./pic/AddBookViaUrl2.png) 133 | ![img](./pic/AddBookViaUrl3.png) 134 | 135 | 支持 Linpx 多个格式的网址链接: 136 | 137 | ``` 138 | Linpx 小说长链接 139 | https://www.furrynovel.xyz/pixiv/novel/20063566 140 | https://furrynovel.ink/pixiv/novel/20063566 141 | 142 | Linpx 分享链接 143 | http://furrynovel.xyz/pn/20063566 144 | https://furrynovel.ink/pn/20063566 145 | 146 | Linpx 分享信息 147 | 我正在看唐尼瑞姆创作的《测试页面》一起来看吧! 148 | https://furrynovel.ink/pn/20063566 149 | ``` 150 |
151 | 152 | 153 | ### 4.订阅源添加小说 154 |
155 | 🏠 订阅源 156 | 157 | #### 4.1 替代阅读搜索 158 | 受阅读设计的限制,阅读内部搜索不可能完全支持 Linpx 的功能。网站的搜索功能更加全面。 159 | 160 | ![img](./pic/SearchViaLinpx.png) 161 | 162 | 163 | #### 4.2 Pixiv 链接转换 164 | 阅读内部浏览器内打开 Linpx,搜索栏中粘贴 Pixiv 小说链接,即可进入对应页面 165 | 166 | ![img](./pic/LinpxConvertPixivUrl1.png) 167 | 168 | ![img](./pic/LinpxConvertPixivUrl2.png) 169 | 170 | 171 | #### 4.3 添加小说至书架 172 | 打开 Linpx 小说页面,点击【添加到书架】按钮,即可添加小说到书架 173 | 174 | ![img](./pic/AddBookViaLinpx.png) 175 |
176 | 177 | 178 | ## 四、故障排查 179 | > 详见:[故障排查与处理](./TroubleShoot.md) 180 |
181 | 🐞 故障排查 182 | 183 | ### 1.没有搜索结果,请自行检查一下内容: 184 | 185 | **⓪检查 Linpx 书源是否导入** 186 | 187 | **①检查 Linpx 书源是否启用** 188 | 189 | **②检查代理是否可用** 190 | 191 | **③检查阅读是否走了代理** 192 | 193 | **④检查网络是否可用** 194 | 195 | **如果上述均无问题,但依然没有搜索结果,那就是书源需要更新了** 196 | 197 | 198 | ### 2.图片无法正常显示 199 | 200 | #### 解决措施:关闭替换净化 201 | ![img](./pic/ReplaceTurnOff.png) 202 |
203 | 204 | 205 | ## 本教程由兽人阅读频道 [@FurryReading](https://t.me/FurryReading) 提供 206 | -------------------------------------------------------------------------------- /doc/Pixiv.md: -------------------------------------------------------------------------------- 1 | # Pixiv 书源的导入与使用 2 | 3 | ### [Pixiv](www.pixiv.net) 是以插图、漫画、小说为中心的艺术网站 4 | 5 | 6 | ## 本书源使用前提 7 | 1. 使用阅读 3.0 版本 8 | 2. 开启代理【必须】 9 | 3. 导入 Pixiv 的书源、订阅源 10 | 4. 登录 Pixiv 的账号【必须】 11 | 5. 开启 Pixiv R18 设置 12 | 13 | 14 | ## 〇、下载并安装阅读 15 | ### 1.下载阅读 3.0 版本 16 |
17 | ⬇️ 下载阅读 18 | 19 | 点击链接,下载安装包并安装,**推荐使用共存版** 20 | > https://miaogongzi.lanzout.com/b01rgkhhe 21 | > 22 | > 最新下载链接请查看 [下载阅读](./Download.md) 23 | 24 | 25 | ### 2.了解阅读功能与用法 26 | > 请查看[阅读是什么软件?阅读简介](./ReadMe.md) 27 |
28 | 29 | 30 | ## 一、导入书源 & 订阅源 31 | ### 1.导入 Pixiv 书源 32 |
➕ 导入书源 33 | 34 | 【**开启代理**】后,复制下方的书源链接 35 | ``` 36 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/pixiv.json 37 | ``` 38 | 39 | 40 | #### 1.1 打开【订阅】页面,点击【规则订阅】 41 | ![img](./pic/SubscribeEntry.png) 42 | 43 | 44 | #### 1.2 点击加号,粘贴链接,保存订阅 45 | ![img](./pic/SubscribeBoookSourcePixiv.jpg) 46 | 47 | 48 | #### 1.3 点击相应订阅规则,导入并启用/更新书源 49 | ![img](./pic/SubscribeHomePage.jpg) 50 | 51 | **首次点击【订阅规则】 即可导入** 52 | 53 | ![img](./pic/InportBookSourcePixiv.jpg) 54 | 55 | **【系列书源】与【单篇书源】功能完全一致,导入/启用其中一个即可** 56 | 57 | **导入之后,再次点击则会检查更新** 58 | 59 | > 更多导入方法请查看[如何获取书源?导入书源?](./ImportBookSource.md) 60 |
61 | 62 | 63 | ### 2.导入 Pixiv 订阅源 64 |
➕ 导入订阅源 65 | 66 | 【**开启代理**】后,复制下方的订阅源链接 67 | ``` 68 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/btsrk.json 69 | ``` 70 | 71 | #### 2.1 打开【订阅】页面,点击【规则订阅】 72 | ![img](./pic/SubscribeEntry.png) 73 | 74 | 75 | #### 2.2 点击加号,更改规则类型,粘贴链接,保存订阅 76 | **注意这里要把【书源】改成【订阅源】** 77 | 78 | ![img](./pic/SubscribeRssSourceBtsrk.jpg) 79 | 80 | 81 | #### 2.3 点击相应订阅规则,导入并启用/更新书源 82 | ![img](./pic/SubscribeHomePage.jpg) 83 | 84 | **首次点击【订阅规则】 即可导入** 85 | 86 | ![img](./pic/InportRssSourceBtsrk.png) 87 | 88 | **导入之后,再次点击则会检查更新** 89 | 90 | > 更多导入方法请查看[如何导入订阅源](./ImportRssSource.md) 91 |
92 | 93 | 94 | ## 二、登录账号 95 | Pixiv 及正版付费书源,需要登录账号才能阅读相关小说 96 | ### 1. 登录 Pixiv 账号 97 | 98 |
🅿️ 登录 Pixiv 账号 99 | 100 | #### 1.1 开启代理工具 101 | 此处略过,请自行学习,**最好开启【全局代理】** 102 | 103 | 104 | #### 1.2 登录 Pixiv 账号 105 | **我的-书源管理-点击 Pixiv 书源右侧三点菜单-登录-登录账号** 106 | 107 | ![img](./pic/PixivLogin1.jpg) 108 | 109 | ![img](./pic/PixivLoginUI.jpg) 110 | 111 | **登录你的账号,登录成功后,点击右上角的对勾** 112 | 113 | ![img](./pic/PixivLogin2.jpg) 114 | 115 | **如果需要验证码,请更换代理,或过段时间再次尝试** 116 |
117 | 118 | 119 | ### 2. 开启 Pixiv 的 R18 设置 120 | #### 如果你已经开启了,则可以跳过这一步 121 |
📆 编辑出生年份 122 | 123 | #### 2.1 编辑出生年份 124 | **再次点击登录,滑动屏幕,点击头像,再次点击头像,编辑个人资料** 125 | 126 | [Pixiv 个人资料](https://www.pixiv.net/settings/profile) - 编辑个人资料 - 出生年份 127 | 128 | 出生年份改到:**2000年或2000年之前**,确保你的年龄在20岁及以上 129 | 130 | ![img](./pic/PixivSettingsBirth.png) 131 | 132 |
133 | 134 |
🔞 修改 Pixiv 浏览范围 135 | 136 | #### 2.2 修改作品浏览范围 137 | **我的-书源管理-点击 Pixiv 书源右侧三点菜单-登录-账号设置** 138 | ![img](./pic/PixivLoginUI.jpg) 139 | 140 | [Pixiv 设置](https://www.pixiv.net/settings/viewing) - 浏览与显示 - 年龄限制作品 141 | 142 | 根据自己情况选择显示:R18 作品 与 R18G 作品 143 | 144 | 不知道二者区别的可以查看这篇文档 [作品评级是什么?](https://www.pixiv.help/hc/zh-cn/articles/39125149371289-%E4%BD%9C%E5%93%81%E8%AF%84%E7%BA%A7%E6%98%AF%E4%BB%80%E4%B9%88) 145 | 146 | ![img](./pic/PixivSettingsView.png) 147 |
148 | 149 | 150 | ## 三、添加小说,尽情使用 151 | ### 1.阅读内部搜索 152 |
🔎 搜索小说 153 | 154 | ✅ 默认搜索:同时搜索小说名称、系列小说名称、标签、作者 155 | ![img](./pic/SearchViaLegado.png) 156 |
157 | 158 | 159 |
🔄 繁简通搜 160 | 161 | - 搜索【名称】和【标签】时,【默认】进行繁简转换,同时返回繁体简体小说内容,返回小说内容不做转换处理 162 | - 【搜索作者】不做转换处理 163 | 164 | ![img](./pic/SearchViaLegadoConvert.jpg) 165 |
166 | 167 | 168 |
👤 作者专搜 169 | 170 | 作者专搜(格式:`@作者名称`) 171 | - 仅搜索作者;不做繁简转换 172 | - `@` 为标记符,打出1个即可,例如:`@pixiv事務局` 173 | - 暂时不支持与 `#` 同时使用,可与字数过滤同时使用 174 | 175 | ![img](./pic/SearchViaLegadoAuthor.jpg) 176 |
177 | 178 | 179 |
#️⃣ 标签专搜 180 | 181 | 标签专搜(格式:`#标签1` `#标签1 标签2 `) 182 | - 仅搜索标签、小说名称;多个标签空格间隔,【默认】进行繁简转换 183 | - `#` 为标记符,打出1个即可,例如:`#校园` `#校园 纯爱` `#校园 纯爱 BG` 184 | - 暂时不支持与 `@` 同时使用,可与字数过滤同时使用 185 | 186 | ![img](./pic/SearchViaLegadoHashtag.jpg) 187 |
188 | 189 | 190 |
⏬ 字数过滤 191 | 192 | 字数过滤(格式:`关键词 字数3k`) 193 | - 字数限制规则:`3k 3k5 3w 3w5`【注意`k`与`w`均为小写】 194 | - 例如:`校园 字数3k` `校园 纯爱 字数3k` 195 | 196 | ![img](./pic/SearchViaLegadoWordCountFilter1.jpg) 197 | ![img](./pic/SearchViaLegadoWordCountFilter2.jpg) 198 |
199 | 200 | 201 | ### 2.发现更多小说 202 |
⭐️ 常规功能 203 | 204 | ![img](./pic/DiscoverPixiv.jpg) 205 |
206 | 207 | 208 |
👑 小说排行 209 | 210 | ![img](./pic/DiscoverPixivRanking.png) 211 | - ✅ R18小说排行榜(🔞 排行榜) 212 | - ✅ 一般小说排行榜(🆗 排行榜) 213 | >(默认隐藏,可在书源设置中修改`SHOW_GENERAL_RANK`),更改后需要在发现页面刷新分类(发现:长按"Pixiv",刷新 214 |
215 | 216 | 217 |
🆙 更新书源 218 | 219 | 点击按钮【🆙 更新】以更新书源/更新订阅 220 | ![img](./pic/UpdateSource.jpg) 221 |
222 | 223 | 224 |
❤️ 他人收藏 225 | 226 | 发现 - 长按"Pixiv" - 编辑 - 右上角菜单 - 设置源变量 227 | 228 | ![img](./pic/SetSourceVariable0.png) 229 | 230 | ![img](./pic/SetSourceVariable1.png) 231 | 232 | ![img](./pic/SetSourceVariable2.png) 233 | 234 | 设置源变量:输入作者ID,一行一个,可添加作者名,保存 235 | ``` 236 | 12345 // 作者A 237 | 67890 # 作者B 238 | ``` 239 | 发现:长按"Pixiv",刷新,查看他人收藏 240 | 241 | ![img](./pic/SetSourceVariable0.png) 242 | 243 | ![img](./pic/DiscoverPixivLikes.jpg) 244 |
245 | 246 | 247 | ### 3.添加网址 248 |
249 | 🔗 添加网址 250 | 书架 - 菜单 - 添加网址 - 粘贴小说链接,可以同时添加多个小说的链接 251 | 252 | ![img](./pic/AddBookViaUrl1.png) 253 | ![img](./pic/AddBookViaUrl2.png) 254 | ![img](./pic/AddBookViaUrl3.png) 255 | 256 | 支持 Pixiv 多个格式的网址链接: 257 | ``` 258 | Pixiv 小说链接 259 | https://www.pixiv.net/novel/show.php?id=20063566 260 | 261 | Pixiv 系列小说链接 262 | https://www.pixiv.net/novel/series/8054073 263 | ``` 264 | 无法添加的链接: 265 | ``` 266 | Pixiv App 小说分享链接(删掉#号即可正常添加) 267 | 测试页面 | 唐尼瑞姆 #pixiv https://www.pixiv.net/novel/show.php?id=20063566 268 | 269 | Pixiv 作者页面 270 | https://www.pixiv.net/users/16721009 271 | ``` 272 |
273 | 274 | 275 | ### 4.订阅源 276 |
🆙 更新书源 277 | 278 | #### 4.0 更新书源 279 | 点击按钮【🆙 更新书源】以更新书源/更新订阅 280 | ![img](./pic/UpdateSource.jpg) 281 |
282 | 283 | 284 |
💬 替代阅读 285 | 286 | #### 4.1 替代阅读搜索 287 | 受阅读所限,阅读内部搜索不可能完全支持 Pixiv 的全部搜索功能。网站的搜索功能更加全面 288 | 289 | ![img](./pic/SearchViaPixiv.png) 290 | 291 | 292 | #### 4.2 替代阅读发现 293 | 阅读内部浏览器打开 Pixiv,即可使用 Pixiv 书源未完成的功能,如排行榜等功能 294 | ![img](./pic/PixivNovelRanking.png) 295 |
296 | 297 | 298 |
➕ 添加小说 299 | 300 | #### 4.3 添加小说至书架 301 | 在阅读内部浏览器内打开 Pixiv 小说/系列小说页面,【刷新】,点击【加入书架】按钮添加小说到书架 302 | 303 | - 添加小说到书架 304 | ![img](./pic/AddBookViaPixiv1.png) 305 | 306 | - 添加系列小说到书架 307 | ![img](./pic/AddBookViaPixiv2.png) 308 |
309 | 310 | 311 | ## 四、故障排查 312 | > 详见:[故障排查与处理](./TroubleShoot.md) 313 |
314 | 🐞 故障排查 315 | 316 | ### 1.确定书源可以正常使用 317 | 书架页面,搜索 `R18` 测试书源能否正常使用,以及R18设置是否开启。 318 | 319 | #### 如果没有搜索结果,请检查一下内容: 320 | **⓪检查 Pixiv 书源是否导入** 321 | 322 | **①检查 Pixiv 书源是否启用** 323 | 324 | **②检查代理是否可用** 325 | 326 | **③检查阅读是否走了代理** 327 | 328 | **④检查网络是否可用** 329 | 330 | **如果上述均无问题,但依然没有搜索结果,那就是书源需要更新了** 331 | 332 | 333 | ### 2.图片无法正常显示 334 | #### 解决措施:关闭替换净化 335 | ![img](./pic/ReplaceTurnOff.png) 336 |
337 | 338 | 339 | ## 本教程由兽人阅读频道 [@FurryReading](https://t.me/FurryReading) 提供 340 | -------------------------------------------------------------------------------- /doc/ReadMe.md: -------------------------------------------------------------------------------- 1 | # 开源阅读简介 & 使用指南 2 | 3 | ![img](https://telegra.ph/file/baff78c0816cac595ba8a.jpg) 4 | 5 | ## 1.阅读是什么? 6 | 阅读指 [**Legado / 开源阅读**](https://github.com/gedoor/legado) 这一开源阅读软件。因其源代码公开,为与其他阅读软件区分,称其为**开源阅读**。 7 | 8 | 以下内容转自: [**阅读常见问题解答**](https://mp.weixin.qq.com/s/5EO-TuqYfDrK-bFk78vd3g) 9 | 10 | > **阅读是一个 免费、开源、可更换小说来源的 无广告 阅读软件** 11 | > 12 | > **阅读是一个特殊的浏览器,通过特定规则【书源/订阅源】访问网页,并进行重新排版** 13 | > 14 | > **阅读软件本身不提供任何小说/漫画/有声/视频内容,提供内容是所访问的网站** 15 | 16 | 17 | ## 2.名词解释 18 | 19 | ### **书源:从小说网站获取书籍内容的特定规则** 20 | 21 | ### **发现:获取小说网站上的排行榜、书籍分类等** 22 | 23 | ### **替换净化规则:删除广告网址,优化阅读体验** 24 | 25 | ### **订阅源:类似于RSS,甚至可以听音乐看视频** 26 | 27 | 28 | ## 3.下载阅读 29 | ### 3.1 Android 版(官方) 30 | **点击链接,下载安装包并安装,推荐使用共存版** 31 | https://miaogongzi.lanzout.com/b01rgkhhe 32 | 33 | ### 3.2 苹果 iOS 版(非官方) 34 |
兼容阅读书源的非官方软件 35 | 36 | | 软件名称 | 备注 | 37 | | ------- | -------------------------- | 38 | | [源阅](https://github.com/kaich/SourceReadSite) | 兼容阅读书源,【源阅读】的后续版本,TestFlight 付费 ¥128 | 39 | | [千阅](https://apps.apple.com/app/id1665963317) | 不完全兼容阅读书源,需要付费 ¥98 | 40 | | ~~[读不舍手](https://apps.apple.com/app/id1662413517)~~ | 不完全兼容阅读书源,广告较多,会员付费 | 41 |
42 | 43 | ### 3.3 更多版本详见 [下载阅读](./Download.md) 44 | 45 | 46 | ## 4.下载安装后应该做什么? 47 | > ### 0. [阅读是什么软件?阅读简介](./ReadMe.md) 【你在这里】 48 | > ### 1. [阅读使用教程(太长不看版)](./TooLongToRead.md) 49 | >> #### 1.1 [Pixiv 书源的导入与使用](./Pixiv.md) 50 | >> #### 1.2 [Linpx 书源的导入与使用](./Linpx.md) 51 | >> #### 1.3 [兽人控小说站 书源的导入与使用](./FurryNovel.md) 52 | >> #### 1.4 搜索小说、查看订阅,畅享阅读 53 | > ### 2. [添加远程书籍](./RemoteBooks.md),畅享阅读 54 | > ### 3. [设置 Webdav 备份](./WebdavBackup.md) 55 | > ### 4. [故障排查与处理](./TroubleShoot.md) 56 | 57 | 58 | ## 5.常用功能(转自 [官方使用指南](https://www.yuque.com/legado/wiki/xz) ) 59 | 60 | - ### 导入:[书源](https://www.yuque.com/legado/wiki/xdroke) ;[替换净化](https://www.yuque.com/legado/wiki/gnt3nq) ;[订阅源](https://www.yuque.com/legado/wiki/grqch2) ;[主题](https://www.yuque.com/legado/wiki/tgbqdy) 61 | 62 | - ### 导出:[导出小说](https://telegra.ph/很多人不知道如何导出TXT-02-16) ;导出书源 63 | 64 | - ### 备份:[坚果云注册](https://www.yuque.com/legado/wiki/fkx510) ,[设置云备份](https://www.yuque.com/legado/wiki/mgu5qu) ,[恢复备份](https://www.yuque.com/legado/wiki/nxs89y) 65 | ### 官方指南反馈:LegadoAsk@outlook.com 66 | 67 | 68 | ## 6.[官方社群](https://www.yuque.com/legado/wiki/community) 69 | ### QQ 频道:[阅读](https://pd.qq.com/s/8qxylhj2s) 70 | ### Telegram:[Legado|开源阅读](https://t.me/legado_channels) 、 [Legado Beta](https://t.me/Legado_Beta) 71 | 72 | 73 | ## 本页内容由兽人阅读频道 [@FurryReading](https://t.me/FurryReading) 整理 74 | -------------------------------------------------------------------------------- /doc/RemoteBooks.md: -------------------------------------------------------------------------------- 1 | ## 远程书籍 2 | ### 1.远程书籍配置 3 | 4 | 书架菜单 - 远程书籍 - 右上角三点菜单 - 服务器配置 - 加号 - 添加服务器配置信息 5 | 6 | ![img](./pic/RemoteBooksSettings0.png) 7 | 8 | ![img](./pic/RemoteBooksSettings1.png) 9 | 10 | ![img](./pic/RemoteBooksSettings2.png) 11 | 12 | 点击加号,添加服务器配置 13 | 14 | ![img](./pic/RemoteBooksSettings3.png) 15 | 16 | 填入 Webdav 服务器配置信息 17 | 18 | ![img](./pic/RemoteBooksSettings4.png) 19 | 20 | > 地址 `url` 填入 Webdav 服务器地址 21 | > 22 | > 账户 `username` 填入注册邮箱 23 | > 24 | > 密码 `password` 填入 **应用密码(非账户密码)** 25 | 26 | 保存,选择添加的服务器 27 | 28 | ![img](./pic/RemoteBooksSettings5.png) 29 | 30 | 刷新,查看文件 31 | 32 | ![img](./pic/RemoteBooksSettings6.png) 33 | 34 | 选择书籍,放入书架 35 | 36 | ![img](./pic/RemoteBooksSettings7.png) 37 | 38 | 39 | ### 2.兽人小说分享 [@FurryNovels](https://t.me/FurryReading/2145) 40 | > https://t.me/FurryReading/2145 41 | > 42 | > [兽人小说服务器配置信息](https://github.com/DowneyRem/FurryNovels/blob/main/doc/RemoteBooks.md#2%E5%85%BD%E4%BA%BA%E5%B0%8F%E8%AF%B4%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE) -------------------------------------------------------------------------------- /doc/TooLongToRead.md: -------------------------------------------------------------------------------- 1 | # 阅读使用教程 2 | ## 1.下载并安装阅读 3 |
4 | ⬇️ 下载阅读 5 | 6 | 点击链接,下载安装包并安装,**推荐使用共存版** 7 | > https://miaogongzi.lanzout.com/b01rgkhhe 8 | > 9 | > 最新下载链接请查看 [下载阅读](./Download.md) 10 |
11 | 12 | ![img](./pic/DownloadLegado.png) 13 | 14 | 15 | ## 2.导入相关书源 & 订阅源 16 | 这里推荐两种方法,任选其一即可 17 | > 更多方法详见: 18 | > **[导入书源](./ImportBookSource.md)** & 19 | > **[导入订阅源](./ImportRssSource.md)** 20 | 21 |
22 | A. 文件导入 23 | 24 | ### A.文件导入 25 | #### 1.下载书源/订阅源文件 26 | 如果你一同下载了书源文件,可以使用本地导入 27 | 28 | ![img](./pic/DownloadResource.png) 29 | 30 | 31 | #### 2.使用阅读打开 32 | 点击下载完成的书源文件,选择【用其他应用打开】 33 | ![img](pic/OpenInQQ.png) 34 | 35 | 打开方式选择阅读 36 | ![img](pic/OpenInLegado.png) 37 | 38 | 39 | #### 3.导入完成并启用书源/订阅源 40 | ![img](./pic/InportBookSourcePixiv.jpg) 41 |
42 | 43 | 44 |
45 | B. 书源订阅( import 订阅源) 46 | 47 | ### B.书源订阅( import 订阅源) 48 | 如果你未导入 **【 import 订阅源】** ,请先导入 49 |
50 | ➕ 导入 import 订阅源 51 | 52 | 复制下方【免代理】订阅源链接 53 | ``` 54 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json 55 | ``` 56 | #### 0. 导入 import 订阅源 57 | ##### 0.1 打开【订阅】页面,点击【规则订阅】 58 | ![img](./pic/SubscribeEntry.png) 59 | 60 | 61 | ##### 0.2 点击加号,更改规则类型,粘贴链接,保存订阅 62 | **注意这里要把【书源】改成【订阅源】** 63 | 64 | ![img](./pic/SubscribeRssSourceImport.png) 65 | 66 | 67 | ##### 0.3 点击相应订阅规则,导入并启用/更新书源 68 | ![img](./pic/SubscribeHomePage.png) 69 | 70 | **首次点击【订阅规则】 即可导入** 71 | 72 | ![img](./pic/InportRssSourceImport.png) 73 | 74 | **导入之后,再次点击则会检查更新** 75 |
76 | 77 | 78 | 79 | #### 1.打开“书源订阅” 80 | 点击 “书源订阅”( import 订阅源) 81 | 82 | ![img](./pic/RssSourceImportLogo.png) 83 | 84 | 点击相应书源/订阅源,导入该源 85 | 86 | ![img](./pic/RssSourceImportWebpage.png) 87 | 88 | 89 | #### 2.导入相关资源 90 | 点击书源,导入书源 91 | 92 | ![img](./pic/InportBookSourceLinpx.png) 93 | 94 | 点击订阅源,导入订阅源 95 | 96 | ![img](./pic/InportRssSourceBtsrk.png) 97 |
98 | 99 | 100 | ## 3.登陆账号 101 | ### 1. Linpx 与 兽人控小说站 102 |
103 | 🌐 检查网站能否访问 104 | 105 | 订阅 - 点击 Linpx / 兽人控小说站 - 打开网站 106 | - 如果可以直接打开,那么一切大功告成! 107 | - **多数网络下,Linpx & 兽人控小说站 无需代理即可访问** 108 | - Linpx & 兽人控小说站 没有账号体系,**无需登录即可使用**,不必做过多的操作 109 | 110 | - 如果 **无法直接打开** 则可以: 111 | - 切换至其他网络(**更换网络运营商、使用流量或 WIFI**)后再尝试 112 | - 开启代理后再尝试 113 |
114 | 115 | 116 | ### 2. Pixiv 【需要登录】 117 | Pixiv 及正版付费书源,需要登录账号才能阅读相关小说 118 | 119 |
120 | 🅿️ 登录 Pixiv 账号 121 | 122 | #### 1. 开启代理工具 123 | 此处略过,请自行学习,**最好开启【全局代理】** 124 | 125 | 126 | #### 2. 登录 Pixiv 账号 127 | **我的-书源管理-点击 Pixiv 书源右侧三点菜单-登录** 128 | 129 | ![img](./pic/PixivLogin1.jpg) 130 | 131 | **登录你的账号,登录成功后,点击右上角的对勾** 132 | 133 | ![img](./pic/PixivLogin2.jpg) 134 | 135 | **如果需要验证码,请更换代理,或过段时间再次尝试** 136 |
137 | 138 | 139 | ## 4.使用书源,畅享阅读 140 | - ✅ 搜索:书架页面,搜索小说,添加小说到书架 141 | - ✅ 发现:发现页面,查看小说,添加小说到书架 142 | - ✅ 添加网址:书架页面,通过 **【添加网址】** 添加小说到书架 143 | - ✅ 订阅源:订阅页面,通过 **【订阅源】** 添加小说到书架 144 | 145 | 146 |
147 | 更多教程 148 | 149 | > ### 1. [阅读使用教程(太长不看版)](./TooLongToRead.md)【你在这里】 150 | >> #### 1.1 [Pixiv 书源的导入与使用](./Pixiv.md) 151 | >> #### 1.2 [Linpx 书源的导入与使用](./Linpx.md) 152 | >> #### 1.3 [兽人控小说站 书源的导入与使用](./FurryNovel.md) 153 | >> #### 1.4 搜索小说、查看订阅,畅享阅读 154 | > ### 2. [添加远程书籍](./Remotebooks),畅享阅读 155 | > ### 3. [设置 Webdav 备份](./WebdavBackup.md) 156 | > ### 4. [故障排查与处理](./TroubleShoot.md) 157 |
158 | 159 | ## 本教程由兽人阅读频道 [@FurryReading](https://t.me/FurryReading) 提供 -------------------------------------------------------------------------------- /doc/TroubleShoot.md: -------------------------------------------------------------------------------- 1 | ## 5.故障排查与处理 2 | 3 | 4 | ### 5.1 搜索无结果 5 | 1. 检查网络是否可用 6 | - 检查**网络**是否可用?更换其他网络重试 7 | - 检查**代理**是否可用?更换其他代理重试 8 | - ##### **检查阅读软件是否走了代理?** 9 | 2. 检查并更新阅读软件 10 | - ##### **更新阅读软件** 11 | - 尝试使用阅读的不同版本重试 12 | 3. 检查并更新相关书源 13 | - 检查书源**是否导入?** 14 | - 检查书源**是否启用?** 15 | - ##### **更新书源** 16 | 4. 检查书源网站能否访问,相关功能是否正常 17 | - 检查书源所用网站能否访问? 18 | - 检查书源所用网站功能能否正常? 19 | - ##### **阅读内部登陆该网站**,重试 20 | 5. 向书源开发者反馈 21 | 22 | 23 | ### 5.2 发现页面报错 24 | 1. 检查网络是否可用 25 | - 检查**网络**是否可用?更换其他网络重试 26 | - 检查**代理**是否可用?更换其他代理重试 27 | - ##### **检查阅读软件是否走了代理?** 28 | 2. 检查并更新阅读软件 29 | - ##### **更新阅读软件** 30 | - 尝试使用阅读的不同版本重试 31 | 3. 检查并更新相关书源 32 | - ##### **更新书源** 33 | 4. 检查书源网站是否可访问 34 | - 检查书源所用网站能否访问? 35 | - 检查书源所用网站功能能否正常? 36 | - ##### **阅读内部登陆该网站**,重试 37 | 5. 向书源开发者反馈 38 | 39 | 40 | ### 5.3 正文图片显示为链接 41 | 1. **关闭替换净化** 42 | ![img](./pic/ReplaceTurnOff.png) 43 | 44 | -------------------------------------------------------------------------------- /doc/Version.md: -------------------------------------------------------------------------------- 1 | ### 3.3 版本区分 2 | #### 1. 阅读2.0版本与3.0版本 3 | [阅读2.0版本](https://github.com/gedoor/MyBookshelf/releases) 于2022年4月份停止更新。 4 | 5 | **[阅读3.0版本](https://github.com/gedoor/legado) 目前是阅读的主流版本**,也是多数书源支持的版本。安卓5以上均可使用。 6 | 7 | 8 | ### 阅读3.0的细化版 9 |
10 | Legado x Pixiv 11 |
12 | 13 | 14 | #### 2.0 安卓版与苹果版 15 | - 目前阅读 3.0 仅支持 Android 安卓设备 16 | - ~~官方正在开发 [iOS版](https://github.com/gedoor/YueDuFlutter) ,[近期在TF测试](https://gedoor.github.io/download) ,最新消息请见:[Telegram 频道(iOS版)](https://t.me/legado_ios)~~ 17 | - 官方已放弃开发苹果版 18 | 19 | #### 2.1 限制版与R18版(原包名、共存版) 20 | ![img](./pic/Legado-Version-R18.png) 21 | > https://t.me/Legado_Channels/411 22 | 23 | 屏蔽规则中的网站早已年久失修,现在使用起来并无影响。 24 | 25 | 26 | #### 2.2开发版与稳定版 27 | 开发版:基于 Github Actions 自动构建出来的版本 28 | 29 | 稳定版:应用商店 / Telegram 频道等分发的版本 30 | 31 | 32 | #### 2.3 普通版、Pro版、Beta版 33 | 普通版:无更多美化功能的版本 34 | 35 | Pro版:Google Play 商店上架的收费版本(仅有更多美化功能),**现已被永久下架。所有Pro限定功能已经移植到普通版(2023.11.01)** 36 | 37 | ![img](./pic/Legado-Version-Pro.png) 38 | > https://t.me/Legado_Channels/1279 39 | 40 | Beta版:根据此消息,推测为将Pro版本功能移植到“普通版”过程中的测试版。 41 | 42 | 后因主要开发者很久未曾出现,阅读无法以原签名继续更新软件,目前只能以 Beta 版更新 43 | 44 | -------------------------------------------------------------------------------- /doc/WebdavBackup.md: -------------------------------------------------------------------------------- 1 | ## [Webdav 备份与恢复](https://www.yuque.com/legado/wiki/fkx510) 2 | 阅读支持 WebDav 云备份,所有支持 WebDav 的云盘都可以用来备份。 3 | 4 | 建议使用坚果云,每月1G免费流量,备份阅读已经足够了。 5 | 6 | 7 | ## 1. 配置坚果云 8 | ### 1.0 [注册并登录坚果云](https://www.jianguoyun.com/d/signup) 9 | 10 | 11 | ### 1.1 [配置坚果云](https://www.yuque.com/legado/wiki/fkx510) 12 | 13 | #### 1. 在右上角点击【用户名】,选择【账户信息】 14 | 15 | ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12737724/1614782003487-6ec8950c-6d47-462b-b350-8f7d490d8cd1.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_55%2Ctext_TGVnYWRvIMK3IOW8gOa6kOmYheivuw%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10) 16 | 17 | #### 2. 点击【安全选项】后,在第三方管理里【添加应用】 18 | ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12737724/1614782472368-aa50fe7e-ae13-4fd2-ac9e-3a0957b0bd29.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_55%2Ctext_TGVnYWRvIMK3IOW8gOa6kOmYheivuw%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10) 19 | 20 | #### 3. 输入名称,点击【生成密码】,最后点击完成 21 | ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12737724/1614782954299-0dd59ade-5bc4-4dc6-9abd-3b696237ebc8.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_16%2Ctext_TGVnYWRvIMK3IOW8gOa6kOmYheivuw%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10) 22 | 23 | #### 4. 到此 WebDav 账户设置完成 24 | ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12737724/1614783363300-d74cf960-ddf4-4a04-aee2-df1f21565b0f.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_23%2Ctext_TGVnYWRvIMK3IOW8gOa6kOmYheivuw%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10) 25 | 26 | 27 |

28 | ## 2. [设置备份信息](https://www.yuque.com/legado/wiki/mgu5qu) 29 | 30 | 31 | #### 2.1 进入备份与恢复 32 | 主界面 - 我的 - 设置 - 备份与恢复 33 | 34 | ![img](pic/WebdavBackup0.png) 35 | 36 | 37 | #### 2.2 设置 WebDav 备份信息 38 | 在 WebDav 设置里填入服务器地址、账户、应用密码 39 | 40 | ![img](pic/WebdavBackup1.png) 41 | 42 | 43 | #### 2.3 自动备份 44 | 完成 WebDav 备份设置后,每次退出APP即会自动备份。 45 | 46 | **仅返回式退出会自动备份,任务栏直接关闭不会备份** 47 | 48 | **同一天的备份会覆盖,不同日期的备份不会覆盖** 49 | 50 | 51 |

52 | ## 3. 备份与恢复数据 53 | ![img.png](pic/WebdavBackup2.png) 54 | 55 | 56 | ### 3.1 手动备份数据 57 | **备份与恢复 - 备份,即可备份数据** 58 | 59 | 首次备份,请检查坚果云里是否有备份文件。 60 | 61 | 如果备份失败,请手动在坚果云根目录新建文件夹"legado",然后再备份 62 | 63 | 64 | ### 3.2 [恢复数据](https://www.yuque.com/legado/wiki/nxs89y) 65 | **备份与恢复 - 恢复** 66 | 67 | ![img](pic/WebdavBackup2.png) 68 | 69 | **选择需要恢复的备份文件**,即可恢复数据 70 | ![img](pic/WebdavBackup3.png) -------------------------------------------------------------------------------- /doc/pic/AddBookViaFurryNovel1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/AddBookViaFurryNovel1.png -------------------------------------------------------------------------------- /doc/pic/AddBookViaFurryNovel2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/AddBookViaFurryNovel2.png -------------------------------------------------------------------------------- /doc/pic/AddBookViaLinpx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/AddBookViaLinpx.png -------------------------------------------------------------------------------- /doc/pic/AddBookViaPixiv1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/AddBookViaPixiv1.png -------------------------------------------------------------------------------- /doc/pic/AddBookViaPixiv2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/AddBookViaPixiv2.png -------------------------------------------------------------------------------- /doc/pic/AddBookViaUrl1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/AddBookViaUrl1.png -------------------------------------------------------------------------------- /doc/pic/AddBookViaUrl2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/AddBookViaUrl2.png -------------------------------------------------------------------------------- /doc/pic/AddBookViaUrl3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/AddBookViaUrl3.png -------------------------------------------------------------------------------- /doc/pic/DiscoverFurryNovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/DiscoverFurryNovel.png -------------------------------------------------------------------------------- /doc/pic/DiscoverFurryNovelSort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/DiscoverFurryNovelSort.png -------------------------------------------------------------------------------- /doc/pic/DiscoverLinpx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/DiscoverLinpx.png -------------------------------------------------------------------------------- /doc/pic/DiscoverPixiv.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/DiscoverPixiv.jpg -------------------------------------------------------------------------------- /doc/pic/DiscoverPixivLikes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/DiscoverPixivLikes.jpg -------------------------------------------------------------------------------- /doc/pic/DiscoverPixivRanking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/DiscoverPixivRanking.png -------------------------------------------------------------------------------- /doc/pic/DownloadLegado.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/DownloadLegado.png -------------------------------------------------------------------------------- /doc/pic/DownloadResource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/DownloadResource.png -------------------------------------------------------------------------------- /doc/pic/FurryNovelRaces.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/FurryNovelRaces.png -------------------------------------------------------------------------------- /doc/pic/FurryNovelWebpage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/FurryNovelWebpage.png -------------------------------------------------------------------------------- /doc/pic/ImportOnlineBookSource1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/ImportOnlineBookSource1.jpg -------------------------------------------------------------------------------- /doc/pic/ImportOnlineBookSource2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/ImportOnlineBookSource2.jpg -------------------------------------------------------------------------------- /doc/pic/ImportOnlineBookSource3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/ImportOnlineBookSource3.jpg -------------------------------------------------------------------------------- /doc/pic/ImportOnlineRssSource1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/ImportOnlineRssSource1.png -------------------------------------------------------------------------------- /doc/pic/ImportOnlineRssSource2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/ImportOnlineRssSource2.png -------------------------------------------------------------------------------- /doc/pic/ImportOnlineRssSource3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/ImportOnlineRssSource3.jpg -------------------------------------------------------------------------------- /doc/pic/ImportOnlineRssSource4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/ImportOnlineRssSource4.jpg -------------------------------------------------------------------------------- /doc/pic/InportBookSourceLinpx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/InportBookSourceLinpx.jpg -------------------------------------------------------------------------------- /doc/pic/InportBookSourceLinpx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/InportBookSourceLinpx.png -------------------------------------------------------------------------------- /doc/pic/InportBookSourcePixiv.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/InportBookSourcePixiv.jpg -------------------------------------------------------------------------------- /doc/pic/InportRssSourceBooks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/InportRssSourceBooks.jpg -------------------------------------------------------------------------------- /doc/pic/InportRssSourceBtsrk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/InportRssSourceBtsrk.png -------------------------------------------------------------------------------- /doc/pic/InportRssSourceImport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/InportRssSourceImport.png -------------------------------------------------------------------------------- /doc/pic/Legado-Pixiv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/Legado-Pixiv.png -------------------------------------------------------------------------------- /doc/pic/Legado-Pixiv1200x800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/Legado-Pixiv1200x800.png -------------------------------------------------------------------------------- /doc/pic/Legado-Version-Pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/Legado-Version-Pro.png -------------------------------------------------------------------------------- /doc/pic/Legado-Version-R18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/Legado-Version-R18.png -------------------------------------------------------------------------------- /doc/pic/Legado-Version-iOS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/Legado-Version-iOS.png -------------------------------------------------------------------------------- /doc/pic/LinpxConvertPixivUrl1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/LinpxConvertPixivUrl1.png -------------------------------------------------------------------------------- /doc/pic/LinpxConvertPixivUrl2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/LinpxConvertPixivUrl2.png -------------------------------------------------------------------------------- /doc/pic/LinpxWebpage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/LinpxWebpage.png -------------------------------------------------------------------------------- /doc/pic/OpenInLegado.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/OpenInLegado.png -------------------------------------------------------------------------------- /doc/pic/OpenInQQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/OpenInQQ.png -------------------------------------------------------------------------------- /doc/pic/PixivLogin1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/PixivLogin1.jpg -------------------------------------------------------------------------------- /doc/pic/PixivLogin2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/PixivLogin2.jpg -------------------------------------------------------------------------------- /doc/pic/PixivLoginUI.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/PixivLoginUI.jpg -------------------------------------------------------------------------------- /doc/pic/PixivNovelRanking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/PixivNovelRanking.png -------------------------------------------------------------------------------- /doc/pic/PixivSettingsBirth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/PixivSettingsBirth.png -------------------------------------------------------------------------------- /doc/pic/PixivSettingsView.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/PixivSettingsView.png -------------------------------------------------------------------------------- /doc/pic/RemoteBooksSettings0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RemoteBooksSettings0.png -------------------------------------------------------------------------------- /doc/pic/RemoteBooksSettings1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RemoteBooksSettings1.png -------------------------------------------------------------------------------- /doc/pic/RemoteBooksSettings2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RemoteBooksSettings2.png -------------------------------------------------------------------------------- /doc/pic/RemoteBooksSettings3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RemoteBooksSettings3.png -------------------------------------------------------------------------------- /doc/pic/RemoteBooksSettings4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RemoteBooksSettings4.png -------------------------------------------------------------------------------- /doc/pic/RemoteBooksSettings5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RemoteBooksSettings5.png -------------------------------------------------------------------------------- /doc/pic/RemoteBooksSettings6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RemoteBooksSettings6.png -------------------------------------------------------------------------------- /doc/pic/RemoteBooksSettings7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RemoteBooksSettings7.png -------------------------------------------------------------------------------- /doc/pic/ReplaceTurnOff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/ReplaceTurnOff.png -------------------------------------------------------------------------------- /doc/pic/RssSourceImportLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RssSourceImportLogo.png -------------------------------------------------------------------------------- /doc/pic/RssSourceImportWebpage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/RssSourceImportWebpage.png -------------------------------------------------------------------------------- /doc/pic/SearchViaFurryNovel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SearchViaFurryNovel.png -------------------------------------------------------------------------------- /doc/pic/SearchViaLegado.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SearchViaLegado.png -------------------------------------------------------------------------------- /doc/pic/SearchViaLegadoAuthor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SearchViaLegadoAuthor.jpg -------------------------------------------------------------------------------- /doc/pic/SearchViaLegadoConvert.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SearchViaLegadoConvert.jpg -------------------------------------------------------------------------------- /doc/pic/SearchViaLegadoHashtag.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SearchViaLegadoHashtag.jpg -------------------------------------------------------------------------------- /doc/pic/SearchViaLegadoWordCountFilter1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SearchViaLegadoWordCountFilter1.jpg -------------------------------------------------------------------------------- /doc/pic/SearchViaLegadoWordCountFilter2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SearchViaLegadoWordCountFilter2.jpg -------------------------------------------------------------------------------- /doc/pic/SearchViaLinpx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SearchViaLinpx.png -------------------------------------------------------------------------------- /doc/pic/SearchViaPixiv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SearchViaPixiv.png -------------------------------------------------------------------------------- /doc/pic/SetSourceVariable0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SetSourceVariable0.png -------------------------------------------------------------------------------- /doc/pic/SetSourceVariable1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SetSourceVariable1.png -------------------------------------------------------------------------------- /doc/pic/SetSourceVariable2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SetSourceVariable2.png -------------------------------------------------------------------------------- /doc/pic/SubscribeBoookSourceLinpx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SubscribeBoookSourceLinpx.jpg -------------------------------------------------------------------------------- /doc/pic/SubscribeBoookSourcePixiv.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SubscribeBoookSourcePixiv.jpg -------------------------------------------------------------------------------- /doc/pic/SubscribeEntry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SubscribeEntry.png -------------------------------------------------------------------------------- /doc/pic/SubscribeHomePage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SubscribeHomePage.jpg -------------------------------------------------------------------------------- /doc/pic/SubscribeHomePage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SubscribeHomePage.png -------------------------------------------------------------------------------- /doc/pic/SubscribeRssSourceBtsrk.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SubscribeRssSourceBtsrk.jpg -------------------------------------------------------------------------------- /doc/pic/SubscribeRssSourceImport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/SubscribeRssSourceImport.png -------------------------------------------------------------------------------- /doc/pic/UpdateSource.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/UpdateSource.jpg -------------------------------------------------------------------------------- /doc/pic/WebdavBackup0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/WebdavBackup0.png -------------------------------------------------------------------------------- /doc/pic/WebdavBackup1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/WebdavBackup1.png -------------------------------------------------------------------------------- /doc/pic/WebdavBackup2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/WebdavBackup2.png -------------------------------------------------------------------------------- /doc/pic/WebdavBackup3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/windyhusky/PixivSource/88a4e5cb054ac4e540d826c1192779381580e593/doc/pic/WebdavBackup3.png -------------------------------------------------------------------------------- /furrynovel/ReadMe.txt: -------------------------------------------------------------------------------- 1 | 兽人控小说站书源(更新📆:2024-01-31) 2 | 3 | 可用功能:✅搜索✅发现✅添加网址✅订阅源 4 | 搜索小说:✅单篇✅系列✅作者✅标签 5 | 发现小说:✅热门小说✅最新小说✅随便来点 6 | 添加网址:✅兽人控小说站链接 7 | 订阅用法:点击订阅源打开小说/系列小说,点击【加入书架】按钮,添加小说到书架 8 | 9 | 书源发布:兽人阅读频道 https://t.me/FurryReading 10 | 项目地址:https://github.com/windyhusky/PixivSource 11 | 使用教程:https://github.com/windyhusky/PixivSource/blob/main/doc/FurryNovel.md 12 | 13 | 规则订阅:Import 订阅源 14 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json 15 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/import.json 16 | 17 | ⚙️ 书源设置: 18 | 书源管理 - 编辑书源 - 基本 - 变量说明 - 修改并保存 19 | 20 | 🔎 筛选发现: 21 | 发现 - 长按"Pixiv" - 编辑 - 右上角菜单 - 设置源变量 22 | 设置源变量:输入标签,保存 23 | 发现 - 长按"Pixiv" - 刷新 - 查看他人收藏 -------------------------------------------------------------------------------- /furrynovel/base.bookUrlPattern.txt: -------------------------------------------------------------------------------- 1 | FN 小说链接 2 | (https?://)?(www\.)?furrynovel\.com/(zh|en|ja)/novel/\d+(/chapter/d+)? 3 | 4 | FN API链接 5 | (https?://)?(www\.|api\.)?furrynovel\.com(/api)?/(zh|en|ja)/novel/\d+(/chapter/d+)? -------------------------------------------------------------------------------- /furrynovel/base.header.json: -------------------------------------------------------------------------------- 1 | {"referer": "https://furrynovel.com/"} 2 | -------------------------------------------------------------------------------- /furrynovel/base.loginCheckJS.js: -------------------------------------------------------------------------------- 1 | var util = {} 2 | 3 | function objStringify(obj) { 4 | return JSON.stringify(obj, (n, v) => { 5 | if (typeof v == "function") 6 | return v.toString(); 7 | return v; 8 | }); 9 | } 10 | 11 | function publicFunc() { 12 | let u = {} 13 | java.log(String(source.bookSourceComment).split("\n")[0]) // 输出书源信息 14 | java.log(`本地书源更新时间:${java.timeFormat(source.lastUpdateTime)}`) // 输出书源信息 15 | settings = JSON.parse(String(source.variableComment).match(RegExp(/{([\s\S]*?)}/gm))) 16 | if (settings !== null) { 17 | java.log("⚙️ 使用自定义设置") 18 | } else { 19 | settings = {} 20 | settings.CONVERT_CHINESE = true // 搜索:搜索时进行繁简转换 21 | settings.MORE_INFORMATION = false // 详情:书籍简介显示更多信息 22 | // settings.SHOW_UPDATE_TIME = true // 目录:显示更新时间,但会增加少许请求 23 | settings.SHOW_ORIGINAL_LINK = true // 目录:显示原始链接,但会增加大量请求 24 | settings.REPLACE_TITLE_MARKS = true // 正文:注音内容为汉字时,替换为书名号 25 | // settings.SHOW_CAPTIONS = true // 正文:章首显示描述 26 | settings.SHOW_COMMENTS = true // 正文:章尾显示评论 27 | settings.DEBUG = false // 全局:调试模式 28 | java.log("⚙️ 使用默认设置(无自定义设置 或 自定义设置有误)") 29 | } 30 | u.CONVERT_CHINESE = settings.CONVERT_CHINESE 31 | u.MORE_INFORMATION = settings.MORE_INFORMATION 32 | // u.SHOW_UPDATE_TIME = settings.SHOW_UPDATE_TIME 33 | u.SHOW_ORIGINAL_LINK = settings.SHOW_ORIGINAL_LINK 34 | u.REPLACE_TITLE_MARKS = settings.REPLACE_TITLE_MARKS 35 | // u.SHOW_CAPTIONS = settings.SHOW_CAPTIONS 36 | u.SHOW_COMMENTS = settings.SHOW_COMMENTS 37 | u.DEBUG = settings.DEBUG 38 | 39 | if (u.DEBUG === true) { 40 | java.log(JSON.stringify(settings, null, 4)) 41 | java.log(`DEBUG = ${u.DEBUG}`) 42 | } 43 | u.debugFunc = (func) => { 44 | if (util.DEBUG) { 45 | func() 46 | } 47 | } 48 | 49 | u.getNovels = function () { 50 | if (JSON.parse(result).code === 200 && JSON.parse(result).count > 0) { 51 | return JSON.parse(result).data 52 | } else { 53 | return [] 54 | } 55 | } 56 | 57 | u.handNovels = function (novels) { 58 | novels.forEach(novel =>{ 59 | // novel.id = novel.id 60 | novel.title = novel.name 61 | // novel.tags = novel.tags 62 | novel.userName = novel.author.name 63 | // novel.userId = novel.author.id 64 | novel.textCount = null 65 | if (novel.latest_chapters === undefined) { 66 | novel.latestChapter = null 67 | novel.detailedUrl = urlNovelDetail(novel.id) 68 | } else { 69 | novel.latestChapter = novel.latest_chapters[0].name 70 | novel.detailedUrl = urlNovelUrl(novel.id) 71 | } 72 | novel.description = novel.desc 73 | novel.coverUrl = novel.cover 74 | 75 | // novel.source = novel.source 76 | novel.oneShot = novel.ext_data.oneShot 77 | novel.sourceId = novel.source_id 78 | novel.sourceUrl = urlSourceUrl(novel.source, novel.oneShot, novel.sourceId) 79 | 80 | novel.createDate = novel.created_at 81 | novel.updateDate = novel.updated_at 82 | novel.syncDate = novel.fetched_at 83 | // novel.status = novel.status 84 | // if (novel.status !== "publish") { // suspend 85 | // java.log(urlNovelUrl(novel.id)) 86 | // java.log(novel.sourceUrl) 87 | // } 88 | }) 89 | return novels 90 | } 91 | 92 | u.formatNovels = function (novels) { 93 | novels.forEach(novel => { 94 | novel.title = novel.title.replace(RegExp(/^\s+|\s+$/g), "") 95 | novel.tags2 = [] 96 | for (let i in novel.tags) { 97 | let tag = novel.tags[i] 98 | if (tag.includes("/")) { 99 | let tags = tag.split("/") 100 | novel.tags2 = novel.tags2.concat(tags) 101 | } else { 102 | novel.tags2.push(tag) 103 | } 104 | } 105 | novel.tags = Array.from(new Set(novel.tags2)) 106 | novel.tags = novel.tags.join(",") 107 | novel.createDate = dateFormat(novel.createDate) 108 | novel.updateDate = dateFormat(novel.updateDate) 109 | novel.syncDate = dateFormat(novel.syncDate) 110 | if (util.MORE_INFORMATION) { 111 | novel.description = `\n书名:${novel.title}\n作者:${novel.userName}\n标签:${novel.tags}\n上传:${novel.createDate}\n更新:${novel.updateDate}\n同步:${novel.syncDate}\n简介:${novel.description}` 112 | } else { 113 | novel.description = `\n${novel.description}\n上传时间:${novel.createDate}\n更新时间:${novel.updateDate}\n同步时间:${novel.syncDate}` 114 | } 115 | }) 116 | return novels 117 | } 118 | 119 | u.getNovelRes = function (result, type) { 120 | let res = {data: []}, chapterId = 0 121 | let isHtml = result.startsWith("") 122 | let pattern = "(https?://)?(www\\.)?furrynovel\\.com/(zh|en|ja)/novel/\\d+(/chapter/d+)?" 123 | let fnWebpage = baseUrl.match(new RegExp(pattern)) 124 | 125 | if (isHtml && fnWebpage) { 126 | let novelId = baseUrl.match(new RegExp("\\d+"))[0] 127 | if (type === "detail") { 128 | res = getAjaxJson(urlNovelDetail(novelId)) 129 | } else if (type === "catalog") { 130 | res = getAjaxJson(urlNovelChapterInfo(novelId)) 131 | } else if (type === "content") { 132 | try { 133 | chapterId = baseUrl.match(RegExp(/\/(\d+)\/chapter\/(\d+)/))[2] 134 | } catch (e) { 135 | chapterId = getAjaxJson(urlNovelChapterInfo(novelId)).data[0].id 136 | } finally { 137 | res = getAjaxJson(urlNovelChapterDetail(novelId, chapterId)) 138 | } 139 | } 140 | } else { 141 | res = JSON.parse(result) 142 | } 143 | if (res.data.length === 0) { 144 | java.log(`无法从 FurryNovel 获取当前小说`) 145 | java.log(JSON.stringify(res)) 146 | } 147 | return res.data 148 | } 149 | 150 | util = u 151 | java.put("util", objStringify(u)) 152 | } 153 | 154 | publicFunc() 155 | java.getStrResponse(null, null) -------------------------------------------------------------------------------- /furrynovel/base.variableComment.txt: -------------------------------------------------------------------------------- 1 | 🔎 筛选发现: 2 | 发现 - 长按"兽人小说站" - 编辑 - 右上角菜单 - 设置源变量 3 | 设置源变量:输入想要搜索/筛选的标签,以空格间隔(或一行一个),保存 4 | 发现 - 长按"兽人小说站" - 刷新 - 查看他人收藏 5 | 以下内容为源变量模板: 6 | 中文 原创 纯爱 7 | 8 | 9 | ⚙️ 自定义书源设置: 10 | ⚙️ 自定义设置:请在基本-变量说明处修改代码 11 | ⚙️ 自定义设置:将 true 改为 false,或相反 12 | ⚠️ 设置源变量【无法】更改书源自定义设置 13 | ⚠️ 注意不要添加或删除尾随逗号"," 14 | ⚠️ 发现页需要长按"兽人控小说站",手动刷新 15 | 以下内容为书源设置: 16 | { 17 | "CONVERT_CHINESE": true, 18 | "MORE_INFORMATION": false, 19 | "SHOW_ORIGINAL_LINK": true, 20 | 21 | "REPLACE_TITLE_MARKS": true, 22 | "SHOW_CAPTIONS": true, 23 | "SHOW_COMMENTS": true, 24 | 25 | "FAST": true, 26 | "DEBUG": false 27 | } 28 | 29 | // CONVERT_CHINESE 30 | // 搜索:搜索时进行繁简转换,但搜索会变慢 31 | // MORE_INFORMATION 32 | // 详情:书籍简介显示更多信息 33 | // SHOW_ORIGINAL_LINK 34 | // 目录:显示原始链接,但会增加大量请求 35 | 36 | // REPLACE_TITLE_MARKS 37 | // 正文:注音内容为汉字时,替换为书名号 38 | // SHOW_CAPTIONS 39 | // 正文:章首显示小说描述 40 | // SHOW_COMMENTS 41 | // 正文:章尾显示小说评论 42 | 43 | // DEBUG 44 | // 调试模式 45 | 46 | -------------------------------------------------------------------------------- /furrynovel/catalog.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function urlNovelChapter(novelId, chapterId) { 14 | if (util.SHOW_ORIGINAL_LINK) { 15 | return urlNovelChapterUrl(novelId, chapterId) 16 | } else { 17 | return urlNovelChapterDetail(novelId, chapterId) 18 | } 19 | } 20 | 21 | function novelHandler(novels) { 22 | novels.forEach(novel => { 23 | novel.chapterId = novel.id 24 | novel.novelId = baseUrl.match(RegExp(/\d+/))[0] 25 | novel.detailedUrl = urlNovelUrl(novel.novelId) 26 | novel.chapterName = novel.title = novel.name 27 | novel.chapterUrl = urlNovelChapter(novel.novelId, novel.chapterId) 28 | novel.chapterInfo = `${novel.created_at}  ${novel.text_count}字` 29 | }) 30 | return novels 31 | } 32 | 33 | (function () { 34 | return novelHandler(util.getNovelRes(result, "catalog")) 35 | })() -------------------------------------------------------------------------------- /furrynovel/content.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function getContent(res) { 14 | let content = res.content 15 | // 获取 [uploadedimage:] 的图片链接 16 | let hasEmbeddedImages = content.match(RegExp(/\[uploadedimage:(\d+)-?(\d+)]/gm)) 17 | if (hasEmbeddedImages) { 18 | resp = getAjaxJson(urlLinpxNovelDetail(res.source_id)) 19 | Object.keys(resp.images).forEach((key) => { 20 | content = content.replace(`[uploadedimage:${key}]`, ``) 21 | }) 22 | } 23 | 24 | // 获取 [pixivimage:] 的图片链接 [pixivimage:1234] [pixivimage:1234-1] 25 | let matched = content.match(RegExp(/\[pixivimage:(\d+)-?(\d+)]/gm)) 26 | if (matched) { 27 | for (let i in matched) { 28 | let illustId, order 29 | let matched2 = matched[i].match(RegExp("(\\d+)-?(\\d+)")) 30 | let temp = matched2[0].split("-") 31 | illustId = temp[0] 32 | if (temp.length >= 2) { 33 | order = temp[1] 34 | } 35 | content = content.replace(`${matched[i]}`, ``) 36 | } 37 | } 38 | 39 | // 替换 Pixiv 分页标记符号 [newpage] 40 | matched = content.match(RegExp(/[  ]*\[newpage][  ]*/gm)) 41 | if (matched) { 42 | for (let i in matched) { 43 | content = content.replace(`${matched[i]}`, `${"

".repeat(3)}`) 44 | } 45 | } 46 | 47 | // 替换 Pixiv 章节标记符号 [chapter:] 48 | matched = content.match(RegExp(/\[chapter:(.*?)]/gm)) 49 | if (matched) { 50 | for (let i in matched) { 51 | let matched2 = matched[i].match(/\[chapter:(.*?)]/m) 52 | let chapter = matched2[1].trim() 53 | content = content.replace(`${matched[i]}`, `${chapter}

`) 54 | } 55 | } 56 | 57 | // 替换 Pixiv 跳转页面标记符号 [[jump:]] 58 | matched = content.match(RegExp(/\[jump:(\d+)]/gm)) 59 | if (matched) { 60 | for (let i in matched) { 61 | let page = matched[i].match(/\d+/) 62 | content = content.replace(`${matched[i]}`, `\n\n跳转至第${page}节`) 63 | } 64 | } 65 | 66 | // 替换 Pixiv 链接标记符号 [[jumpuri: > ]] 67 | matched = content.match(RegExp(/\[\[jumpuri:(.*?)>(.*?)]]/gm)) 68 | if (matched) { 69 | for (let i in matched) { 70 | let matched2 = matched[i].match(/\[\[jumpuri:(.*?)>(.*?)]]/m) 71 | let matchedText = matched2[0] 72 | let urlName = matched2[1].trim() 73 | let urlLink = matched2[2].trim() 74 | // 阅读不支持超链接 75 | //content = content.replace(`${matchedText}`, `${urlName}`) 76 | if (urlLink === urlName) { 77 | content = content.replace(`${matchedText}`, `${urlName}`) 78 | } else { 79 | content = content.replace(`${matchedText}`, `${urlName}: ${urlLink}`) 80 | } 81 | } 82 | } 83 | 84 | // 替换 Pixiv 注音标记符号 [[rb: > ]] 85 | matched = content.match(RegExp(/\[\[rb:(.*?)>(.*?)]]/gm)) 86 | if (matched) { 87 | for (let i in matched) { 88 | let matched2 = matched[i].match(/\[\[rb:(.*?)>(.*?)]]/m) 89 | let matchedText = matched2[0] 90 | let kanji = matched2[1].trim() 91 | let kana = matched2[2].trim() 92 | 93 | if (!util.REPLACE_TITLE_MARKS) { 94 | // 默认替换成(括号) 95 | content = content.replace(`${matchedText}`, `${kanji}(${kana})`) 96 | } else { 97 | let reg = RegExp("[\\u4E00-\\u9FFF]+", "g"); 98 | if (reg.test(kana)) { 99 | // kana为中文,则替换回《书名号》 100 | content = content.replace(`${matchedText}`, `${kanji}《${kana}》`) 101 | } else { 102 | // 阅读不支持 注音 103 | // content = content.replace(`${matchedText}`, `${kanji}${kana}`) 104 | content = content.replace(`${matchedText}`, `${kanji}(${kana})`) 105 | } 106 | } 107 | } 108 | } 109 | return content 110 | } 111 | 112 | (function () { 113 | return getContent(util.getNovelRes(result, "content")) 114 | })() -------------------------------------------------------------------------------- /furrynovel/detail.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function novelHandler(novel) { 14 | novel = util.formatNovels(util.handNovels([novel]))[0] 15 | novel.detailedUrl = urlNovelUrl(novel.id) 16 | novel.catalogUrl = urlNovelChapterInfo(novel.id) 17 | return novel 18 | } 19 | 20 | (() => { 21 | return novelHandler(util.getNovelRes(result, "detail")) 22 | })(); -------------------------------------------------------------------------------- /furrynovel/discover.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function handlerFactory() { 14 | if (baseUrl.includes("https://cdn.jsdelivr.net")) { 15 | return updateSource() 16 | } 17 | if (baseUrl.includes("furrynovel.com")) { 18 | return util.formatNovels(util.handNovels(util.getNovels())) 19 | } 20 | else { 21 | return [] 22 | } 23 | } 24 | 25 | (() => { 26 | return handlerFactory() 27 | })() -------------------------------------------------------------------------------- /furrynovel/discover_address.js: -------------------------------------------------------------------------------- 1 | @js: 2 | let keyword = String(source.getVariable()).replace("#", "") 3 | let key = keyword.split(/[  ,,、\n]/) 4 | if (key.includes("")) { 5 | key.splice(key.indexOf(""), 1) 6 | } 7 | if (key.length === 0) { 8 | sleepToast("可设置源变量,筛选发现 🔍 ") 9 | sleepToast('发现页 - 长按"兽人控小说站" - 编辑 - 右上角菜单 - 设置源变量') 10 | } else { 11 | sleepToast(`正在搜索:${key.join("、")}`) 12 | } 13 | 14 | let li = [ 15 | {"🔥 热门": `https://api.furrynovel.com/api/novel?page={{page}}&order_by=popular&${key.map(v => "tags[]=" + v).join("&")}`}, 16 | {"🆕 最新": `https://api.furrynovel.com/api/novel?page={{page}}&order_by=latest&${key.map(v => "tags[]=" + v).join("&")}`}, 17 | {"🔄 随便": `https://api.furrynovel.com/api/novel?page={{page}}&order_by=random&${key.map(v => "tags[]=" + v).join("&")}`}, 18 | {"🆙 更新": "https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/linpx.json"}, 19 | ] 20 | 21 | // 格式化发现地址 22 | li.forEach(item => { 23 | item.title = Object.keys(item)[0] 24 | item.url = Object.values(item)[0] 25 | delete item[Object.keys(item)[0]] 26 | item.style = {} 27 | item.style.layout_flexGrow = 1 28 | item.style.layout_flexBasisPercent = 0.15 29 | }) 30 | JSON.stringify(li) -------------------------------------------------------------------------------- /furrynovel/search.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function search(name, page=1) { 14 | let resp = getAjaxJson(urlSearchNovel(name, page)) 15 | java.log(urlSearchNovel(name, page)) 16 | if (resp.code === 200 && resp.count > 0) { 17 | return resp.data 18 | } else { 19 | return [] 20 | } 21 | } 22 | 23 | function getConvertNovels() { 24 | let novels = [] 25 | let novelName = String(java.get("key")) 26 | let name1 = String(java.s2t(novelName)) 27 | let name2 = String(java.t2s(novelName)) 28 | if (name1 !== novelName) novels = novels.concat(search(name1)) 29 | if (name2 !== novelName) novels = novels.concat(search(name2)) 30 | return novels 31 | } 32 | 33 | (() => { 34 | let novels = [] 35 | novels = novels.concat(util.getNovels()) 36 | if (util.CONVERT_CHINESE) novels = novels.concat(getConvertNovels()) 37 | // java.log(JSON.stringify(novels)) 38 | // 返回空列表中止流程 39 | if (novels.length === 0) { 40 | return [] 41 | } 42 | return util.formatNovels(util.handNovels(novels)) 43 | })(); -------------------------------------------------------------------------------- /furrynovel/searchUrl.js: -------------------------------------------------------------------------------- 1 | @js: 2 | java.put("key", key) 3 | java.put("page", page) 4 | urlSearchNovel(key, page) -------------------------------------------------------------------------------- /import/Readme.md: -------------------------------------------------------------------------------- 1 | ### Pixiv 书源订阅 2 | #### 修改自:书源订阅 @Thomas喲 3 | 4 | > 书源订阅 @Thomas喲 (非官方仓库) 5 | > 6 | > https://gitee.com/feiniao6/yd -------------------------------------------------------------------------------- /import/base.header.json: -------------------------------------------------------------------------------- 1 | { 2 | "User-Agent": "Mozilla/5.0 (Linux; Android 8.0.0; MI 5s Plus Build/OPR1.170623.032; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36", 3 | "upgrade-insecure-requests": "1", 4 | "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", 5 | "accept-language": "zh-CN,en-US;q=0.9", 6 | "cookie": "down_ip=1", 7 | "x-requested-with": "cn.nr19.mbrowser" 8 | } -------------------------------------------------------------------------------- /import/base.loginUrl.js: -------------------------------------------------------------------------------- 1 | a = String(source.sourceComment); 2 | reg1 = /\s*『.*?』\s*/g 3 | reg2 = /.+《(.*?)》.*/ 4 | sortName = [] 5 | 6 | b = a.match(reg1); 7 | b = a.split(reg1).map((list, i) => { 8 | if (!/^\s*$/.test(list)) { 9 | try { 10 | sort = b[i - 1].match(/『(.*?)』/)[1] + "::"; 11 | } 12 | catch (err) { 13 | sort = "🌟 精选推荐::" 14 | } 15 | 16 | url = []; 17 | Sort = [""]; 18 | list.split(/\s*\n\s*/).map(text => { 19 | text = String(text); 20 | if (text.split('::').length == 2 && /^(?!.*(&&|•)).*::/.test(text)) { 21 | Sort.push(text); 22 | } else { 23 | text.split(/\s*(&&|•)\s*/).map(text => { 24 | if (text.split('::').length == 2) Sort.push(text); 25 | else if (!/^\s*::/.test(sort) && reg2.test(text)) url.push(text); 26 | }); 27 | } 28 | }); 29 | return sort += url.join('•') + Sort.join('\n'); 30 | } 31 | return list 32 | }).map(text => { 33 | text = String(text).replace(/^\s*::\s*|\s*::\s*$/g, ''); 34 | 35 | text = text.split('\n').map(text=>{ 36 | if (/《/.test(text)) text = text.replace(/^(.+?::)(https?\:\/\/(www.)?baidu.com\/?\?wd=\s*)*/, '$1https://www.baidu.com/?wd='); 37 | 38 | 39 | // 更改连接符 40 | return text.replace(/\s*(♞♞|★)\s*/g, '•'); 41 | }).join('\n'); 42 | if (/::/.test(text)) { 43 | sortName.push(text.replace(/::.*/g, '')) 44 | return text 45 | } 46 | return ""; 47 | }).join('\n'); 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | function set(json) { 59 | json = JSON.stringify(json).replace(/(".+?)(\d[,}])/g,'\n\t\t$1 $2').replace(/}$/,'\n}'); 60 | return source.setVariable(json); 61 | } 62 | 63 | function get() { 64 | try { 65 | v = JSON.parse(source.getVariable()); 66 | } catch (e) { 67 | v = null 68 | } 69 | if (v == null || Array.isArray(v)) v = {}; 70 | } 71 | get() 72 | 73 | sortName = sortName.join(',').replace(/\s*\n\s*/g, ',').split(',').map($ => { 74 | $ = $.trim() 75 | if (v[$] == undefined) v[$] = 1; 76 | return $; 77 | }).join(','); 78 | b = b.split('\n').map(text => { 79 | t = text.trim() 80 | return v[t.split(/\s*::/)[0]] ? t : "" 81 | }).join('\n'); 82 | set(v); 83 | 84 | 85 | //log字符串 86 | function login(t) { 87 | if (t == undefined) return true; 88 | java.log(t); 89 | java.toast(t); 90 | } 91 | 92 | 93 | //log当前分类状态 94 | function look(type) { 95 | get(); 96 | if (JSON.stringify(v) == "{}") $('全部分类'); 97 | if(type){ 98 | t = [{name:"     ༺ˇ»`ʚ 分类选择 ɞ´«ˇ༻     ",type:"button",action:"$('全部分类')"} 99 | ,{name:"  查看分类设置  ",type:"button",action:"look(0)"} 100 | ,{name:"  格式分组名称  ",type:"button",action:"look(1)"}]; 101 | for (key in v) t.push({ 102 | name:key, 103 | type:"button", 104 | action:"$('"+key+"')" 105 | }); 106 | t.push({name: "       反馈Q群:365976134       ",type:"button",action:"http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=x8r6m0bYYon_pCgT0BRc1ohwZmkkY61Q&authKey=DpmUioCvx45WjRRBnbRT2DsJ7LL6DNY3uau%2BFKPgR%2FSKz4EgYqUjEU5tJNi%2BkNPl&noverify=0&group_code=365976134"}); 107 | set(t) 108 | t = "【格式发现】\n\t❗数组是复制到登录ui的❗\nemmm,登录日志好像没办法长按复制。\n已保存到源变量,去源变量那里复制吧。"; 109 | } 110 | else{ 111 | t = "【分类状态】"; 112 | for (key in v) t += '\n\t' + key + '=>' + (v[key] ? '启用' : '禁用'); 113 | } 114 | return login(t); 115 | } 116 | 117 | 118 | //启用/禁用 119 | function $(sort, name) { 120 | get(); 121 | if (name == undefined) name = sort.split(',')[0]; 122 | name = name.trim() 123 | if (name == '全部分类') { 124 | sort = sortName; 125 | } else { //屏蔽错误分类 126 | sort1 = [] 127 | sort2 = sortName.split(',') 128 | sort.split(',').map(key1 => { 129 | key1 = key1.trim(); 130 | for (i in sort2) { 131 | key2 = sort2[i].trim(); 132 | if (key1 == key2) { 133 | sort1.push(key1); 134 | break; 135 | } 136 | } 137 | }) 138 | sort = sort1.join(',') 139 | } 140 | if (!/^\s*$/.test(sort)) { 141 | sort = String(sort).split(','); 142 | f = sort.length > 1 ? '分组' : '分类'; 143 | V = v[sort[0]]; 144 | if (name == '全部分类') v = {}; 145 | login('【更改成功】\n『' + f + '』 ' + name + ': 已' + (V ? '禁用' : '启用')); 146 | sort.map(key => v[key] = V ? 0 : 1); 147 | return set(v); 148 | } 149 | return login('【无法更改】\n原因:没有有效分类(分类名称不正确)') 150 | } -------------------------------------------------------------------------------- /import/base.sortUrl.js: -------------------------------------------------------------------------------- 1 | @js:eval(String(source.loginUrl));b -------------------------------------------------------------------------------- /import/base.sourceComment.txt: -------------------------------------------------------------------------------- 1 | Pixiv 书源订阅(更新📆:2025-02-18) 2 | 3 | 更新后/设置源变量后,要【刷新分类】 4 | 刷新分类,刷新分类,刷新分类 5 | 6 | 7 | 『🅿️丨Pixiv 书源』 8 | https://github.com/windyhusky/PixivSource《⬇️ 导入 Pixiv 等书源 ⬇️》【https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png】◎✍️ windyhusky & DowneyRem   🔗 长期更新◎ 9 | 10 | 一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/pixiv.json《Pixiv 书源》【https://asset.brandfetch.io/idIlKj_n7C/idSsbP7h1m.png】◎🏷️ Pixiv   ✅ 单篇   ✅ 系列   🔗 长期更新◎ 11 | 12 | 一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/linpx.json《Linpx & 兽人小说 书源》【https://furrynovel.ink/apple-touch-icon.png】◎🏷️ Linpx   🏷️ 兽人小说   ✅ 单篇   ✅ 系列   🔗 长期更新◎ 13 | 14 | 一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/btsrk.json《Pixiv & Linpx & 兽人小说 订阅源》【https://www.furrynovel.com/static/icon.png】◎🏷️Pixiv   🏷️ Linpx   🏷️ 兽人小说   🔗 长期更新◎ 15 | 16 | 一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/books.json《书源分享/ books 订阅源》◎🏷️ 订阅源   🔗 长期更新◎ 17 | 18 | 一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json《检查更新 import 订阅源》◎📌 全选-确认-覆盖导入-退出-刷新分类   🔗 长期更新◎ 19 | 20 | 21 | 『🅿️丨Pixiv 其他』 22 | https://github.com/Luoyacheng/yuedu《⬇️ 导入 Pixiv 书源 (APP API) ⬇️》【https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png】◎✍️ 洛娅橙   🏷️ Pixiv 书源  ◎ 23 | 24 | 一键导入https://cdn.jsdelivr.net/gh/Luoyacheng/yuedu@main/%E4%B9%A6%E6%BA%90/pixiv%E5%B0%8F%E8%AF%B4/pixiv.json《Pixiv 书源(APP API)》【https://asset.brandfetch.io/idIlKj_n7C/idSsbP7h1m.png】◎✍️ 洛娅橙   ✅ 单篇   ✅ 系列  ◎ 25 | 26 | 27 | https://akaito.xyz/post/Legado《⬇️ 导入 Pixiv 小说目录规则 ⬇️》【https://akaito.xyz/favicon.ico】◎✍️ 一片痴心俱成灰   🏷️ Pixiv 本地小说目录规则  ◎ 28 | 29 | 一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/pixivToc.json《Pixiv 目录规则》【https://asset.brandfetch.io/idIlKj_n7C/idSsbP7h1m.png】◎✍️ 一片痴心俱成灰   🏷️ 本地小说   🏷️ 目录规则  ◎ 30 | 31 | 32 | https://books.fishhawk.top/forum/66a8e77866bff10c16e51d6a《⬇️ 导入 轻小说机翻机器人 书源 ⬇️》【https://books.fishhawk.top/icon.svg】◎✍️ holzora   🏷️ 轻小说机翻机器人   ◎ 33 | 34 | 一键导入https://static.kksk.io/uuyr/68d13b5fa22c19c5ad2a5d08c0017f90.json《轻小说机翻机器人 书源》【https://books.fishhawk.top/icon.svg】◎✍️ holzora   🏷️ Pixiv 外文小说  ◎ 35 | 36 | 37 | 『🔎丨不世玄奇』 38 | https://github.com/bushixuanqi/book-source《⬇️ 一键导入 不世玄奇 的书源 ⬇️》【https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png】◎✍️ 不世玄奇   🏷️ 通用书源 & 通用订阅   📆 2023-05   🔗 停更◎ 39 | 40 | 一键导入https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/normal.json《通用书源 & 搜索引擎书源》【002/93/87/83】◎ 🏷️ 通用书源   📆 2023-05   🔗 停更◎ 41 | 42 | 一键导入https://bushixuanqi.oss-cn-chengdu.aliyuncs.com/通用发现v5.json【002/93/87/83】《聚合搜索 / 通用订阅》◎🏷️ 通用订阅   📆 2023-04   🔗 停更◎ 43 | 44 | 45 | 『📚丨书源整理』 46 | https://shuyuan.yiove.com《📖丨三千书源》◎✍️ Yiove 书源仓库◎【https://shuyuan.yiove.com/logo.jpeg】 47 | 48 | https://yuedu.miaogongzi.net/gx.html《🏣丨喵公子书源管理》◎✍️ 喵公子◎【003/77/52/16】 49 | 50 | https://legado.aoaostar.com《📕丨阅读 APP 源》◎✍️ aoaostar   📆 标示日期为采集刷新日期◎【https://avatars.githubusercontent.com/u/86001674】 51 | 52 | https://www.yckceo.com/yuedu/shuyuan/index.html《🏚️丨源仓库-阅读书源》◎✍️ 我不是木木◎【002/88/03/61】 53 | 54 | https://flowus.cn/ycheng/share/923f5a35-6dcf-47d1-b8eb-b9c5ef3ed39b《🗞️丨一程书源订阅源阅读合集》◎✍️ 一程   🏷️ 综合   ◎【002/55/79/99】 -------------------------------------------------------------------------------- /import/list.ruleArticles.js: -------------------------------------------------------------------------------- 1 | 2 | try { 3 | $ = JSON.parse(src).text; 4 | if ($ == "no file") $ = []; 5 | } catch (err) { 6 | reg = /^(https?\:\/\/((www|m)\.)?baidu\.com\/?\?wd=\s*)+/i; 7 | 8 | if (baseUrl == source.sourceUrl) { 9 | $ = [{ 10 | name_all: "无法获取分类?可能没有启用", 11 | time: "右上角 - 【登录】启用,再【刷新分类】" 12 | }] 13 | } 14 | 15 | 16 | 17 | //网站整合 18 | else if (baseUrl.match(reg)) { 19 | $ = []; 20 | baseUrl.replace(reg, ''). 21 | split(/\s*•\s*/).map($$ => $.push({ 22 | name_all: $$.match(/.*?《(.*?)》/)[1], 23 | time: $$.match(/◎.*?◎/) ? $$.match(/.*?◎(.*?)◎/)[1] : "", 24 | uri: $$.match(/【.*?】/) ? $$.match(/.*?【(.*?)】/)[1] : "", 25 | url: $$.match(/^([^【《◎]*),?/)[1] 26 | })); 27 | } 28 | 29 | 30 | 31 | //蓝奏云 32 | else { 33 | 34 | //蓝奏云非分组链接 35 | if (String(java.getString('text.举报文件@href')).length) { 36 | $ = [{ 37 | name_all: String(java.getString('class.md@textNodes')), 38 | icon: String(java.getString('class.md@textNodes')).replace(/.*\./, ''), 39 | size: String(java.getString('class.mtt@text')).replace(/\( /, '').replace(/ \)/, ''), 40 | time: String(java.getString('class.mf@textNodes')).replace(/.*\n/, ''), 41 | uri: baseUrl.replace(/^(.+com).*\/(.+)$/, '$2'), 42 | url: baseUrl.replace(/^(.+com).*\/(.+)$/, '$1/tp/$2') 43 | }] 44 | } 45 | 46 | 47 | //取消分享 48 | else if (String(java.getString('.off@text')).match(/取消分享/)) { 49 | $ = [{ 50 | name_all: java.getString('.off@text'), 51 | time: baseUrl.replace(/[#\?].*/g, ''), 52 | url: baseUrl.replace(/[#\?].*/g, '') 53 | }] 54 | } 55 | 56 | 57 | //蓝奏云分组链接 58 | else { 59 | json = []; 60 | name = java.getString('.user-radio@text||title@text') 61 | java.getElements('#folder .mlink').forEach(a => { 62 | java.setContent(a); 63 | json.push({ 64 | name_all: java.getString('.filename@textNodes'), 65 | url: java.getString('a@href'), 66 | time: '🗂️ folder 📑 ' + (String(java.getString('.filesize@text')) || name) 67 | }) 68 | }) 69 | java.setContent(src); 70 | 71 | 72 | mat = baseUrl.match(/^(.*?\.com)[^##]*\/(.+)$/) 73 | url = mat[1] 74 | uri = mat[2] 75 | 76 | function $(reg) { 77 | return uri.match(reg) ? true : false 78 | } 79 | 80 | 81 | //get【pwd】(链接提取码) 82 | pwd = 83 | $(/##[^【]/) ? uri.match(/##(.*?)(【|$)/)[1] : 84 | ""; 85 | 86 | 87 | 88 | head = { 89 | method: "POST", 90 | params: { 91 | uri: uri, 92 | img: $(/【[^】]/) ? uri.match(/【([^】]+)/)[1] : "" 93 | } 94 | } 95 | 96 | 97 | 98 | 99 | //get 【body】 100 | eval(src.match(/var pgs;([\s\S]*?pgs.+;)/)[1]); 101 | eval('$=' + src.match(/data :([\s\S]*?\})/)[1]); 102 | head.body = Object.keys($).map(key => key + "=" + $[key]).join('&'); 103 | 104 | 105 | //补全【url】 106 | url += "/filemoreajax.php," + JSON.stringify(head); 107 | 108 | 109 | 110 | //ajax 111 | $ = JSON.parse(java.ajax(url)); 112 | $ = json.concat($.text != 0 ? $.text : 113 | 114 | //密码错误提示 115 | [{ 116 | name_all: $.info, 117 | time: uri.replace(/[#\?].*/, '') + $.info, 118 | url: baseUrl.replace(/[#\?].*/, '') 119 | }]) 120 | baseUrl = url 121 | } 122 | } 123 | } 124 | java.put('url', baseUrl); 125 | JSON.stringify($); 126 | $.[*] -------------------------------------------------------------------------------- /import/list.ruleDescription.js: -------------------------------------------------------------------------------- 1 | ❗️0、0、开始❗️ 2 | ❗️0、0、结束❗️ 3 | 4 | 5 | 6 | 7 | {{}}@js: 8 | url=String(java.getString('$.url')).trim(); 9 | 10 | 11 | 12 | //【..导入】 13 | if(url.match(/^..导入/)){ 14 | uri=url.replace(/导入.*/,''); 15 | url=url.replace(/.*导入/,''); 16 | path = 17 | (uri=="一键"||uri=="自动")?"auto": 18 | uri=="书源"?"bookSource": 19 | uri=="订阅"?"rssSource": 20 | uri=="净化"?"replaceRule": 21 | url=="目录"?"textTocRule": 22 | url=="TTS"?"httpTTS": 23 | url=="主题"?"theme": 24 | url=="排版"?"readConfig": 25 | ""; 26 | url=url.match(/^legado\:\/\//)?url:`legado://import/${path}?src=`+url; 27 | url = String(url).replace(/^(.*?src=)(.*)/,(mat, $1, $2)=>{ 28 | return $1+encodeURIComponent($2); 29 | }); 30 | 31 | 32 | result=`{{$.name_all}} 33 | 34 |

{{$.name_all}}

35 |
导入失败?多试试几次
36 | 37 |
38 | ↓资源链接,点击复制 39 | 一键导入 40 | 41 | {{$.time}} 42 |
43 | 44 | `} 57 | 58 | 59 | 60 | //【自定义html】 61 | else if(url.match(/\d+、\d+、/)){ 62 | reg=new RegExp('❗️'+url+'开始❗️\\s*([\\s\\S]+?)\\s*❗️'+url+'结束❗️'); 63 | //默认禁止放大缩小 64 | result=result.match(reg)? 65 | ''+result.match(reg)[1]:'
未找到对应html' 66 | } 67 | 68 | else{result=''} -------------------------------------------------------------------------------- /import/list.ruleImage.js: -------------------------------------------------------------------------------- 1 | $.uri@js: 2 | u0 = String(java.get('url')); 3 | u1 = u0.match(/uri":"([^"]+)/); 4 | u2 = u0.match(/img":"([^"]+)/); 5 | uri=String(result)||(u2?u2[1]:u1?u1[1]:""); 6 | function $(reg){ 7 | return uri.match(reg)?true:false 8 | } 9 | 10 | 11 | src = 12 | $(/https?:\/\/|^\d{3}(\/\d\d){3}$/)? uri: 13 | $(/【[^】]/)? baseUrl.match(/【(.*?)(】|$)/)[1]: 14 | 15 | // 默认封面 16 | ""||source.sourceIcon; 17 | 18 | // 补全链接 19 | src.match(/^\d{3}(\/\d\d){3}$/)?`http://avatar.coolapk.com/data/${src}_avatar_middle.jpg`:src -------------------------------------------------------------------------------- /import/list.ruleLink.js: -------------------------------------------------------------------------------- 1 | $.id@js: 2 | url=`{{$.url}}`; 3 | if(result)url+=`/tp/{{$.id}}`; 4 | String(url).trim().replace(/^..导入/,''); -------------------------------------------------------------------------------- /import/list.rulePubDate.js: -------------------------------------------------------------------------------- 1 | 💾 {{$.icon}} 📥 {{$.size}} ⏱️ {{$.time}} 2 | ##💾  📥  ⏱️\s* -------------------------------------------------------------------------------- /import/list.ruleTitle.txt: -------------------------------------------------------------------------------- 1 | $.name_all -------------------------------------------------------------------------------- /linpx/ReadMe.txt: -------------------------------------------------------------------------------- 1 | Linpx 书源(单篇)(更新📆:2024-01-31) 2 | 3 | 可用功能:✅搜索✅发现✅添加网址✅订阅源 4 | 搜索小说:✅单篇❌系列✅作者✅标签✅链接 5 | 发现小说:✅推荐作者✅最近更新 6 | 添加网址:✅Linpx 链接✅Linpx 分享链接 7 | 搜索网址:✅Linpx 链接✅Pixiv 原文链接 8 | 订阅用法:点击订阅源打开小说,点击【添加到书架】按钮添加小说到书架 9 | 温馨提示:⚠️Linpx 搜索暂时不支持系列小说名称,添加系列小说后,无法再次通过搜索获取并更新目录 10 | 11 | 书源发布:兽人阅读频道 https://t.me/FurryReading 12 | 项目地址:https://github.com/windyhusky/PixivSource 13 | 使用教程:https://github.com/windyhusky/PixivSource/blob/main/doc/Linpx.md 14 | 15 | 规则订阅:Import 订阅源 16 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json 17 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/import.json 18 | 19 | ⚙️ 书源设置: 20 | 书源管理 - 编辑书源 - 基本 - 变量说明 - 修改并保存 -------------------------------------------------------------------------------- /linpx/base.bookUrlPattern.txt: -------------------------------------------------------------------------------- 1 | Pixiv:小说 + 系列 + 作者 2 | (https?://)?(www\.)?pixiv\.net(/ajax)?/(novel/(show\.php\?id=|series/)?|users?/)\d+ 3 | 4 | Pixiv:小说 + 系列 5 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/(show\.php\?id=|series/)?\d+ 6 | 7 | Pixiv:小说 8 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/(show\.php\?id=)?\d+ 9 | 10 | Pixiv:系列 11 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/series/\d+ 12 | 13 | Pixiv:作者 14 | (https?://)?(www\.)?pixiv\.net(/ajax)?/users?/\d+ 15 | 16 | Linpx:小说 17 | (https?://)?(api\.|www\.)?(furrynovel\.(ink|xyz))/(pn|pixiv/novel)/\d+(/cache)? 18 | 19 | Linpx:系列 20 | (https?://)?(api\.|www\.)?(furrynovel\.(ink|xyz))/pixiv/series/\d+(/cache)? 21 | 22 | Linpx:作者 23 | (https?://)?(api\.|www\.)?(furrynovel\.(ink|xyz))/pixiv/user/\d+(/cache)? 24 | 25 | 26 | 详情、目录、正文处,网址处理用,无需请求 api 27 | Pixiv:系列 28 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/series/\d+ 29 | 30 | 31 | Pixiv & Linpx:小说 32 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/(pn|(pixiv/)?novel)/(show\.php\?id=)?\d+(/cache)? 33 | ((furrynovel\.(ink|xyz))|pixiv\.net)/(pn|(pixiv/)?novel)/(show\.php\?id=)?\d+ 34 | 35 | 36 | Pixiv & Linpx:系列 37 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/(pixiv|novel)/series/\d+(/cache)? 38 | ((furrynovel\.(ink|xyz))|pixiv\.net)/(pixiv|novel)/series/\d+ 39 | 40 | 41 | Pixiv & Linpx:作者: 42 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?(/pixiv)?/users?/\d+(/cache)? 43 | ((furrynovel\.(ink|xyz))|pixiv\.net)(/pixiv)?/users?/\d+ 44 | 45 | 46 | Pixiv & Linpx:小说 + 系列 47 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/(pn|(pixiv/)?novel)/(show\.php\?id=|series/)?\d+(/cache)? 48 | ((furrynovel\.(ink|xyz))|pixiv\.net)/(pn|(pixiv/)?novel)/(show\.php\?id=|series/)?\d+ 49 | 50 | 51 | Pixiv & Linpx:小说 + 系列 + 作者 52 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/((pn|(pixiv/)?novel)/(show\.php\?id=|series/)?|(pixiv)?/users?/)\d+(/cache)? 53 | ((furrynovel\.(ink|xyz))|pixiv\.net)/((pn|(pixiv/)?novel)/(show\.php\?id=|series/)?|(pixiv)?/users?/)\d+ -------------------------------------------------------------------------------- /linpx/base.header.json: -------------------------------------------------------------------------------- 1 | {"referer": "https://furrynovel.ink/"} 2 | -------------------------------------------------------------------------------- /linpx/base.variableComment.txt: -------------------------------------------------------------------------------- 1 | ⚙️ 自定义书源设置: 2 | ⚙️ 自定义设置:请在基本-变量说明处修改代码 3 | ⚙️ 自定义设置:将 true 改为 false,或相反 4 | ⚠️ 设置源变量【无法】更改书源自定义设置 5 | ⚠️ 注意不要添加或删除尾随逗号"," 6 | 以下内容为书源设置: 7 | { 8 | "CONVERT_CHINESE": true, 9 | "MORE_INFORMATION": false, 10 | "SHOW_ORIGINAL_LINK": true, 11 | 12 | "REPLACE_TITLE_MARKS": true, 13 | "SHOW_CAPTIONS": true, 14 | "SHOW_COMMENTS": true, 15 | 16 | "DEBUG": false 17 | } 18 | 19 | // CONVERT_CHINESE 20 | // 搜索:搜索时进行繁简转换 21 | // MORE_INFORMATION 22 | // 详情:书籍简介显示更多信息 23 | // SHOW_ORIGINAL_LINK 24 | // 目录:显示源链接,但会增加请求次数 25 | 26 | // REPLACE_TITLE_MARKS 27 | // 正文:注音内容为汉字时,替换为书名号 28 | // SHOW_CAPTIONS 29 | // 正文:章首显示小说描述 30 | // SHOW_COMMENTS 31 | // 正文:章尾显示小说评论 32 | 33 | // DEBUG 34 | // 调试模式 35 | 36 | -------------------------------------------------------------------------------- /linpx/catalog.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function urlNovel(novelId) { 14 | if (util.SHOW_ORIGINAL_LINK) { 15 | return urlNovelUrl(novelId) 16 | } else { 17 | return urlNovelDetailed(novelId) 18 | } 19 | } 20 | 21 | function oneShotHandler(res) { 22 | res.textCount = res.content.length 23 | res.updateDate = timeTextFormat(res.createDate) 24 | return [{ 25 | title: res.title.replace(RegExp(/^\s+|\s+$/g), ""), 26 | chapterUrl: urlNovel(res.id), 27 | chapterInfo:`${res.updateDate}  ${res.textCount}字` 28 | }] 29 | } 30 | 31 | function seriesHandler(res) { 32 | res.novels.forEach(v => { 33 | v.title = v.title.replace(RegExp(/^\s+|\s+$/g), "").replace(RegExp(/(|)|-/g), "") 34 | v.chapterUrl = urlNovel(v.id) 35 | // v.updateDate = String(v.coverUrl.match(RegExp("\\d{4}/\\d{2}/\\d{2}"))) //fake 36 | v.detail = getAjaxJson(urlNovelDetailed(v.id)) 37 | try{ 38 | v.textCount = v.detail.content.length 39 | v.updateDate = timeTextFormat(v.detail.createDate) 40 | v.chapterInfo = `${v.updateDate}  ${v.textCount}字` 41 | } catch (e) {} 42 | util.debugFunc(() => { 43 | java.log(`${v.title}`) 44 | }) 45 | }) 46 | return res.novels 47 | } 48 | 49 | (() => { 50 | let res = util.getNovelResSeries(result) 51 | if (res.novels !== undefined) { 52 | return seriesHandler(res) 53 | } else { 54 | return oneShotHandler(res) 55 | } 56 | })() -------------------------------------------------------------------------------- /linpx/content.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function getContent(res) { 14 | let content = res.content 15 | if (util.SHOW_COMMENTS === true && res.desc !== "") { 16 | content = res.desc + "\n" + "——————————\n".repeat(2) + content 17 | } 18 | 19 | // 获取 [uploadedimage:] 的图片链接 20 | // 将存在的 pixiv 图片链接替换为可访问的直连 21 | if (res.images !== undefined && res.images !== null) { 22 | Object.keys(res.images).forEach((key) => { 23 | content = content.replace(`[uploadedimage:${key}]`, ``) 24 | }) 25 | } 26 | 27 | // 获取 [pixivimage:] 的图片链接 [pixivimage:1234] [pixivimage:1234-1] 28 | let matched = content.match(RegExp(/\[pixivimage:(\d+)-?(\d+)]/gm)) 29 | if (matched) { 30 | for (let i in matched) { 31 | let illustId, order 32 | let matched2 = matched[i].match(RegExp("(\\d+)-?(\\d+)")) 33 | let temp = matched2[0].split("-") 34 | illustId = temp[0] 35 | if (temp.length >= 2) { 36 | order = temp[1] 37 | } 38 | content = content.replace(`${matched[i]}`, ``) 39 | } 40 | } 41 | 42 | // 替换 Pixiv 分页标记符号 [newpage] 43 | matched = content.match(RegExp(/[  ]*\[newpage][  ]*/gm)) 44 | if (matched) { 45 | for (let i in matched) { 46 | java.log(matched[i]) 47 | content = content.replace(`${matched[i]}`, `${"

".repeat(3)}`) 48 | } 49 | } 50 | 51 | // 替换 Pixiv 章节标记符号 [chapter:] 52 | matched = content.match(RegExp(/\[chapter:(.*?)]/gm)) 53 | if (matched) { 54 | for (let i in matched) { 55 | let matched2 = matched[i].match(/\[chapter:(.*?)]/m) 56 | let chapter = matched2[1].trim() 57 | content = content.replace(`${matched[i]}`, `${chapter}

`) 58 | } 59 | } 60 | 61 | // 替换 Pixiv 跳转页面标记符号 [[jump:]] 62 | matched = content.match(RegExp(/\[jump:(\d+)]/gm)) 63 | if (matched) { 64 | for (let i in matched) { 65 | let page = matched[i].match(/\d+/) 66 | content = content.replace(`${matched[i]}`, `\n\n跳转至第${page}节`) 67 | } 68 | } 69 | 70 | // 替换 Pixiv 链接标记符号 [[jumpuri: > ]] 71 | matched = content.match(RegExp(/\[\[jumpuri:(.*?)>(.*?)]]/gm)) 72 | if (matched) { 73 | for (let i in matched) { 74 | let matched2 = matched[i].match(/\[\[jumpuri:(.*?)>(.*?)]]/m) 75 | let matchedText = matched2[0] 76 | let urlName = matched2[1].trim() 77 | let urlLink = matched2[2].trim() 78 | // 阅读不支持超链接 79 | // content = content.replace(`${matchedText}`, `${urlName}`) 80 | if (urlLink === urlName) { 81 | content = content.replace(`${matchedText}`, `${urlName}`) 82 | } else { 83 | content = content.replace(`${matchedText}`, `${urlName}: ${urlLink}`) 84 | } 85 | } 86 | } 87 | 88 | // 替换 Pixiv 注音标记符号 [[rb: > ]] 89 | matched = content.match(RegExp(/\[\[rb:(.*?)>(.*?)]]/gm)) 90 | if (matched) { 91 | for (let i in matched) { 92 | let matched2 = matched[i].match(/\[\[rb:(.*?)>(.*?)]]/m) 93 | let matchedText = matched2[0] 94 | let kanji = matched2[1].trim() 95 | let kana = matched2[2].trim() 96 | 97 | if (!util.REPLACE_TITLE_MARKS) { 98 | // 默认替换成(括号) 99 | content = content.replace(`${matchedText}`, `${kanji}(${kana})`) 100 | } else { 101 | let reg = RegExp("[\\u4E00-\\u9FFF]+", "g"); 102 | if (reg.test(kana)) { 103 | // kana为中文,则替换回《书名号》 104 | content = content.replace(`${matchedText}`, `${kanji}《${kana}》`) 105 | } else { 106 | // 阅读不支持 注音 107 | // content = content.replace(`${matchedText}`, `${kanji}${kana}`) 108 | content = content.replace(`${matchedText}`, `${kanji}(${kana})`) 109 | } 110 | } 111 | } 112 | } 113 | return content 114 | } 115 | 116 | (() => { 117 | return getContent(util.getNovelRes(result)) 118 | })() -------------------------------------------------------------------------------- /linpx/detail.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function novelHandler(novel) { 14 | novel = util.formatNovels(util.handNovels([novel]))[0] 15 | novel.detailedUrl = urlNovelUrl(novel.id) 16 | if (novel.seriesId === undefined || novel.seriesId === null) { 17 | novel.catalogUrl = urlNovelDetailed(novel.id) 18 | } else { 19 | novel.catalogUrl = urlSeriesDetailed(novel.seriesId) 20 | } 21 | return novel 22 | } 23 | 24 | (() => { 25 | return novelHandler(util.getNovelRes(result)) 26 | })(); -------------------------------------------------------------------------------- /linpx/discover.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | var seriesSet = new Set(); // 存储seriesID 4 | 5 | function objParse(obj) { 6 | return JSON.parse(obj, (n, v) => { 7 | if (typeof v == "string" && v.match("()")) { 8 | return eval(`(${v})`) 9 | } 10 | return v; 11 | }) 12 | } 13 | 14 | /** 15 | * @params arr 传入的源数组 16 | * @params length 需要获取的元素的个数 17 | */ 18 | function randomChoseArrayItem(arr, length) { 19 | let copyArr = JSON.parse(JSON.stringify(arr)) 20 | let newArr = []; 21 | for (let i = 0; i < length; i++) { 22 | let index = Math.floor(Math.random() * copyArr.length); 23 | let item = copyArr[index]; 24 | newArr.push(item) 25 | copyArr.splice(index, 1) 26 | } 27 | return newArr.reverse() 28 | } 29 | 30 | 31 | function handlerRecommendUsers() { 32 | const MAX_FETCH_USER_NUMBER = 2; 33 | 34 | return () => { 35 | let userIds = JSON.parse(result).map(i => i.id) 36 | // java.log(`用户id个数:${userIds.length}`) 37 | if (userIds.length > MAX_FETCH_USER_NUMBER) { 38 | userIds = randomChoseArrayItem(userIds, MAX_FETCH_USER_NUMBER); 39 | } 40 | // java.log(`查询的用户Ids:${userIds}`) 41 | let usersInfo = getWebviewJson(urlUsersDetailed(userIds)) 42 | // java.log(`返回的${JSON.stringify(usersInfo)}`) 43 | let queryNovelIds = [] 44 | // java.log(`${JSON.stringify(usersInfo)}`) 45 | usersInfo.filter(user => user.novels && user.novels.length > 0) 46 | .map(user => user.novels) 47 | // 将list展平[1,2,3]变为1,2,3 添加到novelList中 48 | .forEach(novels => { 49 | novels.forEach(novel => { 50 | queryNovelIds.push(novel) 51 | }) 52 | }) 53 | // 暂时限制最大获取数量 54 | if (queryNovelIds.length > 10) { 55 | queryNovelIds = randomChoseArrayItem(queryNovelIds, 10) 56 | } 57 | novelList = getWebviewJson(urlNovelsDetailed(queryNovelIds)) 58 | return util.formatNovels(util.handNovels(util.combineNovels(novelList))) 59 | } 60 | } 61 | 62 | function handlerFollowLatest() { 63 | return () => { 64 | let resp = JSON.parse(result) 65 | return util.formatNovels(util.handNovels(util.combineNovels(resp))) 66 | } 67 | } 68 | 69 | function handlerRegexNovels() { 70 | return () => { 71 | let result = java.webView(null, "https://furrynovel.ink", null) 72 | let name = result.match(RegExp('

(.*?)
'))[1] 73 | let resp = getAjaxJson(urlSearchNovel(name)) 74 | if (resp.total !== undefined) { 75 | return util.formatNovels(util.handNovels(util.combineNovels(resp.novels))) 76 | } 77 | return [] 78 | } 79 | } 80 | 81 | function handlerFactory() { 82 | if (baseUrl.includes("https://cdn.jsdelivr.net")) { 83 | return () => {updateSource(); return []} 84 | } 85 | if (baseUrl.includes("/fav/user")) { 86 | return handlerRecommendUsers() 87 | } 88 | if (baseUrl.includes("/pixiv/novels/recent")) { 89 | return handlerFollowLatest() 90 | } 91 | if (baseUrl.includes("https://furrynovel.ink")) { 92 | return handlerRegexNovels() 93 | } 94 | else { 95 | return [] 96 | } 97 | } 98 | 99 | (() => { 100 | return handlerFactory()() 101 | })() -------------------------------------------------------------------------------- /linpx/discover_address.js: -------------------------------------------------------------------------------- 1 | @js: 2 | li = [ 3 | {"💯 推荐": "https://api.furrynovel.ink/fav/user/cache"}, 4 | {"🆕 最新": "https://api.furrynovel.ink/pixiv/novels/recent/cache?page={{page}}"}, 5 | {"🔄 随便": "https://furrynovel.ink"}, 6 | {"🆙 更新": "https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/linpx.json"}, 7 | ] 8 | 9 | // 格式化发现地址 10 | li.forEach(item => { 11 | item.title = Object.keys(item)[0] 12 | item.url = Object.values(item)[0] 13 | delete item[Object.keys(item)[0]] 14 | item.style = {} 15 | item.style.layout_flexGrow = 1 16 | item.style.layout_flexBasisPercent = 0.15 17 | }) 18 | JSON.stringify(li) -------------------------------------------------------------------------------- /linpx/search.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function getUser(username, exactMatch) { 14 | // let resp = getAjaxJson(urlSearchUsers(String(username))) 15 | let resp = java.ajax(urlSearchUsers(String(username))) // 兼容搜索链接 16 | if (resp.startsWith("") || JSON.parse(result).error) { 17 | return [] 18 | } 19 | resp = JSON.parse(resp) 20 | if (resp.users.length === 0) { 21 | return [] 22 | } 23 | if (!exactMatch) { 24 | return resp.users 25 | } 26 | // 只返回用户名完全一样的用户 27 | return resp.users.filter(user => { 28 | return user.name === username 29 | }) 30 | } 31 | 32 | function getUserNovels(nidList) { 33 | let page = Number(java.get("page")) 34 | // 分页 35 | let list = nidList.slice((page - 1) * 20, page * 20) 36 | if (list.length === 0) { 37 | return [] 38 | } 39 | // java.log(`NIDURL:${urlNovelsDetailed(list)}`) 40 | return getWebviewJson(urlNovelsDetailed(list)) 41 | } 42 | 43 | // 存储seriesID 44 | var first = true; 45 | var seriesSet = { 46 | keywords: "Linpx:Search", 47 | has: (value) => { 48 | let page = Number(java.get("page")) 49 | if (page === 1 && first) { 50 | first = false 51 | cache.deleteMemory(this.keywords) 52 | return false 53 | } 54 | 55 | let v = cache.getFromMemory(this.keywords) 56 | if (v === undefined || v === null) { 57 | return false 58 | } 59 | let set = new Set(JSON.parse(v)) 60 | return set.has(value) 61 | }, 62 | 63 | add: (value) => { 64 | let v = cache.getFromMemory(this.keywords) 65 | if (v === undefined || v === null) { 66 | cache.putMemory(this.keywords, JSON.stringify([value])) 67 | 68 | } else { 69 | let arr = JSON.parse(v) 70 | if (typeof arr === "string") { 71 | arr = Array(arr) 72 | } 73 | arr.push(value) 74 | cache.putMemory(this.keywords, JSON.stringify(arr)) 75 | } 76 | }, 77 | }; 78 | 79 | 80 | function findUserNovels() { 81 | let novelList = [] 82 | let username = String(java.get("key")) 83 | let userArr = getUser(username, true) 84 | // 获取用户所有小说 85 | let uidList = userArr.filter(user => { 86 | return user.novels.length > 0 87 | }).map(user => user.id) 88 | 89 | if (uidList.length > 0) { 90 | let list = getWebviewJson(urlUsersDetailed(uidList)) // 包含所有小说数据 91 | // java.log(JSON.stringify(list)) 92 | let nidList = [] 93 | // 从两层数组中提取novelsId 94 | list.forEach(user => { 95 | user.novels 96 | // 按id降序排序-相当于按时间降序排序 97 | .reverse() 98 | .forEach(nid => nidList.push(nid)) 99 | }) 100 | // java.log(JSON.stringify(nidList)) 101 | getUserNovels(nidList).forEach(novel => { 102 | novelList.push(novel) 103 | }) 104 | } 105 | // java.log(JSON.stringify(novelList)) 106 | return novelList 107 | } 108 | 109 | function getNovels() { 110 | if (result.startsWith("") || JSON.parse(result).error) { 111 | return [] 112 | } else { 113 | return JSON.parse(result).novels 114 | } 115 | } 116 | 117 | function search(name, page=1) { 118 | let resp = getAjaxJson(urlSearchNovel(name, page)) 119 | java.log(urlSearchNovel(name, page)) 120 | if (resp.error === undefined && resp.total > 0) { 121 | return resp.novels 122 | } else { 123 | return [] 124 | } 125 | } 126 | 127 | function getConvertNovels() { 128 | let novels = [] 129 | let novelName = String(java.get("key")) 130 | let name1 = String(java.s2t(novelName)) 131 | let name2 = String(java.t2s(novelName)) 132 | if (name1 !== novelName) novels = novels.concat(search(name1)) 133 | if (name2 !== novelName) novels = novels.concat(search(name2)) 134 | return novels 135 | } 136 | 137 | function getLinkNovels() { 138 | return util.getNovelRes(String(java.get("key"))) 139 | } 140 | 141 | (() => { 142 | let novels = [] 143 | novels = novels.concat(getNovels()) 144 | novels = novels.concat(getLinkNovels()) 145 | novels = novels.concat(findUserNovels()) 146 | if (util.CONVERT_CHINESE) novels = novels.concat(getConvertNovels()) 147 | // java.log(JSON.stringify(novels)) 148 | // 返回空列表中止流程 149 | if (novels.length === 0) { 150 | return [] 151 | } 152 | return util.formatNovels(util.handNovels(util.combineNovels(novels))) 153 | })() -------------------------------------------------------------------------------- /linpx/searchUrl.js: -------------------------------------------------------------------------------- 1 | @js: 2 | java.put("key", key) 3 | java.put("page", page) 4 | urlSearchNovel(key, page) -------------------------------------------------------------------------------- /pixiv/ReadMe.txt: -------------------------------------------------------------------------------- 1 | Pixiv 小说(更新📆:2025-05-28) 2 | 3 | 使用说明:阅读版本 3.25.0527 及之后版本可用 4 | 可用功能:✅搜索✅发现✅添加网址✅订阅源 5 | 搜索小说:✅单篇✅系列✅标签✅作者 6 | 发现小说:✅关注✅追更✅推荐✅发现 7 | 发现小说:✅收藏✅书签✅首页✅排行 8 | 添加网址:✅Pixiv小说链接✅Pixiv系列链接 9 | 订阅用法:点击订阅源打开小说/系列小说,【刷新】,点击【加入书架】按钮,添加到书架 10 | 11 | 书源发布:兽人阅读频道 https://t.me/FurryReading 12 | 项目地址:https://github.com/windyhusky/PixivSource 13 | 使用教程:https://github.com/windyhusky/PixivSource/blob/main/doc/Pixiv.md 14 | 15 | 规则订阅:import 订阅源 16 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json 17 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/import.json 18 | 19 | ⚙️ 书源设置: 20 | 书源管理 - 编辑书源 - 基本 - 变量说明 - 修改并保存 21 | 22 | ❤️ 查看他人收藏: 23 | 发现 - 长按"Pixiv" - 编辑 - 右上角菜单 - 设置源变量 24 | 源变量:输入作者ID,一行一个,可添加作者名,保存 25 | 发现 - 长按"Pixiv" - 刷新 - 查看他人收藏 -------------------------------------------------------------------------------- /pixiv/base.bookUrlPattern.txt: -------------------------------------------------------------------------------- 1 | Pixiv:小说 + 系列 + 作者 2 | (https?://)?(www\.)?pixiv\.net(/ajax)?/(novel/(show\.php\?id=|series/)?|users?/)\d+ 3 | 4 | Pixiv:小说 + 系列 5 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/(show\.php\?id=|series/)?\d+ 6 | 7 | Pixiv:小说 8 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/(show\.php\?id=)?\d+ 9 | 10 | Pixiv:系列 11 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/series/\d+ 12 | 13 | Pixiv:作者 14 | (https?://)?(www\.)?pixiv\.net(/ajax)?/users?/\d+ 15 | 16 | Linpx:小说 17 | (https?://)?(api\.|www\.)?(furrynovel\.(ink|xyz))/(pn|pixiv/novel)/\d+(/cache)? 18 | 19 | Linpx:系列 20 | (https?://)?(api\.|www\.)?(furrynovel\.(ink|xyz))/pixiv/series/\d+(/cache)? 21 | 22 | Linpx:作者 23 | (https?://)?(api\.|www\.)?(furrynovel\.(ink|xyz))/pixiv/user/\d+(/cache)? 24 | 25 | 26 | 详情、目录、正文处,网址处理用,无需请求 api 27 | Pixiv:系列 28 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/series/\d+ 29 | 30 | 31 | Pixiv & Linpx:小说 32 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/(pn|(pixiv/)?novel)/(show\.php\?id=)?\d+(/cache)? 33 | ((furrynovel\.(ink|xyz))|pixiv\.net)/(pn|(pixiv/)?novel)/(show\.php\?id=)?\d+ 34 | 35 | 36 | Pixiv & Linpx:系列 37 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/(pixiv|novel)/series/\d+(/cache)? 38 | ((furrynovel\.(ink|xyz))|pixiv\.net)/(pixiv|novel)/series/\d+ 39 | 40 | 41 | Pixiv & Linpx:作者: 42 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?(/pixiv)?/users?/\d+(/cache)? 43 | ((furrynovel\.(ink|xyz))|pixiv\.net)(/pixiv)?/users?/\d+ 44 | 45 | 46 | Pixiv & Linpx:小说 + 系列 47 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/(pn|(pixiv/)?novel)/(show\.php\?id=|series/)?\d+(/cache)? 48 | ((furrynovel\.(ink|xyz))|pixiv\.net)/(pn|(pixiv/)?novel)/(show\.php\?id=|series/)?\d+ 49 | 50 | 51 | Pixiv & Linpx:小说 + 系列 + 作者 52 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/((pn|(pixiv/)?novel)/(show\.php\?id=|series/)?|(pixiv)?/users?/)\d+(/cache)? 53 | ((furrynovel\.(ink|xyz))|pixiv\.net)/((pn|(pixiv/)?novel)/(show\.php\?id=|series/)?|(pixiv)?/users?/)\d+ -------------------------------------------------------------------------------- /pixiv/base.header.json: -------------------------------------------------------------------------------- 1 | {"referer":"https://www.pixiv.net"} 2 | -------------------------------------------------------------------------------- /pixiv/base.loginUI.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "\uD83C\uDD7F️ 登录账号", 4 | "type": "button", 5 | "action": "login()", 6 | "style": { 7 | "layout_flexGrow": 1, 8 | "layout_flexBasisPercent": -1 9 | } 10 | }, 11 | { 12 | "name": "⚙️ 账号设置", 13 | "type": "button", 14 | "action": "startPixivSettings()", 15 | "style": { 16 | "layout_flexGrow": 1, 17 | "layout_flexBasisPercent": -1 18 | } 19 | }, 20 | { 21 | "name": "\uD83D\uDD19 退出账号", 22 | "type": "button", 23 | "action": "logout()", 24 | "style": { 25 | "layout_flexGrow": 1, 26 | "layout_flexBasisPercent": -1 27 | } 28 | }, 29 | { 30 | "name": "🆙 更新书源", 31 | "type": "button", 32 | "action": "updateSource()", 33 | "style": { 34 | "layout_flexGrow": 1, 35 | "layout_flexBasisPercent": -1 36 | } 37 | }, 38 | { 39 | "name": "\uD83D\uDD30 使用指南", 40 | "type": "button", 41 | "action": "startGithubReadme()", 42 | "style": { 43 | "layout_flexGrow": 1, 44 | "layout_flexBasisPercent": -1 45 | } 46 | }, 47 | { 48 | "name": "\uD83D\uDC1E 反馈问题", 49 | "type": "button", 50 | "action": "startGithubIssue()", 51 | "style": { 52 | "layout_flexGrow": 1, 53 | "layout_flexBasisPercent": -1 54 | } 55 | }, 56 | { 57 | "name": "❤️ 公开收藏", 58 | "type": "button", 59 | "action": "novelBookmarkFactory(1)", 60 | "style": { 61 | "layout_flexGrow": 1, 62 | "layout_flexBasisPercent": -1 63 | } 64 | }, 65 | { 66 | "name": "㊙️ 私密收藏", 67 | "type": "button", 68 | "action": "novelBookmarkFactory(2)", 69 | "style": { 70 | "layout_flexGrow": 1, 71 | "layout_flexBasisPercent": -1 72 | } 73 | }, 74 | { 75 | "name": "\uD83D\uDCCC 当前章节", 76 | "type": "button", 77 | "action": "charpterRead()", 78 | "style": { 79 | "layout_flexGrow": 1, 80 | "layout_flexBasisPercent": -1 81 | } 82 | }, 83 | { 84 | "name": "\uD83D\uDCC3 追更系列", 85 | "type": "button", 86 | "action": "seriesWatchFactory()", 87 | "style": { 88 | "layout_flexGrow": 1, 89 | "layout_flexBasisPercent": -1 90 | } 91 | }, 92 | { 93 | "name": "⭐️ 关注作者", 94 | "type": "button", 95 | "action": "userFollowFactory()", 96 | "style": { 97 | "layout_flexGrow": 1, 98 | "layout_flexBasisPercent": -1 99 | } 100 | }, 101 | { 102 | "name": "\uD83D\uDEAB 屏蔽作者", 103 | "type": "button", 104 | "action": "userBlock()", 105 | "style": { 106 | "layout_flexGrow": 1, 107 | "layout_flexBasisPercent": -1 108 | } 109 | }, 110 | { 111 | "name": "发送评论", 112 | "type": "text" 113 | }, 114 | { 115 | "name": "✅ 发送评论", 116 | "type": "button", 117 | "action": "novelCommentAdd()", 118 | "style": { 119 | "layout_flexGrow": 1, 120 | "layout_flexBasisPercent": -1 121 | } 122 | }, 123 | { 124 | "name": "\uD83D\uDDD1 删除评论", 125 | "type": "button", 126 | "action": "novelCommentDelete()", 127 | "style": { 128 | "layout_flexGrow": 1, 129 | "layout_flexBasisPercent": -1 130 | } 131 | }, 132 | { 133 | "name": "⤴️ 分享章节", 134 | "type": "button", 135 | "action": "shareFactory('novel')", 136 | "style": { 137 | "layout_flexGrow": 1, 138 | "layout_flexBasisPercent": -1 139 | } 140 | }, 141 | { 142 | "name": "⤴️ 分享系列", 143 | "type": "button", 144 | "action": "shareFactory('series')", 145 | "style": { 146 | "layout_flexGrow": 1, 147 | "layout_flexBasisPercent": -1 148 | } 149 | }, 150 | { 151 | "name": "\uD83D\uDD0D 搜索说明", 152 | "type": "button", 153 | "action": "readMeSearch()", 154 | "style": { 155 | "layout_flexGrow": 1, 156 | "layout_flexBasisPercent": -1 157 | } 158 | }, 159 | { 160 | "name": "\uD83D\uDCC4 功能说明", 161 | "type": "button", 162 | "action": "readMeLogin()", 163 | "style": { 164 | "layout_flexGrow": 1, 165 | "layout_flexBasisPercent": -1 166 | } 167 | }, 168 | { 169 | "name": "\uD83C\uDC04 繁简通搜", 170 | "type": "button", 171 | "action": "", 172 | "style": { 173 | "layout_flexGrow": 1, 174 | "layout_flexBasisPercent": -1 175 | } 176 | }, 177 | { 178 | "name": "\uD83D\uDCD6 更多简介", 179 | "type": "button", 180 | "action": "", 181 | "style": { 182 | "layout_flexGrow": 1, 183 | "layout_flexBasisPercent": -1 184 | } 185 | }, 186 | { 187 | "name": "\uD83D\uDD17 原始链接", 188 | "type": "button", 189 | "action": "", 190 | "style": { 191 | "layout_flexGrow": 1, 192 | "layout_flexBasisPercent": -1 193 | } 194 | }, 195 | { 196 | "name": "\uD83D\uDCDA 恢复《》", 197 | "type": "button", 198 | "action": "", 199 | "style": { 200 | "layout_flexGrow": 1, 201 | "layout_flexBasisPercent": -1 202 | } 203 | }, 204 | { 205 | "name": "\uD83D\uDDBC️ 显示描述", 206 | "type": "button", 207 | "action": "", 208 | "style": { 209 | "layout_flexGrow": 1, 210 | "layout_flexBasisPercent": -1 211 | } 212 | }, 213 | { 214 | "name": "\uD83D\uDCAC 显示评论", 215 | "type": "button", 216 | "action": "", 217 | "style": { 218 | "layout_flexGrow": 1, 219 | "layout_flexBasisPercent": -1 220 | } 221 | } 222 | ] -------------------------------------------------------------------------------- /pixiv/base.variableComment.txt: -------------------------------------------------------------------------------- 1 | ❤️ 查看他人收藏: 2 | 发现:长按"Pixiv",编辑,右上角菜单,设置源变量 3 | 设置源变量:输入作者ID,一行一个,可添加作者名,保存 4 | 发现:长按"Pixiv",刷新,查看他人收藏 5 | 以下内容为源变量模板: 6 | 12345 作者名 7 | 67890 //作者名 8 | 9 | 10 | ⚙️ 自定义书源设置: 11 | ⚙️ 自定义设置:请在基本-变量说明处修改代码 12 | ⚙️ 自定义设置:将 true 改为 false,或相反 13 | ⚠️ 设置源变量【无法】更改书源自定义设置 14 | ⚠️ 注意不要添加或删除尾随逗号"," 15 | ⚠️ 发现页需要长按"Pixiv",手动刷新 16 | 以下内容为书源设置: 17 | { 18 | "CONVERT_CHINESE": true, 19 | "SHOW_UPDATE_TIME": true, 20 | "MORE_INFORMATION": false, 21 | "SHOW_ORIGINAL_LINK": true, 22 | 23 | "REPLACE_TITLE_MARKS": true, 24 | "SHOW_CAPTIONS": true, 25 | "SHOW_COMMENTS": true, 26 | 27 | "FAST": true, 28 | "DEBUG": false, 29 | 30 | "SHOW_GENERAL_NEW": false, 31 | "SHOW_GENERAL_RANK": false, 32 | "SHOW_R18_GENRE": false, 33 | "SHOW_GENERAL_GENRE": false 34 | } 35 | 36 | // CONVERT_CHINESE 37 | // 搜索:搜索时进行繁简转换,但搜索会变慢 38 | // MORE_INFORMATION 39 | // 详情:书籍简介显示更多信息 40 | 41 | // SHOW_UPDATE_TIME 42 | // 目录:显示更新时间,但会增加少许请求 43 | // SHOW_ORIGINAL_LINK 44 | // 目录:显示原始链接,但会增加大量请求 45 | 46 | // REPLACE_TITLE_MARKS 47 | // 正文:注音内容为汉字时,替换为书名号 48 | // SHOW_CAPTIONS 49 | // 正文:章首显示小说描述 50 | // SHOW_COMMENTS 51 | // 正文:章尾显示小说评论 52 | 53 | // FAST 54 | // 快速模式,禁用繁简统搜,不显示章节来源链接 55 | // DEBUG 56 | // 调试模式 57 | 58 | // SHOW_GENERAL_NEW 59 | // 发现:最新、企划、约稿显示一般小说 60 | // SHOW_GENERAL_RANK 61 | // 发现:排行榜显示一般小说 62 | // SHOW_R18_GENRE 63 | // 发现:热门分类显示R18小说 64 | // SHOW_GENERAL_GENRE 65 | // 发现:热门分类显示一般小说 66 | -------------------------------------------------------------------------------- /pixiv/catalog.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function urlNovel(novelId){ 14 | if (util.SHOW_ORIGINAL_LINK) { 15 | return urlNovelUrl(novelId) 16 | } else { 17 | return urlNovelDetailed(novelId) 18 | } 19 | } 20 | 21 | function oneShotHandler(res) { 22 | res.textCount = res.userNovels[`${res.id}`].textCount 23 | res.createDate = timeTextFormat(res.createDate) 24 | return [{ 25 | title: res.title.replace(RegExp(/^\s+|\s+$/g), ""), 26 | chapterUrl: urlNovel(res.id), 27 | chapterInfo: `${res.createDate}  ${res.textCount}字` 28 | }] 29 | } 30 | 31 | function seriesHandler(res) { 32 | const limit = 30 33 | let returnList = [], novelIds = [] 34 | let seriesID = res.id, allChaptersCount = res.total 35 | util.debugFunc(() => { 36 | java.log(`本系列 ${seriesID} 一共有${allChaptersCount}章`); 37 | }) 38 | 39 | //发送请求获得相应数量的目录列表 40 | function sendAjaxForGetChapters(lastIndex) { 41 | resp = getAjaxJson(urlSeriesNovels(seriesID, limit, lastIndex)) 42 | res = resp.body.thumbnails.novel 43 | // res = resp.body.page.seriesContents 44 | res.forEach(v => { 45 | v.title = v.title.replace(RegExp(/^\s+|\s+$/g), "").replace(RegExp(/(|)|-/g), "") 46 | v.chapterUrl = urlNovel(v.id) 47 | novelIds.push(v.id) 48 | if (v.updateDate !== undefined) { 49 | v.updateDate = timeTextFormat(v.createDate) 50 | v.chapterInfo = `${v.updateDate}  ${v.textCount}字` 51 | } else { 52 | v.updateDate = java.timeFormat(v.uploadTimestamp) 53 | v.chapterInfo = `${v.updateDate}  ${v.textLength}字` 54 | } 55 | util.debugFunc(() => { 56 | java.log(`${v.title}`) 57 | }) 58 | }) 59 | return res; 60 | } 61 | 62 | if (!util.SHOW_UPDATE_TIME) { 63 | returnList = getAjaxJson(urlSeriesNovelsTitles(seriesID)).body 64 | returnList.forEach(v => { 65 | v.title = v.title.replace(RegExp(/^\s+|\s+$/g), "").replace(RegExp(/(|)|-/g), "") 66 | v.chapterUrl = urlNovel(v.id) 67 | novelIds.push(v.id) 68 | }) 69 | } else { 70 | //逻辑控制者 也就是使用上面定义的两个函数来做对应功能 71 | //要爬取的总次数 72 | let max = (allChaptersCount / limit) + 1 73 | for (let i = 0; i < max; i++) { 74 | //java.log("i的值:"+i) 75 | let list = sendAjaxForGetChapters(i * limit); 76 | //取出每个值 77 | returnList = returnList.concat(list) 78 | } 79 | } 80 | // 放入信息以便登陆界面使用 81 | cache.put(`novelIds${seriesID}`, JSON.stringify(novelIds)) 82 | // java.log(JSON.stringify(returnList)) 83 | return returnList 84 | } 85 | 86 | (function (res) { 87 | res = util.getNovelResSeries(result) 88 | if (res.firstNovelId === undefined || res.seriesNavData === null) { 89 | return oneShotHandler(res) 90 | } else { 91 | return seriesHandler(res) 92 | } 93 | })() -------------------------------------------------------------------------------- /pixiv/content.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function getContent(res) { 14 | // 放入信息以便登陆界面使用,第一次加载,刷新时准确 15 | let novel = source.getLoginInfoMap() 16 | if (res.seriesNavData !== null) { 17 | let seriesId = res.seriesNavData.seriesId 18 | if (seriesId !== undefined && seriesId !== null) { 19 | let novelIds = getFromCache(`novelIds${seriesId}`) 20 | novel.id = novelIds[book.durChapterIndex] 21 | novel.title = book.durChapterTitle 22 | } 23 | } 24 | source.putLoginInfo(JSON.stringify(novel)) 25 | // sleepToast(`当前章节:${novel.id}${novel.title}`) 26 | 27 | let content = String(res.content) 28 | // let content = "undefined" 29 | if (content.includes("undefined")) { 30 | return checkContent() 31 | } 32 | 33 | // 在正文内部添加小说描述 34 | if (util.SHOW_CAPTIONS === true && res.description !== "") { 35 | content = res.description + "\n" + "——————————\n".repeat(2) + content 36 | } 37 | 38 | // 获取 [uploadedimage:] 的图片链接 39 | let hasEmbeddedImages = res.textEmbeddedImages !== undefined && res.textEmbeddedImages !== null 40 | if (hasEmbeddedImages) { 41 | Object.keys(res.textEmbeddedImages).forEach((key) => { 42 | content = content.replace(`[uploadedimage:${key}]`, ``) 43 | }) 44 | } 45 | 46 | // 获取 [pixivimage:] 的图片链接 [pixivimage:1234] [pixivimage:1234-1] 47 | let matched = content.match(RegExp(/\[pixivimage:(\d+)-?(\d+)]/gm)) 48 | if (matched) { 49 | matched.forEach(pixivimage => { 50 | let matched2, illustId, order = 0 51 | if (pixivimage.includes("-")) { 52 | matched2 = pixivimage.match(RegExp("(\\d+)-(\\d+)")) 53 | illustId = matched2[1]; order = matched2[2] 54 | } else { 55 | matched2 = pixivimage.match(RegExp("\\d+")) 56 | illustId = matched2[0]; 57 | } 58 | content = content.replace(`${pixivimage}`, ``) 59 | }) 60 | } 61 | 62 | // 替换 Pixiv 分页标记符号 [newpage] 63 | matched = content.match(RegExp(/[  ]*\[newpage][  ]*/gm)) 64 | if (matched) { 65 | for (let i in matched) { 66 | content = content.replace(`${matched[i]}`, `${"

".repeat(3)}`) 67 | } 68 | } 69 | 70 | // 替换 Pixiv 章节标记符号 [chapter:] 71 | matched = content.match(RegExp(/\[chapter:(.*?)]/gm)) 72 | if (matched) { 73 | for (let i in matched) { 74 | let matched2 = matched[i].match(/\[chapter:(.*?)]/m) 75 | let chapter = matched2[1].trim() 76 | content = content.replace(`${matched[i]}`, `${chapter}

`) 77 | } 78 | } 79 | 80 | // 替换 Pixiv 跳转页面标记符号 [[jump:]] 81 | matched = content.match(RegExp(/\[jump:(\d+)]/gm)) 82 | if (matched) { 83 | for (let i in matched) { 84 | let page = matched[i].match(/\d+/) 85 | content = content.replace(`${matched[i]}`, `\n\n跳转至第${page}节`) 86 | } 87 | } 88 | 89 | // 替换 Pixiv 链接标记符号 [[jumpuri: > ]] 90 | matched = content.match(RegExp(/\[\[jumpuri:(.*?)>(.*?)]]/gm)) 91 | if (matched) { 92 | for (let i in matched) { 93 | let matched2 = matched[i].match(/\[\[jumpuri:(.*?)>(.*?)]]/m) 94 | let matchedText = matched2[0] 95 | let urlName = matched2[1].trim() 96 | let urlLink = matched2[2].trim() 97 | // 阅读不支持超链接 98 | //content = content.replace(`${matchedText}`, `${urlName}`) 99 | if (urlLink === urlName) { 100 | content = content.replace(`${matchedText}`, `${urlName}`) 101 | } else { 102 | content = content.replace(`${matchedText}`, `${urlName}: ${urlLink}`) 103 | } 104 | } 105 | } 106 | 107 | // 替换 Pixiv 注音标记符号 [[rb: > ]] 108 | matched = content.match(RegExp(/\[\[rb:(.*?)>(.*?)]]/gm)) 109 | if (matched) { 110 | for (let i in matched) { 111 | let matched2 = matched[i].match(/\[\[rb:(.*?)>(.*?)]]/m) 112 | let matchedText = matched2[0] 113 | let kanji = matched2[1].trim() 114 | let kana = matched2[2].trim() 115 | 116 | if (!util.REPLACE_TITLE_MARKS) { 117 | // 默认替换成(括号) 118 | content = content.replace(`${matchedText}`, `${kanji}(${kana})`) 119 | } else { 120 | let reg = RegExp("[\\u4E00-\\u9FFF]+", "g"); 121 | if (reg.test(kana)) { 122 | // kana为中文,则替换回《书名号》 123 | content = content.replace(`${matchedText}`, `${kanji}《${kana}》`) 124 | } else { 125 | // 阅读不支持 注音 126 | // content = content.replace(`${matchedText}`, `${kanji}${kana}`) 127 | content = content.replace(`${matchedText}`, `${kanji}(${kana})`) 128 | } 129 | } 130 | } 131 | } 132 | 133 | if (util.SHOW_COMMENTS === true) { 134 | return content + getComment(res) 135 | } else { 136 | return content 137 | } 138 | } 139 | 140 | function getComment(res) { 141 | let comments = "" 142 | let resp = getAjaxJson(urlNovelComments(res.id, 0, 50), true) 143 | if (resp.error === true){ 144 | return "" 145 | } 146 | resp.body.comments.forEach(comment =>{ 147 | comments += `${comment.userName}:${comment.comment}(${comment.id})\n` 148 | if (comment.hasReplies === true) { 149 | let resp = getAjaxJson(urlNovelCommentsReply(comment.id, 1), true) 150 | if (resp.error === true) { 151 | return "" 152 | } 153 | resp.body.comments.reverse().forEach(reply =>{ 154 | comments += `${reply.userName}(⤴️${reply.replyToUserName}):${reply.comment}(${reply.id})\n` 155 | }) 156 | } 157 | }) 158 | if (comments) { 159 | comments = "\n" + "——————————\n".repeat(2) + "章节评论:\n" + comments 160 | } 161 | return comments 162 | } 163 | 164 | function checkContent() { 165 | let latestMsg = getAjaxJson(urlMessageThreadLatest(5)) 166 | if (latestMsg.error === true) { 167 | java.log(JSON.stringify(latestMsg)) 168 | } else if (latestMsg.body.total >= 1) { 169 | let msg = latestMsg.body.message_threads.filter(item => item.thread_name === "pixiv事務局")[0] 170 | if (msg === undefined) { 171 | sleepToast(`您于 ${java.timeFormat(new Date().getTime())} 触发 Pixiv 【请求限制】,建议稍候/重新登录再继续`, 3) 172 | // java.startBrowser("https://www.pixiv.net", '退出登录') 173 | // java.startBrowser("https://www.pixiv.net/logout.php",'退出登录') // 不清除 WebView 缓存无法重新登录 174 | 175 | } else if (new Date().getTime()- 1000*msg.modified_at <= 3*24*60*60*1000) { // 3*24h内提醒 176 | sleepToast(`您于 ${java.timeFormat(1000*msg.modified_at)} 触发 Pixiv 【过度访问】,请修改密码并重新登录`, 3) 177 | sleepToast(`${msg.latest_content}`, 5) 178 | java.startBrowser("https://accounts.pixiv.net/password/change",'修改密码') 179 | } 180 | } 181 | } 182 | 183 | (() => { 184 | return getContent(util.getNovelRes(result)) 185 | })() -------------------------------------------------------------------------------- /pixiv/detail.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function novelHandler(novel){ 14 | novel = util.formatNovels(util.handNovels([novel], true))[0] 15 | if (novel.seriesId === undefined || novel.seriesId === null) { 16 | novel.detailedUrl = urlNovelUrl(novel.id) 17 | novel.catalogUrl = urlNovelDetailed(novel.id) 18 | } else { 19 | novel.detailedUrl = urlSeriesUrl(novel.seriesId) 20 | novel.catalogUrl = urlSeriesDetailed(novel.seriesId) 21 | } 22 | source.putLoginInfo(JSON.stringify(novel)) // 放入信息以便登陆界面使用 23 | return novel 24 | } 25 | 26 | (() => { 27 | return novelHandler(util.getNovelRes(result)) 28 | })() -------------------------------------------------------------------------------- /pixiv/discover.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | var seriesSet = new Set(); // 存储seriesID 有BUG无法处理翻页 4 | 5 | function objParse(obj) { 6 | return JSON.parse(obj, (n, v) => { 7 | if (typeof v == "string" && v.match("()")) { 8 | return eval(`(${v})`) 9 | } 10 | return v; 11 | }) 12 | } 13 | 14 | function handlerFactory() { 15 | if (baseUrl.includes("https://cdn.jsdelivr.net")) { 16 | return () => {updateSource(); return []} 17 | } 18 | if (!isLogin()) { 19 | return handlerNoLogin() 20 | } 21 | if (baseUrl.includes("/bookmark")) { 22 | return handlerBookMarks() 23 | } 24 | if (baseUrl.includes("/top")) { 25 | return handlerRecommend() 26 | } 27 | if (baseUrl.includes("/follow_latest")) { 28 | return handlerFollowLatest() 29 | } 30 | if (baseUrl.includes("/watch_list")) { 31 | return handlerWatchList() 32 | } 33 | if (baseUrl.includes("/discovery")) { 34 | return handlerDiscovery() 35 | } 36 | if (baseUrl.includes("/new")) { 37 | return handlerDiscovery() 38 | } 39 | if (baseUrl.includes("/commission/")) { 40 | return handlerFollowLatest() 41 | } 42 | if (baseUrl.includes("/user_event/portal")) { 43 | return handlerFollowLatest() 44 | } 45 | if (baseUrl.includes("/genre")) { 46 | return handlerWatchList() 47 | } 48 | // 正则匹配网址内容 49 | if (baseUrl.includes("/ranking")) { 50 | return handlerRanking() 51 | } 52 | if (baseUrl.includes("/marker_all")) { 53 | return handlerRanking() 54 | } 55 | if (baseUrl.includes("/editors_picks")) { 56 | return handlerRanking() 57 | } 58 | if (baseUrl.includes("https://www.pixiv.net")) { 59 | return handlerRanking() 60 | } 61 | else { 62 | return [] 63 | } 64 | } 65 | 66 | function handlerNoLogin() { 67 | return () => { 68 | sleepToast("此功能需要在书源登录后才能使用") 69 | sleepToast('发现 - 长按"Pixiv" - 登录 - 登录账号') 70 | return [] 71 | } 72 | } 73 | 74 | // 推荐小说 75 | function handlerRecommend() { 76 | return () => { 77 | let res = JSON.parse(result) 78 | const recommend = res.body.page.recommend 79 | const novels = res.body.thumbnails.novel 80 | let nidSet = new Set(recommend.ids) 81 | // java.log(nidSet.size) 82 | let list = novels.filter(novel => nidSet.has(String(novel.id))) 83 | // java.log(`过滤结果:${JSON.stringify(list)}`) 84 | return util.formatNovels(util.handNovels(util.combineNovels(list))) 85 | } 86 | } 87 | 88 | // 收藏小说,他人收藏 89 | function handlerBookMarks() { 90 | return () => { 91 | let res = JSON.parse(result).body.works 92 | if (res === undefined || res.length === 0) { 93 | //流程无法本环节中止 只能交给下一流程处理 94 | return [] 95 | } 96 | return util.formatNovels(util.handNovels(res)) 97 | } 98 | } 99 | 100 | //关注作者,小说委托,小说企划 101 | function handlerFollowLatest() { 102 | return () => { 103 | let res = JSON.parse(result) 104 | return util.formatNovels(util.handNovels(util.combineNovels(res.body.thumbnails.novel))) 105 | } 106 | } 107 | 108 | //推荐小说,最近小说 109 | function handlerDiscovery() { 110 | return () => { 111 | let res = JSON.parse(result) 112 | return util.formatNovels(util.handNovels(util.combineNovels(res.body.novels))) 113 | } 114 | } 115 | 116 | // 追更列表,热门分类 117 | function handlerWatchList() { 118 | return () => { 119 | let res = JSON.parse(result) 120 | return util.formatNovels(util.handNovels(res.body.thumbnails.novelSeries)) 121 | } 122 | } 123 | 124 | // 排行榜,书签,首页,编辑部推荐,顺序相同 125 | function handlerRanking() { 126 | return () => { 127 | let novels = [], novelIds = [], novelUrls = [] 128 | // let result = result + java.ajax(`${baseUrl}&p=2`) // 正则获取网址中的 novelId 129 | let matched = result.match(RegExp(/\/novel\/show\.php\?id=\d{5,}/gm)) 130 | for (let i in matched) { 131 | let novelId = matched[i].match(RegExp(/\d{5,}/))[0] 132 | if (novelIds.indexOf(novelId) === -1) { 133 | novelIds.push(novelId) 134 | novelUrls.push(urlNovelDetailed(novelId)) 135 | // java.log(urlNovelDetailed(novelId)) 136 | } 137 | } 138 | return util.formatNovels(util.handNovels(util.combineNovels(getAjaxAllJson(novelUrls)))) 139 | } 140 | } 141 | 142 | (() => { 143 | return handlerFactory()() 144 | })() -------------------------------------------------------------------------------- /pixiv/searchUrl.js: -------------------------------------------------------------------------------- 1 | @js: 2 | java.put("key", key) 3 | java.put("page", page) 4 | let keyword = key.split(" ") 5 | let limitedTextCount 6 | if (key.includes("字数") || key.includes("字數") ) { 7 | limitedTextCount = keyword.pop() 8 | keyword = keyword.join(" ") 9 | } else { 10 | limitedTextCount = "" 11 | keyword = key 12 | } 13 | java.put("keyword", keyword) 14 | java.put("limitedTextCount", limitedTextCount) 15 | if (keyword.startsWith("@") || keyword.startsWith("@")) { 16 | keyword = keyword.slice(1) 17 | java.log(`搜索作者:${keyword}`) 18 | } 19 | if (keyword.startsWith("#") || keyword.startsWith("#")) { 20 | keyword = keyword.slice(1) 21 | java.log(`搜索标签:${keyword}`) 22 | } 23 | urlSearchSeries(keyword, page) -------------------------------------------------------------------------------- /pixivToc.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "enable": true, 4 | "example": "[newpage]\n[chapter:章节标题]", 5 | "id": 1739548800251, 6 | "name": "Pixiv 标记符号", 7 | "rule": "(\\[newpage\\])|(?<=[\\s ]{0,4})\\[chapter:.{1,30}\\][  ]{0,4}$", 8 | "serialNumber": -1 9 | } 10 | ] -------------------------------------------------------------------------------- /pixiv_backup/ReadMe.txt: -------------------------------------------------------------------------------- 1 | Pixiv 小说(备用)(更新📆:2025-05-28) 2 | 3 | 使用说明:阅读版本 3.23.0503 及之后版本可用 4 | 可用功能:✅搜索✅发现✅添加网址✅订阅源 5 | 搜索小说:✅单篇✅系列✅标签✅作者 6 | 发现小说:✅关注✅追更✅推荐✅发现 7 | 发现小说:✅收藏✅书签✅首页✅排行 8 | 添加网址:✅Pixiv小说链接✅Pixiv系列链接 9 | 订阅用法:点击订阅源打开小说/系列小说,【刷新】,点击【加入书架】按钮,添加到书架 10 | 11 | 书源发布:兽人阅读频道 https://t.me/FurryReading 12 | 项目地址:https://github.com/windyhusky/PixivSource 13 | 使用教程:https://github.com/windyhusky/PixivSource/blob/main/doc/Pixiv.md 14 | 15 | 规则订阅:import 订阅源 16 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json 17 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/import.json 18 | 19 | ⚙️ 书源设置: 20 | 书源管理 - 编辑书源 - 基本 - 变量说明 - 修改并保存 21 | 22 | ❤️ 查看他人收藏: 23 | 发现 - 长按"Pixiv" - 编辑 - 右上角菜单 - 设置源变量 24 | 源变量:输入作者ID,一行一个,可添加作者名,保存 25 | 发现 - 长按"Pixiv" - 刷新 - 查看他人收藏 -------------------------------------------------------------------------------- /pixiv_backup/base.bookUrlPattern.txt: -------------------------------------------------------------------------------- 1 | Pixiv:小说 + 系列 + 作者 2 | (https?://)?(www\.)?pixiv\.net(/ajax)?/(novel/(show\.php\?id=|series/)?|users?/)\d+ 3 | 4 | Pixiv:小说 + 系列 5 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/(show\.php\?id=|series/)?\d+ 6 | 7 | Pixiv:小说 8 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/(show\.php\?id=)?\d+ 9 | 10 | Pixiv:系列 11 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/series/\d+ 12 | 13 | Pixiv:作者 14 | (https?://)?(www\.)?pixiv\.net(/ajax)?/users?/\d+ 15 | 16 | Linpx:小说 17 | (https?://)?(api\.|www\.)?(furrynovel\.(ink|xyz))/(pn|pixiv/novel)/\d+(/cache)? 18 | 19 | Linpx:系列 20 | (https?://)?(api\.|www\.)?(furrynovel\.(ink|xyz))/pixiv/series/\d+(/cache)? 21 | 22 | Linpx:作者 23 | (https?://)?(api\.|www\.)?(furrynovel\.(ink|xyz))/pixiv/user/\d+(/cache)? 24 | 25 | 26 | 详情、目录、正文处,网址处理用,无需请求 api 27 | Pixiv:系列 28 | (https?://)?(www\.)?pixiv\.net(/ajax)?/novel/series/\d+ 29 | 30 | 31 | Pixiv & Linpx:小说 32 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/(pn|(pixiv/)?novel)/(show\.php\?id=)?\d+(/cache)? 33 | ((furrynovel\.(ink|xyz))|pixiv\.net)/(pn|(pixiv/)?novel)/(show\.php\?id=)?\d+ 34 | 35 | 36 | Pixiv & Linpx:系列 37 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/(pixiv|novel)/series/\d+(/cache)? 38 | ((furrynovel\.(ink|xyz))|pixiv\.net)/(pixiv|novel)/series/\d+ 39 | 40 | 41 | Pixiv & Linpx:作者: 42 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?(/pixiv)?/users?/\d+(/cache)? 43 | ((furrynovel\.(ink|xyz))|pixiv\.net)(/pixiv)?/users?/\d+ 44 | 45 | 46 | Pixiv & Linpx:小说 + 系列 47 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/(pn|(pixiv/)?novel)/(show\.php\?id=|series/)?\d+(/cache)? 48 | ((furrynovel\.(ink|xyz))|pixiv\.net)/(pn|(pixiv/)?novel)/(show\.php\?id=|series/)?\d+ 49 | 50 | 51 | Pixiv & Linpx:小说 + 系列 + 作者 52 | (https?://)?(api\.|www\.)?((furrynovel\.(ink|xyz))|pixiv\.net)(/ajax)?/((pn|(pixiv/)?novel)/(show\.php\?id=|series/)?|(pixiv)?/users?/)\d+(/cache)? 53 | ((furrynovel\.(ink|xyz))|pixiv\.net)/((pn|(pixiv/)?novel)/(show\.php\?id=|series/)?|(pixiv)?/users?/)\d+ -------------------------------------------------------------------------------- /pixiv_backup/base.header.json: -------------------------------------------------------------------------------- 1 | {"referer":"https://www.pixiv.net"} 2 | -------------------------------------------------------------------------------- /pixiv_backup/base.variableComment.txt: -------------------------------------------------------------------------------- 1 | ❤️ 查看他人收藏: 2 | 发现:长按"Pixiv",编辑,右上角菜单,设置源变量 3 | 设置源变量:输入作者ID,一行一个,可添加作者名,保存 4 | 发现:长按"Pixiv",刷新,查看他人收藏 5 | 以下内容为源变量模板: 6 | 12345 作者名 7 | 67890 //作者名 8 | 9 | 10 | ⚙️ 自定义书源设置: 11 | ⚙️ 自定义设置:请在基本-变量说明处修改代码 12 | ⚙️ 自定义设置:将 true 改为 false,或相反 13 | ⚠️ 设置源变量【无法】更改书源自定义设置 14 | ⚠️ 注意不要添加或删除尾随逗号"," 15 | ⚠️ 发现页需要长按"Pixiv",手动刷新 16 | 以下内容为书源设置: 17 | { 18 | "CONVERT_CHINESE": true, 19 | "SHOW_UPDATE_TIME": true, 20 | "MORE_INFORMATION": false, 21 | "SHOW_ORIGINAL_LINK": true, 22 | 23 | "REPLACE_TITLE_MARKS": true, 24 | "SHOW_CAPTIONS": true, 25 | "SHOW_COMMENTS": true, 26 | 27 | "FAST": true, 28 | "DEBUG": false, 29 | 30 | "SHOW_GENERAL_NEW": false, 31 | "SHOW_GENERAL_RANK": false, 32 | "SHOW_R18_GENRE": false, 33 | "SHOW_GENERAL_GENRE": false 34 | } 35 | 36 | // CONVERT_CHINESE 37 | // 搜索:搜索时进行繁简转换,但搜索会变慢 38 | // MORE_INFORMATION 39 | // 详情:书籍简介显示更多信息 40 | 41 | // SHOW_UPDATE_TIME 42 | // 目录:显示更新时间,但会增加少许请求 43 | // SHOW_ORIGINAL_LINK 44 | // 目录:显示原始链接,但会增加大量请求 45 | 46 | // REPLACE_TITLE_MARKS 47 | // 正文:注音内容为汉字时,替换为书名号 48 | // SHOW_CAPTIONS 49 | // 正文:章首显示小说描述 50 | // SHOW_COMMENTS 51 | // 正文:章尾显示小说评论 52 | 53 | // FAST 54 | // 快速模式,禁用繁简统搜,不显示章节来源链接 55 | // DEBUG 56 | // 调试模式 57 | 58 | // SHOW_GENERAL_NEW 59 | // 发现:最新、企划、约稿显示一般小说 60 | // SHOW_GENERAL_RANK 61 | // 发现:排行榜显示一般小说 62 | // SHOW_R18_GENRE 63 | // 发现:热门分类显示R18小说 64 | // SHOW_GENERAL_GENRE 65 | // 发现:热门分类显示一般小说 66 | -------------------------------------------------------------------------------- /pixiv_backup/catalog.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function urlNovel(novelId){ 14 | if (util.SHOW_ORIGINAL_LINK) { 15 | return urlNovelUrl(novelId) 16 | } else { 17 | return urlNovelDetailed(novelId) 18 | } 19 | } 20 | 21 | function oneShotHandler(res) { 22 | res.textCount = res.userNovels[`${res.id}`].textCount 23 | res.createDate = timeTextFormat(res.createDate) 24 | return [{ 25 | title: res.title.replace(RegExp(/^\s+|\s+$/g), ""), 26 | chapterUrl: urlNovel(res.id), 27 | chapterInfo: `${res.createDate}  ${res.textCount}字` 28 | }] 29 | } 30 | 31 | function seriesHandler(res) { 32 | const limit = 30 33 | let returnList = [], novelIds = [] 34 | let seriesID = res.id, allChaptersCount = res.total 35 | util.debugFunc(() => { 36 | java.log(`本系列 ${seriesID} 一共有${allChaptersCount}章`); 37 | }) 38 | 39 | //发送请求获得相应数量的目录列表 40 | function sendAjaxForGetChapters(lastIndex) { 41 | resp = getAjaxJson(urlSeriesNovels(seriesID, limit, lastIndex)) 42 | res = resp.body.thumbnails.novel 43 | // res = resp.body.page.seriesContents 44 | res.forEach(v => { 45 | v.title = v.title.replace(RegExp(/^\s+|\s+$/g), "").replace(RegExp(/(|)|-/g), "") 46 | v.chapterUrl = urlNovel(v.id) 47 | novelIds.push(v.id) 48 | if (v.updateDate !== undefined) { 49 | v.updateDate = timeTextFormat(v.createDate) 50 | v.chapterInfo = `${v.updateDate}  ${v.textCount}字` 51 | } else { 52 | v.updateDate = java.timeFormat(v.uploadTimestamp) 53 | v.chapterInfo = `${v.updateDate}  ${v.textLength}字` 54 | } 55 | util.debugFunc(() => { 56 | java.log(`${v.title}`) 57 | }) 58 | }) 59 | return res; 60 | } 61 | 62 | if (!util.SHOW_UPDATE_TIME) { 63 | returnList = getAjaxJson(urlSeriesNovelsTitles(seriesID)).body 64 | returnList.forEach(v => { 65 | v.title = v.title.replace(RegExp(/^\s+|\s+$/g), "").replace(RegExp(/(|)|-/g), "") 66 | v.chapterUrl = urlNovel(v.id) 67 | novelIds.push(v.id) 68 | }) 69 | } else { 70 | //逻辑控制者 也就是使用上面定义的两个函数来做对应功能 71 | //要爬取的总次数 72 | let max = (allChaptersCount / limit) + 1 73 | for (let i = 0; i < max; i++) { 74 | //java.log("i的值:"+i) 75 | let list = sendAjaxForGetChapters(i * limit); 76 | //取出每个值 77 | returnList = returnList.concat(list) 78 | } 79 | } 80 | // 放入信息以便登陆界面使用 81 | cache.put(`novelIds${seriesID}`, JSON.stringify(novelIds)) 82 | // java.log(JSON.stringify(returnList)) 83 | return returnList 84 | } 85 | 86 | (function (res) { 87 | res = util.getNovelResSeries(result) 88 | if (res.firstNovelId === undefined || res.seriesNavData === null) { 89 | return oneShotHandler(res) 90 | } else { 91 | return seriesHandler(res) 92 | } 93 | })() -------------------------------------------------------------------------------- /pixiv_backup/content.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function getContent(res) { 14 | // 放入信息以便登陆界面使用,第一次加载,刷新时准确 15 | let novel = source.getLoginInfoMap() 16 | if (res.seriesNavData !== null) { 17 | let seriesId = res.seriesNavData.seriesId 18 | if (seriesId !== undefined && seriesId !== null) { 19 | let novelIds = getFromCache(`novelIds${seriesId}`) 20 | novel.id = novelIds[book.durChapterIndex] 21 | novel.title = book.durChapterTitle 22 | } 23 | } 24 | source.putLoginInfo(JSON.stringify(novel)) 25 | // sleepToast(`当前章节:${novel.id}${novel.title}`) 26 | 27 | let content = String(res.content) 28 | // let content = "undefined" 29 | if (content.includes("undefined")) { 30 | return checkContent() 31 | } 32 | 33 | // 在正文内部添加小说描述 34 | if (util.SHOW_CAPTIONS === true && res.description !== "") { 35 | content = res.description + "\n" + "——————————\n".repeat(2) + content 36 | } 37 | 38 | // 获取 [uploadedimage:] 的图片链接 39 | let hasEmbeddedImages = res.textEmbeddedImages !== undefined && res.textEmbeddedImages !== null 40 | if (hasEmbeddedImages) { 41 | Object.keys(res.textEmbeddedImages).forEach((key) => { 42 | content = content.replace(`[uploadedimage:${key}]`, ``) 43 | }) 44 | } 45 | 46 | // 获取 [pixivimage:] 的图片链接 [pixivimage:1234] [pixivimage:1234-1] 47 | let matched = content.match(RegExp(/\[pixivimage:(\d+)-?(\d+)]/gm)) 48 | if (matched) { 49 | matched.forEach(pixivimage => { 50 | let matched2, illustId, order = 0 51 | if (pixivimage.includes("-")) { 52 | matched2 = pixivimage.match(RegExp("(\\d+)-(\\d+)")) 53 | illustId = matched2[1]; order = matched2[2] 54 | } else { 55 | matched2 = pixivimage.match(RegExp("\\d+")) 56 | illustId = matched2[0]; 57 | } 58 | content = content.replace(`${pixivimage}`, ``) 59 | }) 60 | } 61 | 62 | // 替换 Pixiv 分页标记符号 [newpage] 63 | matched = content.match(RegExp(/[  ]*\[newpage][  ]*/gm)) 64 | if (matched) { 65 | for (let i in matched) { 66 | content = content.replace(`${matched[i]}`, `${"

".repeat(3)}`) 67 | } 68 | } 69 | 70 | // 替换 Pixiv 章节标记符号 [chapter:] 71 | matched = content.match(RegExp(/\[chapter:(.*?)]/gm)) 72 | if (matched) { 73 | for (let i in matched) { 74 | let matched2 = matched[i].match(/\[chapter:(.*?)]/m) 75 | let chapter = matched2[1].trim() 76 | content = content.replace(`${matched[i]}`, `${chapter}

`) 77 | } 78 | } 79 | 80 | // 替换 Pixiv 跳转页面标记符号 [[jump:]] 81 | matched = content.match(RegExp(/\[jump:(\d+)]/gm)) 82 | if (matched) { 83 | for (let i in matched) { 84 | let page = matched[i].match(/\d+/) 85 | content = content.replace(`${matched[i]}`, `\n\n跳转至第${page}节`) 86 | } 87 | } 88 | 89 | // 替换 Pixiv 链接标记符号 [[jumpuri: > ]] 90 | matched = content.match(RegExp(/\[\[jumpuri:(.*?)>(.*?)]]/gm)) 91 | if (matched) { 92 | for (let i in matched) { 93 | let matched2 = matched[i].match(/\[\[jumpuri:(.*?)>(.*?)]]/m) 94 | let matchedText = matched2[0] 95 | let urlName = matched2[1].trim() 96 | let urlLink = matched2[2].trim() 97 | // 阅读不支持超链接 98 | //content = content.replace(`${matchedText}`, `${urlName}`) 99 | if (urlLink === urlName) { 100 | content = content.replace(`${matchedText}`, `${urlName}`) 101 | } else { 102 | content = content.replace(`${matchedText}`, `${urlName}: ${urlLink}`) 103 | } 104 | } 105 | } 106 | 107 | // 替换 Pixiv 注音标记符号 [[rb: > ]] 108 | matched = content.match(RegExp(/\[\[rb:(.*?)>(.*?)]]/gm)) 109 | if (matched) { 110 | for (let i in matched) { 111 | let matched2 = matched[i].match(/\[\[rb:(.*?)>(.*?)]]/m) 112 | let matchedText = matched2[0] 113 | let kanji = matched2[1].trim() 114 | let kana = matched2[2].trim() 115 | 116 | if (!util.REPLACE_TITLE_MARKS) { 117 | // 默认替换成(括号) 118 | content = content.replace(`${matchedText}`, `${kanji}(${kana})`) 119 | } else { 120 | let reg = RegExp("[\\u4E00-\\u9FFF]+", "g"); 121 | if (reg.test(kana)) { 122 | // kana为中文,则替换回《书名号》 123 | content = content.replace(`${matchedText}`, `${kanji}《${kana}》`) 124 | } else { 125 | // 阅读不支持 注音 126 | // content = content.replace(`${matchedText}`, `${kanji}${kana}`) 127 | content = content.replace(`${matchedText}`, `${kanji}(${kana})`) 128 | } 129 | } 130 | } 131 | } 132 | 133 | if (util.SHOW_COMMENTS === true) { 134 | return content + getComment(res) 135 | } else { 136 | return content 137 | } 138 | } 139 | 140 | function getComment(res) { 141 | let comments = "" 142 | let resp = getAjaxJson(urlNovelComments(res.id, 0, 50), true) 143 | if (resp.error === true){ 144 | return "" 145 | } 146 | resp.body.comments.forEach(comment =>{ 147 | comments += `${comment.userName}:${comment.comment}(${comment.id})\n` 148 | if (comment.hasReplies === true) { 149 | let resp = getAjaxJson(urlNovelCommentsReply(comment.id, 1), true) 150 | if (resp.error === true) { 151 | return "" 152 | } 153 | resp.body.comments.reverse().forEach(reply =>{ 154 | comments += `${reply.userName}(⤴️${reply.replyToUserName}):${reply.comment}(${reply.id})\n` 155 | }) 156 | } 157 | }) 158 | if (comments) { 159 | comments = "\n" + "——————————\n".repeat(2) + "章节评论:\n" + comments 160 | } 161 | return comments 162 | } 163 | 164 | function checkContent() { 165 | let latestMsg = getAjaxJson(urlMessageThreadLatest(5)) 166 | if (latestMsg.error === true) { 167 | java.log(JSON.stringify(latestMsg)) 168 | } else if (latestMsg.body.total >= 1) { 169 | let msg = latestMsg.body.message_threads.filter(item => item.thread_name === "pixiv事務局")[0] 170 | if (msg === undefined) { 171 | sleepToast(`您于 ${java.timeFormat(new Date().getTime())} 触发 Pixiv 【请求限制】,建议稍候/重新登录再继续`, 3) 172 | // java.startBrowser("https://www.pixiv.net", '退出登录') 173 | // java.startBrowser("https://www.pixiv.net/logout.php",'退出登录') // 不清除 WebView 缓存无法重新登录 174 | 175 | } else if (new Date().getTime()- 1000*msg.modified_at <= 3*24*60*60*1000) { // 3*24h内提醒 176 | sleepToast(`您于 ${java.timeFormat(1000*msg.modified_at)} 触发 Pixiv 【过度访问】,请修改密码并重新登录`, 3) 177 | sleepToast(`${msg.latest_content}`, 5) 178 | java.startBrowser("https://accounts.pixiv.net/password/change",'修改密码') 179 | } 180 | } 181 | } 182 | 183 | (() => { 184 | return getContent(util.getNovelRes(result)) 185 | })() -------------------------------------------------------------------------------- /pixiv_backup/detail.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function novelHandler(novel){ 14 | novel = util.formatNovels(util.handNovels([novel], true))[0] 15 | if (novel.seriesId === undefined || novel.seriesId === null) { 16 | novel.detailedUrl = urlNovelUrl(novel.id) 17 | novel.catalogUrl = urlNovelDetailed(novel.id) 18 | } else { 19 | novel.detailedUrl = urlSeriesUrl(novel.seriesId) 20 | novel.catalogUrl = urlSeriesDetailed(novel.seriesId) 21 | } 22 | source.putLoginInfo(JSON.stringify(novel)) // 放入信息以便登陆界面使用 23 | return novel 24 | } 25 | 26 | (() => { 27 | return novelHandler(util.getNovelRes(result)) 28 | })() -------------------------------------------------------------------------------- /pixiv_backup/discover.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | var seriesSet = new Set(); // 存储seriesID 有BUG无法处理翻页 4 | 5 | function objParse(obj) { 6 | return JSON.parse(obj, (n, v) => { 7 | if (typeof v == "string" && v.match("()")) { 8 | return eval(`(${v})`) 9 | } 10 | return v; 11 | }) 12 | } 13 | 14 | function handlerFactory() { 15 | if (baseUrl.includes("https://cdn.jsdelivr.net")) { 16 | return () => {updateSource(); return []} 17 | } 18 | if (!isLogin()) { 19 | return handlerNoLogin() 20 | } 21 | if (baseUrl.includes("/bookmark")) { 22 | return handlerBookMarks() 23 | } 24 | if (baseUrl.includes("/top")) { 25 | return handlerRecommend() 26 | } 27 | if (baseUrl.includes("/follow_latest")) { 28 | return handlerFollowLatest() 29 | } 30 | if (baseUrl.includes("/watch_list")) { 31 | return handlerWatchList() 32 | } 33 | if (baseUrl.includes("/discovery")) { 34 | return handlerDiscovery() 35 | } 36 | if (baseUrl.includes("/new")) { 37 | return handlerDiscovery() 38 | } 39 | if (baseUrl.includes("/commission/")) { 40 | return handlerFollowLatest() 41 | } 42 | if (baseUrl.includes("/user_event/portal")) { 43 | return handlerFollowLatest() 44 | } 45 | if (baseUrl.includes("/genre")) { 46 | return handlerWatchList() 47 | } 48 | // 正则匹配网址内容 49 | if (baseUrl.includes("/ranking")) { 50 | return handlerRanking() 51 | } 52 | if (baseUrl.includes("/marker_all")) { 53 | return handlerRanking() 54 | } 55 | if (baseUrl.includes("/editors_picks")) { 56 | return handlerRanking() 57 | } 58 | if (baseUrl.includes("https://www.pixiv.net")) { 59 | return handlerRanking() 60 | } 61 | else { 62 | return [] 63 | } 64 | } 65 | 66 | function handlerNoLogin() { 67 | return () => { 68 | sleepToast("此功能需要在书源登录后才能使用") 69 | sleepToast('发现 - 长按"Pixiv" - 登录 - 登录账号') 70 | sleepToast('订阅源处退出账号后,需要清除 Webview 数据,才能重新登录') 71 | sleepToast('我的 - 其他设置 - 清除 Webview 数据 - 确定 - 重新登录') 72 | return [] 73 | } 74 | } 75 | 76 | // 推荐小说 77 | function handlerRecommend() { 78 | return () => { 79 | let res = JSON.parse(result) 80 | const recommend = res.body.page.recommend 81 | const novels = res.body.thumbnails.novel 82 | let nidSet = new Set(recommend.ids) 83 | // java.log(nidSet.size) 84 | let list = novels.filter(novel => nidSet.has(String(novel.id))) 85 | // java.log(`过滤结果:${JSON.stringify(list)}`) 86 | return util.formatNovels(util.handNovels(util.combineNovels(list))) 87 | } 88 | } 89 | 90 | // 收藏小说,他人收藏 91 | function handlerBookMarks() { 92 | return () => { 93 | let res = JSON.parse(result).body.works 94 | if (res === undefined || res.length === 0) { 95 | //流程无法本环节中止 只能交给下一流程处理 96 | return [] 97 | } 98 | return util.formatNovels(util.handNovels(res)) 99 | } 100 | } 101 | 102 | //关注作者,小说委托,小说企划 103 | function handlerFollowLatest() { 104 | return () => { 105 | let res = JSON.parse(result) 106 | return util.formatNovels(util.handNovels(util.combineNovels(res.body.thumbnails.novel))) 107 | } 108 | } 109 | 110 | //推荐小说,最近小说 111 | function handlerDiscovery() { 112 | return () => { 113 | let res = JSON.parse(result) 114 | return util.formatNovels(util.handNovels(util.combineNovels(res.body.novels))) 115 | } 116 | } 117 | 118 | // 追更列表,热门分类 119 | function handlerWatchList() { 120 | return () => { 121 | let res = JSON.parse(result) 122 | return util.formatNovels(util.handNovels(res.body.thumbnails.novelSeries)) 123 | } 124 | } 125 | 126 | // 排行榜,书签,首页,编辑部推荐,顺序相同 127 | function handlerRanking() { 128 | return () => { 129 | let novels = [], novelIds = [], novelUrls = [] 130 | // let result = result + java.ajax(`${baseUrl}&p=2`) // 正则获取网址中的 novelId 131 | let matched = result.match(RegExp(/\/novel\/show\.php\?id=\d{5,}/gm)) 132 | for (let i in matched) { 133 | let novelId = matched[i].match(RegExp(/\d{5,}/))[0] 134 | if (novelIds.indexOf(novelId) === -1) { 135 | novelIds.push(novelId) 136 | novelUrls.push(urlNovelDetailed(novelId)) 137 | // java.log(urlNovelDetailed(novelId)) 138 | } 139 | } 140 | return util.formatNovels(util.handNovels(util.combineNovels(getAjaxAllJson(novelUrls)))) 141 | } 142 | } 143 | 144 | (() => { 145 | return handlerFactory()() 146 | })() -------------------------------------------------------------------------------- /pixiv_backup/searchUrl.js: -------------------------------------------------------------------------------- 1 | @js: 2 | java.put("key", key) 3 | java.put("page", page) 4 | let keyword = key.split(" ") 5 | let limitedTextCount 6 | if (key.includes("字数") || key.includes("字數") ) { 7 | limitedTextCount = keyword.pop() 8 | keyword = keyword.join(" ") 9 | } else { 10 | limitedTextCount = "" 11 | keyword = key 12 | } 13 | java.put("keyword", keyword) 14 | java.put("limitedTextCount", limitedTextCount) 15 | if (keyword.startsWith("@") || keyword.startsWith("@")) { 16 | keyword = keyword.slice(1) 17 | java.log(`搜索作者:${keyword}`) 18 | } 19 | if (keyword.startsWith("#") || keyword.startsWith("#")) { 20 | keyword = keyword.slice(1) 21 | java.log(`搜索标签:${keyword}`) 22 | } 23 | urlSearchSeries(keyword, page) -------------------------------------------------------------------------------- /pixiv_illust/ReadMe.txt: -------------------------------------------------------------------------------- 1 | Pixiv 漫画(更新📆:2025-03-22) 2 | 3 | 可用功能:✅搜索✅发现✅添加网址✅订阅源 4 | 搜索插画:✅漫画☑️插画❌动图✅标签❌作者 5 | 发现漫画:✅关注✅追更✅推荐✅发现✅收藏 6 | 添加网址:✅Pixiv插画链接✅Pixiv漫画目录 7 | 订阅用法:点击订阅源打开插画/漫画目录,【刷新】,点击【加入书架】按钮,添加到书架 8 | 9 | 书源发布:兽人阅读频道 https://t.me/FurryReading 10 | 项目地址:https://github.com/windyhusky/PixivSource 11 | 使用教程:https://github.com/windyhusky/PixivSource/blob/main/doc/Pixiv.md 12 | 13 | 规则订阅:import 订阅源 14 | https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/import.json 15 | https://raw.githubusercontent.com/windyhusky/PixivSource/main/import.json 16 | 17 | ⚙️ 书源设置: 18 | 书源管理 - 编辑书源 - 基本 - 变量说明 - 修改并保存 -------------------------------------------------------------------------------- /pixiv_illust/base.bookUrlPattern.txt: -------------------------------------------------------------------------------- 1 | Pixiv:插画 + 漫画 2 | (https?://)?(www\.)?pixiv\.net/((artworks|user/\d+/series)|ajax/(illust|series))/\d+ 3 | 4 | Pixiv:插画 5 | (https?://)?(www\.)?pixiv\.net/(artworks|ajax/illust)/\d+ 6 | 7 | Pixiv 漫画 8 | (https?://)?(www\.)?pixiv\.net/(user/\d+|ajax)/series/\d+ 9 | 10 | Pixiv:作者 11 | (https?://)?(www\.)?pixiv\.net(/ajax)?/users?/\d+ 12 | 13 | -------------------------------------------------------------------------------- /pixiv_illust/base.header.json: -------------------------------------------------------------------------------- 1 | {"referer":"https://www.pixiv.net"} 2 | -------------------------------------------------------------------------------- /pixiv_illust/base.loginCheckJS.js: -------------------------------------------------------------------------------- 1 | var util = {} 2 | 3 | function objStringify(obj) { 4 | return JSON.stringify(obj, (n, v) => { 5 | if (typeof v == "function") 6 | return v.toString(); 7 | return v; 8 | }); 9 | } 10 | 11 | function publicFunc() { 12 | let u = {}, settings = {} 13 | java.log(String(source.bookSourceComment).split("\n")[0]) // 输出书源信息 14 | java.log(`本地书源更新时间:${java.timeFormat(source.lastUpdateTime)}`) // 输出书源信息 15 | settings = JSON.parse(String(source.variableComment).match(RegExp(/{([\s\S]*?)}/gm))) 16 | if (settings !== null) { 17 | java.log("⚙️ 使用自定义设置") 18 | } else { 19 | settings = {} 20 | settings.CONVERT_CHINESE = true // 搜索:搜索时进行繁简转换 21 | settings.SEARCH_ILLUSTS = false // 搜索插画 22 | settings.SHOW_ORIGINAL_LINK = true // 目录处显示源链接,但会增加请求次数 23 | settings.DEBUG = false // 调试模式 24 | java.log("⚙️ 使用默认设置(无自定义设置 或 自定义设置有误)") 25 | } 26 | u.CONVERT_CHINESE = settings.CONVERT_CHINESE 27 | u.SEARCH_ILLUSTS = settings.SEARCH_ILLUSTS 28 | u.SHOW_ORIGINAL_LINK = settings.SHOW_ORIGINAL_LINK 29 | u.DEBUG = settings.DEBUG 30 | 31 | if (u.DEBUG === true) { 32 | java.log(JSON.stringify(settings, null, 4)) 33 | java.log(`DEBUG = ${u.DEBUG}`) 34 | } 35 | u.debugFunc = (func) => { 36 | if (util.DEBUG) { 37 | func() 38 | } 39 | } 40 | 41 | u.handIllusts = function (illusts) { 42 | illusts.forEach(illust => { 43 | // illust.id = illust.id 44 | // illust.title = illust.title 45 | // illust.userName = illust.userName 46 | // illust.tags = illust.tags 47 | if (!(illust.tags instanceof Array)) { 48 | illust.tags = illust.tags.tags.map(item => item.tag) 49 | illust.coverUrl = illust.url = illust.urls.regular // 兼容正文搜索 50 | illust.updateDate = illust.uploadDate 51 | } 52 | illust.textCount = null 53 | // illust.pageCount = illust.pageCount 54 | // illust.description = illust.description 55 | illust.coverUrl = illust.url 56 | illust.detailedUrl = urlIllustDetailed(illust.id) 57 | // illust.createDate = illust.createDate 58 | // illust.updateDate = illust.updateDate 59 | // illust.aiType = illust.aiType 60 | 61 | if (illust.seriesNavData === undefined || illust.seriesNavData === null) { 62 | illust.latestChapter = illust.title 63 | } else { 64 | illust.seriesId = illust.seriesNavData.seriesId 65 | illust.title = illust.seriesNavData.title 66 | } 67 | 68 | if (illust.seriesId !== undefined) { 69 | let resp = getAjaxJson(urlSeriesDetailed(illust.seriesId)).body 70 | let series = resp.illustSeries.filter(item => item.id === illust.seriesId)[0] 71 | // illust.title = illust.title 72 | illust.tags = illust.tags.concat(series.tags) 73 | illust.latestChapter = resp.thumbnails.illust.filter(item => item.id === series.latestIllustId)[0].title 74 | illust.description = series.description 75 | if (series.url === undefined) { 76 | let firstChapter = getAjaxJson(urlIllustDetailed(series.firstIllustId)).body 77 | illust.coverUrl = firstChapter.urls.regular 78 | illust.tags = illust.tags.concat(firstChapter.tags.tags.map(item => item.tag)) 79 | } 80 | illust.createDate = series.createDate 81 | illust.updateDate = series.updateDate 82 | illust.total = series.total 83 | } 84 | }) 85 | return illusts 86 | } 87 | 88 | u.formatIllusts = function (illusts) { 89 | illusts.forEach(illust => { 90 | illust.title = illust.title.replace(RegExp(/^\s+|\s+$/g), "") 91 | illust.tags = Array.from(new Set(illust.tags)) 92 | illust.tags = illust.tags.join(",") 93 | illust.coverUrl = urlCoverUrl(illust.coverUrl) 94 | illust.createDate = dateFormat(illust.createDate) 95 | illust.updateDate = dateFormat(illust.updateDate) 96 | if (util.MORE_INFORMATION) { 97 | illust.description = `\n书名:${illust.title}\n作者:${illust.userName}\n标签:${illust.tags}\n页面:${illust.pageCount}\n上传:${illust.createDate}\n更新:${illust.updateDate}\n简介:${illust.description}` 98 | } else { 99 | illust.description = `\n${illust.title},共${illust.pageCount}页\n${illust.description}\n上传时间:${illust.createDate}\n更新时间:${illust.updateDate}` 100 | } 101 | }) 102 | return illusts 103 | } 104 | 105 | u.getIllustRes = function (result) { 106 | let illustId = 0, res = {} 107 | let isJson = isJsonString(result) 108 | let isHtml = result.startsWith("") 109 | if (!isJson && isHtml) { 110 | let pattern1 = "(https?://)?(www\\.)?pixiv\\.net/(artworks|ajax/illust)/(\\d+)" 111 | let isIllust = baseUrl.match(new RegExp(pattern1)) 112 | let pattern2 = "(https?://)?(www\\.)?pixiv\\.net/(user/\\d+|ajax)/series/(\\d+)" 113 | let isSeries = baseUrl.match(new RegExp(pattern2)) 114 | 115 | if (isIllust) { 116 | illustId = isIllust[4] 117 | } else if (isSeries) { 118 | seriesId = isSeries[4] 119 | java.log(`匹配系列ID:${seriesId}`) 120 | illustId = getAjaxJson(urlSeriesDetailed(seriesId)).body.page.series.reverse()[0].workId 121 | } 122 | } 123 | if (isJson) { 124 | res = JSON.parse(result) 125 | } 126 | 127 | if (illustId) { 128 | java.log(`匹配插画ID:${illustId}`) 129 | res = getAjaxJson(urlIllustDetailed(illustId)) 130 | } 131 | if (res.error) { 132 | java.log(`无法从 Pixiv 获取当前漫画`) 133 | java.log(JSON.stringify(res)) 134 | return [] 135 | } 136 | return res.body 137 | } 138 | 139 | util = u 140 | java.put("util", objStringify(u)) 141 | } 142 | 143 | publicFunc() 144 | 145 | // 获取请求的user id方便其他ajax请求构造 146 | let uid = java.getResponse().headers().get("x-userid") 147 | if (uid != null) { 148 | cache.put("pixiv:uid", uid) 149 | } 150 | java.getStrResponse(null, null) -------------------------------------------------------------------------------- /pixiv_illust/base.variableComment.txt: -------------------------------------------------------------------------------- 1 | ⚙️ 自定义书源设置: 2 | ⚙️ 自定义设置:请在基本-变量说明处修改代码 3 | ⚙️ 自定义设置:将 true 改为 false,或相反 4 | ⚠️ 设置源变量【无法】更改书源自定义设置 5 | ⚠️ 注意不要添加或删除尾随逗号"," 6 | ⚠️ 发现页需要长按"Pixiv",手动刷新 7 | 以下内容为书源设置: 8 | { 9 | "CONVERT_CHINESE": true, 10 | "SEARCH_ILLUSTS": false, 11 | "SHOW_GENERAL_NEW": false, 12 | 13 | "DEBUG": false, 14 | 15 | "SHOW_GENERAL_RANK": false, 16 | "SHOW_ORIGINAL_LINK": true 17 | } 18 | 19 | // CONVERT_CHINESE 20 | // 搜索:搜索时进行繁简转换 21 | // SEARCH_ILLUSTS 22 | // 搜索:同时搜索插画 23 | // SHOW_ORIGINAL_LINK 24 | // 目录:显示源链接,但会增加请求次数 25 | 26 | // DEBUG 27 | // 调试模式 28 | 29 | // SHOW_GENERAL_NEW 30 | // 发现:最新、企划、约稿显示一般漫画 31 | // SHOW_GENERAL_RANK 32 | // 发现:排行榜显示一般漫画 33 | 34 | -------------------------------------------------------------------------------- /pixiv_illust/catalog.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function urlIllust(novelId){ 14 | if (util.SHOW_ORIGINAL_LINK) { 15 | return urlIllustUrl(novelId) 16 | } else { 17 | return urlIllustDetailed(novelId) 18 | } 19 | } 20 | 21 | function oneShotHandler(res) { 22 | return [{ 23 | title: res.title.replace(RegExp(/^\s+|\s+$/g), ""), 24 | chapterUrl: urlIllust(res.id), 25 | chapterInfo: `${timeTextFormat(res.createDate)}` 26 | }] 27 | } 28 | 29 | function seriesHandler(res) { 30 | let limit = 12, total = 0, illusts = [] 31 | let seriesId = res.seriesNavData.seriesId 32 | if (res.seriesId === undefined) { 33 | total = getAjaxJson(urlSeriesDetailed(res.seriesNavData.seriesId)).body.page.total 34 | } else { 35 | total = res.total 36 | } 37 | util.debugFunc(() => { 38 | java.log(`本系列 ${seriesId} 一共有${total}章`); 39 | }) 40 | 41 | //要爬取的总次数 42 | let max = (total / limit) + 1 43 | for (let page = 1; page < max; page++) { 44 | // java.log(urlSeriesDetailed(seriesId, page)) 45 | res = getAjaxJson(urlSeriesDetailed(seriesId, page)).body 46 | let illusts_id = res.page.series.map(item => item.workId) 47 | illusts = illusts.concat(res.thumbnails.illust.filter(illust => illusts_id.includes(illust.id))) 48 | } 49 | illusts.reverse().forEach(illust => { 50 | illust.title = illust.title.replace(RegExp(/^\s+|\s+$/g), "") 51 | illust.chapterUrl = urlIllust(illust.id) 52 | illust.chapterInfo = timeTextFormat(illust.createDate) 53 | }) 54 | // java.log(JSON.stringify(illusts)) 55 | return illusts 56 | } 57 | 58 | (() => { 59 | let res = util.getIllustRes(result) 60 | if (res.seriesNavData !== null) { 61 | return seriesHandler(res) 62 | } else { 63 | return oneShotHandler(res) 64 | } 65 | })() -------------------------------------------------------------------------------- /pixiv_illust/content.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function getContent(res) { 14 | let content = [""] 15 | // li = "mini thumb small regular original".split(" ") 16 | let illustLink = getAjaxJson(urlIllustDetailed(res.id)).body.urls.regular 17 | for (let order = 0; order < res.pageCount; order++) { 18 | content.push(``) 19 | illustLink = illustLink.replace(`_p${order}`, `_p${order + 1}`) 20 | } 21 | content = content.join("\n") 22 | return content 23 | } 24 | 25 | (function () { 26 | return getContent(util.getIllustRes(result)) 27 | })() -------------------------------------------------------------------------------- /pixiv_illust/detail.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function illustHandler(illust){ 14 | illust = util.formatIllusts(util.handIllusts([illust]))[0] 15 | illust.detailedUrl = urlIllustUrl(illust.id) 16 | illust.catalogUrl = urlIllustDetailed(illust.id) 17 | return illust 18 | } 19 | 20 | (() => { 21 | try { 22 | return illustHandler(util.getIllustRes(result)) 23 | } catch (e) { 24 | java.log(e) 25 | java.log(`受 Pixiv 的限制,无法获取当前插画的数据`) 26 | } 27 | })() -------------------------------------------------------------------------------- /pixiv_illust/discover.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | var seriesSet = new Set(); // 存储seriesID 有BUG无法处理翻页 4 | 5 | function objParse(obj) { 6 | return JSON.parse(obj, (n, v) => { 7 | if (typeof v == "string" && v.match("()")) { 8 | return eval(`(${v})`) 9 | } 10 | return v; 11 | }) 12 | } 13 | 14 | function handlerFactory() { 15 | if (baseUrl.includes("https://cdn.jsdelivr.net")) { 16 | return () => {updateSource(); return []} 17 | } 18 | if (!isLogin()) { 19 | return handlerNoLogin() 20 | } 21 | if (baseUrl.includes("/follow_latest")) { 22 | return handlerFollowLatest() 23 | } 24 | if (baseUrl.includes("/watch_list")) { 25 | return handlerWatchList() 26 | } 27 | if (baseUrl.includes("/top")) { 28 | return handlerRecommend() 29 | } 30 | if (baseUrl.includes("/discovery")) { 31 | return handlerDiscovery() 32 | } 33 | if (baseUrl.includes("/bookmark")) { 34 | return handlerBookMarks() 35 | } 36 | if (baseUrl.includes("/new")) { 37 | return handlerDiscovery() 38 | } 39 | if (baseUrl.includes("/commission/")) { 40 | return handlerFollowLatest() 41 | } 42 | if (baseUrl.includes("/user_event/portal")) { 43 | return handlerFollowLatest() 44 | } 45 | // 正则匹配网址内容 46 | if (baseUrl.includes("/ranking") && (baseUrl.endsWith("json"))) { 47 | return handlerRanking() 48 | } 49 | if (baseUrl.includes("/ranking")) { 50 | return handlerRegexIllusts() 51 | } 52 | else { 53 | return [] 54 | } 55 | } 56 | 57 | function handlerNoLogin() { 58 | return () => { 59 | sleepToast("此功能需要在书源登录后才能使用") 60 | sleepToast('发现 - 长按"Pixiv" - 登录 - 登录账号') 61 | return [] 62 | } 63 | } 64 | 65 | //关注作者,漫画委托,漫画企划 66 | function handlerFollowLatest() { 67 | return () => { 68 | let res = JSON.parse(result) 69 | return util.formatIllusts(util.handIllusts(res.body.thumbnails.illust)) 70 | } 71 | } 72 | 73 | // 追更列表 74 | function handlerWatchList() { 75 | return () => { 76 | let res = JSON.parse(result) 77 | // li = res.body.page.watchedSeriesIds 78 | return util.formatIllusts(util.handIllusts(res.body.thumbnails.illust)) 79 | } 80 | } 81 | 82 | // 推荐漫画 83 | function handlerRecommend() { 84 | return () => { 85 | let res = JSON.parse(result) 86 | const recommend = res.body.page.recommend 87 | const illusts = res.body.thumbnails.illust 88 | let nidSet = new Set(recommend.ids) 89 | // java.log(nidSet.size) 90 | let list = illusts.filter(illust => nidSet.has(String(illust.id))) 91 | // java.log(`过滤结果:${JSON.stringify(list)}`) 92 | return util.formatIllusts(util.handIllusts(list)) 93 | } 94 | } 95 | 96 | //发现漫画 97 | function handlerDiscovery() { 98 | return () => { 99 | let res = JSON.parse(result) 100 | return util.formatIllusts(util.handIllusts(res.body.illusts)) 101 | } 102 | } 103 | 104 | // 收藏漫画 105 | function handlerBookMarks() { 106 | return () => { 107 | let res = JSON.parse(result).body.works 108 | if (res === undefined || res.length === 0) { 109 | //流程无法本环节中止 只能交给下一流程处理 110 | return [] 111 | } 112 | return util.formatIllusts(util.handIllusts(res)) 113 | } 114 | } 115 | 116 | // 排行榜,顺序相同 117 | function handlerRanking() { 118 | return () => { 119 | let res = JSON.parse(result) 120 | res.contents.forEach(item =>{ 121 | item.id = item.illust_id 122 | // item.title = item.title 123 | item.userName = item.user_name 124 | // item.tags = item.tags 125 | item.latestChapter = item.title 126 | item.description = null 127 | item.coverUrl = item.url 128 | item.detailedUrl = urlIllustDetailed(item.id) 129 | item.createDate = item.updateDate = item.illust_upload_timestamp * 1000 130 | 131 | if (item.illust_series !== false) { 132 | let series = item.illust_series 133 | item.seriesId = series.illust_series_id 134 | item.order = series.illust_series_content_order 135 | item.total = series.illust_series_content_count 136 | if (item.order === item.total) item.latestChapter = item.title 137 | item.title = series.illust_series_title 138 | item.description = series.illust_series_caption 139 | item.pageCount = series.illust_page_count 140 | item.createDate = item.updateDate = series.illust_series_create_datetime 141 | } 142 | }) 143 | return util.formatIllusts(util.handIllusts(res.contents)) 144 | } 145 | } 146 | 147 | //首页,编辑部推荐,顺序随机 148 | function handlerRegexIllusts() { 149 | return () => { 150 | let illustIds = [] // 正则获取网址中的 illustId 151 | let matched = result.match(RegExp(/\/artworks\/\d{5,}/gm)) 152 | for (let i in matched) { 153 | let illustId = matched[i].match(RegExp(/\d{5,}/))[0] 154 | if (illustIds.indexOf(illustId) === -1) { 155 | illustIds.push(illustId) 156 | } 157 | } 158 | let userIllusts = getWebviewJson( 159 | urlIllustsDetailed(`${cache.get("pixiv:uid")}`, illustIds), html => { 160 | return (html.match(new RegExp(">\\{.*?}<"))[0].replace(">", "").replace("<", "")) 161 | }).body 162 | return util.formatIllusts(util.handIllusts(Object.values(userIllusts))) 163 | } 164 | } 165 | 166 | (() => { 167 | return handlerFactory()() 168 | })() -------------------------------------------------------------------------------- /pixiv_illust/discover_address.js: -------------------------------------------------------------------------------- 1 | @js: 2 | let SHOW_GENERAL_NEW, SHOW_GENERAL_RANK 3 | try { 4 | settings = JSON.parse(String(source.variableComment).match(RegExp(/{([\s\S]*?)}/gm))) 5 | SHOW_GENERAL_NEW = settings.SHOW_GENERAL_NEW // 发现:最新、企划、约稿显示一般小说 6 | SHOW_GENERAL_RANK = settings.SHOW_GENERAL_RANK // 发现:排行榜显示一般小说 7 | } catch (e) { 8 | SHOW_GENERAL_NEW = false 9 | SHOW_GENERAL_RANK = false 10 | } 11 | 12 | li = [ 13 | {"⭐️ 关注": "https://www.pixiv.net/ajax/follow_latest/illust?p={{page}}&mode=all&lang=zh"}, 14 | {"📃 追更": "https://www.pixiv.net/ajax/watch_list/manga?p={{page}}&new=1&lang=zh"}, 15 | {"💯 推荐": "https://www.pixiv.net/ajax/top/illust?mode=all&lang=zh"}, 16 | {"🔍 发现": "https://www.pixiv.net/ajax/illust/discovery?mode=all&lang=zh"}, 17 | {"❤️ 收藏": "https://www.pixiv.net/ajax/user/{{cache.get(\"pixiv:uid\")}}/illusts/bookmarks?tag=&offset={{(page-1)*24}}&limit=24&rest=show&lang=zh"}, 18 | {"㊙️ 收藏": "https://www.pixiv.net/ajax/user/{{cache.get(\"pixiv:uid\")}}/illusts/bookmarks?tag=&offset={{(page-1)*24}}&limit=24&rest=hide&lang=zh"}, 19 | {"🏠 首页": "https://www.pixiv.net"}, 20 | {"🆙 更新": "https://cdn.jsdelivr.net/gh/windyhusky/PixivSource@main/pixiv.json"} 21 | ] 22 | 23 | generalNew = [ 24 | {"🆕 最新 企划 约稿 💰": ""}, 25 | {"🆕 最新": "https://www.pixiv.net/ajax/illust/new?lastId=0&limit=20&type=manga&lang=zh"}, 26 | {"📑 企划": "https://www.pixiv.net/ajax/user_event/portal/artworks?mode=all&p={{page}}&lang=zh"}, 27 | {"💰 约稿": "https://www.pixiv.net/ajax/commission/page/request/complete/manga?mode=all&p={{page}}&lang=zh"}, 28 | {"🔍 发现": "https://www.pixiv.net/ajax/illust/discovery?mode=all&lang=zh"} 29 | ] 30 | 31 | r18Rank = [ 32 | {"👑 排行榜单 👑": ""}, 33 | {"今日": "https://www.pixiv.net/ranking.php?mode=daily_r18&content=manga&p={{page}}&format=json"}, 34 | {"本周": "https://www.pixiv.net/ranking.php?mode=weekly_r18&content=manga&p={{page}}&format=json"}, 35 | {"R18G": "https://www.pixiv.net/ranking.php?mode=r18g&content=manga&p={{page}}&format=json"}, 36 | {"男性": "https://www.pixiv.net/ranking.php?mode=male_r18"}, 37 | {"女性": "https://www.pixiv.net/ranking.php?mode=female_r18"} 38 | ] 39 | 40 | generalRank = [ 41 | {"🏆 排行榜单 🏆": ""}, 42 | {"今日": "https://www.pixiv.net/ranking.php?mode=daily&content=manga&p={{page}}&format=json"}, 43 | {"本周": "https://www.pixiv.net/ranking.php?mode=weekly&content=manga&p={{page}}&format=json"}, 44 | {"本月": "https://www.pixiv.net/ranking.php?mode=monthly&content=manga&p={{page}}&format=json"}, 45 | {"新人": "https://www.pixiv.net/ranking.php?mode=rookie&content=manga&p={{page}}&format=json"} 46 | ] 47 | 48 | if (SHOW_GENERAL_RANK === true) { 49 | li = li.concat(generalNew) 50 | } 51 | li = li.concat(r18Rank) 52 | if (SHOW_GENERAL_RANK === true) { 53 | li = li.concat(generalRank) 54 | } 55 | 56 | li.forEach(item => { 57 | item.title = Object.keys(item)[0] 58 | item.url = Object.values(item)[0] 59 | delete item[Object.keys(item)[0]] 60 | item.style = {} 61 | item.style.layout_flexGrow = 1 62 | item.style.layout_flexShrink = 1 63 | item.style.layout_alignSelf = "auto" 64 | item.style.layout_wrapBefore = "false" 65 | if (item.url === "") { 66 | item.style.layout_flexBasisPercent = 1 67 | } else { 68 | item.style.layout_flexBasisPercent = -1 69 | } 70 | }) 71 | 72 | JSON.stringify(li) -------------------------------------------------------------------------------- /pixiv_illust/search.js: -------------------------------------------------------------------------------- 1 | @js: 2 | var util = objParse(String(java.get("util"))) 3 | 4 | function objParse(obj) { 5 | return JSON.parse(obj, (n, v) => { 6 | if (typeof v == "string" && v.match("()")) { 7 | return eval(`(${v})`) 8 | } 9 | return v; 10 | }) 11 | } 12 | 13 | function getManga() { 14 | if (JSON.parse(result).error === true) { 15 | return [] 16 | } 17 | let illusts = JSON.parse(result).body.illustManga.data 18 | illusts.forEach(illust => {illust.tags.unshift("漫画")}) 19 | return illusts 20 | } 21 | 22 | function getConvertManga() { 23 | let MAXPAGES = 2, illusts = [] 24 | let novelName = String(java.get("key")) 25 | let name = java.s2t(java.t2s(java.s2t(novelName))) 26 | let resp = getAjaxJson(urlSearchManga(name, 1)).body 27 | java.log(urlSearchManga(name, 1)) 28 | illusts = illusts.concat(resp.illustManga.data) 29 | // for (let page = 2; page < resp.lastPage, page < MAXPAGES; page++) { 30 | // illusts = illusts.concat(getAjaxJson(urlSearchManga(name, page)).body.illustManga.data) 31 | // java.log(urlSearchManga(name, page)) 32 | // } 33 | illusts.forEach(illust => {illust.tags.unshift("漫画")}) 34 | return illusts 35 | } 36 | 37 | function getIllust() { 38 | let MAXPAGES = 3, illusts = [] 39 | let name = String(java.get("key")) 40 | java.log(urlSearchIllust(name, 1)) 41 | let resp = getAjaxJson(urlSearchIllust(name, 1)) 42 | if (resp.error === true) { 43 | return [] 44 | } 45 | illusts = illusts.concat(resp.body.illustManga.data) 46 | for (let page = Number(java.get("page")) + 1; page < resp.body.illustManga.lastPage, page < MAXPAGES; page++) { 47 | java.log(`正在搜索第${page}页`) 48 | let resp = getAjaxJson(urlSearchIllust(name, page)) 49 | if (resp.error === true) { 50 | return [] 51 | } 52 | illusts = illusts.concat(resp.body.illustManga.data) 53 | } 54 | illusts.forEach(illust => {illust.tags.unshift("插画")}) 55 | return illusts 56 | } 57 | 58 | (() => { 59 | let artworks = [] 60 | artworks = artworks.concat(getManga()) 61 | if (util.CONVERT_CHINESE) artworks = artworks.concat(getConvertManga()) 62 | if (util.SEARCH_ILLUSTS) artworks = artworks.concat(getIllust()) 63 | // java.log(JSON.stringify(artworks)) 64 | // 返回空列表中止流程 65 | if (artworks.length === 0) { 66 | return [] 67 | } 68 | return util.formatIllusts(util.handIllusts(artworks)) 69 | })() -------------------------------------------------------------------------------- /pixiv_illust/searchUrl.js: -------------------------------------------------------------------------------- 1 | @js: 2 | java.put("key",key) 3 | java.put("page",page) 4 | urlSearchManga(key, page) --------------------------------------------------------------------------------