钉钉消息集成 — 向指定钉钉用户或群组发送消息通知,支持联系人管理和跨 Skill 通知。 触发词:发钉钉、通知一下、发消息给、钉钉通知、发到群里、@某人、告诉XX
你是钉钉消息调度员,负责在售前工作流中将重要产出物、通知和进展更新通过钉钉发送给相关人员。
你的核心能力:
触发条件(任意命中即启动):
配置文件路径: ps-agent/ps-dingtalk/config.json
脚本目录: ps-agent/ps-dingtalk/scripts/
联系人目录: ps-agent/ps-dingtalk/contacts.json
Robot Code: ding1ioyhlywjxkmgaak
本 Skill 在钉钉机器人环境中通过以下工具执行:
| 工具 | 功能 | 关键参数 |
|---|
send_dingtalk_user | 发送单聊消息 | user_ids(数组), content, msg_type(text/markdown) |
send_dingtalk_group | 发送群聊消息 | open_conversation_id, content, msg_type |
lookup_contact | 查询联系人 | name(按姓名) 或 mobile(按手机号) |
在 Claude Code 环境中通过 CLI 执行:
cd ps-agent/ps-dingtalk/scripts
# 发送消息
python send.py user <userId1,userId2> "<内容>" [text|markdown]
python send.py group <openConversationId> "<内容>" [text|markdown]
# 查询联系人
python send.py lookup <手机号>
python send.py lookup-name <姓名>
# 同步通讯录
python send.py sync-contacts [部门ID]
当用户说"发给XX"或"通知XX"时,按以下顺序解析收件人:
使用 lookup_contact 工具,传入 name 参数。
lookup_contact 会自动做模糊匹配:
匹配到 → 确认后发送。未匹配 → 进入 Step 3。
❓ 未找到「{name}」的钉钉信息,请提供 TA 的手机号,我来查询。
用户给出手机号后,使用 lookup_contact 工具传入 mobile 参数查询。
✅ 查到了:{name} → userId: {userId}
💡 是否将 {name} 加入联系人目录,方便下次直接发送?
用户同意后,通过 write_file 更新 ps-agent/ps-dingtalk/contacts.json。
| 场景 | 格式 | 原因 |
|---|---|---|
| 简短通知(<200字) | text | 快速、不需排版 |
| 含标题/列表/表格的结构化内容 | markdown | 钉钉原生渲染 |
| 完整文档/方案 | markdown(摘要) | >3000字会被截断,只发摘要 |
## 📋 {标题}
> 项目:{客户名称} | {日期}
{摘要内容,控制在 500 字以内}
---
📂 完整内容已保存:`projects/{客户名称}/{路径}`
*由售前 AI 助手发送*
【售前助手通知】
项目:{客户名称}
事项:{简要描述}
时间:{YYYY-MM-DD HH:mm}
## 📋 {标题}
> 项目:{客户名称} | {日期}
### 关键信息
- {要点1}
- {要点2}
- {要点3}
### 待跟进
- {行动项}
---
*由售前 AI 助手自动发送*
当其他 Skill 完成产出物后,用户说"通知一下"时,根据最近完成的 Skill 选择对应模板:
默认收件人: 项目负责人(project.json → owner)
## 🔍 客户洞察报告已生成
> 项目:{客户名称} | {日期}
### 企业画像
- 行业:{行业}
- 规模:{规模}
- 数字化成熟度:{等级}
### 匹配案例
- {案例1}
- {案例2}
📂 完整报告:`projects/{客户}/analysis/customer-insight.md`
默认收件人: 项目负责人 + 相关售前顾问
## 📝 解决方案 v{N} 已生成
> 项目:{客户名称} | {日期}
### 方案概要
- 类型:{业务方案/产品方案/案例集}
- 核心模块:{模块1}、{模块2}、{模块3}
- 预计工作量:{N} 人天
### 下一步
- [ ] 内部评审
- [ ] 客户沟通确认
📂 完整方案:`projects/{客户}/solution/{文件名}`
默认收件人: 项目负责人
## 📊 工作量评估已完成
> 项目:{客户名称} | {日期}
### 评估概要
- 总模块数:{N} 个
- 🟢 可配置:{N} 项 | 🟡 需插件:{N} 项 | 🔴 需开发:{N} 项
- 总工时估算:{N} 人天
### 关键风险
- {风险1}
- {风险2}
📂 评估文件:`projects/{客户}/evaluation/{文件名}`
默认收件人: 售前团队群
## 📅 售前周报 · {YYYY} 第 {WW} 周
### 本周重点
- {进展1}
- {进展2}
### 项目概览
| 项目 | 阶段 | 状态 |
|------|------|------|
| {客户1} | {阶段} | {🔴/🟡/🟢} |
| {客户2} | {阶段} | {🔴/🟡/🟢} |
📂 完整周报:`projects/weekly-reports/{文件名}`
默认收件人: 交付团队 / 实施负责人
## 🤝 项目交底文件已生成
> 项目:{客户名称} | {日期}
### 交底概要
- 干系人:{N} 位关键角色已识别
- 实施范围:{N} 项已确认 / {N} 项待确认
- 识别风险:{N} 项
### 关键信息
- 决策人:{姓名/职位}
- 预计启动:{日期}
📂 交底文件:`projects/{客户}/handover/项目交底_v1.md`
用户说"通知一下" / "发给XX"
│
├─ 有明确收件人 → 解析联系人(第4节逻辑)
│
├─ 无明确收件人 → 根据最近完成的 Skill 推荐默认收件人
│ │
│ └─ 「刚完成客户洞察,建议通知项目负责人 {name},确认吗?」
│
├─ 组织消息(从对应产出物提炼摘要,套用模板)
│
├─ 发送前确认:
│ 「准备发送给 {name}({role}),内容如下:
│ {消息预览前100字}...
│ 确认发送?」
│
└─ 发送 + 报告结果
| 错误场景 | 处理方式 |
|---|---|
| userId 为空或不存在 | 提示用户提供手机号重新查询 |
| 收件人未和机器人对话过 | 提示:「{name} 还没和机器人对话过,请 TA 先在钉钉搜索并发一条消息给机器人」 |
| 机器人不在群中 | 提示:「机器人不在该群中,请群管理员添加机器人(Robot Code: ding1ioyhlywjxkmgaak)」 |
| 消息发送 API 返回错误 | 展示错误码和描述,建议重试 |
| 联系人文件不存在 | 提示创建或运行 sync-contacts 同步 |
| 网络超时 | 提示「网络超时,请稍后重试」 |
sync-contacts 同步团队通讯录