</style>} # LineBot 聊天機器人(Python+Flask+Heroku)建立紀錄 Part 1 ###### tags: `LineBot` ### 事前準備-各種註冊安裝下載 * Python * Line * Heroku * Git ## 初始化聊天機器人 ### 載入所需模組 ``` from flask import Flask, request, abort from linebot import LineBotApi, WebhookHandler from linebot.exceptions import InvalidSignatureError import os app = Flask(__name__) ``` ### Line 聊天機器人個資 在Line developers裡面Channel 取得 Channel access token ``` handler = WebhookHandler('Channel access token') line_bot_api = LineBotApi('Channel secret') ``` ### 接收Line 的資訊 ``` @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) print(body) try: print(body, signature) handler.handle(body, signature) except InvalidSignatureError: abort(400) return 'OK' ``` ## Heroku 建立專案 登入Heroku ``` (base) MacBook-Pro:linebot Vic$ heroku login heroku: Press any key to open up the browser to login or q to exit: # 瀏覽器登入後 Logged in as 你的 Heroku ``` ### 利用heroku create 指令創造一個heroku application ``` (base) MacBook-Pro:linebot Vic$ heroku create name-of-app Creating ⬢ name-of-app... done https://name-of-app.herokuapp.com/ | https://git.heroku.com/name-of-app.git ``` ### 準備heroku 的應用程式所需要的檔案 * Procfile > 在项目的根目录中添加一个Procfile文件。这个文件用来指定运行程序的命令,使用<processtype>:<command>的形式来定义一个进程,每个进程一行。 >[李辉 - Flask Web开发实战 helloflask](http://helloflask.com/book/1/) ``` web: gunicorn app:app –preload ``` * requirements.txt 告訴Heroku執行這個程式所需要安裝的套件: ``` Flask==1.1.2 gunicorn==19.9.0 line-bot-sdk==1.14.0 requests==2.23.0 beautifulsoup4==4.9.1 lxml==4.2.2 yfinance==0.1.54 mpl-finance==0.10.1 mplfinance==0.12.7a0 matplotlib==3.3.0 pandas==1.1.0 pandas-datareader==0.9.0 pyimgur==0.6.0 numpy==1.19.1 ``` * runtime.txt 提供Heroku目前執行此程式的python 版本 ## Git Push ### 初始化Git ``` (base) MacBook-Pro:linebot Vic$ git init Initialized empty Git repository in /Users/Vic/Desktop/codervic/LineBot/.git/ ``` ### 推向Heroku ``` (base) MacBook-Pro:linebot Vic$ heroku git:remote -a name-of-app set git remote heroku to https://git.heroku.com/name-of-app.git ``` ### Deploy ``` $ git add . $ git commit -am "whatever you like" $ git push heroku master ``` ## 重複訊息機器人 ``` from flask import Flask, request, abort, render_template from linebot import LineBotApi, WebhookHandler from linebot.exceptions import InvalidSignatureError from linebot.models import MessageEvent, TextMessage, TextSendMessage, ImageSendMessage import configparser import os app = Flask(__name__) handler = WebhookHandler('Token') line_bot_api = LineBotApi('Secret') @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) print(body) try: print(body, signature) handler.handle(body, signature) except InvalidSignatureError: abort(400) return 'OK' # 學你說話 function @handler.add(MessageEvent, message = TextMessage) def handle_message(event): if event.source.user_id != "Udeadbeefdeadbeefdeadbeefdeadbeef": line_bot_api.reply_message( event.reply_token, TextSendMessage(text = event.message.text) ) ``` ## 參考資料 * [卡米狗BLOG](https://ithelp.ithome.com.tw/articles/10217350) * [李辉 - Flask Web开发实战 helloflask](http://helloflask.com/book/1/)