多 IM 平台消息自动保存到 Memos 笔记。支持飞书、企业微信和 Telegram,发送文本/图片消息给机器人,自动创建 Memos 并回复笔记 URL。
支持 // 评论合并:转发消息后在评论框以 // 前缀追加评论,评论与正文自动合并为一条笔记。
单个 FastAPI 进程
├── 飞书: WebSocket 长连接 (后台线程,SDK 内置鉴权)
├── 企微: POST /webhook/wecom (Cloudflare Tunnel 暴露)
├── Telegram: POST /webhook/telegram (Cloudflare Tunnel 暴露)
└── 共享: Memos service 创建笔记
# 1. 安装依赖
uv sync
# 2. 配置环境变量
cp .env.example .env
# 编辑 .env 填入实际配置
# 3. 启动服务
uv run uvicorn imrobot.main:app --host 0.0.0.0 --port 8000| 变量 | 说明 | 必填 |
|---|---|---|
ENABLED_PLATFORMS |
启用的平台 (逗号分隔: feishu, wecom, telegram) |
是 |
MEMOS_URL |
Memos 实例地址 (内网 API 调用) | 是 |
MEMOS_PUBLIC_URL |
Memos 公网地址 (IM 回复链接,默认同 MEMOS_URL) |
否 |
MEMOS_TOKEN |
Memos Personal Access Token | 是 |
FEISHU_APP_ID |
飞书应用 ID | 启用飞书时 |
FEISHU_APP_SECRET |
飞书应用 Secret | 启用飞书时 |
WECOM_TOKEN |
企微机器人 Token | 启用企微时 |
WECOM_ENCODING_AES_KEY |
企微 EncodingAESKey (43位) | 启用企微时 |
TELEGRAM_BOT_TOKEN |
Telegram Bot Token | 启用 Telegram 时 |
TELEGRAM_ALLOWED_USERS |
允许的用户 ID (逗号分隔,为空则不限制) | 否 |
TELEGRAM_WEBHOOK_BASE_URL |
公网地址 (用于自动注册 webhook) | 否 |
AGGREGATOR_TIMEOUT |
评论聚合超时秒数 (默认 10) |
否 |
- 进入 飞书开放平台 → 创建企业自建应用
- 开启 机器人 能力
- 在「权限管理」中添加以下权限:
im:message.p2p_msg:readonly— 读取用户发给机器人的单聊消息im:message.group_at_msg:readonly— 接收群聊中 @机器人的消息im:message:send_as_bot— 以机器人身份发送消息im:resource— 获取消息中的资源文件(用于下载图片)
- 在「事件与回调」中选择 长连接 模式(无需公网地址),订阅事件:
im.message.receive_v1— 接收消息
- 获取
App ID和App Secret,填入.env - 发布应用版本并通过审核
本项目使用 WebSocket 长连接方式,无需配置回调 URL 和公网域名。
- 进入 企业微信管理后台 → 应用管理 → 创建「智能机器人」
- 在机器人配置页获取:
- Token — 填入
.env的WECOM_TOKEN - EncodingAESKey — 填入
.env的WECOM_ENCODING_AES_KEY(43 位)
- Token — 填入
- 配置「接收消息 URL」为你的公网地址:
保存时企微会发送 GET 验证请求,服务需先启动
https://your-domain.com/webhook/wecom - 公网暴露方式推荐使用 Cloudflare Tunnel:
cloudflared tunnel --url http://localhost:8000
企微「智能机器人」的回调消息是加密的(AES-256-CBC),本项目已内置加解密处理。 图片/文件也是加密传输的,下载后自动解密。
- 在 Telegram 中搜索 @BotFather,发送
/newbot创建机器人 - 获取 Bot Token,填入
.env的TELEGRAM_BOT_TOKEN - 获取你的 user ID(可通过 @userinfobot 查询),填入
TELEGRAM_ALLOWED_USERS - 配置公网暴露(复用 Cloudflare Tunnel),webhook 路径为:
https://your-domain.com/webhook/telegram - 自动注册 webhook:设置
TELEGRAM_WEBHOOK_BASE_URL=https://your-domain.com,服务启动时会自动调用setWebhook - 手动注册 webhook(可选):
curl "https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://your-domain.com/webhook/telegram"
通过
TELEGRAM_ALLOWED_USERS限制仅授权用户可使用,多个用户用逗号分隔。留空则不限制。
转发消息给机器人后,紧接着发送 // 你的评论,评论会自动合并到刚才的笔记中:
评论内容
---
原始转发内容
回复策略:每条 memo 只回复一次
- 评论合并成功 → "Merged & saved to Memos: URL"
- 无评论 → 延迟 2 秒后回复 "Saved to Memos: URL"
- 飞书回复消息(有
parent_id)自动视为评论,无需//前缀
| 平台 | 文本 | 图片 | 富文本/图文混排 | 语音 |
|---|---|---|---|---|
| 飞书 | text | image | post (富文本) | - |
| 企微 | text | image (单聊) | mixed (图文混排) | voice (转文本) |
| Telegram | text | photo (含 caption) | - | - |
# 单元测试
uv run pytest tests/test_wecom_crypto.py tests/test_telegram.py tests/test_aggregator.py -v
# 集成测试 (需要 Memos 实例)
uv run pytest tests/test_memos.py -v
# 类型检查
uv run mypy src/imrobot/src/imrobot/
├── main.py # FastAPI 入口 + lifespan
├── config.py # 统一配置
├── log.py # 统一日志
├── services/
│ ├── memos.py # Memos API 客户端
│ ├── aggregator.py # 评论聚合器 (// 合并逻辑)
│ └── reply.py # 统一回复文案
└── platforms/
├── feishu/
│ ├── auth.py # tenant_access_token 管理
│ └── bot.py # WS 长连接 + 消息处理
├── wecom/
│ ├── crypto.py # AES-256-CBC 加解密
│ └── handler.py # webhook 路由 + 消息处理
└── telegram/
└── handler.py # webhook 路由 + 消息处理