[php][PEAR]Services_MixiAPIとXML_Feed_Parserを使ってみた

Written by uechoco 1月 25
このエントリをはてなブックマークに追加[php][PEAR]Services_MixiAPIとXML_Feed_Parserを使ってみたのはてなブックマーク被リンク数このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをBuzzurl(バザール)に追加

id:shimookaさんが持ちネタを放出したとのことで、CodeReposに追加されたようなので、Services_MixiAPIを使ってみました。

とりあえず、参考にしたサイトを先にまとめておきます。

まずはライブラリの入手。CodeReposのServices_MixiAPIディレクトリをチェックアウトします。Subversionがない方はmixiのAPIが増えていたので、Services_MixiAPI作ってみたにPEARパッケージにしたものがおいてあるようなので、pearコマンドでインストールできます。もちろん、おすすめはCodeReposの方です。チェックアウトしたら、/src/Servicesディレクトリをinclude_pathで通っている場所にエクスポートします。あるいは、http://svn.coderepos.org/share/lang/php/Services_MixiAPI/src/Servicesを直接エクスポートしてもいいのかな。

私がとってきたバージョンは0.0.1でした。現時点では、Services_MixiAPIは、実行環境がWindowsだと動きません。Services_MixiAPI_AbstractAPIクラスのbuildWSSEAuthメソッドががPOSIX関数を用いているためです。XAMPPerな私はWindowsの実行環境で開発したいので、たぶん一意なハッシュを得るのに必要なんだろうなと適当に解釈して、uniqid()関数でこんな感じで書き換えました。

PHP:
  1. private function buildWSSEAuth($user, $pass) {
  2.         // ----> uechoco modified begin
  3.         //$nonce = pack('H*', sha1(md5(time().rand().posix_getpid())));
  4.         $nonce = pack('H*', sha1(md5(time().rand().uniqid(rand(), true))));
  5.         // <---- uechoco modified end
  6.         $created = date('Y-m-dTH:i:s') . 'Z';
  7.         $digest = base64_encode(pack('H*', sha1($nonce . $created . $pass)));
  8.         $wsse_header = sprintf('UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"', $user, $digest, base64_encode($nonce), $created);
  9.         return $wsse_header;
  10.     }

あと、今回はXML_Feed_ParserというPEARのライブラリも使っています。shimookaさんのサンプルだとSimpleXMLElementを使っているので、同じの使ったら記事にする意味ないかなと思って、XML_Feed_Parserに挑戦してみました。

説明が面倒なので、CYでお願いします。CY?「コード読め」ですよ。取得したAtomを眺めてたら、mixiの拡張フォーマットが指定してあって、ユーザーの画像と、マイミクなのかどうかが取得できるようなので一緒に取得してみました。

