APIをさわったことがないので、練習にさわってみました。練習台はTwitter。
APIの仕様
-
- 認証
認証
public_timeline の取得を除くすべての API で、BASIC認証を使用する。BASIC認証で使用するユーザ名はメールアドレスになる。
(訳者による注記: 現在は、スクリーン名も使える)
-
- 投稿
update
自分のステータスを更新(update)する。引数 status は必須。
この API は必ず POST を使って発行すること。update が成功した場合は、format で指定した形式で応答が返るURL: http://twitter.com/statuses/update.format
(format は xml, json のうちのいずれかを指定)引数:
status=ステータス (必須)
ステータス(発言、投稿内容)を指定する。必ず URL エンコードすること。
ステータスは 160バイト以内におさめること。ただし、140バイトを超えた部分は必ずしも表示される保証はない。
おぉ。シンプルですね。そもそも、APIはリクエスト送って、それに対して結果がXMLとかJSONとかで返ってくるってだけだもんな。APIって言葉に難しさを感じていた気がする。実際は超シンプル。
投稿スクリプト
require 'base64' require 'net/http' require 'nkf' require 'uri' Net::HTTP.version_1_2 ADDRESS = 'your mailaddress' PASSWORD = 'your password' BASE_URI = 'twitter.com' def url_encode(params) encoded = params.keys.inject({}){|h, k| h.merge(k => URI.encode(params[k]))} encoded.keys.zip(params.values).map{|i| i.join('=')}.join('&') end def call(api, params = {}) res = nil Net::HTTP.start(BASE_URI) do |http| res = http.post( "/#{api}.xml", url_encode(params), {"Authorization" => "Basic " + Base64.encode64("#{ADDRESS}:#{PASSWORD}")} ) end case res when Net::HTTPOK res.body else raise "API Error" end end def post(message) begin call('statuses/update', "status" => NKF.nkf("-w", message)) p "Posted" rescue p "Posted unsuccessfully" end end if message = ARGV[0..-1].join('') post(message) end
- 使い方
url_encodeが汚くなった。Net::HTTP::Post使えばこんな風に書けるな。今回は、Basic認証も学びたかったので直書きした。
def post(message) req = Net::HTTP::Post.new('/statuses/update.xml') req.basic_auth(ADDRESS, PASSWORD) req.set_form_data("status" => to_utf8(message)) Net::HTTP.start(BASE_URI) do |http| res = http.request(req) end end
あと、エラーをpost メソッドでキャッチしてるのが微妙。これだと、API増えるたびにエラーを補足する羽目になるな。レスポンスを「rexml/document」とかを使って解析するってのもいいなー。色々改良点がある。