発言駆動日記

何事も発言駆動な日記。HDD

RubyでTwitter Bot作ろうとしたら、いろいろと勉強になりました。

twitter botの基本構成ができるまでの作成手順をざざっと書きました。

1. レンタルサーバ

【VPS】 ServersMan » ServersMan@VPS
【プラン】Entryプラン (¥490/月)
【OS】 Cent OS
【パッケージ】 ディスクパッケージ(標準パッケージ)

2. サーバ環境構築

リモートサーバログイン

OS Xのターミナルで下記を実行

ssh -l <ログイン名> <ホスト名(IPアドレス)> -p <ポート番号>
gccのインストール

サーバ上で下記のコマンドを実行

yum install -y gcc
Rubyのインストール

サーバ上で下記のコマンドを実行

$ mkdir ~/sources
$ cd ~/sources
$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p330.zip
$ unzip ruby-1.8.7-p330.zip
$ cd ruby-1.8.7-p330
$ ./configure
$ make
$ make install
RubyGemのインストール
$ yum install -y zlib-devel
$ cd ~/sources/ruby-1.8.7-p330/ext/zlib
$ ruby extconf.rb
$ make
$ make install

$ cd ~/sources
$ wget http://rubyforge.org/frs/download.php/70697/rubygems-1.3.7.zip
$ unzip rubygems-1.3.7.zip
$ cd rubygems-1.3.7
$ ruby setup.rb
$ gem –version
TwitterGemのインストール

下記のコマンドを実行

$ gem install twitter

3. bot用のtwitterアカウントの取得

Twitter

4. twitterアプリケーション登録

申請

Sign in with your Twitter account | Twitter Developers
Application Ditails に下記を入力
【Name】botの名前
【Description】説明(10文字以上)
【WebSite】ブログのURLなど
【Callback URL】ブログのURLなど(オプション)

設定

Home>>My Application>>自分のアプリで下記を設定
【Settings】 Application TypeをRead and Writeに設定
【Details】Access Tokenを取得(Create my access token ボタンを押下)
【OAuth tool】Consumer key, Consumer Secret, Access Token, Access Token Secret を確認。

5. OAuth認証用のライブラリのインストール

サーバ上で下記のコマンドを実行

$ gem install oauth

$ yum install openssl-devel
$ cd ~/sources/ruby-1.8.7-p330/ext/openssl
$ ruby extconf.rb
$ make
$ make install

6. twitter bot の作成

サーバ上で下記のコマンドを実行

$ cd ~/

$ wget https://raw.github.com/rnurakami/Susie/master/tweet.rb
$ sed -i -e "s/YOUR_CONSUMER_KEY/あなたのCONSUMER_KEY/g" tweet.rb
$ sed -i -e "s/YOUR_CONSUMER_SECRET/あなたのCONSUMER_SECRET/g" tweet.rb
$ sed -i -e "s/YOUR_OAUTH_TOKEN/あなたのACCESS_TOKEN/g" tweet.rb
$ sed -i -e "s/YOUR_TOKEN_SECRET/あなたのACCESS_TOKEN_SECRET/g" tweet.rb

$ cat tweet.rb

tweet.rbの中は下記の通り

require 'rubygems'
require 'twitter'

CONSUMER_KEY       = "YOUR_CONSUMER_KEY"
CONSUMER_SECRET    = "YOUR_CONSUMER_SECRET"
ACCESS_TOKEN        = "YOUR_OAUTH_TOKEN"
ACCESS_TOKEN_SECRET = "YOUR_TOKEN_SECRET"

Twitter.configure do |config|
  config.consumer_key       = CONSUMER_KEY
  config.consumer_secret    = CONSUMER_SECRET
  config.oauth_token        = ACCESS_TOKEN
  config.oauth_token_secret = ACCESS_TOKEN_SECRET
end

Twitter.update('bot: "Hello World!"')

tweet.rb を実行

$ ruby tweet.rb

twtterに「bot: "Hello World!"」とつぶやかれていれば成功。

