ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenCLI 一亩三分地适配器实战指南:Discuz BBS 的公开浏览、登录态搜索与通知监听

OpenCLI 一亩三分地适配器实战指南:Discuz BBS 的公开浏览、登录态搜索与通知监听 OpenCLI 一亩三分地适配器实战指南Discuz BBS 的公开浏览、登录态搜索与通知监听【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI导读本文围绕 OpenCLI 项目中1point3acres一亩三分地适配器展开完整讲解其 9 个命令的用法、输出列结构、登录态前置条件以及底层 Discuz 解析实现。读完本文你将掌握如何用opencli 1point3acres系列命令浏览海外求职、移民、留学话题的热门/最新/精华帖与指定版块如何通过tid管道进入帖子详情、查询用户资料以及如何在已登录浏览器会话下完成站内全文搜索与通知监听并理解其参数校验与 GBK 解码等实现细节。一、适配器概览基于 Discuz 的 BBS 数据接入一亩三分地www.1point3acres.com是一个基于 Discuz!X PHP 论坛系统构建的 BBS主要覆盖北美求职、移民如 NIW / EB-1A与研究生/博士申请等话题。OpenCLI 为其提供了独立的 CLI 适配器源码位于 clis/1point3acres 目录包含 9 个命令文件与 1 个共享工具模块文件命令说明hot.jshot今日热门按热度latest.jslatest最新发帖按时间倒序digest.jsdigest精华/编辑推荐帖forums.jsforums全站版块清单forum.jsforum指定版块帖子列表thread.jsthread帖子详情 楼层回复user.jsuser用户资料用户组/积分/大米search.jssearch站内全文搜索需登录notifications.jsnotifications站内通知需登录utils.js—共享解析/请求/校验工具模式与域 Public Cookie域名为www.1point3acres.com。所有公开命令以Strategy.PUBLIC声明且browser: false不依赖浏览器search与notifications则声明为Strategy.COOKIE且browser: true需要把已登录浏览器会话的 Cookie 注入请求。命令总览表继承自适配器文档 docs/adapters/browser/1point3acres.mdCommandDescriptionAuthopencli 1point3acres hotTodays hot threads (by heat)Publicopencli 1point3acres latestNewest threads (by post time, desc)Publicopencli 1point3acres digestEditor-picked / featured threadsPublicopencli 1point3acres forumsList all forums (fid name)Publicopencli 1point3acres forum fidList threads in a specific forumPublicopencli 1point3acres thread tidThread detail repliesPublicopencli 1point3acres user whoUser profile (group / points / 大米 / posts)Publicopencli 1point3acres search queryFull-text searchCookieopencli 1point3acres notificationsSite notifications (replies / mentions / reviews)Cookie二、公开浏览命令hot / latest / digest / forums / forum2.1 三大聚合视图hot、latest、digest三个命令分别对应 Discuz 指南页的三个视图。从源码看它们请求的 URL 分别是hot→/bbs/forum.php?modguideviewhot按热度latest→/bbs/forum.php?modguideviewnew按发帖时间倒序digest→/bbs/forum.php?modguideviewdigest精华三个命令共享parseThreadList(html)解析器并统一走normalizeLimit(args.limit, 20, 50)做参数校验——默认返回 20 条、上限 50 条。列表行通过parseThreadList→parseThreadRows从 HTML 中提取tbody idnormalthread_*/tbody idstickthread_*块逐行解析出标题、版块、作者、回复数、查看数、最后回复时间与帖子 URL/bbs/thread-tid-1-1.html。2.2 版块清单与指定版块forums从/bbs/forum.php首页解析所有版块卡片a hrefforum-fid-1.html按fid去重后输出fid, name, url三列。它支持--filter参数做版块名子串过滤中英文均可例如--filter 面经只保留名称中包含“面经”的版块。源码中还对形如[子版块]的括号标签做了去括号处理保证显示一致性。forum则需要必填的位置参数fid版块 ID请求/bbs/forum-fid-page.html拉取版块帖子列表。其输出列在聚合视图基础上多了kind一列用于区分置顶stickthread与普通normalthread帖子方便 Agent 识别置顶公告与普通讨论。当版块仅包含子版块分类、没有直接帖子时命令会优雅地返回空列表而非报错。2.3 常用版块 ID 速查以下为适配器文档中标注的高频版块完整清单可用opencli 1point3acres forums获取fid版块145海外面经198海外职位内推27研究生申请28博士申请82NIW / EB-1A 移民2.4 公开命令用法示例# 今日热门返回前 10 条 opencli 1point3acres hot --limit 10 # 海外职位内推版块fid198最新 20 条 opencli 1point3acres forum 198 --limit 20 # 翻页查看版块第 2 页 opencli 1point3acres forum 145 --page 2 --limit 10 # 关键字过滤版块清单 opencli 1point3acres forums --filter 面经三、帖子详情与用户资料thread / user3.1 thread按楼层读取帖子内容thread是贯穿列表与详情的核心命令请求/bbs/thread-tid-page-1.html一行输出一个楼层第一行floor1是楼主主帖其余为回复。因此--limit 1可以只取主帖正文增大--limit则会向下逐楼读取。其参数设计见 thread.js参数类型默认说明tidstring必填帖子 ID必须是纯数字取自任意列表输出的tid列pageint1楼层分页页码limitint10返回楼层条数含主楼contentLimitint400每楼正文截断长度最少 50 字符实现上有几个值得注意的细节主帖标题注入仅当page 1且存在楼层时命令会把span idthread_subject中的帖子标题以【标题】前缀拼接到主楼正文前让 Agent 无需额外调用即可拿到标题与正文。楼层号推导优先从 HTML 中的emN#/em楼层标记提取标记缺失时按(page-1)*10 i 1推断保证跨页读取时楼层连续。精确发布时间优先取每楼span titleYYYY-MM-DD HH:MM:SS的精确时间源码注释特别指出要避免使用meta itempropdatePublished因为该站点上它表示的是整个帖子的发布时间而非当前楼层时间。空结果防护页面缺少idpostlist与idpost_N时抛出EmptyResultError提示“帖子不存在或被删除”某页无楼层时同样报错。楼层直达链接每行附带forum.php?modredirectgotofindpostptidtidpidpid的楼层定位 URL便于人工复核。# 读取帖子 1158360 的前 10 个楼层 opencli 1point3acres thread 1158360 --limit 10 # 只取主帖正文并放宽截断到 2000 字符 opencli 1point3acres thread 1158360 --limit 1 --contentLimit 2000 # 读取第 2 页楼层约 11~20 楼 opencli 1point3acres thread 1158360 --page 2 --limit 103.2 user按 uid 或用户名查询资料user命令接受一个位置参数who请求规则为纯数字按 uid 查/bbs/space-uid-uid.html否则按用户名查/bbs/space-username-name.html。两个路由均公开可访问。# 按 uid 查询 opencli 1point3acres user 12345 # 按用户名查询 opencli 1point3acres user some-username返回单行记录包含用户组、积分、大米站点货币、帖子数、主题数、精华数、注册时间、最后访问时间与主页 URL。解析时对积分N这类li键值对做了宽松匹配容忍可选span标签、全角/半角冒号以及“颗/根/粒”等量词后缀。若用户不存在页面出现“没有找到/不存在”提示则抛出EmptyResultError。四、登录态命令search 与 notificationssearch与notifications属于Strategy.COOKIE命令browser: true意味着执行时由 OpenCLI 接管已运行的 Chrome 实例并注入会话 Cookie。4.1 前置条件使用这两个命令前必须满足Chrome 正在运行已经登录www.1point3acres.com已安装并启用 Browser Bridge 扩展OpenCLI 与浏览器会话之间的桥接通道。4.2 search站内全文搜索search请求/bbs/search.php?modforum构造参数srchtxt关键字与searchsubmityes可选srchfid限定版块。实现要点Cookie 获取借助 utils.js 中的getCookie(page)从浏览器会话取 Cookie。由于 Discuz 的认证 Cookie4Oaf_61d6_*、session是 HttpOnly 且设置在根域.1point3acres.com上函数优先使用page.getCookies()分别查询www.1point3acres.com与.1point3acres.com两个域并合并去重仅在前者不可用时才回退到document.cookie。重定向跟随Discuz 搜索会通过 302 跳转到search.php?searchidIDNode 的fetch在携带会话 Cookie 时会自动跟随。游客拦截识别assertNotGuestAlert检测“提示信息 | 一亩三分地”标题与“无法进行此操作”文案命中即抛AuthRequiredError提示需要登录。空结果处理无结果时优先提取页面中“抱歉”开头的提示语否则给出No results for query的EmptyResultError。搜索结果解析搜索结果页结构与列表页不同使用独立的parseSearchList从li classpbw idTID块中提取标题、N 个回复 - M 次查看 统计以及时间/作者/版块元信息由于搜索页不单独展示最后回复时间输出中直接以发帖时间填充该字段。# 全文搜索需登录返回前 10 条 opencli 1point3acres search OPT extension --limit 10 # 限定在指定版块fid内搜索 opencli 1point3acres search EB-1A --fid 82 --limit 204.3 notifications站内通知监听notifications请求/bbs/home.php?modspacedonoticeviewkind支持四种通知类型--kind含义mypost我的帖子默认interactive互动点评 / 我 等system系统通知app应用通知输出列为index, from, summary, time, threadUrl其中summary默认截断到 200 字符threadUrl会从通知正文中提取thread-N.html链接并补齐为绝对地址。实现细节未登录时页面标题含“提示信息”与“请登录”抛AuthRequiredError“暂时没有提醒内容”被视为真实的空结果而非解析失败抛出EmptyResultError以便上层区分「没有通知」与「读取失败」两种状态每条通知按标准 Discuzdl classcl块解析来源、正文、时间分别从dt、dd classntc_body、dd classxg1中提取作者与正文均为空的异常块会被跳过。# 查看我的帖子相关的通知默认类型 opencli 1point3acres notifications --limit 20 # 查看互动通知 opencli 1point3acres notifications --kind interactive --limit 10五、输出列结构与管道用法适配器文档给出的各命令输出列如下CommandColumnshot/latest/digest/forumrank, tid, title, forum, author, replies, views, lastReplyTime, urlthreadfloor, pid, author, postTime, content, urluseruid, username, group, credits, rice, posts, threads, digests, registerTime, lastAccess, profileUrlforumsfid, name, urlsearchrank, tid, title, forum, author, replies, views, postTime, urlnotificationsindex, from, summary, time, threadUrl在 Agent 工作流中这些列构成清晰的数据管道先用hot/latest/forum拿到列表与tid再用tid调thread获取全文用forums拿到fid后按forum深入指定版块search命中后同样以tid承接thread。例如# 三步管道热门列表 → 第一条帖子的 tid → 读取主帖 opencli 1point3acres hot --limit 1 opencli 1point3acres thread 1158360 --limit 1其中tidthread id是连接列表行与帖子详情的规范句柄这一点在适配器文档的 Notes 中被明确强调。六、底层实现要点与防御性设计6.1 GBK 编码解码一亩三分地站点以 GBK 编码输出 HTML。fetchHtml在 utils.js 中先取arrayBuffer再用new TextDecoder(gbk).decode(buf)转成 UTF-8保证中文标题、作者名、版块名不乱码。请求统一携带桌面 Chrome 的User-Agent与Accept-Language: zh-CN,zh;q0.9,en;q0.8并redirect: follow跟随跳转网络异常与 HTTP 非 2xx 分别包装为CommandExecutionError附带状态码与来源 URL 便于排查。6.2 严格的参数校验拒绝静默截断这是该适配器最有特色的防御性设计之一。与“超出上限就静默截断”的宽松做法不同所有列表/分页/截断参数都遵循typed-fail-fast类型化快速失败约定normalizeLimit(value, default, max)先校验必须是正整数再校验 max否则抛ArgumentErrornormalizePositiveInteger(value, default, label, { min })要求整数且大于 0thread --contentLimit还额外要求 50列表--limit上限为 50Discuz 列表页每页约 50 行超出即报limit must be 50不做静默裁剪thread --page、thread --limit、thread --contentLimit、notifications --limit同样显式拒绝非法值thread/forum的tid/fid必须匹配/^\d$/否则抛ArgumentErrorforum的报错信息还会附带示例提示如e.g. 145 for 海外面经。这种设计的价值在于Agent 拿到的是确定性的报错而非被悄悄修改的数据便于上层重试或修正参数避免“看似成功实则截断”的隐性数据缺失。6.3 文本清洗与截断stripHtml负责把 HTML 正文转成纯文本将br、/p、/div、/li、/tr等标签替换为换行以保留段落结构再剔除其余标签并折叠连续空行decodeEntities同时处理数字实体十进制与十六进制和常见命名实体nbsp;、amp;、lt;、gt;、quot;、#39;、apos;。truncate在超长时按字符截断并追加省略号用于thread --contentLimit与通知摘要避免单行输出过大。6.4 登录态探测与认证命令除数据命令外auth.js 通过_shared/site-auth.js注册了站点级认证辅助命令。其身份探测脚本会依次检查是否跳转到auth.1point3acres.com/login登录页、页面是否出现“登录”链接匿名态、以及是否能从“访问我的空间”等元素中提取到uid/用户名。同时以 Cookie 名匹配/_auth$/作为快速检查项quickCheck验证登录身份时还会导航到/bbs/首页执行探测verify。这意味着在浏览器中手动完成一次登录后Agent 即可基于同一会话反复执行search与notifications。七、注意事项与故障排查适配器文档的 Notes 部分总结了以下实操要点编码站点提供 GBK 编码 HTML适配器内部会自动解码为 UTF-8输出侧无需额外处理。句柄约定tid是列表行通往thread详情完整内容的规范标识。反爬/风控公开接口返回的是渲染后的 HTML高频机器人流量可能触发 Discuz 的验证码challenge或登录门槛。若hot/latest开始返回空行应回退到已登录会话重试登录后同样可以跑公开命令。参数错误是显式报错列表--limit为非正整数或大于 50 时命令直接抛ArgumentError拒绝执行而不是静默截断thread --page、thread --limit、thread --contentLimit、notifications --limit同样显式拒绝非法值。空结果的语义notifications的“暂时没有提醒内容”与search的“抱歉没有找到相关结果”都作为明确的EmptyResultError返回Agent 可据此区分「无数据」与「失败」避免误判。如果公开列表命令持续异常可结合 docs/guide/browser-bridge.md 完成浏览器桥接与会话登录再通过 docs/guide/getting-started.md 与 docs/guide/troubleshooting.md 排查 OpenCLI 侧的安装与运行时问题。八、小结1point3acres适配器是 OpenCLI 处理 Discuz 系 BBS 的典型范例公开数据走零依赖的fetch 正则解析登录态数据通过 Browser Bridge 复用真实浏览器会话的 Cookie全程以ArgumentError/EmptyResultError/AuthRequiredError三类语义清晰的错误暴露异常参数校验坚持“快速失败、拒绝静默截断”保证 Agent 拿到的数据完整可信。无论你是想定时监控海外面经/内推话题、追踪某位用户的发帖动态还是在自己的 Agent 工作流中接入一亩三分地的检索能力这 9 个命令已经覆盖了从列表、详情、用户到搜索与通知的完整闭环。【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表