Yahoo Blog APIを利用してみる

久しぶりにYahoo devのサイトを見てみたところYahoo Blog APIなるものが2010/3/4に追加されてたので、なんとなくRuby用クラスを作ってみました。

ただ、ブログ情報検索なのだから日付指定フィールドは欲しいところですね。。日付指定項目ってのがありますが、これは最近1週間のBlog情報とかだから個人的にはそんなに必要でなかったり。

下記はてきとーに作ったソースだったり

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

require 'open-uri'
require 'cgi'
require 'rexml/document'

# Yahoo Blog API用のクラス
class Yahoo_blog_search

  YAHOO_BLOG_SEARCH_URL = "http://search.yahooapis.jp/BlogSearchService/V1/blogSearch"
  APPID                 = "取得したAPPID"

  def initialize(query = "", results = 50, start = 1 , type = "all")

    @yahoo_api_query = ""    

    @query   = query
    @results = results
    @type    = type
    @start   = start

    @total_results_num = ""

    @raw_search_results_data   = ""
    @rexml_search_results_data = ""

    @search_results_data       = []
    @search_all_results_data   = []
  end

  ################# クエリの作成 + 実行 ##############################

  def build_query
    @yahoo_api_query = "#{YAHOO_BLOG_SEARCH_URL}?appid=#{APPID}&query=#{CGI.escape(@query)}&results=#{@results}&start=#{@start}&type=#{@type}"
  end

  def execute_query
    @raw_search_results_data = open(@yahoo_api_query) {|f| f.read }
    @rexml_search_results_data =  REXML::Document.new @raw_search_results_data
  end


  ################# 取得したデータから特定の情報を取得する関数群  ########
  def get_total_results_available
    @total_results_num = @rexml_search_results_data.elements["/ResultSet"].attributes["totalResultsAvailable"]
  end

  def get_total_results_returned
    @rexml_search_results_data.elements["/ResultSet"].attributes["totalResultsReturned"]
  end

  def get_first_result_position
    @rexml_search_results_data.elements["/ResultSet"].attributes["firstResultPosition"]
  end


  def get_processing_data
    @search_results_data.clear

    resultset = @rexml_search_results_data.elements["/ResultSet"]
    resultset.elements.each("Result") do |i|
      tmp_result = {}

      tmp_result["Id"]          = i.elements["Id"].text 

      tmp_result["RssUrl"]      = i.elements["RssUrl"].text

      tmp_result["Title"]       = i.elements["Title"].text

      tmp_result["Description"] = i.elements["Description"].text

      tmp_result["Url"]         = i.elements["Url"].text

      tmp_result["Creator"]     = i.elements["Creator"].text

      tmp_result["mobileLink"]  = i.elements["mobileLink"].text

      tmp_result["SiteTitle"]   = i.elements["Site/Title"].text

      tmp_result["SiteUrl"]     = i.elements["Site/Url"].text

      tmp_result["DateTime"]    = i.elements["DateTime"].text
      @search_results_data << tmp_result
    end
  end

  ################ 指定したクエリに関するブログ情報をすべて取得する ##################
  def get_all_processing_data

    @search_all_results_data.clear

    @results = 50
    @start   = 1

    build_query
    execute_query
    end_block = get_total_results_available.to_i / @results

    (0..end_block).each do |i|
      @start = 50 * i + 1 
      build_query
      execute_query
      get_processing_data
      #puts @search_results_data
      @search_all_results_data.concat @search_results_data
    end
    
    @search_all_results
  end

  # APIの実行結果に関する変数
  attr_reader :total_results_num, :search_results_data, :search_all_results_data
  # クエリの設定に関する変数
  attr_accessor :query, :results, :type, :start
end

if __FILE__ == $0

  yobj = Yahoo_blog_search.new("それはそれはそれは", 15, 3)
  
  yobj.build_query
  yobj.execute_query
  
  puts "検索結果数 " << yobj.get_total_results_available
  puts "取得したデータの数 " << yobj.get_total_results_returned
  puts "取得したデータの初めのインデックス " << yobj.get_first_result_position

  yobj.get_processing_data


  # 特定クエリに関するブログ情報を全て取得する 
  yobj.get_all_processing_data

  puts "取得したブログ数 " << yobj.search_all_results_data.size.to_s

  yobj.search_all_results_data.each do |i|
    puts "タイトル " << i["Title"]
  end

end

実行結果は以下のような感じです

検索結果数 84
取得したデータの数 15
取得したデータの初めのインデックス 3
取得したブログ数 84
タイトル 6月11日(金)のつぶやき                 

とりあえずgistに貼っつけますた。
rexml使ってるので多少遅いかと