🔍 找书啦·求书互助
https://www.zhaoshu.la
laizhiyu (6509)18小时前
这是个找书网站,貌似是菠萝猫出的。需要菠萝猫书源配合,菠萝猫书源须写书籍URL正则。打开已解决,详情页黄色按钮会调起菠萝猫书源书籍。
做完才发现它一个月才能发一次求书贴,基本没啥用。但还是发出来吧。
{
"bookSourceComment": "须菠萝猫书源配合\n找书啦 zhaoshu.la —— 在线求书互助站\n· 发现:最新已解决 \/ 最新未解决 \/ 全部求书 \/ 🙋我的求书(每页10条,page 翻页)\n· 搜索:\/search\/{关键词}\/all\/,匹配求书帖标题+描述\n· 详情:\/request\/{id}.html\n· ★简介用官方 <useweb> 浏览器渲染:简介里直接生成橙色按钮,点一下就走 legado:\/\/import\/addToBookshelf 深链 → 按各书源详情页正则匹配 → 直接打开那本书的详情页\n· 目录:把「求书原帖 + 每一条书友回复」映射成虚拟章节;标题带 🔗 表示该回复含书源网址,带 ✅ 表示已被采纳;回复里每条网址再生成「🔗 一键开书」章节(点它直接调起阅读)\n· 正文:展示该条回复全文 + 提取出的网址 + 复制网址跳转提示\n· 登录界面可登录 \/ 检查登录状态 \/ 退出 \/ 发布求书帖(书名2~200字,描述≥10字;站点无删除功能)\n· 站点必须使用手机端 UA,桌面 UA 会被 GoEdge WAF 拦截(302 到 \/WAF\/VERIFY\/CAPTCHA)\n· 阅读全部匿名可访问,无需登录;登录仅用于发帖\/回复\n· 服务器响应较慢(单页约 6~7 秒),已放宽 timeout\n",
"bookSourceGroup": "AI书源",
"bookSourceName": "🔍 找书啦·求书互助",
"bookSourceType": 0,
"bookSourceUrl": "https:\/\/www.zhaoshu.la",
"bookUrlPattern": "https?:\/\/(?:www\\.)?zhaoshu\\.la\/request\/\\d+\\.html",
"customButton": false,
"customOrder": 6,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": false,
"exploreUrl": "🔥 最新已解决::https:\/\/www.zhaoshu.la\/solved\/{{page>1?'page\/'+page:''}}&&⏳ 最新未解决::https:\/\/www.zhaoshu.la\/unsolved\/{{page>1?'page\/'+page:''}}&&📚 全部求书::https:\/\/www.zhaoshu.la\/all\/{{page>1?'page\/'+page:''}}&&🙋 我的求书::https:\/\/www.zhaoshu.la\/user\/requests.php",
"header": "{\"User-Agent\": \"Mozilla\/5.0 (Linux; Android 14; Pixel 8) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/126.0.0.0 Mobile Safari\/537.36\", \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\"}",
"lastUpdateTime": "1788781557116",
"loginCheckJs": "(function(){\n try {\n \/* 未登录访问「我的求书」时站点 302 → \/auth\/login.php,\n 因此判据是:最终 URL 是登录页(而不是原来写的 \/user\/requests.php,\n 那个 URL 在重定向后永远不会出现,提示从来不会弹)。 *\/\n var u = String(result.url() || '');\n if (u.indexOf('\/auth\/login.php') >= 0) {\n java.toast('⚠️ 查看「我的求书」需要先登录:书源管理 → 本来源 → 登录');\n }\n } catch (e) {}\n return result;\n})()\n",
"loginUi": "[{\"name\": \"邮箱\", \"type\": \"text\", \"hint\": \"找书啦登录邮箱(浏览找书无需登录)\"}, {\"name\": \"密码\", \"type\": \"password\", \"hint\": \"登录密码\"}, {\"name\": \"① 登录\", \"type\": \"button\", \"action\": \"login()\"}, {\"name\": \"② 检查登录状态\", \"type\": \"button\", \"action\": \"checkLogin()\"}, {\"name\": \"③ 退出登录\", \"type\": \"button\", \"action\": \"logout()\"}, {\"name\": \"书名\", \"type\": \"text\", \"hint\": \"发布求书:书名(2~200字)\"}, {\"name\": \"描述\", \"type\": \"text\", \"hint\": \"发布求书:线索描述(≥10字,作者\/平台\/字数\/渠道等)\"}, {\"name\": \"④ 发布求书帖\", \"type\": \"button\", \"action\": \"publishRequest()\"}, {\"name\": \"⑤ 我的求书入口\", \"type\": \"button\", \"action\": \"openMyRequests()\"}, {\"name\": \"📖 使用说明\", \"type\": \"button\", \"action\": \"showHelp()\"}]",
"loginUrl": "function zsHomeHtml(){\n try { return String(java.ajax('https:\/\/www.zhaoshu.la\/')); } catch(e) { return ''; }\n}\nfunction zsLogged(html){\n \/\/ 判据:页头「退出登录 \/auth\/logout.php」链接只在已登录时渲染。\n \/\/ 不能用 \/request\/create.php —— 首页导航栏常年挂这个入口占位;\n \/\/ 也不能用「登录你的找书啦账号」反向判断 —— 这句是登录框副标题,登录页必含。\n return String(html).indexOf('\/auth\/logout.php') >= 0;\n}\nfunction zsFlashMsg(html){\n var m = String(html).match(\/--danger-bg[^>]*>([\\s\\S]*?)<\\\/div>\/);\n if (!m) return '';\n return String(m[1]).replace(\/<[^>]+>\/g, '').replace(\/\\s+\/g, '');\n}\n\/* 取指定页面的 csrf_token。页面自身渲染失败\/被WAF时才返回空串;\n 旧版曾把「登录你的找书啦账号」当未登录哨兵——实际上它是登录框副标题,\n 登录页本身就含这句话,导致 token 永远被清空(260907 修复)。 *\/\nfunction zsCsrf(path){\n var h = '';\n try { h = String(java.ajax('https:\/\/www.zhaoshu.la' + path)); } catch(e) { return ''; }\n var m = h.match(\/name=\"csrf_token\" value=\"([0-9a-f]+)\"\/);\n return m ? m[1] : '';\n}\nfunction zsToken(){ return zsCsrf('\/auth\/login.php'); }\n\/* 表单 POST,走 java.ajax 的 URL 选项式以复用 CookieJar 与书源 UA *\/\nfunction zsPost(path, formObj){\n var pairs = [];\n for (var k in formObj) pairs.push(encodeURIComponent(k) + '=' + encodeURIComponent(formObj[k]));\n var opt = { method: 'POST', body: pairs.join('&'),\n headers: { 'Content-Type': 'application\/x-www-form-urlencoded' } };\n return String(java.ajax('https:\/\/www.zhaoshu.la' + path + ',' + JSON.stringify(opt)));\n}\nfunction zsGet(path){\n try { return String(java.ajax('https:\/\/www.zhaoshu.la' + path)); } catch(e) { return ''; }\n}\n\/* 站点对「未登录时的POST」一律 302 → 首页(登录成功也 302 → 首页),\n POST 响应体被重定向吞掉 flash(如\"邮箱或密码错误\")。\n 会话是否有效用 GET 首页看「退出登录」链接复核。 *\/\nfunction zsSessionValid(){\n return zsLogged(zsHomeHtml());\n}\nfunction login(){\n var em = '', pw = '';\n try {\n em = String(result.get('邮箱') || '').trim();\n pw = String(result.get('密码') || '');\n } catch (e) { em = ''; pw = ''; }\n if (!em || !pw) { java.toast('⚠️ 请先填写邮箱和密码'); return; }\n java.toast('⏳ 正在登录找书啦…');\n try {\n var tk = zsToken();\n if (!tk) { java.toast('❌ 未取得CSRF令牌,站点可能触发WAF,请稍后再试'); return; }\n var res = zsPost('\/auth\/login.php', { csrf_token: tk, email: em, password: pw });\n if (res.indexOf('GOEDGE_WAF') >= 0) {\n java.toast('❌ 触发WAF人机验证,请先用浏览器打开网站过一次验证');\n return;\n }\n \/* 会话复核:登录成败不能只看 POST 响应(可能被 302 重定向改写),\n 重新 GET 首页看「退出登录」链接是否出现 *\/\n if (zsSessionValid()) {\n java.toast('✅ 登录成功:' + em + ' 现在可以发布求书帖了');\n } else {\n var fm = zsFlashMsg(res);\n if (!fm) {\n \/* flash 可能被 302 吞掉,补一发登录页 GET 兜底 *\/\n fm = zsFlashMsg(String(java.ajax('https:\/\/www.zhaoshu.la\/auth\/login.php')));\n }\n java.toast('❌ 登录失败:' + (fm || '邮箱或密码不正确'));\n }\n } catch (e2) {\n java.toast('❌ 登录异常:' + e2.message);\n }\n}\n\/* 发布求书帖:POST \/request\/create.php csrf_token + book_name + description *\/\nfunction publishRequest(){\n var nm = '', ds = '';\n try {\n nm = String(result.get('书名') || '').trim();\n ds = String(result.get('描述') || '').trim();\n } catch (e) { nm = ''; ds = ''; }\n if (!nm || nm.length < 2) { java.toast('⚠️ 书名至少 2 个字'); return; }\n if (nm.length > 200) { java.toast('⚠️ 书名不能超过 200 字'); return; }\n if (!ds || ds.length < 10) { java.toast('⚠️ 描述至少 10 个字,线索越详细越容易被找到'); return; }\n java.toast('⏳ 正在发布求书帖…');\n try {\n \/* 260907实测:已登录但处于发帖限制时,create.php 会静默 302 回首页(无表单无提示),\n 必须先判页面形态再决定提示,否则会把\"限制中\"误报成\"未登录\" *\/\n var cp = zsGet('\/request\/create.php');\n if (cp.indexOf('name=\"book_name\"') < 0) {\n if (zsLogged(cp)) {\n java.toast('❌ 站点暂不接受发布:可能处于发帖冷却期(发帖后一段时间内不能再发)或账号受限,请稍后再试');\n } else {\n java.toast('❌ 未登录无法发布:请先填邮箱密码点「① 登录」');\n }\n return;\n }\n var tk = (cp.match(\/name=\"csrf_token\" value=\"([0-9a-f]+)\"\/) || [])[1] || '';\n if (!tk) { java.toast('❌ 未取得CSRF令牌,请稍后再试'); return; }\n if (!zsSessionValid()) { java.toast('❌ 登录已失效,请重新点「① 登录」'); return; }\n var res = zsPost('\/request\/create.php', { csrf_token: tk, book_name: nm, description: ds });\n if (res.indexOf('GOEDGE_WAF') >= 0) {\n java.toast('❌ 触发WAF人机验证,请先用浏览器打开网站过一次验证');\n return;\n }\n var cid = res.match(\/canonical\" href=\"https?:\\\/\\\/[^\\\/]+\\\/request\\\/(\\d+)\\.html\"\/);\n if (res.indexOf('发布成功') >= 0 || (cid && res.indexOf('request-book-name') >= 0)) {\n java.longToast('✅ 发布成功' + (cid ? (':求书帖 #' + cid[1] + '《' + nm + '》') : '')\n + '\\n可在发现页「🙋 我的求书」查看。'\n + '\\n注意:站点不提供删除功能,帖子会长期公开。');\n } else {\n java.toast('❌ 发布失败:' + (zsFlashMsg(res) || '请确认已登录且描述不少于10字'));\n }\n } catch (e3) {\n java.toast('❌ 发布异常:' + e3.message);\n }\n}\nfunction openMyRequests(){\n java.toast('🙋 我的求书:回到书源「发现」页,点最后一个分类「🙋 我的求书」即可');\n}\nfunction checkLogin(){\n java.toast('⏳ 正在检查登录状态…');\n var h = zsHomeHtml();\n if (!h) { java.toast('❌ 无法访问网站,请检查网络'); return; }\n if (h.indexOf('GOEDGE_WAF') >= 0) { java.toast('❌ 触发WAF人机验证,请稍后重试'); return; }\n if (zsLogged(h)) {\n var m = h.match(\/user-name\">([^<]+)<\/);\n var n = h.match(\/user-title[^>]*>([^<]*)<\/);\n java.toast('✅ 已登录:' + (m ? m[1] : '未知用户') + (n ? '(' + n[1].trim() + ')' : '') + ' 可发布\/回复求书帖');\n } else {\n java.toast('⚠️ 未登录(浏览找书无需登录,发帖\/回复才需要)');\n }\n}\nfunction logout(){\n try {\n try { source.removeLoginInfo(); } catch(e0) {}\n cookie.removeCookie('https:\/\/www.zhaoshu.la\/');\n try { source.removeLoginHeader(); } catch(e1) {}\n var still = zsLogged(zsHomeHtml());\n java.toast(still ? '⚠️ 已清除本站Cookie,但站点仍判定为登录中,重启阅读后生效'\n : '🚪 已退出登录(本站Cookie已清除)');\n } catch (e) { java.toast('❌ 退出失败:' + e.message); }\n}\nfunction showHelp(){\n var t = '【找书啦 使用说明】' + String.fromCharCode(10)\n + '1. 发现页:最新已解决 \/ 最新未解决 \/ 全部求书 \/ 我的求书' + String.fromCharCode(10)\n + '2. 搜索框输入书名,匹配的是求书帖标题与描述' + String.fromCharCode(10)\n + '3. 点书名进详情页,书友回复里带网址即为找到的书源' + String.fromCharCode(10)\n + '4. 详情页简介是网页渲染的,直接点橙色「📖 打开这本书」按钮即可调起该书详情页' + String.fromCharCode(10)\n + '5. 目录里每条网址也会生成「🔗 一键开书」章节,作为按钮之外的双保险' + String.fromCharCode(10)\n + '6. 发布求书:先点「① 登录」,再填「书名」「描述」两点,点「④ 发布求书帖」' + String.fromCharCode(10)\n + ' 书名字数 2~200,描述至少 10 字;站点无删除功能,请谨慎发布' + String.fromCharCode(10)\n + '7. 发布后点「发现 → 🙋 我的求书」查看自己的帖子(未登录时该页为空)' + String.fromCharCode(10)\n + '8. 浏览找书无需登录;只有发帖\/回复才需要登录' + String.fromCharCode(10)\n + '9. 本站必须使用手机UA,电脑UA会触发GoEdge WAF人机验证';\n try { java.longToast(t); } catch (e) { try { java.toast(t); } catch (e2) { java.copyText(t); } }\n}",
"respondTime": 180000,
"ruleBookInfo": {
"author": "@js:(function(){var d=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var e=d.select('div.detail-user-name a').first();return e?e.text().trim():'';})()",
"intro": "@js:(function(){var Jsoup=Packages.org.jsoup.Jsoup;var d=(result&&typeof result.select==='function')?result:Jsoup.parse(String(result));var SOH=String.fromCharCode(1);function esc(s){return String(s).replace(\/&\/g,'&').replace(\/<\/g,'<').replace(\/>\/g,'>').replace(\/\"\/g,'"');}function T(el){if(!el)return '';var s=String(el.html()).replace(\/<br\\s*\\\/?>\/gi,SOH);var ps=String(Jsoup.parseBodyFragment(s).text()).split(SOH);for(var i=0;i<ps.length;i++)ps[i]=ps[i].trim();return ps.join('<br>');}function host(u){var m=String(u).match(\/^https?:\\\/\\\/([^\\\/]+)\/i);return m?m[1].replace(\/^www\\.\/,''):String(u).substring(0,26);}var v='';try{v=String(source.getVariable()||'').trim();}catch(e){v='';}var OPT=v?',{\"origin\":\"'+v+'\"}':'';function deep(u){return 'legado:\/\/import\/addToBookshelf?src='+encodeURIComponent(String(u)+OPT);}var h1=d.select('h1.request-book-name').first();var title='';if(h1){var c=h1.clone(),bs=c.select('span.badge');for(var y=0;y<bs.size();y++)bs.get(y).remove();title=String(c.text()).replace(\/^[\\s📖]+\/,'').trim();}var bd=d.select('h1.request-book-name span.badge').first();var us=d.select('div.detail-user-name a').first();var mt=d.select('div.detail-user-meta').first();var rs=d.select('div.reply-item');var urls=[],seen={};for(var a=0;a<rs.size();a++){var ls=rs.get(a).select('a[href]');for(var b=0;b<ls.size();b++){var hu=String(ls.get(b).attr('href'));if(hu.indexOf('http')!==0||hu.indexOf('zhaoshu.la')>=0||seen[hu]){continue;}seen[hu]=1;var au=rs.get(a).select('div.reply-user-name-row a').first();urls.push({u:hu,f:au?String(au.text()).trim():'书友',ac:rs.get(a).hasClass('accepted')?1:0});}}urls.sort(function(x,y){return y.ac-x.ac;});var H='<useweb><html><head><meta charset=\"utf-8\">';H+='<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">';H+='<style>body{margin:0;padding:10px 12px 14px;background:#f5f6f8;color:#1c1c1e;font-family:sans-serif;font-size:14.5px;line-height:1.6}';H+='.hd{font-size:17px;font-weight:700;margin:0 0 4px}.mt{color:#6b7280;font-size:12.5px;margin:0 0 10px}';H+='.cd{background:#fff;border-radius:9px;padding:9px 11px;margin:0 0 9px}.cd b{color:#ff9900;font-size:12.5px;display:block;margin-bottom:3px}';H+='.tip{background:#fff7e6;border:1px solid #ffd591;border-radius:9px;padding:8px 11px;margin:0 0 9px;color:#874d00;font-size:13px}';H+='a.bt{display:block;background:#ff9900;color:#fff;border-radius:9px;padding:10px 12px;margin:0 0 8px;text-decoration:none;font-size:15px;font-weight:700}';H+='a.bt:active{background:#e67e00}a.bt .ok{float:right;font-weight:400;font-size:12.5px}';H+='.uu{font-size:11.5px;color:#6b7280;word-break:break-all;margin:0 0 9px;padding:0 2px}.rp{border-left:3px solid #ff9900;padding-left:8px;margin:0 0 9px}';H+='.rh{font-size:12.5px;color:#374151}.no{background:#eef0f3;border-radius:9px;padding:12px;text-align:center;color:#6b7280}';H+='<\/style><\/head><body>';H+='<div class=\"hd\">'+esc(title)+'<\/div>';H+='<div class=\"mt\">'+esc(bd?String(bd.text()).trim():'')+' · 求书人 '+esc(us?String(us.text()).trim():'匿名')+' · '+esc(mt?String(mt.text()).trim():'')+' · 共 '+rs.size()+' 条回复<\/div>';H+='<div class=\"cd\"><b>求书描述<\/b>'+(T(d.select('div.detail-description').first())||'(发布者未填写)')+'<\/div>';if(urls.length){H+='<div class=\"tip\">👇 点下面的按钮,阅读会直接打开这本书的详情页(需已装能匹配该书源网址的书源)<\/div>';for(var k=0;k<urls.length;k++){var it=urls[k];H+='<a class=\"bt\" href=\"'+esc(deep(it.u))+'\">📖 打开这本书 · '+esc(host(it.u))+(it.ac?'<span class=\"ok\">✅已采纳<\/span>':'')+'<\/a>';H+='<div class=\"uu\">'+(k+1)+'. '+esc(it.u)+' (来自 '+esc(it.f)+',长按可复制)<\/div>';} }else{H+='<div class=\"no\">这条求书帖的回复里还没有书源网址<\/div>';}H+='<div class=\"cd\"><b>全部回复 '+rs.size()+' 条<\/b>';for(var q=0;q<rs.size();q++){var r=rs.get(q);var ru=r.select('div.reply-user-name-row a').first();H+='<div class=\"rp\"><div class=\"rh\">💬 回复'+(q+1)+' · '+esc(ru?String(ru.text()).trim():'书友')+(r.hasClass('accepted')?' · ✅已采纳':'')+'<\/div>'+(T(r.select('div.reply-text').first())||'(空)')+'<\/div>';}H+='<\/div>';if(v)H+='<div class=\"mt\">已指定书源:'+esc(v)+'<\/div>';H+='<\/body><\/html><\/useweb>';return H;})()",
"kind": "@js:(function(){var d=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var a=[],b=d.select('h1.request-book-name span.badge').first(),c=d.select('div.reply-section h2 span.count').first(),m=d.select('div.detail-user-meta').first();if(b)a.push(b.text().trim());if(c)a.push('回复'+String(c.text()).replace(\/[()()]\/g,'')+'条');if(m)a.push(m.text().trim());return a.join(' · ');})()",
"name": "@js:(function(){var d=(result&&typeof result.select==='function')?result:Packages.org.jsoup.Jsoup.parse(String(result));var e=d.select('h1.request-book-name').first();if(!e)return '';return (function(){var c=e.clone(),bs=c.select('span.badge');for(var z=0;z<bs.size();z++)bs.get(z).remove();return String(c.text());})().replace(\/^[\\s📖]+\/,'').trim();})()"
},
"ruleContent": {
"content": "@js:(function(){var Jsoup=Packages.org.jsoup.Jsoup;var d=(result&&typeof result.select==='function')?result:Jsoup.parse(String(result));var NL=String.fromCharCode(10),SEP='──────────────────────',SOH=String.fromCharCode(1);function T(el){if(!el)return '';var s=String(el.html()).replace(\/<br\\s*\\\/?>\/gi,SOH);return (function(){var ps=String(Jsoup.parseBodyFragment(s).text()).split(SOH);for(var q0=0;q0<ps.length;q0++)ps[q0]=ps[q0].trim();return ps.join(NL);})().trim();}function LK(el){var a=[],ls=el.select('a[href]');for(var i=0;i<ls.size();i++){var h=ls.get(i).attr('href');if(h.indexOf('http')===0)a.push(h);}return a;}var rid=String(baseUrl||'').replace(\/^[\\s\\S]*#reply-\/,'');var h1=d.select('h1.request-book-name').first();var title=h1?(function(){var c=h1.clone(),bs=c.select('span.badge');for(var z=0;z<bs.size();z++)bs.get(z).remove();return String(c.text());})().replace(\/^[\\s📖]+\/,'').trim():'';var bd=d.select('h1.request-book-name span.badge').first();var us=d.select('div.detail-user-name a').first();var mt=d.select('div.detail-user-meta').first();if(rid.indexOf('open-')===0){var zraw='';try{zraw=decodeURIComponent(rid.substring(5));}catch(e9){zraw=rid.substring(5);}var zvv='';try{zvv=String(source.getVariable()||'').trim();}catch(e10){zvv='';}var zoo=zvv?',{\"origin\":\"'+zvv+'\"}':'';var zok='';try{java.openUrl('legado:\/\/import\/addToBookshelf?src='+encodeURIComponent(zraw+zoo));zok='✅ 已调起阅读,正在打开该书详情页';}catch(e11){zok='⚠️ 调起失败:'+e11.message;}var zbb='🔗 一键开书'+NL+NL+zraw+NL+NL+zok+NL;if(zvv)zbb=zbb+NL+'(已指定书源:'+zvv+')'+NL;zbb=zbb+NL+'也可直接在书籍详情页的简介里点「📖 打开这本书」按钮。';return zbb;}var rs=d.select('div.reply-item');var head='📖《'+title+'》'+NL+'🔖 '+(bd?bd.text().trim():'')+' 👤 求书人:'+(us?us.text().trim():'匿名')+' 🕐 '+(mt?mt.text().trim():'')+NL+'💬 共 '+rs.size()+' 条回复';var TIP=NL+SEP+NL+'💡 返回书籍详情页,简介里就有可点击的「📖 打开这本书」按钮;'+NL+' 目录里的「🔗 一键开书」章节同样可直接调起阅读打开该书。';if(rid==='intro'||rid===''){var out=head+NL+SEP+NL+'【求书描述】'+NL+(T(d.select('div.detail-description').first())||'(发布者未填写描述)')+NL+SEP+NL+'【全部回复】'+NL;var urls=[];for(var i=0;i<rs.size();i++){var r=rs.get(i);var u=r.select('div.reply-user-name-row a').first();var acc=r.hasClass('accepted')?'✅已采纳':'未采纳';out+=NL+'💬 回复'+(i+1)+'|'+(u?u.text().trim():'书友')+'('+acc+')'+NL+(T(r.select('div.reply-text').first())||'(空)')+NL;var ls=LK(r);for(var j=0;j<ls.length;j++){out+=' 🔗 '+ls[j]+NL;urls.push(ls[j]);}}if(urls.length){out+=NL+SEP+NL+'【🔗 书友找到的书源地址 共'+urls.length+'条】'+NL;for(var k=0;k<urls.length;k++)out+=(k+1)+'. '+urls[k]+NL;}else out+=NL+'(回复中暂未发现外部书源网址)';return out+TIP;}var target=null,idx=0;for(var n=0;n<rs.size();n++){var bb=rs.get(n).select('button[data-type=reply]').first();var idd=bb?bb.attr('data-id'):('n'+(n+1));if(String(idd)===rid){target=rs.get(n);idx=n+1;break;}}if(!target&&rs.size()>0){var pi=parseInt(rid,10);if(pi>0&&pi<=rs.size()){target=rs.get(pi-1);idx=pi;}else{target=rs.get(0);idx=1;}}if(!target)return head+NL+SEP+NL+'(该求书帖暂无回复内容)'+TIP;var u2=target.select('div.reply-user-name-row a').first();var ttl=target.select('div.reply-user-name-row span.user-title').first();var adm=target.select('span.admin-badge').first();var ft=target.select('div.reply-footer span').first();var lk=target.select('span.like-count').first();var out=head+NL+SEP+NL;out+='💬 回复 '+idx+'|'+(u2?u2.text().trim():'书友');if(ttl)out+='('+ttl.text().trim()+(adm?'·'+adm.text().trim():'')+')';out+=NL;var info=[];if(ft)info.push('🕐 '+ft.text().trim());if(lk)info.push('❤️ '+lk.text().trim()+' 赞');if(target.hasClass('accepted'))info.push('✅ 已被采纳');if(info.length)out+=info.join(' ')+NL;out+=SEP+NL+(T(target.select('div.reply-text').first())||'(空)')+NL;var ls2=LK(target);if(ls2.length){out+=NL+SEP+NL+'【🔗 本条回复中的书源地址】'+NL;for(var q=0;q<ls2.length;q++)out+=(q+1)+'. '+ls2[q]+NL;}return out+TIP;})()"
},
"ruleExplore": {
"author": "@js:(function(){var e=result.select('div.request-user-name a').first();if(e){var t=String(e.text()).trim();if(t)return t;}return '我';})()",
"bookList": "class.request-item",
"bookUrl": "@js:(function(){var e=result.select('h2.request-book-name a').first();return e?e.attr('href'):'';})()",
"intro": "@js:(function(){var p=result.select('p.request-description').first(),b=result.select('span.badge').first();var t=p?p.text().trim():'',s=b?b.text().trim():'',tip='';if(s.indexOf('已解决')>=0)tip=' ➜ 点击书名进详情页,简介里有可直接点击的开书按钮';else if(s.indexOf('未解决')>=0)tip=' ➜ 点击书名进详情页查看求书线索';return (t||'(发布者未填写补充描述)')+tip;})()",
"kind": "@js:(function(){var a=[],b=result.select('span.badge').first(),m=result.select('div.request-meta').first(),t='';if(b)a.push(String(b.text()).trim());if(m)t=String(m.text()).trim();if(!t){var all=result.select('div.request-actions .action-btn');for(var i=all.size()-1;i>=0;i--){var x=String(all.get(i).text()).replace(\/\\s+\/g,' ').trim();if(\/(刚刚|秒|分钟|小时|天前|天前|周|月|年|\\d{1,2}月\\d{1,2}日)\/.test(x)){t=x;break;}}}if(t)a.push(t);return a.join(' · ');})()",
"lastChapter": "@js:(function(){var a=result.select('div.request-actions a.action-btn').first();return a?a.text().trim():'';})()",
"name": "@js:(function(){var e=result.select('h2.request-book-name a').first();return e?e.text().trim():'';})()"
},
"ruleSearch": {
"author": "@js:(function(){var e=result.select('div.request-user-name a').first();if(e){var t=String(e.text()).trim();if(t)return t;}return '我';})()",
"bookList": "class.request-item",
"bookUrl": "@js:(function(){var e=result.select('h2.request-book-name a').first();return e?e.attr('href'):'';})()",
"checkKeyWord": "我的",
"intro": "@js:(function(){var p=result.select('p.request-description').first(),b=result.select('span.badge').first();var t=p?p.text().trim():'',s=b?b.text().trim():'',tip='';if(s.indexOf('已解决')>=0)tip=' ➜ 点击书名进详情页,简介里有可直接点击的开书按钮';else if(s.indexOf('未解决')>=0)tip=' ➜ 点击书名进详情页查看求书线索';return (t||'(发布者未填写补充描述)')+tip;})()",
"kind": "@js:(function(){var a=[],b=result.select('span.badge').first(),m=result.select('div.request-meta').first(),t='';if(b)a.push(String(b.text()).trim());if(m)t=String(m.text()).trim();if(!t){var all=result.select('div.request-actions .action-btn');for(var i=all.size()-1;i>=0;i--){var x=String(all.get(i).text()).replace(\/\\s+\/g,' ').trim();if(\/(刚刚|秒|分钟|小时|天前|天前|周|月|年|\\d{1,2}月\\d{1,2}日)\/.test(x)){t=x;break;}}}if(t)a.push(t);return a.join(' · ');})()",
"lastChapter": "@js:(function(){var a=result.select('div.request-actions a.action-btn').first();return a?a.text().trim():'';})()",
"name": "@js:(function(){var e=result.select('h2.request-book-name a').first();return e?e.text().trim():'';})()"
},
"ruleToc": {
"chapterList": "@js:(function(){var Jsoup=Packages.org.jsoup.Jsoup;var d=(result&&typeof result.select==='function')?result:Jsoup.parse(String(result));var out=new Packages.org.jsoup.select.Elements();var h1=d.select('h1.request-book-name').first();var title=h1?(function(){var c=h1.clone(),bs=c.select('span.badge');for(var z=0;z<bs.size();z++)bs.get(z).remove();return String(c.text());})().replace(\/^[\\s📖]+\/,'').trim():'求书原帖';var box=Jsoup.parseBodyFragment('<div class=\"zs-intro\" data-rid=\"intro\" data-no=\"0\"><\/div>').body().child(0);box.text('📋 求书原帖|'+title);out.add(box);var rs=d.select('div.reply-item');for(var i=0;i<rs.size();i++){var r=rs.get(i);var b=r.select('button[data-type=reply]').first();r.attr('data-rid',b?b.attr('data-id'):('n'+(i+1)));r.attr('data-no',String(i+1));out.add(r);var gl=r.select('a[href]');var got={};for(var j=0;j<gl.size();j++){var hu=String(gl.get(j).attr('href'));if(hu.indexOf('http')!==0||hu.indexOf('zhaoshu.la')>=0||got[hu]){continue;}got[hu]=1;var op=Jsoup.parseBodyFragment('<div class=\"zs-open\"><\/div>').body().child(0);op.attr('data-rid','open-'+encodeURIComponent(hu));op.attr('data-no',String(i+1));var zh=hu.substring(hu.indexOf('\/\/')+2).split('\/')[0].replace(\/^www\\.\/,'');op.text('🔗 一键开书 · 回复'+(i+1)+' · '+zh);out.add(op);}}return out;})()",
"chapterName": "@js:(function(){var e=result;if(e.hasClass('zs-intro')||e.hasClass('zs-open'))return e.text();var no=e.attr('data-no');var u=e.select('div.reply-user-name-row a').first();var nm=u?u.text().trim():'书友';var t=e.select('div.reply-text').first();var raw=String(t?t.text():'');var lk=raw.indexOf('http')>=0?' 🔗':'';var tx=raw.replace(\/https?:\\\/\\\/\\S+\/g,'').replace(\/\\s+\/g,' ').trim();var ac=e.hasClass('accepted')?' ✅':'';var br=tx.length>22?tx.substring(0,22)+'…':tx;return '💬 回复'+no+'|'+nm+lk+ac+(br?':'+br:'');})()",
"chapterUrl": "@js:(function(){var b=baseUrl||'';if(b.indexOf('http')!==0){b=(book&&book.bookUrl)?book.bookUrl:'';}return b+'#reply-'+result.attr('data-rid');})()"
},
"searchUrl": "https:\/\/www.zhaoshu.la\/search\/{{java.encodeURI(key)}}\/all\/{{page>1?'page\/'+page:''}}",
"variableComment": "填书源网址(bookSourceUrl,如 rrssk聚合)可强制指定书源;留空自动匹配。登录界面可①登录\/④发布求书帖\/🙋我的求书",
"weight": 0
}