實作
新增兩個 LINE Channel key 至 .env
1 2
| LINE_CHANNEL_TOKEN= LINE_CHANNEL_SECRET_KEY=
|
接著加入 LINE 的 python SDK 至 requirements.txt
透過 pip 安裝一下
1
| pip install -r requirements.txt
|
在 controller/ 底下新增一個 message_api_controller.py 並輸入以下程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| from flask import Flask, request, abort from flask_restful import Resource import json import os from linebot import ( LineBotApi, WebhookHandler ) from linebot.exceptions import ( InvalidSignatureError ) from linebot.models import ( MessageEvent, TextMessage, TextSendMessage, )
class LineMessageApiWebhookController(Resource): def post(self): line_bot_api = LineBotApi(os.getenv('LINE_CHANNEL_TOKEN')) handler = WebhookHandler(os.getenv('LINE_CHANNEL_SECRET_KEY'))
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True) event = json.loads(body) print(event) try: handler.handle(body, signature) except InvalidSignatureError: print( "Invalid signature. Please check your channel access token/channel secret.") abort(400)
token = event['events'][0]['replyToken'] if token == "00000000000000000000000000000000": pass else: line_bot_api.reply_message(token, TextSendMessage( text=event['events'][0]['message']['text'])) return 'OK'
|
用任何語言都會看到回傳會有 200, ‘OK’…回傳的成功訊息,在內部系統的部分在處理時要考慮到回傳時間的問題,一般來說如果回傳的時間大於 1 秒的話就有可能失效,或許有些朋友有測試過大於 1 秒也可以,但最好還是於時間內回覆哦!
以下圖片來自 https://engineering.linecorp.com/zh-hant/blog/line-device-10/
接著在 api.py 加入下面兩段 code,新增一個webhook
的路由
1 2
| from controller.message_api_controller import LineMessageApiWebhookController api.add_resource(LineMessageApiWebhookController, '/webhook')
|
這邊可以使用sls wsgi serve
+ ngrok
去搭配做測試
接著就部署啦
現在在接這種第三方的 API 時最好都使用 https
,而使用 Serverless 的好處就是 AWS 在部署完之後會送你一個含有 SSL 的網址~
把網址貼到 webhook URL
上並在尾端加上 /webhook
測試結果如下
結論
這次整合了以前寫的 Repo,加入了.env
讓我在抓下來使用時也更方便,也整合成 Restful 格式讓之後有需要的人在看 code 時可以更容易理解了~
專案也會持續更新,更多詳情可以 follow 我的專案 aws-python-line-api。