twitter-watch-reply
用这个 skill 做 AA 模式(6551 监控版):
- - 6551 负责监控指定账号最近推文
- Agent 负责判断是否为新推并生成回复草稿
- 用户确认后,再用浏览器自动化发出回复
适用边界
只做 半自动:
- 1. 用 6551 拉目标账号最近推文
- 过滤已处理 tweet / 转推 / 不想回复的内容
- 对新推生成 1~3 条回复候选
- 等用户明确确认某条候选
- 用浏览器已登录态去回复
不要默认全自动发送。
6551 Token 配置说明
本 skill 的 Twitter/X 监控能力依赖 6551 接口,运行时通过环境变量 TWITTER_TOKEN 读取 token。
token 来源
按 6551 / opentwitter 约定,从这里获取:
如何配置
在运行本 skill 的同一终端 / 同一调度环境里设置:
CODEBLOCK0
然后再运行:
CODEBLOCK1
注意事项
- - 不要把 token 写死到 skill 文件里
- 不要把 token 提交到 Git 仓库
- 不要在聊天里直接发送 token 明文
- 如果用 cron / launchd / 其他调度器,要确保对应运行环境里也能读到 INLINECODE2
没配置 token 时会怎样
- -
doctor.py 会提示 INLINECODE4 - INLINECODE5 会直接退出并报错,不会伪装成“没有新推”
依赖
必须有:
- - 环境变量 INLINECODE6
- 可访问 6551 接口 INLINECODE7
- 用于最终发送回复的已登录 X 浏览器会话
文件结构
- -
skills/twitter-watch-reply/references/config-example.json:配置示例 - INLINECODE9 :管理 watchlist / state / 去重
- INLINECODE10 :通过 6551 拉最近推文并筛出新推
- INLINECODE11 :读取当前待处理推文
- INLINECODE12 :为新推生成通用提醒载荷(新推 + 候选回复 + notify 配置)
- INLINECODE13 :把提醒载荷渲染成适合聊天渠道发送的纯文本
- INLINECODE14 :标记某条推文已提醒,避免重复通知
- INLINECODE15 :生成回复候选的规范
- INLINECODE16 :宿主如何接通用通知层并真正发消息
- INLINECODE17 :用户配置
- INLINECODE18 :运行状态
若 config.json 不存在,先初始化再改配置。
默认流程
1. 初始化配置
CODEBLOCK2
2. 用 6551 拉最近推文
CODEBLOCK3
脚本会:
- - 读取 INLINECODE20
- 对
authors 逐个优先调用 6551 twitter_user_tweets,失败时自动 fallback 到 twitter_search + INLINECODE24 - 过滤已 seen 的 tweet id
- 按配置跳过 replies / retweets
- 输出待处理的新推列表
3. 生成回复草稿
先运行:
CODEBLOCK4
再按 references/reply-generation.md 的规范,对待处理推文生成 3 条候选。
对每条新推默认生成 3 条候选:
生成时遵守配置:
- - INLINECODE26
- INLINECODE27
- INLINECODE28
- INLINECODE29
- INLINECODE30
- INLINECODE31
4. 主动提醒(通用通知层)
先运行:
CODEBLOCK5
该脚本会输出一份“提醒载荷”:
- - 新推内容
- 链接
- 3 条候选回复
- INLINECODE32 配置
这一步的设计目标是 通用通知,而不是写死某个 Telegram 群。
推荐由宿主环境按 notify.channel / notify.target / notify.threadId 决定发往:
- - Telegram
- Discord
- Slack
- Signal
- 其他 OpenClaw 已接通的消息渠道
5. 等待确认后浏览器回复
只有用户明确说“发第 N 条”或给出明确修改意见时,才进入发送步骤。
发送前再次确认:
- - 当前账号是否登录
- 回复框是否可写
- 当前推文是否尚未回复过
发送成功后更新 state.json:
- - 记录 tweet id
- 记录发送时间
- 记录使用的回复文本
常用命令
安装前自检
CODEBLOCK6
自检会检查:
- -
TWITTER_TOKEN 是否存在(不显示明文) - INLINECODE36 /
state.json 是否存在且格式正确 - 6551 基础连通性是否正常
若 config.json / state.json 不存在,先运行:
CODEBLOCK7
初始化/查看配置
CODEBLOCK8
添加/删除监控账号
CODEBLOCK9
检查新推
CODEBLOCK10
标记与去重
CODEBLOCK11
实操建议
- - 第一版只监控 1~5 个账号
- 严格限制每天回复数量
- 半自动确认是默认模式,不要省掉
- 如果
twitter_user_tweets 失败,自动 fallback 到 twitter_search fromUser;两者都失败时再报错,不要伪造“无新推” - 如果浏览器登录态失效,明确报错,不要瞎报成功
后续扩展
后续如果用户要升级,再增加:
- - cron / 定时触发
- Telegram 通知待确认回复
- 关键词白名单
- 自动跳过低价值推文
通用化约定
- - 不要假设固定机器路径。脚本默认根据自身目录推导 workspace。
- 如需自定义 workspace,设置
OPENCLAW_WORKSPACE。 - 如需自定义数据目录,设置
TWITTER_WATCH_REPLY_DATA_DIR。 - 定时轮询由外部调度器负责;skill 只提供
run_watch_loop.sh 作为示例,不强绑定某个用户的 launchd/cron。
通用通知边界
- - 这个 skill 只负责生成“提醒载荷”,不把某个渠道写死进脚本。
- 真正的主动发送动作,应由宿主环境(例如 OpenClaw 的 message 能力)根据
notify 配置执行。 - 因此,Telegram / Discord / Slack / Signal 等都可以通过同一份提醒载荷来适配。
宿主发送流程(推荐)
推荐由宿主环境按以下顺序执行:
- 1. 运行 INLINECODE46
- 运行
render_alert.py 或 INLINECODE48 - 若存在 alert 且
notify.enabled=true,按 notify.channel/target/threadId 发消息 - 发送成功后运行 INLINECODE51
这样通知层就能保持通用,不和特定消息渠道耦合。
宿主适配
如果需要真正做到“抓到新推就自动提醒”,读取 references/host-adapter.md。
该文件说明了宿主(尤其是 OpenClaw)应如何消费本 skill 产生的 alert,并在发送成功后执行去重标记。
twitter-watch-reply
使用此技能实现 AA 模式(6551 监控版):
- - 6551 负责监控指定账号的最新推文
- Agent 负责判断是否为新推文并生成回复草稿
- 用户确认后,再通过浏览器自动化发送回复
适用范围
仅支持 半自动 模式:
- 1. 使用 6551 获取目标账号的最新推文
- 过滤已处理的推文/转发/不想回复的内容
- 为每条新推文生成 1~3 条回复候选
- 等待用户明确确认某条候选回复
- 使用浏览器已登录状态进行回复
默认不启用全自动发送功能。
6551 Token 配置说明
本技能的 Twitter/X 监控功能依赖 6551 接口,运行时通过环境变量 TWITTER_TOKEN 读取 token。
token 获取方式
按照 6551 / opentwitter 的约定,从以下地址获取:
配置方法
在运行本技能的同一终端/同一调度环境中设置:
bash
export TWITTER_TOKEN=你的6551token
然后运行:
bash
python3 skills/twitter-watch-reply/scripts/doctor.py
注意事项
- - 请勿将 token 硬编码到技能文件中
- 请勿将 token 提交到 Git 仓库
- 请勿在聊天中直接发送 token 明文
- 如果使用 cron / launchd / 其他调度器,需确保对应运行环境也能读取到 TWITTER_TOKEN
未配置 token 时的表现
- - doctor.py 会提示 TWITTERTOKEN missing
- fetchlatest_tweets.py 会直接退出并报错,不会伪装成没有新推文
依赖项
必需条件:
- - 环境变量 TWITTER_TOKEN
- 可访问 6551 接口 https://ai.6551.io
- 用于最终发送回复的已登录 X 浏览器会话
文件结构
- - skills/twitter-watch-reply/references/config-example.json:配置示例
- skills/twitter-watch-reply/scripts/watchstate.py:管理监控列表/状态/去重
- skills/twitter-watch-reply/scripts/fetchlatesttweets.py:通过 6551 获取最新推文并筛选出新推文
- skills/twitter-watch-reply/scripts/pickpendingtweet.py:读取当前待处理的推文
- skills/twitter-watch-reply/scripts/renderalert.py:为新推文生成通用提醒载荷(新推文内容 + 候选回复 + 通知配置)
- skills/twitter-watch-reply/scripts/renderalerttext.py:将提醒载荷渲染为适合聊天渠道发送的纯文本格式
- skills/twitter-watch-reply/scripts/mark_notified.py:标记某条推文已提醒,避免重复通知
- skills/twitter-watch-reply/references/reply-generation.md:生成回复候选的规范
- skills/twitter-watch-reply/references/host-adapter.md:宿主如何接入通用通知层并真正发送消息
- data/twitter-watch-reply/config.json:用户配置
- data/twitter-watch-reply/state.json:运行状态
如果 config.json 不存在,请先初始化再修改配置。
默认流程
1. 初始化配置
bash
python3 skills/twitter-watch-reply/scripts/watch_state.py init
2. 使用 6551 获取最新推文
bash
python3 skills/twitter-watch-reply/scripts/fetchlatesttweets.py
脚本会:
- - 读取 config.json
- 对 authors 中的每个账号优先调用 6551 的 twitterusertweets,失败时自动回退到 twitter_search + fromUser
- 过滤已处理的推文 ID
- 根据配置跳过回复/转发
- 输出待处理的新推文列表
3. 生成回复草稿
首先运行:
bash
python3 skills/twitter-watch-reply/scripts/pickpendingtweet.py
然后按照 references/reply-generation.md 的规范,为待处理的推文生成 3 条候选回复。
每条新推文默认生成 3 条候选回复:
生成时需遵守配置:
- - tone(语气)
- language(语言)
- topicsAllow(允许的话题)
- blockedWords(屏蔽词)
- maxReplyPerAuthorPerDay(每个作者每日最大回复数)
- maxTotalReplyPerDay(每日总回复上限)
4. 主动提醒(通用通知层)
首先运行:
bash
python3 skills/twitter-watch-reply/scripts/render_alert.py
该脚本会输出一份提醒载荷:
- - 新推文内容
- 链接
- 3 条候选回复
- notify 配置
此步骤的设计目标是实现 通用通知,而不是硬编码到某个 Telegram 群组。
推荐由宿主环境根据 notify.channel / notify.target / notify.threadId 决定发送到:
- - Telegram
- Discord
- Slack
- Signal
- 其他 OpenClaw 已接入的消息渠道
5. 等待确认后通过浏览器回复
只有在用户明确表示发送第 N 条或给出明确的修改意见时,才进入发送步骤。
发送前需再次确认:
- - 当前账号是否已登录
- 回复框是否可编辑
- 当前推文是否尚未回复过
发送成功后更新 state.json:
常用命令
安装前自检
bash
python3 skills/twitter-watch-reply/scripts/doctor.py
自检会检查:
- - TWITTER_TOKEN 是否存在(不显示明文)
- config.json / state.json 是否存在且格式正确
- 6551 基础连通性是否正常
如果 config.json / state.json 不存在,请先运行:
bash
python3 skills/twitter-watch-reply/scripts/watch_state.py init
初始化/查看配置
bash
python3 skills/twitter-watch-reply/scripts/watch_state.py init
python3 skills/twitter-watch-reply/scripts/watch_state.py show-config
添加/删除监控账号
bash
python3 skills/twitter-watch-reply/scripts/watch_state.py add-author jakevin7
python3 skills/twitter-watch-reply/scripts/watch_state.py remove-author jakevin7
python3 skills/twitter-watch-reply/scripts/watch_state.py list-authors
检查新推文
bash
python3 skills/twitter-watch-reply/scripts/fetchlatesttweets.py
python3 skills/twitter-watch-reply/scripts/fetchlatesttweets.py --author jakevin7
python3 skills/twitter-watch-reply/scripts/pickpendingtweet.py
python3 skills/twitter-watch-reply/scripts/render_alert.py
标记与去重
bash
python3 skills/twitter-watch-reply/scripts/watch_state.py seen 2030857515660132533
python3 skills/twitter-watch-reply/scripts/watch_state.py was-seen 2030857515660132533
实操建议
- - 第一版仅监控 1~5 个账号
- 严格限制每日回复数量
- 半自动确认是默认模式,请勿省略
- 如果 twitterusertweets 失败,自动回退到 twitter_search fromUser;两者都失败时再报错,不要伪造无新推文
- 如果浏览器登录状态失效,明确报错,不要虚假报告成功
后续扩展
后续如需升级,可增加:
- - cron / 定时触发
- Telegram 通知待确认回复
- 关键词白名单
- 自动跳过低价值推文
通用化约定
- - 不要假设固定的机器路径。脚本默认根据自身目录推导工作空间。
- 如需自定义工作空间,设置 OPENCLAWWORKSPACE。
- 如需自定义数据目录,设置 TWITTERWATCHREPLYDATADIR。
- 定时轮询由外部调度器负责;技能仅提供 runwatch_loop.sh 作为示例,不强绑定某个用户的 launchd/cron。
通用通知边界
- - 本技能仅负责生成提醒载荷,不会将某个渠道硬编码到脚本中。
- 真正的主动发送动作,应由宿主环境