HerokuにデプロイしたRubyアプリからGoogle Sheetsにアクセスする方法

前回の続き。

今回は作成したRubyのプログラムをHerokuにデプロイして実行する。そうすることによってHeroku Schedulerを使って定期的にプログラムを実行出来る。

まずはHeroku用のGemFileを作成。

でここに書かれているgemをインストールする。

するとGemfile.lockが作成される。

git関連の作業を行う。

これで準備完了。

後は

で実行できる。

Heroku上で定期的に実行したい場合はSchedulerを用いる。

これはブラウザを用いても出来る。

コマンド欄には

と入力し頻度を選択。

色々と応用出来る筈。

RubyアプリからGoogle Sheetsにアクセスする方法

以前、HerokuにデプロイしたRubyによるTwitterbot, Kotz’i’jでツイートへの返信を行う際に以前に読み込まれたツイートを除くため、最新のツイートIDを保存することとしたけどHeroku上のファイルはこの方法では更新されないことが判明。

代替策としてGoogle SheetsのシートにIDを保存し、毎回読み込みと更新することとした。

でその方法。

まずはGoogle APIsにアクセスし、

Sheets APIを選択。

利用規約に同意する。

プロジェクトの作成を促されるので従う。

プロジェクト名を決めて作成ボタンを押す。

APIを有効にする。

続いて認証情報を作成する。

色々選択肢があるけど、HerokuにデプロイしたアプリからAPIを呼び出す場合はその他のUIを選ぶと上手くいく筈。それからユーザーデータにアクセスするを選択。

OAuth2.0のクライアントIDを作成。

認証情報追加画面でメールアドレスを指定する。

下記の画面が現れるのでJSONをダウンロードし完了ボタンを押す。

このJSONはHerokuにデプロイするアプリがあるディレクトリに保存する。

Google SheetsのシートにアクセスするRubyでプログラムを作成することとなるけど、その前にアクセス用のGoogle Sheetsファイルを作成しておく。

また、テスト用に任意のセルに値を入れておく。

ファイルを作成したらそれを選択し、共有リンクを取得。

共有リンクのd/と/edit?の間の値がキーとなるので保存しておく。

google_driveのgemをインストール。

ここでバージョン指定しているのはTwitterbotとの関係でFaradayが問題を起こしてしまうから。

プログラムをこんな感じで書く。

初めて実行した時は下記のメッセージが現れるので指示に従う。

表示されたアドレスにアクセスすると許可を求められるので承認する。

許可すると認証コードが表示されるのでそれをコピペする。

これでシートへのアクセスが出来るはず。

次に先程セルに書き込んだ値を編集してみる。

これを実行すると:

Rubyからシートを編集出来た。

長くなったので今回はここまで。次回はこれをHerokuにデプロイして実行する方法を紹介する。

Kotz’i’jに恋して23: Twitterbotによる画像の投稿

TwitterbotのKotz’i’jはマヤの象形文字を中心とした画像も定期的に投稿する様にしている。現在は0~19までの数字と幾つかの象形文字をリストからランダムに選んで投稿しているけど、写真とかも加えていこうかな。

プログラムは何も難しいことは行う必要はない。

 

画像数が30以上あるため、ファイル名をリストとして別に保存してそれを読み込む形とした。これで大分コードがスッキリした。

Kotz’i’jに恋して22: 天気予報の取得

TwitterbotのKotz’i’jに定期的に天気予報のツイートをする機能を加えた。

色々やり方はあるけれど、今回は単純に現在時刻とKotz’i’jの出身地であるケツァルテナンゴ市カンテル市の天気予報へのリンクを貼り付けるだけ。なので新たなgemは必要無い。

これだけ。こんな風にツイートが出来る様になった。これをHerokuで一日3,4回ツイートする設定にした。

Kotz’i’jに恋して21: Kotz’i’j、キチェ語の先生になる

ツイッター・ボット、Kotz’i’jのリプライ機能を少し強化。これです。

スペイン語でCómo se dice と単語を入力し、その単語がリストにあるものと一致した場合、キチェ語に訳すというもの。簡単な辞書の様なものだ。

こんな感じで書いた。

一度返信したツイートに再度返信しないために、前回読み込み以降のツイートのみを読み込む様にするなどそれなりの工夫をした。

ポイントは

で今回の最新ツイートIDを取得し、

で保存。

これを次回min_idとして読み込み

前回読み込んだ以降のツイートのみを読み込む。こんな風にリプライしてくれる。 

だんだん進化してきた。次回は天気予報を定期的にロードする機能を取り入れたいなぁ。