Personal Crm
by @andrelyl
Personal relationship manager powered by Feishu/Lark Bitable. Track contacts, interactions, birthdays (including Chinese lunar calendar), anniversaries, and...
clawhub install person-crm📖 About This Skill
name: personal-crm description: Personal relationship manager powered by Feishu/Lark Bitable. Track contacts, interactions, birthdays (including Chinese lunar calendar), anniversaries, and get proactive reminders. Never forget a birthday again. metadata: {"openclaw": {"requires": {"config": ["feishu.enabled"]}, "emoji": "💝", "homepage": "https://clawhub.ai/AndreLYL/person-crm"}}
Personal CRM — 人际关系记忆助手
> 帮你记住身边每个人的故事。生日、喜好、上次聊了什么、下次该联系谁。
Configuration
This skill stores data in a Feishu/Lark Bitable. Configure your credentials in ~/.openclaw/openclaw.json:
{
"channels": {
"feishu": {
"enabled": true,
"accounts": {
"main": {
"appId": "your_feishu_app_id",
"appSecret": "your_feishu_app_secret"
}
}
}
},
"skills": {
"entries": {
"personal-crm": {
"enabled": true,
"config": {
"app_token": "YOUR_BITABLE_APP_TOKEN",
"contacts_table_id": "YOUR_CONTACTS_TABLE_ID",
"interactions_table_id": "YOUR_INTERACTIONS_TABLE_ID"
}
}
}
}
}
配置说明:
| 配置项 | 来源 | 说明 |
|--------|------|------|
| channels.feishu.appId | 飞书开放平台 | 创建应用后获取 |
| channels.feishu.appSecret | 飞书开放平台 | 创建应用后获取 |
| skills.personal-crm.config.app_token | Bitable 多维表格 | 应用凭证 |
| skills.personal-crm.config.contacts_table_id | Bitable 表格 | 联系人表 ID |
| skills.personal-crm.config.interactions_table_id | Bitable 表格 | 互动记录表 ID |
获取方式:
1. 飞书应用凭证:https://open.feishu.cn/ → 创建应用 → 凭证与基础信息
2. Bitable app_token:创建多维表格后从 URL 获取
3. Table ID:从 Bitable URL 的 ?table= 参数获取
Reading config: Read the user's config from skills.entries.personal-crm.config to get app_token, contacts_table_id, and interactions_table_id. If config is missing, tell the user to say "初始化 Personal CRM" or "Initialize Personal CRM".
自动建表(Auto Setup)
当用户说"初始化 Personal CRM"、"Initialize Personal CRM"或"设置 CRM"时,执行以下步骤:
Step 1: 创建 Bitable
feishu_bitable_create_app(name="Personal CRM")
记录返回的 app_token。Step 2: 在默认表上创建联系人表字段
Bitable 创建时会自带一张默认表。先用feishu_bitable_get_meta 获取默认表的 table_id,然后依次创建字段:feishu_bitable_create_field(app_token, table_id, "关系", 3, property={"options": [{"name":"家人"},{"name":"女朋友"},{"name":"朋友"},{"name":"同事"},{"name":"领导"},{"name":"客户"},{"name":"合作伙伴"},{"name":"导师"},{"name":"其他"}]})
feishu_bitable_create_field(app_token, table_id, "手机", 13)
feishu_bitable_create_field(app_token, table_id, "微信", 1)
feishu_bitable_create_field(app_token, table_id, "邮箱", 1)
feishu_bitable_create_field(app_token, table_id, "城市", 1)
feishu_bitable_create_field(app_token, table_id, "公司", 1)
feishu_bitable_create_field(app_token, table_id, "职位", 1)
feishu_bitable_create_field(app_token, table_id, "生日", 5, property={"auto_fill":false,"date_formatter":"yyyy-MM-dd"})
feishu_bitable_create_field(app_token, table_id, "农历生日", 1)
feishu_bitable_create_field(app_token, table_id, "过农历生日", 7)
feishu_bitable_create_field(app_token, table_id, "纪念日", 5, property={"auto_fill":false,"date_formatter":"yyyy-MM-dd"})
feishu_bitable_create_field(app_token, table_id, "纪念日说明", 1)
feishu_bitable_create_field(app_token, table_id, "提醒提前天数", 2, property={"formatter":"0"})
feishu_bitable_create_field(app_token, table_id, "爱好", 4)
feishu_bitable_create_field(app_token, table_id, "标签", 4)
feishu_bitable_create_field(app_token, table_id, "备注", 1)
feishu_bitable_create_field(app_token, table_id, "最后联系", 5, property={"auto_fill":false,"date_formatter":"yyyy-MM-dd"})
feishu_bitable_create_field(app_token, table_id, "联系频率", 3, property={"options": [{"name":"每周"},{"name":"每月"},{"name":"每季度"},{"name":"偶尔"}]})
Step 3: 创建互动记录表
目前 feishu_bitable 工具不支持直接创建新表,需要用户在飞书中手动添加第二张表。告诉用户:> 联系人表已自动创建完成!请在飞书中打开这个多维表格,手动添加第二张表命名为"互动记录",然后告诉我表的 table_id,我来自动创建所有字段。
当用户提供了互动记录表的 table_id 后,创建字段:
feishu_bitable_create_field(app_token, table_id, "联系人", 1)
feishu_bitable_create_field(app_token, table_id, "日期", 5, property={"auto_fill":false,"date_formatter":"yyyy-MM-dd"})
feishu_bitable_create_field(app_token, table_id, "类型", 3, property={"options": [{"name":"见面"},{"name":"通话"},{"name":"消息"},{"name":"会议"},{"name":"吃饭"},{"name":"邮件"}]})
feishu_bitable_create_field(app_token, table_id, "要点", 1)
feishu_bitable_create_field(app_token, table_id, "后续", 1)
feishu_bitable_create_field(app_token, table_id, "氛围", 3, property={"options": [{"name":"开心"},{"name":"平淡"},{"name":"深入"},{"name":"紧张"},{"name":"感动"},{"name":"尴尬"}]})
feishu_bitable_create_field(app_token, table_id, "费用", 2, property={"formatter":"0.0"})
Step 4: 告诉用户配置信息
建表完成后,输出配置信息让用户添加到~/.openclaw/openclaw.json,包含生成的 app_token、contacts_table_id 和 interactions_table_id。激活条件
用户提到以下任何内容时激活:核心理念
这不是冷冰冰的销售工具,而是帮用户做一个更有温度的人。数据库字段
联系人表 (contacts_table_id)
| 字段名 | 类型 | 说明 | |--------|------|------| | Personal CRM | Text | 主字段,填姓名 | | 关系 | SingleSelect | 家人/女朋友/朋友/同事/领导/客户/合作伙伴/导师/其他 | | 手机 | Phone | | | 微信 | Text | | | 邮箱 | Text | | | 城市 | Text | | | 公司 | Text | | | 职位 | Text | | | 生日 | DateTime | timestamp_ms,公历生日 | | 农历生日 | Text | 如"1997年九月十三",用于过农历生日的人 | | 过农历生日 | Checkbox | 打勾=过农历生日,提醒时需转换当年公历 | | 纪念日 | DateTime | timestamp_ms,恋爱纪念日、友谊纪念日等 | | 纪念日说明 | Text | 这个纪念日是什么,如"恋爱纪念日" | | 提醒提前天数 | Number | 生日/纪念日提前几天提醒,默认3天 | | 爱好 | MultiSelect | 可自由新增 | | 标签 | MultiSelect | 可自由新增 | | 备注 | Text | 口味偏好、习惯、雷区、性格特点等 | | 最后联系 | DateTime | timestamp_ms,每次记录互动时自动更新 | | 联系频率 | SingleSelect | 每周/每月/每季度/偶尔 | | 创建时间 | CreatedTime | 自动 |互动记录表 (interactions_table_id)
| 字段名 | 类型 | 说明 | |--------|------|------| | 多行文本 | Text | 主字段,填事件简述(如"和小王深圳湾散步") | | 联系人 | Text | 填姓名 | | 日期 | DateTime | timestamp_ms | | 类型 | SingleSelect | 见面/通话/消息/会议/吃饭/邮件 | | 要点 | Text | 聊了什么、发生了什么故事、对方分享的细节 | | 后续 | Text | 需要跟进的事 | | 氛围 | SingleSelect | 开心/平淡/深入/紧张/感动/尴尬 | | 费用 | Number | 花销金额 |操作指南
1. 添加联系人
从用户的自然语言中提取信息,调用:feishu_bitable_create_record(
app_token=,
table_id=,
fields={
"Personal CRM": "姓名",
"关系": "朋友",
"城市": "深圳",
...只填用户提供的信息
}
)
注意:
2. 记录互动
创建互动记录 + 更新联系人的"最后联系"日期:步骤: 1. 先 list_records 联系人表,找到对应联系人的 record_id 2. create_record 到互动记录表 3. update_record 更新联系人的"最后联系"字段为当前时间
智能捕捉: 当用户随口转述与某人的经历时(如"今天和小王吃饭,他说他要结婚了"),应该:
要点写法: 记录故事和细节,不是干巴巴的摘要。
3. 查询联系人
调用 list_records 获取联系人列表,在结果中筛选匹配的记录。 展示格式:💝 王明
├ 关系:朋友 | 公司:字节跳动 | 职位:算法工程师
├ 城市:深圳 | 微信:wangming
├ 生日:1995-03-15 | 纪念日:—
├ 爱好:摄影、旅游 | 标签:AI行业、大学同学
├ 最后联系:2026-02-20 | 联系频率:每月
└ 备注:不吃香菜,最近跳槽到字节做大模型
如果有互动记录,追加最近 3 条:
📅 最近互动:
├ 2026-02-20 吃饭 — 聊了跳槽的事,他很兴奋 [开心]
├ 2026-01-15 消息 — 问我借了本《深度学习》
└ 2025-12-31 见面 — 跨年聚会,一起倒数
4. 生日和纪念日提醒(定时任务)
每天检查所有联系人的生日和纪念日字段:检查逻辑: 1. list_records 获取所有联系人 2. 如果"过农历生日"为 true:读取"农历生日"字段,转换为当年公历日期再比较 3. 如果"过农历生日"为 false/空:读取"生日"字段(公历),只比较月和日 4. 纪念日只看月和日 5. N = 提醒提前天数,默认3
提醒格式:
🎂 生日提醒
├ 明天:小美(女朋友)生日![农历九月十三]
└ 根据备注和爱好给出简短送礼建议💕 纪念日提醒
└ 3天后:和小美的恋爱纪念日(在一起2周年)
5. 关系维护提醒
检查"最后联系"和"联系频率":⏰ 该联系了
├ 老王(朋友)— 45天未联系,约定每月 [超期15天]
└ 张总(客户)— 35天未联系,约定每月 [超期5天]
6. 更新联系人
1. list_records 找到联系人 record_id 2. update_record 更新指定字段 3. 如果是从对话中捕捉到的新信息,追加到备注而不是覆盖 4. ⚠️ 只传需要更新的字段,绝不传 null 值7. 智能信息捕捉规则
当用户在对话中提到某人的新信息时,主动更新:触发词示例:
处理流程: 1. 识别提到的人名 2. 在联系人表中查找匹配 3. 如果找到,更新相关字段或创建互动记录 4. 如果没找到,询问是否要添加为新联系人 5. 简洁确认已记录,不要长篇大论
8. 批量导入联系人
支持从多种格式导入联系人数据。8.1 CSV 导入
CSV 文件应包含表头行,识别以下字段:使用脚本:
python3 ~/.openclaw/workspace/skills/personal-crm/scripts/import_contacts.py /path/to/contacts.csv --dry-run
处理流程: 1. 用户说"导入 CSV /path/to/file.csv" 2. 执行脚本带 --dry-run 获取预览 3. 展示前 3 条让用户确认 4. 用户确认后执行不带 --dry-run 5. 逐条调用 feishu_bitable_create_record 导入 6. 返回导入结果:成功条数、失败条数
处理逻辑:
8.2 vCard (.vcf) 导入
解析 vCard 3.0/4.0 格式:使用脚本:
python3 ~/.openclaw/workspace/skills/personal-crm/scripts/import_contacts.py /path/to/contacts.vcf --dry-run
处理流程: 1. 用户说"导入 vcf /path/to/contacts.vcf" 2. 执行脚本带 --dry-run 获取预览 3. 展示前 3 条让用户确认 4. 用户确认后执行不带 --dry-run 5. 逐条调用 feishu_bitable_create_record 导入 6. 返回导入结果
8.3 微信名片截图识别(OCR)
当用户提供微信名片截图时: 1. 用户发送图片到对话 2. 使用 exec 工具调用 tesseract OCR 识别文字 3. 解析提取:姓名、微信号、手机号、公司、职位 4. 展示给用户确认 5. 用户确认后调用 feishu_bitable_create_record 创建联系人OCR 命令:
tesseract /path/to/image.jpg stdout -l chi_sim+eng
注意: 需要先安装 tesseract-ocr:
sudo apt install tesseract-ocr tesseract-ocr-chi-sim
8.4 手机联系人同步(ADB)
当用户说"同步手机联系人"时: 1. 检查 ADB 是否可用 2. 让用户手机开启 USB 调试并连接电脑 3. 读取联系人:adb shell content query --uri content://contacts/phones 4. 解析并导入到飞书8.5 导入命令格式
用户可以说:返回格式:
📥 导入完成
├ 成功:28 人
├ 跳过:2 人(无姓名)
└ 失败:0 人
9. 导出联系人
支持导出联系人数据用于备份或迁移。9.1 导出为 CSV
用户可以说:处理流程: 1. 调用 feishu_bitable_list_records 获取所有联系人 2. 转换为 CSV 格式 3. 保存到文件并告知用户路径
9.2 导出为 vCard
导出为 vCard 格式,方便导入到手机通讯录。交互风格
⚙️ Configuration
This skill stores data in a Feishu/Lark Bitable. Configure your credentials in ~/.openclaw/openclaw.json:
{
"channels": {
"feishu": {
"enabled": true,
"accounts": {
"main": {
"appId": "your_feishu_app_id",
"appSecret": "your_feishu_app_secret"
}
}
}
},
"skills": {
"entries": {
"personal-crm": {
"enabled": true,
"config": {
"app_token": "YOUR_BITABLE_APP_TOKEN",
"contacts_table_id": "YOUR_CONTACTS_TABLE_ID",
"interactions_table_id": "YOUR_INTERACTIONS_TABLE_ID"
}
}
}
}
}
配置说明:
| 配置项 | 来源 | 说明 |
|--------|------|------|
| channels.feishu.appId | 飞书开放平台 | 创建应用后获取 |
| channels.feishu.appSecret | 飞书开放平台 | 创建应用后获取 |
| skills.personal-crm.config.app_token | Bitable 多维表格 | 应用凭证 |
| skills.personal-crm.config.contacts_table_id | Bitable 表格 | 联系人表 ID |
| skills.personal-crm.config.interactions_table_id | Bitable 表格 | 互动记录表 ID |
获取方式:
1. 飞书应用凭证:https://open.feishu.cn/ → 创建应用 → 凭证与基础信息
2. Bitable app_token:创建多维表格后从 URL 获取
3. Table ID:从 Bitable URL 的 ?table= 参数获取
Reading config: Read the user's config from skills.entries.personal-crm.config to get app_token, contacts_table_id, and interactions_table_id. If config is missing, tell the user to say "初始化 Personal CRM" or "Initialize Personal CRM".