储存用户的图片或影片
如果已经能够透过 LINE BOT 接收用户的消息,下一步就能根据消息的类型,判断如果是图片或影片时,将图片或影片储存到服务器的电脑中,这篇教学会介绍透过 LINE Message API 储存用户传送的图片或影片。
快速导览:
储存图片 ( 本机环境 )
沿用“使用 ngrok + 本机环境建立 Webhook”的范例程序,输入 Access Token 和 Sceret 后,按照下列重点加入对应的程序码:
- 使用
elif type == 'image'额外判断图片类型消息。- 取得消息 ID。
- 根据消息 ID,透过
line_bot_api.get_message_content()方法取得消息内容。- 搭配 open 内建函数库 ( 参考“文件读写 open” ),建立二进制的 jpg 文件,使用消息 ID 作为档名,并使用
.content取得消息的二进制内容,进行图片存档。
from flask import Flask, request
# 載入 LINE Message API 相關函式庫
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage, StickerSendMessage, ImageSendMessage, LocationSendMessage
import json
app = Flask(__name__)
@app.route("/", methods=['POST'])
def linebot():
body = request.get_data(as_text=True) # 取得收到的訊息內容
try:
json_data = json.loads(body) # json 格式化訊息內容
access_token = '你的 Access Token'
secret = '你的 Channel Secret'
line_bot_api = LineBotApi(access_token) # 確認 token 是否正確
handler = WebhookHandler(secret) # 確認 secret 是否正確
signature = request.headers['X-Line-Signature'] # 加入回傳的 headers
handler.handle(body, signature) # 綁定訊息回傳的相關資訊
tk = json_data['events'][0]['replyToken'] # 取得回傳訊息的 Token
type = json_data['events'][0]['message']['type'] # 取得 LINE 收到的訊息類型
# 判斷如果是文字
if type=='text':
msg = json_data['events'][0]['message']['text'] # 取得 LINE 收到的文字訊息
reply = msg
# 判斷如果是圖片
elif type == 'image':
msgID = json_data['events'][0]['message']['id'] # 取得訊息 id
message_content = line_bot_api.get_message_content(msgID) # 根據訊息 ID 取得訊息內容
# 在同樣的資料夾中建立以訊息 ID 為檔名的 .jpg 檔案
with open(f'{msgID}.jpg', 'wb') as fd:
fd.write(message_content.content) # 以二進位的方式寫入檔案
reply = '圖片儲存完成!' # 設定要回傳的訊息
else:
reply = '你傳的不是文字或圖片呦~'
print(reply)
line_bot_api.reply_message(tk,TextSendMessage(reply)) # 回傳訊息
except:
print(body) # 如果發生錯誤,印出收到的內容
return 'OK' # 驗證 Webhook 使用,不能省略
if __name__ == "__main__":
app.run()
完成后执行程序 ( 记得先使用 ngrok 产生 webhook 网址并提交至 LINE Developer ),传送图片到 LINE BOT,就会自动将图片储存到指定的文件夹。
储存图片 ( Colab )
如果要使用 Colab 作为开发环境,将上述的程序码额外 import run_with_ngrok,并于程序码中使用 run_with_ngrok(app),就可以将用户传送的图片储存到 Google 云端硬盘里。
from flask import Flask, request
from pyngrok import ngrok # Colab 環境需要,本機環境不需要
# 載入 LINE Message API 相關函式庫
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage, StickerSendMessage, ImageSendMessage, LocationSendMessage
import json
app = Flask(__name__)
# Colab 環境需要下面這三行,本機環境不需要
port = "5000"
public_url = ngrok.connect(port).public_url
print(f" * ngrok tunnel \"{public_url}\" -> \"http://127.0.0.1:{port}\" ")
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
@app.route("/", methods=['POST'])
def linebot():
body = request.get_data(as_text=True) # 取得收到的訊息內容
try:
json_data = json.loads(body) # json 格式化訊息內容
access_token = '你的 Access Token'
secret = '你的 Channel Secret'
line_bot_api = LineBotApi(access_token) # 確認 token 是否正確
handler = WebhookHandler(secret) # 確認 secret 是否正確
signature = request.headers['X-Line-Signature'] # 加入回傳的 headers
handler.handle(body, signature) # 綁定訊息回傳的相關資訊
tk = json_data['events'][0]['replyToken'] # 取得回傳訊息的 Token
type = json_data['events'][0]['message']['type'] # 取得 LINE 收到的訊息類型
# 判斷如果是文字
if type=='text':
msg = json_data['events'][0]['message']['text'] # 取得 LINE 收到的文字訊息
reply = msg
# 判斷如果是圖片
elif type == 'image':
msgID = json_data['events'][0]['message']['id'] # 取得訊息 id
message_content = line_bot_api.get_message_content(msgID) # 根據訊息 ID 取得訊息內容
# 在同樣的資料夾中建立以訊息 ID 為檔名的 .jpg 檔案
with open(f'{msgID}.jpg', 'wb') as fd:
fd.write(message_content.content) # 以二進位的方式寫入檔案
reply = '圖片儲存完成!' # 設定要回傳的訊息
else:
reply = '你傳的不是文字或圖片呦~'
print(reply)
line_bot_api.reply_message(tk,TextSendMessage(reply)) # 回傳訊息
except:
print(body) # 如果發生錯誤,印出收到的內容
return 'OK' # 驗證 Webhook 使用,不能省略
if __name__ == "__main__":
app.run()
储存影片 ( 本机环境 )
LINE BOT 储存影片的做法和储存图片相同,只是储存的格式需要是 mp4,延伸前一段程序码,额外加入 elif 判断,就能在接收到影片消息时储存影片。
from flask import Flask, request
# 載入 LINE Message API 相關函式庫
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage, StickerSendMessage, ImageSendMessage, LocationSendMessage
import json
app = Flask(__name__)
@app.route("/", methods=['POST'])
def linebot():
body = request.get_data(as_text=True) # 取得收到的訊息內容
try:
json_data = json.loads(body) # json 格式化訊息內容
access_token = '你的 Access Token'
secret = '你的 Channel Secret'
line_bot_api = LineBotApi(access_token) # 確認 token 是否正確
handler = WebhookHandler(secret) # 確認 secret 是否正確
signature = request.headers['X-Line-Signature'] # 加入回傳的 headers
handler.handle(body, signature) # 綁定訊息回傳的相關資訊
tk = json_data['events'][0]['replyToken'] # 取得回傳訊息的 Token
type = json_data['events'][0]['message']['type'] # 取得 LINE 收到的訊息類型
# 判斷如果是文字
if type=='text':
msg = json_data['events'][0]['message']['text'] # 取得 LINE 收到的文字訊息
reply = msg
# 判斷如果是圖片
elif type == 'image':
msgID = json_data['events'][0]['message']['id'] # 取得訊息 id
message_content = line_bot_api.get_message_content(msgID) # 根據訊息 ID 取得訊息內容
# 在同樣的資料夾中建立以訊息 ID 為檔名的 .jpg 檔案
with open(f'{msgID}.jpg', 'wb') as fd:
fd.write(message_content.content) # 以二進位的方式寫入檔案
reply = '圖片儲存完成!' # 設定要回傳的訊息
# 判斷如果是影片
elif type=='video':
msgID = json_data['events'][0]['message']['id']
message_content = line_bot_api.get_message_content(msgID)
with open(f'{msgID}.mp4', 'wb') as fd:
fd.write(message_content.content)
reply = '影片儲存完成!'
else:
reply = '你傳的不是文字或圖片呦~'
print(reply)
line_bot_api.reply_message(tk,TextSendMessage(reply)) # 回傳訊息
except:
print(body) # 如果發生錯誤,印出收到的內容
return 'OK' # 驗證 Webhook 使用,不能省略
if __name__ == "__main__":
app.run()
储存影片 ( Colab )
Colab 的做法也相同,在原本的程序码里补上 elif 判断即可 ( 重新执行后需要更新 webhook 网址 )。
from flask import Flask, request
from pyngrok import ngrok # Colab 環境需要,本機環境不需要
# 載入 LINE Message API 相關函式庫
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage, StickerSendMessage, ImageSendMessage, LocationSendMessage
import json
app = Flask(__name__)
# Colab 環境需要下面這三行,本機環境不需要
port = "5000"
public_url = ngrok.connect(port).public_url
print(f" * ngrok tunnel \"{public_url}\" -> \"http://127.0.0.1:{port}\" ")
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
@app.route("/", methods=['POST'])
def linebot():
body = request.get_data(as_text=True) # 取得收到的訊息內容
try:
json_data = json.loads(body) # json 格式化訊息內容
access_token = '你的 Access Token'
secret = '你的 Channel Secret'
line_bot_api = LineBotApi(access_token) # 確認 token 是否正確
handler = WebhookHandler(secret) # 確認 secret 是否正確
signature = request.headers['X-Line-Signature'] # 加入回傳的 headers
handler.handle(body, signature) # 綁定訊息回傳的相關資訊
tk = json_data['events'][0]['replyToken'] # 取得回傳訊息的 Token
type = json_data['events'][0]['message']['type'] # 取得 LINE 收到的訊息類型
# 判斷如果是文字
if type=='text':
msg = json_data['events'][0]['message']['text'] # 取得 LINE 收到的文字訊息
reply = msg
# 判斷如果是圖片
elif type == 'image':
msgID = json_data['events'][0]['message']['id'] # 取得訊息 id
message_content = line_bot_api.get_message_content(msgID) # 根據訊息 ID 取得訊息內容
# 在同樣的資料夾中建立以訊息 ID 為檔名的 .jpg 檔案
with open(f'{msgID}.jpg', 'wb') as fd:
fd.write(message_content.content) # 以二進位的方式寫入檔案
reply = '圖片儲存完成!' # 設定要回傳的訊息
# 判斷如果是影片
elif type=='video':
msgID = json_data['events'][0]['message']['id']
message_content = line_bot_api.get_message_content(msgID)
with open(f'{msgID}.mp4', 'wb') as fd:
fd.write(message_content.content)
reply = '影片儲存完成!'
else:
reply = '你傳的不是文字或圖片呦~'
print(reply)
line_bot_api.reply_message(tk,TextSendMessage(reply)) # 回傳訊息
except:
print(body) # 如果發生錯誤,印出收到的內容
return 'OK' # 驗證 Webhook 使用,不能省略
if __name__ == "__main__":
app.run()
小结
已经能够顺利透过 LINE BOT 储存用户传送的图片或影片后,就可以利用图片或影片做更多有趣的变化 ( 例如搭配 Pillow 之类的函数库进行修图之类 ),如果要透过 Google 云端硬盘备份,可以参考下方的文章:
微信扫码关注
抖音扫码关注