agentsclimarketplace

X to wechat

Skill fxw-labs/x-to-wechat

通过 opencli 抓取 X(Twitter) 最新热门新闻/trending 话题,自动生成爆款微信公众号文章(不少于1500字),并通过 browser-use 浏览器自动化发布到公众号草稿箱。触发词:热门新闻转公众号、X转公众号、twitter转公众号、爆款文章生成、热点文章发布、公众号自动发文、trending转文章、opencli抓热点。From its SKILL.md

Install
npx -y skills add fxw-labs/x-to-wechat

Assembled 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 热点 → 公众号文章」工作流,分为三个阶段:

  1. 采集:通过 opencli 抓取 X/Twitter trending 话题及热门推文
  2. 生成:AI 生成不少于 1500 字的公众号爆款文章,展示给用户确认
  3. 发布:通过 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 条核心原则

  1. 删除填充短语 — 去掉开场白和强调性拐杖词("值得注意的是""不可否认""众所周知")
  2. 打破公式结构 — 避免二元对比、戏剧性分段、修辞性设置
  3. 变化节奏 — 混合句子长度,两项优于三项,段落结尾要多样化
  4. 信任读者 — 直接陈述事实,跳过软化、辩解和手把手引导
  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:设置原创声明

实际操作流程(已验证):

  1. 在编辑器右侧设置区域找到「文字原创」链接文本,点击它
  2. 弹出原创声明对话框,包含「文字原创」标题和作者信息(自动填入已设置的作者名)
  3. 勾选协议复选框(必须用 evaluate_script,因为是自定义组件,普通 click 无效):
    evaluate_script: () => {
      const checkbox = document.querySelector('INPUT.weui-desktop-form__checkbox');
      if (checkbox) { checkbox.click(); return 'checked'; }
      return 'not found';
    }
    
  4. 勾选后点击「确定」按钮完成原创声明
  5. 如果提示「请勾选协议」,说明复选框未成功勾选,需要用 JS 重新点击 checkbox 后重试确定
  6. 成功后对话框关闭,右侧显示「文字原创 · 作者: XXX · 已开启快捷转载」

错误处理要点:

  • 协议复选框是自定义组件,普通 click uid 方式可能无效,必须用 evaluate_script 精确点击 INPUT.weui-desktop-form__checkbox
  • 如果点击确定后提示「请勾选协议」,用 JS 再次点击 checkbox 后重试确定
  • 部分公众号账号可能没有原创权限,如找不到「文字原创」选项则跳过

步骤 7:自动配图(正文内图片)

由于 opencli 采集的内容通常不包含高质量配图,本 skill 不自动生成 AI 图片,但提供以下策略:

策略 A:从推文内容中提取媒体链接

  1. 在 Phase 1 采集时,使用 opencli twitter search "关键词" --has media 获取含媒体的推文
  2. 提取推文中的图片 URL
  3. 在正文 HTML 中插入 <img src="图片URL" alt="描述"> 标签

策略 B:使用占位图服务

  1. 在正文关键位置插入占位图:https://picsum.photos/800/400?random=1
  2. 适合技术类文章的数据可视化展示

策略 C:用户手动上传

  1. 如果用户提供了图片素材,在注入正文 HTML 时包含 <img> 标签
  2. 或者提示用户在保存前手动上传图片

默认行为: 本 skill 默认采用纯文本格式,不自动插入图片,避免版权问题和加载失败风险。如需配图,请在 Phase 1 明确要求「需要配图」,或在生成文章时指定图片来源。

步骤 8:自动选择封面图

实际操作流程(已验证):

