Hatena::ブログ(Diary)

Elecnotes

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を使用します。

このあたりの記事も参考になるかもしれません。

MacPortsとRubyGemsのインストールまとめ

UbuntuサーバーでWWW::Mechanizeを使う

参考

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はどういうコードになるか気になるところ。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証