termtterでbuzztter検索プラギンを書きました

twitterの検索ってgoogle検索とかとも違う感じでかなり面白いと思っています。
リアルタイム性もそうなんですけど、内容も違いますし。
自分が使っているtermtterというtwitterクライアントには
sコマンドにでtwitterを検索する機能がついていて大変便利です。


twitterの検索は
日本語をキーにした検索をした時は日本人のpostばっかりなのですが
英語をキーにした検索をした時は英語のpostも混ざります。
自分は、日本語のpostだけから検索したい場合もあったので
何か会社も休みだったし、termtterからbuzztter検索をするプラギンを書いてみました。

# -*- coding: utf-8 -*-

require 'nokogiri'
require 'open-uri'
require 'digest/md5'

def buzztter_search_ja(q,language)
  uri = "http://buzztter.com/top/search_partial?q=#{q}&language=#{language}"
  html = open(URI.escape uri).read
  doc = Nokogiri::HTML.parse(html).xpath('/html/body/div/div')

  struct_user = Struct.new(:screen_name,:id)
  struct_status = Struct.new(:text,:id,:created_at,:user,:in_reply_to_status_id,:source)

  doc.map { |d|
    text = d.xpath('.//*[@class="description"]').text.gsub(/\n */,'')
    d.xpath('.//*[@class="taggedlink"]').to_html =~ /^.*http:\/\/twitter.com\/(.*)\/statuses\/([0-9]*).*title=\"(.*)\"/
    user = struct_user.new( $1,Digest::MD5.hexdigest($1).to_i(16) )
      
    struct_status.new(text,$2.to_i,$3,user)
  }
end

module Termtter::Client
  register_command(
    :name => :buzztter, :aliases => [],
    :exec_proc => lambda {|arg|
      statuses = buzztter_search_ja(arg,'ja')
      public_storage[:search_keywords] << arg
      output(statuses, :search)
    },
    :completion_proc => lambda {|cmd, arg|
      public_storage[:search_keywords].grep(/#{Regexp.quote(arg)}/).map { |i| "#{cmd} #{i}" }
    },
    :help => ["buzztter TEXT", "Search for Buzztter"]
  )
end


参考:
id:darashiさんのbuzztter検索コマンドのエントリ
http://d.hatena.ne.jp/darashi/20080827/1219863225