# 快速打造Line Chatbot ###### tags: `fly.io` `deploy` `chatbot` `line` `聊天機器人` `教學` > 使用`python`部署至 fly.io ## 建立帳號 - 首先進入:https://manager.line.biz ,建立chatbot的帳號 - 個人使用的話按"使用LINE帳號登入" ![](https://i.imgur.com/OpvDLzk.png) - 用自己的帳號密碼或是掃QR code登入 ![](https://i.imgur.com/7H8MF60.png) - "建立LINE商用ID" ![](https://i.imgur.com/YtpVWMm.png) - "建立LINE官方帳號" ![](https://i.imgur.com/2oPcyy2.png) - 輸入完相關資訊後,按下確認。 到下一頁確認無誤後,按下完成。 ![](https://i.imgur.com/uTndTeK.png) - 頁面會顯示"您的LINE官方帳號已建立完成",按下"稍後進行認證(前往管理會面)",再次按下"同意"後,進入管理畫面。 ![](https://i.imgur.com/s8bK6Kt.png) - 此時網址應是`https://manager.line.biz/account/{@your_id}/` 這個`{@your_id}`就是這個帳號的id,可以透過id加入好友。 於此同時,剛剛建立好的帳號會自動加入好友,並傳送一段訊息。 到這一步,最基本的建立帳號已經完成! - 如果只是要單純的特定訊息自動回應,點選左側的"自動回應訊息",便可建立最基本的自動回應內容,簡易的chatbot就完成了。 ![](https://i.imgur.com/lTPClD3.png) - 要注意的是,如果要用接下來的步驟使用程式控制chatbot,先將Default的回覆刪除,不然不管傳什麼訊息都會有這則回覆。 ![](https://i.imgur.com/3nobhMA.png) ## 帳號設定 - 忘記id不要緊張,可以從 https://manager.line.biz 選擇帳號 - 進入`https://manager.line.biz/account/{@your_id}/`頁面,點選上方列的'聊天' ![](https://i.imgur.com/KCm5qTu.png) - "前往回應設定頁面" ![](https://i.imgur.com/3Ug9BxZ.png) - 點選左側的"Messaging API" ![](https://i.imgur.com/v2kbGj0.png) - "啟用Messaging API" ![](https://i.imgur.com/OGQeNPh.png) - 輸入使用者名稱及email後,輸入服務提供者名稱(隨便填),隱私權政策及服務條款先不填寫,直接按"確定",啟用Messaging API,會看到Messaging API畫面變成這樣,Webhook網址先空著,最後再來填上。 ![](https://i.imgur.com/ZHpcDzX.png) - 回到回應設定,將"Webhook"及"自動回應訊息"開啟。 ![](https://i.imgur.com/OqgzhhP.png) ## 取得Token - 這是很重要的一步,我們要拿到`Channel access token`跟`Channel secret` - 前往 https://developers.line.biz/console ,選擇剛建立的帳號。 - 在"Basic settings"頁面中可以找到`Channel secret` - 接著是`Channel access token`,選擇"Messaging API" ![](https://i.imgur.com/xBfhkyS.png) - 在頁面的最下面會看到 ![](https://i.imgur.com/ZTx0JKB.png) - 勇敢的按下"Issue"後,會看到一長串的亂碼,那就是我們要的`Channel access token` ![](https://i.imgur.com/L9yrJx2.png) - 將`Channel access token`跟`Channel secret`兩個重要的資訊記下來後,就可以進入python的部分了。 ## Python - 先安裝line套件,如果沒有要在本機測試,可以跳過這步。 ``` pip install line-bot-sdk ``` - 建立一個`{app_name}.py`,{app_name}為自己的檔名 ```python # coding: utf-8 from flask import Flask, request, abort from linebot import LineBotApi, WebhookHandler from linebot.exceptions import InvalidSignatureError from linebot.models import MessageEvent, TextMessage, TextSendMessage #line token channel_access_token = '{Channel_access_token}' channel_secret = '{Channel_secret}' line_bot_api = LineBotApi(channel_access_token) handler = WebhookHandler(channel_secret) app = Flask(__name__) # 監聽所有來自 /callback 的 Post Request @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: abort(400) return 'OK' @handler.add(MessageEvent, message=TextMessage) def handle_message(event): #echo msg= event.message.text message = TextSendMessage(text=msg) 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) ``` - 輸入剛剛存下來的`Channel access token`跟`Channel secret` ```python channel_access_token = '{Channel_access_token}' channel_secret = '{Channel_secret}' ``` - 這邊只做最簡單的回聲機器人,chatbot會復述剛剛輸入的話,可以針對所需再進行修改。 ```python @handler.add(MessageEvent, message=TextMessage) def handle_message(event): #echo msg= event.message.text message = TextSendMessage(text=msg) line_bot_api.reply_message(event.reply_token,message) ``` - 其他回覆方式可參考`line-bot-sdk`的[GitHub](https://github.com/line/line-bot-sdk-python)及[LINE官方文件](https://developers.line.biz/en/docs/messaging-api/) - 範例檔案可參考 https://github.com/littlehsun/linechatbot-demo ## 部署至 fly.io - 需要先建立兩個檔案:`Procfile`及`requirements.txt` - 建立`Procfile`,要注意`Procfile`沒有副檔名 ``` web: python {app_name}.py ``` - 建立`requirements.txt` ``` line-bot-sdk flask ``` - 將`{app_name.py}`、`Procfile`、`requirements.txt`三個檔案放至同一個資料夾`{project_folder}` - 安裝`flyctl`(MacOS),其他作業系統請參考[fly官網](https://hackmd.io/@littlehsun/r1RK0QDwj)。 如果有homebrew的話,執行: ``` brew install flyctl ``` 沒有就執行: ``` curl -L https://fly.io/install.sh | sh ``` - 註冊 ``` flyctl auth signup ``` - 登入 ``` flyctl auth login ``` - 進入專案資料夾 ``` cd {project_folder} ``` - 啟動專案 ``` flyctl launch ``` 如果原本有`Procfile`檔,會問是否要overwrite,選No就好。 ![](https://i.imgur.com/vIpp9fb.png) 輸入專案的名稱`{project_name}`。 選擇喜歡的伺服器,比較近的應該是香港跟東京。 如果沒有要使用資料庫,就都選No。 ![](https://i.imgur.com/PnF8om3.png) 執行完成後,會發現`{project_folder}`資料夾中多了一個`fly.toml`檔,不用動它 - 開始部署: ``` flyctl deploy ``` ![](https://i.imgur.com/1GIdWsB.png) 等待執行完成 - 執行`flyctl status`查看專案狀況,其中hostname:`{project_name}.fly.dev`便是webhook所需要的網域 - 可參考 https://hackmd.io/@littlehsun/r1RK0QDwj ## 設定Webhook - 獲得`{project_name}.fly.dev`後,由於程式內的設定是`@app.route("/callback", methods=['POST'])`,因此webhook網址是`https://{project_name}.fly.dev/callback` - 到 https://manager.line.biz 的 "Messaging API"頁面,輸入`https://{project_name}.fly.dev/callback` ,按下儲存。 ![](https://i.imgur.com/yNRBG9s.png) - 或是到 https://developers.line.biz/console 的 "Messaging API"分頁,找到Webhook settings,輸入 `https://{project_name}.fly.dev/callback` 並update後,執行verify,跳出Success就完成了。比較推薦這個方法,因為可以verify這個webhook是不是有成功運作。 ![](https://i.imgur.com/k62HlCL.png) ## 完成! - 簡單的echo chatbot就大功告成了! ![](https://i.imgur.com/cdkxmYk.jpg) - 可以搭配LINE內建的自動回應功能,更豐富chatbot的完整性