Skip to main content
你想要自动丰富入站线索。一份注册表单给你一个 LinkedIn 网址,一分钟后一条包含公司、位置和粉丝数(以及 LinkedIn 仍公开时的职位)的联系人记录就会进入你的 CRM。无需手动复制粘贴,无需 Zapier 风格的胶水代码。 在本教程中,我们将端到端地构建该管道。你将部署一个微型 Next.js webhook 处理程序到 Vercel,对一些个人资料网址触发 Bright Data LinkedIn 爬虫 API,并在一分钟内观看映射的联系人记录出现在你的 Vercel 日志中。 我们在映射对象处停止。将其发送到特定 CRM 是我们将在最后概述的单行 fetch 调用。

你将构建什么

部署在 Vercel 上的 Next.js API 路由,其功能为:
  1. 接收来自 Bright Data 的 POST,包含已爬取 LinkedIn 个人资料的 JSON 数组
  2. 将每个个人资料映射到规范化的 CRM 形状的联系人记录
  3. 记录映射的记录,以便你可以在 Vercel 仪表板中检查它们
然后你将从终端触发一次爬取,指向你部署的 Vercel URL,并看到两个个人资料被映射和记录,端到端。 预计时间: 25 分钟。

前置条件

第 1 部分:搭建 Next.js 项目

在新终端中,创建一个最小的 Next.js 项目:
接受所有默认值。你将获得一个工作的 Next.js 14+ 项目,带有 App Router。然后进入它:

第 2 部分:添加 webhook 路由

创建文件 app/api/webhook/linkedin/route.ts:
app/api/webhook/linkedin/route.ts
这就是整个接收器。自 2025 年 11 月 13 日起,LinkedIn 限制了职位字段,因此 position 通常为空,路由会改为打印 no title returned。Next.js App Router 将任何 route.ts 文件视为 API 端点,因此仅此文件就在部署后为你提供了一个工作的 POST /api/webhook/linkedin 路由。

第 3 部分:部署到 Vercel

从项目根目录:
第一次运行会引导你完成登录和项目创建。接受默认值。一分钟后,你应该看到以以下内容结尾的输出: 示例输出。你的值会有所不同。
复制该 URL。你的 webhook 端点是:
在 Vercel 仪表板 中打开你的项目,并保持 Logs 选项卡可见。当 Bright Data POST 到端点时,你的 console.log 输出将出现在那里。

第 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 选项卡。一分钟内你应该会看到类似以下内容: 示例输出。你的值会有所不同。
注意,两个个人资料在单个 POST 中到达。Bright Data 在一个请求中传递整个快照,而不是一次一个个人资料。

第 5 部分:将个人资料映射到 CRM 形状

现在处理程序仅记录名称和职位。真正的 CRM 期望具有特定字段名称的联系人记录:full_name、job_title、company 等。让我们将 Bright Data 有效负载规范化为该形状。 将 app/api/webhook/linkedin/route.ts 替换为:
app/api/webhook/linkedin/route.ts
重新部署:
重新运行第 4 部分中的相同 curl 命令。这次你的 Vercel 日志应该显示两个映射联系人。由于 LinkedIn 限制了职位字段,job_title 为 null: 示例输出。你的值会有所不同。
该日志中的每个对象都是完整的 CRM 就绪联系人。将其发送到你的 CRM 是单个 fetch 调用。处理程序中注释掉的块概述了 HubSpot 版本。交换 Salesforce、Pipedrive 或你使用的任何工具的 URL 和标头。

保护 webhook

现在,任何猜到你的 Vercel URL 的人都可以向其 POST 假个人资料数据。在你将实时数据管道进实际 CRM 之前,锁定端点。 Bright Data 的触发调用接受 auth_header 查询参数,该参数被转发为 webhook POST 上的 Authorization 标头。本教程在 2026 年 9 月 7 日之前使用的 webhook_header_Authorization 名称会被 API 忽略:
然后在处理程序中验证该标头,然后再处理:
在你的 Vercel 项目设置中将 WEBHOOK_SECRET 设置为环境变量,然后重新部署。
Bright Data 还发布了一个 webhook 源 IP 列表,你可以将其列入白名单。请参阅 webhook 参考中的 webhook 来自哪些 IP?。

故障排除

为什么 Vercel 日志中没有出现 webhook?

先确认爬取已完成。将第 4 部分中的 snapshot_id 发送到 监控进度,等待 status 字段变为 ready。如果状态为 ready 而 Vercel 日志中没有 POST,请检查交付路径:
  • endpoint URL: 必须是你部署的 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 后已重新部署
所有 Scraper API 错误消息参见 Scraper API 错误代码。webhook 负载大小、响应期限和作业限制参见 Scraper API 限制。

恭喜

你已构建了一个端到端的管道,该管道爬取 LinkedIn 个人资料并向你自己的服务器提供 CRM 就绪的联系人记录:
  • 部署在 Vercel 上的 Next.js API 路由,接收 Bright Data webhook
  • 一个映射器函数,将 Bright Data 的个人资料架构规范化为 CRM 形状的联系人
  • 一个触发调用,以异步方式触发爬取并告诉 Bright Data 将结果发送到何处
最后一跳,将每个映射的联系人 POST 到 HubSpot、Salesforce 或你自己的 CRM,是单个 fetch 调用,route.ts 中注释掉的块概述了这一点。

后续步骤

异步批量请求

在单个批处理作业中爬取数百个 URL。

Amazon S3 交付

当有效负载超过 Vercel 的 4.5 MB 正文限制时,用 S3 存储桶交换 webhook。

Webhook 参考

完整的参数列表、身份验证标头和 IP 白名单。

HubSpot Contacts API

处理程序中注释 POST 的直接替换。