ぜんぜんweb系の書き込みをしてませんでしたのでたまには、興味のない人にはなんだかわからない記事を書きます。
先月いじっていたんですが書き留めておいたメモを貼り付けるよ。素人の覚書なので参考までに。長いっす。
..:: LCP RECORDS ::..の購入ページでAmazon Webサービスを利用してみました。
ちなみにAmazonのディベロッパー・トークンとアソシエイトIDの取得が必要となります。
Amazon Webサービス登録手続きページ
Amazonアソシエイトセントラルのページ
まずは、所属アーティストのCDを数量指定して直接Amazonのショッピングカートに入れるようにしました。
これは簡単。
<form method="post" action="http://www.amazon.co.jp/gp/aws/cart/add.html"><input type="hidden" name="ASIN.1" value="ASINを入力" />
数量:<select name="Quantity.1">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>枚
<input type="hidden" name="AssociateTag" value="アソシエイトID" />
<input type="hidden" name="SubscriptionId" value="ディベロッパー・トークン" />
<input type="image" name="submit.add-to-cart" src="http://images-jp.amazon.com/images/G/09/buttons/add-to-cart-yellow.gif" alt="amazon.co.jp で買う" /></form>
どうせなら価格や納期情報もリアルタイムに表示したくなってきます。Amazon E-Commerce ServiceはAmazonの様々な商品情報を提供してくれます。ECSのURLにパラメーターを付けてアクセスするだけで、アマゾンのほとんどの商品情報を取得できます。さらにXSLファイルを指定すれば、XMLから自由なデザインでHTMLページを表示できます。詳しくはこのあたりでかなり情報収集できますので省略。
ECS4ではなんかうまくいかなかったので事例や情報の多いECS3で書いてみました。
単純にレーベルのCDの情報をxmlで取得するとこんな感じ。
http://webservices.amazon.co.jp/onca/xml3?
t=lostcolorpeop-22
&dev-t=1EEF4NZJ4R56ZVYH3SG2
&AsinSearch=B000AA7CQU,B000AA7CQK,B000AA7CQA,B00012IJ5K
&mode=music-jp
&type=heavy
&f=xml
&locale=jp
そのままだと使えないので必要なASIN(Amazonの商品コード)をキーにして納期、値引き、値引率等を抜き出して1500円以上であれば送料無料を表示するXSLファイルが以下の通り。
定価など変動しないものは拾いません。表示する商品は決まっているのでデザインを含んだHTMLではなく、欲しい情報だけ含んだphpを作ります。
aws.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="ProductInfo/Details" />
</xsl:template>
<xsl:template match="Details">
$<xsl:value-of select="Asin" />
= "<xsl:variable name="teika">
<xsl:value-of select="translate(ListPrice,',¥','')" />
</xsl:variable>
<xsl:variable name="urine">
<xsl:value-of select="translate(OurPrice,',¥','')" />
</xsl:variable>
<xsl:if test="$teika != $urine and $teika > 1 and $urine > 1">
× 税込<xsl:value-of select="OurPrice" />-<strong> (<xsl:value-of select="(100 - round($urine div $teika * 100))" />% OFF)</strong>
</xsl:if><br />
納期:<xsl:value-of select="Availability" /><xsl:if test="$urine > 1499">/<strong>送料無料</strong></xsl:if>";
</xsl:template>
</xsl:stylesheet>
ページを表示するごとに毎回AWSにアクセスして重くなってもいやなので1時間ごとにサーバーにキャッシュすることに。
aws_update.php
<?
$uptime = 60; //更新間隔:単位=分
$ftime = date("U", filemtime("/ルートパス/aws.php")) ; //前回の取得時間
$now = date("U"); //現在時刻
$etime = round(($now - $ftime) / 60);//もし指定の更新時間を超過していたらawsから4枚のCDの情報をaws.xsl経由でもらう
if ($etime > $uptime) {
$val = file_get_contents("http://webservices.amazon.co.jp/onca/xml3?t=アソシエイトID&dev-t=ディベロッパー・トークン&AsinSearch=ASINを入力&mode=music-jp&type=heavy&f=http://パス/aws.xsl&locale=jp");
//何故かomit-xml-declarationで消えない宣言文除去
$val = str_replace('<?xml version="1.0" encoding="UTF-8"?>', '', $val);
$val = "<?" . $val . "?>"; //phpにする
$aws = fopen("/ルートパス/aws.php","w+"); // 上書きモードでオープン
set_file_buffer($aws, 0); //バッファリングをクリア
flock($aws, LOCK_EX); // 排他処理
fwrite($aws, $val); // 書き込み
fclose($aws); // ファイルを閉じる
}
?>
前のページ表示から1時間以上たっていると新しい情報を取ってきます。そうするとこんなファイルが出来上がり。
aws.php
<?
$B000AA7CQU = "<br/>納期:通常24時間以内に発送/<strong>送料無料</strong>";
$B000AA7CQK = "<br/>納期:通常24時間以内に発送/<strong>送料無料</strong>";
$B000AA7CQA = "× 税込\1,995-<strong> (5% OFF)</strong><br/>納期:通常4~6週間以内に発送/<strong>送料無料</strong>";
$B00012IJ5K = "<br/>納期:通常3~4日以内に発送";
?>
こいつと先ほどのaws_update.phpを納期などを表示したいphpにincludeしておく。
<? include("/ルートパス/aws_update.php"); ?>
<? include("/ルートパス/aws.php"); ?>
表示したい該当商品の場所に商品コードのキーを記述。
<? print $B000AA7CQU ?>
とするだけでその商品の納期、価格などが表示されます。
この方法だともし商品情報の取得自体に失敗してもASINをキーにしているのでページにはエラーも表示されない、はず。
また商品を増やしたいときも、AWSに送るパラメータに足すだけでXSLやアップデートのスクリプトは変更不要。
結果はこのページです。
http://www.lcprecords.com/archives/07buy/
なんかかなり適当に書いていますが一応問題なく動いています。ま、素人ですからなにが起こるやらわかりません。ちょうど先週まで期間限定で値引きがあったのでテストできましたがもう終わってしまいました。