优先方案:从正文选择封面

  1. 先滚动到封面区域:
    evaluate_script: () => {
      const coverArea = document.querySelector('.weui-desktop-account__thumb');
      if (coverArea) { coverArea.scrollIntoView({ behavior: 'smooth', block: 'center' }); return 'scrolled'; }
      return 'not found';
    }
    
  2. 点击封面按钮区域打开选项面板:
    evaluate_script: () => {
      const coverBtn = document.querySelector('.js_cover_btn_area');
      if (coverBtn) { coverBtn.click(); return 'clicked'; }
      return 'not found';
    }
    
  3. 在弹出的选项面板中,点击「从正文选择」链接:
    evaluate_script: () => {
      const btn = document.querySelector('.js_selectCoverFromContent');
      if (btn) { btn.click(); return 'clicked'; }
      return 'not found';
    }
    
  4. 弹出「选择图片」对话框,显示正文中所有图片的缩略图(背景图方式渲染在 span.appmsg_content_img.cover 上)
  5. 选择第一张图片(通常是最吸引眼球的新闻截图):
    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';
    }
    
  6. 点击「下一步」按钮
  7. 进入封面编辑界面(支持裁剪),直接点击「确认」按钮完成
  8. 验证封面已设置:
    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';
    }
    

降级方案:本地上传封面

当「从正文选择」不可用(正文无图片、选项面板中无此选项)时,使用本地上传:

  1. 打开选项面板后,点击「本地上传」链接:
    evaluate_script: () => {
      const btn = document.querySelector('.js_cover_local_upload, .js_local_upload');
      if (btn) { btn.click(); return 'clicked'; }
      return 'not found';
    }
    
  2. 如果 JS 点击「本地上传」按钮无效,用 take_snapshot 找到「本地上传」的 uid 后 click(uid)
  3. 系统文件选择对话框弹出后,自动化无法直接操作,需提示用户手动选择图片文件:
    • 「已打开文件选择对话框,请选择一张封面图(建议尺寸 900x500)」
  4. 用户选择文件后,等待上传完成,take_snapshot 确认封面已设置

封面选择策略:

  • 优先「从正文选择」第一张图(新闻截图),视觉冲击力最强
  • 正文无图片或「从正文选择」不可用时,降级到「本地上传」,提示用户手动选择文件

错误处理要点:

  • 封面区域的 click uid 操作可能超时,统一用 evaluate_script + JS class 选择器操作
  • 封面图片以 background-image 方式渲染,snapshot 中不显示为 image 元素,需用 JS 检查
  • 封面编辑界面有两个比例选项(2.35:1 消息列表、1:1 转发卡片),默认裁剪即可直接确认
  • 「本地上传」会触发系统文件选择对话框,browser-use 无法操作,需用户手动介入

步骤 9:自动选择合集

实际操作流程(已验证):

  1. 在编辑器右侧设置区域找到「合集」复选框,用 evaluate_script 勾选启用合集功能:
    evaluate_script: () => {
      const checkbox = document.querySelector('.js_article_tags');
      if (checkbox) { checkbox.click(); return 'clicked, checked=' + checkbox.checked; }
      return 'not found';
    }
    
  2. 勾选后,点击「未添加」区域(.js_article_tags_label)打开合集选择弹窗:
    evaluate_script: () => {
      const label = document.querySelector('.js_article_tags_label');
      if (label) { label.click(); return 'clicked'; }
      return 'not found';
    }
    
  3. 弹窗打开后,点击「请选择合集」输入框(take_snapshot 找到其 uid 后 click(uid)
  4. 等待 2-3 秒让合集列表加载完成,take_snapshot 获取所有可用合集名称
  5. 根据文章内容选择最匹配的合集,点击对应合集名称的 uid
  6. 点击「确认」按钮完成合集选择
  7. 弹窗关闭后,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_forsleep),避免过快操作触发风控
  • 如果 3 次重试均失败,take_screenshot 截图当前状态展示给用户,说明失败原因,请求手动干预
  • 所有重试均失败后,不要继续执行后续步骤,等待用户指示

3.1 导航失败(步骤 1)

场景 A:页面加载超时 / 白屏

  1. 等待 5 秒后 take_snapshot 检查页面是否加载
  2. 如果仍为空白,尝试 navigate_page 重新导航一次
  3. 再次等待 5 秒,take_snapshot 确认
  4. 如果仍然白屏 → 截图告知用户,可能是网络问题,请用户检查网络后手动刷新

