ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

OpenCLI 微博适配器实战指南:基于浏览器登录态的微博热搜、时间线、搜索与发布删除

OpenCLI 微博适配器实战指南:基于浏览器登录态的微博热搜、时间线、搜索与发布删除 OpenCLI 微博适配器实战指南基于浏览器登录态的微博热搜、时间线、搜索与发布删除【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI微博是典型的高强度反爬站点普通 HTTP 请求方案极易失效。OpenCLI 的weibo适配器Browser 模式另辟蹊径它直接复用你 Chrome 中已登录的 weibo.com 会话通过 Browser Bridge 在页面上下文内调用微博内部 AJAX 接口完成数据读取并以 UI 自动化完成发布与删除等写操作。本文以 weibo 适配器文档 为核心结合 clis/weibo 目录下的完整源码逐条拆解全部 11 个命令的参数、输出列、底层调用链与边界处理让你能直接在终端中完成微博数据采集与账号内容管理。运行模式与前置条件weibo适配器属于 Browser 模式声明为 Browser目标域名为weibo.com。这意味着它不像普通 CLI 那样直连微博开放 API而是借助 OpenCLI 的 Browser Bridge 架构在真实浏览器中执行 JavaScript。整个链路为opencli (Node.js) ──WebSocket──► micro-daemon ──Chrome API──► Chrome 浏览器已登录 weibo.com运行前需要满足两个前置条件见原文档 PrerequisitesChrome 正在运行且已登录 weibo.com—— 所有命令复用的都是浏览器会话里的登录态Cookie并非独立账号体系已安装 Browser Bridge 扩展—— 详细安装步骤参见 docs/guide/browser-bridge.md下载预构建 zip 后解压在chrome://extensions开启开发者模式并加载未打包扩展安装完成后无需任何 token 或手动配置守护进程会在首次执行浏览器命令时自动启动可用opencli doctor验证连通性。从源码结构看weibo目录下除各命令文件外还有auth.js专门负责登录态检测与身份校验utils.js提供所有命令共享的 evaluate 结果解包与 uid 解析工具。命令总览原文档给出的命令表覆盖了读、写两类操作完整整理如下各命令源码位于 clis/weibo命令说明源码文件opencli weibo hot微博热搜clis/weibo/hot.jsopencli weibo search按关键词搜索微博clis/weibo/search.jsopencli weibo feed首页时间线for-you/followingclis/weibo/feed.jsopencli weibo user用户信息clis/weibo/user.jsopencli weibo user-posts按用户列出微博可选日期范围clis/weibo/user-posts.jsopencli weibo me我的信息clis/weibo/me.jsopencli weibo post读取单条微博clis/weibo/post.jsopencli weibo favorites我的微博收藏列表clis/weibo/favorites.jsopencli weibo publish通过网页 UI 直接发布微博支持最多 9 张图片clis/weibo/publish.jsopencli weibo delete删除登录账号自己的单条微博clis/weibo/delete.jsopencli weibo comments微博评论clis/weibo/comments.js除publish采用Strategy.UI真实驱动网页 UI外其余命令在源码中均注册为strategy: Strategy.COOKIE即依赖 Cookie 在页面内请求微博内部接口。所有读命令的access均为readpublish与delete为write。快速上手示例原文档给出的命令序列可以直接照抄使用这里逐条补充参数含义# 快速开始拉取前 5 条热搜 opencli weibo hot --limit 5 # JSON 输出适用于管道或 Agent 消费 opencli weibo hot -f json # 关键词搜索 opencli weibo search OpenAI --limit 5 # 首页时间线默认 for-you / 推荐流 opencli weibo feed --limit 10 # 仅关注流严格按时间排序的关注时间线 opencli weibo feed --type following --limit 10 # 用 feed/search 输出的 id 读取单条微博 opencli weibo post id # 按 uid 或昵称列出用户微博并限定日期范围 opencli weibo user-posts 1670458304 --start 2025-06-01 --end 2025-06-02 --limit 20 # 详细输出模式 opencli weibo hot -v # 我的收藏 opencli weibo favorites --limit 20 # 发布纯文本立即执行 opencli weibo publish Hello from OpenCLI # 发布带图微博立即执行 opencli weibo publish Hello with images --images /path/a.jpg,/path/b.png # 删除自己的一条微博立即执行 opencli weibo delete id需要特别注意的是publish与delete是立即执行的写操作命令一旦运行就会真实发布或删除微博Agent 或脚本调用前务必做二次确认。读操作命令详解微博热搜weibo hothot是使用频率最高的命令参数与输出列如下参数--limit整数默认 30最大 50输出列rank、word、hot_value、category、label、url。从 hot.js 源码看实现路径是先page.goto(https://weibo.com)建立会话再在页面上下文内fetch(/ajax/statuses/hot_band, {credentials: include})拉取热搜榜单随后把band_list映射为结构化行。其中rank取接口返回的realpos缺失时回退为数组序号加一hot_value取item.num热度值无值时为 0url被构造成https://s.weibo.com/weibo?q#词条#的搜索链接便于后续直接跳转查看。原文档特别强调hot返回的是搜索话题search topics不是微博正文行因此不能把它的输出直接传给post id。关键词搜索weibo search参数keyword必填位置参数、--limit默认 10最大 50输出列rank、id、title、author、time、url。与hot走接口不同search.js 采用的是DOM 提取策略跳转到https://s.weibo.com/weibo?q编码后的关键词并等待 2 秒后遍历.card-wrap卡片依次用[node-typefeed_list_content_full]、[node-typefeed_list_content]、.txt定位正文用.info .name定位作者从.from a中提取时间与链接并通过正则从 URL 中解析出微博id支持/数字/字母id与/detail/、/status/两种路径形态。源码中还处理了三个易踩的坑相对链接补全//开头补协议、/开头补window.location.origin保证url列永远是可点击的绝对地址空白清洗所有文本用\s → 折叠后再trim()空结果错误无结果时抛出CliError(NOT_FOUND, ...)提示更换关键词或确认已登录 weibo.com。时间线weibo feed参数--type取值for-you默认算法推荐流或following严格时间序关注流--limit默认 15最大 50输出列id、author、text、reposts、comments、likes、time、url。feed.js 源码中定义了两个内部端点映射const TIMELINE_ENDPOINTS { for-you: unreadfriendstimeline, following: friendstimeline, };请求参数核心是list_id 10001 uid微博时间线列表 ID 的固定拼接规则配合refresh4since_id0countlimit。正文优先取text_raw纯文本字段缺失时用正则剥离 HTML 标签若存在retweeted_status转发微博会额外输出retweeted字段形如原博主: 原文前 100 字。url列按https://weibo.com/uid/mblogid拼接可直接用于后续post命令。单条微博weibo post参数id必填位置参数支持数字idstr或 URL 中的mblogid输出列field、value键值对行式输出。post.js 的底层链路是GET /ajax/statuses/show?idid随后把返回对象展开为field/value两列包含id、mblogid、author、text、created_at、source、reposts、comments、likes、pic_count、url转发微博还会附加retweeted_from与retweeted_text。值得注意的源码细节是长微博处理当isLongText/is_long_text为真时会二次请求/ajax/statuses/longtext?ididstr并用longTextContent覆盖正文确保长文不被截断。用户信息与我的信息weibo user/weibo meuser与me的差异仅在于身份来源user需要传入id数字 uid 或屏幕名me则自动取当前登录者。weibo user id输出列screen_name、uid、followers、following、statuses、verified、description、location、url另有verified_reason、gender、avatar、birthday、created_at、ip_location等扩展字段。实现上先按是否为纯数字判断查询方式uidid或screen_name编码请求/ajax/profile/info再请求/ajax/profile/detail?uidid补齐资料细节。weibo me无参数输出列screen_name、uid、followers、following、statuses、verified、location。源码 me.js 优先读取 Vue store#app上的__vue_app__全局$store中的用户对象失败后回退到/ajax/profile/info?uiduid。用户微博列表weibo user-posts这是参数最丰富、校验最严格的读命令适合做定向内容采集参数类型默认说明id位置参数必填—数字 uid 或屏幕名--start字符串无开始日期YYYY-MM-DD按 Asia/Shanghai 时区--end字符串无结束日期YYYY-MM-DD按 Asia/Shanghai 时区--limit整数201100--include-retweets布尔false是否包含转发微博输出列rank、id、mblogid、author、uid、text、time、reposts、comments、likes、pic_count、url。user-posts.js 的源码实现要点输入校验readDate用正则^\d{4}-\d{2}-\d{2}$校验格式并通过new Date(YYYY-MM-DDT00:00:0008:00)与Intl.DateTimeFormatAsia/Shanghai双向验证是合法日历日validateRange确保start endreadLimit限定 1100违规直接抛ArgumentError昵称解析非纯数字的id先请求/ajax/profile/info?screen_name...解析出真实 uid分页抓取循环调用/ajax/statuses/searchProfile参数uid、page、hasori1、hasret由--include-retweets决定、starttime/endtime由日期换算为秒级时间戳单页少于 10 条即提前终止最多翻 20 页错误归类mapError会把含login|cookie|登录|auth|forbidden|权限|unauthorized的消息映射为AuthRequiredError提示重新登录零结果抛EmptyResultError。收藏与评论weibo favorites/weibo commentsweibo favorites --limit N默认 20、最大 50输出列author、text、time、source、likes、comments、reposts、url。源码 favorites.js 的实现与前述接口类命令不同先跳转到个人收藏页https://www.weibo.com/u/page/fav/uid等待 4 秒后分 3 次scrollBy(0, 800)触发懒加载再从.wbpro-scroller-item/.vue-recycle-scroller__item-view虚拟滚动节点中提取文本与链接最后经parseFavoriteCard按换行切分作者/时间/来源/内容/互动数与dedupeFavorites按 URL 或作者文本时间去重得到结构化结果weibo comments id --limit N默认 20、最大 50输出列rank、author、text、likes、replies、time。底层请求/ajax/statuses/buildComments?flow0is_reload1ididis_show_bulletin2is_mix0countlimit若评论本身是回复额外输出reply_to被回复者 被回复内容前 80 字。写操作命令详解发布微博weibo publish参数text必填位置参数最长 2000 字符、--images逗号分隔的图片路径最多 9 张仅支持 jpg/jpeg/png/gif/webp自动path.resolve为绝对路径并校验文件存在输出列status、message、text。这是唯一使用Strategy.UI的命令。publish.js 注释中完整记录了 8 步 UI 自动化流程跳转并等待加载 → 用getSelfUid校验登录态 → 点击发微博按钮打开内联编辑器 → 轮询等待可见的 textarea10 秒超时→ 通过 CDPsetFileInput上传图片30 秒超时等待上传进度条消失且图片数量达标→ 写入正文 → 点击发送/发布按钮 → 轮询识别成功/失败提示20 秒超时。源码中有三个值得展开的工程细节选择器抗漂移微博 PC 端 CSS-module 哈希每次前端构建都会变化因此TEXTAREA_SELECTORS优先匹配稳定的占位符文本textarea[placeholder*有什么新鲜事]把哈希类名textarea._input_13iqr_8作为兜底同时取最后一个可见匹配因为编辑器弹层渲染在首页信息流条之上后渲染者才是真正目标Vue 响应式陷阱直接ta.value ...会绕过微博的 Vue 响应式系统导致发布内容变成undefined因此用Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, value).set拿到 native setter 赋值再手动派发input/change事件——代码注释明确标注了这一坑结果确认轮询页面文本中的成功标记发布成功/已发布/发送成功与失败标记发布失败/发送失败/内容违规/请稍后再试/频繁20 秒内无明确结果则报结果不明确请到网页端人工确认避免误报成功。图片上传还依赖浏览器扩展提供page.setFileInput能力若扩展版本过旧会直接提示升级扩展。删除微博weibo delete参数id必填位置参数接受数字idstr、mblogid或完整微博 URL输出列status、id、mblogid。delete.js 实现了三步带后置校验的删除流程是可验证的写操作的范例解析与归一化normalizePostId先尝试把输入当 URL 解析——必须是weibo.com或weibo.cn的 http/https 链接从 pathname 中提取微博 IDweibo.cn/status/id取第二段其余取最后一段最终用正则^[A-Za-z0-9]{4,32}$校验执行删除先GET /ajax/statuses/show?idid把任意输入解析为规范idstr404 视为不存在而非 HTTP 错误再向/ajax/statuses/destroy发起 POST请求头必须携带从XSRF-TOKENCookie 读取的X-Xsrf-Token微博双重提交 CSRF 机制只有响应体ok 1才判定删除接口成功后置证据校验删除后再次请求/ajax/statuses/show?ididstr只有返回 404目标已不存在才向调用方报告status: deleted若帖子仍然存在则抛still_exists错误。这样API 返回成功但实际未删除的情况不会被静默吞掉。401/403 统一映射为AuthRequiredError并提示Cookie 已过期请在当前 Chrome 浏览器中重新登录 Weibo帖子不存在则抛EmptyResultError。认证机制与身份解析所有命令能否运行取决于浏览器中 weibo.com 的登录态。weibo目录的 auth.js 通过registerSiteAuthCommands见 clis/_shared/site-auth.js向 CLI 注册weibo auth相关的登录状态检查命令快速检查读取 weibo.com 域名下 Cookie要求同时存在SUB与SUBP两个会话 Cookie身份校验verifyWeiboIdentity先跳转首页等待 3 秒用getSelfUid解析 uid再探测/ajax/profile/info?uiduid是否返回真实用户输出user_id、screen_name、profile_url登录跳转loginUrl指向https://weibo.com/login。而getSelfUidclis/weibo/utils.js采用两级解析优先读取 Vue store——document.querySelector(#app).__vue_app__.config.globalProperties.$store.state.config.config.uid失败则回退请求/ajax/config/get_config从data.uid取值两者都拿不到即抛AuthRequiredError。utils.js还导出了unwrapEvaluateResult与requireArrayEvaluateResult/requireObjectEvaluateResult。前者专门处理不同版本 Browser Bridge 的返回差异page.evaluate可能直接返回 IIFE 原始值也可能包一层{ session, data }信封统一解包避免调用方拿到信封而非真实数据后者则保证提取结果为数组/对象并对含error字段的负载抛出带上下文的CommandExecutionError。这些函数被 feed.js、post.js、hot.js 等所有命令复用。输出列与命令衔接规则原文档的 Listing Columns 一节明确了命令间数据流转的关键约定feed、search、user-posts三个列表命令都会为每行输出id列可直接把该值传给opencli weibo post id读取完整微博hot输出的是搜索话题行word不是微博行不能用于postdelete的id参数同样兼容来自weibo me、weibo post输出的idstr/mblogid甚至可以直接粘贴完整微博 URL。这种列表命令产出 id → 详情命令消费 id的衔接设计让 Agent 可以很自然地编排多步工作流先feed或search拿到候选列表再逐个post深读命中目标后comments看讨论必要时publish参与或delete清理。小结OpenCLI 的weibo适配器把微博从只能网页手点变成了一组结构化的终端命令读侧以 Cookie 策略复用登录态调用/ajax/*内部接口hot、feed、post、user、user-posts、comments或做 DOM 提取search、favorites写侧以 UI 自动化完成发布含最多 9 图上传与带后置验证的删除。所有命令共享一套错误语义——登录失效抛AuthRequiredError、空结果抛EmptyResultError、参数非法抛ArgumentError——便于 Agent 与脚本做确定性处理。其配套测试clis/weibo 下的*.test.js覆盖了 uid 解析、日期校验、收藏解析、发布参数校验、删除 ID 归一化等核心逻辑可作为二次开发与回归验证的参照。【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表