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 }