第38回 RubyでWeb API

RubyでWeb APIに挑戦

RubyでWeb APIを使ってみよう! がんばろう!

Net::HTTPを使ってWeb APIをたたくソース

require 'net/http';

Net::HTTP.version_1_2;

############################################################
#    URLを定義する
############################################################
url = { 
       :scheme => 'http',                # 今回使わない
       :server => 'api.twitter.com',
       :port   => 80,
       :path   => '/1/statuses/user_timeline.json',
       :query  => 'screen_name' + '=' + 'koduki'
      };

############################################################
#    接続してGETの結果を表示 
############################################################
begin
  Net::HTTP.start(url[:server], url[:port]) {|http|
    response = http.get(url[:path] + '?' + url[:query]);
    puts response.body;
  }
rescue Exception
  puts $!
end

ここまでの参考資料

るびま
http://twitool-box.net/api-viewer/
http://dev.twitter.com/doc/get/statuses/user_timeline
Net::HTTPの例外補足方法 - OVERT MEMO


受け取ったJSONをRubyオブジェクトにしよう

Ruby1.8ではJSONからRubyオブジェクトを作れるものが標準で入ってないようなので、gemで入れることにする。
いきなり gem が、

RROR:  While executing gem ... (Gem::RemoteSourceException)
    HTTP Response 302 fetching http://gems.rubyforge.org/yaml

と言って、こけた。
どうも、取りにいくサーバーが変わっちゃたみたいで、さらに取りいくサーバが変わっちゃったから update もままならないみたい。
じゃあどうするかというと、自分で、 gemのファイルを落としてきて、それを使ってアップデートするみたい。


参考:AIR - 覚書 Wiki*
   InstantRailsの悪夢 - asanonoの日記
   http://rubyforge.org/projects/rubygems/

上記参考通り、

ファイルのダウンロード後
$ sudo gem i rubygems-update-1.3.7.gem
$ sudo update_rubygems
$ sudo gem install json

でうまく 入ったみたい。

いきなりですがgemの使い方

入ったので、

require 'json';

したけど、ないといわれた。 そんな馬鹿な!。
なんとgemで入れたものは、ソースの最初に、

require 'rubygems';

って書かないとダメみたい。


参考:RubyGems の使い方 - WebOS Goodies

いよいよJSONで取得した文字列をオブジェクトに生成するソース

ここで、いよいよソースの掲載。
いやーはまった。はまった。
p で見ると日本語が16進数で見えちゃうんだもんな。どうしようかと思った。
putsで見ればちゃんと日本語で見えるのね。

参考:UTF8が16進文字列に化ける(変わる?) -教えてください。Nokogiriと- Ruby | 教えて!goo


では、ソースです。

require 'rubygems';
require 'net/http';
require 'json';


Net::HTTP.version_1_2;

############################################################
#    URLを定義する
############################################################
url = { 
       :scheme => 'http',                # 今回使わない
       :server => 'api.twitter.com',
       :port   => 80,
       :path   => '/1/statuses/user_timeline.json',
       :query  => 'screen_name' + '=' + 'koduki'
      };

############################################################
#    返ってきたJSONをパースして生成されたオブジェクト用変数
############################################################
res_obj = nil;

############################################################
#    接続してGETの結果を取得
############################################################
begin
  Net::HTTP.start(url[:server], url[:port]) {|http|
    res_obj = JSON.parse( http.get(url[:path] + '?' + url[:query]).body );
  }
rescue Exception
  puts $!
end

############################################################
#    取得したオブジェクトを表示 
############################################################
puts res_obj;

ということでkoduki君の最新20件の発言を表示するのはこれだ

紅月さん@がんばらない (@koduki) | Twitter

require 'rubygems';
require 'net/http';
require 'json';


Net::HTTP.version_1_2;

############################################################
#    URLを定義する
############################################################
url = { 
       :scheme => 'http',                # 今回使わない
       :server => 'api.twitter.com',
       :port   => 80,
       :path   => '/1/statuses/user_timeline.json',
       :query  => 'screen_name' + '=' + 'koduki'
      };

############################################################
#    返ってきたJSONをパースして生成されたオブジェクト用変数
############################################################
res_obj = nil;

############################################################
#    接続してGETの結果を取得
############################################################
begin
  Net::HTTP.start(url[:server], url[:port]) {|http|
    res_obj = JSON.parse( http.get(url[:path] + '?' + url[:query]).body );
  }
rescue Exception
  puts $!
end

############################################################
#    koduki君の最新20件を表示
############################################################
puts res_obj.map{|item| item['text']}.join("\n");

サーバ構築

サーバ構築に関するページも作成しました。
プログラムを動かす環境がないというかたは、検討してみてはいかがでしょうか。
http://www.x-shenwu.net/~home_page/sakura_vps/