2006-12-19

RubyでBloggerに投稿

EmacsでBlogger投稿はとりあえず断念したわけだけど、それじゃ、どうやればBloggerに投稿できるかを調べてみた。それで、ここに詳しく書いてあるらしいんだけど、悲しいことに読んでも全然分からない。

色々検索したらPerlでBloggerに投稿している例に遭遇。早速コピペして動かしてみると、動いた! すげえ。

しかし、ぼくはRuby脳なわけで、Rubyで動かしたい! ということで、このコードをRubyに移植してみた。それが、これ。

#!/usr/bin/ruby

require 'net/https'
require 'uri'

GAUTH_URL = "https://www.google.com/accounts/ClientLogin"

email = "user@gmail.com"
passwd = "passwd"
feed_url = "http://www.blogger.com/feeds/###################/posts/default/"
#feed_url = "http://beta.blogger.com/feeds/###################/posts/default/"

entry = <<ENTRY
<entry xmlns='http://www.w3.org/2005/Atom'>
<published>2006-06-09T10:27:00.000-07:00</published>
<updated>2006-06-09T10:31:55.120-07:00</updated>
<title type='text'>Marriage!</title>
<content type='xhtml'>
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Mr. Darcy has <em>proposed marriage</em> to me!</p>
<p>He is the last man on earth I would ever desire to marry.</p>
<p>Whatever shall I do?</p>
</div>
</content>
<author>
<name>Elizabeth Bennet</name>
<email>liz@gmail.com</email>
</author>
</entry>
ENTRY

url = URI.parse(GAUTH_URL)
req = Net::HTTP::Post.new(url.path)
req.form_data = {
"Email" => email,
"Passwd" => passwd,
"source" => "companyName-applicationName-versionID",
"service" => "blogger"
}
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true if url.scheme == "https"
res = http.start { |session|
session.request(req)
}
res.body =~ /Auth=(.+)/
auth_token = $1

url = URI.parse(feed_url)
req = Net::HTTP::Post.new(url.path)
req["Authorization"] = "GoogleLogin auth=" + auth_token
req["Content-Type"] = "application/atom+xml"
req.body = entry
res = Net::HTTP.new(url.host, url.port).start { |http|
http.request(req)
}
case res
when Net::HTTPSuccess
puts "ok"
when Net::HTTPRedirection
url = URI.parse(res["Location"])
req["Host"] = url.host
Net::HTTP.new(url.host, url.port).start { |http|
http.request(req)
}
else
puts "error"
res.error!
end

書いてみた思ったのは、Rubyのnet/httpはやっぱり使いづらい。open-uriはPostできないし。おれがへまっているのかもしれないけど、PerlのLWPの方が全然使いやすいよなあ、と思ってしまった。

あと、sargeのRubyだと、このコードが動かないことが判明。1.8.2で、net/httpsがないのだ。そんな最近までなかったっけ? sarge面倒臭いなあ。

0 件のコメント: