12.31.2012

Scala: How to Create Countdown Twitter Bot

Scala: カウントダウンを行う Twitter ボットの作成方法

2ヶ月ほど前に、予備知識ゼロの状態から bot を作ってみた。その時のメモ。

 

使用したテクノロジー、サービス

 

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 を押下Create an application | Twitter Developers 2
    • 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: 画像にかかれた文字を入力
  • アプリケーションの登録に成功すると、以下のような画面が表示される。
     m
  • 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

随所に見られる日本へのリスペクトを感じさせてくれるデザインが嬉しい。
 Heroku | Login

 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 設定ファイルの作成

 

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 | Add ons

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

 

 

References

作ったもの
https://twitter.com/scalaconfjp_cd

ソース置き場
https://github.com/mogproject/scalaconfjp-countdown 

0 件のコメント:

コメントを投稿