mixi for iPhoneから発掘されたmixi日記投稿用API

追記 2008.7.31

はてなブックマークでPUTにすべきというコメントがいくつかあったので、やべーatomPubとかぜんぜんわかってないから自分がちゃんと見ないで勝手にPOSTって書いたかもと思って再度確認したらやっぱりPOSTになってました。googleで検索するとCocoaのNSURLRequestのPUTを使うとなんか不安定っていうのがいくつが出てくるので、そのへんのからみなのかもしれません。あ、あとNokiaのsymbianでPUTがお手軽にできないとかあったりするのかも。

iPhoneからぜんぜん日記を書く手段がなかったらmixiから、mixi for iPhoneという日記を書いたりするiPhoneアプリが公開されました!

新しいアプリに新しいAPI、日記が投稿できるアプリなら日記投稿用のAPIというわけでmixiのあしあとAPI発掘と同じように掘り起こして見つけました。

ほかのAPIと同様、認証はWSSEでatomPubで日記を書くことができるようになっていました。エンドポイントはhttp://mixi.jp/atom/diary/member_id=mixiIDです。

写真のアップロード

mixi for iPhoneの中では、写真つきで日記を書くときはまずhttp://mixi.jp/atom/diary/member_id=mixiIDに写真をpostしていました。mixiのあしあとAPI発掘のフォトアルバムへのアップロードAPIと同じようにPOSTで写真のファイルの中身だけを送ります。

うまくいくと 201 Created が帰ってくるのでHTTPヘッダからcreateされたリソースのURIを取り出します。

http://mixi.jp/atom/diary/member_id=26756/entry_id=886016554

こんなURIです。

atomPubの仕様上、日記本文と写真を同時にpostすることはできないので、写真を投稿した時点でmixiには日記が表示されるようになります。
写真をアップロードしただけだと、タイトルが空で本文にbodyとだけ書かれた日記が作られて、そこにアップロードした写真が表示されます。

本文とタイトルの設定

本文とタイトルは写真をアップロードした時に得られたURIに下のXMLをPOSTして書き換えられます。
mixi for iPhoneの中では写真をアップロードしたあとにこのAPIが呼ばれてタイトルと本文が設定されています。

さっきのhttp://mixi.jp/atom/diary/member_id=26756/entry_id=886016554

<?xml version='1.0' encoding='utf-8'?>
<entry xmlns='http://purl.org/atom/ns#'>
  <title>ハロー</title>
  <summary>perlからatom/diary/member_id=によるAPI経由で投稿していまうす。</summary>
</entry>

を送れば写真付き日記の完成です。

写真なしで文章だけ投稿したい時はhttp://mixi.jp/atom/diary/member_id=26756

<?xml version='1.0' encoding='utf-8'?>
<entry xmlns='http://purl.org/atom/ns#'>
  <title>ハロー</title>
  <summary>perlからatom/diary/member_id=によるAPI経由で投稿していまうす。</summary>
</entry>

を送れば新しくつくられた日記のURIがHTTPヘッダのLocationに入ってかえってきます。

ためしてませんが、先に日記本文を投稿して、そこで得られたURIにimage/jpegをpostしても写真付きの日記にできると思います。

途中で思い出したけどNokiaの端末むけに日記がかけるsymbianアプリが前からあったのでこのAPIもiPhone用に作られたとかじゃなくてNokiaのアプリが作られたときくらい前からあったんだと思います….

Perlのコード

以下のコードで写真付きで日記が書けるのを確認しました。

修正 2008.7.31

たけまる / AtomPub on mixi?でnamespace URIが古いとの指摘をいただいたので新しくしました。

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Authen::Wsse;
use LWP::UserAgent;
use HTTP::Request::Common;

my $id = 'ku@example.com';
my $passwd = 'PASSWORD';
my $member_id = 26756;

my $ua = LWP::UserAgent->new;
$ua->credentials('mixi.jp:80', '', $id, $passwd);
# upload image.
my $res = $ua->post(
        "http://mixi.jp/atom/diary/member_id=$member_id",
        'Content-Type' => 'image/jpeg',
        'content' => join "", <>
    );
warn $res->content unless $res->code == 201;
my $uri = $res->headers->{'location'};
# set text.
my $content = <<__XML__;
<?xml version='1.0' encoding='utf-8'?>
<entry xmlns='http://www.w3.org/2007/app'>
    <title>ハロー</title>
    <summary>perlからatom/diary/member_id=によるAPI経由で投稿していまうす。</summary>
</entry>
__XML__   

$res = $ua->post(
        $uri,
        'Content-Type' => 'application/atom+xml',
        'content' => $content
    );

warn $res->content unless $res->code == 201;

About this entry