The Own Lab The Own Lab

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###

  1. 前往 LinkedIn Developer Portal
  2. 點擊 Create App
  3. 填寫 App 名稱、公司頁面(沒有的話需先建立)、Logo
  4. 建立完成後,進入 App 的 Auth 頁面

Step 2:設定 OAuth Scope###

在 App 的 Products 頁面,申請以下產品:

  • Share on LinkedIn → 會自動加入 w_member_social scope
  • Sign In with LinkedIn using OpenID Connect → 會加入 openid scope

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_DENIEDToken 缺少所需 scope重新授權,加入正確 scope
401 UnauthorizedToken 過期或無效重新取得 token(有效期 60 天)
422 Validation ErrorRequest 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)

登入後即可留言