ValueCommersウェブサービスのPHPサンプルプログラム名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2009年7月24日
ValueCommerceのウェブサービスは、同じアフィリエイト系のウェブサービスであるAmazonの「Product Advertizing API(要署名認証)」に比べてリクエストが容易です。他でのウェブサービスの利用経験があれば比較的簡単にプログラムを組むことができると思います。 先日公開した「KUNISAN.JP海外ツアー情報」のプログラミングも、比較的スムーズに進行しました。しかしその中で2回だけ大きな壁に遭遇しました。 ※2009/7/28追記: 「KUNISAN.JP海外ツアー情報」は管理上の理由から、「KUNISAN.JPサービスモール (http://kunisan.jp/service_mall/)」のサービスとして一元化し、もともとあったアドレスからは外しました。 *問題1: リクエストからレスポンスまで30秒~1分かかることがある。 Amazonでも5秒ほどレスポンスが来ないことがあり、それでも多少イライラしていたのですが、「その程度でイライラしていたなんて恥ずかしい」と思えるほどの大きな遅延です。リクエスト→レスポンスの処理を同一プログラム内でやってしまうとページ表示に時間がかかるため、これではこのページを誰も利用しなくなってしまいます。 そのため、今回のプログラムでは基本的にデータをキャッシュから読み込む形にしてみました。これなら遅延時間はほとんどありません。また、キャッシュの生成処理についてもページ表示のものと同一のプログラム内でやると、レスポンス取得に時間がかかる場合にページが表示されない時間が長くなってしまうので、プログラム後半に付けた「imgタグ」で、別のキャッシュ生成用プログラムを踏ませる形の処理をしています。ちなみにリクエストから1分以上かかってレスポンスが来て、挙句の果てに空データということもあります。もちろん、このような場合にはデータをキャッシュしないようにしてあります。 *問題2: レスポンスのXMLデータにコロン「:」付きの要素がある。 以前のAmazonのプログラムでは、作成当時「KUNISAN.JP」サーバーがPHP4のみ対応だったため、XML関連のコマンドが一切使用できず、代わりsplit関数を多用してデータを配列変数に入れ込む形で処理していました。 現在はサーバーがPHP5対応のため、せっかくなので「simplexml」を使ってXMLをオブジェクトに変換する方法に切り替えてみました。しかし、ValueCommerceのデータは要素名にコロンが入っています。困ったことにsimplexmlではコロン付きの要素名を認識してくれません。そのため、オブジェクト変換の前に、要素名のコロンを全てアンダーバー「_」に変換するという処理を取っています。 ということで、実際に使われているプログラムの一部を抜粋して掲載します。ご参考にどうぞ。 ■■ValueCommerceウェブサービス用プログラム(サンプル)■■ ※本サンプルプログラムの動作保証はしません。 ※本サンプルプログラムに関する質問、クレーム等は一切受け付けません。 ※本サンプルプログラムのご利用はご自由に行って構いません。ただし、プログラムの2次配布、2次掲載(ホームページ、ブログ、印刷物などへの本サンプルプログラムの転載)はご遠慮ください。 ※本ページへのリンクはご自由にどうぞ。 <?php //※プログラム内のXXXXXXXXXXはユーザー個別の値を設定します。 //使用言語とエンコードの指定 mb_language("ja"); mb_internal_encoding("SJIS"); //検索ワード指定 $word = 'ヘルシンキ'; //検索用ワード指定 $word_search = mb_convert_encoding($word, "UTF-8","SJIS"); //検索用URL指定 addr = 'http://webservice.valuecommerce.ne.jp/productdb/search? token=XXXXXXXXXX&category=travel&sort_by=price&sort_order=asc&results_per_page=100 &keyword='.$word_search; //キャッシュ処理 //実行中のスクリプト名を取得、拡張子を除いたファイル名のみ取得 $scrip = $_SERVER['SCRIPT_NAME']; $scrip = str_replace('/tour/','',$scrip); $scrip = str_replace('.php','',$scrip); //キャッシュファイルのパスを生成 $scrip = 'cache/'.$scrip.'.cnt'; //該当キャッシュファイルの更新日時の取得 $stam = filemtime($scrip); //キャッシュファイルが24時間(1日間)以上前に作られたものであれば新規に読み込み、そうでない場合にはキャッシュから読み込む。 $timnow = time(); if (($timnow - $stam) > 86400) { $contents = file_get_contents($addr); //データベースから新規読み込み //XMLデータ長が2200超の場合のみキャッシュに保存(それ以下は空データとみなし、保存しない) $stlen = strlen($contents); if ($stlen > 2200) { //XMLデータをキャッシュに保存 file_put_contents($scrip,$contents); } } else { $contents = file_get_contents($scrip); //キャッシュから読み込み $cr = 1; //キャッシュから読み込みのフラグ } //コロン付きの要素は処理が面倒になるので、アンダーバーに変更 $contents = str_replace('<vc:','<vc_',$contents); $contents = str_replace('</vc:','</vc_',$contents); //XMLをオブジェクトに変換 $xml = simplexml_load_string($contents); //結果数取得(星印の表示、非表示や検索結果が無い場合などに使用する) $no_results = $xml->channel->vc_resultcount; //検索結果が見つからない場合(エラー)と見つかった場合(タイトル) if ($no_results == 0) { print '<br>'.$word.'の情報は見つかりませんでした。<br><br><br>'; } else { //繰り返し構文(100件) for ($item_no = 0; $item_no < 100; $item_no++) { //XMLからタイトル抽出 $temp[0] = $xml->channel->item[$item_no]->title; //XMLからリンク抽出 $temp[1] = $xml->channel->item[$item_no]->link; //XMLから詳細抽出 $temp[2] = $xml->channel->item[$item_no]->description; //XMLから料金抽出 $temp[3] = $xml->channel->item[$item_no]->vc_price; //タイトルが取得出来ている場合のみ表示 if ($temp[0] != '') { //抽出データをUTF-8からSJISに変換 for ($i = 0; $i < 3; $i++) { $temp[$i] = mb_convert_encoding($temp[$i],"SJIS","UTF-8"); } //HTML出力 print '<a href="'.$temp[1].'"><strong>'.$temp[0].'</strong><img src="https://ad.jp.ap.valuecommerce.com/servlet/gifbanner?vs=XXXXXXXXXX&vp=XXXXXXXXXX" height="1" width="1" Border="0"></a> '; print '安い順ランキング: '.($item_no + 1).'位 '; print '<br>'; print $temp[2].'<br>'; print '<strong>料金:</strong> '.number_format($temp[3]).'円~<br>'; print '<br>'; } } } ?> <?php //キャッシュ読み込みの場合は、キャッシュ強制更新処理 if ($cr == 1){ print '<img src="launch.php?WORD='.$word.'&SCRIP='.$scrip.'" width="1" height="1"><br>'; } ?> ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ PHP関連記事(リンク一覧): さくらレンタルサーバーのアクセス履歴をPHPで表示 / PHPで画像のアップロード(さくらレンタルサーバーのPHPでImageMagick) / PHP REVERSI(オセロもどき)の続き / PHP REVERSI(リバーシ) - オセロもどきゲームの公開 / PHP版-簡易アクセスブロック(IPアドレス、ホスト名、OS、ブラウザ名で制御) / ...(記事連続表示)
最近の記事: プチエアホッケー - プチコン4でシンプルなエアホッケーゲーム / 今までに行ったことのあるスキー場まとめ(2024年) / ムカデ四匹対戦ゲーム - プチコン4でCOM対戦型ゲーム / 富士見パノラマリゾート(2024年2回目) / よませ温泉スキー場 / ガーラ湯沢スキー場(2024年3回目) / SPF、DKIM、DMARCの設定とネームサーバー(DNS)設定のトラブル / 朝一のKFC初体験(よりジューシーなチキン) / 富士見パノラマリゾート(2024) / ガーラ湯沢スキー場(2024年2回目)
■ ホームへ
|