8. JSONライブラリのインストール

サーバ上で下記のコマンドを実行

$ gem install json

9. 雛形をダウンロード

サーバ上で下記のコマンドを実行

wget https://raw.github.com/rnurakami/Susie/master/userstreamtweet.rb

若干長めですが、userstreamtweet.rb の内容は下記の通り

# coding: utf-8

require 'rubygems'
require 'net/https'
require 'twitter'
require 'oauth'
require 'json'
require 'pp'

class MyBot
  CONSUMER_KEY       = "YOUR_CONSUMER_KEY"
  CONSUMER_SECRET    = "YOUR_CONSUMER_SECRET"
  ACCESS_TOKEN        = "YOUR_OAUTH_TOKEN"
  ACCESS_TOKEN_SECRET = "YOUR_TOKEN_SECRET"

  MY_SCREEN_NAME = "YOUR_SCREEN_NAME"

  BOT_USER_AGENT = "my bot @#{MY_SCREEN_NAME}"

  HTTPS_CA_FILE_PATH = "./verisign.cer"

  def initialize
    @consumer = OAuth::Consumer.new(
      CONSUMER_KEY,
      CONSUMER_SECRET,
      :site => 'http://twitter.com'
    )
    @access_token = OAuth::AccessToken.new(
      @consumer,
      ACCESS_TOKEN,
      ACCESS_TOKEN_SECRET
    )
  end

  def connect
    uri = URI.parse("https://userstream.twitter.com/2/user.json?track=#{MY_SCREEN_NAME}")

    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    https.ca_file = HTTPS_CA_FILE_PATH
    https.verify_mode = OpenSSL::SSL::VERIFY_PEER
    https.verify_depth = 5
    pp https

    https.start do |https|
      request = Net::HTTP::Get.new(uri.request_uri)
      request["User-Agent"] = BOT_USER_AGENT
      request.oauth!(https, @consumer, @access_token)

      buf = ""
      https.request(request) do |response|
        response.read_body do |chunk|
          buf << chunk
          while(line = buf[/.+?(\r\n)+/m]) != nil
            begin
              buf.sub!(line,"")
              line.strip!
              status = JSON.parse(line)
            rescue
              break
            end

            yield status
          end
        end
      end
    end
  end

  def run
    loop do
      begin
        connect do |json|
          if json['text']
            user = json['user']
	    pp json['text']
            if(json['text'].matche(/^@#{MY_SCREEN_NAME}/))
              @access_token.post('/statuses/update.json',
                'status' => "@#{user['screen_name']} Hay!",
                'in_reply_to_status_id' => json['id']
              )
              puts "success update!"
            end
          end
        end
      rescue Timeout::Error, StandardError
        puts "Twitterとの接続が切れた為、再接続します"
      end
    end
  end
end

if $0 == __FILE__
  MyBot.new.run
end

実行する為には、下記のCA認証局の証明書が必要

 HTTPS_CA_FILE_PATH = "./verisign.cer"

10. 証明書の取得

証明書

1. FireFoxhttps://userstream.twitter.com/2/user.json にアクセスする。
2. メニューバー>ツール>ページの情報 を開く
3. セキュリティ>証明書を表示... を開く
4. 詳細>書き出す... を開く
5. ファイル形式に「証明書パスを含む X.509 証明書 (PEM)」を選択して保存(ファイル名は verisigin.cer にしました)

サーバへアップロード

OS Xターミナル上で下記のコマンドを実行

$ cd 証明書のあるディレクトリ
$ sftp -oPort=<ポート番号> <ログイン名>@<ホスト名(IPアドレス)>
$ put verisign.cer
$ ls

11. Stream API を使った twitter bot の実行

リモートサーバ上で、userstreamtweet.rb を実行(YOUR_CONSUMER_KEY等を書き換えた上で)

$ ruby userstreamtweet.rb

別のtwitterアカウントからbotへMension(@付きでつぶやく)して、
botから「Hay!」と reply があれば成功