场景 B:检测到未登录(出现登录/扫码页面)

  1. take_screenshot 截图展示给用户
  2. 提示:「检测到公众号后台未登录,请扫码登录后告诉我继续」
  3. 不自动重试登录,等待用户确认已登录后,再 take_snapshot 检查状态
  4. 用户确认后如果仍未登录 → 再次提示,最多提示 2 次后建议用户手动检查账号状态

场景 C:跳转到异常页面(如安全验证、手机号验证)

  1. take_screenshot 截图给用户
  2. 提示用户手动完成验证
  3. 等待用户确认后继续

3.2 找不到编辑入口(步骤 2)

场景 A:snapshot 中找不到「新的创作」或「图文消息」按钮

  1. 再次 take_snapshot,仔细检查返回的 UI 元素列表
  2. 尝试滚动页面(scroll_down)后再次 take_snapshot 查找
  3. 如果仍找不到,尝试直接 navigate_page 到图文编辑页 URL(如 https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit
  4. 导航后 take_snapshot 确认是否进入编辑器
  5. 如果直接 URL 也无法进入 → 截图给用户,请用户手动点击进入编辑页后告知继续

场景 B:点击按钮后页面无反应

  1. 等待 3 秒后 take_snapshot 检查页面是否变化
  2. 再次 click 同一个 uid
  3. 等待 3 秒,take_snapshot 再次检查
  4. 如果仍无变化 → 尝试直接导航到编辑页 URL(同场景 A 第 3 步)
  5. 最终失败 → 截图给用户

3.3 标题填写失败(步骤 3)

场景 A:snapshot 中找不到标题输入框

  1. 再次 take_snapshot,尝试用不同关键词匹配(如搜索包含「标题」「title」文本的元素)
  2. 尝试 scroll_up 回到页面顶部后重新 take_snapshot
  3. 如果仍找不到 → 截图给用户,请用户指出标题输入框位置

场景 B:fill 后标题内容不正确

  1. take_snapshot 检查标题输入框的当前值
  2. 如果内容不对,先 click 标题输入框,然后 press_key("Meta+a") 全选,再 fill 正确内容
  3. 再次 take_snapshot 验证标题是否正确

场景 C:fill 操作本身报错(如元素不可交互)

  1. click 标题输入框使其获得焦点
  2. 等待 1 秒后重试 fill
  3. 如果仍失败,尝试 press_key 逐字输入
  4. 最终失败 → 截图给用户

3.4 正文注入失败(步骤 4)—— 最关键步骤

场景 A:所有 CSS 选择器都找不到编辑器元素

按优先级依次尝试以下选择器:

  1. .ProseMirror
  2. [contenteditable="true"]
  3. .rich_media_content
  4. .editor-content
  5. #edui1_contentplaceholder
  6. .ql-editor

每个选择器的重试流程:

  1. evaluate_script 尝试该选择器
  2. 检查返回值是否为 null/undefined
  3. 如果为 null → 尝试下一个选择器
  4. 如果所有选择器都失败 → 进入场景 B 的降级方案

场景 B:JS 注入失败(选择器找到了但 innerHTML 设置无效)

降级方案 1 — 使用 fill + press_key

  1. click 编辑区域 uid 使其获得焦点
  2. press_key("Meta+a") 全选已有内容
  3. press_key("Backspace") 清空
  4. 将文章按段落拆分,对每一段:
    • 使用 fill(uid, "本段文字内容")press_key 逐段输入
    • 输入后 press_key("Enter") 换行
  5. 每输入 3-5 段后 take_snapshot 检查内容是否正确累积

降级方案 2 — 分段剪贴板粘贴:

  1. 将文章 HTML 复制到剪贴板(如果环境支持)
  2. click 编辑区域
  3. press_key("Meta+v") 粘贴
  4. take_snapshot 检查内容

降级方案 3 — 纯文本逐段输入:

  1. 放弃富文本格式,改为纯文本
  2. 逐段 fillpress_key 输入
  3. 段落之间用 press_key("Enter") 分隔

场景 C:注入成功但内容为空或不完整

  1. take_snapshot 检查编辑器中实际显示的内容
  2. 如果内容为空 → 可能是事件触发问题,在 evaluate_script 中额外触发 change 事件:
    editor.dispatchEvent(new Event('change', { bubbles: true }));
    editor.dispatchEvent(new Event('blur', { bubbles: true }));
    
  3. 如果内容不完整 → 检查 HTML 是否被截断,尝试分段注入(先注入前半部分,确认成功后再追加后半部分)
  4. 重试注入最多 3 次

场景 D:注入后格式错乱(如 HTML 标签被原样显示为文本)

  1. 说明编辑器未正确解析 HTML,改用降级方案 1 或 3
  2. 放弃 HTML 注入,改为纯文本输入

3.5 作者/摘要填写失败(步骤 5)

场景 A:找不到输入框

  1. 尝试 scroll_downtake_snapshot 查找
  2. 作者和摘要为非必填项,如果找不到可跳过此步,不影响后续保存
  3. 如果用户明确要求填写 → 截图给用户,请用户指出位置

场景 B:fill 失败

  1. click 输入框使其获得焦点,重试 fill
  2. 最多重试 2 次
  3. 仍失败则跳过(非必填)

3.6 原创声明设置失败(步骤 6)

场景 A:找不到「文字原创」选项

  1. take_snapshot 仔细检查右侧设置区域是否有「文字原创」链接文本
  2. 可能在「文章设置」折叠面板内 → 尝试 click 展开「文章设置」后再查找
  3. 如果确实找不到 → 检查账号原创权限,部分账号无此权限,跳过此步继续

场景 B:协议复选框无法勾选

  1. 必须用 evaluate_script 点击 INPUT.weui-desktop-form__checkbox,普通 click uid 方式无效
  2. 用 JS 执行 checkbox 点击后,take_snapshot 确认复选框已勾选
  3. 如果 JS 点击后仍显示未勾选 → 检查选择器是否匹配,可能页面结构有变化

场景 C:点击确定后提示「请勾选协议」

  1. 说明复选框未成功勾选
  2. evaluate_script 再次点击 INPUT.weui-desktop-form__checkbox
  3. 再次点击「确定」按钮重试
  4. 最多重试 3 次,仍失败则取消原创勾选,继续后续步骤

场景 D:点击确定后对话框未关闭

  1. 等待 2 秒后 take_snapshot 检查对话框是否仍在
  2. 如果对话框未关闭,用 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';
    }
    
  3. 再次等待 2 秒,take_snapshot 确认对话框已关闭且右侧显示「文字原创」标记
  4. 如果对话框仍未关闭 → take_screenshot 截图给用户,请用户手动关闭对话框

