📚豆瓣阅读

https://read.douban.com

guaner001125 (317)03/19 13:37

优化正文规则

书源测试阅读版本【3.25.021520】


二维码导入
{
    "bookSourceComment": "如不能加载请尝试删除书籍,重新搜索添加",
    "bookSourceGroup": "⑦📚  出版",
    "bookSourceName": "📚豆瓣阅读",
    "bookSourceType": 0,
    "bookSourceUrl": "https:\/\/read.douban.com",
    "bookUrlPattern": "https:\/\/read.douban.com\/(ebook|read|column).*",
    "customOrder": 82,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "exploreUrl": "[{'title':'言情小说','url':'https:\/\/read.douban.com\/kind\/501?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'女性小说','url':'https:\/\/read.douban.com\/kind\/532?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'悬疑小说','url':'https:\/\/read.douban.com\/kind\/508?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'科幻小说','url':'https:\/\/read.douban.com\/kind\/505?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'幻想小说','url':'https:\/\/read.douban.com\/kind\/506?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'文艺小说','url':'https:\/\/read.douban.com\/kind\/503?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'历史小说','url':'https:\/\/read.douban.com\/kind\/510?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'非小说','url':'https:\/\/read.douban.com\/kind\/516?start={{(page-1)*20}}&sort=hot&promotion_only=False&min_price=None&max_price=None&works_type=1,{\\'headers\\':\\'{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 8.1.0; JKM-AL00b Build\/HUAWEIJKM-AL00b; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/66.0.3359.126 MQQBrowser\/6.2 TBS\/044807 Mobile Safari\/537.36\"}\\'}','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'生活悬疑','url':'https:\/\/read.douban.com\/j\/tag\/生活悬疑?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'都市犯罪','url':'https:\/\/read.douban.com\/j\/tag\/都市犯罪?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'社会事件','url':'https:\/\/read.douban.com\/j\/tag\/社会事件?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'私家侦探','url':'https:\/\/read.douban.com\/j\/tag\/私家侦探?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'职业女性','url':'https:\/\/read.douban.com\/j\/tag\/职业女性?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'单身女性','url':'https:\/\/read.douban.com\/j\/tag\/单身女性?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'女性成长','url':'https:\/\/read.douban.com\/j\/tag\/女性成长?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'家庭故事','url':'https:\/\/read.douban.com\/j\/tag\/家庭故事?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'时空穿越','url':'https:\/\/read.douban.com\/j\/tag\/时空穿越?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'都市奇幻','url':'https:\/\/read.douban.com\/j\/tag\/都市奇幻?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'脑洞故事','url':'https:\/\/read.douban.com\/j\/tag\/脑洞故事?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'近未来','url':'https:\/\/read.douban.com\/j\/tag\/近未来?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'青春成长','url':'https:\/\/read.douban.com\/j\/tag\/青春成长?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'都市冷暖','url':'https:\/\/read.douban.com\/j\/tag\/都市冷暖?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'漂泊故事','url':'https:\/\/read.douban.com\/j\/tag\/漂泊故事?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'时代记忆','url':'https:\/\/read.douban.com\/j\/tag\/时代记忆?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'武侠小说','url':'https:\/\/read.douban.com\/j\/tag\/武侠小说?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'历史纪实','url':'https:\/\/read.douban.com\/j\/tag\/历史纪实?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'历史言情','url':'https:\/\/read.douban.com\/j\/tag\/历史言情?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}},\n{'title':'历史传奇','url':'https:\/\/read.douban.com\/j\/tag\/历史传奇?start={{(page-1)*10}}&limit={{(page)*10}}&sort=top','style':{layout_flexGrow: 1,layout_flexBasisPercent:0.2}}]",
    "header": "",
    "lastUpdateTime": "1742362666747",
    "loginCheckJs": "",
    "loginUi": "",
    "loginUrl": "https:\/\/read.douban.com\/app",
    "respondTime": 203289,
    "ruleBookInfo": {
        "author": "[email protected]@text",
        "coverUrl": "class.cover shadow-cover@img@src",
        "init": "",
        "intro": "{{@class.section-abstract@html||class.abstract-full@html||class.intro@html}}<br>{{@class.rally-waiting-tip@html}}",
        "kind": "@js:\nis_bundle = \/bundle\/.test(\"{{\/\/link[@rel=\"alternate\"]\/@href}}\");\nis_bundle?java.put(\"is_bundle\",is_bundle):java.put(\"is_bundle\",\"false\");\"\"",
        "lastChapter": "class.current-price-count@text##^##全本定价:",
        "name": "<js>\nr = result.match(\/Ark.CSRF_TOKEN = '([^']+)'\/)[1];\njava.put(\"X-CSRF-TOKEN\",r);\njava.getString(\"@class.article-title@text\")\n<\/js>",
        "tocUrl": "@js:\n\nif(java.get(\"is_bundle\")==\"false\"){\n\t\nid=baseUrl.match(\/(\\d+)\/)[1];\nif(baseUrl.match(\/ebook\/)){result=baseUrl}else{\nresult=\"https:\/\/read.douban.com\/j\/column_v2\/\"+id+\"\/chapters?start=0&limit=10000&latestFirst=0\";}\n}else{\n\tresult = baseUrl\n\t}"
    },
    "ruleContent": {
        "content": "<js>\n\nif(java.get(\"is_bundle\")==\"false\"){\nhtml = java.ajax(\"https:\/\/read.douban.com\");\neval(html.match(\/Ark\\.(user = \\{[\\s\\S]+?\\})\/)[1]);\ncok = user.id??\"anonymous\";\njava.log(\"cok: \"+cok)\nt = java.getString(\"$.data\");\nscript = `<script>\nt = \"${t}\";\nfunction name(t){\n  const e = Uint8Array.from(window.atob(t), (t=>t.charCodeAt(0)))\n    , i = e.buffer\n    , u = e.length - 16 - 13\n    , d = new Uint8Array(i,u,16)\n    , p = new Uint8Array(i,0,u)\n    , f = {};\n    f.name = \"AES-CBC\",\n    f[\"iv\"] = d,\n  c = new TextEncoder().encode(\"${cok}\");\n  return window[\"crypto\"][\"subtle\"][\"digest\"](\"SHA-256\", c)\n  .then(t=>window[\"crypto\"][\"subtle\"][\"importKey\"](\"raw\", t, \"AES-CBC\", !0, [\"decrypt\"])\n  .then(t=>window[\"crypto\"][\"subtle\"][\"decrypt\"](f, t, p))\n  .then(t=>JSON.parse((new TextDecoder).decode(t)))\n .then(t=>t.posts[0].contents));\n}\n(async function () {\n  result = await name(t)\n  })();\n<\/script>`;\n\nddd = java.webView(script,baseUrl,\"result\");\n\n\/\/规范Json数据\n\/\/ 定义正则表达式\nconst pattern = \/:\"(.*?)\"([,\\]\\}])\/g;\n\n\/\/ 替换逻辑\nddd = String(ddd).replace(pattern, (match, content,suffix) => {\n  \/\/ 将内容中的双引号替换为转义字符\n  const replacedContent = content.replace(\/\"\/g, '\\\\\"');\n  \/\/ 返回替换后的结果\n  return `:\"${replacedContent}\"${suffix}`;\n}).replace(\/\\n+\/g,'\\\\n').replace(\/[\\x00-\\x1F\\x7F]\/g,'');\nvar data = JSON.parse(String(ddd));\n\nfunction extractContent(item) {\n    const textList = item.data?.text;\n\n    const process = (content) => {\n        if (typeof content === 'string') {\n            return content;\n        }\n        if (Array.isArray(content)) {\n            return content.map(process).join('');\n        }\n        if (content && content.content) {\n            return process(content.content);\n        }\n        return '';\n    };\n    return typeof textList === 'string' ? textList : process(textList);\n}\n\n\nfunction getChapterContent(chapterNumber) {\n    let chapterContent = [];\n    let currentChapter = -1;\n    let isFirstHeadlineFound = false;\n\n    for (let i = 0; i < data.length; i++) {\n        let item = data[i];\n\n        if (item.type === 'headline') {\n            currentChapter++;\n            if (!isFirstHeadlineFound) {\n                isFirstHeadlineFound = true;\n            }\n            if (currentChapter > chapterNumber) {\n                break;\n            }\n        }\n        if ((currentChapter === chapterNumber) || (chapterNumber === 0 && !isFirstHeadlineFound && item.type !== 'headline')) {\n                if(item.type === \"illus\")chapterContent.push(`<img src=\"${item.data?.size.orig.src}\">\\n`);\n                if(item.type !== 'headline')chapterContent.push(extractContent(item));\n            \n        }\n    }\n    return chapterContent.length > 0 ? chapterContent.join('\\n') : null;\n}\n\nresult = \"\";\n\/\/ 检查是否需要使用章节逻辑\nif (book.bookUrl.includes(\"ebook\")) {    \n    let index = chapter.index;\n    result = getChapterContent(index);\n} else {\n    \/\/ 遍历数据,提取并拼接 content\n    data.forEach(item => {\n            if(item.type === \"illus\")result += `<img src=\"${item.data?.size.orig.src}\">\\n`\n            result += extractContent(item) + \"\\n\"; \/\/ 每个段落换行\n        \n    });\n}\n\n}else{\n\tbookName = java.getString(\"@class.article-title@text\");\n\tbookAuthor = java.getString(\"@class.author-item@text\");\n\timgSrc = java.getString(\"@class.cover shadow-cover@img@src\");\n\tinfo = java.getString(\"@class.info@p@text\");\n\tresult = `❗️刷新本章跳转加入书架界面❗️\\n书名:${bookName}\\n作者:${bookAuthor}\\n<img src=\"${imgSrc}\">\\n简介:\\n${info}`\n\t\tif(book.durChapterIndex === chapter.index){\n\t\turl = \"legado:\/\/import\/addToBookshelf?src=\"+baseUrl;\n\t\tscript = `data:text\/html;charset=utf-8,\n\t\t<html>\n\t\t<title>《${bookName}》加入书架<\/title>\t\t\n\t\t<img src=\"${imgSrc}\" style=\"max-width: 300px; max-height: 400px\">\n\t\t<p style=\"text-align: center;\"><a href=\"${url}\" style=\"font-size:50px;\">跳转加入书架<\/a><\/p>\n\t\t<p style=\"font-size:60px\">简介:${info}\n\t\t<\/p>\t\t\t\t\n\t\t<\/html>\n\t\t<script>\n        window.onload = function () {\n            window.location.href = '${url}';\n        };\n    <\/script>`;    \n\t\tjava.startBrowser(script,\"《\"+bookName+\"》\")\t\t\n\t\t}\t\t\n\t}\nresult\n\n<\/js>",
        "imageStyle": "",
        "nextContentUrl": "",
        "payAction": "",
        "replaceRegex": "",
        "title": "",
        "webJs": ""
    },
    "ruleExplore": {
        "author": "class.author@text||$.author",
        "bookList": "class.item||$.[?(@.alias_id)]",
        "bookUrl": "@js:\nresult = java.getString(\"@href\");\n\nif(!String(result)){\n\tresult = \"https:\/\/read.douban.com\/column\/{{$.alias_id}}\/\"\n\t}\njava.put('is_bundle',\/bundle\/.test(result));\nresult",
        "coverUrl": "img@src||$.cover",
        "intro": "class.intro@text||$.abstract",
        "kind": "{{@@class.tag@text}},{{@@class.score@text}},{{@@class.amount}},{{@@class.price@text}},{{$.kind&&$.category&&$.tags[*].tag&&$.kinds[*].shortName&&$.highlightTags[*].name}}##(\\d+\\.\\d{2})##$1元💰",
        "name": "class.title@html||$.title##<span class=\"tag\">.*?<\/span>|<.*?>"
    },
    "ruleSearch": {
        "author": "$.author",
        "bookList": "<js>\nlist=JSON.parse(result);\nJson=[]\nfor(i in list){\nif(list[i].title.indexOf(java.get('key'))>-1){\nJson.push(list[i])\n}\n}\nresult=JSON.stringify(Json)\n<\/js>\n$.[*]",
        "bookUrl": "https:\/\/read.douban.com\/{{$.type}}\/{{$.id}}\/",
        "checkKeyWord": "红楼梦",
        "coverUrl": "$.cover",
        "intro": "$.abstract",
        "kind": "{{String(java.getString(\"$.fixed_price\"))===\"false\"?\"免费\":\"原价:\"+(Number(java.getString(\"$.fixed_price\"))\/100)+\"元\"+\"💡特价:\"+(Number(java.getString(\"$.price\"))\/100)+\"元\"}},{{$.tags[*].tag&&$.kind&&$.category}}",
        "lastChapter": "@js:\nString(java.getString(\"$.fixed_price\"))===\"false\"?\"免费\":\"原价:\"+(Number(java.getString(\"$.fixed_price\"))\/100)+\"元\"+\"💡特价:\"+(Number(java.getString(\"$.price\"))\/100)+\"元\"",
        "name": "$.title",
        "wordCount": "@js:\n\"{{$..is_bundle}}\"!=\"\"?java.put(\"is_bundle\",\"{{$..is_bundle}}\"):java.put(\"is_bundle\",\"false\");\"\""
    },
    "ruleToc": {
        "chapterList": "<js>\nresult = java.getElements(\"@class.story-item@a||class.ebook-list@li\");\nif(!result.length){\n\t\tresult = java.getElements(\"$.list[*]\")\n\t\t}\n\t\t\nif(result.length===0){\n  java.setContent('<a href=\"ebook\/0\/toc\/0\">暂无目录<\/a>');\n\tresult = java.getElements(\"@@tag.a\")\n\t}\nresult;\n<\/js>",
        "chapterName": "img@alt||text||title",
        "chapterUrl": "<js>\nif(java.get(\"is_bundle\")==\"false\"){\naid = \"{{$.id}}\"==\"\"?\"{{@@href}}\".match(\/ebook\\\/(\\d+)\/)[1]:\"{{$.id}}\";\n\nid=\"{{$.id}}\"==\"\"?\"{{@@href}}\".match(\/ebook\\\/\\d+\\\/toc\\\/(\\d+)\/)[1]:\"\";\nurl = \"https:\/\/read.douban.com\/j\/article_v2\/get_reader_data\";\nbody = \"aid=\"+aid;\nresult = url +\",\"+ JSON.stringify({\n\t\"method\":\"POST\",\n\t\"body\":String(body),\n\t\"headers\":{\n\t\t\"referer\":\"https:\/\/read.douban.com\/reader\/column\/{{baseUrl.match(\/\\\/(\\d+)\\\/\/)[1]}}\/chapter\/\"+(id!=\"\"?id:aid)+\"\/\",\n\t\t\"X-CSRF-TOKEN\":java.get(\"X-CSRF-TOKEN\")\n\t\t}\n\t});\n\t}else{\n\t\tresult = java.getString(\"@tag.a.0@href\")\n\t\t}\n<\/js>",
        "formatJs": "",
        "isPay": "",
        "isVip": "$.price",
        "isVolume": "",
        "nextTocUrl": "",
        "preUpdateJs": "",
        "updateTime": ""
    },
    "searchUrl": "https:\/\/read.douban.com\/j\/search?start={{(page-1)*10}}&limit=10&query={{key}}\n@js:java.put('key',key);result",
    "variableComment": "",
    "weight": 0
}
广告