【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未經任何竄改)



沒有留言:

張貼留言