iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

用Line聊天機器人串起多媒體系統系列 第 26 篇

Day 26 : 用 Python 上傳圖片至 Imgur 圖床

  • 分享至 

  • xImage
  •  

  • 由於 Heroku 給我們這種蹭飯的免費仔 500 mb的免費空間,說真的如果儲存圖片/影音服務太奢侈了,這時運用第三方圖床就很方便,Imgur API 免費用於非商業用途。如果您不打算用它賺錢,或者它是開源的,則您的應用程序可能是免費的。
  • 當使用者傳圖片到聊天機器人時,如果我們能把圖片傳到免空圖床,可大量減少伺服器的儲存空間,加上 LINE 本身可以顯示連結圖片內容,創造能提供許多服務的可能性。知名的台灣之光 HackMD 具有貼上圖片就回傳圖床網址+即時預覽的功能,圖床就是 Imgur ,也是幫助鐵人賽邊寫文章的好幫手,本篇就動手試試。
  • 一樣貼心的 Colab 範例支援

1. 申請 Imgur API

建立帳戶取得所需Client ID及Client secret

  1. 建立 imgur 帳戶,就是一般申請帳號的節奏。

  2. 前往API文件閱讀官方資訊是開發者的好習慣!如果英文啃不下去善用翻譯。

  3. 在 API 文件裡找到Register your application的連結,大膽點下去準備申請 Client ID 及 Client secret 。

  4. 申請 API,本次採用 OAuth2驗證,完成後會取得專屬的 Client ID 及 Client secret。

  5. 日後至 https://imgur.com/account/settings/apps 取用,但 Client Secret 如果沒記起來的話,按下 generate new secret 將重新產生 Client secret。

2. 使用官方模組 ImgurPython 連線上傳圖片

  1. 在官方API文件有Official Python library的連結,連至 GitHub 可見到包含說明、範例介紹及開源的程式碼。

    官方已表示此 Python 模組 imgurpython 不再維護。不過實測仍可使用,後續也會再介紹另外模組。

  2. 測試是否可以順利連線,第一組範例只要只要複製程式碼、換上 Client ID 及 Client secret 即可完成,輸出為近期上傳至 Imgur 圖床的超連結。

    from imgurpython import ImgurClient
    
    client_id = 'YOUR CLIENT ID'
    client_secret = 'YOUR CLIENT SECRET'
    
    client = ImgurClient(client_id, client_secret)
    
    # Example request
    items = client.gallery()
    for item in items:
        print(item.link)
    

  3. 取得 [Access token] 以減少輸入 pin 碼進行程式操作,imgurpython 有介紹如何取得,過程全放在文章開頭的 Colab 範例支援 您可以自行測試。

  4. 上傳圖片測試,這段需要建立一個相簿並取得相簿代碼,請至官網操作:

    • 我們先在網路上任意下載一張圖片,假設就是這張https://i.imgur.com/qs1mqDf.png 。

    • 以wget指令並指定檔案名稱,筆記本環境在指令前增加 ! 魔術指令,您的指令為!wget -O <檔案名稱> <下載連結>,範例如下:

      !wget -O test.jpg https://i.imgur.com/qs1mqDf.png
      
    • 接著至 Imgur 網站的您右上方名子下拉選 "imges"。

    • 選擇相簿或新建相簿:

    • 在 Edit this album 下拉選單選擇 "Embed Album":

    • 看到一串 Embed Code ,其中相簿ID藏在 data-id = "a/<相簿id>" 裡,把ID複製下來。

    • 以此程式碼上傳圖片,程式修改自官方的 Example:
      #上傳圖片,修改自官方Example
      from imgurpython import ImgurClient
      from datetime import datetime
      
      
      def upload(client_data, album , name = 'test-name!' ,title = 'test-title' ):
          config = {
              'album':  album,
              'name': name,
              'title': title,
              'description': f'test-{datetime.now()}'
          }
      
          print("Uploading image... ")
          image = client_data.upload_from_path('test.jpg', config=config, anon=False)
          print("Done")
      
          return image
      
      
      if __name__ == "__main__":
          client_id ='YOUR CLIENT ID'
          client_secret = 'YOUR CLIENT SECRET'
          access_token = "YOUR ACCESS TOKEN"
          refresh_token = "YOUR REFRESH TOKEN"
          album = "YOUR ALBUM ID"
          local_img_file = "test.jpg"
      
          client = ImgurClient(client_id, client_secret, access_token, refresh_token)
          image = upload(client, local_img_file, album)
          print(f"圖片網址: {image['link']}")
      
    • 整個 image 的資訊為 JSON檔案,可以 print() 輸出確認。
    • 確認上傳結果。
  5. 由於後續找到較單純且符合需求的 PyImgur 模組,官方模組 ImgurPython 介紹到此,您可以依自己需求選用。

