這篇文章是我自己吸收後打出來的文章如果有錯記得跟我說!!
前情提要:
因為疫情關係導致很多東西都用Line通知並因為公司一些系統也利用 Line notify 去做通知,導致這份小小的 Side Project 產生出來,當然也是由我接下我才會打這篇文 XD
正題:
我們要做Line Bot前要先理解一些他們的傳送資料的方法和架構!
簡單來說就是我們 User 傳送的資料or文字都會透過 LineBot-API 先傳到 Line,之後會轉到我們掛在 Heroku 上用 Python+Flask 建立的網頁,然後網頁收到資料後去執行對應的程式碼,再回傳回去 Line 並執行對應的程式碼(Ex:傳資料給User)。
實作:
註冊:
先到我們的 Account 裡選擇 Products 然後選擇 Messaging API 然後點 Start Now
之後就開始填一些基本資料,有些資料可以不用填
這樣我們就有了基本的 LineBot 了
然後就可以建立一個 App
之後也是填一下資料就建立好了
程式方面:
我們是用 Python+Flask 建構一個網頁掛在 Heroku
因為我們要用 Heroku 所以需要安裝 Git 跟 HerokuCLI
然後我是用 Python 3.8.6 去開發
然後安裝一些套件
pip install line-bot-sdk
pip install Flask
不過這些事如果你要在本地執行程式測試才會需要裝的因為我們主要會掛在 Heroku 上所以我們只要把這些套件裝在 Heroku 上就OK了!
東西都裝完之後就能開始看我們的程式碼了
=> Main.py
# 初始化LINT BOT import os
from flask import Flask from linebot import LineBotApi, WebhookHandler
app = Flask(__name__)
line_bot_api = LineBotApi(os.environ['CHANNEL_ACCESS_TOKEN']) handler = WebhookHandler(os.environ['CHANNEL_SECRET'])
# 利用 handler 處理 LINE 觸發事件 from linebot.models import MessageEvent, TextMessage, TextSendMessage
@handler.add(MessageEvent, message=TextMessage) def handle_message(event): line_bot_api.reply_message( event.reply_token, TextSendMessage(text=f"Hello {line_bot_api.get_profile(event.source.user_id).display_name}!") )
# 利用 route 處理路由 from flask import request, abort from linebot.exceptions import InvalidSignatureError
@app.route("/callback", methods=['POST']) def callback(): signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True) app.logger.info("Request body: " + body)
try: handler.handle(body, signature) except InvalidSignatureError: abort(400)
return 'OK' |
我們可以看到程式碼裡面有 CHANNEL_ACCESS_TOKEN 跟 CHANNEL_SECRET
都是在我們剛剛創 LineBot 的地方看到
Channel secret 在 Basic Setting 下 ,Channel access token 在 Messaging API 下
然後在 Messaging API 裡有一個 Webhook URL 的地方是等等要用的
可以先填上 https://你heroku的APP名字.herokuapp.com/callback
先別急著按 Verify 因為我們還沒把程式上傳
之後就要回到 Heroku 的部分因為我們要上傳到 Heroku,我們先把程式碼的部分搞定在上傳
我們要把程式上傳到 Heroku 需要幾個東西讓 Heroku 去安裝他要的東西跟指定要跑的程式等等...
要上傳Heroku有幾個必要的東西 Procfile(不要懷疑就是沒有副檔名),requirements.txt,runtime.txt 這三個東西跟你的主程式
Procfile:主要是寫說你這個程式是捨麼東西並主要執行的程式
我們要在裡面填上 web: gunicorn main:app –preload
Ex:web: gunicorn main:app –preload
這是一個 Web 用 Gunicorn 搭建一個 Web 服務然後是用 main 這個檔案
等等上傳就可以在你的 Heroku 上看到
requirements.txt:這很重要!這是要把我們需要用到的 Library 去跟 Heroku 說他會在上傳程式碼時一起裝起來
這是我有裝的東西基本上就是 套件名字==版本
Flask==2.0.2
gunicorn==19.9.0
line-bot-sdk==2.0.1
requests==2.27.1
psycopg2==2.9.3
numpy==1.19.4
Pillow==8.0.1
pygsheets==2.0.5
runtime.txt:這裡面是寫說你要用什麼語言去執行
我填上的是 python-3.8.6 就這樣
之後我們就照著 Heroku 裡 Deploy 下的步驟一步一步操作就能上傳程式碼到 Heroku 上了
過程跟上傳 Github 的方法87%像
之後我們剛剛可以看到程式碼裡有這兩句
line_bot_api = LineBotApi(os.environ['CHANNEL_ACCESS_TOKEN'])
handler = WebhookHandler(os.environ['CHANNEL_SECRET'])
這邊的用的 os.environ['CHANNEL_ACCESS_TOKEN'],是利用我們 Heroku 上設定一些變數並當你跟 Heroku 要的時候會吐出指定的東西給他那要整麼設定呢?
在你的 Heroku App 裡的 Setting 可以看到 Config Vars 把旁邊的點開就能看到兩行可以輸入的東西,我們就在這邊輸入我們 LineBot 的資訊就不用吧他寫在程式裡摟!!
我們有了剛剛講的這三個跟主程式就上傳到你的 Heroku 就能回去剛剛的 LineBot 裡的Webhook URL 按 Verify 正常過的話就是代表能用摟!!
如果不行就檢查一下
先檢查 Webhook URL 是否有對到你的 HerokuAPP
再 CHANNEL_ACCESS_TOKEN 跟 CHANNEL_SECRET 是否填對
如果你不覺的是 Heroku 的問題也能改成直接寫在程式裡
Ex:
line_bot_api = LineBotApi('CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('CHANNEL_SECRET')
過來就是檢查上傳 Heroku 的資料是否都有,再檢查是否有上傳成功
我知道我講的有點簡略,但可以搭配之有一些前輩的文章一起參考喔!(我下面會付)
如果都不行或是還有疑問就留言吧!如果我會,我就盡量回答!!
參考資料:
賴田捕手 iT幫幫忙
卡米狗 iT幫幫忙
[ChatBot] 創造自己的 Line bot,第一次就上手!(1) — Line bot 架構及工具簡介