Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

mixiのあしあとAPIを使って「あしあと一覧」を作ってみた

via. http://p0t.jp/mt/archives/2007/06/mixi-stationwss.htmlhttp://ido.nu/kuma/2007/06/29/mixi%e3%81%ae%e3%81%82%e3%81%97%e3%81%82%e3%81%a8api%e7%99%ba%e6%8e%98/

mixiも裏で色々と用意しているみたいですね。
「あしあと」がatom+WSSE認証で配信されているようなので、試してみました。WSSE認証については以下を参照ということで。

以下サンプルですが、X-WSSEリクエストヘッダの内容を作っている部分は、PEAR::Services_HatenaServices_Hatena - PHPの挑戦 (ハズレ日記)を参考にさせてもらいました。
つーか、ほとんどそのままですね ;-)

<?php
error_reporting(E_ALL);
require_once 'HTTP/Request.php';

$user = '[mixiのログインID]';
$pass = '[mixiのパスワード]';
$id = '[mixiのユーザーID]';

$url = 'http://mixi.jp/atom/tracks/r=2/member_id=' . $id;

$nonce = pack('H*', sha1(md5(time().rand().posix_getpid())));
$created = date('Y-m-d\TH:i:s\Z');
$digest = base64_encode(pack('H*', sha1($nonce . $created . $pass)));
$wsse_header = sprintf('UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"', $user, $digest, base64_encode($nonce), $created);

$request = new HTTP_Request($url);
$request->addHeader('X-WSSE', $wsse_header);

if (PEAR::isError($request->sendRequest())) {
    die('request failed');
}

$xml = new SimpleXMLElement($request->getResponseBody());
echo '<ul>';
foreach ($xml->entry as $entry) {
    $updated_iso8601 = $entry->updated;

    $updated = date('Y/m/d H:i:s', mktime(substr($updated_iso8601, 11, 2),
                                          substr($updated_iso8601, 14, 2),
                                          substr($updated_iso8601, 17, 2),
                                          substr($updated_iso8601, 5, 2),
                                          substr($updated_iso8601, 8, 2),
                                          substr($updated_iso8601, 0, 4)
                                          ));
    printf(
        '<li><a href="%s" title="%sさん">%s</a>さん (%s)</li>',
        $entry->link->href,
        htmlspecialchars($entry->author->name, ENT_QUOTES, 'utf-8'),
        htmlspecialchars($entry->author->name, ENT_QUOTES, 'utf-8'),
        $updated
    );
}
echo '</ul>';

mixiも色々APIが出てくると面白そうなんだけどなぁ。。。

追記(2007/07/04 18:31)

PHP5の場合、digest作成のところは以下のようにも書けます。

<?php$digest = base64_encode(sha1($nonce . $created . $pass, true));