Come on!使用 Threads API 來自動發文吧

Chun-Li 春麗
10 min readJul 16, 2024

--

目錄

⦿ Threads
⦿ Meta Developer
⦿ 圖形 API 測試工具
⦿ Threads_User_Id
⦿ client_secret
⦿ Long Lived Token
⦿ Container
⦿ 第一步,創建 Container
⦿ 第二步,發佈 Container
⦿ 帶有圖片的文章
⦿ 發佈回覆

Threads
Threads 是 Meta 旗下的一個社群平台,是用來與 Elon Musk 的 X(前身 Twitter)抗衡,從 Instagram 無性生殖分出來的用作 Notes 的現代自媒體工具,念法跟寫程式時用到的線程(Thread)、IoT 產業的 Thread 協議都是同一個字,只是加上 s

Meta 自今年六月釋出 Threads 的 API 後,我們已經可以透過 API 做到一些交互了,這讓自動發文成了可能,下面就是一張透過 API 發文的結果,以及回文的範例。

不多說,下面簡單說明一下如何使用 Threads API 吧!

繼續閱讀|回目錄

Meta Developer

首先,進到 Meta 的開發者網站,早先在 iOS 上測試第三方(Facebook)登入功能時,也寫了一篇文章,參考如下:

所以,第一步是在開發者網站上加入一個新的 APP(應用程式),為了使用 Threads API 而開了一個新的專案

點到我的應用程式 => 建立應用程式 => 不與商家連結後下一步 => 存取 Threads API => 幫APP 取名 => 建立應用程式

接著,點進應用程式的主控版,存取 Threads API。

裡面已經有了基本權限,你可以再打開需要用到的其他權限。

我們點到測試使用案例,開一個新的視窗,開啟圖形 API 測試工具

然後,在應用程式角色的地方新增用戶

加入 Threads 測試人員,如果你登入的 Meta 開發者帳號與 Threads 帳號是一樣的,輸入帳號名即可找到。

此時 Threads 測試人員右側就會變成待確認

點進去網站權限(用瀏覽器操作,非 APP),到邀請的地方選擇接受

好了,初步作業完成!

繼續閱讀|回目錄

圖形 API 測試工具

到了圖形 API 測試工具,先把你的 API 選到 https://graph.threads.net/v1.0,http method 選到 GET。

接著產生 Threads 的 Access Token,這個 Token 要記起來。

Threads_User_Id

在圖型化測試工具下按 submit(提交),這時的 response 為你 THREADS_USER_ID,即是剛才做為 Threads 測試用戶帳號的 ID,將這個號碼記起來。

client_secret

再來,我們到應用程式設定中的基本資料,找到應用程式密鑰

同樣地,將這個密鑰記起來。

Long Lived Token

因為剛才的 Token 不是長時間的 Token,我們不希望做 API 測試時 Token 馬上就無效而需要重新產生,所以這邊必須先取得長時間的 Token。

curl -i -X GET "https://graph.threads.net/access_token?grant_type=th_exchange_token&client_secret=<THREADS_APP_SECRET>&access_token=<SHORT_LIVED_ACCESS_TOKEN>"

這裡的 client_secretaccess_token 我們都有了,所以你要代入自己剛拿到的,那麼,在 Postman 中這樣設定,endpoint url 是 https://graph.threads.net/access_token

會拿到如下資訊,這個 Long Lived Token 一樣要記起來!

{
"access_token": "Long Lived Token",
"token_type": "bearer",
"expires_in": 5184000
}

好了,到這邊為止,所有前置作業完成,下面就真正是 API 的交互了。

繼續閱讀|回目錄

Container

在 Single Threads Post 中,會有兩個步驟,第一個要用 POST /{threads-user-id}/threads 這個 endpoint,第二個要用 POST /{threads-user-id}/threads_publish這個 endpoint。

你必須創建一個 Container,塞入你的媒體訊息,再發佈這個 Container。

第一步,創建 Container

首先,在https://graph.threads.net/v1.0/Threads_User_Id/threads 這個 endpoint 需放入前面透過 API 取得的 User ID。

接著是媒體訊息類型、媒體訊息,以及 Long Lived Token,Postman 如下:

在 http 交互中,由於是 Post,所以我們把參數放到 Body 去,讓 Postman 看起來更整潔,又或者使用 Terminal 的 curl:

curl -i -X POST \
"https://graph.threads.net/v1.0/Threads_User_Id/threads" \
-F "media_type=TEXT" \
-F "text=Hello World." \
-F "access_token=Long Lived Token"

這時 Response 取得的 id 即是 Container ID

第二步,發佈 Container

接著,在 https://graph.threads.net/v1.0/Threads_User_Id/threads_publish 這個 endpoint,同樣需放入 User ID。

而 creation_id 則是前一個 API 返回的 Container ID,在 Terminal 的 curl 設置如下:

curl -i -X POST \
"https://graph.threads.net/v1.0/Threads_User_Id/threads_publish" \
-F "creation_id=Container_ID" \
-F "access_token=Long Lived Token"

最後,返回的 id 則是此篇文章Post的 ID

這時你就會看到你的文章出現在 Threads 公開頁面中了。

帶有圖片的文章

接著,我們來試試帶有圖片的文章吧,回到第一個步驟,創建 Container,在 Postman 中如下:

或是用 curl:

curl -i -X POST \
"https://graph.threads.net/v1.0/Threads_User_Id/threads" \
-F "media_type=IMAGE" \
-F "image_url=http://where.image.is" \
-F "text=Hello World." \
-F "access_token=Long Lived Token"

image_url 要放圖片的 url,至於哪些 url 合法,哪些不合法就再自行測試囉,同樣地,第一個步驟的 Container ID 記起來,帶到第二個步驟去,然後就可以去你的 Threads 收穫結果了。

繼續閱讀|回目錄

發佈回覆

在回覆的地方,官方文件就講得很清楚,先看如何使用 curl:

curl -X POST \
-F "media_type=<MEDIA_TYPE>" \
-F "text=<TEXT>" \
-F "reply_to_id=<THREADS_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.threads.net/v1.0/me/threads"

由於回覆也會考慮 Media Type,所以第一個步驟也類同創建 Container,Response 為 creation_id,接著再發佈這個 Container。

創建 Container 的地方在 Postman 裡:

由於只是要用 TEXT 回覆,這裡的 media_type 就是 TEXT,text 裡則擺放你要擺放的內容,reply_to_id 則是欲回覆的文章 ID。

Response 的 ID 拿到後,再回到前面發佈 Container 那一步。

在 curl 裡:

curl -i -X POST \ 
"https://graph.threads.net/v1.0/<THREADS_USER_ID>/threads_publish?creation_id=<MEDIA_CONTAINER_ID>&access_token=<ACCESS_TOKEN>"

在 Postman 裡:

接著就可以到文章看看成果了。

好了!完成了!

這次就分享到這,感謝您的閱讀。

繼續閱讀|回目錄

Reference:

--

--

Chun-Li 春麗

Do not go gentle into that good night, Old age should burn and rave at close of day; Rage, rage, against the dying of the light.