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 IDClient secret

  4. 申請 API,本次採用 OAuth2驗證,完成後會取得專屬的 Client IDClient 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 IDClient 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 的 imgurpythonPyImgur 兩個模組將圖片上傳至 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 檢舉

感謝~ 我再試試

我要留言

立即登入留言