主动推播消息
有别于 LINE BOT 自动回复消息,主动推播消息表示可以在特定事件被触发时,主动传送消息到用户端,这篇将会介绍 LINE Message API 里的 push message 方法,并使用 Colab + ngrok 实作主动推播消息的功能,最后再将程序部署到 Google Cloud Functions。
建议先阅读:建立 LINE Channel
快速导览:
取得 LINE user ID 和 access token
进入 LINE Developers 的 LINE Channel,在 Basic Setting 里找到 user ID,在 Message API 里找到 Channel Access Token
推播文字消息
不论是本机环境还是 Colab,使用下列程序码,输入 LINE 的 user ID 以及 access token,执行后就会从指定的 LINE Bot 里收到“Hello World!!!”的文字消息,这也是 LINE BOT 最基本的推播功能。
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
line_bot_api = LineBotApi('你的 Access Token')
line_bot_api.push_message('要推播的 user ID', TextSendMessage(text='Hello World!!!'))
建立发送消息的通道 ( 网页推播 )
将 Colab 安装 flask_ngrok 和 line-bot-sdk 函数库,使用下方的程序码,输入 LINE 的 user ID 以及 access token,利用 Flask 建立一个网页应用程序。
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}\" ")
app = Flask(__name__)
@app.route("/")
def home():
line_bot_api = LineBotApi('你的 Access Token')
try:
# 網址被執行時,等同使用 GET 方法發送 request,觸發 LINE Message API 的 push_message 方法
line_bot_api.push_message('你的 User ID', TextSendMessage(text='Hello World!!!'))
return 'OK'
except:
print('error')
if __name__ == "__main__":
app.run()
完成后,执行程序,从浏览器打开 ngrok 产生的网址,打开后,如果有加入这个 LINE BOT 为好友,就会收到 LINE BOT 推播的消息。
修改程序,使用 Flask 的 request 取得网址的 msg 参数,判断如果有 msg 参数,就使用 LINE Message API 的 push_message,让 LINE BOT 主动推播 msg 参数的值。
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}\" ")
app = Flask(__name__)
@app.route("/")
def home():
line_bot_api = LineBotApi('你的 Access Token')
try:
msg = request.args.get('msg') # 取得網址的 msg 參數
if msg != None:
# 如果有 msg 參數,觸發 LINE Message API 的 push_message 方法
line_bot_api.push_message('你的 User ID', TextSendMessage(text=msg))
return msg
else:
return 'OK'
except:
print('error')
if __name__ == "__main__":
app.run()
完成后,执行程序,从浏览器打开 ngrok 产生的网址,在网址后方输入“?msg=XXXX”,重新整理后,如果有加入这个 LINE BOT 为好友,就会收到 LINE BOT 推播的消息。
推播消息的方法
LINE 的消息包含了文字、表情贴图、图片、地点...等类型,每种类型都有对应的推播消息方法,下方列出常用类型的推播方法 ( 使用前需要先 import ):
注意,只有在“开发者”模式下,可以免费推播消息 ( 有 50 个好友账号的额度 ),如果要作为官方账号使用,则需要付费开通推播消息的功能。
使用“TextSendMessage”方法推播文字消息。
| 参数 | 说明 |
|---|---|
| text | 要回复的文字 ( 不论放入什么内容都会被转换成文字 )。 |
使用“StickerSendMessage”方法推播表情贴图。
| 参数 | 说明 |
|---|---|
| package_id | 表情贴图所在群组 ID。 |
| sticker_id | 表情贴图 ID。 |
使用“ImageSendMessage”或“VideoSendMessage”方法推播图片或影片。
| 参数 | 说明 |
|---|---|
| original_content_url | 原始图片或影片网址。 |
| preview_image_url | 缩图网址。 |
使用“LocationSendMessage”方法推播地点信息。
| 参数 | 说明 |
|---|---|
| title | 地图标题。 |
| address | 地址标示。 |
| latitude | 纬度。 |
| longitude | 经度。 |
下方的程序执行后,打开 ngrok 产生的网址,在网址后方输入对应的参数并重新打开,就会看见 LINE 出现不同类型的消息。
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}\" ")
app = Flask(__name__)
@app.route("/")
def home():
line_bot_api = LineBotApi('你的 Access Token')
try:
msg = request.args.get('msg')
if msg == '1':
# 如果 msg 等於 1,發送文字訊息
line_bot_api.push_message('你的 User ID', TextSendMessage(text='hello'))
elif msg == '2':
# 如果 msg 等於 2,發送表情貼圖
line_bot_api.push_message('你的 User ID', StickerSendMessage(package_id=1, sticker_id=2))
elif msg == '3':
# 如果 msg 等於 3,發送圖片
imgurl = 'https://upload.wikimedia.org/wikipedia/en/a/a6/Pok%C3%A9mon_Pikachu_art.png'
line_bot_api.push_message('你的 User ID', ImageSendMessage(original_content_url=imgurl, preview_image_url=imgurl))
elif msg == '4':
# 如果 msg 等於 4,發送地址資訊
line_bot_api.push_message('你的 User ID', LocationSendMessage(title='總統府',
address='100台北市中正區重慶南路一段122號',
latitude='25.040319874750914',
longitude='121.51162883484746'))
else:
msg = 'ok' # 如果沒有 msg 或 msg 不是 1~4,將 msg 設定為 ok
return msg
except:
print('error')
if __name__ == "__main__":
app.run()
部署程序到 Google Cloud Functions
因为使用 ngrok + Colab 的 Python 程序,只会运作几个小时就停止,甚至再次执行时需要重新安装相关函数库,所以只能作为“开发中”使用,如果要真正建构 LINE BOT 的 Python 程序,除了可以使用类似 Heroku 之类的云端服务器,也可以直接使用 Google Cloud Functions 部署程序。
登录 Google 账号,启用 Google Cloud 和 Cloud Functions 后,建立一支 Cloud Functions 的程序,环境设定为 Python 3.7~3.9,进入点设定为 pushmsg。
编辑 requirements.txt,在 Cloud Functions 安装 line-bot-sdk 函数库。
编辑 main.py 主程序文件,撰写下方 Python 程序码,基本上程序内容与上方的程序一样 ( 只差别在 Flask 的写法 )。
from linebot import LineBotApi, WebhookHandler
from linebot.models import TextSendMessage, StickerSendMessage, ImageSendMessage, LocationSendMessage
def pushmsg(request):
line_bot_api = LineBotApi('你的 access token')
try:
msg = request.args.get('msg')
if msg == '1':
line_bot_api.push_message('你的 user ID', TextSendMessage(text='hello'))
elif msg == '2':
line_bot_api.push_message('你的 user ID', StickerSendMessage(package_id=1, sticker_id=2))
elif msg == '3':
imgurl = 'https://upload.wikimedia.org/wikipedia/en/a/a6/Pok%C3%A9mon_Pikachu_art.png'
line_bot_api.push_message('你的 user ID', ImageSendMessage(original_content_url=imgurl, preview_image_url=imgurl))
elif msg == '4':
line_bot_api.push_message('你的 user ID', LocationSendMessage(title='總統府',
address='100台北市中正區重慶南路一段122號',
latitude='25.040319874750914',
longitude='121.51162883484746'))
else:
msg = 'ok'
return msg
except:
print('error')
编辑完成后,部署程序,出现绿色打勾图示表示部署完成。
程序部署后,选择“触发条件”页签,复制触发的网址。
用浏览器打开网址,如果网址后方有加上参数,执行后 LINE 就会收到对应的消息。
小结
透过主动推播消息的方法,就能在特定事件被触发时,让 LINE BOT 发送消息通知,或进一步搭配 reply message 的方法,做出更进阶的 LINE BOT。
延伸阅读
微信扫码关注
抖音扫码关注