3.7 配图失败(步骤 7)

场景 A:推文图片 URL 无法访问

  1. 图片可能设置了防盗链 → 降级到策略 B(占位图)或策略 C(手动上传)
  2. 在正文中移除该图片标签,改为文字描述

场景 B:占位图服务不可用

  1. 降级到策略 C(手动上传)
  2. 提示用户:「自动配图失败,请手动上传配图或跳过配图」

3.8 封面图设置失败(步骤 8)

场景 A:找不到封面上传区域

  1. evaluate_script 滚动到 .weui-desktop-account__thumb 区域后重试
  2. take_snapshot 查找包含「封面」文字的元素
  3. 如果确实找不到 → 跳过封面设置,继续保存步骤

场景 B:正文无图片可选

  1. 弹出「选择图片」对话框后无图片缩略图显示
  2. 提示用户手动上传封面图:「正文中没有图片可用作封面,请手动上传一张封面图(建议尺寸 900x500)」
  3. 等待用户确认后继续

场景 C:封面确认后发现未设置

  1. evaluate_script 检查 .js_cover_preview_newbackgroundImage 属性确认封面是否生效
  2. 如果 backgroundImage 为空 → 封面未设置成功,重试从正文选择流程
  3. 如果正文确实无图 → 降级到提示用户手动上传

