---
# System prepended metadata

title: LineBot+Google sheet使用

---

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