Codex / Claude Code 任务监控 + 飞书机器人通知系统。
当服务器上的 AI 编程 Agent 完成任务、出错、或需要你继续指挥时,通过飞书机器人实时通知你。你也可以在飞书中发送指令(状态、日志、继续等)来控制 Agent。
codex_feishu_monitor/
├── bot.py # 飞书长连接机器人服务(主进程)
├── monitor.py # 状态 / 日志 / 任务队列维护模块
├── feishu_client.py # 飞书 API 封装(token、发消息、回复)
├── config.py # 配置中心(环境变量读取)
├── requirements.txt # Python 依赖
├── README.md # 本文件
├── scripts/
│ ├── codex_notify.py # Codex notify/hook 调用入口
│ └── install_systemd.sh # systemd 服务安装脚本
└── systemd/
└── codex-feishu-bot.service # systemd service 模板
cd codex_feishu_monitor
# 创建虚拟环境
uv venv
# 安装依赖
uv pip install -r requirements.txt或者使用传统 pip:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt创建环境变量文件:
cat > ~/.feishu_codex_env <<'EOF'
export FEISHU_APP_ID="cli_xxxxxxxxxxxxxxxx"
export FEISHU_APP_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export FEISHU_NOTIFY_CHAT_ID="oc_xxxxxxxxxxxxxxxx" # 可选
EOF| 变量 | 必填 | 说明 |
|---|---|---|
FEISHU_APP_ID |
✅ 是 | 飞书应用的 App ID |
FEISHU_APP_SECRET |
✅ 是 | 飞书应用的 App Secret |
FEISHU_NOTIFY_CHAT_ID |
❌ 否 | 主动通知目标 chat_id,不填则只写本地文件 |
⚠️ 安全提醒:App Secret 是敏感信息,这个文件权限应设为 600:chmod 600 ~/.feishu_codex_env
source ~/.feishu_codex_env
python bot.py看到日志输出 BOT RUNNING (WebSocket long connection) 即表示启动成功。
在 飞书开放平台 中需要进行以下配置:
在「权限管理」中添加:
im:message— 获取消息内容im:message:send_as_bot— 以机器人身份发送消息im:message:read— 读取消息
在「事件订阅」中:
- 开启 Bot 能力(如果尚未开启)
- 订阅事件:
im.message.receive_v1(接收消息) - 使用长连接模式(WebSocket)
- 发布应用版本(配置修改后需要发布才能生效)
- 不需要配置「请求地址 URL」(长连接模式不需要回调地址)
- 建议在「安全设置」中限制 IP 范围(如果你的服务器有固定 IP)
Bot 支持以下白名单指令(不会执行任何任意 shell 命令):
| 指令 | 说明 |
|---|---|
状态 |
查看当前监控状态(任务状态、运行时间、待处理任务数) |
日志 |
查看最近 50 行监控日志 |
继续 xxx |
将指令写入任务队列(Agent 处理后才执行) |
清除队列 |
清空待处理任务队列 |
帮助 |
显示帮助信息 |
⚠️ 安全设计:飞书消息不会直接执行任何 shell 命令。继续 xxx只把指令写入队列文件,你需要另外编写脚本或 cron 来消费这个队列。
在 ~/.codex/config.toml 中添加:
notify = ["python3", "/path/to/codex_feishu_monitor/scripts/codex_notify.py"]Codex 在完成任务、出错、需要用户输入时会自动调用此脚本。
在 ~/.claude/settings.json 中添加 hooks:
{
"hooks": {
"Stop": [
{
"type": "command",
"command": "python3 /path/to/codex_feishu_monitor/scripts/codex_notify.py"
}
]
}
}或使用 Claude Code config:
在 ~/.codex/config.toml 中:
[features]
hooks = true
[[hooks.Stop]]
[[hooks.Stop.hooks]]
type = "command"
command = "python3 /path/to/codex_feishu_monitor/scripts/codex_notify.py"
timeout = 30脚本支持两种输入方式:
# 方式 1: 从 stdin 读取 JSON
echo '{"status":"done","summary":"task completed"}' | python3 scripts/codex_notify.py
# 方式 2: 从命令行参数读取 JSON
python3 scripts/codex_notify.py '{"status":"error","error":"connection failed"}'bash scripts/install_systemd.sh安装后:
# 启用服务
systemctl --user enable codex-feishu-bot
# 启动服务
systemctl --user start codex-feishu-bot
# 查看状态
systemctl --user status codex-feishu-bot
# 查看日志
journalctl --user -u codex-feishu-bot -floginctl enable-lingerbash scripts/install_systemd.sh --system所有运行时数据默认存储在 ~/.codex_feishu_monitor/ 下,也可以通过 CODEX_FEISHU_BASE_DIR 环境变量覆盖:
export CODEX_FEISHU_BASE_DIR="$HOME/.codex_feishu_monitor"| 文件 | 说明 |
|---|---|
status.json |
当前监控状态 |
monitor.log |
监控日志 |
task_queue.txt |
待处理任务队列 |
status.json 格式:
{
"last_status": "done",
"last_update_time": "2026-06-14 15:30:00",
"last_summary": "Fixed login bug",
"last_error": ""
}状态值:idle | running | done | error | waiting_user
继续 xxx 指令写入队列后,你可以用 cron 或脚本消费:
#!/bin/bash
# 示例:每 30 秒检查一次队列
QUEUE_FILE="${CODEX_FEISHU_BASE_DIR:-$HOME/.codex_feishu_monitor}/task_queue.txt"
if [[ -f "$QUEUE_FILE" && -s "$QUEUE_FILE" ]]; then
# 处理任务...
cat "$QUEUE_FILE"
> "$QUEUE_FILE" # 清空队列
fi- ✅ App Secret 从环境变量读取,不写死在代码中
- ✅ 日志中不打印完整 App Secret(只显示前 4 位和后 4 位)
- ✅ 飞书消息使用白名单机制,不执行任意 shell 命令
- ✅
继续 xxx只写入队列文件,不直接执行 - ✅ README 示例使用占位符,不含真实密钥
- ✅ 环境变量文件建议权限 600
Bot 无法启动:
# 检查环境变量是否加载
source ~/.feishu_codex_env
echo $FEISHU_APP_ID
# 检查依赖是否安装
python3 -c "import lark_oapi; print(lark_oapi.__version__)"Bot 收不到消息:
- 确认飞书应用已发布
- 确认已订阅
im.message.receive_v1事件 - 确认在飞书中向机器人发送的是 私聊消息 或将机器人 加入群聊
- 查看 Bot 日志:
tail -f ${CODEX_FEISHU_BASE_DIR:-$HOME/.codex_feishu_monitor}/monitor.log
notify 不发飞书消息:
- 确认
FEISHU_NOTIFY_CHAT_ID已设置 - 获取 chat_id:在飞书中向机器人发一条消息,从 API 日志中提取