Twitterに投稿するスクリプト

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
  • 使い方

$ ruby twitter_api.rb メッセージ


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」とかを使って解析するってのもいいなー。色々改良点がある。