🌈八叉书库
https://八叉书库.luoyacheng.ip-ddns.com
lyc486 (807)7天前
1.6.4-云端书架能同步阅读进度,(高隐私防护)
前几期日志:支持云端书架分类显示作者和阅读进度。自动备份账号信息。移动网备用搜索方案(需开启cronet网络组件)
{ "bookSourceComment": "┍ 说明 作者:洛娅橙 ┒\n├────────────────┤\n│①书源默认优化正文加载,可能会导│\n│致下载书籍异常,在该登录界面点击│\n│启用下载即可。 │\n│②登录界面开启同步书架功能,在详│\n│情页下拉刷新两次或书架刷新,会自│\n│动同步至网站书架。 │\n│③支持屏蔽书籍为黑名单,之后在搜│\n│索和发现不再显示屏蔽后的书籍。误│\n│点时,可再次点击进行恢复。 │\n│④输出名单到日志需要在软件其它设│\n│置里开启记录日志功能。 │\n├────────────────┤\n│ │\n│请使用阅读最新测试版导入该书源 │\n└────────────────┘\n┍ 书源作者:洛娅橙 ┒\n├───┬────────────┤\n│!免责│本书源只提供代码进行技术│\n│!声明│交流,请于24小时后删除│\n├───┴────────────┤\n│可在书源登录界面进行登录 │\n│书籍变量可用来进行交互,详情查看│\n│相应界面的变量说明 │\n└────────────────┘\n___________________________________________\n八叉发布页:https:\/\/8xsk.org\nip地址查看:https:\/\/iplark.com", "bookSourceGroup": "🙈,八叉", "bookSourceName": "🌈八叉书库", "bookSourceType": 0, "bookSourceUrl": "https:\/\/八叉书库.luoyacheng.ip-ddns.com", "bookUrlPattern": "https:\/\/www.+\/book\/\\d+\\.html", "concurrentRate": "1000", "coverDecodeJs": "", "customOrder": 0, "enabled": true, "enabledCookieJar": true, "enabledExplore": true, "exploreUrl": "@js:\nlet banben=\"1.6.4\";\nftsm();\neval(String(source.loginUrl));\nlet surl = `{{\t(\nsource.getVariable()+''||cache.get('8xbl1')+''\n).replace(\/\\\\\/$\/,'')}}`;\n\nvar obj = {\n\t最近更: {\n\t\t\"url\": \"\/sort\/0\/{{page}}.html\",\n\t\t\"fg\": 9},\n\t\t'新(肉)':{\n\t\t\"url\": \"\/sort\/7\/{{page}}.html\",\n\t\t\"fg\": 1},\n\t最近入库: {\n\t\t\"url\": \"\/top\/postdate\/{{page}}.html\",\n\t\t\"fg\": 10},\n\t\t\n\t最近完: {\n\t\t\"url\": \"\/modules\/article\/articlelist.php?fullflag=1&page={{page}}\",\n\t\t\"fg\": 9,\n\t\t\"wrap\": true},\n\t\t'结(肉)':{\n\t\t\"url\": \"\/modules\/article\/articlelist.php?sortid=7&fullflag=1&page={{page}}\",\n\t\t\"fg\": 1},\n\t签约新书: {\n\t\t\"url\": \"\/top\/signtime\/{{page}}.html\",\n\t\t\"fg\": 10},\n\t\t\n\t字数榜: {\n\t\t\"url\": \"\/top\/words\/{{page}}.html\",\n\t\t\"wb\": true},\n\t收藏榜: {\n\t\t\"url\": \"\/top\/goodnum\/{{page}}.html\"},\n\t新书榜: {\n\t\t\"url\": \"\/top\/newhot\/{{page}}.html\"},\n\t\t\n\t总点击: {\n\t\t\"url\": \"\/top\/allvisit\/{{page}}.html\",\n\t\t\"wb\": true},\n\t月点击: {\n\t\t\"url\": \"\/top\/monthvisit\/{{page}}.html\"},\n\t周点击: {\n\t\t\"url\": \"\/top\/weekvisit\/{{page}}.html\"},\n\t\t\n\t总推荐: {\n\t\t\"url\": \"\/top\/allvote\/{{page}}.html\",\n\t\t\"wb\": true},\n\t月推荐: {\n\t\t\"url\": \"\/top\/monthvote\/{{page}}.html\"},\n\t周推荐: {\n\t\t\"url\": \"\/top\/weekvote\/{{page}}.html\"},\n\t\t搜索: {\n\t\t\turl: \t`{{\n\t\t\t\tlet surl = (\nsource.getVariable()+''||cache.get('8xbl1')+''\n).replace(\/\\\\\/$\/,'');\n\t\t\t\tif (page == 1) {\n\t\t\t\t\ttry {\n\t\t\t\t\tlet [cb,cf] = colorz();\n\t\t\t\t\tsvg=\\`<svg width=\"990\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect width=\"100%\" height=\"150%\" fill=\"#\\${cb}\"\/><text fill=\"#\\${cf}\" text-anchor=\"middle\" dominant-baseline=\"middle\" stroke=\"#000000\" stroke-width=\"1\" font-weight=\"bold\"><tspan x=\"50%\" dy=\"30%\" font-size=\"100\">请输入搜索关键词<\/tspan><tspan x=\"50%\" dy=\"50%\" font-size=\"50\">此处搜索不支持完整书名<\/tspan><\/text><\/svg>\\`;\n\tsvg=java.base64Encode(svg);\n\tkeyy=java.getVerificationCode('data:image\/svg+xml;base64,'+svg);\n\t\t\t\t\t} catch(err) {keyy='系统';\n\t\t\t\t\tPackages.java.lang.Thread.sleep(500);\n\t\t\t\t\tjava.toast('使用默认关键词“系统”');}\n\t\t\t\t\tsource.put('keyy',keyy);\n\t\t\t\t\t\t}\n\t\t\t\telse keyy = source.get('keyy');\n\t\t\t\turl =\tsurl+'\/modules\/article\/search.php?searchkey='+keyy+'&searchtype=all&page='+page;\n\t\t\t\turl\n\t\t\t}}`,\n\t\t\t\"fb\": 0.3,\n\t\t\t\"wb\": true},\n\t我的书架: {\n\t\t\"url\": `{{\n\t\t\tif (page == 1) {\n\t\tlet surl = (\nsource.getVariable()+''||cache.get('8xbl1')+''\n).replace(\/\\\\\/$\/,'');\n\t\tlet ck = source.getLoginHeader()||'';\n\t\tcookie.replaceCookie(surl,ck);\n\t\tck ? surl+'\/modules\/article\/bookcase.php' : java.longToast('请登录账号');\n\t\t} else \"data:;base64,aHR0,{'type':'fx'}\";\n\t\t}}`,\n\t\t\"fb\": 0.3}\n\t}\n\nvar sort = [];\npush = (title, url, size, wrap, cc) => sort.push({\n \"title\": title,\n \"url\": url.startsWith(\"{{\") ? url : url ? surl + url : \"\",\n \"style\": {\n layout_flexGrow: size || 1,\n layout_flexBasisPercent: cc || -1,\n layout_wrapBefore: wrap ? wrap : false\n }\n });\n\nfor (x in obj) {\npush(x, obj[x].url, obj[x].fg, obj[x].wb, obj[x].fb);\n}\n\n\/\/版本号\npush(\"版本号:\"+banben+\" 点我刷新地址\", `{{if(page==1) {\n\tlet uu=source.getVariable()+'';\n\tuu&&cache.put('8xbl1', uu);\n\tsource.setVariable(''); gengxin();\n\teval(String(source.loginUrl));\tuu==source.getVariable()&&java.longToast('源地址没有更新');}\n\t\"data:;base64,aHR0,{'type':'fx'}\"}}`, 1, true);\npush(\"测速\/更新\",`{{eval(String(source.loginUrl));gengxin(); Packages.java.lang.Thread.sleep(100); ceshi(); \"data:;base64,aHR0,{'type':'fx'}\"}}`, 1);\n\nJSON.stringify(sort);", "header": "@js:\n(()=>{\n nn = String(source.getVariable());\n let ck = cookie.getCookie(nn);\n let i = String(ck).includes(\"jieqiUserInfo\");\n if (!i&&source.getLoginHeader()) cookie.setCookie(nn,source.getLoginHeader()+'');\n let headers = {\n \t'User-Agent': ua,\n \t'x-requested-with': x_r_w,\n \t'sec-ch-ua': s_c_u,\n \t'sec-ch-ua-platform': s_c_u_p,\n \t'Accept-language': \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n \t'Referer': nn,\n \t'Cookie': ck\n \t };\n \t return JSON.stringify(headers);\n})();", "jsLib": "ua = 'Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/135.0.0.0 Safari\/537.36 Edg\/135.0.0.0';\n\nx_r_w = ''; \/\/com.microsoft.emmx\ns_c_u_p = `\"Windows\"`;\ns_c_u = `\"Microsoft Edge\";v=\"135\", \"Not-A.Brand\";v=\"8\", \"Chromium\";v=\"135\"`;\nfunction colorz() {\n\tconst {java, source} = this;\n\tlet cb,cf;\n\ttry {\n\t\tcb = source.getLoginInfoMap().get('封面背景颜色');\n\t\tif (cb=='') throw '空';\n\t\t} catch(err) {cb='151E27';}\n\ttry {\n\t\tcf = source.getLoginInfoMap().get('封面字体颜色');\n\t\tif (cf=='') throw '空';\n\t\t} catch(err) {cf='dddddd';}\nreturn [cb,cf];\n}\n\nfunction hexToInt(e, t) {\n var r = e.substr(t, 2);\n return parseInt(r, 16);\n }\nfunction decodeEmail(n, c) {\n var o = \"\", a = hexToInt(n, c), i = c + 2;\n for (i; i < n.length; i += 2) {\n var l = hexToInt(n, i) ^ a;\n o += String.fromCharCode(l);\n }\n o = decodeURIComponent(escape(o));\n return o\n}\n\n\nfunction ftsm(){\n\tconst {java, source} = this;\n\tlet nm = source.get('8xftn');\n\tif(nm==''||nm<0) {nm=3;}\nif(nm>0) {\n\tnm--;\n\tsource.put('8xftn',nm);\n\tlet ss = String(source.bookSourceComment).match(\/\\n┍[^┘]+┘\/)[0];\n\tjava.longToast(ss+'\\n该弹窗剩余次数:'+nm);\n\tPackages.java.lang.Thread.sleep(2000);\n\tjava.longToast(ss+'\\n该弹窗剩余次数:'+nm);}\n}\n\nfunction gengxin(){\nconst {java, source} = this;\n\tlet url0='https:\/\/gitee.com\/lyc486\/yuedu2\/commits\/main\/书源\/八叉\/8x.json?browser_history=0&page=1&per=4';\n\tlet rr0=java.get(url0,{'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)','X-Requested-With': 'XMLHttpRequest'}).body();\n\tlet \tgxlrr = com.jayway.jsonpath.JsonPath.read(rr0, '$.list[0:4].title');\n\tlet [gxlr, gxlr2, gxlr3, gxlr4] = gxlrr;\n\tlet banben = String(source.exploreUrl).match(\/let banben=\"([\\d\\.]+)\"\/)[1];\n\tgxlr=String(gxlr).split(\/^([^\\-]+)-\/);\n\tgxlr[0]=='' ? '' : gxlr=['','0',gxlr[0]];\n\tlet gxts;\n\tif (gxlr[1]>banben){gxts=['更新','0,140,186'];}\n\telse {gxts= ['导入','76,175,80'];};\n\tlet htm = `data:text\/html;charset=utf-8,<html>\n<head>\n<title>更新<\/title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\ntable {\n\ttext-align: center;\n\tmargin: 2em auto 0 auto;\n\t}\nth span{font-size: 1.2em;}\n.ann {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 50vh;\n\t}\nbutton {\n\tbackground-color: rgb(${gxts[1]});\n\tcolor: white;\n\tborder: none;\n\tborder-radius: 4px;\n\theight: 6vh;\n\twidth: 30vw;\n\toverflow: hidden;\n\t}\nbutton span {\n cursor: pointer;\n display: inline-block;\n position: relative;\n transition: 0.4s;\n}\nbutton span:after {\n content: '>';\n position: absolute;\n opacity: 0;\n top: 0;\n right: 30px;\n transition: 0.2s;\n}\nbutton:active span {\n padding-right: 20px;\n}\nbutton:active span:after {\n opacity: 1;\n right: -40px;\n}\n<\/style>\n<\/head>\n<body>\n<table border=\"1\" cellspacing=\"0\">\n<th colspan=\"2\">最新日志:<span>${gxlr[2]}<\/span><\/th>\n<tr>\n<td>仓库版本:${gxlr[1]}<\/td>\n<td>本地版本:${banben}<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" style=\"text-align: left;\">往期日志:${gxlr2}<br> ${gxlr3}<br> ${gxlr4}<\/td>\n<\/tr>\n<\/table>\n<div class=\"ann\">\n<a href=\"legado:\/\/import\/importonline?src=https:\/\/gitee.com\/lyc486\/yuedu2\/raw\/main\/书源\/八叉\/8x.json\">\n<button><span>${gxts[0]}<\/span><\/button>\n<\/a>\n<\/div>\n<a href=\"legado:\/\/import\/importonline?src=https:\/\/cdn.jsdelivr.net\/gh\/Luoyacheng\/yuedu@main\/书源\/八叉\/8x.json\" style=\"font-size: 10px;\">备用链接<\/a>\n<\/body>\n<\/html>`;\nif(typeof this.book=='undefined'||gxts[0]=='更新') java.startBrowser(htm,'更新');\r\n}\n\nfunction tbshujia(iuu,iid){\nconst {java, source} = this;\nlet iuux=iuu+'\/modules\/article\/addbookcase.php';\nlet iuuy=String(iuu+'\/book\/'+iid+'.html'); \/\/需要转化否则报错\nlet tm = new Date().getTime();\nlet body = `bid=${iid}&ajax_request=${tm}`;\nlet ck = source.getLoginHeader()||'';\nlet headers = {\r\n 'User-Agent': ua,\n 'x-requested-with': x_r_w,\n 'sec-ch-ua-platform': s_c_u,\r\n 'referer': iuuy,\n 'cookie': ck\r\n };\nif (String(ck).includes(\"jieqiUserInfo\") ) {\n\/\/ let by = java.post(iuux,body,headers).body();\nlet by = java.connect(iuux+','+JSON.stringify(\n \t{method: \"POST\",\n \theader: headers,\n \tbody: body})\n \t);\njava.longToast('\\n'+this.book.name+':\\n'+by.body());\nreturn true;}\nreturn false;\n}\n\nfunction hmdjib(id,name){\nconst {java, source, cache} = this;\n\tlet hmd=cache.get('8xhmd')||'{}';\n\thmd=JSON.parse(hmd);\n\tlet i=false;\n\ttry {\n\t\tlet rgstr = source.getLoginInfoMap().get('正则书名黑名单');\n\t\tlet rg = eval(String(rgstr));\n\t\ti=rg.test(name);\n\t\t} catch(err) {}\n\ttry {\n\t\tif (i) {\n\t\tlet rgstr = source.getLoginInfoMap().get('正则书名白名单');\n\t\tlet rg = eval(String(rgstr));\n\t\t i=!rg.test(name);\n\t\t }\n\t\t} catch(err) {}\n\t\ti = i||(id in hmd);\n\t\treturn i;\n\t}\n\nOranges = `<path d=\"M646.4 763.6c150.1-15.8 267.1-142.7 267.1-297 0-164.9-133.7-298.7-298.7-298.7-154.8 0-282.1 117.8-297.2 268.7\" fill=\"#FA9F23\" p-id=\"5624\"><\/path><path d=\"M648.6 784.8l-4.5-42.4c67.7-7.1 130.3-39 176.3-89.7 46.3-51.1 71.7-117.2 71.7-186.1 0-74.1-28.8-143.7-81.2-196.1-52.4-52.4-122-81.2-196.1-81.2-69.2 0-135.5 25.6-186.6 72.2-50.8 46.3-82.5 109.2-89.3 177.3l-42.5-4.2c7.8-78.6 44.4-151.2 103-204.6 59-53.7 135.5-83.3 215.4-83.3 85.5 0 165.8 33.3 226.3 93.7 60.4 60.4 93.7 140.8 93.7 226.3 0 79.6-29.4 155.9-82.8 214.8-53 58.3-125.2 95.1-203.4 103.3z\" fill=\"#333333\" p-id=\"5625\"><\/path><path d=\"M161.5 832.4c116.6 116.6 305.7 116.6 422.4 0s116.6-305.7 0-422.4\" fill=\"#FA9F23\" p-id=\"5626\"><\/path><path d=\"M372.7 941.2c-85.5 0-165.8-33.3-226.3-93.7l30.2-30.2c52.4 52.4 122 81.2 196.1 81.2s143.7-28.8 196.1-81.2c52.4-52.4 81.2-122 81.2-196.1s-28.8-143.7-81.2-196.1l30.2-30.2c60.4 60.4 93.7 140.8 93.7 226.3S659.4 787 599 847.5c-60.5 60.4-140.8 93.7-226.3 93.7z\" fill=\"#333333\" p-id=\"5627\"><\/path><path d=\"M161.480941 832.416461a170.7 298.7 44.999 1 0 422.418218-422.432964 170.7 298.7 44.999 1 0-422.418218 422.432964Z\" fill=\"#FBE0C3\" p-id=\"5628\"><\/path><path d=\"M249.1 885.8c-9.3 0-18.4-0.7-27.2-2-30.5-4.6-55.9-16.8-75.5-36.4-19.6-19.6-31.8-45-36.4-75.5-4.2-28-1.7-59 7.4-92.4 18.1-66.2 60.5-135.2 119.5-194.2S364.9 384 431.1 366c33.3-9.1 64.4-11.6 92.4-7.4 30.5 4.6 55.9 16.8 75.5 36.4s31.8 45 36.4 75.5c4.2 28 1.7 59-7.4 92.4C609.9 629 567.5 698 508.5 757s-128 101.4-194.2 119.5c-22.9 6.2-44.7 9.3-65.2 9.3z m18-370.2c-53.8 53.8-92.4 116.1-108.5 175.2-15 55-8.6 99.9 18 126.5s71.5 33 126.5 18c59.2-16.1 121.4-54.7 175.2-108.5 53.8-53.8 92.4-116.1 108.5-175.2 15-55 8.6-99.9-18-126.5s-71.5-33-126.5-18c-59.1 16.2-121.4 54.7-175.2 108.5z\" fill=\"#333333\" p-id=\"5629\"><\/path><path d=\"M373.3 641.5h148.4c-16.2 23.8-35.8 47.6-58.5 70.2-28.9 28.9-59.7 52.9-90 71.1l0.1-141.3z m187.1-193.4c27 37.3 15.7 103.4-25.2 172.1H388.3l172.1-172.1zM351.9 656.6v138.2c-61.4 31.7-118.7 38.6-152.4 14.2l152.4-152.4z m-152.5-15.1h137.4L184.6 793.8c-24-33.9-16.9-91.1 14.8-152.3z m173.9-182.6c68.5-40.9 134.5-52.4 172-25.9l-172 172V458.9z m-91.1 71.8c22.5-22.5 46.1-42 69.7-58.1v147.6H211.4c17.6-29.1 40.4-58.6 67.8-86.5l3-3z\" fill=\"#F5A74A\" p-id=\"5630\"><\/path><path d=\"M625.8 266.5l-13.5 9.9c-1.9 1.4-4.6 1-6-0.9-0.6-0.9-0.9-1.9-0.8-3l1.8-16.7L592 249c-2.2-1-3.1-3.5-2.2-5.6 0.4-1 1.2-1.8 2.2-2.2l15.3-6.8-1.8-16.7c-0.3-2.3 1.4-4.4 3.8-4.7 1.1-0.1 2.1 0.2 3 0.8l13.5 9.9 13.5-9.9c1.9-1.4 4.6-1 6 0.9 0.6 0.9 0.9 1.9 0.8 3l-1.8 16.7 15.3 6.8c2.2 1 3.1 3.5 2.2 5.6-0.4 1-1.2 1.8-2.2 2.2l-15.3 6.8 1.8 16.7c0.3 2.3-1.4 4.4-3.8 4.7-1.1 0.1-2.1-0.2-3-0.8l-13.5-9.9z\" fill=\"#333333\" p-id=\"5631\"><\/path><path d=\"M799.4 313.5m-12.8 0a12.8 12.8 0 1 0 25.6 0 12.8 12.8 0 1 0-25.6 0Z\" fill=\"#333333\" p-id=\"5632\"><\/path><path d=\"M828.4 348.3m-12.8 0a12.8 12.8 0 1 0 25.6 0 12.8 12.8 0 1 0-25.6 0Z\" fill=\"#333333\" p-id=\"5633\"><\/path>`;\n\nfunction jinghuafm() {\nconst {java, source} = this;\t\nfunction splitString(str) {\n const length = str.length;\n if (length < 15) {\n return length<9 ? [str] : [\n str.slice(0, 7),\n str.slice(7)\n ].filter(s => s);\n } else if (length < 20) {\n return [\n str.slice(0, 7),\n str.slice(7,13),\n str.slice(13)\n ].filter(s => s);\n } else if (length < 24) {\n return [\n str.slice(0, 7),\n str.slice(7,13),\n str.slice(13,18),\n str.slice(18)\n ].filter(s => s);\n } else {\n return [\n str.slice(0, 7),\n str.slice(7, 13),\n str.slice(13, 18),\n str.slice(18, 22),\n str.slice(22)\n ].filter(s => s);\n }\n}\nfunction pingString(ss) {\nlet rr='';\nlet l1=ss.length;\nfor (let i1=0; i1<l1; i1++) {\n\tlet c1=ss[i1], l2=c1.length;\n\tfor (let i2=0; i2<l2; i2++) {\n\t\tlet c2=c1.charAt(i2);\n\t\trr += `<tspan x=\"${100+180*ii}\" y=\"${180+170*(i2+i1)}\">${c2}<\/tspan>`;\n\t\t}\n\t\tii++;\n\t}\n\treturn rr;\n}\n\nlet [cb,cf] = colorz();\n\nlet bknm=String(this.book.name).replace(\/\\.{2,}\/,'…');\nbknm=bknm.match(\/[a-z][a-z\\+一-ꀀ\\d…]+|[一-ꀀ\\da-z]{2,}(?:\\.\\d+[一-ꀀ]*|[…?])?|[一-ꀀ]\/gi);\nlet hz='';\nlet ii=0;\n\nfor (let char of bknm) {\n\thz += pingString(splitString(char) );\n\t}\n\nlet svg = `<svg class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" p-id=\"5623\" width=\"100%\" height=\"100%\">\n<rect width=\"100%\" height=\"150%\" fill=\"#${cb}\"\/>\n<g transform=\"scale(0.4) translate(1600,2500)\">${Oranges}<\/g>\n<text fill=\"#${cf}\" stroke=\"#000000\" stroke-width=\"2\" font-weight=\"bold\" font-size=\"150\" text-anchor=\"middle\" dominant-baseline=\"middle\">\n${hz}\n<\/text>\n<\/svg>`;\nsvg=java.base64Encode(svg);\nreturn 'data:image\/svg+xml;base64,'+svg;\n}\n", "lastUpdateTime": "1745330066873", "loginCheckJs": "var pres = result.raw().priorResponse();\nvar isRedirect = pres!=null&&pres.isRedirect();\nif (isRedirect) {\n\tlet url=String(result.url()).match(\/^https?:\\\/\\\/[^\\\/]+\\\/\/)[0];\n\t\/luoyacheng\/.test(url)||source.setVariable(url);}\n\/\/ java.toast('登录检查:'+result);\nlet code = result.code();\nif (code == 403) {\n\tjava.toast('\\n访问被拒绝');\n\t}\nelse if (code == 520) {\n\tjava.toast('\\nIP被拉黑');\n\t}\nresult", "loginUi": "[\n {\n name: \"账号\",\n type: \"text\"\n },\n {\n name: \"密码\",\n type: \"password\"\n },\n {\n name: \"💍注册\",\n type: \"button\",\n action: \"web()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n {\n name: \"🔺登 录🔺\",\n type: \"button\",\n action: \"Login()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": -1\n }\n },\n {\n name: \"♤登出\",\n type: \"button\",\n action: \"re()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n {\n \tname: \"💬说明\",\n \ttype: \"button\",\n \taction: \"sm()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": -1,\n \"layout_wrapBefore\": true\n }\n \t},\n \t{\n name: \"🧾延迟测试\",\n type: \"button\",\n action: \"ceshi()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": -1\n }\n },\n \t{\n name: \"⏭️启用下载\",\n type: \"button\",\n action: \"downl()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": -1\n }\n },\n \t{\n name: \"🌐打开本书↓\",\n type: \"button\",\n action: \"webb()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": -1,\n \"layout_wrapBefore\": true\n }\n },\n \t{\n name: \"❌屏蔽\",\n type: \"button\",\n action: \"hmd()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n \t{\n name: \"🧹清理\",\n type: \"button\",\n action: \"hmdre()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n {\n name: \"书名\",\n type: \"text\"\n },\n \t{\n name: \"🆕版本更新\",\n type: \"button\",\n action: \"gengxin()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": -1\n }\n },\n \t{\n name: \"♻️同步书架\",\n type: \"button\",\n action: \"shujia()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n \t{\n name: \"🌐书架\",\n type: \"button\",\n action: \"webbs(1)\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n {\n name: \"正则书名黑名单\",\n type: \"text\"\n },\n {\n name: \"正则书名白名单\",\n type: \"text\"\n },\n \t{\n name: \"🌐查看日志\",\n type: \"button\",\n action: \"gitee()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": -1,\n \"layout_wrapBefore\": true\n }\n },\n \t{\n name: \"🌐网站选书\",\n type: \"button\",\n action: \"webbs(2)\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n \t{\n name: \"🔁书名\",\n type: \"button\",\n action: \"shuming()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n \t{\n name: \"🗻净化封面\",\n type: \"button\",\n action: \"jhfm()\",\n \"style\": {\n \"layout_flexGrow\": 1,\n \"layout_flexBasisPercent\": -1\n }\n },\n \t{\n name: \"🌐书源介绍\",\n type: \"button\",\n action: \"java.startBrowser('https:\/\/www.luoyacheng.ip-ddns.com\/#八叉','介绍');\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n \t{\n name: \"🤔反馈\",\n type: \"button\",\n action: \"java.startBrowser('https:\/\/github.com\/Luoyacheng\/yuedu\/issues','8x反馈');\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n },\n {\n name: \"封面背景颜色\",\n type: \"text\"\n },\n {\n name: \"封面字体颜色\",\n type: \"text\"\n },\n \t{\n name: \"🌐网页登录\",\n type: \"button\",\n action: \"weblogin()\",\n \"style\": {\n \"layout_flexGrow\": 0,\n \"layout_flexBasisPercent\": -1\n }\n }\n]", "loginUrl": "nn = String(source.getVariable()).replace(\/\\\/$\/,'');\nif (!nn) {\nlet rr=cache.getFromMemory('baxsur')||java.connect('https:\/\/www.8xsk.org\/');\ncache.putMemory('baxsur',rr);\nlet ur=(rr.body().match(\/电脑主站[^\"]+\\\"([^\"]+)\\\"\/)||['',''])[1];\nlet x = cache.get('8xbl1');\nif (ur == '') {\n\tjava.longToast(\"书源地址获取失败💔\");\n\tsource.setVariable(x);\n\tPackages.java.lang.Thread.sleep(300);\n\t}\nelse {\n\tif (ur != x) {\n\t\t\tjava.log(\"八叉源地址更新:\"+ur);\n\t\t\tjava.longToast(\"🎉书源地址已更新\");\n\t\t\tcache.put('8xbl1',ur);\n\t\t\tPackages.java.lang.Thread.sleep(300);}\n\tsource.setVariable(ur);\n\tnn = ur.replace(\/\\\/$\/,'');;\n\t}\n}\n\nfunction login(){}\r\nfunction Login(){\n\tif (String(source.getLoginHeader()).includes(\"jieqiUserInfo\")) {\n\t\t\/\/验证登出\n\t\tjava.longToast('请先在该界面登出账号');}\n\telse {\n\tsource.removeLoginHeader();\n\tcookie.removeCookie(nn);\n\tjava.toast('正在获取验证码');\n\tlet webr=java.ajax(nn);\n\twebr = org.jsoup.Jsoup.parse(webr);\n\tlet url0 = webr.select('#t_imgccode').attr('onclick');\nlet imageObj = {\n\tsrc: null,\n\tupdateSrc() {\n\t\teval(url0+[]);\n\t\treturn this.src;}\n};\nurl0 = imageObj.updateSrc();\n\/^http\/.test(url0)||java.toast('\\n💔获取验证码失败');\n let code=java.getVerificationCode(url0);\n let ck = cookie.getCookie(nn);\r\n let url = nn+'\/login.php';\r\n let un = result['账号'];\r\n let pw = result['密码'];\r\n let time = new Date().getTime();\n let body = `username=${un}&password=${pw}&checkcode=${code}&usecookie=1&act=login&jumpreferer=1&t_btnlogin=&ajax_request=${time}`;\n\nlet headers = JSON.parse(eval(source.header.replace('@js:','')+''));\nheaders['Referer']=nn;\n \n if (un!=''&&pw!=''&&url0!='') {\n \tjava.toast('登录中...');\n \t\/\/移动网用post函数会Connection reset\n \/\/let cookie1 = java.post(url,body,headers).cookies();ck = cookie.mapToCookie(cookie1);\n let cookie1 = java.connect(url+','+JSON.stringify(\n \t{\"method\": \"POST\",\n \theader:headers,\n \tbody:body})\n \t);\nlet ck=cookie1.headers().values(\"Set-Cookie\");\nlet cookieParts = [];\nfor (let char of ck) {\n\tchar=(char+'').replace(\/;.+\/,'');\n\tcookieParts.push(char);}\n\tck=cookieParts.join('; ');\n source.putLoginHeader(ck);\n let i = String(ck).includes(\"jieqiUserInfo\");\n \/\/会存入登录信息,无需点✓\r\n if (i) {source.putLoginInfo(JSON.stringify(result));java.toast(\"\\n登录成功,VIP模式💎\");}\r\n else {\n let reb=\tcookie1.body()+'';\n \tjava.toast(\"\\n登录失败:\"+(reb.length<30?'\\n'+reb:cookie1.code()+',访客模式🔒'));\n \tjava.log('登录失败原因:'+reb);}\n } else {java.toast(\"💔账号和密码不能为空\");}\n \/\/已登出的情况\n }\n\r\n}\n\nfunction weblogin(){\n\tsource.removeLoginHeader();\n\tlet url = nn.replace('www.','') + '\/login.php';\n\tjava.startBrowserAwait(url, '八叉登录');\n\tPackages.java.lang.Thread.sleep(300);\n\tlet ck = cookie.getCookie(nn);\n\tlet i = String(ck).includes(\"jieqiUserInfo\");\n\tif (i) {source.putLoginHeader(ck);\n\tjava.toast(\"网页登录成功,VIP模式💎\");}\n\telse java.toast(\"网页登录失败,未获取到账号cookie\");\n\t}\r\n\r\nfunction web(){\r\n let url = nn.replace('www.','') + '\/register.php';\n cookie.removeCookie(url);\r\n java.startBrowser(url, '八叉注册');\r\n}\n\nfunction ceshi(){\n\t[' ','· ','·· ','···'].forEach((_,i) => {java.toast('\\n\\n测试中'+_+'\\n');Packages.java.lang.Thread.sleep((3-i)*100);}); \/\/然并卵的动画(但是好看)\n\ttry {\n const startTime=new Date().getTime();\n\t\/\/java.head(nn,{\t'user-agent': ua});\n\tjava.ajax(nn);\n\tconst endTime=new Date().getTime();\n\tlet speed = (endTime - startTime) \/ 1000;\n\tspeed = speed.toFixed(2);\n\tjava.toast('\\n\\n延迟:'+speed+'秒\\n');\n\t} catch(err) {java.longToast(err);}\n\r\n}\n\n\r\nfunction re(){\n\tjava.toast('稍等');\n\tjava.ajax(nn+'\/userdetail.php');\n\t\/\/输出一份数据到日志,以备需\n\tjava.log('\\n账号:'+result['账号']+'\\n密码:'+result['密码']);\n\t\/\/消除相应数据\r\n cookie.removeCookie(nn);\n source.removeLoginHeader();\n result['账号']=result['密码']='';\n source.putLoginInfo(JSON.stringify(result));\n cache.deleteMemory('8xid');\n java.toast(\"回到访客模式🔒\");\r\n}\n\r\nfunction sm(){\nlet banben = String(source.exploreUrl).match(\/let banben=\"([\\d\\.]+)\"\/)[1];\nlet ss = String(source.bookSourceComment).match(\/^[^┘]+┘\/);\nlet cki = String(source.getLoginHeader()).includes(\"jieqiUserInfo\");\n let ms= \"访客模式🔒\";\n if (cki != '') {\r\n ms = \"VIP模式💎\";\r\n }\r\nlet tt = `\n网址:${nn} \n模式:${ms} \n版本:${banben} \n\n${ss}`;\n java.longToast(tt);\r\n}\nfunction webck(){\n\tlet nnm=nn.replace('www.','');\n\tlet ck=source.getLoginHeader()||'';\n\tif (ck) {\n\tcache.put('8xbff',source.getLoginInfo());\n\tcache.put('8xbff2',ck);\n\tcookie.replaceCookie(nnm,ck);}\n\treturn nnm;\n\t}\nfunction webb(){\n\tlet id = cache.getFromMemory('8xid');\n if (id) {\n \tid=Object.keys(id)[0];\n \tlet nnm=webck();\n java.startBrowser(`${nnm}\/book\/${id}.html`,'八叉');\n } else {java.toast('\\n请在书籍界面点击或刷新书籍');}\n}\n\nfunction webbs(x){\n\tlet nnm=webck();\n\tif (x==1) {nnm+='\/modules\/article\/bookcase.php';}\n\tlet wr=java.startBrowserAwait(nnm,'web',false).body();\n\tlet bkid=(wr.match(\/https.+\\\/book\\\/(\\d+).*\\.html\/)||['',''])[1];\n\tlet url = \"legado:\/\/import\/addToBookshelf?src=\"+nn+\"\/book\/\"+bkid+\".html,{origin:'https:\/\/八叉书库.luoyacheng.ip-ddns.com'}\";\n\tif (bkid!='') java.openUrl(url);\n}\n\nfunction hmd(){\n\tlet id = cache.getFromMemory('8xid');\n\tif (id) {\n\tlet hmd = cache.get('8xhmd')||'{}';\n\thmd = JSON.parse(hmd);\n\tlet idd = Object.keys(id)[0];\n\tif (idd in hmd) {\n\t\tdelete hmd[idd];\n\t\tcache.put('8xhmd',JSON.stringify(hmd),0);\n\t\tjava.longToast('\\n已将书籍:'+Object.values(id)[0]+'\\n移除黑名单😅');\n\t\t}\telse {\n\thmd = Object.assign({},hmd,id);\n\tcache.put('8xhmd',JSON.stringify(hmd),0);\n\tjava.longToast('\\n已将书籍:'+Object.values(id)[0]+'\\n加入黑名单😤');}\n\t\n\t} else {java.toast('\\n请在书籍界面点击或刷新书籍');}\n\t\n}\n\nfunction hmdre(){\n\tlet hmd=cache.get('8xhmd')||'{}';\n\thmd=JSON.parse(hmd);\n\tlet ss=Object.entries(hmd);\nlet [cb,cf] = colorz();\nlet svg=`<svg width=\"990\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n<style>\ntext {\n\twhite-space: pre;\n\tword-wrap: break-word;}\n<\/style>\n<rect width=\"100%\" height=\"150%\" fill=\"#${cb}\"\/>\n<text fill=\"#${cf}\" text-anchor=\"middle\" dominant-baseline=\"middle\" stroke=\"#000000\" stroke-width=\"1\" font-weight=\"bold\">\n<tspan x=\"50%\" dy=\"30%\" font-size=\"100\">\n是否清空黑名单<tspan font-size=\"30\">(${ss.length})<\/tspan>\n<\/tspan>\n<tspan x=\"42%\" dy=\"25%\" font-size=\"60\">输入“确认”进行清空<\/tspan>\n<tspan x=\"50%\" dy=\"20%\" font-size=\"50\">输入“名单”打印一份名单到日志<\/tspan>\n<tspan x=\"50%\" dy=\"20%\" font-size=\"50\">输入书籍ID单独移出黑名单<tspan font-size=\"30\">(名单查看)<\/tspan><\/tspan>\n<\/text>\n<\/svg>`;\nsvg=java.base64Encode(svg);\n\ntry {\n\/\/拦截验证码报错\nlet ysr=java.getVerificationCode('data:image\/svg+xml;base64,'+svg);\nPackages.java.lang.Thread.sleep(100);\nif (ysr=='确认') {\n\tcache.delete('8xhmd');\n\tjava.toast('\\n已清空');\n}\nelse if (ysr=='名单') {\n\tjava.log('\\n💔8x黑名单:\\n'+ss.join('\\n'));\n\tcache.put('8xbff',source.getLoginInfo());\n\tcache.put('8xbff2',source.getLoginHeader());\n}\nelse if (\/\\d{3,}\/.test(ysr)) {\n\tif (ysr in hmd) {\n\tjava.toast('\\n已将书籍:'+hmd[ysr]+'\\n移除黑名单');\n\tdelete hmd[ysr];\n\tcache.put('8xhmd',JSON.stringify(hmd),0);\n\t} else {java.toast('移出失败');}\n}\nelse if (ysr=='恢复') {\n\tlet ryr=cache.get('8xbff');\n\tlet ryr2=cache.get('8xbff2');\n\tsource.putLoginInfo(ryr);\n\tsource.putLoginHeader(ryr2);\n\tjava.toast('\\n已恢复账号信息');\n}\n\n} catch(err) {}\n}\n\nfunction downl() {\nlet dn = source.get('8xdn');\nif(dn!=1) {source.put('8xdn',1);java.toast('已支持下载');}\nelse {source.put('8xdn',0);java.toast('已优化加载');}\n\t}\nfunction shujia() {\nlet dn = source.get('8xsj');\nif(dn!=1) {source.put('8xsj',1);java.toast('🟢已启用同步网站书架');}\nelse {source.put('8xsj',0);java.toast('⚫已关闭同步网站书架');}\n\t}\nfunction shuming() {\nlet sm = source.get('8xsm');\nif(sm!=1) {source.put('8xsm',1);java.toast('🟢书名跟随更新');}\nelse {source.put('8xsm',0);java.toast('⚫书名保持初始');}\n\t}\nfunction jhfm() {\nlet jhf = source.get('8xjhf');\nif(jhf!=1) {source.put('8xjhf',1);java.toast('😈净化封面');}\nelse {source.put('8xjhf',0);java.toast('😍显示封面');}\n\t}\n\nfunction gitee() {\njava.startBrowser(`https:\/\/gitee.com\/lyc486\/yuedu2\/commits\/main\/书源\/八叉\/8x.json,{\n\t\t'headers': {\n\t\t\t'User-Agent': 'Mozilla\/5.0 (Linux; Android 14)'}\n\t\t\t}`,'日志');\n}", "respondTime": 9789, "ruleBookInfo": { "author": "", "canReName": "", "coverUrl": "class.divbox [email protected]@src\n<js>\nlet jhf=source.get('8xjhf');\nif (jhf=='1') result=jinghuafm();\nresult\n<\/js>", "init": "<js>\n\/\/重定向和导入书架处理\nlet i = String(book.bookUrl).includes('https:\/');\nif (i) {\n\tbook.bookUrl = `data:;base64,${java.base64Encode(baseUrl.replace(\/,{o.+\/,''))},{'type':''}`;\n\t}\n\n\/\/告诉目录是由详情来的\njava.put('sx1',1);\n\nnn = String(source.getVariable()).replace(\/\\\/$\/,'');\nif (nn=='') {\n\t{{source.loginUrl}}\n\tnn = String(source.getVariable()).replace(\/\\\/$\/,'');}\n\n\/\/发书评功能\nlet bkbl = book.getVariable(\"custom\");\n\/\/解书籍地址\nlet ml = String(book.bookUrl).replace(\/.+,(.+),.+\/,'$1');\nlet mlj = java.base64Decode(ml);\nlet [, bkid=''] = mlj.match(\/book\\\/(\\d+)\/)||[];\n\/\/↑获取书id\njava.put('bkid',bkid);\n\nif (bkbl=='🔒'||bkbl=='') {\n\/\/带🔒或书籍变量为空会经过这里\n\/\/处理加书架功能\nlet sj=java.get('sj');\nlet sj2=source.get('8xsj'); \/\/启用同步的标识\nif (sj=='2'&&sj2=='1') {java.put('sj',3);tbshujia(nn,bkid);}\nelse if (sj=='1') {java.put('sj',2);}\n\n\t}\nelse if (bkbl=='目录') {\n\t\/\/清空最新章储存强制刷新目录\n\tjava.put('8xzx','');\n\t\/\/清空输入的书籍变量\n\tbook.putCustomVariable('');}\nelse {\nlet pfurl = nn+'\/modules\/article\/rating.php';\nlet plurl = nn+'\/modules\/article\/reviews.php';\nlet ck = source.getLoginHeader()||'';\nlet cki = ck.match(\/UserToken%3D([^%]+)\/)||['',''];\ntk = cki[1];\n\/\/↑获取链接和tk\n\nif (bkid != '' && tk != '') {\nlet tm = new Date().getTime();\nlet bkfs = (bkbl.match(\/^(\\d|10)分$\/) || ['','0'])[1];\nlet pfbody = `score=${bkfs}&id=${bkid}&ajax_request=${tm}`;\nlet plbody = `ptitle=&act=newpost&jieqi_token=${tk}&Submit=&pcontent=${bkbl}&aid=${bkid}&ajax_request=${tm}`;\n\nlet headers = JSON.parse(eval(source.header.replace('@js:','')+''));\nheaders['Referer']=mlj;\n\nif (bkfs != 0) {url=pfurl;body=pfbody;}\nelse {url=plurl;body=plbody;}\n\/\/清空输入的书籍变量\nbook.putCustomVariable('');\n\/\/let by = java.post(url,body,headers).body();\nlet by = java.connect(url+','+JSON.stringify(\n \t{\"method\": \"POST\",\n \theader:headers,\n \tbody:body})\n \t).body();\njava.longToast(\"\\n\"+java.htmlFormat(by));\n\/\/随机延时0-1秒\nlet tim = Math.floor(Math.random()*1001);\nPackages.java.lang.Thread.sleep(tim);\ncache.deleteMemory('bax'+bkid);\n\t} else if (tk == '') {java.toast('未登录');}\n}\n\nif (!i) {\n\t \/\/i时直接用重定向访问结果\nresult=cache.getFromMemory('bax'+bkid);}\n\n\/\/先发评论再访问刷新\nif (!result) {\n\tlet tt = java.hexDecodeToString(src);\n\t\/\/不能直接访问tt,result无法改动\n\ttt=String(tt).replace(\/https\\:\\\/{2}[A-z\\d\\.]+\/,'');\n\tconst startTime=new Date().getTime();\n\tresult = java.ajax(nn+tt)+'';\n\tconst endTime=new Date().getTime();\n\tlet speed = (endTime - startTime)\/1000;\n\tif (speed>39) {java.toast('\\n详情页访问延迟过长:'+speed.toFixed()+'秒');}\n\tresult&&cache.putMemory('bax'+bkid,result);\n\t}\n\tjava.setContent(result+[]);\n\n\/\/内容判断\nlet r = java.getString('@@meta[name=\"keywords\"]@content');\nlet name=String(r).replace(\/\\, .+\/,'');\nlet author=String(r).replace(\/.+\\, \/,'');\n\nif (name) {\n\tbook.name=String(book.name)||name;\n\tbook.author=String(book.author)||author;\n\/\/放入书名\nlet Info=source.getLoginInfoMap()||{};\nInfo['书名'] = book.name;\nsource.putLoginInfo(JSON.stringify(Info));\n\/\/放入ID和书名。正式版该语法会报错\ncache.putMemory('8xid',{[bkid]: book.name});\n\tif (book.name!=name) {\n\t\t\tlet sm=source.get('8xsm'),sm1=java.get('sm1');\n\t\t\t\/\/sm功能标记,sm1判断标记\n\t\t\tif (sm1=='') {\n\t\t\t\/\/可能源地址换新了,进行更新\n\t\t\tcache.put('8xbl1', source.getVariable() );\n\t\t\tsource.setVariable('');\n\t\t\tjava.put('sm1',1);\n\t\t\t} else if (sm=='1') {\n\t\t\t\tbook.name=name;\n\t\t\t\tjava.toast(\"已自动更新书名\");\n\t\t\t} else if (sm1=='1') {\n\t\t\t\tjava.longToast(\"详情页获取的书名:\\n《\"+name+\"》\");\n\t\t\t\tjava.log(\"书名:\"+name);\n\t\t\t\tjava.put('sm1',2);\n\t\t\t}\n\t\t\t\n}\telse if (book.author!=author) {\n\t\/\/ book.author=author;\njava.log(\"获取的作者不同,作者:\"+author);} \/\/仅输出日志\n\t\n\t\/\/书名和作者正常由此过\n\t}\nelse {\n\t\/\/书名加载失败\n\tcache.put('8xbl1', source.getVariable() );\n\tsource.setVariable('');\n\tjava.toast(\"详情页加载失败,请刷新重试\");\n}\n\tresult\n<\/js>", "intro": "{{\n\/\/书名过长时在简介显示\nlet length = 0;\nlet fuhao = ',.?!:;()[]\"';\n\nfor (char of String(book.name)) {\n\tif (fuhao.includes(char) ) length += 0.5;\n\telse length += 1;\n\t}\n\/\/大于18个全角字符\nif (length > 18) '《'+book.name+'》'\nelse ' '\n}}\n{{\nlet zx = java.getString('class.divbox@h3@a@text');\nlet temp=java.getStringList('[email protected]@td[0:3,9,10]@text');\nrr=Object.values(temp);\n\/\/处理rr\n[rr[0], rr[2]] = [rr[2], rr[0]];\nrr[0] = '最新:' + String(zx).replace(\/^正文|^\\s+\/,'') + String(rr[0]).replace('最后更新:',' ').replaceAll('-','\/') + String(rr[1]).replace(\/连载状态:(.+)\/,' ($1)');\ndelete rr[1];\nrr[2] = String(rr[2]).replace(\/作品分类:\\s*\/,'分类:') + String(rr[3]).replace(\/作品性质:(.+)\/,' ($1)');\ndelete rr[3];\nrr[4] = String(rr[4]).replace(\/总点击数:\\s*\/,'点击:') + String(rr[5]).replace(\/本月点击:(.+)\/,' $1 (月)');\ndelete rr[5];\n\/\/评分\nlet pf=java.getString('.ratediv@text');\nlet r0 = rr.join('\\n') + '\\n' + String(pf).replace(\/评分:\\s*\/,'评分:');\n\/\/简介\nlet r1=java.getString('.tabcontent .tabvalue:eq(0) div@html');\nif (r1==\"\") {r1='';}\nelse {\n r1 = '\\n简介:\\n' + String(r1).replace(\/[\\u3000\\u2003]{2}\/g,'\\n').replace('「','“').replace('」','”').replace(\/\\>\\s*内容简介\/,'')\n\t}\n\/\/评论\nlet r2=String(java.getString('#content>.c_row@html'));\n\nlet xi = book.getVariable(\"custom\")==\"🔒\";\nif (r2==''||xi) {r2='';}\nelse {\n\tr2 = r2\n\t.replace(\/<div class=\"c_subject\"[\\S\\s]+?div>|<span class=\"fr\"[\\S\\s]+?span>|点击:.+(?=回复)\/g,' ')\n\t.replace(\/回复:.+c_value\">0\/g,'')\n\t.replace(\/<p[>\\ ].+<\\\/p>\/g,'﹍');\n\t}\n\tr0 + r1 + r2\n}}", "kind": "b:contains(标签:)~a@text\n<js>\nString(result).slice(1, -1).replace(\/[\\#\\,]\/g,'').split(' ');\n<\/js>", "lastChapter": "class.divbox@h3@a@text\n<js>\nlet zx = java.get('8xzx');\nif (zx==result) java.put('ww',1);\nelse {java.put('8xzx',result);java.put('ww',0);}\nresult\n<\/js>", "name": "", "tocUrl": "<js>\n\/\/解书籍url为http\nlet ml = String(book.bookUrl).replace(\/.+,(.+),.+\/,'$1');\nlet mlj = java.base64Decode(ml);\nif (mlj.includes('search.php') ) {java.toast('书籍地址异常');}\n\/\/转化目录url\nlet mll = mlj.replace('\/book\/', '\/read\/');\n`data:;base64,${java.base64Encode(mll)},{'type':''}`;\n<\/js>", "wordCount": ".tabcontent .tabvalue.1@html##全文字数:(\\d+)##$1###" }, "ruleContent": { "content": "<js>\nlet bin = book.durChapterIndex;\nlet cin = chapter.index;\nlet inn = cin - bin;\nlet dn = source.get('8xdn');\nlet sleep = Packages.java.lang.Thread.sleep;\n\/\/java.log(chapter.title+'inn:'+inn);\nif ((inn==-4||inn==4)&&dn!=1) {java.longToast('\\n使用下载需要在书源登录界面开启功能\\n建议预下载设定不要大于3');}\n\nnn = String(source.getVariable()).replace(\/\\\/$\/,'');\nif (nn=='') {\n\t{{source.loginUrl}}\n\tnn = String(source.getVariable()).replace(\/\\\/$\/,'');}\n\nlet tim = Math.floor(Math.random()*401);\nlet ii = 1;\n\/\/手动限制并发,下载时(0-40秒随机)\n\nswitch(inn) {\n\tcase 0: break;\n\tcase 1: sleep(1500+tim); break;\n\tcase 2: sleep(4500+tim); break;\n\tcase 3: sleep(7500+tim); break;\n\tcase -1: sleep(3000+tim); break;\n\tcase -2: dn==1 ? sleep(6000+tim) : ii=0;break;\n\tcase -3: dn==1 ? sleep(9000+tim) : ii=0;break;\n\tdefault: dn==1 ? sleep(tim*100) : ii=0;break;\n}\n\n\/\/延时结束\nlet bkid = java.get('bkid'); \/\/两个putm用\n\nif (inn==0||inn==1) {\n\/\/放入书名和id\ncache.putMemory('8xid',{[bkid]: book.name});\nlet Info=source.getLoginInfoMap()||{};\nInfo['书名'] = book.name;\nsource.putLoginInfo(JSON.stringify(Info));\n\/\/ 本地阅读进度\nlet sjj=source.get('sj'+bkid)+'';\nif (java.get('sj')==3||sjj) {\tsource.put('sj'+bkid,book.author+','+book.durChapterTitle+','+book.durChapterIndex);}\n}\n\n\nlet tt = java.hexDecodeToString(result);\ntt=String(tt).replace(\/https\\:\\\/{2}[A-z\\d\\.]+\/,nn);\n\/\/java.log('正文地址:'+tt);\nlet ml = String(book.tocUrl).replace(\/.+,(.+),.+\/,'$1');\nlet mlj = java.base64Decode(ml);\n\nif (ii) {\n\/\/↓第一次访问正文\ntry {\nconst startTime=new Date().getTime();\nresult=java.ajax(tt);\nconst endTime=new Date().getTime();\nlet speed = (endTime - startTime)\/1000;\nif (speed>39) java.toast('\\n正文页访问延迟过长:'+speed.toFixed()+'秒');\n\/\/复原手机版链接,干掉字数统计\nchapter.url = tt.replace('www.','');\n\n\/\/拦截超时报错\n} catch (e) {if (\/timeout\/.test(e)) java.toast('正文超时'); else {inn==0&&java.toast('正文异常:'+e);}\njava.log('八叉正文出错:'+e);}\n\/\/ if ii 结束\n\t} else {result='';}\n\/\/inn>1时为空,软件会自动重新获取\n\nlet rr = java.getString('class.mt mb@a@text||class.tc mb@a@text',result);\n\n\/\/内容识别\nif (rr.includes(\"登录\") ) {\n\tjava.toast(\"💎请重新登录书源账号\");\n\tresult='';}\nelse if (rr.includes(\"充值\") ) {\nlet url = nn+'\/modules\/obook\/buychapter.php';\nlet ck = source.getLoginHeader();\nif (ck==null) java.toast(\"💎书源未获取到登录信息\");\nlet tk = (ck.match(\/UserToken%3D([^%]+)\/)||['',''])[1];\nlet cid = tt.match(\/cid\\=(\\d+)\/)[1];\nlet body = `buytype=1&act=buy&jieqi_token=${tk}&cid=${cid}&submit=`;\nlet headers = JSON.parse(eval(source.header.replace('@js:','')+''));\nheaders['Referer']=tt;\n\n\nif (tk && nn) {\n\tsleep(600-tim);\n\tlet pt = java.connect(url+','+JSON.stringify(\n \t{\"method\": \"POST\",\n \theader:headers,\n \tbody:body})\n \t);\n let lc = pt.url()+'';\n\/\/\tlet pt = java.post(url,body,headers);\n\/\/\tlet lc = pt.header(\"location\");\n java.toast(\"已为你自动购买\");\n\t\/\/重新解析正文\n\tlc.includes('buychapter') ? java.toast('\\n未获取到购买重定向链接') : result = java.ajax(lc);\n\t} else {java.longToast(\"💔VIP内容获取失败\"); result='';}\n\n} else {\n\/\/无VIP登录,正常直接加载\n}\n\nresult = java.getString('[id*=\"content\"]@html',result);\n\/\/检查\nif ([19,339].includes(cin)&&Math.abs(inn)<4) gengxin();\nresult\n<\/js>", "imageStyle": "", "nextContentUrl": "", "payAction": "", "replaceRegex": "##八叉书库|八叉~书库|八叉书[,~]库|(?:833330|8xsk)\\.(?:xyz|org)|(?:833330|8xsk|八叉)([^\\.])(?:xyz|yxz|org|书库)|八~叉|书~库##$1", "sourceRegex": "", "title": "" }, "ruleExplore": { "author": "td.2@text||span:contains(作者:)+span@text\n<js>\nif (result == '[email protected]') {\n\tlet hex = java.getString('.__cf_email__.0@data-cfemail');\n\tresult = decodeEmail(String(hex),0);\n\t}\nelse if (baseUrl.includes('\/bookcase.php') ) {\n\tjava.put('sj',3); \/\/标识已经同步了书架,作者名称读取缓存\n\tlet sj=source.get('sj'+java.get('bkid'));\n\tresult=sj.split(',')[0]||'';\n\t}\n\tresult\n<\/js>", "bookList": "<js>\nif (baseUrl.startsWith('http:\/\/localhost') ) {\n\t\tresult = [];\n}\nelse if (baseUrl.includes('search.php?') ) {\nlet r1 = java.getString('#content .blockcontent@text');\nif (r1.includes(\"错误原因\")) {java.longToast(r1);result = [];}\nelse {result = java.getElement('#jieqi_page_contents>div');}\n\t}\nelse if (baseUrl.includes('\/book\/') ){\njava.toast('暂不支持重定向结果');\nresult=[];\n\t}\nelse if (baseUrl.includes('\/bookcase.php') ) {\n\t\/\/我的书架\n\tlet ts= java.getString('table@caption@ownText');\n\tts=String(ts).replace(\/.*(可收藏 .+已收藏[^,。]+).*$\/,'\\n$1');\n\tsource.get('sjts')!=ts&&java.toast('\\n'+ts);\n\tsource.put('sjts',ts);\n\tPackages.java.lang.Thread.sleep(100);\n\tresult = java.getElement('table tr:has(a)');\n\t}\nelse {\nresult = java.getElements('@@#jieqi_page_contents>tr||#content div[class=\"c_row cf\"]');\n}\nresult\n<\/js>", "bookUrl": "@js:book.bookUrl", "coverUrl": "<js>\nlet jhf=source.get('8xjhf');\nif (jhf=='1') img=jinghuafm();\nelse {\n\nif (\/articlelist|sort\/.test(baseUrl)) {\n\timg = java.getString('img@src');\n\t}\nelse if (baseUrl.includes('search.php?') ) {\n\timg = java.getString(String(source.ruleSearch.coverUrl));\n\t}\nelse{\n\tid = java.getString('[email protected]@href').match(\/\\d+(?=\\.html)\/);\n\nif (baseUrl.includes('\/bookcase.php') ) {id = java.getString('[email protected]@href').match(\/aid=(\\d+)\/)[1];}\n\n if (id < 1000) n = 0;\n else n = String(id).slice(0,-3);\nimg = `https:\/\/www.8xbook.org\/files\/article\/image\/${n}\/${id}\/${id}s.jpg`;\n}\n\n}\nimg\n<\/js>", "intro": "<js>\nresult = java.getString('td.3@text||class.c_description@text')+'';\nif (baseUrl.includes(\"top\/words\")) {'⠀\\n字数:'+(result\/10000).toFixed(2)+'万'}\nelse if (baseUrl.includes(\"top\/goodnum\")) {'⠀\\n收藏数:'+result}\n\/\/新书榜\nelse if (baseUrl.includes(\"top\/newhot\")) {\n\tresult = result>9999 ? \t(result\/10000).toFixed(2)+'万' : result;\n\t'⠀\\n点击数:'+result}\nelse if (baseUrl.includes(\"top\/signtime\")) {\n let t = parseInt(result)*1000;\n let time = java.timeFormatUTC(t,\"⠀\\n签约时间:yy\/MM\/dd HH:mm:ss\",8*60*60*1000);\n time}\nelse if (baseUrl.includes(\"top\/lastupdate\")) {'⠀\\n字数:'+(result\/10000).toFixed(2)+'万'}\nelse if (baseUrl.includes(\"top\/postdate\")) {'⠀\\n入库时间:'+result}\nelse if (baseUrl.includes(\"top\/allvisit\")) {\n\tresult = result>999 ? \t(result\/10000).toFixed(2)+'万' : result;\n\t'⠀\\n总点击:'+result}\nelse if (baseUrl.includes(\"top\/monthvisit\")) {\n\tresult = result>999 ? \t(result\/10000).toFixed(2)+'万' : result;\n\t'⠀\\n月点击:'+result}\nelse if (baseUrl.includes(\"top\/weekvisit\")) {\n\tresult = result>9999 ? \t(result\/10000).toFixed(2)+'万' : result;\n\t'⠀\\n周点击:'+result}\nelse if (baseUrl.includes(\"top\/allvote\")) {'⠀\\n总推荐:'+result}\nelse if (baseUrl.includes(\"top\/monthvote\")) {'⠀\\n月推荐:'+result}\nelse if (baseUrl.includes(\"top\/weekvote\")) {'⠀\\n周推荐:'+result}\nelse if (\/articlelist|sort|search\\.php\/.test(baseUrl)) {\n\/\/含简介(搜索会经此)\nresult.replace('「','“').replace('」','”').replace(\/\\s+\/g,' ')}\nelse if (baseUrl.includes('\/bookcase.php') ) {\n\tlet sj=source.get('sj'+java.get('bkid'));\n\tsj=sj.split(',')[1]||'';\n\t(sj==''||sj=='null')?'':'\\u200b\\n当前阅读进度:'+sj;\n\t}\nelse {''}\n<\/js>", "kind": "<js>\nif (baseUrl.includes('search.php?') ) {java.getStringList(String(source.ruleSearch.kind));}\nelse if (baseUrl.includes('\/bookcase.php') ) {\n\tjava.getStringList('td.4@text');}\nelse {java.getStringList('td[4,5]@text||span:contains(更新:)+span@text||a486@time');}\n<\/js>", "lastChapter": "<js>\nif (baseUrl.includes('search.php?') ) {\tjava.getString(String(source.ruleSearch.lastChapter));}\nelse if (baseUrl.includes('\/bookcase.php') ) {\n\tjava.getString('[email protected]@text');}\n\telse {java.getString('[email protected]@text||[email protected]@text');}\n<\/js>", "name": "<js>\nif (baseUrl.includes('search.php?') ) {\nresult=String(java.getString('.c_subject@text')).replace(\/\\\"\/g,'');\n\/\/获取id目的\nrs = java.getString('[email protected]@href');\n\t}\nelse if (baseUrl.includes('\/bookcase.php') ) {\n\t\t\tresult = java.getString('[email protected]@text');\n\t\/\/我的书架需要转化链接\n\t\trs = java.getString('[email protected]@href');\trs='https:\/\/www.8xbook.org\/book\/'+rs.match(\/aid=(\\d+)\/)[1]+'.html';\n\t\n\t}\nelse {\n\t\tresult = java.getString('[email protected]@text||[email protected]@text');\n\trs = java.getString('[email protected]@href||[email protected]@href');\n}\n\n\nnn = String(source.getVariable()).replace(\/\\\/$\/,'');\nif (!nn) {\n\t{{source.loginUrl}}\n\tnn = String(source.getVariable()).replace(\/\\\/$\/,'');\n\t}\nrr = String(rs).replace(\/https\\:\\\/{2}[A-z\\d\\.]+\/, nn);\nbook.bookUrl=`data:;base64,${java.base64Encode(rr)},{'type':''}`;\n\n\/\/获取id,黑名单时书名为空\nlet id = rs.match(\/book\\\/(\\d+)\/)[1];\njava.put('bkid',id);\nlet i = hmdjib(id,result);\nif (i) {result='';}\nresult\n<\/js>", "wordCount": "<js>\nif (\/articlelist|sort\/.test(baseUrl)) {\n java.getString('span:contains(字数:)+span@text');\n}\nelse if (baseUrl.includes('search.php?') ) {\tjava.getString(String(source.ruleSearch.wordCount));\n\t}\n<\/js>" }, "ruleSearch": { "author": "span:contains(作者:)+span@text", "bookList": "<js>\njava.setContent(cache.get('8xss1')||result);\ncache.delete('8xss1');\nlet r1 = java.getString('#content .blockcontent@text');\nif (r1.includes(\"错误原因\")) {java.longToast(r1);result=[];}\nelse {\n\tresult = java.getElement('#jieqi_page_contents>div');\n}\nresult\n<\/js>", "bookUrl": "[email protected]@href\n<js>\n`data:;base64,${java.base64Encode(result)},{'type':''}`\n<\/js>", "checkKeyWord": "作者:棺材", "coverUrl": ".fl img@src\n<js>\nlet jhf=source.get('8xjhf');\nif (jhf=='1') result=jinghuafm();\nresult\n<\/js>", "intro": ".c_description@text\n<js>\nresult.replace('「','“').replace('」','”').replace(\/\\s\/g,' ')\n<\/js>", "kind": "span:contains(更新:)+span@text&&span:contains(关键字:)+span@text\n<js>\nString(result).replace(\/[\\[\\]\\#\\,]\/g,'').split(' ');\n<\/js>", "lastChapter": "span:contains(最新章节:)+span@text", "name": ".c_subject@text\n<js>\n\/\/获取id,黑名单时书名为空\nlet id = java.getString('[email protected]@href');\nid = id.match(\/book\\\/(\\d+)\/)[1];\n\/\/java.log(result); \/\/输出书名\nlet i = hmdjib(id,result);\nif (i) {result='';}\nresult\n<\/js>", "wordCount": "span:contains(字数:)+span@text" }, "ruleToc": { "chapterList": "<js>\nlet tim = Math.floor(Math.random()*31);\nPackages.java.lang.Thread.sleep(tim);\nnn = String(source.getVariable()).replace(\/\\\/$\/,'');\nif (nn=='') {\n\t{{source.loginUrl}}\n\tnn = String(source.getVariable()).replace(\/\\\/$\/,'');}\nlet sj=java.get('sj');\nif (sj=='') java.put('sj',1); \/\/书架标识\nlet ww = java.get('ww'),\nlyc = java.get('lyc'),\nsx1 = java.get('sx1'); \/\/ww是否有新章,sx刷新标识从目录来(已在书架才会触发)\njava.put('sx1',0); \/\/还原详情到目录标识\nlet sj2=source.get('8xsj'); \/\/启用同步的标识\nlet bkid=java.get('bkid');\n\nif (sx1!='1') {\n\t let baxtime = cache.getFromMemory('baxtime');\n\t if (baxtime<Date.now()) baxtime=Date.now();\n\t baxtime+=4000;\n\tcache.putMemory('baxtime',baxtime);\n\twhile(Date.now()<baxtime) {\n\tPackages.java.lang.Thread.sleep(4000);}\n\t}\nif (sj!='3'&&sx1!='1'&&sj2=='1'&&bkid!='') {tbshujia(nn,bkid)&&java.put('sj',3);}\n\/\/不为3未加书架,不为1不过详情,为1开启功能,且参数不为空\nlet sjj=source.get('sj'+bkid)+'';\nif (sjj&&book.durChapterIndex==0) {\n\t\/\/反向同步进度\nbook.durChapterIndex=sjj.split(',')[2]||0;}\nelse if (java.get('sj')==3&&!sjj) {\n\t\/\/标记进源储存\nsource.put('sj'+bkid,book.author+','+book.durChapterTitle+','+book.durChapterIndex);}\n\nif (ww!='1' || lyc=='' || sx1!='1') {\nlet tim = Math.random()*1501|0;\nlet tt = java.hexDecodeToString(result);\ntt=String(tt).replace(\/https\\:\\\/{2}[A-z\\d\\.]+\/,'');\nPackages.java.lang.Thread.sleep(tim);\nconst startTime=new Date().getTime();\nresult = java.ajax(nn+tt);\nconst endTime=new Date().getTime();\nlet speed = (endTime - startTime)\/1000;\nif (speed>39) {java.toast('\\n目录页访问延迟过长:'+speed.toFixed()+'秒');}\n\/\/缩减储存\nresult=java.getString('.index@all',result)+'';\nresult && java.put('lyc',result);\n} else {result=lyc;}\njava.setContent(result);\nresult=java.getElement('.index dd, .index dt');\n<\/js>", "chapterName": "dd a,dt@text##八叉书库|八叉书[。·]库|8xsk?[。·]org|八叉~书库|八~叉书~库", "chapterUrl": "a@href\n<js>\n`data:;base64,${java.base64Encode(result)},{'type':''}`;\n<\/js>", "formatJs": "", "isPay": "", "isVip": "", "isVolume": "dt@text", "preUpdateJs": "", "updateTime": "{{@@dd@a@title##\\d{1,2}\\:\\d{1,2}更新,共(\\d+字).*## $1}}\n{{@@dd@em@text##.+##💎}}" }, "searchUrl": "<js>\neval(String(source.loginUrl));\nnn = String(source.getVariable()).replace(\/\\\/$\/,'');\nlet url = `${nn}\/modules\/article\/search.php`;\nlet url2=\"data:;base64,QQ,{'type':''}\";\ntry {\n\tif (key.startsWith('书名:') ) {\n\t\turl += `?searchkey=${key.substr(3)}&searchtype=articlename&page=${page}`;\n\t\t\tss = java.get(url,{\t'user-agent': ua});\n\t\t}\n\t\t\n\t\telse if (key.startsWith('作者:') ) {\n\t\turl += `?searchkey=${key.substr(3)}&searchtype=author&page=${page}`\n\t\t\tss = java.get(url,{\t'user-agent': ua});\n\t\t}\n\t\t\n\t\telse if (key.startsWith('标签:') ) {\n\t\turl += `?searchkey=${key.substr(3)}&searchtype=keywords&page=${page}`;\n\t\t\tss = java.get(url,{\t'user-agent': ua});\n\t\t}\n\t\t\n\t\telse if (page == 1) {\n\t\tftsm();\n\t\tlet body = `searchtype=all&searchkey=${key}&act=search&submit=`;\n\tss = java.post(url,body,{\t'User-Agent': ua});\n \t\n\t}\n\t\n\telse {\n\t\turl +=\t`?searchkey=${key}&searchtype=all&page=${page}`;\n\tss = java.get(url,{\t'user-agent': ua});\n\t}\n\nlet code = ss.statusCode();\nif (code==302||code==301) {\n\t\/\/重定向\n\turl2=ss.header(\"location\");\n\t}\nelse if (code == 200) {\n\tcache.put('8xss1', ss.body());\n\t}\nelse if (code == 520) {\n\tjava.toast(\"💔IP被拉黑\");\n\t}\nelse {\n\tjava.toast(\"💔搜索响应码异常\");\n\t}\n\n\n} catch(err) {\n\turl2 =\turl+`?searchkey=${key}&searchtype=all&page=${page}`;\n\tjava.log('搜索异常:'+err+'\\n备用方案:'+url2);\n\/\/\tjava.longToast('搜索异常:'+err);\n\tcache.put('8xbl1', source.getVariable());\n\tsource.setVariable('');\n\t}\nurl2\n<\/js>", "variableComment": "♦源变量:\n 当前书源使用的网址\n 可点击发现页版本号手动刷新\n\n♦书籍变量:\n ①填写 🔒 并刷新,关闭本书评论显示\n ②填写“目录”并刷新,强制刷新目录\n ③填写分数并刷新,使用分数进行评分\n ④填写其它并刷新,内容作为评论发送\n分数格式示意“1分”“2分”…“10分”\n\n㊟默认详情页检测到有更新内容时才会刷新目录\n\n!注意区分源变量和书籍变量\n", "weight": 0 }