Twitterのログを取ってみた

Twitterの最大の売りの1つは、APIがたくさん公開されていることらしい。

最近ちょっとRubyを勉強しているので題材として、Twitterの自分の発言・自分への言及を保存してみた。

Twitter検索ってのを使えばいいだけかと思いきや、自分の発言でも検索に引っかからないもの、発言が検索にまったく引っかからないアカウントもあった(なんかそういうものらしい)。

そんなわけで自分の発言と自分への言及を別々に取ってきたのをくっつけて、古い順にソートして、htmlのtableに変換しています。


ついったー(Twitter)発言まとめツールの結果のtableと比べて、URLと@hogeにリンクが貼られているようなものを吐き出します。

よい書き方とかはさっぱり分からないけど、とりあえず動いてはいる。

APIの仕様で、200件しか一度に取ってこられないみたいなので、200件溜まりそうになるたびに動かす必要がある。前に取ってきたものとマージ、とかは実装していない。

あと、Twitter4Rを若干書き換えた(参照:Twitter4Rでmentions APIを使う - gonpingyのフレッシュ日記)。

はじめてJSONなるものに触れたけど、XMLよりずっと便利なことが分かった!


その他参考にしたサイト:
Rubyでtwitter APIを使う: Kwappa開発室
Twitter API 仕様書
Route 477 - モナドって結局なんなの , gemcutterの使い方まとめ (2009年秋)


↓こんな感じ(replyが入っている部分を出したかったため、勝手に引用させていただいたきました。申し訳ございません)


# -*- coding: utf-8 -*-
require 'rubygems'
require 'twitter'
require 'json'
require 'time'

class TwitterApi
  # twitterのID / PASSWORD
  USERNAME = 'icchw'
  PASSWORD = '*****'

  # コンストラクタ
  def initialize
    @client = Twitter::Client.new(:login => USERNAME, :password => PASSWORD)
    @dir = "./twitter_log/"
    @t = Time.now.strftime("%Y_%m_%d_%H_%M")
    @file_j = @dir + @t + ".json"
    @file_h = @dir + @t + ".html"
  end
    
  # 結果を取得し、日時順にソートし、jsonファイルで保存する
  def sorted_json
    timeline = @client.timeline_for(:me, :count => 200)
    timeline += @client.timeline_for(:mentions, :count => 200)

    contents = []
    timeline.each do |status|
      contents << status.to_hash
    end

    contents.sort! {|a,b|
      a[:created_at] <=> b[:created_at]
    }

    File.open(@file_j, 'w') { |file|
      contents.each do |element|
        file.puts element.to_json
      end
    }
  end
  
  # 保存したjsonファイルを読み込んで、tableに変換してhtmlファイルを保存する
  def json2html
    File.open(@file_h, 'w') { |write|
      File.open(@file_j) { |read|
        write.puts %!<table class="twitter_log_tbl" style="border: none;">!
        read.each_line do |line|
          status = JSON.parse(line)
          write.puts %! <tr class="twitter_status" id="#{status["id"]}">!
          write.puts %!  <td class="twitter_image"><a href="http://twitter.com/#{status["user"]["screen_name"]}"><img src="http://img.tweetimag.es/i/#{status["user"]["screen_name"]}_n" width="48" /></a></td>!
          write.puts %!  <td class="twitter_text"><p>#{href(status["text"])}</p><p style="text-align: right;">#{status["user"]["screen_name"]}:&nbsp;<a href="http://twitter.com/#{status["user"]["screen_name"]}/statuses/#{status["id"]}">#{date2s(status["created_at"])}</a></p></td>!
          write.puts %! </tr>!
        end
        write.puts %!</table>!
      }
    }
  end

  def save_log
    sorted_json
    json2html
  end
  
  private
  # URLとアカウント名にリンクを貼る
  def href(text)
    text.sub!(/(http:.+)$/, '<a href="\1">\1</a>')
    text.gsub!(/@(\w+)/, '@<a href="http://twitter.com/\1">\1</a>')
    return text
  end
  
  # 日付をformat
  def date2s(created_at)
    Time.parse(created_at).strftime("%a,&nbsp;%Y/%m/%d&nbsp;%H:%M")
  end
end

if __FILE__ == $0
  twapi = TwitterApi.new
  twapi.save_log
end
C:\>ruby -v
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mswin32]

C:\>gem -v
1.3.5

C:\>gem list

*** LOCAL GEMS ***

columnize (0.3.1)
gemcutter (0.1.6)
json (1.1.9)
json_pure (1.1.9)
linecache (0.43)
net-scp (1.0.2)
net-ssh (2.0.15)
ruby-debug (0.10.3)
ruby-debug-base (0.10.3)
rubygems-update (1.3.5)
twitter4r (0.3.2, 0.3.1)