Scala: カウントダウンを行う Twitter ボットの作成方法
2ヶ月ほど前に、予備知識ゼロの状態から bot を作ってみた。その時のメモ。
使用したテクノロジー、サービス
- Twitter: 言わずと知れた世界最大規模の短文投稿サービス。
https://twitter.com/ - Scala: JVM上で動く、超クールな Object-Functional プログラミング言語。
http://www.scala-lang.org/ - sbt: 今や Scala 開発におけるデファクトスタンダードとなっているビルドツール。
http://www.scala-sbt.org/ - Twitter4J: 最もメジャーな TwitterAPI の Java ラッパ。
http://twitter4j.org/ja/index.html - heroku: 様々な言語に対応したクラウド PaaS 環境。無料で使える。
http://www.heroku.com/ - git: オープンソースの分散型バージョン管理システム。herokuとの連携に使用。
http://git-scm.com/
1. TwitterAPI の設定
まずは、Twitter 側の環境セットアップから。
1.1 アカウント開設
bot 用の新規アカウントを作成する。
ユニークなメールアドレスの登録が必要だが、gmail のアカウントを持っているなら
ドットの位置を変えたり、エイリアスを付けることで同じメールアカウントを共有できるので便利だ。
https://support.google.com/mail/bin/answer.py?hl=en&answer=10313
http://support.google.com/mail/bin/answer.py?hl=en&answer=12096
1.2 認証用トークンの取得
TwitterAPIに接続するためには、OAuth認証を行う必要がある。そのための準備。
- 以下のURLを開く
https://dev.twitter.com/apps/new - 先ほど作成したアカウントでサインイン
- 必要な情報を入力して Create your Twitter application を押下
- Application Details -> Name: ユニークなアプリケーション名 (32文字以内)
ツイートの「○○から」(via ○○) の部分に使用される。日本語可。 - Application Details -> Description: アプリケーションの説明 (10文字〜200文字)
- Application Details -> Website: WebサイトのURL
ツイートの 「○○から」(via ○○) のリンクとして使用される。 - Application Details -> Callback URL: コールバックURL
ブラウザアプリケーションの場合は必要だが、今回は
クライアントアプリケーションなので ブランクのままとする。 - Developer Rules of the Road: (規約を読んでから) Yes, I agree にチェックする
- CAPTCHA: 画像にかかれた文字を入力
- アプリケーションの登録に成功すると、以下のような画面が表示される。
- OAuth アクセス権限の変更
デフォルトでは Read only となっているため、このままではツイートの作成ができない。
Settings タブ -> Application Type -> Access を Read and Write に変更し、
Update this Twitter application's settings ボタンを押下。 - アクセストークンの取得
Detail タブに戻り、Your access token -> Create my access token ボタンを押下。
Access level が Read and Write と表示されていることを確認。 - 以下の4種類のパラメータを、後ほどアプリケーションから指定することとなる。
- OAuth settings -> Consumer key
- OAuth settings -> Consumer secret
- Your access token -> Access token
- Your access token -> Access token secret
2. 開発環境の準備
このチュートリアルに従って、環境のセットアップを行う。
https://devcenter.heroku.com/articles/scala
2.1 Scala のインストール
公式サイト、パッケージ管理システムなどからパッケージをダウンロードし、インストール。
詳細は割愛する。
http://www.scala-lang.org/downloads
2.2 sbt のインストール
こちらも公式サイト、パッケージ管理システムなどからパッケージをダウンロードし、インストールする。
ただし、必ず heroku でサポートされているバージョンを導入すること。
https://devcenter.heroku.com/articles/scala-support#build-behavior
手動インストールを行う場合は、jar ファイルと起動スクリプトを設置すればよい。
http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html
2.3 JDKの準備
OpenJDK バージョン6 上で動作させること。
2.4 heroku アカウントの作成
下記のページからメールアドレスを登録するだけで heroku を利用できる。
https://api.heroku.com/signup
随所に見られる日本へのリスペクトを感じさせてくれるデザインが嬉しい。
2.5 heroku toolbelt のインストール
下記のURLから heroku toolbelt をインストールする。
https://toolbelt.heroku.com/
heroku toolbelt とは、以下の3つのツールが同梱されたパッケージである。
- Heroku client: heroku 管理用のCLIツール
- Foreman: Procfile ベースのプロセス管理ツール
- Git
3. sbtプロジェクトの作成
sbt 用のディレクトリおよび設定ファイルの作成を行う。
3.1 ディレクトリの作成
以下のような構成でディレクトリを作成する。
プロジェクトディレクトリ ├── project └── src └── main └── scala
3.2 設定ファイルの作成
- project/build.properties
sbt のバージョンを明示的に指定する。
(例) https://github.com/mogproject/scalaconfjp-countdown/blob/master/project/build.properties - project/plugins.sbt
必要に応じて、プラグインの定義を個別ファイルに記述することもできる。
(例) https://github.com/mogproject/scalaconfjp-countdown/blob/master/project/plugins.sbt - build.sbt
プロジェクトディレクトリ直下に配備。
アプリケーションの名前や、Scala のバージョン、Twitter4J の指定などを行う。
(例) https://github.com/mogproject/scalaconfjp-countdown/blob/master/build.sbt
4. プログラム作成
いよいよプログラム本体の作成に入る。
4.1 ソースコードの作成
プロジェクトディレクトリ/src/main/scala 配下に Scalaプログラムのソースを作成する。
色々と改善の余地はあると思うが、できたものはこんな感じ。
https://github.com/mogproject/scalaconfjp-countdown/blob/master/src/main/scala/ScalaConfJPCountDown.scala
仕様
- OAuth認証のパラメータは全て環境変数に設定することとし、tweet() という関数を定義。
- java の Calendar クラスを利用して現在の日時を取得。
カウントダウンの目的の日との日数の差を求め、その値によって異なるメッセージをツイートする仕様。
注意点
- heroku の日時は UTC で得られるので、それを前提に実行時間の計算ロジックを作ること
- TwitterAPI の制約に注意
- 同一のメッセージは "Status is a duplicate." エラーとなり、受け付けられない
- レート制限 (TwitterAPI v1.0 では、OAuth接続の場合 350コール/時)
https://dev.twitter.com/docs/rate-limiting
4.2 ローカル環境変数の設定
プログラム中で参照するOAuth認証のための環境変数をローカルマシン上で設定する。
- CONSUMER_KEY
- CONSUMER_SECRET
- ACCESS_TOKEN
- ACCESS_TOKEN_SECRET
4.3 sbt 実行テスト
この段階でローカルで sbt からプログラムを実行できるようになる。
プロジェクトディレクトリにて、以下のコマンドを実行する。
- ビルド
初回はダウンロードなどが行われるので時間がかかる。
$ sbt clean compile stage
- 実行
$ sbt run
5. foreman の設定
プロジェクトディレクトリ直下に Procfile というファイルを作成する。
本来はWebサービスなどのプロセスを指定するのだが、今回の用途はバッチ処理のみなので
行頭に # を付けて内容をコメントアウトする。
(例) https://github.com/mogproject/scalaconfjp-countdown/blob/master/Procfile
6. git リポジトリの作成
heroku を利用する前に、ローカルに git リポジトリを作成する。
6.1 .gitignore ファイルの作成
プロジェクトディレクトリ直下に .gitignore ファイルを作成し、git の管理対象としないファイルの定義を行う。
ひとまずこんな感じで指定。(おそらく管理対象外とすべきファイルは他にもあると思われる)
https://github.com/mogproject/scalaconfjp-countdown/blob/master/.gitignore
最終的に、ファイル構成はこのようになった。
プロジェクトディレクトリ ├── .gitignore ├── Procfile ├── build.sbt ├── project │ ├── build.properties │ └── plugins.sbt └── src └── main └── scala └── (クラス名).scala
6.2 リポジトリの作成
プロジェクトディレクトリ直下で以下のコマンドを実行し、最初のコミットを行う。
$ git init $ git add . $ git commit -m "init"
7. heroku アプリケーションの作成
プログラムを heroku へデプロイし、スケジュール実行の設定を行う。
7.1 アプリケーションの新規作成
プロジェクトディレクトリ直下で以下のコマンドを実行する。
$ heroku login Enter your Heroku credentials. Email: Password (typing will be hidden): Authentication successful. $ heroku create
アプリケーションの名前は一意のものがランダムに設定される。(後で変更可能)
7.2 資源のデプロイ
リモートリポジトリ heroku は自動的に設定されているため、以下のコマンドを行うだけでよい。
$ git push heroku master
7.3 heroku 環境変数の設定
heroku 上での環境変数を設定するため、heroku config:add コマンドを実行する。
(実行例)
$ git config:add CONSUMER_KEY=xxxxxxxxxxxxxxxxxxxxxx $ git config:add CONSUMER_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx $ git config:add ACCESS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx $ git config:add ACCESS_TOKEN_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
7.4 手動実行テスト
ここで、heroku 上でのプログラム実行テストが可能となる。
heroku run コマンドを行えばよい。
$ heroku run 'target/start (クラス名)'
7.5 スケジュール設定
heroku のアドオンである Heroku Scheduler を利用する。
heroku dashboard (heroku のサイトへログインした後の画面) から、Add-ons をクリックすれば
アドオンの選択画面に入る。
Utilities -> Heroku Scheduler を選択し、登録を行う。
Heroku Scheduler 自体は無料のアドオンであるが、この時クレジットカードの登録を要求される。
登録が終わったら heroku dashboard に戻り
Apps -> 今回作成したアプリケーション -> Resources -> Add-ons -> Heroku Scheduler Standard と選択していく。
Add job… ボタンを押下し、
コマンド(target/start (クラス名))、頻度(10分おき/1時間おき/1日おき)、実行時間
を選択して Save すればスケジュール設定完了。
時間の指定は UTC となる。
8. heroku の運用
運用中の heroku コマンド。実行時にはログインが必要である。
プロジェクトディレクトリ直下でコマンドを実行すれば、アプリケーションの指定(--app)を省略できる。
8.1 アプリケーション一覧の参照
$ heroku apps === My Apps xxx yyy zzz
8.2 ログの参照
$ heroku logs
8.3 プロセス状態の参照
$ heroku ps
今回のプログラムに関しては、Webサービスではないので常駐プロセスは存在しない。
8.4 コンソールの操作
bash
$ heroku run bash
sbt コンソール
$ heroku run sbt console
0 件のコメント:
コメントを投稿