iT邦幫忙

1

用 Python 暢玩 Line bot - 06:Image Message

現在我們可以來嘗試能對收到的 Image message 做怎樣的操作,我們可以使用line_bot_api.get_message_content()來獲取檔案資訊

@handler.add(MessageEvent)
def handle_message(event):
    if (event.message.type == "image"):
        SendImage = line_bot_api.get_message_content(event.message.id)
        print(SendImage)

我們可以取得如下的資訊

<linebot.models.responses.Content object at 0x000001A19C24E908>

而如果我們想要看到對應的圖片,需要將它重新寫檔下來,並存放到自己指定的位置,如下列程式碼,這時候當我們接受到 Image message 時,就可以在資料夾中看到對應的圖片了。

@handler.add(MessageEvent)
def handle_message(event):
    if (event.message.type == "image"):
        SendImage = line_bot_api.get_message_content(event.message.id)

        path = './Image/' + event.message.id + '.png'
        with open(path, 'wb') as fd:
            for chenk in SendImage.iter_content():
                fd.write(chenk)

再來如果我們想要回傳 Image message, Line API 會要求你給的資訊是圖片的 URL,而如果你想要將使用者傳送過來的圖片直接或處理過後回傳,圖片的 URL 要怎麼取得呢?這邊嘗試了兩種方式,一是透過 imgur 的 API 上傳圖片並取得對應的 URL,二是透過 static 讓靜態檔案路徑可以轉為URL被外部瀏覽。

  1. imgur API

官方說明文件
Imgur App 註冊頁面

用 imgur API 的方式會需要先去註冊一個 Imgur App 帳號(連接在上方),Authorization type 部分選擇第二個不用回傳 URL。再輸入完 email 後按下 submit,就可以看到 App 的 ID。
接著我們要到 cmd install pyimgur,並在程式碼中引入,再來我們可以寫個函式去取得圖片的 URL。pyimgur 中要上傳圖片會需要給 App ID 來讓他知道要上傳到哪個帳號,並告訴他要將哪一張圖片上傳,就可以取得對應的 URL了。

def glucose_graph(client_id, imgpath):
	im = pyimgur.Imgur(client_id)
	upload_image = im.upload_image(imgpath, title="Uploaded with PyImgur")
	return upload_image.link

接著我們就可以在 handle_message中加上呼叫glucose_graph來取得圖片的 url 去做回傳。且因為這次要傳送的是 Image message,所以在linebot.models的地方要多引入ImageSendMessage

@handler.add(MessageEvent)
def handle_message(event):
	if (event.message.type == "image"):
		SendImage = line_bot_api.get_message_content(event.message.id)

		local_save = './Image/' + event.message.id + '.png'
		with open(local_save, 'wb') as fd:
			for chenk in SendImage.iter_content():
				fd.write(chenk)

		img_url = glucose_graph(client_id, local_save)
		line_bot_api.reply_message(event.reply_token, ImageSendMessage(original_content_url=img_url, preview_image_url=img_url))
  1. static

flask 本身默認靜態檔案會放置於 static 中,所以可以一開始就將圖片存放在 static 資料夾,傳送的時用 網址 + static + 圖片名稱就可以正常傳送。像是我現在測試是用 ngrok 取得網址,因此就會寫成下面這樣。

ngrok_url = "https://88b3-1-171-241-102.ngrok.io"

@handler.add(MessageEvent)
def handle_message(event):
	if (event.message.type == "image"):
		SendImage = line_bot_api.get_message_content(event.message.id)

		local_save = './static/' + event.message.id + '.png'
		with open(local_save, 'wb') as fd:
			for chenk in SendImage.iter_content():
				fd.write(chenk)
                
		line_bot_api.reply_message(event.reply_token, ImageSendMessage(original_content_url = ngrok_url + "/static/" + event.message.id + ".png", preview_image_url = ngrok_url + "/static/" + event.message.id + ".png"))

現在就可以嘗試傳送圖片給 Line bot,看他能否成功的將圖片給回傳了。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
C
iT邦新手 5 級 ‧ 2022-04-18 09:14:06

你好,
請問有辦法取得使用者傳送檔案的檔名嘛 ?
謝謝

Arashi iT邦新手 5 級 ‧ 2022-04-21 15:55:34 檢舉

根據收到的event裡面我是沒看到有檔案名稱拉
更詳細的你可以看看官方文件的Image部分
https://developers.line.biz/en/reference/messaging-api/#message-event

0
aprilyuland
iT邦新手 5 級 ‧ 2022-11-21 18:26:30

你好
請問第二部分,寫def glucose_graph(client_id, imgpath)時,path 是從static 本端引進嗎? 我的理解是,因為不想24小開機,打算放雲端,在這樣的情況下,會否沒辦法把path 從本端叫出來?

如果是,想問能否有其他思路方式呢?

我要留言

立即登入留言