mixi API を用いて日記を投稿する

mixi API の使い方は http://ido.nu/kuma/2008/07/30/digging-mixi-for-iphone-application-and-new-api-for-posting-a-diary-with-a-photo/ を参考にした。
また、mixi API に使われている WSSE という認証方法については はてなフォトライフAtomAPI を参考にした。


ruby1.8 でも ruby1.9 でも動くはず。

#!/usr/bin/env ruby
# vim:set fileencoding=utf-8:
require 'net/http'
Net::HTTP.version_1_2
require 'base64'
require 'digest/sha1'
require 'time'
require 'date'
require 'rexml/document'

uri = URI('http://mixi.jp/atom/diary')
username = 'foo@example.com'
password = 'your-password'

title = 'API からの投稿テスト'
message = 'どうだ?'

nonce = Digest::SHA1.digest(rand.to_s)
created = DateTime.now.to_s
passworddigest = Base64.encode64(Digest::SHA1.digest(nonce + created + password)).strip
wsse = %(UsernameToken Username="#{username}", PasswordDigest="#{passworddigest}", Nonce="#{Base64.encode64(nonce).strip}", Created="#{created}")

Net::HTTP.start(uri.host, uri.port) { |http|
  res = http.get(uri.path, 'X-WSSE' => wsse)
  if res.code.to_i != 200
    p res
    exit 1
  end

  doc = REXML::Document.new(res.body)
  xmlns = doc.elements['service'].attributes['xmlns']
  endpoint = doc.elements['/service/workspace/collection'].attributes['href']

  mypost = REXML::Document.new
  mypost << REXML::XMLDecl.new('1.0', 'utf-8')
  entry = mypost.add_element('entry', {'xmlns' => xmlns})
  entry.add_element('title').add_text(title)
  entry.add_element('summary').add_text(message)

  req = Net::HTTP::Post.new(endpoint)
  req['X-WSSE'] = wsse
  req['Content-Type'] = 'application/atom+xml'
  req.body = mypost.to_s
  res = http.request(req)
  if res.code.to_i != 201
    p res
    exit 1
  end
}