RubyでTwitter Bot作ろうとしたら、いろいろと勉強になりました。
twitter botの基本構成ができるまでの作成手順をざざっと書きました。
1. レンタルサーバ
【VPS】 ServersMan » ServersMan@VPS
【プラン】Entryプラン (¥490/月)
【OS】 Cent OS
【パッケージ】 ディスクパッケージ(標準パッケージ)
2. サーバ環境構築
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アカウントの取得
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!"」とつぶやかれていれば成功。
7. Streaming API を使用したtwitter botの作成
User Stream API とは... TwitterのUser Stream API を実験導入した3つのTwitterクライアントソフトウェアで、速さを体験する(MAC お宝鑑定団 blog(羅針盤)) - エキサイトニュース
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. FireFoxで https://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 があれば成功
すごく参考にしたブログ
2012-01-11 - ギークに憧れて
30分で誰でも作れるTwitter Bot開発・運用手順 – Ruby Twitter bot - はるかなる熊
MacOSXのターミナルでSSH接続 | dicecream:blog
ServersManのサーバへMacのターミナルからssh接続する方法 - 29歳からはじめるWebプログラミング
Ruby+User Stream APIで無言リプライに高速返信するbotを作りました - でぶぬる日記
[Ruby]HTTPSでサーバーに接続 - うなの日記
RubyでHTTPS接続する際に必要になる証明書の取得について - oTheRwoRld
Ruby から Twitter API を使用するサンプル (SSL / Basic 認証) - vivid memo
SSHマニュアル
sftpで接続先ポート番号を指定して接続(UNIX) - Ryota’s Research Diary
データ構造を確認するpメソッドとppメソッド - Ruby入門勉強ルーム