自分が作ったものを共有するのが好きだ。ブログ記事を書いて、それをさらに手動でLinkedInの投稿にコピー&ペーストする(キャプションを書き、リンクを貼り付け、シェアボタンを押す)のは、40回もやると苦にならなくなるまでは地味に面倒な作業だ。だから自動化した。
アイデアはシンプルだ。ここで記事を公開すると、数秒後にLinkedInのプロフィールに、元記事へのリンクプレビューカード付きの通常の更新として表示される。コピー&ペーストも、キャプションの再入力も、別アプリへのコンテキストスイッチも不要になる。
パイプラインの構成
私はホームラボの一部としてセルフホストの自動化サーバー(n8n)を運用しており、フローは短いステップの連なりだ。
- トリガー — このサイトで新しい記事が公開されるたびに発火する。
- 投稿の整形 — タイトル、URL、短い要約を受け取り、LinkedInのAPIが実際に求める形、つまり投稿テキストと、リッチリンクプレビュー用のフィールド(タイトル、説明、ソースURL)に整形する。
- アイデンティティの解決 — 投稿は特定の作成者URNに紐づける必要があるため、LinkedInに自分が誰か(自分のメンバーID)を問い合わせる。
- 公開 — ここへのリンクカードを含む記事形式の公開更新として、実際の投稿をLinkedInのAPIに送信する。
4つのステップで、特に変わったことはない。実際に時間がかかったのは設計の部分ではなく、LinkedInのAPIを言うことを聞かせる部分だった。
面倒だった部分
LinkedInはAPIを毎月バージョニングしており、各バージョンは廃止されるまで約1年間だけ有効であることが保証されている。それ自体は妥当なポリシーだ。問題は、最初に使った作り込み済みのLinkedIn連携が、外部からオーバーライドする方法もなく、バージョン番号をコード内に静かに埋め込んでいたことだった。そのバージョンが期限切れになっていたため、投稿リクエストは毎回「サポートされていないバージョン」というエラーで拒否され、ノード自体をいくら再設定しても何も変わらなかった。バグは自分の設定ではなく、上流にハードコードされていたからだ。
解決策は、作り込み済みのLinkedIn専用連携を完全に信頼するのをやめ、自分で設定したいバージョンを含む独自のヘッダーを設定して、LinkedInのREST APIに直接手作業で通信することだった。それでバージョンの問題は解決したが、2つ目の問題が表面化した。使っていたLinkedIn専用の認証情報タイプに、隠れたデフォルト値として同じ古いバージョンが埋め込まれており、明示的に設定していたヘッダーを静かに上書きしていたのだ。同じバグの2つの層が重なっていた。
本当の解決策は、LinkedIn専用のツール類を完全に回避し、LinkedIn固有の前提が一切埋め込まれていない、汎用のOAuth2認証情報を使って認証することだった。LinkedInの実際の認可エンドポイント、スコープ、トークン交換設定を手動で構成した。それが整った後は、何も静かに上書きされることはなくなり、パイプラインはエンドツーエンドで動き始めた。
過去の自分に伝えたいこと
よく知られたサービス専用に作られた連携ツールが「APIバージョンが間違っている」というような基本的な部分でつまずくとき、その洗練された作り込み済みツールは、目に見えない前提を隠していることが多い。最も速い解決策は、多くの場合もう一段階プリミティブなレベルに降りることだ。つまり、すべてのヘッダーとパラメータが目に見え、自分の制御下にある生のAPIに直接話しかけることだ。
もう半分は、役に立たないエラーメッセージの壁に対する粘り強さそのものだった。ここでのデバッグの大半は、素っ気ないOAuthエラー文字列を読み、仮説を立て、それをテストし、繰り返すことだった。地味だが、実際の連携作業の大部分はこういうものだ。
次のステップ
今のところキャプションは記事と一緒に手書きしている要約だ。次のイテレーションでは、パイプラインが記事本文を読み込んでLinkedInのキャプション自体を自動生成できるようにし、記事の公開が本当に最初から最後まで単一のアクションになるようにしたい。稼働したらまた書くつもりだ。