搜尋此網誌

2022年9月23日 星期五

Facebook API 上傳、取得 Album 圖片、PO 文同時附加多張照片

緣起:


    Json 搞定了,可以解析 Facebook API 回傳的 json 字串,取出裡面的 access_token,再來就是處理圖片。在這之前,先補上自己寫的 C# 程式 github 連結,程式的功能是利用長期權杖來取得粉絲專頁的權杖。

連結



Facebook 相簿:


    老實說,Facebook 很多的功能我都沒什麼在用,之前都只會用它看首頁的推薦文章,對於其它的功能都不太了解,一直到現在需要研究 Facebook 的 Api 才開始看看 Facebook 有什麼功能。總之,我上次成功用 C# 在粉絲專頁 po 文,我那時有注意到它可以附個圖片的 id 來 po 圖片,看到這東西我就大概知道,我要先對 Facebook API 傳送照片,然後再拿到那個上傳照片的 id。

    根據我的觀察,傳上去的圖片都會存到相簿裡,我在看 Facebook API 的圖片存取方法,它用到的方法都是跟 album 有關,所以我就確定了,我必需使用 album 來處理圖片。

    存取 album 會需要 id,這邊先在粉絲專頁弄個相簿,並隨便傳個圖片上去,讓它有東西能被看。


    只要點進相簿,你就能從網址得到相簿的 id,a. 後面的數字就是 id



得到相簿的所有圖片:


    官方的教學文件在這,Http 請求的格式如下


    album-id 就是取代成你相簿 還要再加一個 access_token 的參數,根據我的測試,那個 access_token 可以放長期權杖或粉絲專頁權杖,我用 POST Man 測試

傳送

接收

    我們就能拿到紀錄圖片 id 的陣列 (包在 data 裡)。


上傳圖片到特定相簿:


    這東西我本來以為很快就會用好的,沒想到破問題一堆,搞到我快ㄎ一 ㄒㄧㄠˋ,我覺得這部份的 API 寫得不是很清楚,害我撞了一堆牆 = =。首先是上傳相簿,我看的教學文章在這,各位看一下這段


    首先,如果你想在你的粉專上傳圖片,記得要給你的 App "page_messaging" 的權限,    


    新增完之後記得要在存取權杖那邊,選好你的 App 跟你的粉絲社團,點選 Generate Token,讓他跳出認證視窗,讓它更新你粉絲社團裡 App 的權限。


    我們要請求的目標就 https://graph.facebook.com/相簿id/photos,用 POST,然後要有 access_token 的參數, 而且那個權杖必須是粉絲專頁的權杖,不能是長期或短期的使用者權杖。我看了看那個 endpoint 能傳遞的參數,沒有一個是 file 類別的,唯一一個看起來有可能是讓我們放圖片的是這個參數。


    我就試著先把圖片給上傳到 imgur,取得網址後,用 POST Man 把資料傳到 Facebook API


    然後就出現錯誤....


    不管怎麼 try 都是錯誤,我把 Body 類型改成 form-data,把 url 改成 file 類型並選取檔案後上傳,還是錯


    我後來注意到官方文件對於 url 這個參數的描述 "The URL of a photo that is already uploaded to the Internet. You must specify this or a file attachment",所以,不用 url 的話,我還能選擇 "file attachment" 這東西嗎 ? 我就用 file attachment 為關鍵字去查 Facebook API,看到這篇。我有稍微試試這個做法,可是它也不是我想要的,但我後來注意到這個


    我就試著把 POST 圖片的參數名改成 attachment,然後傳送


    bingo !!! 這樣就對了,成功後他回傳圖片的 id 與 po 文的 id。


    接著去粉絲專頁看,我指定的相簿果真多了一張圖片跟貼文,可以注意到圖片的 id 就對應到上面那個 json 回應的 id:109188168619668



上傳圖片到粉絲專頁:


    剛剛用來上傳圖片到粉絲專頁的 end point 也可以改成這樣

https://graph.facebook.com/{page_id}/photos


    放的是粉絲專頁的 page id,一樣用 POST Man 傳一張圖片上去


成功

    一樣能看到 po 文,只不過那個圖片就會被分類在所有圖片那邊了



PO 文同時附加多張圖片:


    我打關鍵字搜尋,找到這篇對我有幫助的文章,我注意到這個


    看來關鍵是那個 attached_media,而且是一個 json 陣列,我就依我的直覺來做一個請求,面向的 end point 是之前有提到過的 po 文 end point

https://graph.facebook.com/{page-id}/feed


    POST Man 的請求長這樣


    那些 media_fbid 欄位的值是圖片 id,我是點進相簿的圖片,從網址拿的

圈起來部分

    送出請求後,我接收到錯誤訊息


    重點是那個 error_user_msg "These photos were already posted",嗯... 所以已經 po 過的圖片是不能再使用的,這讓我想到,在上傳圖片的 API 介紹那邊,好像有個參數叫 published。


    哦~~~ 所以我在上傳圖片時,要順便給它 published 這個參數,而且值要是 false,再把回應的 json id 欄位給記住,所以我們傳送圖片的 POST Man 要改成這樣


    我依序傳了兩張圖片上去,並把傳回來的 json id 欄位都記錄下來,再來再 PO 一次文,這次 media_fbid 裡的 id 對應到的是我們剛剛紀錄下來的 id,這些圖片都還沒 publish


    傳送後沒有收到錯誤,他回傳了 po 文的 id 跟一個... 叫 post_supports_client_mutation_id 的欄位,這東西我不知道是啥


    但我們終於成功在 Facebook 的粉絲專頁 po 文與附加多張圖片了 ~~~~~



沒有留言:

張貼留言