你将构建什么
部署在 Vercel 上的 Next.js API 路由,其功能为:- 接收来自 Bright Data 的 POST,包含已爬取 LinkedIn 个人资料的 JSON 数组
- 将每个个人资料映射到规范化的 CRM 形状的联系人记录
- 记录映射的记录,以便你可以在 Vercel 仪表板中检查它们
前置条件
- 一个 Bright Data 账户,带有 API 密钥(获取你的密钥)
- 一个免费的 Vercel 账户
- 本地安装的 Node.js 18+
- 已安装的 Vercel CLI:
npm install -g vercel
第 1 部分:搭建 Next.js 项目
在新终端中,创建一个最小的 Next.js 项目:第 2 部分:添加 webhook 路由
创建文件app/api/webhook/linkedin/route.ts:
app/api/webhook/linkedin/route.ts
position 通常为空,路由会改为打印 no title returned。Next.js App Router 将任何 route.ts 文件视为 API 端点,因此仅此文件就在部署后为你提供了一个工作的 POST /api/webhook/linkedin 路由。
第 3 部分:部署到 Vercel
从项目根目录:第 4 部分:触发爬取
打开第二个终端并触发 Bright Data LinkedIn 爬虫,将其指向你的 Vercel URL:YOUR_API_KEY 替换为你的 Bright Data API 密钥,将 linkedin-to-crm-<hash> 替换为你的实际 Vercel URL。
你应该立即看到如下响应:
示例输出。你的值会有所不同。
snapshot_id 执行任何操作。Bright Data 在作业完成时将结果 POST 到你的 Vercel 端点。对于两个个人资料,这通常需要 30 到 60 秒。
切换到 Vercel Logs 选项卡。一分钟内你应该会看到类似以下内容:
示例输出。你的值会有所不同。
第 5 部分:将个人资料映射到 CRM 形状
现在处理程序仅记录名称和职位。真正的 CRM 期望具有特定字段名称的联系人记录:full_name、job_title、company 等。让我们将 Bright Data 有效负载规范化为该形状。
将 app/api/webhook/linkedin/route.ts 替换为:
app/api/webhook/linkedin/route.ts
job_title 为 null:
示例输出。你的值会有所不同。
保护 webhook
现在,任何猜到你的 Vercel URL 的人都可以向其 POST 假个人资料数据。在你将实时数据管道进实际 CRM 之前,锁定端点。 Bright Data 的触发调用接受auth_header 查询参数,该参数被转发为 webhook POST 上的 Authorization 标头。本教程在 2026 年 9 月 7 日之前使用的 webhook_header_Authorization 名称会被 API 忽略:
WEBHOOK_SECRET 设置为环境变量,然后重新部署。
Bright Data 还发布了一个 webhook 源 IP 列表,你可以将其列入白名单。请参阅 webhook 参考中的 webhook 来自哪些 IP?。
故障排除
为什么 Vercel 日志中没有出现 webhook?
先确认爬取已完成。将第 4 部分中的snapshot_id 发送到 监控进度,等待 status 字段变为 ready。如果状态为 ready 而 Vercel 日志中没有 POST,请检查交付路径:
endpointURL: 必须是你部署的 Vercel URL 加上/api/webhook/linkedin,并以https://开头auth_header的值: 必须与路由检查的密钥一致。不一致时,路由会在记录任何内容之前返回 401- 响应时间: 路由必须在 30 秒内返回 HTTP 200,否则 Bright Data 会将本次交付视为失败并重试
- Vercel Deployment Protection: 根据 Vercel 的 Deployment Protection 文档,Standard Protection “protects all domains except production domains”。在受保护的 URL 上,Vercel 会要求 Vercel 登录,Bright Data 的 POST 永远不会到达路由。请在 Vercel 项目中检查 Settings > Deployment Protection
为什么职位和工作经历为空?
职位为空是预期行为。自 2025 年 11 月 13 日起,LinkedIn 限制了对 Position、Experience 和 Education 字段的公开访问,这些字段的填充率降至约 2%。此时路由会打印no title returned,映射函数会将 job_title 设为 null。完整的字段状态表参见 LinkedIn 数据政策变更。
为什么我的路由返回 401?
Bright Data 发送的Authorization 标头与 Bearer ${process.env.WEBHOOK_SECRET} 不匹配。请检查以下三点:
- 触发 URL 中
auth_header的值是Bearer+加上你在 Vercel 中设置为WEBHOOK_SECRET的同一密钥。+是 URL 编码的空格 - 触发 URL 使用的是
auth_header。API 会忽略旧的webhook_header_Authorization名称,并且不发送Authorization标头 - 你在 Vercel 项目设置中设置
WEBHOOK_SECRET后已重新部署
恭喜
你已构建了一个端到端的管道,该管道爬取 LinkedIn 个人资料并向你自己的服务器提供 CRM 就绪的联系人记录:- 部署在 Vercel 上的 Next.js API 路由,接收 Bright Data webhook
- 一个映射器函数,将 Bright Data 的个人资料架构规范化为 CRM 形状的联系人
- 一个触发调用,以异步方式触发爬取并告诉 Bright Data 将结果发送到何处
route.ts 中注释掉的块概述了这一点。
后续步骤
异步批量请求
在单个批处理作业中爬取数百个 URL。
Amazon S3 交付
当有效负载超过 Vercel 的 4.5 MB 正文限制时,用 S3 存储桶交换 webhook。
Webhook 参考
完整的参数列表、身份验证标头和 IP 白名单。
HubSpot Contacts API
处理程序中注释 POST 的直接替换。