Yahoo!オークションWeb APIを使ってみた

後で絶対忘れるのでメモ書き。

Yahoo!オークションWeb APIというサービスを利用してみた。
カテゴリ情報や検索、商品詳細などいろいろな値をヤフオクより取得できるようですが、今回はオークション商品リストを使用して、ブログ記事最後部に一覧を表示します。

まずはアプリケーションIDの入手ですが、これはデベロッパーネットワーク右上の「アプリケーションIDを登録(無料)」をクリックして、サイト名とURLを入力すれば取得できました。
利用ガイドを軽く読むと、Web APIのアプリケーションIDには24時間ごとのリクエスト数制限があるようです。ガツガツ問い合わせをすると死ぬので、キャッシュ作りそれを活用する必要があるみたい。

クエリは、GETリクエストの構築が楽そうなのでGETで行きます。
商品リストの必須引数は、アプリケーションID(appid)とカテゴリID(category)のようです。

カテゴリIDは直接ヤフオクの画面を開いて、categoryの前にある数字を使用します。
サーバその他のヤフオクだと、次の太字になっている数字になります。
http://list3.auctions.yahoo.co.jp/jp/2084219510-category-leaf.html

ここまで情報がそろったら、いったんブラウザを使ってAPIへのテストを実行。下の「<アプリケーションID>」を自分のIDに書き換えてアクセスすると、XML形式のページが表示されるはずです。
http://auctions.yahooapis.jp/AuctionWebService/V2/categoryLeaf?appid=<アプリケーションID>&category=2084219510

これが表示されれば、あとは組み込むだけ。

まずはPerlでリクエストをキャッシュするCGIを作成。
仕組みは簡単で、一度取得したXMLをローカルに書き出し。次にアクセスがあった場合はその書き出したファイルの更新日を取得し、600以上差があったら再度サーバに問い合わせてローカルに書き出し。600未満だったらローカルのファイルを読みだして、それを返答します。
600は600秒、つまり10分間隔でのキャッシュ更新になります。

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use utf8;
#アプリケーションID
my $appid = "";
# HTML最初の出力
print "Content-Type: text/xml; charset=UTF-8\n\n";
no warnings 'uninitialized';
# ファイルのキャッシュが10分以内かどうか
my $lastmodified = (stat "cash.xml")[9];
if (time-$lastmodified < 600) {
    open(DATAFILE, "<:utf8", "cash.xmlt") or die("Error:$!");
    while(my $line = <DATAFILE>){
        chomp($line);
        print "$line\n";
    }
    close(DATAFILE);
} else {
    my $XML = get("http://auctions.yahooapis.jp/AuctionWebService/V2/categoryLeaf?appid=".$appid."&category=2084219510");
    open(DATAFILE, ">:utf8", "cash.xml") or die("Error:$!");
    print DATAFILE $XML;
    close(DATAFILE);
    print $XML;
}
ファイルロックとか何も考えていませんが、動けばOKの世界。
上記コードを「yahoo_api.cgi」として保存し、パーミッション「755」でサーバにアップロード。
同じ場所に空ファイル「cash.xml」を作成し、パーミッション「666」を設定です。

これでXMLの取得処理は完了。
つづいて表示側の処理。

XMLの解析はJavaScriptを使用してみました。サーバ側の資産ではなく、各クライアントの資産を使用してサーバ負荷を減らそうという見込みです。
XMLパーサーはjkl-parsexml.jsが手軽に使えるとの評判だったので、その評価に踊らされて使用。ただ単体ではなくRequest.jsも使ってます。
機能的には動くはず。

<html>
<head>
<script src="http://type-y.com/lib/jkl-parsexml.js"></script>
<script src="http://type-y.com/lib/Request.js"></script>
</head>
<body>
<script><!--
var http = new JKL.ParseXML( "http://10.46.31.47/yahoo_api.cgi" );
var tree = http.parse();
for (i=0; i<10; i=i+1){
    document.write( "<a href=\"" + tree.ResultSet.Result.Item[i].AuctionItemUrl + "\" target=\"_blank\">" );
    document.write( "<img alt=\"\" src=\"" + tree.ResultSet.Result.Item[i].Image["#text"] + "\" />" );
    document.write( "<br />" );
    document.write( tree.ResultSet.Result.Item[i].Title );
    document.write( "</a><br />" );
}
// --></script>
</body>
</html>
「http://10.46.31.47/yahoo_api.cgi」の部分は、CGIを置いたアドレスに書き換えてください。
この文字列を「yahoo.html」で保存してブラウザで開きます。

yahoo_web_api_test.jpg
うまくいっていれば、こんな感じで表示されるはずです。

少しつまずいたのは、画像イメージがテキストノードと属性の両方の要素を持っていること。
そのまま表示させようとしても[object Object]となるだけで、しばらく画像アドレスを取得することが出来ずに悩んでました。ヘルプ読むと#text というプロパティ名に格納されると書いてあり、試しにtree.ResultSet.Result.Item[i].Image["#text"]を指定すると、あっさりアドレスを取得。
勢いで組まずに、ヘルプを見ることは重要ですね。


あとはこのスクリプトをブログに組み込めば完成。
っと思ったけど、うまく動かない罠。
仕方なしに、インラインフレームを使用して呼び出し。
<iframe src="http://labo.type-y.com/yahoo_server.html" width="600"
height="230" style="margin:0px 0px 0px 0px;" frameborder="no"
scrolling="no" border="0">Inline FRAME
対応のブラウザをお使いください。</iframe>

これで設置完了です。


XMLの仕様はよく分からないけど、かなり便利という事がわかりました。
うむ、このWeb APIを応用すれば、いろいろな情報を集約することが可能ですね。
色々試してみなければ。

| コメント(0) | トラックバック(0) |
■Yahoo!オークション おすすめ商品■
Web Services by Yahoo! JAPAN

トラックバック(0)

トラックバックURL: http://type-y.com/mt/mt-tb.cgi/1530

コメントする