2008年11月20日

モバイル版始めました

 ふと思い立って、モバイル版を作ってみました。携帯電話からTrend Antennaにアクセスしていただくと表示されると思います。

 モバイル版ということで、表示内容は絞ってありますが、PC版にはない動画検索の機能を追加しました。移動中の時間つぶしに使っていただければ幸いです。

posted by まいける at 23:24 | Comment(0) | TrackBack(0) | 機能追加

2008年11月12日

波ダッシュ問題 on XML_RPC

 PEAR の XML_RPC には UTF-8 の文字列の取扱いに不具合があるようで、UTF-8 固有の文字を送信すると文字化けします。例えば、タイトルに挙げた波ダッシュや単位記号(cmやkg)などがこれにあたります(波ダッシュについては、Wikipedia の記事が参考になります)。

 解決方法としては、文字列を渡す前にあらかじめ別の文字列に置換しておき、返ってきた結果に対して、逆の置換を行うことが考えられます。例えば、

require_once 'XML/RPC.php';

$str = (XML_RPCに渡す文字列)

// 以下の部分で全角チルダと波ダッシュをいったん naminamimoji に置換
$str = preg_replace('#\xEF\xBD\x9E#i', 'naminamimoji', $str);
$str = preg_replace('#\xE3\x80\x9C#i', 'naminamimoji', $str);

$params = new XML_RPC_Value(
    array(
        'body' => new XML_RPC_Value($str, 'string'),
        'score' => new XML_RPC_Value(50, 'int'),
    ),
    'struct'
);
    
$msg = new XML_RPC_Message('hatena.setKeywordLink', array($params));

$cli = new XML_RPC_Client('/xmlrpc', 'd.hatena.ne.jp');

$resp = $cli->send($msg);

if (!$resp) {
    echo 'Communication error: ' . $cli->errstr;
    exit;
}

if (!$resp->faultCode()) {
    $val = $resp->value();
    $data = XML_RPC_decode($val);
    $ret_val = $data;
        
} else {
    /*
     * xmlrpc.php スクリプトが遭遇した問題を
     * 報告する
     */
    echo 'Fault Code: ' . $resp->faultCode() . "\n";
    echo 'Fault Reason: ' . $resp->faultString() . "\n";
    $ret_val = $data;
}

// 置換していた文字を元に戻す
$ret_val = str_replace('naminamimoji', '〜', $ret_val);
 ただ、この方法は例で挙げたはてなキーワード自動リンクAPIのように、入力される一部の文字を無視しても実用上問題がない場合には効果的ですが、入力される文字列自体が重要な場合(検索など)の場合にはうまくいきません。

 おそらく内部でエンコードの変換を行っていることが原因だと思うのですが、ちょっと困りものです。

posted by まいける at 18:30 | Comment(0) | TrackBack(0) | PHP

2008年11月03日

関連商品情報を変更しました

 キーワード検索した際にサイドに表示される関連商品情報を変更しました。これまで Amazon と楽天を併用していましたが、楽天のみに変更するとともに、評価の件数と平均点を表示するようにしました。アフィリエイトの点で Amazon のクリックの有効期間が1日と短いのに対して、楽天が1か月あるというのが変更の大きな理由ではあるのですが、API の使い勝手が楽天のほうがよいというのも変更の理由です(Amazon は、商品写真がきれいというメリットがあるので、個別商品の紹介では引き続き使用しています)。

 Amazon の API(AWS)は、きっちり作り込めばできることは多いのですが、出力される内容が細分化されているため、若干敷居が高い気がします(ドキュメントも英語ですしね)。それに比べると、楽天はカスタマイズの点では不十分なところもありますが、扱いやすいと思います。

 使い方としては、リクエスト用のURLを

$developerId  = '(ディベロッパーID)';
$affiliateId  = '(アフィリエイトID)';
$operation    = 'ItemSearch';
$keyword      = rawurlencode('(検索したいキーワード)');
$version      = '2008-09-01';
$hits         = 10;
$page         = 1;
$sort         = rawurlencode('-reviewCount');
$availability = 1;
$field        = 0;
$imageFlag    = 1;
$request_url = "http://api.rakuten.co.jp/rws/1.12/rest?developerId={$developerId}&affiliateId={$affiliateId}&operation={$operation}&keyword={$keyword}&version={$version}&hits={$hits}&page={$page}&sort={$sort}&availability={$availability}&field={$field}&imageFlag={$imageFlag}";
みたいな感じで作ったら、
$xml = file_get_contents($request_url);
require_once 'XML/Unserializer.php';

$options = array(
    "parseAttributes" => true
);
$unserializer =& new XML_Unserializer( $options );
$unserializer->unserialize( $xml, FALSE );
$res = $unserializer->getUnserializedData();
のようにすれば、結果を配列に入れることができます。あとは、ドキュメントと結果の配列を見比べながら、必要なデータを抽出すればOKです(例ではキーワードに関連する、画像があり、入手可能な商品を評価数の多い方から10件取得しています)。

posted by まいける at 11:58 | Comment(0) | TrackBack(0) | 機能追加