【Python】【LineBot】在Heroku平台上架設自己的LineBot機器人

Heroku 平台

2022-12更新
雲端主機無法繼續運行了,才發現Heroku沒有免費了,現在要錢 QQ
要訂閱才能開啟Web主機 





---


Heroku 是一個可以部署個人的程式碼在雲端運行的服務平台,當然環境也都要自己架設。Heroku可以支援多種程式語言,像是 Java、Python、Golang、PHP等等。

註冊完帳號之後,直接建立一個 new app







載 Heroku Cli 來安裝,安裝好後打開CMD就可以下 heroku相關指令了



透過開啟網頁登入後,照著官方給的提示操作 Create repository





之後就可以透過heroku git部署程式碼上去了








Line Bot Developers 平台



來到 Line Developers 登入開發者平台

在Line開發平台中,Channel 頻道 是掛在Provider底下的,
首先要先Create Provider




接著才是Create Channel,這邊選擇 Messaging API


看要取什麼名字或新增什麼描述



完成之後點進來,

在 Basic Setting 頁面中,先記錄下 Channel secret 跟 Your user ID



切換到 Messaging API 頁面

我們可以先透過ID或QR code ,用Line加入機器人







接著回來 Issue Channel Access Token







分別把幾個Line Bot重要的資訊先記錄下來:

Bot basic ID:
@547ysxxb

Channel Secret:
fee15f6999582d75753a080f52dc2878

Your user ID:
U130e731aa0f63ab7e17cd5966d0c376c

Channel access token (long-lived): 
7XO897wTGrVTL5R/NHzpHs8umJstJeey7uAprr0ZShmuDZPBZE6oUOEWK858nOnkiJJgeoIutKFUzW2Wb08GOhAzD0wn0duj+UYEpV+S/DVCbjr18OV22aSP3VWRtQhjm26x6frhwnfiQ6lSqpQgawdB04t89/1O/w1cDnyilFU=


除此之外,還要把 Auto-reply messages 給關閉



Webhook URL 可以先填寫,等到程式碼寫好上傳完畢後再來點擊驗證Verify!!

這邊填寫的網址是 https://gjlmotea-bot.herokuapp.com/callback
是 Heroku平台上 我的專案的網址的callback方法





到這步驟還無法成功是正常的,這是已上傳程式碼、驗證成功時出現的Success

Heroku部署檔案

總共會有以下四個檔案



main.py 是要執行的程式檔案
runtime 寫上要執行的python版本,要符合heroku文件要求的版本,我目前是python3.7.10


procfile 是給Heroku運行的腳本 web: python main.py (詳見官方說明)


requirements.txt 這裡要寫上Python程式運行時用到的所有套件








Python 程式面I - 入門篇


參照Github上 Line-bot-sdk 教學用法,
首先在本地中安裝SDK
> pip install line-bot-sdk



直接複製範例程式碼,稍加修改來使用


以下是 main.py 後半部程式碼

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']
    
    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    message = TextSendMessage(text="我是機器人!")
    line_bot_api.reply_message(
        event.reply_token,
        message)

import os
if __name__ == "__main__":
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)



程式弄好後,接著上傳到Heroku去!!

$ git init 
$ heroku git:remote -a gjlmotea-bot
$ git add . 
$ git commit -am "make it better" 
$ git push heroku master

可以透過 $ heroku logs --tail  查看現在Heroku機器運行的狀態

這樣的程式碼,可以在收到使用者訊息後回傳一段文字












如果想要有更多的應用,參考 落落長的Line官方API文檔、落落長的python SDK文檔






Heroku連結Github


記得來到Deploy頁面設置部署設定


之後當 
git push heroku main 更新程式碼上去時,會自動更新重新部署拉











以下是題外話 追蹤程式碼時的發現

Python 程式面 II - 進階篇 (HMAC)

一開始對 callback() 這個function所做的事情霧煞煞
也不知道這header中帶的 X-Line-Signature 參數的意義,好奇心使然查了才發現,
這與Line通訊用的身分驗證機制有關係(HMAC),

這段HMAC的驗證程式碼,是在Python LineBot套件中的 webhook.py 裡面的 SignatureValidator 







由於實在是非常想知道他會印出什麼東西

透過Trace Code技巧找出的此函式位置在
C:\Users\GJLMoTea\AppData\Local\Programs\Python\Python39\Lib\site-packages\linebot
底下的 webhook.py 這一包



我在這裡邊的函式中加上一堆print,瞧瞧他到底是啥





運行 範例程式碼(修改Token)後,

打開 Postman 打自己的5000port callback,用 Post 方法打

http://127.0.0.1:5000/callback

Header 要帶入 X-Line-Signature 參數隨便帶


Body 也隨便打入一些東西



接收到Post請求後,程式運行的結果輸出




運作邏輯分別是這樣子的:


依序填入以下Post Body內容、Line Channel Secret 
選擇SHA-256
選擇Base-64




網站輸出的結果便會與剛剛程式gen_signature產生的結果一樣


Line會把 透過Post方法傳入的Body完整訊息拿去與Channel Secret Key做 HMAC

(可以大致理解為 拿Key 和經sha256過的Key  以及Body完整訊息 此三組訊息一同做Sha-256雜湊)

最終拿到的雜湊值 與Post時帶入的Header 參數X-Line-Signature比對,

如果雜湊值與帶入的X-Line-Signature 完全一樣,代表此Body的訊息確實來自你的Line發出的
(有channel secret的權限 且body未經任何竄改)



沒有留言:

張貼留言