跳到主要内容
知仓学习社ZHICANG

tg-responder

Review and send Telegram response drafts, manage follow-ups for unanswered outbound messages. Use when the user says "/tg-responder review", "/tg-re…

执行命令严重 0 · 高危 8glebis/claude-skills

它会碰到什么

扫了多少11 个文本文件,60 KB
它会碰到什么执行命令
命中总数8 处
命中统计严重 0 · 高 8 · 中 0 · 低 0
逐条看命中(8 条严重或高危)
  • scripts/follow_ups.py:231exec-spawn
    result = subprocess.run(
  • scripts/follow_ups.py:276exec-spawn
    subprocess.run(
  • scripts/follow_ups.py:370exec-spawn
    subprocess.run(
  • scripts/lookup_chat.py:14exec-spawn
    result = subprocess.run(
  • scripts/worker.py:134exec-spawn
    result = subprocess.run(
  • scripts/worker.py:207exec-spawn
    result = subprocess.run(
  • scripts/worker.py:313exec-spawn
    result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
  • scripts/worker.py:324exec-spawn
    result = subprocess.run(

这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。

技能内容

tg-responder — Telegram Communications Assistant

Review pending response drafts and manage the Telegram response queue.

Commands

review — Approve pending drafts

Read the responder queue and present drafts for approval:

python3 ~/.claude/skills/tg-responder/scripts/schema.py  # ensure DB exists

Then query the database:

-- Pending drafts needing approval
SELECT o.id, o.chat_id, o.draft_text, o.draft_reason, o.source,
       i.sender_name, i.text as original_text, i.urgency, i.category,
       datetime(i.received_at, 'unixepoch') as received
FROM outbox o
JOIN inbox i ON o.inbox_id = i.id
WHERE o.status = 'draft'
ORDER BY
  CASE i.urgency WHEN 'urgent' THEN 0 WHEN 'normal' THEN 1 ELSE 2 END,
  o.created_at ASC;

For each draft, present to the user:

  1. Original message — who sent it, when, what they said
  2. Draft response — the proposed reply
  3. Options: approve (send as-is), edit (modify then send), skip

To approve and send a draft:

  1. Update outbox: UPDATE outbox SET status = 'approved', final_text = draft_text, approved_at = strftime('%s','now') WHERE id = ?
  2. Send via telegram skill: python3 ~/.claude/skills/telegram/scripts/telegram_fetch.py send --chat-id CHAT_ID --text "THE_TEXT"
  3. Update outbox with sent status and message_id

To skip: UPDATE outbox SET status = 'skipped', updated_at = strftime('%s','now') WHERE id = ?

status — Queue statistics

-- Inbox stats
SELECT status, count(*) FROM inbox GROUP BY status;

-- Outbox stats
SELECT status, count(*) FROM outbox GROUP BY status;

-- Recent activity
SELECT sender_name, route, status, datetime(created_at, 'unixepoch')
FROM inbox ORDER BY created_at DESC LIMIT 10;

Report: pending count, drafts waiting, sent today, failed items.

follow-ups — Track unanswered outbound messages

Scan for people who haven't replied, send reminders with exponential backoff.

# Scan for new unanswered messages (needs Telethon session — stop daemon first)
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py scan

# Process due reminders (drafts to Telegram or outbox)
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py remind

# List active follow-ups
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py list

# Archive expired follow-ups
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py archive

# Run all (scan + check replies + remind + archive)
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py all

Also query directly:

SELECT sender_name, outbound_text, reminder_count, max_reminders,
       datetime(outbound_at, 'unixepoch') as sent,
       datetime(next_reminder_at, 'unixepoch') as next_ping,
       status
FROM follow_ups
WHERE status = 'active'
ORDER BY next_reminder_at;

Schedule: exponential (3d → 6d → 12d), fixed (every Nd), or custom per contact.

After max_reminders → archived. If they reply → auto-resolved.

Database

Located at ~/Brains/data/telegram/responder.db.

Known Pitfalls

  • Auto-replies are not closers. Messages like "Отвечу в ближайшее время!" are auto-respond placeholders, not real responses. Exclude them from follow-up resolution — they should not mark a thread as closed.
  • My messages vs. other people's messages. The script can mistake the user's own auto-replies for the contact's messages, forming incorrect follow-up state. Always check sender ID, not just message content.

Config

Located at ~/.claude/skills/tg-responder/config.yaml. Edit contacts, modes, and ignore lists there.

Worker

Start: python3 ~/.claude/skills/tg-responder/scripts/worker.py

One-shot: python3 ~/.claude/skills/tg-responder/scripts/worker.py --once

想直接用这个技能?

本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。