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;

7 Comments
Jump to comment form | comments rss [?] | trackback uri [?]