Star Archive

MAY
3

iKnowLastAccessTimeChecker

Published:2008-05-03 11:03:12 UTC

一般に公開するphpスクリプトとしてはWordPressのテンプレートを除き、記念すべき第一弾かな?

iKnowのBlogパーツの通信を覗いてみた」というエントリで書いたように、iKnowではBlogパーツのために、ユーザーの学習中アイテム数などをxmlファイル形式で外部に公開している。今回は、その中の最終学習日時を表示するphpスクリプトを書いてみた。

<?php
function getLastAccesseTime($id){

    $req = 'http://www.iknow.co.jp/assets/user/' . $id . '/iknow_badge.xml';

    $iknow = @simplexml_load_file($req);
    if($iknow===false){
        echo('パースエラー');
        exit();
    }

    $date = strtotime($iknow->history->fragment['date']);
    
    return $date;
}

?>

<?php
    $id = htmlspecialchars($_GET['id']);
?>

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
    'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='ja' lang='ja'>
    <head>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> 
        <title>iKnowLastAccessTimeChecker - 
            <?php
                echo($id);
            ?>
        </title>
    </head>
    <body>
        <p>

<?php
    if(!empty($id) &amp;&amp; (strpos($id,'/')===false)){
        $accessedTime = getLastAccesseTime($id);
        echo(date('Y年m月d日 H:i:s',$accessedTime));
    }
?>

        </p>
    </body>
</html>

こんな感じ。get変数idを与えると、そのidを持つユーザーの最終アクセス日時を表示する。で、このスクリプトを早速デポにUPしてみたので、その検索窓を設置してみる。

自分のIDで試してみた例:

http://depot.sharplab.net/php/iknow/LastAccessTimeChecker.php?id=shiroica

脆弱性対策はDirectory Traversal対策位しか思いつかなかったけど、大丈夫かな?

MAY
1

飲み会などで中断を挟みながらも、なんとか順調にこなせているe-learningサイトのiKnow。このiKnowには、学習状況を表示できるBlogパーツがある。前回紹介した時に貼り付けたあれである。

image-300x181 で、今日はちょっとした好奇心からそのBlogパーツがサーバーと何を通信しているかを調べてみた。

使ったソフトはFiddler2。FiddlerはHTTP(s)トラフィックをモニタするためのツールで、ローカルプロキシとして実装されており、http://www.fiddlertool.com/fiddler/からDL可能。実行すると、自動的にアタッチされるので、左側のリストから任意のセッションを選択して内容を覗くことができる。

さて、Fiddlerで覗いてみると、それらしいリクエストとして

http://www.iknow.co.jp/assets/user/shiroica/iknow_badge.xml?time_stamp=1209570292344

というものがあった。GETメソッドでtime_stamp=1209570292344というデータが送られているが、これは名前の通り、リクエストを送信する時点でのUNIXタイムスタンプ(ミリ秒単位)のようである。但し、この値を操作しても、返ってくる結果は変わらないようであるが。(5/2追記:よく考えたらキャッシュ対策ですね)

で、そのボディの内容について。先のリクエストに対して返却されるデータは、ニコ動同様にXML形式であった。具体的には以下のように。

<iknow>
  <version>1.0</version>
  <title>iKnow! バッジ</title>
  <link>http://www.iknow.co.jp/clickback/iknow_public_badge/shiroica</link>
  <avatar>/assets/users/49q1_small.jpg</avatar>
  <language>ja</language>
  <description>iKnow! で一緒に学習しよう</description>
  <history application="iknow">
    <fragment date="Wed Apr 30 13:11:46 UTC 2008">
      <score label="学習中アイテム">706</score>
      <score label="学習完了アイテム">9</score>
    </fragment>
  </history>
</iknow>

ということは、ユーザー名から母国語、アイコンのURL、最終学習日時(UTCであることに注意)、学習中アイテム数、学習完了アイテム数がとれるようである。

アイコンのURLと、学習中アイテム数、学習完了アイテム数はBlogパーツ上でも表示されるので、通信されているとは思っていたが、最終学習日時まで通信しているとは思わなかった。最終学習日時はプロフィールページなどでも公開されていないので、予想外の珍しいデータがとれたといえる。

「見て見て、ちゃんと勉強してるんだよ!」という意図でBlogパーツを貼り付けている自分みたいなタイプの人間は、こっちのデータも表示するようにできたらなぁと思ったりする。そのうちPHPでXMLを取得してきて最終学習日時を表示するスクリプトでも書いてみるかな。