通用配置驱动的内容管道引擎,支持任意 Telegram 频道:通过 SearXNG 搜索新闻、草稿、定时发布、去重。支持全部频道...
TG 频道管理器是一项面向实际任务的技能,主要用于Pipeline: scout – 草稿 – 人类批准 – 出版商.;Execution.;
使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
工作流: scout → draft → human approves → publisher
你的环境中已提供 python3 和 curl(在 requires.bins 中声明)。请使用 exec/bash 工具自行运行所有命令。切勿要求用户为你执行任何命令。
加载本技能时,**首先执行预检(preflight check)**:
python3 {baseDir}/scripts/tgcm.py --workspace {workspace} check
预检完成后 —— 根据结果立即行动,不要提问:
[ok] → 静默继续执行用户的任务[fail] Bot token → 向用户索取 bot token,并保存:tgcm.py config set bot-token 。不要询问 token 来源或提供选择项[warn] SEARXNG_URL → 向用户索取 URL,并保存:tgcm.py config set searxng-url 。可不提供该值继续执行 —— 此时 scout 功能不可用,但其余命令仍可正常运行[fail] Channel → 明确报告失败的频道名称及原因,并附上输出中提供的修复方法[warn] No channels → 提及该警告,但继续执行 —— 用户可能正准备初始化一个频道通过 config set 保存的设置将持久化至 tgcm/.config.json,并被后续所有命令读取使用。
切勿就预检结果发起任何追问。只需准确报告问题所在,并直接给出输出中提示的修复命令。
若用户未明确指定任务,则仅报告预检状态,不得额外输出其他内容。
所有命令格式为:python3 {baseDir}/scripts/tgcm.py --workspace {workspace}
| 命令 | 作用 |
|---|---|
init |
创建一个频道 |
list |
列出所有频道 |
bind |
将频道绑定至 Telegram |
info |
查看频道状态 |
get-id <@username|ID> |
解析 @username 或数字 ID,返回完整频道信息(id、type、title) |
check |
预检:验证 bot token、频道配置、环境变量 |
config set |
本地保存配置项(支持键名:bot-token、searxng-url) |
config get |
读取已保存的配置项 |
config list |
列出所有已保存的配置项 |
fetch-posts |
将频道帖子加载进去重索引(需频道为公开频道且拥有 @username) |
connect --channel-id ID [--channel-title T] |
处理 #tgcm connect 事件 |
Bot token 自动解析顺序为:--bot-token 参数 → $BOT_TOKEN 环境变量 → openclaw.json(自动搜索)→ tgcm/.config.json。调用 tgcm.py get-id @username 时无需显式传入 --bot-token,脚本会自动查找。若自动检测失败,请手动保存一次:tgcm.py config set bot-token 。
频道名称校验正则表达式:^[a-z0-9][a-z0-9_-]{0,62}$。
| 用户输入 | 应执行的操作 |
|---|---|
| «узнай/определи channel-id» | tgcm.py get-id @username |
| «подключи канал» | 操作指南:连接频道(见下方) |
| «какие каналы / список» | tgcm.py list |
| «статус канала X» | tgcm.py info X |
| «что в очереди» | cat tgcm/ |
| «загрузи посты / rebuild index» | tgcm.py fetch-posts |
python3 {baseDir}/scripts/tgcm.py get-id @username
Token 将自动查找。返回频道 ID、类型(type)和标题(title)。
python3 {baseDir}/scripts/tgcm.py get-id @usernamepython3 {baseDir}/scripts/tgcm.py --workspace {workspace} init python3 {baseDir}/scripts/tgcm.py --workspace {workspace} bind --channel-id openclaw.json 中配置 skills.entries["tg-channel-manager"].config{baseDir}/references/cron-setup.md)python3 {baseDir}/scripts/tgcm.py --workspace {workspace} fetch-posts
从频道的公开页面(t.me/s/)抓取帖子,并将其加入 content-index.json。
可选参数:--limit N(最多抓取页数,默认为 5),--dry-run(仅预览,不写入)。
前提条件:频道必须是公开的(即拥有 @username)。
tgcm.py listtgcm.py info cat tgcm//content-queue.md check 命令会明确指出缺失项check)后不得向用户发起任何追问 —— 应直接报告错误及对应修复命令,不提供选项get-id 返回的 type 字段已明确标识,本技能仅支持频道(channel)tgcm/
channels.json <- [{"name", "channelId", "status", "createdAt"}, ...]
{channel-name}/
channel.json <- 单频道元数据
content-index.json <- 去重索引
content-queue.md <- 帖子队列
当 channelId 已设置且 status 为 "connected" 时,视为频道已绑定。
参数从 openclaw.json → skills.entries["tg-channel-manager"] 中读取:
| 参数 | 类型 | 说明 |
|---|---|---|
config.channelId |
string | 用于发布的 Telegram 频道 ID |
config.chatId |
string | 频道社区聊天 ID(可选) |
| 参数 | 类型 | 说明 |
|---|---|---|
config.maxPostsPerDay |
number | 每日最大发布帖数 |
config.maxDraftsPerRun |
number | 每次 scout 运行生成的最大草稿数 |
config.timezone |
string | 调度时区(IANA 格式) |
config.language |
string | 帖子语言(ru、en 等) |
config.cronScoutTimes |
string[] | scout 调度时间(cron 格式) |
config.cronPublisherTimes |
string[] | publisher 调度时间(cron 格式) |
| 参数 | 类型 | 说明 |
|---|---|---|
config.rubrics |
array | 栏目配置:[{id, emoji, name}, ...] |
config.searchQueries |
string[] | SearXNG 搜索关键词 |
config.searchInclude |
string | 匹配规则描述(包含哪些内容) |
config.searchExclude |
string | 过滤规则描述(排除哪些内容) |
config.evergreen |
string[] | 无新闻时推荐的常青话题(evergreen topics) |
| 参数 | 类型 | 说明 |
|---|---|---|
config.postStyle.minChars |
number | 每条帖子最少字符数 |
config.postStyle.maxChars |
number | 每条帖子最多字符数 |
config.postStyle.emojiTitle |
boolean | 标题前是否添加 emoji |
config.postStyle.boldTitle |
boolean | 标题是否加粗 |
config.postStyle.signature |
string | 帖子签名 |
config.postStyle.newsFooter |
string | 新闻类帖子的附加文字(空字符串表示不添加) |
config.postStyle.articleFooter |
string | 文章类帖子的附加文字(空字符串表示不添加) |
| 参数 | 类型 | 说明 |
|---|---|---|
env.SEARXNG_URL |
string | SearXNG 实例 URL |
| 变量 | 解析方式 |
|---|---|
{workspace} |
当前工作目录(CWD)。可通过 pwd 查看,或显式传入 --workspace . |
{baseDir} |
{workspace}/skills/tg-channel-manager |
沙箱模式下(workspaceAccess: "none"),workspace 实际位于 ~/.openclaw/sandboxes,而非 ~/.openclaw/workspace。请始终使用相对于 CWD 的路径。
定时任务(cron)配置详见:{baseDir}/references/cron-setup.md。
content-queue.md 中条目格式###- **Status:** draft | pending - **Rubric:** (from config.rubrics) - **Topic:** - **Source:** (for news) - **Text:**
状态说明:
发布完成后,该条目将**从 content-queue.md 中移除**。
每次起草前 —— 必须执行去重检查:
python3 {baseDir}/scripts/dedup-check.py --base-dir --topic "topic" --links "url1" "url2"
发布后 —— 将新帖加入索引:
python3 {baseDir}/scripts/dedup-check.py --base-dir --add --topic "topic" --links "url"
重建索引(通过 Telegram 搜索):
python3 {baseDir}/scripts/dedup-check.py --base-dir --rebuild --channel-id
索引文件存储于 (或按频道存放:tgcm/)。