PHP:
  1. <?php
  2. /**
  3. * Services_MixiAPIとXML_Feed_Parserを用いてMixiの足跡を取得するサンプル
  4. *
  5. * PHP version 5
  6. *
  7. * @author    Yusuke Ueno (uechoco)
  8. * @license   http://www.php.net/license/3_01.txt The PHP License, version 3.01
  9. * @see       http://pear.php.net/package/Services_MixiAPI
  10. */
  11.  
  12. // クラスの読み込み
  13. require_once 'Services/MixiAPI/Factory.php';
  14. require_once 'XML/Feed/Parser.php';
  15.  
  16. // mixiの個人情報を定義
  17. class Mixi_Info {
  18.     // mixiのログインID
  19.     const LOGIN_ID = '自分のmixiのログインID';
  20.     // mixiのパスワード
  21.     const PASSWORD = '自分のmixiのログインパスワード';
  22.     // mixiのユーザーID
  23.     const USER_ID  = '自分のmixiのユーザーID';
  24. }
  25.  
  26. // 足跡オブジェクトの作成
  27. $service = Services_MixiAPI_Factory::getInstance(
  28.     Services_MixiAPI_Factory::API_MODE_FOOTPRINT, // 足跡
  29.     Mixi_Info::LOGIN_ID,    // ログインID
  30.     Mixi_Info::PASSWORD,    // パスワード
  31.     Mixi_Info::USER_ID        // ユーザーID
  32. );
  33.  
  34. // 足跡の取得
  35. $service->execute();
  36.  
  37. // とりあえず表示
  38. try {
  39.     $feed = new XML_Feed_Parser($service->get());
  40. } catch (XML_Feed_Parser_Exception $e) {
  41.     die('フィードが無効です:'.$e->getMessage());
  42. }
  43.  
  44. // 足跡情報の整形
  45. $footprints = array();
  46. foreach ($feed as $k => $entry) {
  47.  
  48.     // 通常のAtomフィールドを取得する
  49.     $id = str_replace('http://mixi.jp/show_friend.pl?id=', '', $entry->link);
  50.     $footprints[] = array(
  51.         'id'       => $id,
  52.         'name'     => $entry->author,
  53.         'link'     => $entry->link,
  54.         'date'     => date('Y-m-d H:i:s', $entry->updated),
  55.         'unixtime' => $entry->updated,
  56.     );
  57.  
  58.     // 拡張情報を取得する
  59.     $model = $entry->model;
  60.     $tracks = array('image', 'relation');
  61.     foreach ($tracks as $localName) {
  62.         $nodes = $model->getElementsByTagNameNS('http://mixi.jp/atom/ns#tracks', $localName);
  63.         foreach ($nodes as $node) {
  64.             $footprints[$k][$localName] = $node->nodeValue;
  65.         }
  66.     }
  67. }
  68. ?>
  69. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  70. <html xmlns="http://www.w3.org/1999/xhtml">
  71. <head>
  72. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  73. <title>足跡一覧</title>
  74. <style type="text/css">
  75. <!--
  76. ul#footprint {
  77.     list-style-type: none;
  78. }
  79.  
  80. ul#footprint li {
  81.     display: block;
  82.     border: solid 1px gray;
  83.     padding-left: 100px;
  84.     height: 76px;
  85.     background-repeat: no-repeat;
  86. }
  87.  
  88. ul#footprint li .friend {
  89.     color: green;
  90. }
  91. -->
  92. </style>
  93. </head>
  94. <body>
  95. <h1>足跡一覧</h1>
  96. <ul id="footprint">
  97. <?php
  98. foreach ($footprints as $footprint) {
  99.     printf(
  100.         '<li style="background-image: url(%s)"><a href="%s" title="%s">%s</a>さん (%s 訪問、%s)'."\n",
  101.         $footprint['image'],
  102.         $footprint['link'],
  103.         $footprint['name'],
  104.         $footprint['name'],
  105.         $footprint['date'],
  106.         $footprint['relation'] === 'friend' ? '<span class="friend">お友達</span>' : '他人'
  107.     );
  108. }
  109. ?>
  110. </ul>
  111. </body>
  112. </html>

で、出力画面はこんな感じ。
Services_MixiAPIのサンプル

モザイクが面倒だったので、名前だけにmd5かけてちょんぎってます。

で、この足跡のリストをどうするの?って言われると、なんとも困るんですが、適当にTwitterとかとあわせてみたりしてください。私の目的はServices_MixiAPIを使ってみたかっただけなのです。

このエントリをはてなブックマークに追加[php][PEAR]Services_MixiAPIとXML_Feed_Parserを使ってみたのはてなブックマーク被リンク数このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをBuzzurl(バザール)に追加

2 Responses to “[php][PEAR]Services_MixiAPIとXML_Feed_Parserを使ってみた”

  1. コメント by Do You PHP はてな on 2008 年 1 月 29 日 01 : 06 : 45

    [PHP][PEAR]Services_MixiAPI 0.1.0リリース

    先日CodeReposに突っ込んだServices_MixiAPIですが、バージョン0.1.0としてリリースします。 インストールは $ sudo in…

  2. ピンバック by mixi API | らいふログ on 2009 年 12 月 12 日 02 : 05 : 37

    [...] http://labs.uechoco.com/blog/2008/01/phppearservices_mixiapixml_feed_parser.html [...]

Comments RSS rss うえちょこ@ぼろぐ TrackBack Identifier URI rss うえちょこ@ぼろぐ

コメントをどうぞ