Python×スプレッドシートAPIでユーザーIDの保存

2018-11-13

今回は、GoogleスプレッドシートとLINEBotを連携してユーザーIDを保存する方法についてまとめる。
随分記事の間が空いてしまっているが、この間にたくさん書くことが出来たので、時間作ってまとめていかねば。

もくじ

  1. GoogleスプレッドシートAPIの使い方
  2. Pythonの便利なライブラリgspread
  3. フォローイベントでUseIDを保存する
  4. 友達から削除されたらUserIDを消す
  5. 参考

GoogleスプレッドシートAPIの使い方

スプレッドシートを扱うためには、便利なAPIを利用する。
例によって認証が必要になるが、少しハマった点があった。

スプレッドシートAPIは、GmailAPIのときと異なり、スプレッドシートの共有先を設定しなければ認証がうまくできない。
スプレッドシートAPIの初期設定に関しては、非常にわかりやすくまとまっている記事があったので、リンクを貼っておく。

【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ

大まかな流れとしては、

①プロジェクトの作成
②APIの有効化
③認証情報の設定
④スプレッドシートの共有設定の変更

となる。
GmailAPIのときと比べ煩雑でやや苦労した。

Pythonの便利なライブラリgspread

スプレッドシートを扱う準備ができた所で、いよいよPythonのコードを書いていく。
初めは、Python Quickstart を参考に書いていたが、どうやら便利なライブラリがあるらしいということで、そちらに切り替えることにした。

今回使ったライブラリは、gspreadというライブラリ。
Python3対応で、タイトルやシート名でスプレッドシートを開けるなどという特徴がある。

使い方は簡単。
まずは仮想環境で以下のコマンドを実行する。
【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ

Python Quickstart

  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が返ってくる。
あとは全く同じである。

参考

最後駆け足になってしまったが、参考サイトをまとめておく。

・WEB
【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ

Python Quickstart

gspread

【もう迷わない】Pythonでスプレッドシートに読み書きする初期設定まとめ