name: linkedin-followup description: 从Google Sheets管理LinkedIn潜在客户——按姓名搜索、读取实时对话线程、更新状态、发送上下文相关的跟进消息。在linkedin-dm之后使用,将潜在客户推进销售管道(已发送→已回复→已安排通话→已完成演示→已关闭)。 metadata: { “openclaw”: { “emoji”: “🔁”, “requires”: { “bins”: [“gog”] }, “skills”: [“gog”], “tags”: [“linkedin”, “crm”, “outreach”, “sales”, “follow-up”] } }
linkedin-followup
从一个集中的Google Sheets CRM管理持续的LinkedIn对话。读取对话线程、起草有上下文意识的回复、发送消息、并保持表格更新——全部通过一个技能完成。
执行前检查清单
在执行任何操作之前:
- 表格ID — 确认CRM表格ID(来自
linkedin-dm设置)。默认:1eEZDGcr1dIbSC782mNkxvD7pVrF8rOFySWCVZ1RXkhM,标签页:Sheet1(如果重命名了,则为Outreach)。 - gog 认证 — 运行
gog auth list。如果没有令牌:请参阅下面的 gog 认证设置。 - 浏览器 — 打开openclaw浏览器配置文件,并确认已登录LinkedIn。首先导航到
/feed/。 - 模式 — 确定用户想要哪种模式(参见 模式)。
表格结构
CRM表格使用以下列(A–P):
| 列 | 字段 | 备注 |
|---|---|---|
| A | 发送日期 | ISO 日期 |
| B | 人员姓名 | 全名 |
| C | 职位/头衔 | |
| D | 公司 | |
| E | LinkedIn URL | 个人资料URL |
| F | 关系切入点 | 开场白中使用的切入点 |
| G | 已发送的开场白 | 消息1文本 |
| H | 已发送的推介 | 消息2文本 |
| I | 活动批次 | 批次标签 |
| J | 状态 | 当前管道阶段 |
| K | 备注 | 上下文和历史记录 |
| L | 最后更新时间 | ISO 时间戳 |
| M | 最后回复日期 | 他们上次回复的时间 |
| N | 最后回复(预览) | 他们最后回复的前200个字符 |
| O | 对话日志 | 完整对话线程(见下方格式) |
| P | 下一步行动 | 下一步做什么(由代理或人工执行) |
状态值:
已发送 → 已回复 → 已安排通话 → 已完成演示 → 已发送跟进 → 无回复 → 已关闭(赢单) → 已关闭(输单)
对话日志格式(O列):
[2026-02-13 17:05 已发送] 嘿 Rishabh,我们都在CRED工作过...
[2026-02-13 17:05 已发送] 我正在构建一个AI呼叫代理...
[2026-02-15 09:30 已接收] 嘿!听起来很有趣,告诉我更多。
[2026-02-15 09:45 已发送] 很乐意向您展示一个实时演示——您周四有空吗?
如果M–P列尚不存在,请先添加它们:
gog sheets update <表格ID> "Sheet1!M1:P1" \
--values-json '[["最后回复日期","最后回复(预览)","对话日志","下一步行动"]]' \
--input USER_ENTERED
模式
模式 1 — 快速状态更新
用户说:“将Rishabh标记为已回复” 或 “Rishabh回复我了,他感兴趣”
- 找到行 — 在表格中搜索该人员:
gog sheets get <表格ID> "Sheet1!A:P" --json
按姓名(B列)或LinkedIn URL(E列)匹配。获取行号。
- 更新状态(J列)和最后更新时间(L列):
gog sheets update <表格ID> "Sheet1!J<行号>:L<行号>" \
--values-json '[["已回复","","<ISO_时间戳>"]]' \
--input USER_ENTERED
- 如果用户提供了回复内容,也更新:
- M列:最后回复日期
- N列:最后回复预览(前200个字符)
- O列:追加到对话日志
- P列:下一步行动(接下来应该发生什么)
- 向用户确认更新。
模式 2 — 完整跟进(读取 + 起草 + 发送)
用户说:“跟进Rishabh” 或 “向所有已回复的人发送跟进消息”
步骤 1 — 从表格加载人员数据
gog sheets get <表格ID> "Sheet1!A:P" --json
找到他们的行。加载:姓名、公司、职位、LinkedIn URL、已发送的开场白、已发送的推介、状态、备注、对话日志、下一步行动。
步骤 2 — 导航到他们的LinkedIn个人资料
始终先转到动态页面(反检测):
https://www.linkedin.com/feed/
等待2–4秒。然后导航到他们的个人资料URL(E列)。
步骤 3 — 打开消息线程并读取对话
点击他们个人资料上的消息按钮。等待对话气泡加载。
使用JavaScript抓取完整线程:
const events = Array.from(document.querySelectorAll('.msg-s-message-list__event'));
const messages = [];
events.forEach(el => {
const groups = el.querySelectorAll('.msg-s-event-listitem');
groups.forEach(g => {
const nameEl = g.closest('.msg-s-message-group')?.querySelector('.msg-s-message-group__profile-link');
const bodyEl = g.querySelector('.msg-s-event-listitem__body');
const timeEl = g.closest('.msg-s-message-group')?.querySelector('.msg-s-message-group__timestamp');
if (bodyEl?.textContent?.trim()) {
messages.push({
sender: nameEl?.textContent?.trim() || 'unknown',
time: timeEl?.textContent?.trim() || '',
text: bodyEl.textContent.trim()
});
}
});
});
return JSON.stringify(messages);
如果线程为空或未加载,请在对话气泡中向上滚动以加载更早的消息。
步骤 4 — 分析对话
加载完整线程 + 他们的个人资料数据后,确定:
- 他们最后说了什么? — 识别他们最近的消息。
- 意图是什么? — 感兴趣 / 想要更多信息 / 提问 / 冷淡 / 异议 / 不感兴趣。
- 正确的下一条消息是什么? — 参见下面的 回复策略手册。
- 语气 — 镜像他们的语气(随意 vs 正式,简短 vs 详细)。
步骤 5 — 起草跟进消息
撰写一个回复,该回复:
- 直接回应 他们最后说的话
- 除非他们要求,否则不再重复推介
- 推动一个具体的行动(演示、通话、介绍、转给团队)
- 简洁 — 最多2–4句话
- 感觉像人写的,而不是模板化的
将草稿展示给用户,并在发送前请求批准:
给 [姓名] 的回复草稿: [消息]
发送这个吗?(y / 编辑 / 跳过)
步骤 6 — 发送消息
与linkedin-dm相同的JS评估方法:
const active = document.querySelector('.msg-overlay-conversation-bubble--is-active .msg-form__contenteditable');
if (active) { active.focus(); document.execCommand('insertText', false, '<消息>'); }
然后找到并点击发送。
步骤 7 — 更新表格
发送后:
gog sheets update <表格ID> "Sheet1!J<行号>:P<行号>" \
--values-json '[["<新状态>","<最后回复日期>","<最后回复预览>","<更新后的对话日志>","<下一步行动>","<ISO_时间戳>"]]' \
--input USER_ENTERED
模式 3 — 批量审查
用户说:“谁需要跟进?” 或 “检查我的外联情况”
- 从表格加载所有行。
- 按状态和时间筛选:
已发送超过3天 → 候选标记为“无回复”或温和跟进已回复→ 需要回复已发送跟进超过5天 → 考虑标记为“无回复”已安排通话→ 检查通话是否发生,更新状态
- 呈现候选者表格:
姓名 状态 最后更新时间 建议行动
Rishabh Nayan 已回复 2026-02-14 回复他们的消息
Shorya Saini 已发送 2026-02-10 跟进提醒(4天)
Shantam Mohata 已发送 2026-02-13 太快(今天)
- 用户选择要处理的人,然后为每个人进入模式2。
回复策略手册
使用这些作为指南——始终根据实际对话进行调整:
| 他们说 | 意图 | 你的行动 |
|---|---|---|
| “听起来很有趣,告诉我更多” | 好奇 | 简短解释 + 提供一个具体的演示时间段 |
| “它是如何工作的?” | 探索 | 2行描述 + 邀请参加15分钟通话 |
| “我们已经在使用 [X]” | 异议 | 承认,解释差异化,提供演示 |
| “给我发更多细节” | 软兴趣 | 分享一个Loom/文档/链接 + 2天后跟进 |
| “目前不相关” | 软拒绝 | 尊重,留有余地:“没问题,我几个月后再联系您” |
| “还有谁在使用它?” | 建立信任 | 分享一个相关的用例,提供用户介绍 |
| [4天无回复] | 沉默 | 轻推:“嘿 [姓名],只是想确认一下——有什么想法吗?” |
| [8天无回复] | 冷淡 | 最后一条消息,然后标记为无回复 |
反检测规则
与linkedin-dm相同的规则:
- 在导航到个人资料之前,始终先转到
/feed/ - 加载动态页面后等待2–4秒
- 每个会话最多 15–20条消息(跟进中发送的总和)
- 间隔跟进:不要连续快速联系多个人
- 打字和发送之间有自然延迟(1–2秒)
gog 认证设置
如果 gog auth list 返回空,用户需要设置Google OAuth凭据:
- 转到 console.cloud.google.com
- 创建一个项目(或选择现有项目)
- 启用 Google Sheets API(API和服务 → 库)
- 创建OAuth凭据:API和服务 → 凭据 → 创建 → OAuth客户端ID → 桌面应用
- 下载
client_secret_<id>.json - 运行:
gog auth credentials set /path/to/client_secret.json
gog auth add your@gmail.com --services sheets
- 将打开一个浏览器窗口——登录并授予访问权限
- 验证:
gog auth list
备用方案(无gog): 所有表格读写都可以通过浏览器手动完成——在openclaw浏览器中打开表格并直接更新单元格。自动化程度较低但功能正常。
会话限制
- 每个会话最多15–20条跟进消息
- 立即将每次发送记录到表格(不要批量)
- 如果gog不可用,记录到本地
linkedin_followup_log.json并在下一个会话同步到表格