🌞晴天融合2.1(完全版)
http://api.qingtian618.cn:9999
大灰狼 (3463)03/29 15:15
番茄,七猫,得间,塔读,QQ,小米,熊猫,起点(69/笔趣阁/伪69/顶点),喜马拉雅
{ "bookSourceComment": "\/*\n请勿修改此处的地址\nhttp:\/\/api.qingtian618.cn:9999\n*\/\n\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修复部分书籍目录加载失败的问题", "bookSourceGroup": "晴天小说会员专属请勿传播,番茄小说,七猫小说,塔读小说,得间小说,起点小说", "bookSourceName": "🌞晴天融合2.1(完全版)", "bookSourceType": 0, "bookSourceUrl": "http:\/\/api.qingtian618.cn:9999", "concurrentRate": "14\/10000", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "<js>\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\nlet open_argument = source.getVariable();\nlet base_url = getArguments(open_argument,'server',String(source.bookSourceComment));\nlet ms = getArguments(open_argument,'tone_id',String(source.bookSourceComment));\n\nlet sdtoken;\n\ntry {\n sdtoken= String(source.getLoginInfoMap()['手动填写番茄token(可不填)']);\n } catch (e) {\n sdtoken= '';\n }\n\nlet fqsjurl = (String(cookie.getCookie('fanqienovel.com')) || String(java.getCookie('fanqienovel.com')) || sdtoken).replace(\/=\/g, '%3D');\n\/\/let fqsjurl = ''\nif (!fqsjurl) {\njava.toast('您还未登陆番茄账号,无法同步数据哦!');\n}\nfqsjurl = base_url + \"\/bookshelf?page={{page}}&cookie=\" + fqsjurl;\n\nlet data = {\n \"男\": {\n \"玄幻\": 7,\n \"都市\": 1,\n \"洪荒\": 66,\n \"无敌\": 384,\n \"末世\": 68,\n \"诸天万界\": 71,\n \"科幻\": 8,\n \"星际\": 77,\n \"重生\": 36,\n \"系统\": 19,\n \"神豪\": 20,\n \"鉴宝\": 17,\n \"三国\": 67,\n \"二次元\": 39,\n \"历史\": 12,\n \"美食\": 78,\n \"奶爸\": 42,\n \"娱乐圈\": 43,\n \"大唐\": 73,\n \"外卖\": 75,\n \"宠物\": 74,\n \"学霸\": 82,\n \"游戏动漫\": 57,\n \"体育\": 15,\n \"直播\": 69,\n \"年代\": 79,\n \"文化历史\": 62,\n \"海岛\": 40,\n \"神医\": 26,\n \"明朝\": 126,\n \"武侠\": 16,\n \"灵异\": 100,\n \"穿越\": 37,\n \"剑道\": 80,\n \"都市修真\": 124,\n \"赘婿\": 25,\n \"盗墓\": 81,\n \"推理\": 61,\n \"无限流\": 70,\n \"种田\": 23,\n \"战争\": 97,\n \"天才\": 90,\n \"职场\": 127,\n \"悬疑\": 10,\n \"成功励志\": 56,\n \"空间\": 44,\n \"腹黑\": 92,\n \"诗歌散文\": 46,\n \"家庭\": 125,\n \"影视小说\": 45,\n \"生活\": 48,\n \"都市生活\": 2,\n \"扮猪吃虎\": 93,\n \"大秦\": 377,\n \"漫威\": 374,\n \"火影\": 368,\n \"西游\": 373,\n \"龙珠\": 376,\n \"聊天群\": 381,\n \"海贼\": 370,\n \"奥特同人\": 367,\n \"特种兵\": 375,\n \"反派\": 369,\n \"校花\": 385,\n \"女帝\": 378,\n \"单女主\": 389,\n \"神奇宝贝\": 371,\n \"九叔\": 383,\n \"求生\": 379,\n \"无女主\": 391,\n \"武魂\": 386,\n \"网游\": 372,\n \"战神\": 27,\n \"都市脑洞\": 262,\n \"都市种田\": 263,\n \"都市日常\": 261,\n \"历史脑洞\": 272,\n \"玄幻脑洞\": 257,\n \"奇幻仙侠\": 259,\n \"都市青春\": 396,\n \"传统玄幻\": 258,\n \"历史古代\": 273\n },\n \"女\": {\n \"幻想言情\": 32,\n \"现代言情\": 3,\n \"现言甜宠\": 395,\n \"现言脑洞\": 267,\n \"先婚后爱\": 265,\n \"都市日常\": 261,\n \"古言脑洞\": 253,\n \"古言萌宝\": 249,\n \"古言甜宠\": 394,\n \"现言日常\": 269,\n \"现言复仇\": 268,\n \"玄幻言情\": 248,\n \"医术\": 247,\n \"无敌\": 384,\n \"种田\": 23,\n \"萌宝\": 28,\n \"美食\": 78,\n \"游戏动漫\": 57,\n \"娱乐圈\": 43,\n \"直播\": 69,\n \"女扮男装\": 388,\n \"二次元\": 39,\n \"团宠\": 94,\n \"无cp\": 392,\n \"青梅竹马\": 387,\n \"病娇\": 380,\n \"科幻\": 8,\n \"武侠\": 16,\n \"年代\": 79,\n \"重生\": 36,\n \"灵异\": 100,\n \"公主\": 83,\n \"甜宠\": 96,\n \"盗墓\": 81,\n \"系统\": 19,\n \"女强\": 86,\n \"皇后\": 84,\n \"推理\": 61,\n \"文化历史\": 62,\n \"生活\": 48,\n \"反派\": 369,\n \"末世\": 68,\n \"悬疑\": 10,\n \"穿越\": 37,\n \"学霸\": 82,\n \"扮猪吃虎\": 93,\n \"清穿\": 76,\n \"穿书\": 382,\n \"快穿\": 24,\n \"皇叔\": 87,\n \"空间\": 44,\n \"宠妻\": 30,\n \"豪门总裁\": 29,\n \"影视小说\": 45,\n \"成功励志\": 56,\n \"职场\": 127,\n \"民国\": 390,\n \"都市生活\": 2,\n \"腹黑\": 92,\n \"星际\": 77,\n \"天才\": 90,\n \"古代言情\": 5,\n \"家庭\": 125,\n \"兽世\": 72,\n \"校园\": 4,\n \"诗歌散文\": 46,\n \"虐文\": 95,\n \"嫡女\": 88,\n \"王妃\": 85,\n \"精灵\": 89,\n \"马甲\": 266\n }\n};\n\nconst groupDatas = [];\nlet infoData = [];\nfunction deviceType() {\n try {\n return!!java.androidId();\n } catch (e) {\n return false;\n }\n}\nlet device = deviceType()? 'android' : 'ios';\nif (device == 'android' && (String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com')))) {\n function groupQuery() {\n const url = base_url + \"\/group_name?cookie={{String(cookie.getCookie('fanqienovel.com') || java.getCookie('fanqienovel.com'))}}\";\n const res = java.ajax(url);\n const data = JSON.parse(res).data;\n\n data.forEach(group => {\n let key;\n for (key in group) {\n groupDatas.push({\n \"title\": key,\n \"url\": base_url +\"\/bookshelf2?page={{page}}&book_ids=\" + group[key].join(\",\"),\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.45\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 }\n\n try {\n \tjava.longToast(\"请稍等,正在更新分组数据!\");\n \/\/ 用户信息\n const userUrl = base_url + '\/fquser?sessionid={{String(cookie.getKey(\"fanqienovel.com\", \"sessionid\"))}}';\n const userRes = java.ajax(userUrl);\n const userInfo = JSON.parse(userRes).data.name;\n\n infoData = [\n {\n \"title\": `${userInfo}个人中心`,\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n }\n ];\n groupQuery();\n } catch (e) {\n java.longToast(\"网络错误或登录失效或阅读版本过低,请重新登录番茄重试!\");\n }\n\n}\n\n\/\/ 合并数据\nlet datas1 = [\n {\n \"title\": \"番茄官方书架\",\n \"url\": fqsjurl,\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.45\n }\n },{\n \"title\": \"晴天书架\",\n \"url\": base_url + '\/get_user_bookshelf?is_bookshelf=1',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.45\n }\n }];\n\nconst datas2 = [{\n \"title\": \"书籍排行榜 ٩( ˃̶͈̀௰˂̶͈́ )و\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"title\": \"推荐榜单\",\n \"url\": base_url + '\/discover?page={{page}}&side_type=10',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n },\n {\n \"title\": \"完结榜单\",\n \"url\": base_url +'\/discover?page={{page}}&side_type=11',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n },\n {\n \"title\": \"热搜榜单\",\n \"url\": base_url +'\/discover?page={{page}}&side_type=12',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n },\n {\n \"title\": \"黑马榜单\",\n \"url\": base_url +'\/discover?page={{page}}&side_type=13',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n },\n {\n \"title\": \"爆更榜单\",\n \"url\": base_url + '\/discover?page={{page}}&side_type=15',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n },\n {\n \"title\": \"巅峰榜单\",\n \"url\": base_url +'\/discover?page={{page}}&type=0',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n },\n {\n \"title\": \"男频精选\",\n \"url\": base_url + '\/discover?page={{page}}&type=2',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n },\n {\n \"title\": \"女频精选\",\n \"url\":base_url + '\/discover?page={{page}}&type=3',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n },\n {\n \"title\": \"每周推荐\",\n \"url\": base_url +'\/discover?page={{page}}&type=1',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n }];\nconst datas = datas1.concat(infoData, groupDatas, datas2);\n\n\nfunction generateUrl(k, k1, sort, status) {\n return `${base_url}\/discover?offset={{(page - 1) * 10}}&limit=10&tags=${data[k][k1]}&status=${status}&sort=${sort}`;\n}\n\nfor (let k in data) {\n datas.push({\n \"title\": \"❦ \" + k + \"生频道 ❧\",\n \"url\": \"\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n });\n for (let k1 in data[k]) {\n datas.push({\n \"title\": '༺༴ '+k1+' ༴༻',\n \"url\": '',\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 1\n }\n });\n datas.push({\n \"title\": \"推荐排行\",\n \"url\": generateUrl(k, k1, 0, 'ALL'),\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n });\n \n datas.push({\n \"title\": \"评分排行\",\n \"url\": generateUrl(k, k1, 1, 'ALL'),\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n });\n \n datas.push({\n \"title\": \"热门排行\",\n \"url\": generateUrl(k, k1, 2, 'ALL'),\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": 0.27\n }\n });\n }\n}\n\n\n\nJSON.stringify(datas);\n<\/js>", "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}", "lastUpdateTime": "1743232541630", "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('全部')\"\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\": \"喜马拉雅\",\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\n\n ]", "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}\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 api() { java.startBrowserAwait('http:\/\/www.qingtian618.cn', \"首页\");\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 let source = getArgument('source');\n if (source!='番茄' && source!='全部'){\n if (source=='喜马拉雅') {\n setArgument('media', '听书');\n java.toast(\"\\n\\n目前\"+source+\":仅支持听书模式!\");\n }else if (source=='七猫' && media == '听书') {\n setArgument('media', '听书');\n java.toast(\"\\n\\n已切换至:听书\\n请重新搜索书籍!\");\n } else if (source=='歪瑞古德') {\n setArgument('media', '漫画');\n java.toast(\"\\n\\n目前\"+source+\":仅支持漫画模式!\");\n } else {\n setArgument('media', '小说');\n if (media=='小说') {\n java.toast(\"\\n\\n已切换至:\" + media + '\\n请重新搜索书籍!');\n } else {\n java.toast(\"\\n\\n目前\"+source+\":不支持\"+media+\"模式!\");\n }\n }\n } else {\n setArgument('media', media);\n java.toast(\"\\n\\n已切换至:\" + media + '\\n请重新搜索书籍!');\n }\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 }", "respondTime": 180000, "ruleBookInfo": { "author": "$.author", "coverUrl": "$.thumb_url", "init": "$.book_detail", "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 = ` 🎚当前服务器:${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‎';}\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 + `‎\n📚书籍简介:\n${abstract}\\n`};\nif (`${book_review}`) {info = info + `‎\\n${book_review}\\n`};\nif (`${copyright_info}`) {info = info + `📍${copyright_info}`};\n<\/js>", "kind": "", "lastChapter": "$.last_chapter_title", "name": "$.book_name", "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));\n`${base_url}\/catalog?book_id=${book_id}&source=${sources}&tab=${tab}`\n<\/js>", "wordCount": "$.word_number" }, "ruleContent": { "content": "<js>\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 key = '';\ntry {\n\tkey = String(cookie.getCookie(base_url)) || String(java.getCookie(base_url));\n\tkey = getKey(key);\n } catch (e) {key='';}\n \n \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}\n\n\nlet content_url;\nif (tab=='小说') {\n\tcontent_url= `\/content?item_id=${item_id}&device=${device}&source=${sources}&tab=${tab}&key=${key}`;\n } \n else if (tab=='听书') {\n \t \tcontent_url= `\/audio?item_id=${item_id}&device=${device}&tone_id=${tone_id}&source=${sources}&tab=${tab}&key=${key}`;\n \t} else if (tab=='漫画') {\n \t\t \tcontent_url=\t`\/pic?item_id=${item_id}&device=${device}&source=${sources}&tab=${tab}&key=${key}`;\n \t\t} else if (tab=='短剧') {\n \t\tcontent_url=\t`\/video?item_id=${item_id}&device=${device}&source=${sources}&tab=${tab}&key=${key}`;\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) {}\nlet content = JSON.parse(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" }, "ruleExplore": { "author": "author", "bookList": "$.books&&$.data.data\n@js:\nif (baseUrl.includes('cookie'))\n{\n\tvar cookie = (String(cookie.getCookie('fanqienovel.com')) || String(java.getCookie('fanqienovel.com')) || String(source.getLoginInfoMap()['手动填写番茄token(可不填)'])).replace(\/=\/g, '%3D');\n\nif (!cookie || cookie == \"\") {\n java.toast(\"未登录,请先前往登录!\");\njava.startBrowserAwait(\"https:\/\/fanqienovel.com\", \"登录\");\n } \n\t}\n\nresult;", "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>", "coverUrl": "thumb_url", "intro": "{{$.source}}\n{{$.abstract}}", "kind": "{{$.category}}\n{{$.score}}\n{{$.status}}\n{{$.source}}\n{{$.tags}}", "lastChapter": "{{$.last_chapter_title}} • {{$.last_update_time}}", "name": "book_name", "wordCount": "word_number" }, "ruleSearch": { "author": "$.author", "bookList": "$.books", "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>", "checkKeyWord": "我的26岁女房客", "coverUrl": "$.thumb_url", "intro": "$.abstract", "kind": "{{$.status}},{{$.score}},{{$.tags}},{{$.last_chapter_update_time}}", "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>", "name": "$.book_name##(别名:.*?)", "wordCount": "$.word_number" }, "ruleToc": { "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", "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>", "updateTime": "$.volume_name" }, "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='';}\nlet media = getArguments(source.getVariable(),'media',String(source.bookSourceComment));\nlet sources = getArguments(source.getVariable(),'source',String(source.bookSourceComment));\n`${base_url}\/search?title={{key}}&tab=${media}&source=${sources}&key=${key2}`\n<\/js>", "weight": 60 }