2010-07-25
RubyでOauth認証のTwitter botを作ってみた
1時間でツイッターサービスを作ろう!という記事が人気ですね。
面白そうなのでBotだけど作ってみました。
カスペルスキーが発表しているレベル1〜4までのウィルス活動警告をスクレイピングで取得してきて、
ツイートし続けるBotです。
http://twitter.com/kaspersky_bot
目的
- Oauthを使ってみたい
- Rubyを書きたい
- 気分転換
- カスペルスキーを最近買った(`・ω・)
使うもの
Ruby本体
Ruby Gems - Oauth
Ruby Gems - Twitter
Ruby Gems - Mechanize
Installing
$ sudo gem install oauth $ sudo gem install twitter $ sudo gem install mechanize
Rubyとgemは既に入っているものとします。
Oauthを使ったツイートは、Ruby Twitter Gemのみで可能ですが、それに必要なtokenを取得するためにRuby Outh Gemを使用します。
このあたりの記事も参考になるかもしれません。
参考
Ruby Twitter Gem by John Nunemaker - Ruby Twitter Gem
rubytter と oauth を使う - アプリケーション登録からtoken取得まで
メモ
- 同じ内容のツイートをするとエラーになる
- ツイートの◯◯からの部分は、アプリケーション登録でつけたアプリケーション名になる
- 文字数はもちろん140文字
- mechanizeで取得したオブジェクトはString型に変換して扱う
- botプログラムはUTF-8
Oauthでツイートできるようになるまで
Ruby Twitter Gemでツイートするには、4つのキーが必要です。
oauth = Twitter::OAuth.new('consumer token', 'consumer secret') oauth.authorize_from_access('access token', 'access secret')
'consumer token', 'consumer secret'はアプリケーション登録時の値。
'access token', 'access secret'はirbで取得。
以下、上から順番にirbで叩いていきます。
OAuth::Consumer.newのパラメータにアプリケーション登録時に発行されたconsumer値を入れます。
$ irb require 'rubygems' require 'oauth' consumer = OAuth::Consumer.new( "consumer token", "consumer secret", :site => "http://twitter.com" ) request_token = consumer.get_request_token puts request_token.authorize_url # ここで出力されたURIにブラウザでアクセスして、Botからのアクセスを許可する →番号が表示される。 access_token = request_token.get_access_token(:oauth_verifier => '表示された番号') puts access_token.token →access tokenが出力される puts access_token.secret →access secretが出力される。
最後に出力された、access tokenとaccess secretをTwitter Gemのサンプルコードに埋め込みます。
コード
Kaspersky Labをスクレイピングして、ウィルスの活動警告を調べます。
問い合わせたところ、ウィルスの活動警告はレベル4までで英語と日本語サイトは連動しているとのこと。
#! /usr/bin/ruby -Ku #require 'kconv' #require 'oauth' require 'rubygems' require 'mechanize' require 'twitter' require 'date' # 時間を付与して、同じ文言による連投エラーを避ける。 date = Time.now.strftime("%H:%M:%S").to_s agent = Mechanize::new agent.user_agent_alias = "Windows IE 7" agent.get('http://www.securelist.com/en/') agent.page.encoding = "EUC-JP" # spanタグのmクラスの中から正規表現で「脅威レベル」の部分だけ抜き出す。 activity = agent.page.search('span.m').to_s activity = activity.scan(/Internet threat level:../) threat_level = activity[0].split(' ') # 脅威レベルの詳細は、http://www.securelist.com/en/alerts case threat_level[3] when "1" jp_message = "[ウィルス活動警戒レベル: 1]現在、主要な流行病、脅威、大事件はKaspersky Labでは記録されていません。" en_message = "[Threat level 1] The Internet threat alert status is currently normal." when "2" jp_message = "[ウィルス活動警戒レベル: 2] Kaspersky Labで未知のウィルスやマルウェアのサンプルが検出されています。注意してください。" en_message = "[Threat level 2] The Internet threat alert status is currently raised." when "3" jp_message = "[ウィルス活動警戒レベル: 3] コンピュータの重大な脆弱性を利用するマルウェアが発見されています。ウィルスソフトやコンピュータの定義ファイルを最新の状態にアップデートしてください。" en_message = "[Threat level 3] The Internet threat alert status is currently high." when "4" jp_message = "[ウィルス活動警戒レベル: 4] インターネットの脅威警戒状態は最高レベルです。感染力が非常に強いウィルス、マルウェアが活動しています。正しい方法で早急に対処してください。(http://www.viruslistjp.com/)" en_message = "[Threat level 4] The Internet threat alert status is currently critical.(http://www.securelist.com/en/)" else jp_message = "kaspersky_botは忙しいようです。" en_message = "kaspersky_bot is busy..." end # アプリケーション登録時に発行された、consumer値と先程取得したaccess値を入れる。 oauth = Twitter::OAuth.new('consumer token', 'consumer secret') oauth.authorize_from_access('access token', 'access secret') client = Twitter::Base.new(oauth) # ツイート! client.update(date + jp_message) client.update(date + en_message)
Rubyは勉強中です、PerlやPythonのTwitter botはどういうコードになるか気になるところ。

