mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Heroku - Ruby 製 Twitter Bot の運用!

[ プログラミング ] [ Heroku, Ruby ]

こんばんは。

Ruby で自作した Twitter Streaming を取得する Bot を動作させる方法についての記録です。

(当方、自宅サーバ派のため PaaS に精通している訳でもありません。ご承知おきください)

0. 前提条件

  • Ruby 2.1.5-p273 での作業を想定。
  • Heroku アカウント作成済み。
  • Git 導入済み。

1. 使用する Ruby スクリプト

tweetstream ライブラリを使用して Twitter の Public streams - sample を取得する例。

ts_test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#! /usr/local/bin/ruby
# coding: utf-8
# ---------------------------------------------------------
# Ruby script to get tweet statuses by tweetstream library.
# ---------------------------------------------------------
#
require 'tweetstream'

# Twitter OAuth keys ( from environment variables )
CONS_KEY = ENV['TW_CONS_KEY']
CONS_SEC = ENV['TW_CONS_SEC']
ACCS_KEY = ENV['TW_ACCS_KEY']
ACCS_SEC = ENV['TW_ACCS_SEC']

# Coniguring of TweetStream
TweetStream.configure do |config|
  config.consumer_key       = CONS_KEY
  config.consumer_secret    = CONS_SEC
  config.oauth_token        = ACCS_KEY
  config.oauth_token_secret = ACCS_SEC
  config.auth_method        = :oauth
end

# Instantiation
client = TweetStream::Client.new

# Getting Twitter streamings
client.sample do |item|
  # If "user" does not exist, go next.
  # If "user" exists, get "name", "screen_name", "text".
  next unless user = item.user
  name, screen_name, lang, text = user.name, user.screen_name, user.lang, item.text

  # If lang is not "ja", go next.
  next unless lang == "ja"
  # If a tweet sentense does not include specified strings, go next.
  #next unless text =~ /Ruby/

  # コンソール出力
  $stdout.puts "\n**** #{name} [ #{screen_name} ]"
  puts text
end

# Output error messages
client.on_error do |message|
  $stderr.puts "[ERROR] #{message}"
end

# Output reconnect messages
client.on_reconnect do |timeout, retries|
  $stderr.puts "[RECONNECT] timeout: #{timeout}, retires: #{retries}"
end

2. foreman ライブラリのインストール

プロセス管理に必要な foreman という RubyGems ライブラリをインストールする。

今回は RubyGems を Gemfile で管理しているので、Gemfile を編集する。

Gemfile
1
2
3
source 'https://rubygems.org'
gem 'tweetstream'
gem 'foreman'      # <= 追加

そして、インストール

1
$ bundle install

Gemfile を使用していないのなら、普通にインストールする。

1
$ sudo gem install foreman

3. foreman 設定ファイルの作成

foreman 起動時に “Procfile” に記述されたプロセス起動コマンドが実行されるので、 “Procfile” を作成する。

1
ts_test: bundle exec ruby ts_test.rb

4. 環境変数の設定(ローカル環境)

セキュリティの関係上 Ruby スクリプトに直接 Twitter 用の OAuth キー情報を記述せず、環境変数から取得することにしている。
環境変数を設定するためには “.env” ファイルに記述しておく必要があるようなので、 “.env” ファイルを作成する。

.env
1
2
3
4
TW_CONS_KEY=<your_consumer_key>
TW_CONS_SEC=<your_consumer_secret>
TW_ACCS_KEY=<your_access_token>
TW_ACCS_SEC=<your_access_token_secret>

5. プロセスの起動(ローカル環境)

ローカル環境で以下のコマンドを実行し、プロセスを起動してみる。

1
2
3
4
$ foreman start
23:18:01 ts_test.1 | started with pid 29102
23:18:01 ts_test.1 | The source :rubygems is deprecated because HTTP requests are insecure.
23:18:01 ts_test.1 | Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.

6. Git コミット

Git コミットしておく必要があるため、コミットする。

まず、

1
$ git init

.env はセキュリティの関係上 .gitignore に記述して除外するようにする。

.gitignore
1
.env

そして、ステージング、コミットする。

1
2
$ git add .
$ git commit -m "Initial commit."

7. Heroku アプリケーションの作成

名称を指定して Heroku アプリケーションを作成する。(当然 Heroku にログイン後)

1
2
3
4
$ heroku create heroku-ts-test
Creating heroku-ts-test... done, stack is cedar-14
https://heroku-ts-test.herokuapp.com/ | git@heroku.com:heroku-ts-test.git
Git remote heroku added

(以前は --stack cedar が必要だったが、現在はデフォルトなので指定する必要はない)

8. Heroku へのデプロイ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git push heroku master
       :
====< 省略 >====
       :

-----> Discovering process types
       Procfile declares types -> ts_test
       Default types for Ruby  -> console, rake

-----> Compressing... done, 17.3MB
-----> Launching... done, v4
       https://heroku-ts-test.herokuapp.com/ deployed to Heroku

To git@heroku.com:heroku-ts-test.git
 * [new branch]      master -> master

9. 環境変数の設定(Heroku 上)

.env
1
2
3
4
$ heroku config:set TW_CONS_KEY=<your_consumer_key>
$ heroku config:set TW_CONS_SEC=<your_consumer_secret>
$ heroku config:set TW_ACCS_KEY=<your_access_token>
$ heroku config:set TW_ACCS_SEC=<your_access_token_secret>

10. プロセスの起動(Heroku 上)

プロセスが1個だけ起動するように設定して起動する。

1
2
$ heroku scale ts_test=1
Scaling dynos... done, now running ts_test at 1:1X.

11. プロセスの動作確認(Heroku 上)

Heroku 上でプロセスが動作しているか確認する。

1
2
3
$ heroku ps
=== ts_test (1X): `bundle exec ruby ts_test.rb`
ts_test.1: up 2014/11/29 23:40:50 (~ 1m ago)

12. ログの確認(Heroku 上)

ログを確認してみる。

1
2
3
4
$ heroku logs --tail
            :
====< 延々と出力される >====
            :

13. プロセスの停止(Heroku 上)

起動中のプロセスを停止するには以下のようにする。(起動プロセス数を 0 にする)

1
2
$ heroku scale ts_test=0
Scaling dynos... done, now running ts_test at 0:1X.

当方は自宅サーバで運用することが多いですが、ものによっては Heroku で運用してもよいかなと思っています。

また、Heroku の Dyno プロセス無料枠が「750時間/月」なので、複数プロセスを運用する場合は注意する必要がありそうです。
一度もアイドル状態にならずに24時間1ケ月連続稼働だと744時間になので、1プロセスの連続稼働なら問題はなさそうですが。

以上。

Comments