Hatena::ブログ(Diary)

Moderation is a fatal thing. Nothing succeeds like excess.

2011/12/29(Thu) 

twitter bot 認証用スクリプト

年の瀬もせまり何かと忙しい時期だと思いますが、なぜか急にツイッターボットを書きたくなりました。調べたら昔と違ってあれこれ面倒だったので備忘録をかねてメモ書きしておきます。

準備

oauth と twitter を使うので入ってない場合は、gem install oauth twitter して入れておきます。

次にここからボット用アプリケーションの登録をします。

f:id:kenkitii:20111229030558p:image:w300

必要事項を入力し↑[Create your Twitter application]ボタンクリックします。無事に登録できたら[Setting]タブを開き

f:id:kenkitii:20111229030559p:image:w300

[Application Type] のところを Read and Write に変更し↑設定を保存します。ついでに、アプリケーションアイコン画像自分のお気に入りの画像に設定しておきましょう。[Detail]タブの Access level が Read and write になってるのを確認し、Consumer Key、Consumer secret を表示させておきます。

bot アプリの認証作業

以下のやっつけスクリプトを実行します。

# -*- coding: utf-8 -*-
require 'rubygems'
require 'oauth'

print "Input ConsumerKey :"
ConsumerKey = STDIN.gets.chomp
print "Input ConsumerKeySecret :"
ConsumerKeySecret = STDIN.gets.chomp

consumer = OAuth::Consumer.new(ConsumerKey, ConsumerKeySecret, :site => "http://twitter.com")
request_token = consumer.get_request_token
system("open #{request_token.authorize_url}")

print "Input PIN-CODE :"
pincode = STDIN.gets.chomp
access_token = request_token.get_access_token(:oauth_verifier => pincode)

puts <<EOF
# -*- coding: utf-8 -*-
require 'rubygems'
require 'twitter'
 
Twitter.configure do |config|
  config.consumer_key       = "#{ConsumerKey}"
  config.consumer_secret    = "#{ConsumerKeySecret}"
  config.oauth_token        = "#{access_token.token}"
  config.oauth_token_secret = "#{access_token.secret}"
end
 
Twitter.update("ツイッターへの投稿テストなう〜")
EOF

スクリプトを実行すると、Consumer Key と Consumer secret を求められるので入力すると PINコードの入力待ちになり、ブラウザで認証画面が開きます↓

f:id:kenkitii:20111229030600p:image:w300

認証ボタンを押すとブラウザに PINコード が表示され、その PINコードを入力すると、サンプルコードが表示されますので、適当ファイルにコピペして実行してみましょう。「ツイッターへの投稿テストなう〜」とつぶやくはずです↓

実行結果

どうぞごりようください!

2011/12/07(Wed) 

ワンライナー覚え書き

とある blogspot.com の過去記事を一括ダウンロードしたいなー、と思いちょろっとググったらこんなスクリプトを書いてる人がいました。

wget -q -O- "http://google.blogspot.com" | grep "archive.html" | sed -e 's/>[^<]*<//g' | sed -e "s/<a\ class='post-count-link' href='//g" | sed -e "s/'\/a>//g" | xargs wget -np -nc -l 1 -r

おおーこりゃ便利!!と、あっさり当初の目的は達成できたわけですが、sed の部分が気に入らないちょっくら ruby で書き直そう・・・などと強引に慣れないワンライナーで済まそうとアチコチぐぐって時間を浪費しうまく動かなくて、ワンライナーにするためのスクリプト書いて検証しちゃったりして(←よくあるパターン)、もう目的の過去記事のダウンロード終わってるのにまだスクリプトいじってて、嫌になったので重い腰をあげていつも調べてることをメモっとく。

コマンドラインオプション*1

-e文字列をスクリプトとして解釈させる。必須
-n一行ずつ処理する。
-p一行ずつ処理した後、print $_ してくれる。
-rライブラリを読み込む。require 'rubygems' したいときは、-rubygems とか書くとスタイリッシュ(かも)。

ワンライナーの書き方忘れてたらざっと読む

http://www.fepus.net/ruby1line.txt

ついでに wget のオプション*2

-nc-no-clobber既にファイル存在する場合はダウンロードで既存ファイルを上書きしない。
-O--output-document=FILEダウンロードした内容をFILEに出力する。
-r--recursive再帰ダウンロードを行う。
-l--level=NUMBER再帰ダウンロード時の最大階層深度をNUMBERに設定する。
-np--no-parent親ディレクトリ(フォルダ)を対象外にする。
-N--timestampingタイムスタンプ比較して、ローカルに既に存在するファイルよりも新しいファイルだけを取得する。

微妙な出来・・

ruby -ropen-uri -e "puts open('http://google.blogspot.com').select{|e|e=~/archive.html/}.map{|e|e.scan(/'([^']+)'/)[1]}" | xargs wget -np -nc -l 1 -r

*1:よく使うのだけ

*2:よく使うのだけ

2011/09/14(Wed) 

twitter をいじるメモ

書き捨てコードをメモっておきます

# -*- coding: utf-8 -*-
# sample.rb
require 'open-uri'
require 'rubygems'
require 'nokogiri'

user = "kenkiti"
url = "https://api.twitter.com/1/users/lookup.xml?screen_name=#{user}"
doc = Nokogiri::XML(open(url))

doc.xpath("//user/status").each do |node|
 p node.xpath("source")
end

実行結果↓

/Users/kenkiti/temp% ruby sample.rb
"<a href=\"http://itunes.apple.com/us/app/twitter/id409789998?mt=12\" rel=\"nofollow\">Twitter for Mac</a>"