3. 使用 PyImgur 連線上傳圖片

  • PyImgur 也是個可以操作 Imgur 的模組,參閱模組介紹,此模組好處是只需要您的CLIENT_ID,就可以讓您上傳圖片、取得圖床連結,比起官方建議的 imgurpython 簡化許多,符合我們後續只管上傳資料使用,缺點是傳送的結果不會出現在您 Imgur 的 Images 裡面,也不會出現在相簿裡,如果您要做比較具有隱私性的服務建議改回官方模組。
  • 安裝 PyImgur 模組為熟悉的 pip install pyimgur 指令,筆記本環境則在指令前加上 ! 魔術指令。
    $ pip install pyimgur
    
  • 測試能否讀取圖床圖片,需使用到您的CLIENT_ID ,指令參考如下:
    #顯示在imgur的圖片
    import pyimgur
    
    CLIENT_ID = "Your_applications_client_id"
    im = pyimgur.Imgur(CLIENT_ID)
    image = im.get_image('f1WHMuW')
    
    print(image.title) 
    print(image.link)
    
  • 上傳圖片,這裡的圖片採用先前 !wget 下載的圖片, Colab 指令為 !wget -O test.jpg https://i.imgur.com/qs1mqDf.png ,下載的 test.jpg 路徑無須變更,修改模組範例如下:
    import pyimgur
    
    CLIENT_ID = "Your_applications_client_id"
    PATH = "test.jpg" #A Filepath to an image on your computer"
    title = "Uploaded with PyImgur"
    
    im = pyimgur.Imgur(CLIENT_ID)
    uploaded_image = im.upload_image(PATH, title=title)
    print(uploaded_image.title)
    print(uploaded_image.link)
    print(uploaded_image.type)
    
  • 就這樣,沒幾行程式碼就上傳完成且取得連結囉,神奇夠用。

小結

本篇介紹如何申請 Imgur 權限,用 Python 的 imgurpython 及 PyImgur 兩個模組將圖片上傳至 imgur 圖床,下篇將結合股市線圖、雲端圖床做成 LINE 聊天機器人功能,作為串接資料視覺化的簡單卻強大的範例,我們下篇見。


上一篇
Day 25 : 用 Python 擷取 PTT 、 匯率及熱門迷因圖實作
下一篇
Day 27 : 股市 K 線 LINE 聊天機器人實作 (功能實作)
系列文
用Line聊天機器人串起多媒體系統 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
aquila_w
iT邦新手 5 級 ‧ 2021-04-24 20:46:31

問個 我是用jupyter
在官方模組那邊 upload 時 會出現 (417) Internal expectation failed 錯誤

且在獲取 pin code 那邊再jupyter中點網址也是出錯(連不上),必須複製網址下來另外貼上才會通過
不知道是否是jupyter本生的問題?

威利斯 iT邦研究生 1 級 ‧ 2021-04-25 01:08:43 檢舉

您好,經自己的測試都正常,針對您的問題試著協助如下:

  1. 您的第一個問題417屬於網路連線錯誤碼的一種,查閱相關資訊似乎跟您所提供伺服器所需的header不符,另位參考網路的討論似乎因為檔案過大所導致,您可以換張圖再測試看看。

  2. 我測試取得pin code是會另開分頁的,是否屬於jupyter的問題要您再自行測試看看。

aquila_w iT邦新手 5 級 ‧ 2021-05-18 21:45:03 檢舉

感謝~ 我再試試

我要留言

立即登入留言