今回は、GoogleスプレッドシートとLINEBotを連携してユーザーIDを保存する方法についてまとめる。
随分記事の間が空いてしまっているが、この間にたくさん書くことが出来たので、時間作ってまとめていかねば。
もくじ
GoogleスプレッドシートAPIの使い方
スプレッドシートを扱うためには、便利なAPIを利用する。
例によって認証が必要になるが、少しハマった点があった。
スプレッドシートAPIは、GmailAPIのときと異なり、スプレッドシートの共有先を設定しなければ認証がうまくできない。
スプレッドシートAPIの初期設定に関しては、非常にわかりやすくまとまっている記事があったので、リンクを貼っておく。
【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ
大まかな流れとしては、
①プロジェクトの作成
②APIの有効化
③認証情報の設定
④スプレッドシートの共有設定の変更
となる。
GmailAPIのときと比べ煩雑でやや苦労した。
Pythonの便利なライブラリgspread
スプレッドシートを扱う準備ができた所で、いよいよPythonのコードを書いていく。
初めは、Python Quickstart を参考に書いていたが、どうやら便利なライブラリがあるらしいということで、そちらに切り替えることにした。
今回使ったライブラリは、gspreadというライブラリ。
Python3対応で、タイトルやシート名でスプレッドシートを開けるなどという特徴がある。
使い方は簡単。
まずは仮想環境で以下のコマンドを実行する。
【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ
pip install gspread
これでgspreadライブラリを使えるようになる。
Python3系と、Python2.7+で使えるようだ。
最も基本的な使い方は以下の通り。
from oauth2client.service_account import ServiceAccountCredentials from httplib2 import Http import gspread #SCOPEを入力 scopes = ['https://www.googleapis.com/auth/spreadsheets'] json_file = 'OAuth用クライアントIDの作成でダウンロードしたjsonファイル' credentials = ServiceAccountCredentials.from_json_keyfile_name(json_file, scopes=scopes) http_auth = credentials.authorize(Http()) フォローイベントでUseIDを保存する #認証情報の取得 gc = gspread.authorize(credentials) #スプレッドシートの取得 gc = client.open_by_key("ドキュメントのIDを入力") worksheet = gc.worksheet("シート名を入力") #B2セルの内容を更新 worksheet.update_acell('B2', "it's down there somewhere, let me take another look.") #範囲内のセルを配列で取得 cell_list = worksheet.range('A1:B7')
他のメソッドは、公式ドキュメントを参照
英語はあかん!って方にはこちらの記事がおすすめ。
gspreadライブラリの使い方まとめ!Pythonでスプレッドシートを操作する
フォローイベントでUseIDを保存する
今回は、LINEBotで友達に追加されたユーザーのIDを格納するDBの代わりとしてスプレッドシートを利用する。
普通にDB使えよ!と思われるかもしれないが、スプレッドシートをDB代わりにするのは大きなメリットがある。
決して使い方がわからないとか、面倒くさかったとかではない…。もちろん違う。
DBの代わりにスプレッドシートを使用するメリットとしては、
・学習コストが低い
・非エンジニアでも扱いやすい
といったものが挙げられる。
多量のデータを扱うには重たいといったデメリットは当然あるが、今回のようなシンプルな使い方なら、速度の差はほとんど体感出来なかった。
さっそくコードを貼っていく。
@handler.add(FollowEvent) def handle_follow(event): UserID = event.source.user_id add(UserID) line_bot_api.reply_message( event.reply_token, TextSendMessage(text="友だち追加ありがとう!"))
まずはBotの記述から。
もちろんこのまま貼り付けても動かないので注意。
コードはこちらを参考にしている。
さて、LINEBotでは、友達に追加された際にFollowEventが返される。
FollowEventには、次の情報が含まれている。
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA", "type": "follow", "timestamp": 1462629479859, "source": { "type": "user", "userId": "U4af4980629..." }
ここから、以下の一文でuserIdを抜き出して変数に格納できる。
alumi-mic
UserID = event.source.user_id
userIdを取得できたら、それをスプレッドシートに書き込む。
def add(userID): for i in range(1, 50): if worksheet.cell(i, 1).value == "": worksheet.update_cell(i, 1, userID) break else: continue return "ok"
僕のアプリケーションの都合でわかりづらいコードで申し訳ない。
友達から削除されたらUserIDを消す
さて、ブロックされたら当然ユーザーIDは削除しなければならない。
とはいえ、仕組みはほとんど同じなのでコードを貼るだけにしておく。
@handler.add(UnfollowEvent) def handle_unfollow(event): UserID = event.source.user_id remove(UserID) def remove(UserID): cell = worksheet.find(UserID) worksheet.update_cell(cell.row, cell.col, '') return "ok"
ブロックされたときには、UnfollowEventが返ってくる。
あとは全く同じである。
参考
最後駆け足になってしまったが、参考サイトをまとめておく。