用 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,看他能否成功的将图片给回传了。


<<:  Day 25 - 影像处理篇 - 用Canvas实作在IE上也可运行的模糊滤镜I - 成为Canvas Ninja ~ 理解2D渲染的精髓

>>:  [Day25] 求值策略

[Day1] 前言

各位朋友好! 这是第一次参加iThome铁人赛~ 本次参加主要目标为完成挑战後,有能力制作个人网站,...

Day2 - numpy(1)基本介绍及使用

numpy介绍: 一个可操作高维度阵列的套件,可快速的对整个资料做运算。 就不多说了,让我们直接实际...

[Day13]PHP 匿名函式及箭头函式

PHP函数 匿名函数 匿名函数(Anonymous functions),也称作闭包函数(closu...

Day 15 储存宝石:S3 架构 & 版本控管 (Versioning)

今天我们将介绍 AWS S3 的架构及其版本控管(Versioning)的概念。 Bucket 的...

F# 语言和你 SAY HELLO!!

第二十天 各位点进来的朋友,你们好阿 小的不才只能做这个系列的文章,但还是希望分享给点进来的朋友,知...