📚书山融合3.0(完全版)

https://ga.shusan.xyz

书山 (1935)1天前

书山最新3.0版本,

已经支持番茄,七猫,得间,塔读,QQ,小米,熊猫,猫眼,百度,米读,起点(69/笔趣阁/伪69/顶点/星星/爱下/得奇/搜书神器),喜马拉雅VIP(真人听书),歪瑞古德漫画,河马短剧,七猫短剧,番茄短剧!

苹果手机iOS用户

支持以下iOS软件:

1、益达yds格式

2、香色闺阁xbs格式

3、用心读书mrs格式

二维码导入
{
    "enabledCookieJar": true,
    "customOrder": 0,
    "searchUrl": "<js>\nlet base_url = getArguments(source.getVariable(),'server',String(source.bookSourceComment));\nlet key2 = '';\ntry {\n\tkey2 = String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n\tkey2 = getKey(key2);\n        } catch (e) {key2='';}\n\n\nlet media;\nlet sources = getArguments(source.getVariable(),'source',String(source.bookSourceComment));\nif (String(key).startsWith(\"m:\")||String(key).startsWith(\"m:\")) {\n  media = \"漫画\"\n  key = key.slice(2)\n  }else if (String(key).startsWith(\"t:\")||String(key).startsWith(\"t:\")) {\n  media = \"听书\"\n  key = key.slice(2)\n} else if (String(key).startsWith(\"d:\")||String(key).startsWith(\"d:\")) {\n  media = \"短剧\"\n  key = key.slice(2)\n} else if (String(key).startsWith(\"x:\")||String(key).startsWith(\"x:\"))  {\n\tmedia = \"小说\"\n  key = key.slice(2)\n\t} else {\n\tmedia = getArguments(source.getVariable(),'media',String(source.bookSourceComment));\n\t}\nif (key.includes('@')) {\n  const parts = key.split('@');\n  key = parts[0];\n  sources = parts[1] || sources;\n}\n\t`${base_url}\/search?title=${key}&tab=${media}&source=${sources}&key=${key2}`\n<\/js>",
    "ruleBookInfo": {
        "author": "$.author",
        "tocUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet base_url = getArguments(source.getVariable(),'server',String(source.bookSourceComment));\nlet sq_user_id = getArguments(source.getVariable(),'sq_user_id',String(source.bookSourceComment)) || '0';\n`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}&sq_user_id=${sq_user_id}`\n<\/js>",
        "wordCount": "$.word_number",
        "name": "$.book_name",
        "lastChapter": "{{$.source}} {{$.last_chapter_title}}",
        "init": "$.book_detail",
        "coverUrl": "$.thumb_url",
        "kind": "",
        "intro": "<js>\n\/\/java.log(123);\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab;\nlet book_tts = result.book_tts;\nlet tags = result.tags;\nlet role = result.role;\nlet last_chapter_title = result.last_chapter_title;\nlet last_chapter_update_time = result.last_chapter_update_time;\nlet word_number = result.word_number;\nlet status = result.status;\nlet score = result.score;\nlet media = result.media;\nlet abstract = result.abstract;\nlet book_review = result.book_review;\nlet copyright_info = result.copyright_info;\njava.put('book_detail',JSON.stringify(result));\nlet info;\nlet base_url = getArguments(source.getVariable(),'server',String(source.bookSourceComment));\nlet key = '';\n\ntry {\n\tkey = String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n\tkey = getKey(key);\n        } catch (e) {key='';}\nif (key != ''){key = '✅️已登录';} else {key = '‼️⛔️您还未登录书山账号哦,可以点击右上角登录♨️';}\ninfo = `&nbsp;&nbsp;🎚当前服务器:${base_url}\n🪄书山账号:${key}\n🎴当前来源:${sources}\n🗂当前模式:${tab}\\n`\nif (tab =='听书') {info = info+\t'🔊当前音色:'+ getArguments(source.getVariable(),'tone_id',String(source.bookSourceComment))+'\\n'+book_tts+'\\n&lrm;';}\nif (`${tags}`) {info = info +  `🕹分类:${tags}\\n`};\nif (`${role}`) {info = info +  `🎗书籍主角:${role}\\n`};\nif (`${last_chapter_title}`) {info = info +  `🎯最新章节:${last_chapter_title}\\n`};\nif (`${last_chapter_update_time}`) {info = info +  `⏳更新时间:${last_chapter_update_time}\\n`};\nif (`${word_number}`) {info = info +  `📝书籍字数:${word_number}\\n`};\nif (`${status}`) {info = info +  `💥书籍状态:${status}\\n`};\nif (`${score}`) {info = info +  `✨书籍评分:${score}\\n`};\nif (`${media}`) {info = info +  `📌出版媒体:${media}\\n`};\nif (`${abstract}`) {info = info +  `&lrm;\n📚书籍简介:\n${abstract}\\n`};\nif (`${book_review}`) {info = info +  `&lrm;\\n${book_review}\\n`};\nif (`${copyright_info}`) {info = info +  `📍${copyright_info}`};\n<\/js>"
    },
    "bookSourceGroup": "书山小说会员专属请勿传播,番茄小说,七猫小说,塔读小说,得间小说,起点小说",
    "loginUi": "[ {\n        \"name\":  \"♥♥ 登录书山账号♥♥\",\n        \"type\": \"button\",\n        \"action\":\"loginqt()\"\n      },{\n        \"name\":  \"📚书山书架\",\n        \"type\": \"button\",\n        \"action\": \"qtsj()\"\n      },{\n        \"name\":  \"🍅🍅🍅番茄登录🍅🍅🍅\",\n        \"type\": \"button\",\n        \"action\": \"fq_login()\"\n      },{\n        \"name\":  \"  退出登录  \",\n        \"type\": \"button\",\n        \"action\": \"logout()\"\n      },{\n        \"name\": \"       ♂男频       \",\n        \"type\": \"button\",\n        \"action\": \"set_source_type('男频')\"\n      },{\n        \"name\": \"       ♀女频       \",\n        \"type\": \"button\",\n        \"action\": \"set_source_type('女频')\"\n      },{\n        \"name\": \"全部\",\n        \"type\": \"button\",\n        \"action\": \"set_source('全部')\"\n      },{\n        \"name\": \"番茄\",\n        \"type\": \"button\",\n        \"action\": \"set_source('番茄')\"\n      },{\n        \"name\": \"七猫\",\n        \"type\": \"button\",\n        \"action\": \"set_source('七猫')\"\n      },{\n        \"name\": \"得间\",\n        \"type\": \"button\",\n        \"action\": \"set_source('得间')\"\n      },{\n        \"name\": \"QQ\",\n        \"type\": \"button\",\n        \"action\": \"set_source('QQ')\"\n      },{\n        \"name\": \"熊猫\",\n        \"type\": \"button\",\n        \"action\": \"set_source('熊猫')\"\n      },{\n        \"name\": \"塔读\",\n        \"type\": \"button\",\n        \"action\": \"set_source('塔读')\"\n      },{\n        \"name\": \"猫眼\",\n        \"type\": \"button\",\n        \"action\": \"set_source('猫眼')\"\n      },{\n        \"name\": \"米读\",\n        \"type\": \"button\",\n        \"action\": \"set_source('米读')\"\n      },{\n        \"name\": \"小米\",\n        \"type\": \"button\",\n        \"action\": \"set_source('小米')\"\n      },{\n        \"name\": \"百度\",\n        \"type\": \"button\",\n        \"action\": \"set_source('百度')\"\n      },{\n        \"name\": \"起点(部分)\",\n        \"type\": \"button\",\n        \"action\": \"set_source('起点')\"\n      },{\n        \"name\": \"69书吧\",\n        \"type\": \"button\",\n        \"action\": \"set_source('69书吧')\"\n      },{\n        \"name\": \"喜马拉雅\",\n        \"type\": \"button\",\n        \"action\": \"set_source('喜马拉雅')\"\n      },{\n        \"name\": \"歪瑞古德漫画\",\n        \"type\": \"button\",\n        \"action\": \"set_source('歪瑞古德')\"\n     },{\n        \"name\": \"河马短剧\",\n        \"type\": \"button\",\n        \"action\": \"set_source('河马')\"\n     },{\n        \"name\": \"↑↑上方可切换自己想要的来源进行搜索↑↑\",\n        \"type\": \"button\",\n        \"action\": \"\"\n      },{\n        \"name\":  \"☕解除下载限制\",\n        \"type\": \"button\",\n        \"action\": \"vip()\"\n      },{\n        \"name\":  \"♻️检测服务器可用性\",\n        \"type\": \"button\",\n        \"action\": \"api()\"\n      },{\n        \"name\":  \"    🎚切换服务器    \",\n        \"type\": \"button\",\n        \"action\": \"set_server(server)\"\n      },{\n        \"name\":  \"    🖱当前服务器    \",\n        \"type\": \"button\",\n        \"action\": \"get_server()\"\n      },{\n        \"name\":  \"                                🗂当前模式                                \",\n        \"type\": \"button\",\n        \"action\": \"get_media()\"\n      },{\n        \"name\": \"      📖小说模式      \",\n        \"type\": \"button\",\n        \"action\": \"set_media('小说')\"\n      },{\n        \"name\": \"      🔊听书模式      \",\n        \"type\": \"button\",\n        \"action\": \"set_media('听书')\"\n      },{\n        \"name\": \"      🏞漫画模式      \",\n        \"type\": \"button\",\n        \"action\": \"set_media('漫画')\"\n      },{\n        \"name\": \"      🖲短剧模式      \",\n        \"type\": \"button\",\n        \"action\": \"set_media('短剧')\"\n      },{\n        \"name\": \"听书Ai音色填写后点击右上角✔\",\n        \"type\": \"text\"\n      },{\n        \"name\":  \"自定义服务器(可不填)\",\n        \"type\": \"text\"\n        }, {\n        \"name\":  \"手动填写番茄token(可不填)\",\n        \"type\": \"text\"\n      }, {\n        \"name\":  \"书旗id(可不填)\",\n        \"type\": \"text\"\n      }\n      ]",
    "lastUpdateTime": "1752721035064",
    "respondTime": 180000,
    "ruleExplore": {
        "author": "$.author",
        "wordCount": "$.word_number",
        "name": "$.book_name",
        "lastChapter": "{{$.last_chapter_title}} • {{$.last_update_time}}",
        "coverUrl": "$.thumb_url",
        "kind": "{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}",
        "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet base_url = getArguments(source.getVariable(),'server',String(source.bookSourceComment));\n`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}`\n<\/js>",
        "intro": "{{$.source}}\n{{$.abstract}}",
        "bookList": "$.discover_data&&$.books&&$.data.data"
    },
    "ruleToc": {
        "chapterUrl": "<js>\nlet tab = result.tab;\nlet sources = result.source;\nlet title = result.title;\nlet item_id = result.item_id;\n\nlet content_url = `${item_id}书山融合2.1${tab}书山融合2.1${title}书山融合2.1${sources}`;\ncontent_url= java.base64Encode(content_url);\ncontent_url= `data:;base64,${content_url},{\"type\":\"qingtian\"}`;\n<\/js>",
        "chapterList": "$.chapter_list\n<js>\nlet book_detail = JSON.parse(java.get('book_detail'));\nlet device;\nlet device_type;\nlet tab = book_detail.tab;\ntry {\n device = java.androidId();\n device_type='安卓';\n} catch (e) {\n device_type='苹果';\n};\n\nif (tab=='小说') {\n\tif (device_type == '安卓') {\n    book.type = 8;} else {\n    \tbook.type = 0;\n    \t}\n } \n else if (tab=='听书') {\n \tif (device_type == '安卓') {\n    book.type = 32;} else {\n    \tbook.type = 1;\n    \t}\n \t} else if (tab=='漫画') {\n \t\tif (device_type == '安卓') {\n    book.type = 64;} else {\n    \tbook.type = 2;\n    \t}\n \t } else if (tab=='短剧') {\n \t\t\tif (device_type == '安卓') {\n    book.type = 8;} else {\n    \tbook.type = 3;\n    \t}\n \t\t \t\t\t} else {\n \t\t \t\t\t\tif (device_type == '安卓') {\n    book.type = 8;} else {\n    \tbook.type = 0;\n    \t}\t\t\n \t\t \t\t\t\t}\n \tresult;\n\t<\/js>",
        "chapterName": "$.title",
        "updateTime": "$.first_pass_time"
    },
    "ruleContent": {
        "content": "<js>\n\nlet res =java.hexDecodeToString(result).split('书山融合2.1');\n\nlet item_id = res[0];\nlet tab = res[1];\nlet title = res[2];\nlet sources = res[3];\nlet tone_id = getArguments(source.getVariable(),'tone_id',String(source.bookSourceComment));\nlet base_url = getArguments(source.getVariable(),'server',String(source.bookSourceComment));\nlet key2 = '';\ntry {\n\tkey2 = String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n\tkey2 = getKey(key2);\n        } catch (e) {key2='';} \nlet device,device_type;\ntry {\n    device = java.androidId();\n    device_type='安卓';\n} catch (e) {\n    try{\ndevice = java.deviceID();\ndevice_type='苹果';\n}catch (e) {device = '';\ndevice_type='安卓';\n}\n}\nlet sq_user_id = getArguments(source.getVariable(),'sq_user_id',String(source.bookSourceComment)) || '0';\n\nlet content_url;\nif (tab=='小说') {\n\tcontent_url= `\/content?item_id=${item_id}&device=${device}&source=${sources}&tab=${tab}&sq_user_id=${sq_user_id}&key=${key2}&version=3`;\n } \n else if (tab=='听书') {\n \t \tcontent_url= `\/content?item_id=${item_id}&device=${device}&tone_id=${tone_id}&source=${sources}&tab=${tab}&key=${key2}&version=3`;\n \t} else if (tab=='漫画') {\n \t\t \tcontent_url=\t`\/content?item_id=${item_id}&device=${device}&source=${sources}&tab=${tab}&key=${key2}&version=3`;\n \t\t} else if (tab=='短剧') {\n \t\tcontent_url=\t`\/content?item_id=${item_id}&device=${device}&source=${sources}&tab=${tab}&key=${key2}&version=3`;\n \t\t\t}\n let data = java.ajax(base_url+content_url);\n try {\nif (JSON.parse(data).msg) {\n\tjava.toast(JSON.parse(data).msg);\n\t}}catch (e) {}\ndata = JSON.parse(data);\nlet content = decrypt(data.content);\ndata = JSON.stringify({'content':content});\n\/\/java.log(decrypt(data.content));\nif (device_type=='安卓' && tab  == '短剧'){\n\tdata = {'content':`【右上角刷新】开启播放(下一集请切换下一章刷新)\\n播放直链:\\n${content}`}\n\tdata = JSON.stringify(data);\n\t if (book.durChapterIndex===chapter.index){\n\t \/\/let b64 = java.base64Encode(generateVideoPage(title,content));\n\t\/\/ let dataUrl = `data:text\/html;base64,${b64}`;\n\t\/\/ \tjava.startBrowser(dataUrl,title);\n\t \tjava.startBrowser(content,title);\n\t \tjava.toast('正在加载视频...');\n\t}};\n\ndata;\n<\/js>\n$.content"
    },
    "bookSourceType": 0,
    "bookSourceComment": "\/*\n请勿修改此处的地址\nhttps:\/\/ga.shusan.xyz\nhttps:\/\/ge.shusan.xyz\/\n*\/\n\n250414更新日志:\n新增快速搜索\n搜索关键词:x:我的     小说搜索\n搜索关键词:m:我的     漫画搜索\n搜索关键词:t:我的      听书搜索\n搜索关键词:d:我的     短剧搜索\n搜索关键词:我的        根据自定义模式搜索\n\n250416更新日志:\n新增快速搜索\n书籍名@来源\n目前支持来源:番茄、七猫、得间、QQ、熊猫、塔读、69书吧、伪69、喜马拉雅、小米、猫眼、百度、米读、顶点、星星小说、笔趣阁22、爱下电子书、搜书神器、得奇\n\n250428更新日志:\n新增河马短剧,七猫短剧\n\n250416更新日志:\n恢复69书吧使用:www.69shuba.com\n由于搜索可靠性不高,可能搜索时间较长,故不加入全部搜索,请点击69书吧搜索使用\n\n250101新增番茄来源\n250203新增七猫来源\n250204新增得间来源\n250204新增QQ来源(仅支持免费小说)\n250204新增熊猫看书\n250210更新日志:\n1.采用全新验证方式,之后未填写密钥,可以在阅读页登陆后刷新阅读页面即可!\n2.搜索默认改为全局搜索,目前仅支持番茄,七猫,QQ,得间,熊猫,后面的按钮是预设,后期会添加相关来源\n3.新增书山书架功能,在登陆里面点击书架查看\n\n下个版本预计更新内容:\n1.预计发现页新增阅读记录和书山书架栏目\n2.预计新增阅读记录,阅读过的书籍可在书山书架-阅读历史中查看\n3.预计新增塔读小说,米读小说,小米阅读,猫眼看书,部分起点\n\n250213更新日志:\n新增塔读,69书吧,笔趣阁,喜马拉雅\n新增书山书架同步功能(书籍详情页刷新同步)\n\n250214更新日志:\n新增小米阅读,修复登录失效的问题\n\n250218更新日志:\n新增百度免费小说,新增猫眼免费小说,新增下载提醒\n\n250218更新日志:\n新增歪瑞古德漫画\n\n250227更新日志:\n开放安卓端短剧模式\n\n250302更新日志:\n修复切换服务器后目录加载失败的问题\n\n250302更新日志:\n修复bug\n\n250304更新日志:\n修复听书模式识别失败bug\n\n250309更新日志:\n修复部分书籍目录加载失败的问题",
    "bookSourceName": "📚书山融合3.0(完全版)",
    "bookSourceUrl": "https:\/\/ga.shusan.xyz",
    "exploreUrl": "<js>\nfunction setArgument(key, value) {\n    var open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '', String(source.bookSourceComment)) || {};\n    open_argument[key] = value;\n    var result = JSON.stringify(open_argument);\n    source.setVariable(result);\n    return result;\n}\n\nfunction getFanqieCookie() {\n    try {\n        return String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com') || '');\n    } catch (e) {\n        return '';\n    }\n}\n\nvar open_argument = source.getVariable();\nvar base_url = getArguments(open_argument, 'server', String(source.bookSourceComment)) || '';\nvar ms = getArguments(open_argument, 'tone_id', String(source.bookSourceComment)) || '';\nvar source_type = getArguments(open_argument, 'source_type', String(source.bookSourceComment)) || '男频';\nvar tab = getArguments(open_argument, 'media', String(source.bookSourceComment)) || '小说';\nvar sources = getArguments(open_argument, 'source', String(source.bookSourceComment)) || '番茄';\n\n\nvar sdtoken;\ntry {\n    var loginInfoMap = source.getLoginInfoMap ? source.getLoginInfoMap() : {};\n    sdtoken = String(loginInfoMap['手动填写番茄token(可不填)'] || '');\n} catch (e) {\n    sdtoken = '';\n}\n\nvar rawCookie = getFanqieCookie() || sdtoken;\nvar match = rawCookie.match(\/sessionid=[^;]+\/);\nvar fqcookie = match ? encodeURIComponent(match[0]) : '';\nif (!fqcookie) {\n    java.toast('您还未登陆番茄账号,无法同步数据哦!');\n    }\nvar fqsjurl = base_url + \"\/bookshelf?page={{page}}&cookie=\" + fqcookie;\n\nvar groupDatas = [];\nvar infoData = [];\n\nfunction deviceType() {\n    try {\n        return !!java.androidId();\n    } catch (e) {\n        return false;\n    }\n}\n\nvar device = deviceType() ? 'android' : 'ios';\nvar hasValidCookie = fqcookie.length > 0;\n\nif (device === 'android' && hasValidCookie) {\n    function groupQuery() {\n        try {\n            var url = base_url + \"\/group_name?cookie=\" + fqcookie;\n            var res = java.ajax(url);\n            var response = JSON.parse(res);\n            \n            if (!(response && response.data)) {\n                  }\n\n            response.data.forEach(function(group) {\n                var keys = Object.keys(group);\n                if (keys.length > 0) {\n                    var key = keys[0];\n                    var value = group[key];\n                    if (value && value.length) {\n                        groupDatas.push({\n                            title: key,\n                            url: base_url + \"\/bookshelf2?page={{page}}&book_ids=\" + value.join(\",\"),\n                            style: {\n                                layout_flexGrow: 1,\n                                layout_flexBasisPercent: 0.45\n                            }\n                        });\n                    }\n                }\n            });\n\n            if (groupDatas.length % 2 !== 0) {\n                groupDatas.push({\n                    title: \"--\",\n                    url: \"\",\n                    style: {\n                        layout_flexGrow: 1,\n                        layout_flexBasisPercent: 0.45\n                    }\n                });\n            }\n        } catch (e) {\n            java.longToast(\"分组获取失败: \" + e.message);\n                    }\n    }\n\n    try {\n        java.longToast(\"正在加载分组数据...\");\n        var sessionid = match ? match[0] : '';\n        var userUrl = base_url + \"\/fquser?\" + sessionid;\n        var userRes = java.ajax(userUrl);\n        var userData = JSON.parse(userRes);\n        \n        var userName = (userData && userData.data && userData.data.name) ? userData.data.name : '未知用户';\n        infoData = [{\n            title: userName + \"个人中心\",\n            url: \"\",\n            style: {\n                layout_flexGrow: 1,\n                layout_flexBasisPercent: 1\n            }\n        }];\n        \n        groupQuery();\n    } catch (e) {\n        java.longToast(\"操作失败: \" + e.message);\n            }\n}\n\nvar style_list = [];\ntry {\n    var durl =  `${base_url}\/discover_style?source=${sources}&source_type=${source_type}&tab=${tab}`;\n    var res = java.ajax(durl);\n    var result = JSON.parse(res);\n    style_list = result.style_list || [];\n    java.toast(result.msg);\n} catch (e) {\n    java.toast(\"发现样式获取失败\");\n}\n\nvar finalData = infoData.concat(groupDatas, style_list);\nJSON.stringify(finalData);\n<\/js>",
    "ruleSearch": {
        "author": "$.author",
        "wordCount": "$.word_number",
        "name": "$.book_name##(别名:.*?)",
        "lastChapter": "<js>\nfunction fq_last() {\n\tlet url = `https:\/\/api5-normal-sinfonlineb.fqnovel.com\/reading\/bookapi\/multi-detail\/v\/?aid=1967&iid=1&version_code=999&book_id={{$.book_id}}`;\n        let last =JSON.parse(java.ajax(url)).data[0]; \n        return last[\"last_chapter_title\"]+\" · \"+java.timeFormat(last[\"last_chapter_update_time\"]*1000);\n\t\n\t}\n\n\t\nfunction qm_last() {\n\tlet headers={'app-version':'51110','platform':'android','reg':'0','AUTHORIZATION':'','application-id':'com.****.reader','net-env':'1','channel':'unknown','qm-params':''}\n\tsign_key='d3dGiJc651gSQ8w1'\n\nparams={'id':{{$.book_id}}, 'imei_ip':'2937357107','teeny_mode':0}\n\nvar urlEncode = function (param, key, encode) {  \n  if(param==null) return '';  \n  var paramStr = '';  \n  var t = typeof (param);  \n  if (t == 'string' || t == 'number' || t == 'boolean') {  \n    paramStr += '&' + key + '=' + ((encode==null||encode) ? encodeURIComponent(param) : param);  \n  } else {  \n    for (var i in param) {  \n      var k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i);  \n      paramStr += urlEncode(param[i], k, encode);  \n    }  \n  }  \n  return paramStr;  \n};\nparamSign=String(java.md5Encode(Object.keys(params).sort().reduce((pre,n)=>pre+n+'='+params[n],'')+sign_key));\nheaderSign=String(java.md5Encode(Object.keys(headers).sort().reduce((pre,n)=>pre+n+'='+headers[n],'')+sign_key))\nparams['sign']=paramSign;\nheaders['sign']=headerSign;\nlet url = \"https:\/\/api-bc.wtzw.com\/api\/v4\/book\/detail?\"+urlEncode(params);\noption = {'headers':headers};\nlet last =JSON.parse(java.ajax(url+','+JSON.stringify(option)))[\"data\"][\"book\"];\nlet last2 =  `${last[\"latest_chapter_title\"]} · ${java.timeFormat(last['update_time']*1000)} `\n\treturn last2\n\t}\n\t\/\/如果要显示最新章节,请去除注释,去除会影响搜索速度\n\/\/if ('{{$.source}}'=='番茄'){\n\/\/\t'番茄:'+fq_last();\n\/\/\t} else if ('{{$.source}}'=='七猫'){\n\/\/\t'七猫:'+qm_last();\n\/\/\t} else {\n\t'{{$.source}} {{$.last_chapter_title}}'\n\/\/\t\t}\n\n<\/js>",
        "checkKeyWord": "我的26岁女房客@番茄",
        "coverUrl": "$.thumb_url",
        "kind": "{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}",
        "bookUrl": "<js>\nlet book_id = result.book_id;\nlet sources = result.source;\nlet tab = result.tab || '小说';\nlet base_url = getArguments(source.getVariable(),'server',String(source.bookSourceComment));\nlet sq_user_id = getArguments(source.getVariable(),'sq_user_id',String(source.bookSourceComment)) || '0';\n`${base_url}\/detail?book_id=${book_id}&source=${sources}&tab=${tab}&sq_user_id=${sq_user_id}`\n<\/js>",
        "intro": "$.abstract",
        "bookList": "$.books"
    },
    "cloudRecordID": "FB5E0E26-3646-4518-A509-18134E89C445",
    "jsLib": "function getKey(key) {\n    const parts = key.split(\";\");\n    for (let part of parts) {\n        if (part.includes(\"secretKey2\")) {\n            return part.split(\"=\")[1];\n        }\n    }\n    return \"\";\n}\n\nfunction getArguments(open_argument,key,servers) {\n    try {\n        open_argument = JSON.parse(open_argument);\n    } catch (e) {\n        const serverList = servers.match(\/https?:\\\/\\\/[^\\s]+\/g);\n        open_argument = {\n            \"media\": \"小说\",\n            \"tone_id\": \"默认音色\",\n            \"server\": serverList[0],\n            \"source\":\"全部\"\n        };\n    }\n    if (key) {return open_argument[key];} else {return open_argument}\n}\n\nfunction generateVideoPage(title, videoUrl) {\n    return `<!DOCTYPE html><html lang=\"zh-CN\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>${title}<\/title><style>body,html{margin:0;padding:0;height:100%}video{width:100%;height:100%;object-fit:cover}.controls{position:absolute;bottom:20px;left:0;right:0;display:flex;justify-content:space-between;align-items:center;padding:0 20px;box-sizing:border-box;opacity:0;transition:opacity 0.3s ease}.controls.show{opacity:1}.progress-bar{flex:1;height:8px;background:rgba(255,255,255,0.2);border-radius:10px;position:relative;margin:0 15px;cursor:pointer}.progress{height:100%;background:linear-gradient(to right,#00c6ff,#0072ff);border-radius:10px}.btn{color:white;background:rgba(0,0,0,0.6);padding:8px 16px;border-radius:25px;cursor:pointer;font-size:16px;border:2px solid rgba(255,255,255,0.2);transition:background 0.3s ease}.btn:hover{background:rgba(0,0,0,0.8);border-color:white}.speed-btn{background:rgba(0,0,0,0.5);border-radius:20px;padding:8px 16px;color:white;font-size:14px;font-weight:bold;cursor:pointer;transition:background 0.3s ease}.speed-btn:hover{background:rgba(0,0,0,0.8)}<\/style><\/head><body><video id=\"video\" controlslist=\"nodownload nofullscreen noremoteplayback\" onclick=\"toggleControls(event)\"><source src=\"${videoUrl}\" type=\"video\/mp4\">您的浏览器不支持 HTML5 视频标签。<\/video><div class=\"controls\" id=\"controls\"><div class=\"btn play-pause\" onclick=\"togglePlayPause()\">⏸️<\/div><div class=\"progress-bar\" onclick=\"seek(event)\"><div class=\"progress\"><\/div><\/div><div class=\"speed-btn\" onclick=\"changeSpeed()\">1x<\/div><\/div><script>const video=document.getElementById('video'),controls=document.getElementById('controls'),progressBar=document.querySelector('.progress-bar'),progress=document.querySelector('.progress'),speedBtn=document.querySelector('.speed-btn'),playPauseBtn=document.querySelector('.play-pause');video.onplay=updateProgress;video.ontimeupdate=updateProgress;function togglePlayPause(){if(video.paused){video.play();playPauseBtn.textContent='⏸️'}else{video.pause();playPauseBtn.textContent='▶️'}}function updateProgress(){const progressPercent=(video.currentTime\/video.duration)*100;progress.style.width=\\`\\${progressPercent}%\\`}function seek(event){const rect=progressBar.getBoundingClientRect(),clickPosition=(event.clientX-rect.left)\/rect.width;video.currentTime=clickPosition*video.duration}function changeSpeed(){const currentSpeed=video.playbackRate;video.playbackRate=currentSpeed<3?currentSpeed+0.5:1;speedBtn.textContent=\\`\\${video.playbackRate}x\\`}function toggleControls(event){if(event.target===video){controls.classList.toggle('show')}else{controls.classList.remove('show')}}window.onload=function(){video.play().catch(function(){console.log('自动播放被阻止')})}<\/script><\/body><\/html>`;\n}\n\neval(function(p,a,c,k,e,r){e=function(c){return(c<62?'':e(parseInt(c\/62)))+((c=c%62)>35?String.fromCharCode(c+29):c.toString(36))};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[3-9abe-hl-oq-zA]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('function decrypt(4){3 i=4.5-1;while(i>=0){3 c=4.l(i);m(c!==\\'\\\\n\\'&&c!==\\'\\\\u200c\\'&&c!==\\'\\\\o\\')break;i--}3 8=4.q(0,i+1);3 r=4.q(i+1);3 9=[];3 a=r.split(\\'\\\\o\\');6(3 p=0;p<a.5;p++){3 b=a[p];m(b.5!==s)continue;3 e=\\'\\';6(3 j=0;j<s;j++){3 t=b.l(j);e+=t===\\'\\\\n\\'?\\'0\\':\\'1\\'}9.u(v.w(parseInt(e,2)))}3 f=9.x(\\'\\');3 7=0;6(3 k=0;k<f.5;k++){7+=f.y(k)}7%=g;3 h=[];6(3 d=0;d<8.5;d++){3 z=8.y(d);3 A=(z-7+g)%g;h.u(v.w(A))}return h.x(\\'\\')}',[],37,'|||var|encryptedStr|length|for|shift|encryptedText|keyChars|parts|part|||binary|key|65536|decrypted||||charAt|if|u200b|u200d||substring|zwPart|16|bit|push|String|fromCharCode|join|charCodeAt|code|decryptedCode'.split('|'),0,{}))",
    "modificationDate": 1748083248336.005,
    "enabled": true,
    "weight": 60,
    "loginUrl": "function login() {\n    let zdyserver;\n    try {\n        zdyserver = String(source.getLoginInfoMap()['自定义服务器(可不填)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            java.toast(`\\n\\n当前服务器为自定义服务器\\n${zdyserver}\\n\\n切换服务器请先清空服务器地址中的数据`);\n        } \n            } catch (error) {\n    }\n    let zdytone_id;\n    try {\n        zdytone_id = String(source.getLoginInfoMap()['听书Ai音色填写后点击右上角✔']);\n        if (zdytone_id) {\n            setArgument('tone_id', zdytone_id);\n        } else {\n            setArgument('tone_id', '默认音色');\n        }\n    } catch (error) {\n    }\n    let sq_user_id;\n    try {\n        sq_user_id = String(source.getLoginInfoMap()['书旗id(可不填)']);\n        if (sq_user_id) {\n            setArgument('sq_user_id', sq_user_id);\n        } else {\n            setArgument('sq_user_id', '0');\n        }\n    } catch (error) {\n    }\n}\n\nfunction qtsj() {\n\tjava.startBrowserAwait(getArgument('server') + '\/online_bookshelf','书山书架');\n\t}\n\n\/\/ 填写密钥\nfunction loginqt() {\n        java.startBrowserAwait(getArgument('server') + '\/login', '登录书山小说书源');\n    }\n\n\/\/登录番茄\nfunction fq_login() {\n    var cookies = cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com')\n    java.log(cookies);\n    if (cookies && cookies != \"\") {\n        java.toast(\"请不要重复登录,请先退出登录!\")\n        return false\n    }\n    try {\n        java.startBrowserAwait(\"https:\/\/fanqienovel.com\/\", \"登录\")\n    } catch (e) {\n        java.toast(e)\n    }\n    try {\n        cookie.removeCookie(\"snssdk.com\")\n    } catch (e) {\n    }\n    var cookies = cookie.getCookie(\"fanqienovel.com\")\n    if (!cookies || cookies == \"\") {\n        java.toast(\"登录失败!\")\n        return false\n    }\n    java.toast(\"登录成功!\")\n    return true\n}\n\n\/\/退出登录\nfunction logout() {\n    cookie.removeCookie(\"fanqienovel.com\");\n    cookie.removeCookie(\"snssdk.com\");\n    \n    const servers = String(source.bookSourceComment).match(\/https?:\\\/\\\/[^\\s]+\/g);\n    for (let server of servers) {\n    cookie.removeCookie(server);\n    }\n    java.toast(\"退出登录成功\");\n}\n\n\/\/获取参数\nfunction getArgument(key) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '',String(source.bookSourceComment));\n    return open_argument[key];\n}\n\n\/\/设置参数\nfunction setArgument(key, value) {\n    let open_argument = source.getVariable();\n    open_argument = getArguments(open_argument, '',String(source.bookSourceComment));\n    open_argument[key] = value;\n    open_argument = JSON.stringify(open_argument);\n    source.setVariable(open_argument);\n    return open_argument;\n}\n\n\/\/设置男女频\nfunction set_source_type(source_type) {\n\t  setArgument(\"source_type\", source_type);\n\t  java.toast(\"\\n发现页已设置为:\"+source_type);\n\t}\n\t\n\/\/首页\nfunction api() { java.startBrowserAwait('https:\/\/fb.shusan.cc', \"首页\");\n}\n\n\/\/打赏\nfunction vip() {\n    java.startBrowserAwait(getArgument('server') + '\/coffee', \"喝咖啡\");\n}\n\n\/\/获取密钥\nfunction hqmy() {\n    java.startBrowserAwait(getArgument('server') + '\/key', \"获取密钥\");\n}\n\nvar server = getArgument('server');\n\n\/\/设置搜索媒体\nfunction set_media(media) {\n    const mediaConfig = {\n        '喜马拉雅': ['听书'],\n        '番茄': ['小说', '听书', '短剧', '漫画'],\n        '七猫': ['小说', '听书', '短剧'],\n        '河马': ['短剧'],\n        '歪瑞古德': ['漫画'],\n        '全部': '*', \/\/ 允许所有模式\n        '默认': ['小说']\n    };\n    \n    const source = getArgument('source');\n    const allowedModes = mediaConfig[source] || mediaConfig['默认'];\n    let targetMedia = mediaConfig['默认'][0]; \n    let isAllowed = false;\n    \n    if (allowedModes === '*' || allowedModes.includes(media)) {\n        targetMedia = media;\n        isAllowed = true;\n    } else if (Array.isArray(allowedModes)) {\n        targetMedia = allowedModes[0]; \n    }\n\n    const message = isAllowed \n        ? `\\n\\n已切换至:${targetMedia}\\n请重新搜索书籍!`\n        : `\\n\\n目前${source}:不支持【${media}】模式!\\n已自动切换至:${targetMedia}`;\n\n    setArgument('media', targetMedia);\n    java.toast(message);\n}\n\n\/\/获取搜索媒体\nfunction get_media() {\n    let media = getArgument('media');\n    if (media == '') {\n        media = '全部';\n    }\n    java.toast(\"\\n\\n当前搜索范围是:\" + media);\n\n}\n\n\/\/获取服务器\nfunction get_server() {\n    var server = getArgument('server');\n    var tishi = '\\n\\n当前服务器:' + server\n    java.toast(tishi);\n    return server\n}\n\n\n\/\/设置服务器\nfunction set_server() {\n    let zdyserver;\n    try {\n        zdyserver = String(source.getLoginInfoMap()['自定义服务器(可不填)']);\n        if (zdyserver.includes('http')) {\n            setArgument('server', zdyserver);\n            java.toast(`\\n\\n当前服务器为自定义服务器\\n${zdyserver}\\n\\n切换服务器请先清空服务器地址中的数据`);\n        } else {\n            zdyserver = '';\n        }\n    } catch (error) {\n        zdyserver = '';\n    }\n    if (!zdyserver) {\n        const servers = String(source.bookSourceComment).match(\/https?:\\\/\\\/[^\\s]+\/g);\n        const currentServer = getArgument('server') || '';\n        const currentIndex = servers.indexOf(currentServer);\n\n        const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % servers.length : 0;\n        const nextServer = servers[nextIndex];\n\n        setArgument('server', nextServer);\n        java.toast(`\\n\\n当前服务器${nextIndex+1}:${nextServer}\\n\\n注意:切换服务器后需要在详情页刷新目录才能生效`);\n    }\n}\n\n\/\/获取音色\nvar tone_id = getArgument('tone_id');\n\nfunction get_tone_id(arg) {\n    var datadist = {\n        \"0\": \"默认音色\",\n        \"-1\": \"阅读模式\",\n        \"-2\": \"漫画模式\",\n        \"51\": \"多人发音\",\n        \"1\": \"甜美少女\",\n        \"2\": \"清亮青叔\",\n        \"5\": \"开朗青年\",\n        \"6\": \"温柔淑女\",\n        \"4\": \"成熟大叔\",\n        \"74\": \"大叔升级\",\n        \"30\": \"优雅御姐\"\n    };\n    var tone_id = datadist[arg] || arg;\n    var tishi = '\\n\\n当前音色:' + tone_id;\n    java.toast(tishi);\n}\n\n\/\/设置音色\nfunction set_tone_id(mode, name) {\n    let zdytone_id;\n    try {\n        zdytone_id = String(source.getLoginInfoMap()['其他音色填写后点击右上角✔']);\n        if (zdytone_id) {\n            setArgument('tone_id', zdytone_id);\n            java.toast(`\\n\\n当前音色为自定义音色\\n${zdytone_id}\\n\\n切换音色请先清空音色输入框中的数据`);\n        } else {\n            zdytone_id = '';\n        }\n    } catch (error) {\n        zdytone_id = '';\n    }\n    if (!zdytone_id) {\n        let toast = \"\\n\\n已切换至:\" + name + '\\n\\n切换后需要刷新详情页';\n        setArgument('tone_id', mode);\n        java.toast(toast);\n    }\n}\n\n\/\/设置来源\nfunction set_source(source) {\n\t          setArgument('source', source);\n\t          set_media('小说');\n            java.toast(`\\n\\n当前来源已切换为:\\n${source}\\n\\n切换后请重新搜索`);\n       }",
    "enabledExplore": true
}
广告