mixiのあしあとAPI発掘

mixiが新しく出したmixiステーションがすばらしいです。その裏側が。

mixiにログインした状態で http://mixi.jp/atom/tracks/r=2/member_id=myMixiID にアクセスするとatomで自分のページのあしあとがフィードされます。ちなみにmixiステーションが送っているリクエストは以下の通り。

GET /atom/tracks/r=2 HTTP/1.1
X-WSSE: UsernameToken Username="ku@example.com", PasswordDigest="passwordDigest8jrjEdO61Bx8c=", Nonce="Y0NonceLYj0=", Created="2007-06-29T03:04:30Z"
User-Agent: mixi station/v1.4 (by glucose)
Host: mixi.jp
Cache-Control: no-cache

こんなところにglucoseが。ためしていませんが、ふつうにWSSE認証であしあとが取得できそうです。

興味深いのは
http://mixi.jp/atom/tracks/r=2/にリクエストを送ると

<?xml version="1.0" encoding="utf-8"?>
<service xmlns="http://purl.org/atom/app#" xmlns:atom="http://www.w3.org/2005/Atom">
  <workspace>
    <atom:title>mixi tracks collection</atom:title>
    <atom:author>
      <atom:name>ku</atom:name>
    </atom:author>
    <atom:link rel="http://mixi.jp/add_diary.pl" href="http://mixi.jp/add_diary.pl?id=26756" title="日記を書く" type="text/html"/>
    <atom:link rel="http://mixi.jp/show_profile.pl" href="http://mixi.jp/show_profile.pl?id=26756" title="プロフィール確認" type="text/html"/>
    <atom:link rel="http://mixi.jp/list_friend_group.pl" href="http://mixi.jp/list_friend_group.pl" title="グループの追加と編集" type="text/html"/>
    <collection href="http://mixi.jp/atom/tracks/r=2/member_id=26756">
      <atom:title>mixi tracks</atom:title>
    </collection>
  </workspace>
</service>

というのが帰ってくるところ。もしかして日記もそのうちatomで書けるようになるんでしょうか。

自分のお目当てだったフォトアルバムは /atom/r=3 にマップされていました。http://photo.mixi.jp/atom/r=3 にGETを送ると以下の通り。


<?xml version="1.0" encoding="utf-8"?>
<service xmlns="http://purl.org/atom/app#" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:quota="http://mixi.jp/atom/ns#quota">
  <workspace>
    <atom:title>mixi photo upload api</atom:title>
    <quota:storage used="1215187" limit="104857600"/>
    <collection href="http://photo.mixi.jp/atom/r=3/member_id=26756">
      <atom:title>photo album</atom:title>
    </collection>
    <collection href="http://photo.mixi.jp/atom/r=3/member_id=26756/album_id=1796477">
      <atom:title>my first mixi photo album</atom:title>
      <accept>image/jpeg</accept>
      <quota:items used="25" limit="100"/>
    </collection>
  </workspace>
</service>

collectionのところは自分が持っているアルバムの一覧が入っています。
/atom/r=3 だけは最近作ったからなのかWSSEでないと認証されないようになっていました。ブラウザからだと

X-WSSE authentication required

と出てきます。

作るときは /atom/r=3/member_id=myMixiID

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://purl.org/atom/app#" xmlns:permit="http://mixi.jp/atom/ns#permit">
  <title>JPG</title>
  <id>urn:uuid:34738eef-5515-4ee5-869e-378bcce203d5</id>
  <author><name /></author>
  <content />
  <summary>jpeg album</summary>
  <updated>2007-06-29T12:05:29+09:00</updated>
  <app:control>
  <permit:access>public</permit:access>
  </app:control>
</entry>

こういうのを投げていて、アップロードするときは
/atom/r=3/member_id=myMixiID/album_id=1797272
画像ファイルの中身だけをPOSTで送ってるっぽいです。

POST /atom/r=3/member_id=myMixiID/album_id=1797272 HTTP/1.1
X-WSSE: UsernameToken Username="ku@example.com", PasswordDigest="HPasswordDigestKSeJ/8JOcFFc=", Nonce="swNonceSPBU=", Created="2007-06-29T03:05:44Z"
Content-Type: image/jpeg
Slug: googleapi
Content-Length: 12304
Accept-Language: ja
User-Agent: mixi station/v1.4 (by glucose)
Host: photo.mixi.jp
Cache-Control: no-cache
Cookie: BF_SESSION=26756_000000000000000000000000000000000000_1; BF_STAMP=1d42d71000000000000000002bbd

アップロード後のレスポンスは

HTTP/1.1 201 Created
Date: Fri, 29 Jun 2007 03:05:44 GMT
Server: Apache
Location: http://photo.mixi.jp/atom/r=3/member_id=26756/album_id=1797272/photo_id=1125137947
Content-Length: 439
Content-Type: application/atom+xml;type=entry
Connection: close
X-Pad: avoid browser bug

です。

だれか実際にWSSEでリクエストつくって送ってみてください!
検証完了。ほんとにふつうにWSSEで認証してあげれば写真がアップロードできました。アルバムを作るところは面倒だったのでアップロードの部分だけ。実際はアルバムのIDを取得してくる必要あり。

#!/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 $ua = LWP::UserAgent->new;
$ua->credentials('photo.mixi.jp:80', '', $id, $passwd);

my $res = $ua->post(
                'http://photo.mixi.jp/atom/r=3/member_id=myMixiID/album_id=1797272',
                'Content-Type' => 'image/jpeg',
                'content' => join "", <>
        );

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

exit;

あと mixi notifyにはAtomが使われている – F.Ko-Jiの「一秒後は未来」 で運営者からのお知らせが取れる話等が書かれてます。

URIからすると /atom/r=1 系のAPIもありそうですがmixiステーションをちょこっとみた限りでは不明。おそらくmixiステーションの聴いた曲を送信するためのAPIだと思われます。


About this entry