ARTICLE DETAIL

资讯详情

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

OpenCLI Grok 适配器实战:用浏览器会话在终端驱动 grok.com 聊天、图像生成与对话导出

OpenCLI Grok 适配器实战:用浏览器会话在终端驱动 grok.com 聊天、图像生成与对话导出 OpenCLI Grok 适配器实战用浏览器会话在终端驱动 grok.com 聊天、图像生成与对话导出【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI本指南以 OpenCLI 仓库中 grok 适配器文档 为主体完整讲解如何通过opencli grok系列命令在终端驱动 grok.com 的聊天、历史阅读、对话导出、图像生成与会话管理。所有命令都复用你已登录的 Chrome 浏览器会话无需 API Key读完本文你将掌握每个命令的参数、输出列、底层实现原理与异常处理策略能够直接在 Agent 工作流中集成 Grok。模式与原理浏览器适配器Browser AdapterGrok 适配器属于 Browser 模式作用于grok.com域。与需要 API Key 的云端适配器不同浏览器适配器的核心思路是CLI 通过 Browser Bridge 扩展 连接到你的 Chrome 实例在已登录的 grok.com 页面上下文中执行 JavaScript从而驱动真实页面完成交互。整个链路为opencliNode.js↔ WebSocketlocalhost:19825↔ micro-daemon自动启动↔ Chrome 扩展 ↔ grok.com 页面。浏览器扩展在网页上下文中执行脚本天然携带登录 Cookie因此不需要任何令牌或手动配置。从源码结构看适配器由 clis/grok 目录下的 13 个命令文件加上一个共享工具模块 clis/grok/utils.js 组成status、history、read、detail、export、export-all为只读操作access:readask、send、new、image、pin、unpin、delete为写入操作access:write所有命令都声明strategy: Strategy.COOKIE、browser: true、siteSession: persistent详见各命令源码如 ask.js意味着命令默认复用同一个持续会话的 Grok 页面连续调用ask/read/detail会停留在同一页面上下文。前置条件在运行任何opencli grok命令前请确认Chrome 正在运行已登录 grok.com在 Chrome 中完成登录Browser Bridge 扩展 已安装。Browser Bridge 的安装非常简单在chrome://extensions开启开发者模式后加载extension/目录源码方式或官方 Release 的 zip 包即可。装好后无需任何配置daemon 会在首次执行浏览器命令时自动启动可用opencli doctor检查扩展与 daemon 的连接状态详见 docs/guide/browser-bridge.md。命令总览下表是opencli grok的完整命令清单、功能与访问级别写操作会改变 Grok 账户数据只读操作仅读取页面CommandDescriptionAccessopencli grok statusPage availability, login state, current model and sessionreadopencli grok historyList recent conversations from the sidebar (requires login)readopencli grok readRead messages in the current conversationreadopencli grok detail idOpen a conversation by ID and read its messagesreadopencli grok exportExport visible conversation history metadata from the history dialogreadopencli grok export-allExport conversation metadata plus per-conversation transcript JSONreadopencli grok ask promptSend a prompt and wait for the assistant replywriteopencli grok send promptFire-and-forget: send a prompt without waitingwriteopencli grok newStart a fresh conversationwriteopencli grok image promptGenerate images via Grok and return their URLswriteopencli grok pin idPin a conversation from the sidebar context menuwriteopencli grok unpin idUnpin a conversation from the sidebar context menuwriteopencli grok delete id --yesDelete a sidebar conversation after an explicit--yesconfirmationwrite会话与状态检查status / new / historystatus最快的健康检查opencli grok status返回页面可用性、登录状态、当前模型与会话 ID是所有 Grok 命令的体检入口opencli grok status输出列Status, Login, Model, SessionId, Url。底层实现位于 clis/grok/status.js先ensureOnGrok(page)确保停留在 grok.com然后并行执行登录检测、会话 ID 提取、模型标签提取。其中登录检测逻辑utils.js以输入框composer是否存在作为登录标志——登出状态下 grok.com 渲染的是Sign in引导按钮而非 TipTap 编辑器模型标签则优先使用稳定的#model-select-trigger选择器而非随浏览器语言变化的 aria-labelutils.js。需要注意当模型或会话 ID 无法检测时如页面仍在加载status返回的Model/SessionId是null而不是字符串哨兵值源码中明确Model: model ? model : nullAgent 代码中应针对null做分支判断。new开启新对话opencli grok new输出列Status。底层实现很简洁new.jsGrok 当前 UI 没有独立的新建对话按钮startNewChat的做法是直接导航回https://grok.com/首页utils.js因此该命令等价于回到首页开始新会话。history从侧边栏列出最近对话opencli grok history --limit 10输出列Index, Title, UrlUrl 为https://grok.com/c/id形式。--limit默认 20、最大 100。需要登录未登录抛AuthRequiredError。底层逻辑history.js utils.js扫描侧边栏中所有a[href^/c/]可见链接按 UUID 去重后提取标题针对侧边栏中标题链接与图标链接图标链接无文本的 DOM 顺序问题采用两遍扫描先收集首个非空标题再用第二轮为同 ID 的空标题回填。注意history读取的是当前侧边栏可见部分——如果 Grok 懒加载了更早的对话需要先在浏览器里滚动侧边栏或直接用detail id。limit的校验是硬性的非正整数或超过上限会直接抛出ArgumentErrormust be a positive integer/must be 100不会静默截断。阅读对话read 与 detailread读取当前对话# 以 markdown 输出助手回复 opencli grok read --markdown true输出列Role, Text。read读取当前标签页正在显示的对话即使不传 ID 也能工作配合status先拿到当前 SessionId 是推荐用法。若页面没有可见消息返回一行Role: system, Text: No visible messages in the current conversation.read.js。detail按 ID 打开历史对话opencli grok detail 7c4197f2-10a1-4ebb-a84a-fea89f4f1d06 opencli grok detail https://grok.com/c/7c4197f2-10a1-4ebb-a84a-fea89f4f1d06 --markdown true输出列Role, Text。detail会导航到https://grok.com/c/id并轮询等待对话记录加载最长约 20 秒见 detail.js避免页面壳先渲染而消息后加载导致的竞态如果轮询结束仍无可见消息抛出EmptyResultError提示核对 ID 是否属于当前登录账户。消息读取的底层实现read/detail都基于getMessageBubblesutils.js通过[data-testiduser-message]/[data-testidassistant-message]区分角色向上查找最近的idresponse-uuid祖先作为每条消息的稳定 ID用于轮询去重保留仅含图片/非文本组件的助手回合text 为空但 html 非空也会保留避免图回合被静默丢弃--markdown true时助手回复的 HTML 通过bubbleHtmlToMarkdownutils.js转为 Markdown。对应的单元测试见 clis/grok/utils.test.js覆盖了会话 ID 解析、域名判断、布尔参数归一化、置顶状态识别等核心函数。会话 ID 与 URL 解析规则detail、pin、unpin、delete都接受会话 ID 参数统一由parseGrokSessionIdutils.js解析规则如下裸 UUID7c4197f2-10a1-4ebb-a84a-fea89f4f1d06直接接受完整 URLhttps://grok.com/c/id或子域https://x.grok.com/c/id提取其中的 UUID只接受https:协议与grok.com/*.grok.com主机名路径必须精确匹配/c/uuid校验失败抛出ArgumentError并附期望格式提示URL 尾部拼接额外十六进制字符如/c/id0会被拒绝防止静默截断打开错误会话。utils.test.js 对此有非常完整的测试矩阵包括大小写归一化、evil.com伪装域名、http:明文协议、路径多余片段等边界情形。发送消息ask 与 sendask发送并等待回复opencli grok ask Explain quantum computing in simple terms opencli grok ask Hello --new true输出列response仅返回助手最新回复文本。--timeout控制最长等待秒数默认 120--new指定是否先开启新会话默认false。ask的完整调用链ask.js若--newstartNewChat导航回首页否则ensureOnGrok确保停留在 grok.comisLoggedIn校验登录未登录抛AuthRequiredErrorgetBaselineLastAssistantId记录发送前最后一条助手消息 ID防止把旧回复当新回复sendMessage注入提示词并触发提交waitForAnswer轮询等待流式回复稳定。sendfire-and-forgetopencli grok send continue the previous answer输出列Status, Prompt。send只负责把提示词发出去、确认已提交返回Status: sent不等待回复send.js若发送时发现 composer 缺失且登录态已失效会抛AuthRequiredError而非笼统的执行失败方便 Agent 触发重新认证。发送与等待的底层原理sendMessageutils.js优先使用 ProseMirror 编辑器的editor.commands.insertContent注入文本提交按钮优先使用语言无关的button[data-testidchat-submit]回退到aria-labelSubmit / 提交 / 送信若提交按钮始终未出现某些地区部署无提交按钮源码注释引用 issue #1782则退化为对聚焦的编辑器派发 Enter 键keydown/keypress/keyup 完整链。提交后通过出现新的匹配用户回合来确认发送成功而不是盲目信任点击。waitForAnswerutils.js采用稳定性判定策略每 2 秒轮询一次跳过与发送前基线相同的旧助手回合只有当回复文本连续两次轮询保持一致且已等待至少 6 秒才判定为稳定并返回ok超时但已有部分内容时返回partial保留最佳努力文本不丢弃完全无内容才抛TimeoutError。导出对话export 与 export-allexport导出历史元数据opencli grok export --limit 25 -f json grok-history.json输出列index, id, title, date, url。--limit默认 00 表示全部已加载的历史--maxScrolls默认 80、最大 500。底层实现export.js会打开完整的全部历史对话框自动点击查看全部 / Show all / View all按钮然后在对话框滚动容器内反复滚动到底并采集a[href^/c/]链接直到连续多轮行数与滚动高度不再变化判定稳定或达到maxScrolls上限每条记录提取title、date与真实的https://grok.com/c/idURL。若出现登录失效检测到 Sign in CTA 且无历史入口返回AUTH错误码对话框未打开返回NO_DIALOG错误码畸形行会被视为选择器漂移而报错绝不静默丢弃由normalizeConversationRows严格校验见 export-utils.js。export-all导出元数据 逐会话完整转录opencli grok export-all --manifestPath grok-history.json --limit 25 -f json grok-transcripts.json输出列index, id, title, date, url, status, messageCount, error, messagesJson。export-all在export的基础上逐个访问每个会话的/c/id页面并导出完整消息转录每行额外包含statusok/empty/failedmessageCount该会话可见消息数error失败原因如页面加载后无可见消息、读取器返回畸形行messagesJson转录的 JSON 字符串每条含messageIndex、messageId、messageRole、messageText。关键参数export-all.jsOptionDescription--limitMax conversations to export;0means all loaded history or all manifest rows after offset--offsetSkip this many conversations before exporting (default:0)--manifestPathOptional JSON output fromgrok export; when present, skips history discovery and visits listed/c/idpages--maxScrollsMax history-dialog scroll rounds when no manifest is provided (default:80, max500)--pageScrollsMax per-conversation scroll-to-bottom rounds (default:30, max200)--pageTimeoutMsMax wait for each conversation page to show messages (default:30000)--delayMinMsMinimum polite delay after a conversation page loads (default:0)--delayMaxMsMaximum polite delay after a conversation page loads (default:5000)工作方式若提供--manifestPath直接从grok export生成的 JSON 清单读取会话列表跳过历史对话框发现过程按offset/limit切片后逐个访问/c/id页面否则先执行与export相同的历史对话框滚动采集。每个会话页面等待消息气泡出现pageTimeoutMs、加载后随机礼貌延迟delayMinMs~delayMaxMs、滚动到底部采集全部消息pageScrolls轮连续 5 轮稳定即止最后严格校验每行转录结构。页面无可见转录产出empty行转录行畸形产出failed行而畸形历史行或清单会在导出前直接失败不会产生残缺导出。参数校验同样硬性delayMaxMs必须 delayMinMs各整数参数越界抛ArgumentError。图像生成imageopencli grok image a cyberpunk mechanical owl, neon purple and blue --new true输出列url, width, height, path。额外参数--timeout默认 240 秒、--new默认false、--count返回前至少等待的图片数默认 1、--out下载保存目录。完整流程image.js记录发送前的图片气泡基线数避免把旧图当新图通过 composer 发送提示词优先 ProseMirror回退 textarea每 3 秒轮询消息气泡中的img元素过滤小于 128px 的头像/UI 小图、按 src 去重用连续两次稳定签名约 6 秒判定生成完成超时但有部分图片时保留最佳努力结果完全无图抛TimeoutError。下载机制值得注意当传入--out时图片是通过浏览器页面的fetch携带credentials: include与 grok.com referer以 base64 拉取再写入本地文件的image.js。这是因为 assets.grok.com 由 Cloudflare 防护直接 curl/node 下载会被拒绝利用浏览器会话即可绕过。下载失败会响亮地抛出CommandExecutionError而非输出[DOWNLOAD FAILED]哨兵路径文件名形如grok-timestamp-sha1前12位.ext。会话管理pin / unpin / deletepin / unpinopencli grok pin 7c4197f2-10a1-4ebb-a84a-fea89f4f1d06 opencli grok unpin https://grok.com/c/7c4197f2-10a1-4ebb-a84a-fea89f4f1d06输出列status, id。这两个命令pin.js通过共享的defineToggle工厂注册Grok 上下文菜单根据当前置顶状态只显示置顶或取消置顶之一不会同时出现因此两个命令各自绑定匹配的本地化菜单项。执行逻辑为先读取右键菜单标签判断当前状态若已处于目标状态则幂等返回already-pinned/already-unpinned否则右键打开上下文菜单点击目标项再轮询验证菜单标签确实翻转waitForConversationPinState验证失败会抛出包含可用菜单标签的执行错误。delete带 dry-run 保护# 预览dry-run opencli grok delete 7c4197f2-10a1-4ebb-a84a-fea89f4f1d06 # 真正删除 opencli grok delete 7c4197f2-10a1-4ebb-a84a-fea89f4f1d06 --yes true输出列status, id。删除操作是危险操作Grok 的删除是立即生效、无确认弹窗的源码注释明确记录这一点因此delete默认只是 dry-run 预览返回status: dry-run (pass --yes to actually delete)必须显式传入--yes才真正删除。真正删除后还会轮询确认侧边栏条目确实消失才返回deletedwaitForConversationToDisappear否则抛执行错误。右键菜单模拟的底层细节pin/unpin/delete依赖clickConversationMenuItemutils.js其中有一个值得注意的实现细节Grok 的上下文菜单由 radix 实现只派发contextmenu事件会被忽略因此代码完整派发了pointerdown → mousedown → contextmenu → pointerup → mouseup事件链带button: 2右键状态并在目标链接的边界矩形内选择命中坐标。菜单项匹配支持中英文等多语言标签置顶/Pin、取消置顶/Unpin、删除/Delete、打开新标签页/Open in new tab、重命名/Rename。输出列速查表CommandColumnsstatusStatus, Login, Model, SessionId, UrlhistoryIndex, Title, UrlreadRole, TextdetailRole, Textexportindex, id, title, date, urlexport-allindex, id, title, date, url, status, messageCount, error, messagesJsonaskresponsesendStatus, PromptnewStatuspinstatus, idunpinstatus, iddeletestatus, id完整选项参考ask/sendOptionDescriptionpromptPrompt to send (required positional)--newStart a new chat before sending (default:false)--timeout(askonly) Max seconds to wait for the reply (default:120)readOptionDescription--markdownEmit assistant replies as markdown (default:false)detailOptionDescriptionidSession ID (UUID) or fullhttps://grok.com/c/idURL (required positional)--markdownEmit assistant replies as markdown (default:false)historyOptionDescription--limitMax conversations to list (default:20, max100)exportOptionDescription--limitMax conversations to export;0means all loaded history (default:0)--maxScrollsMax history-dialog scroll rounds (default:80, max500)export-allOptionDescription--limitMax conversations to export;0means all loaded history or all manifest rows after offset--offsetSkip this many conversations before exporting (default:0)--manifestPathOptional JSON output fromgrok export; when present, skips history discovery and visits listed/c/idpages--maxScrollsMax history-dialog scroll rounds when no manifest is provided (default:80, max500)--pageScrollsMax per-conversation scroll-to-bottom rounds (default:30, max200)--pageTimeoutMsMax wait for each conversation page to show messages (default:30000)--delayMinMsMinimum polite delay after a conversation page loads (default:0)--delayMaxMsMaximum polite delay after a conversation page loads (default:5000)pin/unpin/deleteOptionDescriptionidSession ID (UUID) or fullhttps://grok.com/c/idURL (required positional)--yes(deleteonly) Actually delete the conversation; without it the command returns a dry-run row实战注意事项与陷阱read无 ID 也能用它读取当前标签页的对话组合用法是先用status获取 SessionId再决定read还是detail。会话持续性Grok 命令默认使用持久站点会话连续ask/read/detail会在同一个 Grok 页面内继续需要一次性标签页时传--site-session ephemeral。askvssendask等流式回复稳定后返回send提交即返回。history受侧边栏可见性限制Grok 懒加载旧对话时先在浏览器里滚动侧边栏或直接用detail id。export的严格性畸形历史行按选择器漂移处理并报错不静默丢弃保证导出的 URL 全部真实可访问。export-all的行状态无可见转录的会话产生empty行带error畸形转录行产生failed行Agent 应消费status列做重试或跳过。pin/unpin/delete的验证闭环三个命令都要求操作可见于侧边栏的会话并在操作后验证上下文菜单状态pin/unpin或侧边栏条目消失delete才返回成功。null而非哨兵字符串status的Model/SessionId检测不到时是nullAgent 代码必须对null分支。DOM 漂移的应对Grok 产品改版可能导致 composer 检测失败opencli grok status是最快的体检手段。参数校验不静默limit等参数非法非正数或超过文档上限如history最大 100会直接抛ArgumentError不会悄悄截断。延伸阅读适配器权威文档docs/adapters/browser/grok.md核心共享实现clis/grok/utils.js会话 ID 解析、登录检测、消息气泡读取、发送与等待、右键菜单模拟各命令实现ask.js、read.js、detail.js、history.js、export.js、export-all.js、image.js、pin.js、delete.js、send.js、new.js、status.js导出行校验工具clis/grok/export-utils.js单元测试clis/grok/utils.test.js、clis/grok/ask.test.js、clis/grok/export.test.js、clis/grok/image.test.ts浏览器桥接与会话管理docs/guide/browser-bridge.md【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表