X to wechat
Skill fxw-labs/x-to-wechat
通过 opencli 抓取 X(Twitter) 最新热门新闻/trending 话题,自动生成爆款微信公众号文章(不少于1500字),并通过 browser-use 浏览器自动化发布到公众号草稿箱。触发词:热门新闻转公众号、X转公众号、twitter转公众号、爆款文章生成、热点文章发布、公众号自动发文、trending转文章、opencli抓热点。From its SKILL.md
npx -y skills add fxw-labs/x-to-wechatAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
32.6 KB, ~11.4k tokens by cl100k_base, as published. Nobody here has run it
X 热门新闻 → 公众号爆款文章 → 发布到草稿箱
概述
本 skill 实现端到端的「X 热点 → 公众号文章」工作流,分为三个阶段:
- 采集:通过 opencli 抓取 X/Twitter trending 话题及热门推文
- 生成:AI 生成不少于 1500 字的公众号爆款文章,展示给用户确认
- 发布:通过 browser-use MCP 自动化操作,将文章发布到公众号草稿箱(自动声明原创、填写作者、配图、设置封面、选择合集)
Phase 1:采集 X 热门内容
前置条件
- Chrome 浏览器已打开并登录 X (twitter.com)
- opencli 通过 Chrome 的 CDP 协议连接,复用 Chrome 的登录态
- 诊断命令:
opencli doctor(确认连接正常)
采集步骤
1. 获取 trending 话题
opencli twitter trending -f json --limit 20
2. 获取时间线热门
opencli twitter timeline -f json --limit 20
3.(可选)多源交叉验证
组合其他热点源,确保话题质量和热度判断准确:
opencli hackernews top -f json --limit 10
opencli weibo hot -f json --limit 10
数据提取
从返回的 JSON 中提取以下关键信息:
- 话题名称:trending topic 关键词
- 推文内容:高互动推文的核心内容
- 互动数据:点赞数、转发数、回复数
话题筛选标准
从采集结果中选择 1-3 个 最有爆款潜力的话题,筛选标准:
| 维度 | 说明 |
|---|---|
| 争议性 | 有正反观点交锋,能引发讨论 |
| 相关性 | 与中文读者利益/兴趣相关 |
| 深度空间 | 有足够背景可挖掘,不只是表面新闻 |
| 时效性 | 新鲜话题,中文圈尚未被大量报道 |
| 情感共鸣 | 能引发惊讶/愤怒/感动/好奇等情绪 |
opencli 高级筛选能力
opencli 支持更精准地筛选爆款素材:
--top-by-engagement N:按互动量排序,直接获取最热门的 N 条推文(用于 search 命令)- 高级搜索过滤:
--from <user>:指定特定用户的推文--has media:仅包含含媒体(图片/视频)的推文--exclude replies:排除回复,只看原创推文--product trending:筛选 trending 产品相关话题
示例:获取某话题下互动量最高的推文(排除回复、含媒体):
opencli twitter search "关键词" --top-by-engagement 10 --has media --exclude replies -f json
Phase 2:AI 生成公众号爆款文章
文章风格适配
根据话题类型自动选择写作风格:
| 话题类型 | 写作风格 | 语气特征 |
|---|---|---|
| 科技/商业 | 深度分析型 | 专业、有洞察、数据驱动 |
| 娱乐/文化 | 轻松幽默型 | 活泼、有梗、节奏感强 |
| 社会/争议 | 观点输出型 | 犀利、有立场、逻辑严密 |
| 突发/重大 | 全景解读型 | 冷静、全面、有深度 |
文章结构模板
标题:吸引眼球但不标题党,15-30字,可用数字/疑问/对比
摘要:50-120字,概括核心看点
开头(200-300字):用故事/数据/反问切入,制造阅读钩子
第一部分(300-400字):事件背景与原委
第二部分(300-400字):深度分析/多角度解读
第三部分(300-400字):对中文读者的启示/影响
结尾(150-200字):总结观点 + 引导互动(提问/投票/留言)
爆款要素清单
- 标题要有"信息差"感(让读者觉得"我不知道这个")
- 每段不超过 4 行,留白多,适合手机阅读
- 适当使用金句、类比、数据对比
- 结尾必须有互动引导(提问/投票)
- 全文不少于 1500 字(硬性要求)
- 小标题清晰,读者可快速扫读
- 关键数据/事实有出处说明
去 AI 味写作规范
参考 humanizer-zh 项目,生成的文章必须消除 AI 写作痕迹,读起来像真人写的。
5 条核心原则
- 删除填充短语 — 去掉开场白和强调性拐杖词("值得注意的是""不可否认""众所周知")
- 打破公式结构 — 避免二元对比、戏剧性分段、修辞性设置
- 变化节奏 — 混合句子长度,两项优于三项,段落结尾要多样化
- 信任读者 — 直接陈述事实,跳过软化、辩解和手把手引导
- 删除金句 — 如果听起来像可引用的名言警句,重写它
中文 AI 高频词黑名单(禁止使用)
以下词汇在 AI 生成文本中出现频率异常高,一律禁止:
此外、至关重要、深入探讨、强调、持久的、增强、培养、获得、突出(动词)、相互作用、复杂/复杂性、格局(抽象名词)、关键性的、展示、织锦、证明(动词)、宝贵的、充满活力的、坐落于、令人叹为观止、开创性、不可或缺、彰显、凸显、奠定、见证、标志着、象征着、反映了更广泛的、不断演变的、不可磨灭的
替代策略: 用具体事实替代抽象形容。不说"充满活力",说"每周三有夜市"。不说"至关重要",说"没它不行"。
必须消除的 AI 句式模式
| AI 模式 | 示例(错误) | 改写(正确) |
|---|---|---|
| 夸大象征意义 | "标志着XX演变史上的关键时刻" | "XX成立于2024年,负责……" |
| 否定式排比 | "不仅仅是XX,更是XX" | 直接说是什么 |
| 三段式法则 | "无缝、直观和强大" | 选两个,或列具体功能 |
| 同义词循环 | "主人公→主要角色→中心人物→英雄" | 用同一个词,别怕重复 |
| 模糊归因 | "行业专家表示""专家认为" | 给出具体人名/机构/数据 |
| 肤浅分析尾缀 | "……,彰显了其重要性" | 删掉,直接结束 |
| 宣传式语言 | "坐落在令人叹为观止的……" | "在杭州市中心,开了三年" |
| 破折号过度使用 | "XX——不是YY——而是ZZ" | 用逗号或分句 |
| 粗体轰炸 | 每段都有加粗 | 全文最多加粗 2-3 处关键句 |
| 通用积极结尾 | "未来充满希望""激动人心的时代" | 给具体事实或数据 |
注入人味的技巧
- 有观点:不要只报告事实,要对它们做出反应。"说实话,看到这个数据我第一反应是不信"
- 用"我":适当使用第一人称。"让我困扰的是……""我一直在想……"
- 承认复杂:"这确实让人纠结——一方面……另一方面……"
- 允许混乱:完美结构反而显得机械,偶尔跑个题、加个括号吐槽
- 感受要具体:不说"令人担忧",说"凌晨三点没人看着的时候,服务器还在跑,这让人不安"
- 节奏变化:短促有力的句子。然后是那种需要时间慢慢展开、层层递进的长句。混合使用
交付前检查清单
- 连续三个句子长度相同?→ 打断其中一个
- 段落都以整齐的单行结尾?→ 变换结尾方式
- 揭示前有破折号?→ 删掉
- 在解释隐喻或比喻?→ 相信读者能理解
- 使用了"此外""然而"等连接词?→ 考虑删除
- 三段式列举?→ 改为两项或四项
- 全文搜索黑名单词汇,确保零出现
标题公式参考
- 数字型:「X 上刷屏的 Y,Z 个细节你可能没注意到」
- 疑问型:「为什么全网都在讨论 X?真相可能和你想的不一样」
- 对比型:「X 火了,Y 慌了:一场 Z 的博弈」
- 揭秘型:「X 背后的 Y,比你想的复杂得多」
用户确认
文章生成后,必须先展示给用户确认,包括:
- 完整文章内容(标题 + 正文 + 摘要)
- 预估字数
- 询问用户是否需要修改
用户可能要求的修改:调整标题风格、增删内容、改变语气、更换话题等。
Phase 3:发布到公众号草稿箱(browser-use MCP 自动化)
前置条件
- 用户已在 Chrome 中登录微信公众号后台 (
mp.weixin.qq.com) - browser-use MCP 服务已启动
步骤 1:导航到公众号后台
navigate_page → url: "https://mp.weixin.qq.com"
take_snapshot → 确认已登录状态
- 检查 snapshot 中是否有用户信息/公众号名称
- 如果未登录:停止自动化,提示用户手动扫码登录后再继续
步骤 2:进入图文编辑页
- 在后台首页找到并点击「新的创作」或「图文消息」按钮
- 或直接导航到图文编辑页 URL
take_snapshot确认已进入编辑器界面
步骤 3:填写文章标题
take_snapshot → 找到标题输入框的 uid
fill(uid, "文章标题")
步骤 4:填写正文内容
take_snapshot → 找到正文编辑区域的 uid
使用 evaluate_script 注入 HTML 格式的正文内容:
evaluate_script: (html) => {
const editor = document.querySelector('.ProseMirror') ||
document.querySelector('[contenteditable="true"]') ||
document.querySelector('.rich_media_content');
if (editor) {
editor.innerHTML = html;
// 触发 input 事件让编辑器感知内容变化
editor.dispatchEvent(new Event('input', { bubbles: true }));
}
}
正文 HTML 格式要求:
- 段落用
<p>标签 - 小标题用
<strong>或<h2>标签 - 引用用
<blockquote>标签 - 重点内容可用
<strong>加粗 - 适当使用
<br>留白,适配公众号排版风格
步骤 5:填写作者和摘要
take_snapshot → 找到作者输入框和摘要输入框的 uid
fill(uid, "极客精研社")
fill(uid, "文章摘要")
作者名固定为「极客精研社」(根据公众号后台实际显示的名称)。
如找不到对应输入框,可跳过(标题和正文是必填项)。
步骤 6:设置原创声明
实际操作流程(已验证):
- 在编辑器右侧设置区域找到「文字原创」链接文本,点击它
- 弹出原创声明对话框,包含「文字原创」标题和作者信息(自动填入已设置的作者名)
- 勾选协议复选框(必须用
evaluate_script,因为是自定义组件,普通 click 无效):evaluate_script: () => { const checkbox = document.querySelector('INPUT.weui-desktop-form__checkbox'); if (checkbox) { checkbox.click(); return 'checked'; } return 'not found'; } - 勾选后点击「确定」按钮完成原创声明
- 如果提示「请勾选协议」,说明复选框未成功勾选,需要用 JS 重新点击 checkbox 后重试确定
- 成功后对话框关闭,右侧显示「文字原创 · 作者: XXX · 已开启快捷转载」
错误处理要点:
- 协议复选框是自定义组件,普通 click uid 方式可能无效,必须用
evaluate_script精确点击INPUT.weui-desktop-form__checkbox - 如果点击确定后提示「请勾选协议」,用 JS 再次点击 checkbox 后重试确定
- 部分公众号账号可能没有原创权限,如找不到「文字原创」选项则跳过
步骤 7:自动配图(正文内图片)
由于 opencli 采集的内容通常不包含高质量配图,本 skill 不自动生成 AI 图片,但提供以下策略:
策略 A:从推文内容中提取媒体链接
- 在 Phase 1 采集时,使用
opencli twitter search "关键词" --has media获取含媒体的推文 - 提取推文中的图片 URL
- 在正文 HTML 中插入
<img src="图片URL" alt="描述">标签
策略 B:使用占位图服务
- 在正文关键位置插入占位图:
https://picsum.photos/800/400?random=1 - 适合技术类文章的数据可视化展示
策略 C:用户手动上传
- 如果用户提供了图片素材,在注入正文 HTML 时包含
<img>标签 - 或者提示用户在保存前手动上传图片
默认行为: 本 skill 默认采用纯文本格式,不自动插入图片,避免版权问题和加载失败风险。如需配图,请在 Phase 1 明确要求「需要配图」,或在生成文章时指定图片来源。
步骤 8:自动选择封面图
实际操作流程(已验证):
优先方案:从正文选择封面
- 先滚动到封面区域:
evaluate_script: () => { const coverArea = document.querySelector('.weui-desktop-account__thumb'); if (coverArea) { coverArea.scrollIntoView({ behavior: 'smooth', block: 'center' }); return 'scrolled'; } return 'not found'; } - 点击封面按钮区域打开选项面板:
evaluate_script: () => { const coverBtn = document.querySelector('.js_cover_btn_area'); if (coverBtn) { coverBtn.click(); return 'clicked'; } return 'not found'; } - 在弹出的选项面板中,点击「从正文选择」链接:
evaluate_script: () => { const btn = document.querySelector('.js_selectCoverFromContent'); if (btn) { btn.click(); return 'clicked'; } return 'not found'; } - 弹出「选择图片」对话框,显示正文中所有图片的缩略图(背景图方式渲染在
span.appmsg_content_img.cover上) - 选择第一张图片(通常是最吸引眼球的新闻截图):
evaluate_script: () => { const items = document.querySelectorAll('.appmsg_content_img_item'); if (items.length > 0) { items[0].click(); return 'selected first, total: ' + items.length; } return 'no images'; } - 点击「下一步」按钮
- 进入封面编辑界面(支持裁剪),直接点击「确认」按钮完成
- 验证封面已设置:
evaluate_script: () => { const preview = document.querySelector('.js_cover_preview_new'); if (preview && preview.style.backgroundImage) return 'cover set: ' + preview.style.backgroundImage.substring(0, 80); return 'cover not set'; }
降级方案:本地上传封面
当「从正文选择」不可用(正文无图片、选项面板中无此选项)时,使用本地上传:
- 打开选项面板后,点击「本地上传」链接:
evaluate_script: () => { const btn = document.querySelector('.js_cover_local_upload, .js_local_upload'); if (btn) { btn.click(); return 'clicked'; } return 'not found'; } - 如果 JS 点击「本地上传」按钮无效,用
take_snapshot找到「本地上传」的 uid 后click(uid) - 系统文件选择对话框弹出后,自动化无法直接操作,需提示用户手动选择图片文件:
- 「已打开文件选择对话框,请选择一张封面图(建议尺寸 900x500)」
- 用户选择文件后,等待上传完成,
take_snapshot确认封面已设置
封面选择策略:
- 优先「从正文选择」第一张图(新闻截图),视觉冲击力最强
- 正文无图片或「从正文选择」不可用时,降级到「本地上传」,提示用户手动选择文件
错误处理要点:
- 封面区域的 click uid 操作可能超时,统一用
evaluate_script+ JS class 选择器操作 - 封面图片以 background-image 方式渲染,snapshot 中不显示为 image 元素,需用 JS 检查
- 封面编辑界面有两个比例选项(2.35:1 消息列表、1:1 转发卡片),默认裁剪即可直接确认
- 「本地上传」会触发系统文件选择对话框,browser-use 无法操作,需用户手动介入
步骤 9:自动选择合集
实际操作流程(已验证):
- 在编辑器右侧设置区域找到「合集」复选框,用
evaluate_script勾选启用合集功能:evaluate_script: () => { const checkbox = document.querySelector('.js_article_tags'); if (checkbox) { checkbox.click(); return 'clicked, checked=' + checkbox.checked; } return 'not found'; } - 勾选后,点击「未添加」区域(
.js_article_tags_label)打开合集选择弹窗:evaluate_script: () => { const label = document.querySelector('.js_article_tags_label'); if (label) { label.click(); return 'clicked'; } return 'not found'; } - 弹窗打开后,点击「请选择合集」输入框(
take_snapshot找到其 uid 后click(uid)) - 等待 2-3 秒让合集列表加载完成,
take_snapshot获取所有可用合集名称 - 根据文章内容选择最匹配的合集,点击对应合集名称的 uid
- 点击「确认」按钮完成合集选择
- 弹窗关闭后,
take_snapshot确认合集已显示(如「合集 骇客技术」)
合集选择策略:
- 根据文章主题关键词匹配最相关的合集
- 如果有多个候选合集,优先选择内容最相关的
- 如果没有任何合集与文章内容相关,跳过合集设置
错误处理要点:
- 合集复选框的 click uid 操作可能超时,统一用
evaluate_script+ JS class 选择器(.js_article_tags)操作 - 合集选择弹窗中的列表需要 2-3 秒加载,必须等待加载完成后再选择
- 「请选择合集」是自定义输入框组件,需用
take_snapshot找到 uid 后click(uid)触发下拉 - 如果账号下没有创建任何合集,弹窗中无列表可显示,直接跳过此步骤
步骤 10:保存为草稿
take_snapshot → 找到"保存为草稿"按钮的 uid(注意:是"保存"不是"发表")
click(uid)
take_screenshot → 截图确认保存成功
重要:一定要确认点击的是「保存为草稿」而非「发表」按钮,避免直接发布未审核内容。
操作注意事项
- 公众号后台是 SPA,页面元素选择器可能变化,始终以
take_snapshot返回的实际 uid 为准 - 每步操作之间用
take_snapshot确认状态,等待页面加载完成 - 保存前必须让用户确认内容
- 如果操作失败,截图给用户看当前状态,请求手动干预
详细错误处理与重试策略
每个操作步骤都可能失败。以下是按步骤分类的错误场景、诊断方法和重试流程。
通用原则
- 每步操作最多重试 3 次,每次重试前先用
take_snapshot检查当前页面状态 - 每次重试之间等待 2-3 秒(
wait_for或sleep),避免过快操作触发风控 - 如果 3 次重试均失败,
take_screenshot截图当前状态展示给用户,说明失败原因,请求手动干预 - 所有重试均失败后,不要继续执行后续步骤,等待用户指示
3.1 导航失败(步骤 1)
场景 A:页面加载超时 / 白屏
- 等待 5 秒后
take_snapshot检查页面是否加载 - 如果仍为空白,尝试
navigate_page重新导航一次 - 再次等待 5 秒,
take_snapshot确认 - 如果仍然白屏 → 截图告知用户,可能是网络问题,请用户检查网络后手动刷新
场景 B:检测到未登录(出现登录/扫码页面)
take_screenshot截图展示给用户- 提示:「检测到公众号后台未登录,请扫码登录后告诉我继续」
- 不自动重试登录,等待用户确认已登录后,再
take_snapshot检查状态 - 用户确认后如果仍未登录 → 再次提示,最多提示 2 次后建议用户手动检查账号状态
场景 C:跳转到异常页面(如安全验证、手机号验证)
take_screenshot截图给用户- 提示用户手动完成验证
- 等待用户确认后继续
3.2 找不到编辑入口(步骤 2)
场景 A:snapshot 中找不到「新的创作」或「图文消息」按钮
- 再次
take_snapshot,仔细检查返回的 UI 元素列表 - 尝试滚动页面(
scroll_down)后再次take_snapshot查找 - 如果仍找不到,尝试直接
navigate_page到图文编辑页 URL(如https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit) - 导航后
take_snapshot确认是否进入编辑器 - 如果直接 URL 也无法进入 → 截图给用户,请用户手动点击进入编辑页后告知继续
场景 B:点击按钮后页面无反应
- 等待 3 秒后
take_snapshot检查页面是否变化 - 再次
click同一个 uid - 等待 3 秒,
take_snapshot再次检查 - 如果仍无变化 → 尝试直接导航到编辑页 URL(同场景 A 第 3 步)
- 最终失败 → 截图给用户
3.3 标题填写失败(步骤 3)
场景 A:snapshot 中找不到标题输入框
- 再次
take_snapshot,尝试用不同关键词匹配(如搜索包含「标题」「title」文本的元素) - 尝试
scroll_up回到页面顶部后重新take_snapshot - 如果仍找不到 → 截图给用户,请用户指出标题输入框位置
场景 B:fill 后标题内容不正确
take_snapshot检查标题输入框的当前值- 如果内容不对,先
click标题输入框,然后press_key("Meta+a")全选,再fill正确内容 - 再次
take_snapshot验证标题是否正确
场景 C:fill 操作本身报错(如元素不可交互)
- 先
click标题输入框使其获得焦点 - 等待 1 秒后重试
fill - 如果仍失败,尝试
press_key逐字输入 - 最终失败 → 截图给用户
3.4 正文注入失败(步骤 4)—— 最关键步骤
场景 A:所有 CSS 选择器都找不到编辑器元素
按优先级依次尝试以下选择器:
.ProseMirror[contenteditable="true"].rich_media_content.editor-content#edui1_contentplaceholder.ql-editor
每个选择器的重试流程:
- 用
evaluate_script尝试该选择器 - 检查返回值是否为 null/undefined
- 如果为 null → 尝试下一个选择器
- 如果所有选择器都失败 → 进入场景 B 的降级方案
场景 B:JS 注入失败(选择器找到了但 innerHTML 设置无效)
降级方案 1 — 使用 fill + press_key:
click编辑区域 uid 使其获得焦点press_key("Meta+a")全选已有内容press_key("Backspace")清空- 将文章按段落拆分,对每一段:
- 使用
fill(uid, "本段文字内容")或press_key逐段输入 - 输入后
press_key("Enter")换行
- 使用
- 每输入 3-5 段后
take_snapshot检查内容是否正确累积
降级方案 2 — 分段剪贴板粘贴:
- 将文章 HTML 复制到剪贴板(如果环境支持)
click编辑区域press_key("Meta+v")粘贴take_snapshot检查内容
降级方案 3 — 纯文本逐段输入:
- 放弃富文本格式,改为纯文本
- 逐段
fill或press_key输入 - 段落之间用
press_key("Enter")分隔
场景 C:注入成功但内容为空或不完整
take_snapshot检查编辑器中实际显示的内容- 如果内容为空 → 可能是事件触发问题,在
evaluate_script中额外触发change事件:editor.dispatchEvent(new Event('change', { bubbles: true })); editor.dispatchEvent(new Event('blur', { bubbles: true })); - 如果内容不完整 → 检查 HTML 是否被截断,尝试分段注入(先注入前半部分,确认成功后再追加后半部分)
- 重试注入最多 3 次
场景 D:注入后格式错乱(如 HTML 标签被原样显示为文本)
- 说明编辑器未正确解析 HTML,改用降级方案 1 或 3
- 放弃 HTML 注入,改为纯文本输入
3.5 作者/摘要填写失败(步骤 5)
场景 A:找不到输入框
- 尝试
scroll_down后take_snapshot查找 - 作者和摘要为非必填项,如果找不到可跳过此步,不影响后续保存
- 如果用户明确要求填写 → 截图给用户,请用户指出位置
场景 B:fill 失败
- 先
click输入框使其获得焦点,重试fill - 最多重试 2 次
- 仍失败则跳过(非必填)
3.6 原创声明设置失败(步骤 6)
场景 A:找不到「文字原创」选项
take_snapshot仔细检查右侧设置区域是否有「文字原创」链接文本- 可能在「文章设置」折叠面板内 → 尝试
click展开「文章设置」后再查找 - 如果确实找不到 → 检查账号原创权限,部分账号无此权限,跳过此步继续
场景 B:协议复选框无法勾选
- 必须用
evaluate_script点击INPUT.weui-desktop-form__checkbox,普通 click uid 方式无效 - 用 JS 执行 checkbox 点击后,
take_snapshot确认复选框已勾选 - 如果 JS 点击后仍显示未勾选 → 检查选择器是否匹配,可能页面结构有变化
场景 C:点击确定后提示「请勾选协议」
- 说明复选框未成功勾选
- 用
evaluate_script再次点击INPUT.weui-desktop-form__checkbox - 再次点击「确定」按钮重试
- 最多重试 3 次,仍失败则取消原创勾选,继续后续步骤
场景 D:点击确定后对话框未关闭
- 等待 2 秒后
take_snapshot检查对话框是否仍在 - 如果对话框未关闭,用
evaluate_script查找并点击对话框内的「确定」按钮:evaluate_script: () => { const btns = document.querySelectorAll('.weui-desktop-dialog__btn_primary, .weui-desktop-dialog_bd .btn_primary'); for (const btn of btns) { if (btn.textContent.includes('确定')) { btn.click(); return 'clicked'; } } return 'not found'; } - 再次等待 2 秒,
take_snapshot确认对话框已关闭且右侧显示「文字原创」标记 - 如果对话框仍未关闭 →
take_screenshot截图给用户,请用户手动关闭对话框
3.7 配图失败(步骤 7)
场景 A:推文图片 URL 无法访问
- 图片可能设置了防盗链 → 降级到策略 B(占位图)或策略 C(手动上传)
- 在正文中移除该图片标签,改为文字描述
场景 B:占位图服务不可用
- 降级到策略 C(手动上传)
- 提示用户:「自动配图失败,请手动上传配图或跳过配图」
3.8 封面图设置失败(步骤 8)
场景 A:找不到封面上传区域
- 用
evaluate_script滚动到.weui-desktop-account__thumb区域后重试 take_snapshot查找包含「封面」文字的元素- 如果确实找不到 → 跳过封面设置,继续保存步骤
场景 B:正文无图片可选
- 弹出「选择图片」对话框后无图片缩略图显示
- 提示用户手动上传封面图:「正文中没有图片可用作封面,请手动上传一张封面图(建议尺寸 900x500)」
- 等待用户确认后继续
场景 C:封面确认后发现未设置
- 用
evaluate_script检查.js_cover_preview_new的backgroundImage属性确认封面是否生效 - 如果
backgroundImage为空 → 封面未设置成功,重试从正文选择流程 - 如果正文确实无图 → 降级到提示用户手动上传
场景 D:找不到「从正文选择」选项
- 点击封面按钮区域后,
take_snapshot检查弹出的选项面板中是否有「从正文选择」链接 - 如果选项面板未弹出 → 用
evaluate_script重新点击.js_cover_btn_area,等待 2 秒后再次检查 - 如果面板已弹出但无「从正文选择」选项 → 降级到「本地上传」方案:
- 用
evaluate_script点击「本地上传」按钮(.js_cover_local_upload或.js_local_upload) - 如果 JS 点击无效,用
take_snapshot找到「本地上传」uid 后click(uid) - 系统文件选择对话框弹出后,提示用户手动选择图片文件
- 用
- 如果所有选项都不可用 → 截图给用户,请用户手动设置封面
场景 E:「本地上传」按钮无法点击
- 先用
evaluate_script尝试点击.js_cover_local_upload或.js_local_upload - 如果 JS 点击无效 →
take_snapshot找到「本地上传」链接文本的 uid,用click(uid)点击 - 如果 uid 点击也无效 → 截图给用户,说明需要手动选择封面文件
3.9 合集设置失败(步骤 9)
场景 A:找不到合集复选框
- 用
evaluate_script检查.js_article_tags元素是否存在 - 如果不存在 → 用
take_snapshot查找包含「合集」文字的元素 - 如果确实找不到 → 跳过合集设置,继续后续步骤
场景 B:合集弹窗打开后无列表
- 等待 3 秒后
take_snapshot检查列表是否加载完成 - 如果仍无列表 → 可能账号下未创建任何合集,跳过此步骤
- 提示用户:「未找到可用合集,请先在公众号后台创建合集,或跳过此步骤」
场景 C:合集选择后点击确认无反应
take_snapshot检查弹窗是否仍打开- 用
evaluate_script查找确认按钮并点击 - 如果弹窗仍关闭不了 → 截图给用户,请用户手动选择合集
场景 D:合集设置后未生效
take_snapshot检查合集区域是否显示已选合集名称- 如果仍显示「未添加」→ 重试选择流程
- 重试仍失败 → 跳过,不影响文章发布
3.10 保存失败(步骤 10)
场景 A:找不到「保存」按钮
take_snapshot仔细检查所有按钮元素- 尝试
scroll_down到底部后再次take_snapshot(保存按钮可能在页面底部) - 注意区分:
- 「保存」/「保存草稿」→ 这是我们要点的
- 「发表」/「群发」→ 绝对不能点这个
- 「预览」→ 可以点击预览,但不是保存
- 如果确实找不到 → 截图给用户,请用户手动保存
场景 B:点击保存后无反应
- 等待 3 秒后
take_snapshot检查是否有变化 - 再次
click保存按钮 - 等待 3 秒,
take_screenshot检查 - 如果出现错误提示(如「标题不能为空」「正文内容不能为空」)→ 读取错误信息,回到对应步骤补充内容后重试保存
- 最多重试 3 次
场景 C:点击保存后出现错误提示
take_snapshot读取错误提示的具体内容- 根据错误内容定位问题:
- 「标题不能为空」→ 回到步骤 3 重新填写标题
- 「正文内容不能为空」→ 回到步骤 4 重新注入正文
- 「封面图片未设置」→ 尝试从正文选择封面 → 不可用则提示用户手动设置
- 其他错误 → 截图给用户
- 修复问题后重新执行保存
场景 D:保存成功但无法确认
take_screenshot截图- 检查是否有「保存成功」提示、页面跳转到草稿列表、或草稿状态标记
- 如果无法从截图判断是否成功 → 导航到草稿箱页面
take_snapshot检查文章是否在列表中 - 向用户报告保存结果,附上截图
错误处理总览
| 错误场景 | 处理方式 |
|---|---|
opencli doctor 失败 | 提示用户检查 Chrome 是否打开、X 是否登录、CDP 连接是否正常 |
opencli twitter trending 返回空 | 检查 X 页面是否正常加载,尝试刷新后重试 |
| 公众号后台未登录 | 停止自动化,提示用户扫码登录后继续 |
| 页面加载超时/白屏 | 等待 5s → 重新导航 → 仍失败则截图请用户检查网络 |
| 找不到编辑入口 | 重新 snapshot → 滚动查找 → 直接导航编辑页 URL → 截图请用户协助 |
| 找不到标题输入框 | 重新 snapshot → 滚动查找 → 截图请用户指出位置 |
| 编辑器注入失败 | 依次尝试 6 个备用选择器 → 降级为 fill/press_key 逐段输入 → 纯文本输入 |
| 注入后内容为空 | 额外触发 change/blur 事件 → 分段注入 → 最多重试 3 次 |
| 原创声明设置失败 | 检查原创权限 → 用 JS 点击 checkbox 勾选协议 → 重试确定 → 对话框未关闭则 JS 点击确定按钮 |
| 配图失败 | 降级到占位图 → 仍失败则手动上传 |
| 封面图设置失败 | 从正文选择图片 → 「从正文选择」不可用则 JS 点击「本地上传」→ 仍失败则截图请用户手动设置 |
| 合集设置失败 | 用 JS 勾选合集复选框 → 打开弹窗选择合集 → 列表为空则跳过 → 弹窗异常则截图请用户手动选择 |
| 保存按钮找不到 | 滚动到底部查找 → 区分保存/发表按钮 → 截图请用户手动保存 |
| 保存后报错 | 读取错误提示 → 回到对应步骤修复 → 重新保存 |
| 任何步骤 3 次重试均失败 | 截图当前状态 → 告知用户问题 → 等待用户指示 |
使用示例
用户:帮我把 X 上的热门新闻转成公众号文章
用户:抓取 twitter trending 生成一篇公众号爆款文
用户:今天 X 上有什么热点?帮我写篇公众号文章发到草稿箱
用户:看看 X 和 Twitter 上最近有什么热门话题,挑一个写成公众号文章
What ships with it: 1 file
2.3 KB alongside SKILL.md
- README.md2.3 KB