跳至主要内容

Day26_用Python上傳圖片至Imgur圖床

  • 由於 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 聊天機器人功能,作為串接資料視覺化的簡單卻強大的範例,我們下篇見。