LinkedIn API 發文指南
從零開始用 LinkedIn API 自動發布貼文的完整實作指南
Why##
手動發文到 LinkedIn 不是什麼難事,但如果你在做這些事:
- 經營技術部落格,每篇文章都要同步到 LinkedIn
- 管理多個社群平台,需要統一發布流程
- 想透過 CLI 或 MCP Server 自動化發文
那麼直接呼叫 LinkedIn API 會是更有效率的方式。本文帶你從建立 App 到成功發出第一則貼文。
What##
OAuth 2.0 與 Scope###
LinkedIn API 使用 OAuth 2.0 進行身份驗證。你需要理解一個關鍵概念:Scope。
Scope 決定了 access token「能做什麼」。就像門禁卡的樓層權限 — token 是卡片,scope 是卡上的權限清單。
| Scope | 用途 |
|---|---|
openid | 讀取基本個人資料(取得 person URN) |
w_member_social | 發布貼文、分享內容 |
r_liteprofile | 讀取姓名、頭像等公開資訊 |
Important
Scope 在使用者授權時就決定了。如果後來需要新的 scope,必須重新走一次授權流程,無法修改現有 token。
UGC Posts API###
LinkedIn 的發文端點是 POST /v2/ugcPosts,支援三種媒體類型:
| 類型 | shareMediaCategory | 說明 |
|---|---|---|
| 純文字 | NONE | 只有文字內容 |
| 文章連結 | ARTICLE | 附帶 URL,LinkedIn 自動產生預覽卡片 |
| 圖片 | IMAGE | 需先上傳圖片取得 asset URN |
Person URN###
每則貼文都需要指定作者的 Person URN(格式:urn:li:person:<id>)。這是你在 LinkedIn 的唯一識別碼,透過 /v2/userinfo 或 /v2/me 取得。
How##
Step 1:建立 LinkedIn Developer App###
- 前往 LinkedIn Developer Portal
- 點擊 Create App
- 填寫 App 名稱、公司頁面(沒有的話需先建立)、Logo
- 建立完成後,進入 App 的 Auth 頁面
Step 2:設定 OAuth Scope###
在 App 的 Products 頁面,申請以下產品:
- Share on LinkedIn → 會自動加入
w_member_socialscope - Sign In with LinkedIn using OpenID Connect → 會加入
openidscope
Warning
部分產品需要審核,可能需要幾天時間。在等待期間可以先用 Auth 頁面的 token 工具做測試。
Step 3:取得 Access Token###
在 App 的 Auth 頁面,你會看到:
- Client ID — 你的 App 識別碼
- Client Secret — 密鑰(不可外洩)
- OAuth 2.0 Scopes — 已啟用的權限
完整的 OAuth 2.0 授權流程:
sequenceDiagram
participant App
participant LinkedIn
participant User
App->>LinkedIn: 1. Authorization Request with scope
LinkedIn->>User: 2. Show consent page
User->>LinkedIn: 3. Grant access
LinkedIn->>App: 4. Return authorization code
App->>LinkedIn: 5. Exchange code for token
LinkedIn->>App: 6. Return access token
授權 URL 格式:
https://www.linkedin.com/oauth/v2/authorization?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=YOUR_REDIRECT_URI&
scope=openid%20w_member_social
用 authorization code 換取 token:
curl -X POST https://www.linkedin.com/oauth/v2/accessToken \
-d "grant_type=authorization_code" \
-d "code=YOUR_AUTH_CODE" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "redirect_uri=YOUR_REDIRECT_URI"
回傳:
{
"access_token": "AQV...",
"expires_in": 5184000
}
Tip
expires_in 單位是秒。5184000 秒 = 60 天。記得在到期前重新取得 token。
Step 4:取得 Person URN###
curl -s -H "Authorization: Bearer YOUR_TOKEN" \
"https://api.linkedin.com/v2/userinfo" | jq '.sub'
回傳的 sub 就是你的 person identifier,完整 URN 格式為 urn:li:person:<sub>。
Note
如果收到 ACCESS_DENIED 錯誤,代表你的 token 缺少 openid scope。需要重新授權並加入該 scope。
Step 5:發布貼文###
純文字貼文:
curl -X POST https://api.linkedin.com/v2/ugcPosts \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Restli-Protocol-Version: 2.0.0" \
-d '{
"author": "urn:li:person:YOUR_PERSON_ID",
"lifecycleState": "PUBLISHED",
"specificContent": {
"com.linkedin.ugc.ShareContent": {
"shareCommentary": {
"text": "Hello from LinkedIn API!"
},
"shareMediaCategory": "NONE"
}
},
"visibility": {
"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"
}
}'
附連結貼文(自動產生預覽卡片):
curl -X POST https://api.linkedin.com/v2/ugcPosts \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Restli-Protocol-Version: 2.0.0" \
-d '{
"author": "urn:li:person:YOUR_PERSON_ID",
"lifecycleState": "PUBLISHED",
"specificContent": {
"com.linkedin.ugc.ShareContent": {
"shareCommentary": {
"text": "剛寫了一篇關於 LinkedIn API 的文章,分享給大家!"
},
"shareMediaCategory": "ARTICLE",
"media": [
{
"status": "READY",
"originalUrl": "https://docs.theownlab.com/docs/programming/backend/01-linkedin-api-posting-guide"
}
]
}
},
"visibility": {
"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"
}
}'
成功回傳 201 Created,response header 中的 x-restli-id 就是貼文 ID。
常見錯誤###
| 錯誤 | 原因 | 解法 |
|---|---|---|
403 ACCESS_DENIED | Token 缺少所需 scope | 重新授權,加入正確 scope |
401 Unauthorized | Token 過期或無效 | 重新取得 token(有效期 60 天) |
422 Validation Error | Request body 格式錯誤 | 檢查 author URN 和 JSON 結構 |
429 Too Many Requests | 超過 API rate limit | 降低請求頻率,加入 retry 邏輯 |
Summary##
- LinkedIn API 發文使用
POST /v2/ugcPosts端點 - OAuth 2.0 的 scope 決定 token 的權限範圍,在授權時就要設定好
- 必備 scope:
w_member_social(發文)+openid(取得 Person URN) - 每則貼文需要指定
author(Person URN)和visibility - Access token 有效期 60 天,到期需重新取得
留言 (0)
登入後即可留言