# LineBot+Google sheet使用 ## Line Bot ### Messaging API ——回應使用者的訊息 ![](https://i.imgur.com/qHVFOvv.png) Messaging API 讓 data 可於 bot server 及 LINE Platform 之間傳遞,於 HTTPS 上傳送的 Request 將為 JSON 格式。 1.用戶發送訊息至 LINE 官方帳號。 2.LINE Platform 將一個 webhook 事件傳送至 bot server 的 webhook URL。 3.Bot server 將依據 webhook event,透過 LINE Platform 回應用戶。 #### Wbehook ![](https://i.imgur.com/0HLwezE.png) Webhook:「Webhook 是讓一個網站能訂閱另一個網站的方法。」 當此事件發生時,原網站將向為Webhook組態的URL傳送HTTP請求。使用者可組態它們引發網頁上的事件以呼叫另一個網站的行為。 #### 加入群組聊天 將Messaging API settings中功能開啟 Issue Channel access token ## Google API ## app.py ### Library ```python= from flask import Flask, request, abort import sys import gspread import pygsheets from datetime import datetime from oauth2client.service_account import ServiceAccountCredentials as SAC from linebot.models import * from linebot import ( LineBotApi, WebhookHandler ) from linebot.exceptions import ( InvalidSignatureError ) from linebot.models import ( MessageEvent, TextMessage, TextSendMessage, ) app = Flask(__name__) ``` ### 設定access token和channel secret(由Line developer頁面issue) ```python= line_bot_api = LineBotApi(ChannelAccessToken) handler = WebhookHandler(ChannelSecret) ``` 接收使用者傳來的訊息 ```python= @app.route("/", 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) print("Request body: " + body, "Signature: " + signature) # handle webhook body try: handler.handle(body, signature) except InvalidSignatureError: abort(400) return 'OK' ``` ### 處理回應訊息 ```python= @handler.add(MessageEvent, message=TextMessage) def handle_message(event): msg = event.message.text print(msg) msg = msg.encode('utf-8') ``` ### 將訊息寫入google sheet 一次只能reply一筆訊息 ```python= #Record msg to google excel m2s=event.message.text if m2s != "": line_bot_api.reply_message(event.reply_token,TextSendMessage(text="紀錄成功")) pass #GDriveJSON就輸入下載下來Json檔名稱 #GSpreadSheet是google試算表名稱 GDriveJSON = 'churchbot.json' GSpreadSheet = 'Test' GsheetKey = 'YourSheetKey' sheet_url='https://docs.google.com/spreadsheets/d/{YourSheetKey}/' ``` ### 建立連線到google sheet ```python= try: scope = ['https://spreadsheets.google.com/feeds'] credentials = SAC.from_json_keyfile_name(GDriveJSON, scope) gc = gspread.authorize(credentials) sheet = gc.open_by_url(sheet_url) Sheets=sheet.sheet1 except Exception as ex: print('無法連線Google試算表', ex) sys.exit(1) ``` ### 寫入資料 ```python= now = datetime.now() s = datetime.strftime(now,'%Y-%m-%d %H:%M:%S') #print(s) data=[s,m2s] data2=[s] #Sheets.append_row(data) #Sheets.update_acell('A1','test') Sheets.insert_row(data,1) print('write success') ``` ### 設定PORT ```python= import os if __name__ == "__main__": app.run(debug=True,port=85) ``` ### 增加row append_row(data) ```python= Sheets.append_row(data) ``` ### 資料插入row insert_row(value,列) ```python= Sheets.insert_row(data,1) ``` ### Message string處理 決定輸入格式(8個數字) 1.姓名11111111 2.姓名/1/1/1/1/1/1/1/1 一次多筆資料?才方便複製貼上 1.A11111111 B11111100 2.A11111111;B11111111(有全型半型問題) ## 部署到Heroku 讓Bot能一直保持在線上 ### Git使用 #### 修改 ```git= 1.把有修改的檔案透過 git add 加進版控 2.git commit 把目前的進度存進 Git 的 Repository 3.git push heroku master ``` ### ERROR #### (Solved)Verify失敗 查看Heroku log後 heroku[router]: at=error code=H10 desc="App crashed" ```shell= heroku run python app.py runserver ``` 在本地端,查看程式碼在heroku執行的log 發現有library沒有放到requirements.txt、沒有用到的在程式中要移除