现在我们可以来尝试能对收到的 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被外部浏览。
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))
staticflask 本身默认静态档案会放置于 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,看他能否成功的将图片给回传了。