# iMessage 自动回复器 根据可配置的规则、AI 提示和限速条件监控 iMessage/SMS 对话并自动回复。当需要基于对话上下文用 AI 生成的回复自动回复特定联系人时,请使用此功能。也用于用户要求管理自动回复设置、联系人、提示或查看状态/历史时。 # iMessage 自动回复器 使用 AI 生成的、符合你语气和对话上下文的回复,自动响应特定联系人的 iMessage/SMS。 ## ⚠️ 使用前的要求清单 在使用本技能前,请确保已具备: - [ ] macOS 并已登录 iMessage 的 Messages.app - [ ] imsg CLI 已安装:brew install steipete/tap/imsg - [ ] OpenAI API key 已在 Clawdbot 配置中设置 - [ ] 完全磁盘访问权限 已授予 Terminal/iTerm - [ ] Messages 自动化权限(首次使用 macOS 会弹出授权) ## 功能 - 🤖 AI 驱动回复 使用 OpenAI GPT-4 - 📱 基于联系人的提示 —— 每个联系人可设不同 AI 人格 - ⏱️ 速率限制 —— 可配置自动回复间隔 - 💬 上下文感知 —— AI 可读取最近对话历史 - 📊 Telegram 管理 —— 斜杠命令 + 自然语言 - 🔄 后台监控 —— 持续轮询新消息 - 🔧 自动清理 —— 重启时清除过期锁(防止联系人卡死) - 🧪 测试模式 —— 生成真实 AI 回复但不实际发送 - ⏰ 时间窗口 —— 仅在特定时段回复(如 9 AM - 10 PM) - 🔑 关键词触发 —— 仅当消息包含特定关键词才回复(如 "urgent"、"help") - 📊 统计追踪 —— 记录总回复数、每日计数、每联系人平均数 - 🚦 每日上限 —— 限制每联系人每日最大回复数(安全功能) ## 快速开始 ### 1. 添加联系人到监控列表 ``bash cd ~/clawd/imsg-autoresponder/scripts node manage.js add "+15551234567" "Reply with a middle finger emoji" "Best Friend" node manage.js add "+15559876543" "You are my helpful assistant. Reply warmly and briefly, as if I'm responding myself. Keep it under 160 characters." "Mom" ` ### 2. 启动监控器 `bash node watcher.js ` 监控器将在前台运行,日志写入 ~/clawd/logs/imsg-autoresponder.log。 ### 3. 后台运行(推荐) `bash # 后台启动 nohup node ~/clawd/imsg-autoresponder/scripts/watcher.js > /dev/null 2>&1 & # 或使用 screen/tmux screen -S imsg-watcher node ~/clawd/imsg-autoresponder/scripts/watcher.js # Ctrl+A, D 脱离 ` ## 配置 配置文件:~/clawd/imsg-autoresponder.json `json { "enabled": true, "defaultMinMinutesBetweenReplies": 15, "watchList": [ { "identifier": "+15551234567", "name": "Best Friend", "prompt": "Reply with a middle finger emoji", "minMinutesBetweenReplies": 10, "enabled": true } ] } ` ## 通过 Telegram 管理(推荐) 自动回复器可直接通过 Telegram 斜杠命令或自然语言管理。 ### 斜杠命令 空格和下划线格式均支持: ` /autorespond list OR /autorespond_list /autorespond status OR /autorespond_status /autorespond add OR /autorespond_add /autorespond remove OR /autorespond_remove /autorespond edit OR /autorespond_edit /autorespond delay OR /autorespond_delay /autorespond history OR /autorespond_history /autorespond test OR /autorespond_test /autorespond toggle OR /autorespond_toggle /autorespond restart OR /autorespond_restart 批量操作: /autorespond set-all-delays OR /autorespond_set_all_delays /autorespond enable-all OR /autorespond_enable_all /autorespond disable-all OR /autorespond_disable_all 时间窗口: /autorespond set-time-window OR /autorespond_set_time_window /autorespond clear-time-windows OR /autorespond_clear_time_windows 关键词触发: /autorespond add-keyword OR /autorespond_add_keyword /autorespond remove-keyword OR /autorespond_remove_keyword /autorespond clear-keywords OR /autorespond_clear_keywords 统计与上限: /autorespond stats OR /autorespond_stats [] /autorespond set-daily-cap OR /autorespond_set_daily_cap ` 示例: ` /autorespond_list /autorespond_status /autorespond_edit +15551234567 Be more sarcastic /autorespond_delay +15551234567 30 /autorespond_history +15551234567 /autorespond_set_time_window +15551234567 09:00 22:00 /autorespond_clear_time_windows +15551234567 /autorespond_add_keyword +15551234567 urgent /autorespond_add_keyword +15551234567 help /autorespond_clear_keywords +15551234567 /autorespond_stats /autorespond_stats +15551234567 /autorespond_set_daily_cap +15551234567 10 /autorespond_set_all_delays 30 /autorespond_disable_all /autorespond_restart ` ### 自然语言 你也可以直接说: - "Show me the auto-responder status" - "Add +15551234567 to the watch list with prompt: be sarcastic" - "Change Scott's prompt to be nicer" - "Disable auto-replies for Mom" - "What has the auto-responder sent to Foxy recently?" - "Restart the auto-responder" Agent 将通过 telegram-handler.js 脚本理解并执行命令。 ## 命令行管理(高级) `bash cd ~/clawd/imsg-autoresponder/scripts # 列出所有联系人 node manage.js list # 添加联系人 node manage.js add "+15551234567" "Your custom prompt here" "Optional Name" # 移除联系人 node manage.js remove "+15551234567" # 启用/禁用联系人 node manage.js enable "+15551234567" node manage.js disable "+15551234567" # 为联系人设置自定义延迟(分钟) node manage.js set-delay "+15551234567" 30 # 开关整个系统 node manage.js toggle ` ## 工作原理 1. Watcher 通过 imsg watch 监控所有 incoming 消息 2. 检查监控列表 判断发件人是否配置自动回复 3. 速率限制 确保不刷屏(可配置分钟间隔) 4. 获取对话历史(最近 20 条消息) 5. 生成 AI 回复 使用 Clawdbot + 联系人专属提示 6. 发送回复 通过 imsg send 7. 记录日志 到 ~/clawd/logs/imsg-autoresponder.log ## 状态追踪 回复时间记录在 ~/clawd/data/imsg-autoresponder-state.json: `json { "lastResponses": { "+15551234567": 1706453280000 } } ` 确保重启后速率限制仍生效。 ## 提示词 提示词定义 AI 如何回复每位联系人。要写具体! 示例: ` "Reply with a middle finger emoji" "You are my helpful assistant. Reply warmly and briefly, as if I'm responding myself. Keep it under 160 characters." "You are my sarcastic friend. Reply with witty, slightly snarky responses. Keep it short." "Politely decline any requests and say I'm busy. Be brief but friendly." ` AI 将看到: - 联系人自定义提示 - 最近消息历史(最近 5 条) - 最新 incoming 消息 ## 要求 - macOS 且 Messages.app 已登录 - imsg CLI 已安装(brew install steipete/tap/imsg) - 为 Terminal 授予完全磁盘访问权限 - 已安装并配置 Clawdbot - Anthropic API key(配置在 ~/.clawdbot/clawdbot.json 或 ANTHROPIC_API_KEY 环境变量) - curl(macOS 预装) ## 安全 - 速率限制 防止 spam(默认:每联系人 15 分钟间隔) - 手动覆盖 通过配置 enabled: false 或 node manage.js disable - 系统开关 一键禁用所有自动回复:node manage.js toggle - 日志 记录所有活动供审查 ## 故障排除 Watcher 无响应: - 查看 ~/clawd/logs/imsg-autoresponder.log 报错 - 手动验证 imsg watch 是否可用:imsg watch --json - 确认联系人已在监控列表:node manage.js list 速率限制过于严格: - 调整延迟:node manage.js set-delay "+15551234567" 5 - 或修改配置中的 defaultMinMinutesBetweenReplies AI 回复风格不对: - 精炼该联系人的提示 - 检查消息历史是否正确捕获(见日志) ## Agent 命令处理 当用户使用斜杠命令或自然语言提及自动回复器时,使用 telegram-handler.js 脚本。 ### 命令映射(两种格式均支持) | 用户输入 | 归一化 | Handler 调用 | |------------|--------------|--------------| | /autorespond list 或 /autorespond_list | list | node telegram-handler.js list | | /autorespond status 或 /autorespond_status | status | node telegram-handler.js status | | /autorespond add 或 /autorespond_add | add | node telegram-handler.js add | | /autorespond remove 或 /autorespond_remove | remove | node telegram-handler.js remove | | /autorespond edit 或 /autorespond_edit | edit | node telegram-handler.js edit | | /autorespond delay 或 /autorespond_delay | delay | node telegram-handler.js delay | | /autorespond history 或 /autorespond_history | history | node telegram-handler.js history [limit] | | /autorespond test 或 /autorespond_test | test | node telegram-handler.js test | | /autorespond toggle 或 /autorespond_toggle | toggle | node telegram-handler.js toggle | | /autorespond restart 或 /autorespond_restart | restart | node telegram-handler.js restart | | /autorespond set-all-delays 或 /autorespond_set_all_delays | set-all-delays | node telegram-handler.js set-all-delays | | /autorespond enable-all 或 /autorespond_enable_all | enable-all | node telegram-handler.js enable-all | | /autorespond disable-all 或 /autorespond_disable_all | disable-all | node telegram-handler.js disable-all | | /autorespond set-time-window 或 /autorespond_set_time_window | set-time-window | node telegram-handler.js set-time-window | | /autorespond clear-time-windows 或 /autorespond_clear_time_windows | clear-time-windows | node telegram-handler.js clear-time-windows | | /autorespond add-keyword 或 /autorespond_add_keyword | add-keyword | node telegram-handler.js add-keyword | | /autorespond remove-keyword 或 /autorespond_remove_keyword | remove-keyword | node telegram-handler.js remove-keyword | | /autorespond clear-keywords 或 /autorespond_clear_keywords | clear-keywords | node telegram-handler.js clear-keywords | | /autorespond stats 或 /autorespond_stats [] | stats | node telegram-handler.js stats [] | | /autorespond set-daily-cap 或 /autorespond_set_daily_cap | set-daily-cap | node telegram-handler.js set-daily-cap | 处理步骤: 1. 检测 /autorespond 或 /autorespond_ 前缀 2. 提取子命令(将下划线归一化为空格) 3. 解析剩余参数 4. 调用 telegram-handler.js 并传入对应参数 ### 自然语言模式匹配 - "show/list/view auto-responder" → node telegram-handler.js list - "add [contact] to auto-responder" → node telegram-handler.js add - "change/edit/update [contact]'s prompt" → node telegram-handler.js edit - "set delay for [contact]" → node telegram-handler.js delay - "disable/remove [contact] from auto-responder" → node telegram-handler.js remove - "auto-responder status" → node telegram-handler.js status - "what has auto-responder sent to [contact]" → node telegram-handler.js history - "restart auto-responder" → node telegram-handler.js restart - "enable/disable auto-responder" → node telegram-handler.js toggle 联系人解析: - 当用户用名字指代联系人时,从配置中查找对应号码 - 始终使用完整 E.164 格式(如 +15551234567) 配置变更后: 若命令输出提示需重启,务必提醒用户重启 watcher。 ## 故障排除 ### 监控器无响应 查看状态: ` /autorespond_status ` 查看日志: `bash tail -f ~/clawd/logs/imsg-autoresponder.log ` 重启: ` /autorespond_restart ` ### 常见问题 "OPENAI_API_KEY not found" - 向 ~/.clawdbot/clawdbot.json 添加 API key: `json { "skills": { "openai-whisper-api": { "apiKey": "sk-proj-YOUR_KEY_HERE" } } } ` - 添加 key 后重启 watcher 权限错误 - 在系统设置中为 Terminal 授予完全磁盘访问权限 - 授权后重启 Terminal - 手动验证 imsg chats --json 可用 消息未被检测到 - 检查 Messages.app 已登录 - 确认联系人已在监控列表:/autorespond_list - 确保 watcher 正在运行:/autorespond_status 重复回复 - 当前版本已通过处理锁修复 - 重启 watcher 应用修复:/autorespond_restart ### 测试 生成真实 AI 回复但不发送(预览模式): ` /autorespond_test +15551234567 Hey what's up? ` 这将: - 使用联系人真实提示 - 通过 OpenAI 生成真实 AI 回复 - 精确展示将发送的内容 - 不会真正发送 消息 适合在正式启用前测试新提示! ## 隐私与安全 ⚠️ 重要: 本工具将代表你自动发送消息。 - 仅添加知情或不会介意与 AI 短信的联系人 - 定期通过 /autorespond_history 审查回复 - 使用速率限制避免 spam - 适当时保持透明 - 可立即禁用:/autorespond_toggle` ## 未来增强 - 基于对话模式的智能速率限制 - 群聊支持 - Web 仪表盘 - 语音消息转录
Automatically respond to iMessages/SMS from specific contacts using AI-generated replies that match your voice and conversation context.
⚠️ Requirements Checklist
Before using this skill, ensure you have:
- [ ] macOS with Messages.app signed in to iMessage
- [ ] imsg CLI installed:
brew install steipete/tap/imsg
- [ ] OpenAI API key configured in Clawdbot config
- [ ] Full Disk Access granted to Terminal/iTerm
- [ ] Messages automation permission (macOS will prompt on first use)
Features
- 🤖 AI-powered responses using OpenAI GPT-4
- 📱 Contact-based prompts - different AI personality per contact
- ⏱️ Rate limiting - configurable delays between auto-responses
- 💬 Context-aware - AI sees recent conversation history
- 📊 Telegram management - slash commands + natural language
- 🔄 Background monitoring - continuous polling for new messages
- 🔧 Auto-cleanup - clears stale locks on restart (prevents stuck contacts)
- 🧪 Test mode - generate real AI responses without sending
- ⏰ Time windows - only respond during specific hours (e.g., 9 AM - 10 PM)
- 🔑 Keyword triggers - only respond if message contains specific keywords (e.g., "urgent", "help")
- 📊 Statistics tracking - track total responses, daily counts, and averages per contact
- 🚦 Daily cap - limit max replies per day per contact (safety feature)
Quick Start
1. Add contacts to watch list
cd ~/clawd/imsg-autoresponder/scripts
node manage.js add "+15551234567" "Reply with a middle finger emoji" "Best Friend"
node manage.js add "+15559876543" "You are my helpful assistant. Reply warmly and briefly, as if I'm responding myself. Keep it under 160 characters." "Mom"
2. Start the watcher
node watcher.js
The watcher runs in the foreground and logs to ~/clawd/logs/imsg-autoresponder.log.
3. Run in background (recommended)
# Start in background
nohup node ~/clawd/imsg-autoresponder/scripts/watcher.js > /dev/null 2>&1 &# Or use screen/tmux
screen -S imsg-watcher
node ~/clawd/imsg-autoresponder/scripts/watcher.js
# Ctrl+A, D to detach
Configuration
Config file: ~/clawd/imsg-autoresponder.json
{
"enabled": true,
"defaultMinMinutesBetweenReplies": 15,
"watchList": [
{
"identifier": "+15551234567",
"name": "Best Friend",
"prompt": "Reply with a middle finger emoji",
"minMinutesBetweenReplies": 10,
"enabled": true
}
]
}
Management via Telegram (Recommended)
The auto-responder can be managed directly through Telegram using slash commands or natural language.
Slash Commands
Both space and underscore formats are supported:
/autorespond list OR /autorespond_list
/autorespond status OR /autorespond_status
/autorespond add OR /autorespond_add
/autorespond remove OR /autorespond_remove
/autorespond edit OR /autorespond_edit
/autorespond delay OR /autorespond_delay
/autorespond history OR /autorespond_history
/autorespond test OR /autorespond_test
/autorespond toggle OR /autorespond_toggle
/autorespond restart OR /autorespond_restartBulk Operations:
/autorespond set-all-delays OR /autorespond_set_all_delays
/autorespond enable-all OR /autorespond_enable_all
/autorespond disable-all OR /autorespond_disable_all
Time Windows:
/autorespond set-time-window OR /autorespond_set_time_window
/autorespond clear-time-windows OR /autorespond_clear_time_windows
Keyword Triggers:
/autorespond add-keyword OR /autorespond_add_keyword
/autorespond remove-keyword OR /autorespond_remove_keyword
/autorespond clear-keywords OR /autorespond_clear_keywords
Statistics & Limits:
/autorespond stats OR /autorespond_stats []
/autorespond set-daily-cap OR /autorespond_set_daily_cap
Examples:
/autorespond_list
/autorespond_status
/autorespond_edit +15551234567 Be more sarcastic
/autorespond_delay +15551234567 30
/autorespond_history +15551234567
/autorespond_set_time_window +15551234567 09:00 22:00
/autorespond_clear_time_windows +15551234567
/autorespond_add_keyword +15551234567 urgent
/autorespond_add_keyword +15551234567 help
/autorespond_clear_keywords +15551234567
/autorespond_stats
/autorespond_stats +15551234567
/autorespond_set_daily_cap +15551234567 10
/autorespond_set_all_delays 30
/autorespond_disable_all
/autorespond_restart
Natural Language
You can also just ask naturally:
- "Show me the auto-responder status"
- "Add +15551234567 to the watch list with prompt: be sarcastic"
- "Change Scott's prompt to be nicer"
- "Disable auto-replies for Mom"
- "What has the auto-responder sent to Foxy recently?"
- "Restart the auto-responder"
The agent will understand and execute the command using the telegram-handler.js script.
Command-Line Management (Advanced)
cd ~/clawd/imsg-autoresponder/scripts# List all contacts
node manage.js list
# Add contact
node manage.js add "+15551234567" "Your custom prompt here" "Optional Name"
# Remove contact
node manage.js remove "+15551234567"
# Enable/disable contact
node manage.js enable "+15551234567"
node manage.js disable "+15551234567"
# Set custom delay for contact (in minutes)
node manage.js set-delay "+15551234567" 30
# Toggle entire system on/off
node manage.js toggle
How It Works
- Watcher monitors all incoming messages via
imsg watch
- Checks watch list to see if sender is configured for auto-response
- Rate limiting ensures we don't spam (configurable minutes between replies)
- Fetches message history for the conversation (last 20 messages)
- Generates AI response using Clawdbot + the contact's configured prompt
- Sends reply via
imsg send
- Logs everything to
~/clawd/logs/imsg-autoresponder.log
State Tracking
Response times are tracked in ~/clawd/data/imsg-autoresponder-state.json:
{
"lastResponses": {
"+15551234567": 1706453280000
}
}
This ensures rate limiting works correctly across restarts.
Prompts
Prompts define how the AI should respond to each contact. Be specific!
Examples:
"Reply with a middle finger emoji""You are my helpful assistant. Reply warmly and briefly, as if I'm responding myself. Keep it under 160 characters."
"You are my sarcastic friend. Reply with witty, slightly snarky responses. Keep it short."
"Politely decline any requests and say I'm busy. Be brief but friendly."
The AI will see:
- The contact's custom prompt
- Recent message history (last 5 messages)
- The latest incoming message
Requirements
- macOS with Messages.app signed in
imsg CLI installed (brew install steipete/tap/imsg)
- Full Disk Access for Terminal
- Clawdbot installed and configured
- Anthropic API key (configured in
~/.clawdbot/clawdbot.json or ANTHROPIC_API_KEY env var)
curl (pre-installed on macOS)
Safety
- Rate limiting prevents spam (default: 15 minutes between replies per contact)
- Manual override via
enabled: false in config or node manage.js disable
- System toggle to disable all auto-responses:
node manage.js toggle
- Logs track all activity for review
Troubleshooting
Watcher not responding:
- Check
~/clawd/logs/imsg-autoresponder.log for errors
- Verify
imsg watch works manually: imsg watch --json
- Ensure contact is in watch list:
node manage.js list
Rate limited too aggressively:
- Adjust delay:
node manage.js set-delay "+15551234567" 5
- Or edit
defaultMinMinutesBetweenReplies in config
AI responses are off:
- Refine the prompt for that contact
- Check message history is being captured correctly (see logs)
Agent Command Handling
When the user uses slash commands or natural language about the auto-responder, use the telegram-handler.js script.
Command Mapping (Both Formats Supported)
| User Input | Normalize To | Handler Call |
|---|
/autorespond list or /autorespond_list | list | node telegram-handler.js list |
/autorespond status or /autorespond_status | status | node telegram-handler.js status |
/autorespond add or /autorespond_add | add | node telegram-handler.js add |
/autorespond remove or /autorespond_remove | remove | node telegram-handler.js remove |
/autorespond edit or /autorespond_edit | edit | node telegram-handler.js edit |
/autorespond delay or /autorespond_delay | delay | node telegram-handler.js delay |
/autorespond history or /autorespond_history | history | node telegram-handler.js history [limit] |
/autorespond test or /autorespond_test | test | node telegram-handler.js test |
/autorespond toggle or /autorespond_toggle | toggle | node telegram-handler.js toggle |
/autorespond restart or /autorespond_restart | restart | node telegram-handler.js restart |
/autorespond set-all-delays or /autorespond_set_all_delays | set-all-delays | node telegram-handler.js set-all-delays |
/autorespond enable-all or /autorespond_enable_all | enable-all | node telegram-handler.js enable-all |
/autorespond disable-all or /autorespond_disable_all | disable-all | node telegram-handler.js disable-all |
/autorespond set-time-window or /autorespond_set_time_window | set-time-window | node telegram-handler.js set-time-window |
/autorespond clear-time-windows or /autorespond_clear_time_windows | clear-time-windows | node telegram-handler.js clear-time-windows |
/autorespond add-keyword or /autorespond_add_keyword | add-keyword | node telegram-handler.js add-keyword |
/autorespond remove-keyword or /autorespond_remove_keyword | remove-keyword | node telegram-handler.js remove-keyword |
/autorespond clear-keywords or /autorespond_clear_keywords | clear-keywords | node telegram-handler.js clear-keywords |
/autorespond stats or /autorespond_stats [] | stats | node telegram-handler.js stats [] |
/autorespond set-daily-cap or /autorespond_set_daily_cap | set-daily-cap | node telegram-handler.js set-daily-cap |
Processing steps:
- Detect
/autorespond or /autorespond_ prefix
- Extract subcommand (normalize underscores to spaces)
- Parse remaining arguments
- Call telegram-handler.js with appropriate parameters
Natural Language Pattern Matching
- "show/list/view auto-responder" →
node telegram-handler.js list
- "add [contact] to auto-responder" →
node telegram-handler.js add
- "change/edit/update [contact]'s prompt" →
node telegram-handler.js edit
- "set delay for [contact]" →
node telegram-handler.js delay
- "disable/remove [contact] from auto-responder" →
node telegram-handler.js remove
- "auto-responder status" →
node telegram-handler.js status
- "what has auto-responder sent to [contact]" →
node telegram-handler.js history
- "restart auto-responder" →
node telegram-handler.js restart
- "enable/disable auto-responder" →
node telegram-handler.js toggle
Contact resolution:
- When user refers to contact names, look up their phone number from the config
- Always use the full E.164 format (e.g.,
+15551234567)
After config changes:
Always remind the user to restart the watcher if the command output mentions it.
Troubleshooting
Watcher Not Responding
Check status:
/autorespond_status
View logs:
tail -f ~/clawd/logs/imsg-autoresponder.log
Restart:
/autorespond_restart
Common Issues
"OPENAI_API_KEY not found"
- Add API key to
~/.clawdbot/clawdbot.json:
{
"skills": {
"openai-whisper-api": {
"apiKey": "sk-proj-YOUR_KEY_HERE"
}
}
}
- Restart watcher after adding key
Permission errors
- Grant Full Disk Access to Terminal in System Settings
- Restart Terminal after granting access
- Verify
imsg chats --json works manually
Messages not detected
- Check Messages.app is signed in
- Verify contact is in watch list:
/autorespond_list
- Ensure watcher is running:
/autorespond_status
Duplicate responses
- Fixed in current version via processing locks
- Restart watcher to apply fix:
/autorespond_restart
Testing
Generate actual AI responses without sending (preview mode):
/autorespond_test +15551234567 Hey what's up?
This will:
- Use the contact's actual prompt
- Generate a real AI response via OpenAI
- Show exactly what would be sent
- NOT actually send the message
Perfect for testing new prompts before going live!
Privacy & Safety
⚠️ Important: This tool sends messages on your behalf automatically.
- Only add contacts who know they're texting an AI or won't mind
- Review responses regularly via
/autorespond_history
- Use rate limiting to avoid spam
- Be transparent when appropriate
- Disable instantly if needed:
/autorespond_toggle
Future Enhancements
- Smart rate limiting based on conversation patterns
- Group chat support
- Web dashboard
- Voice message transcription