名称: linkedin-connect 描述: 通过浏览器自动化向列表中的人员发送LinkedIn好友请求,并在CSV/TSV文件中跟踪状态。当用户希望通过电子表格或包含LinkedIn个人资料URL的列表批量连接LinkedIn上的人员(创始人、演讲者、潜在客户等)时使用。处理连接按钮、关注模式个人资料、已连接检测、通过LinkedIn搜索和谷歌搜索处理失效URL回退,以及增量状态跟踪。
LinkedIn Connect
自动从列表中发送LinkedIn好友请求,并在数据文件中跟踪结果。
⚠️ 飞行前检查清单 — 开始前确认
在进行任何操作之前,请与用户确认以下所有事项。在每项都确认之前不要继续。
1. 数据文件
请用户提供其电子表格/CSV/TSV文件,并确认文件具有(或可以具有)以下列:
- 人员/创始人姓名 — 要连接的人员的全名
- 公司/品牌名称 — 其公司或品牌(用于搜索回退)
- LinkedIn个人资料URL — 可选但强烈推荐;减少自动化足迹
如果文件缺少任何列,请告知用户缺少哪些列并提供添加选项。
2. 浏览器设置
询问他们使用哪种浏览器设置:
选项A — Chrome浏览器中继(推荐用于被标记为自动化的账户)
- 用户必须已安装OpenClaw浏览器中继Chrome扩展程序
- 用户在常规Chrome浏览器中打开LinkedIn,并在该标签页上点击OpenClaw中继工具栏图标(徽章变为ON)
- 在此模式下,所有浏览器工具调用使用
profile="chrome"
选项B — OpenClaw隔离浏览器(openclaw 配置文件)
- OpenClaw管理一个单独的Chrome实例
- 首次使用时,导航到
https://www.linkedin.com并让用户登录;Cookie在会话间持久化 - 在此模式下,所有浏览器工具调用使用
profile="openclaw"
确认他们设置了哪个选项。如果用户的账户因自动化被标记或警告,默认使用选项A(Chrome中继)。
3. 就绪检查
仅在用户确认以下事项后继续:
- ✅ 文件已准备就绪并可访问
- ✅ 浏览器已打开并登录LinkedIn(如果选择选项A,则中继已附加)
浏览器配置文件
根据用户在飞行前检查清单中的选择设置 profile 变量:
- 选项A:
profile="chrome"— 重用附加中继的标签页;通过browser action=tabs获取targetId - 选项B:
profile="openclaw"— OpenClaw管理的隔离Chrome实例
不要在运行过程中混合配置文件。选择一个并在每个浏览器工具调用中一致使用。
数据文件设置
确保跟踪文件有一个 Connection Status 列。如果缺失,请添加:
import csv
rows = []
with open('file.tsv', 'r') as f:
reader = csv.DictReader(f, delimiter='\t')
fieldnames = reader.fieldnames + ['Connection Status']
rows = list(reader)
with open('file.tsv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames, delimiter='\t')
writer.writeheader()
for row in rows:
row['Connection Status'] = ''
writer.writerow(row)
三层个人资料发现(优先级顺序)
始终按此顺序尝试。仅当当前层级失败时才移至下一层级。
层级1 — 直接LinkedIn URL(最快,零歧义)
直接从数据文件导航到LinkedIn个人资料URL。
- ✅ URL加载 → 正确的个人资料,继续连接
- ❌ 返回404 → 升级到层级2
- 如果数据文件中此人员没有URL,则跳过层级1
层级2 — 谷歌搜索(可靠的备用方案,保持准确性)
在谷歌搜索 "创始人姓名" "品牌/公司" linkedin。
- 导航到:
https://www.google.com/search?q=<姓名>+<公司>+linkedin - 在结果中找到LinkedIn个人资料链接(通常是第一个结果),点击它
- 进入个人资料后,继续连接步骤
- ⚠️ 仅当谷歌找不到正确人员或未返回LinkedIn结果时,才升级到层级3
层级3 — LinkedIn人员搜索(最后手段)
直接在LinkedIn内运行针对创始人+品牌的LinkedIn人员搜索。
- 导航到:
https://www.linkedin.com/search/results/people/?keywords=<姓名>+<公司> - 首先查找内联的
Connect按钮;否则从搜索结果中打开个人资料 - 连接前确认姓名+标题/公司匹配
- ❌ 没有可信匹配 → 标记
Profile Not Found
有关每个层级的详细浏览器步骤,请参阅 references/browser-workflow.md。
在个人资料上连接
一旦进入正确的个人资料,存在两种模式:
模式A - 直接连接按钮 在个人资料上可见 → 点击它 → 确认对话框 → Send without a note
模式B - 关注模式(没有连接按钮,只有关注+消息+更多) → 点击 More actions → 使用选择器 .artdeco-dropdown__content--is-open 获取下拉菜单 → 点击 Invite [姓名] to connect → 确认对话框 → Send without a note
如果既没有连接也没有邀请可用 → 标记 Follow Only。
状态值
| 状态 | 含义 |
|---|---|
Request Sent |
本次会话已发送好友请求 |
Already Connected |
一度好友 - 无需操作 |
Pending |
之前已发送请求 |
Follow Only |
此个人资料上无连接选项可用 |
Profile Not Found |
所有三个层级均失败 |
Skipped |
有意跳过 |
多创始人行
当TSV行中有多个创始人时,按创始人跟踪状态,用 | 分隔:
创始人1标识: Request Sent | 创始人2标识: Already Connected
速率限制与反检测
⚠️ LinkedIn会标记直接在个人资料URL之间跳转的账户。在个人资料之间始终访问feed页面 — 没有例外。
- 在每个个人资料之前导航到
/feed/,没有例外。有关确切调用,请参阅references/browser-workflow.md。这是主要的反检测措施。 - 加载feed后,在导航到下一个个人资料之前添加一个短暂的自然暂停(2–4秒)。
- 如果>3个连续的有效URL返回404,在继续之前暂停10秒(然后回退到谷歌/LinkedIn搜索)。
- 不要打开新的浏览器标签页 — 中继会中断;对每个操作重用相同的附加标签页。
- 每个会话的目标不超过20–25个好友请求。如果接近此限制,请停止并告知用户。
保存进度
使用 linkedin_progress.json 辅助文件:
{ "statuses": { "https://www.linkedin.com/in/username/": "Request Sent" } }
每10个个人资料或在结束时从此字典更新TSV。
参考资料
references/browser-workflow.md- 所有三个层级和两种连接模式的详细浏览器步骤