# LineBot+Google sheet使用
## Line Bot
### Messaging API ——回應使用者的訊息

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

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、沒有用到的在程式中要移除