[m2w]AtomPub を使って画像リソースを転送する。

AtomPub を使ってブログで使う画像リソースを転送するサンプルを紹介します。

Ruby で AtomPub を使う場合は atomutil というライブラリが使えます。

atomutil を使って画像リソースを転送する場合のポイントは以下の通りです。

  1. 画像リソースを転送すると、画像リソースエントリーの URL が返ってくる。
  2. 画像リソースエントリーの URL にアクセスすると画像本体の URL が返ってくる。
  3. 画像リソースはファイルの形になっていなければならない。

本記事では livedoor Blog への転送を事例にします。


ブログに画像を貼り付けるには3回アクセスする

まずは画像リソース転送時のポイント 1 と 2 についてです。

画像リソースをブログに貼り付けるためには、計3回のアクセスが必要です。

  • 画像リソースの転送。
  • 画像本体の URL の取得。
  • img タグを持ったブログエントリーの転送。
require 'atomutil'

USERNAME = 'ユーザ名'
PASSWORD = 'パスワード'
ENTRY_COLLECTION_URI = 'http://livedoor.blogcms.jp/atom/blog/mail2weblog/article'
MEDIA_COLLECTION_URI = 'http://livedoor.blogcms.jp/atom/blog/mail2weblog/image'
FILENAME = 'test.jpg'

auth = Atompub::Auth::Wsse.new(:username => USERNAME, :password => PASSWORD)
client = Atompub::Client.new(:auth => auth)

# 画像リソースの転送。
media_entry_uri = client.create_media(MEDIA_COLLECTION_URI, FILENAME, 'image/jpeg')

media_url = nil
if media_entry_uri != nil then
  media_entry = client.get_entry(media_entry_uri)

  if media_entry != nil then
    media_entry.elem.each_element("content") do |element|
      # 画像本体の URL の取得。
      media_url = element.attributes['src']
    end
  end
end

# img タグを持ったブログエントリーの転送。
new_entry = Atom::Entry.new(
    :title => "タイトル".encode('BINARY', 'BINARY'),
    :content => "<img src='#{media_url}' />".encode('BINARY', 'BINARY'))
p client.create_entry(ENTRY_COLLECTION_URI, new_entry)

画像がファイルではない場合は一時ファイルを作成する

次にポイント 3 についてです。

画像がファイルではなくメモリ上にある場合、一度ファイルにしてから転送します。

その場合、tempfile モジュールを使うのが楽です。tempfile モジュールを使うとファイル名の重複もファイルの削除も気にしなくて済みます。

require 'tempfile'

# ... 略 ...

# content に画像のバイナリデータが入っていると仮定する。
tempfile = Tempfile.new("content")
tempfile.binmode
tempfile.write(CONTENT)
tempfile.close

# 画像リソースの転送。
media_entry_uri = client.create_media(MEDIA_COLLECTION_URI, tempfile.path, 'image/jpeg')

# ... 略 ...

client.create_media の呼び出しに tempfile.path を渡しているのがポイントです。

mail2weblog(高機能メール投稿型モブログ)というモブログのソフトを開発しています。

本ソフトは、メールを受け取り/ブログへの投稿をするというプログラムです。

メールから取得した画像はメモリ上にあるためこのような対応をしました。

また、画像のサムネイルを作成した場合も同様に画像データはメモリ上にあり、同じ対応をしました。

参考にということで記事を書きましたが、もし良かったら mail2weblog(高機能メール投稿型モブログ)を試してみてください。