场景 D:找不到「从正文选择」选项

  1. 点击封面按钮区域后,take_snapshot 检查弹出的选项面板中是否有「从正文选择」链接
  2. 如果选项面板未弹出 → 用 evaluate_script 重新点击 .js_cover_btn_area,等待 2 秒后再次检查
  3. 如果面板已弹出但无「从正文选择」选项 → 降级到「本地上传」方案:
    • evaluate_script 点击「本地上传」按钮(.js_cover_local_upload.js_local_upload
    • 如果 JS 点击无效,用 take_snapshot 找到「本地上传」uid 后 click(uid)
    • 系统文件选择对话框弹出后,提示用户手动选择图片文件
  4. 如果所有选项都不可用 → 截图给用户,请用户手动设置封面

场景 E:「本地上传」按钮无法点击

  1. 先用 evaluate_script 尝试点击 .js_cover_local_upload.js_local_upload
  2. 如果 JS 点击无效 → take_snapshot 找到「本地上传」链接文本的 uid,用 click(uid) 点击
  3. 如果 uid 点击也无效 → 截图给用户,说明需要手动选择封面文件

3.9 合集设置失败(步骤 9)

场景 A:找不到合集复选框

  1. evaluate_script 检查 .js_article_tags 元素是否存在
  2. 如果不存在 → 用 take_snapshot 查找包含「合集」文字的元素
  3. 如果确实找不到 → 跳过合集设置,继续后续步骤

场景 B:合集弹窗打开后无列表

  1. 等待 3 秒后 take_snapshot 检查列表是否加载完成
  2. 如果仍无列表 → 可能账号下未创建任何合集,跳过此步骤
  3. 提示用户:「未找到可用合集,请先在公众号后台创建合集,或跳过此步骤」

场景 C:合集选择后点击确认无反应

  1. take_snapshot 检查弹窗是否仍打开
  2. evaluate_script 查找确认按钮并点击
  3. 如果弹窗仍关闭不了 → 截图给用户,请用户手动选择合集

场景 D:合集设置后未生效

  1. take_snapshot 检查合集区域是否显示已选合集名称
  2. 如果仍显示「未添加」→ 重试选择流程
  3. 重试仍失败 → 跳过,不影响文章发布

3.10 保存失败(步骤 10)

场景 A:找不到「保存」按钮

  1. take_snapshot 仔细检查所有按钮元素
  2. 尝试 scroll_down 到底部后再次 take_snapshot(保存按钮可能在页面底部)
  3. 注意区分:
    • 「保存」/「保存草稿」→ 这是我们要点的
    • 「发表」/「群发」→ 绝对不能点这个
    • 「预览」→ 可以点击预览,但不是保存
  4. 如果确实找不到 → 截图给用户,请用户手动保存

场景 B:点击保存后无反应

  1. 等待 3 秒后 take_snapshot 检查是否有变化
  2. 再次 click 保存按钮
  3. 等待 3 秒,take_screenshot 检查
  4. 如果出现错误提示(如「标题不能为空」「正文内容不能为空」)→ 读取错误信息,回到对应步骤补充内容后重试保存
  5. 最多重试 3 次

场景 C:点击保存后出现错误提示

  1. take_snapshot 读取错误提示的具体内容
  2. 根据错误内容定位问题:
    • 「标题不能为空」→ 回到步骤 3 重新填写标题
    • 「正文内容不能为空」→ 回到步骤 4 重新注入正文
    • 「封面图片未设置」→ 尝试从正文选择封面 → 不可用则提示用户手动设置
    • 其他错误 → 截图给用户
  3. 修复问题后重新执行保存

场景 D:保存成功但无法确认

  1. take_screenshot 截图
  2. 检查是否有「保存成功」提示、页面跳转到草稿列表、或草稿状态标记
  3. 如果无法从截图判断是否成功 → 导航到草稿箱页面 take_snapshot 检查文章是否在列表中
  4. 向用户报告保存结果,附上截图

错误处理总览

错误场景处理方式
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

Keep looking

Skills are one crate of 326,144. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.