建立并串接 Webhook
已经建立了 LINE BOT 的 Channel 之后,下一步就是要将 LINE BOT 串接 Webhook,让 LINE 聊天的消息能够透过 Webhook 传递到用 Python 编辑的程序去做处理,这篇教学将会介绍如何产生 Webhook,以及如何串接 Webhook。
建议先阅读:建立 LINE Channel
快速导览:
什么是 Webhook?
Webhook 指的是一个“网址”,透过服务器建立 Webhook 网址后,有串接 Webhook 的位置就能使用 HTTP 的 POST 方法,向服务器传送或接收特定的数据。
LINE BOT 与 WebHook 的关系
当用户在 LINE 聊天室里跟 LINE BOT 聊天,会发生下列的步骤:
- Step 1:向使用 Message API 所建立的 LINE BOT 发送消息。
- Step 2:消息透过 Webhook 传递到用户部署 Python 程序的服务器。
- Step 3:根据 Python 程序的逻辑,处理消息。
- Step 4:透过 Webhook 回传结果到 LINE BOT。
- Step 5:LINE BOT 发送消息到 LINE 聊天室里。
取得 LINE Channel access token 和 Channel secret
延伸“建立 LINE Channel”文章,进入自己建立的 LINE Channel,前往 Basic settings 页签,能够看到 Channel secret ( 如果没有看到或需要重新产生,点击 Reissue 就能产生 )。
前往 Messaging API 页签,可以看到 Channel access token,它和 Channel secret 都是串接 LINE Channel 必须的金钥 ( 如果没有看到或需要重新产生,点击 Reissue 就能产生 )。
使用 ngrok + 本机环境建立 Webhook
参考 LINE 官方所提供的 Python 开发文件:LINE Messaging API SDK for Python,输入下方的程序码,安装 LINE BOT 函数库。
pip install line-bot-sdk
完成后,执行下方的程序码就会在本机环境建立服务器。
from flask import Flask, request
# 載入 json 標準函式庫,處理回傳的資料格式
import json
# 載入 LINE Message API 相關函式庫
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
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 = '你的 LINE Channel access token'
secret = '你的 LINE 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 收到的文字訊息
print(msg) # 印出內容
reply = msg
else:
reply = '你傳的不是文字呦~'
print(reply)
line_bot_api.reply_message(tk,TextSendMessage(reply))# 回傳訊息
except:
print(body) # 如果發生錯誤,印出收到的內容
return 'OK' # 驗證 Webhook 使用,不能省略
if __name__ == "__main__":
app.run()
参考“使用 ngrok 服务”和“本机环境使用 ngrok”的文章内容,注册 ngrok 服务并取得 token,并在终端机里输入下列指令,将本机服务器网址指向 ngrok 网址 ( port 默认都是填入 5000 )
ngrok http 127.0.0.1:5000
完成后,就会看到终端机里出现 ngrok 的公开网址 ( 每次重新执行后,网址都会改变 )
复制这串网址后,前往“LINE Developer 控制台”,进入自己建立的 LINE BOT Channel ( 参考:建立 LINE Channel ),在 Message API 页签里找到 Webhook setting 选项,贴上 ngrok 网址 ( 注意要使用 https )。
完成后,点击“Verify”进行验证,如果出现 Success 文字表示已经可以正常串接。
打开 LINE,找到 LINE BOT 的账号,传送消息给 LINE BOT,LINE BOT 就会回应相同的消息。
使用 ngrok + Colab 建立 Webhook
参考“使用 ngrok 服务”和“Google Colab 使用 ngrok”的文章内容,注册 ngrok 服务并取得 token 并在 Colab 里安装 ngrok,完成后参考 LINE 官方所提供的 Python 开发文件:LINE Messaging API SDK for Python,在 Colab 里输入下方的程序码。
from flask import Flask, request
from pyngrok import ngrok
# 載入 LINE Message API 相關函式庫
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import json
app = Flask(__name__)
port = "5000"
# Open a ngrok tunnel to the HTTP server
public_url = ngrok.connect(port).public_url
print(f" * ngrok tunnel \"{public_url}\" -> \"http://127.0.0.1:{port}\" ")
@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) # 綁定訊息回傳的相關資訊
msg = json_data['events'][0]['message']['text'] # 取得 LINE 收到的文字訊息
tk = json_data['events'][0]['replyToken'] # 取得回傳訊息的 Token
line_bot_api.reply_message(tk,TextSendMessage(msg)) # 回傳訊息
print(msg, tk) # 印出內容
except:
print(body) # 如果發生錯誤,印出收到的內容
return 'OK' # 驗證 Webhook 使用,不能省略
if __name__ == "__main__":
app.run()
点击 Colab 的执行按钮,就会得到一串 ngrok 对应的网址,这串网址就是要与 LINE BOT 串接的 Webhook。
复制这串网址后,前往“LINE Developer 控制台”,进入自己建立的 LINE BOT Channel ( 参考:建立 LINE Channel ),在 Message API 页签里找到 Webhook setting 选项,贴上刚刚透过 ngrok 产生的 webhook 网址。
完成后,点击“Verify”进行验证,如果出现 Success 文字表示已经可以正常串接。
打开 LINE,找到 LINE BOT 的账号,传送消息给 LINE BOT,LINE BOT 就会回应相同的消息。
使用 Cloud Functions 建立 Webhook
由于使用 Colab + ngrok 所建置的 Webhook,会受限于 Colab 只能运行几个小时,以及 ngrok 在每次部署都会改变网址的特性,所以无法当作正式的 LINE BOT Webhook ( Colab 闲置超过一段时间后还会停止执行并清除安装的函数库,需要再次重新安装 )。
如果要建立一个可以 24 小时不断运作的 LINE BOT,就可以选择 Google Cloud Functions 作为 Python 运作的后台,参考“使用 Google Cloud Functions”文章,新增并启用一个 Cloud Functions 程序编辑环境,环境的执行阶段选择 Python ( 3.7~3.9 皆可 ),进入点改成 linebot ( 可自订名称,之后的程序码里也要使用同样的名称 )。
建立编辑环境后,点击 requirements.txt,加入 line-bot-sdk ( requirements.txt 的作用是 Cloud Functions 启用程序时需要安装的外部函数库 )
点击 main.py,输入下方程序码 ( 因为 Clouds Functions 的 Python 样板是以 Flask 的基础建立,所以不需要额外安装 Flask )
import json
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
def linebot(request):
try:
access_token = '你的 LINE Channel access token'
secret = '你的 LINE Channel secret'
body = request.get_data(as_text=True)
json_data = json.loads(body)
line_bot_api = LineBotApi(access_token)
handler = WebhookHandler(secret)
signature = request.headers['X-Line-Signature']
handler.handle(body, signature)
msg = json_data['events'][0]['message']['text']
tk = json_data['events'][0]['replyToken']
line_bot_api.reply_message(tk,TextSendMessage(msg))
print(msg, tk)
except:
print(request.args)
return 'OK'
完成后,点击部署,完成后会看见出现绿色打勾的图示。
点击进入程序,选择“触发条件”,复制触发网址 ( 这串网址就是要与 LINE BOT 串接的 Webhook )。
前往“LINE Developer 控制台”,进入自己建立的 LINE BOT Channel ( 参考:建立 LINE Channel ),在 Message API 页签里找到 Webhook setting 选项,贴上网址。
完成后,点击“Verify”进行验证,如果出现 Success 文字表示已经可以正常串接。
打开 LINE,找到 LINE BOT 的账号,传送消息给 LINE BOT,LINE BOT 就会回应相同的消息。
小结
到这个步骤,应该已经建立了一个最基本的 LINE BOT ( 可以发送消息给 LINE BOT,且 LINE BOT 也会回应同样的消息 ),接下来会继续介绍更多 LINE BOT 的传消息方法,以及主动推播消息的功能。
延伸阅读
微信扫码关注
抖音扫码关注