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