Ruby から multipart/form-data を OAuth で POST する
Twitter の背景画像を日替わりで変えたくてAPIを叩こうと思い、ググったところ失敗報告しか見つからなかったけど、適当にコピペしてたら出来た。
require 'open-uri' require 'rubygems' require 'oauth' $CONSUMER_KEY = 'xxxxxxxx' $CONSUMER_SECRET = 'xxxxxxxxxxxxxxxx' $consumer = OAuth::Consumer.new( $CONSUMER_KEY, $CONSUMER_SECRET, :site => 'http://api.twitter.com' ) $ACCESS_TOKEN = 'xxxx-xxxxxxxx' $ACCESS_TOKEN_SECRET = 'xxxxxxxxxxxxxxxx' $access_token = OAuth::AccessToken.new( $consumer, $ACCESS_TOKEN, $ACCESS_TOKEN_SECRET ) url = URI.parse("http://api.twitter.com/1/account/update_profile_background_image.json") Net::HTTP.new(url.host, url.port).start do |http| req = Net::HTTP::Post.new(url.request_uri) req["content-type"] = "multipart/form-data; boundary=myboundary" body = "" body.concat("--myboundary\r\n") body.concat("content-disposition: form-data; name=\"image\"; filename=\"bgimage.jpg\"\r\n") body.concat("\r\n") File::open("bgimage.jpg"){|f| body.concat(f.read + "\r\n") } body.concat("--myboundary\r\n") body.concat("content-disposition: form-data; name=\"tile\";\r\n") body.concat("\r\n") body.concat("true\r\n") body.concat("--myboundary--\r\n") req.body = body $consumer.sign!(req,$access_token) res = http.request(req) #puts res.body end