我喜欢分享自己做的东西。写一篇博客文章,然后还要手动把它复制粘贴成一条LinkedIn动态(写文案、粘贴链接、点击分享),这种小而重复的琐事,做个四十次之后就会觉得烦。所以我把它自动化了。
思路很简单:在这里发布一篇文章,几秒钟后它就会以一条普通动态的形式出现在我的LinkedIn主页上,并带有指回完整文章的链接预览卡片。不用复制粘贴,不用重新打文案,也不用切换到另一个应用。
整个流程的样子
我在homelab里运行着一台自托管的自动化服务器(n8n),整个流程是一串简短的步骤:
- 触发 — 每当本站有新文章发布时触发。
- 格式化文章 — 提取标题、URL和简短摘要,把它们整理成LinkedIn API真正需要的格式:动态正文,加上用于富链接预览的字段(标题、描述、来源URL)。
- 解析身份 — 向LinkedIn查询我是谁(我的会员ID),因为每条动态都必须归属到一个特定的作者URN。
- 发布 — 将实际动态发送到LinkedIn的API,以一条带有文章式链接卡片、指回本站的公开动态形式发出。
四个步骤,没什么特别的。真正费时间的不是设计部分,而是让LinkedIn的API配合工作。
麻烦出在哪
LinkedIn的API是按月发版的,每个版本只保证大约一年后就会退役。这本身是个合理的策略。问题在于,我一开始用的那个预制的LinkedIn集成组件,把版本号悄悄硬编码在代码里,没有任何从外部覆盖它的方式。由于那个版本已经过期,每一次发布请求都会被以"不支持的版本"错误拒绝,不管怎么重新配置那个节点本身都没有用,因为bug根本不在我的配置里,而是在上游被写死了。
解决办法是彻底不再信任那个预制的LinkedIn专用集成,改成手动直接对接LinkedIn的REST API,自己设置请求头,包括我真正想用的版本号。这解决了版本问题,但又暴露出第二个问题:我用的那个LinkedIn专用凭证类型里,同样藏着一个过时版本号作为隐藏默认值,悄悄覆盖了我明确设置的请求头。同一个bug叠了两层。
真正的修复方法是彻底绕开LinkedIn专用的工具,改用一个不带任何LinkedIn专属假设的普通通用OAuth2凭证进行身份验证,手动配置LinkedIn真实的授权端点、权限范围和令牌交换设置。一旦配置好,就再也没有东西被悄悄覆盖了,整个流程从头到尾都跑通了。
我想对过去的自己说
当一个专门为某个知名服务打造的集成组件,连"API版本不对"这种基础问题都会栽跟头时,那个打磨精致的预制工具通常在隐藏一些你看不见的假设。最快的解决办法往往是往底层再走一步:自己直接对接原始API,让每一个请求头和参数都清晰可见、完全在你的掌控之中。
另一半的功夫就是纯粹地跟一堆没什么帮助的错误信息死磕到底。这里大部分的调试工作就是读懂简短生硬的OAuth错误字符串,提出一个假设,测试它,然后重复。不光鲜,但这才是真实集成工作的大部分样子。
接下来
目前文案是我在发文章的同时手写的摘要。下一步迭代是让流程自己读取文章全文,自动生成LinkedIn文案,这样发布一篇文章就真正做到从头到尾只需一个动作。等它跑起来之后我会再写一篇讲讲。