はじめに
Yahooの提供するAPIを使って何かサービスを作ろうと思います。Yahooにもデベロッパーサイトがありまして、こちらに登録するとYahooの提供するAPIを利用できます。今回は商品検索APIについて解説します。
APIを使う準備
Yahooのアカウントは作っておいてください。Yahooのデベロッパー登録では審査はありませんので、私は開発&サービス提供用に新規アカウントを作りました。SDKもあって、Node.js、PHP、Python、R、Ruby、Gaucheがあります。残念ながらJavaはありません。ただし、xsdが公開されているので、AmazonのProduct Advertising APIの実装を流用できそうです。 APIを使う手順は公式に載っています。そのまま指示に従えばOKです。非常にわかりやすいと思います。一応、解説します。 APIを使うために、こちらにアクセスし、アプリケーションの情報を入力します。今回はサーバーサイドのアプリケーションを作るので「サーバーサイド」を選択します。 アプリケーションを登録すると「アプリケーションID」と「シークレット」が手に入ります。これらは使うのでメモしておいてください。「アフィリエイト」の項目もありますが、こちらは2015年3月31日にサービスが終了しています。 APIの仕様はこちらにあります。
Javaで受け取るために
xsdが公開されているので、Javaのxjcを使えばItemSearch APIのレスポンスは受け取れます。ただし公開されているものはxjcでコンパイルできません。そこで修正版を本稿の最後に示します。修正箇所は以下の3点です。
- attributeのひとつ「xsi:schemalocation」を削除
- 「targetNamespace」を追加
- いくつかの属性を配列で受け取れるように修正
おわりに
YahooはAPIを使うのに審査が一切ありません。というより「来る者は拒まず」という感じです。スパムとかで大変なことになっていないのはアフィリエイトがなくなったからでしょうか。ここまでにAmazonと楽天のAPIを使いましたが、SDKがない状態のAPIをJavaで呼び出す方法がかなり確立できました。近々、SDKがないAPIのJavaでの呼び出し方法について記事を書こうと思います。
Appendix
修正版のxsdファイル
<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Turbo XML 2.4.2.7. Conforms to w3c http://www.w3.org/2001/XMLSchema-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:yahoo:jp:itemSearch" elementFormDefault="qualified">
<xsd:element name="ResultSet">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Result">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Request">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Query" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Modules">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="PriceRanges">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Range">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Low" type="xsd:string"/>
<xsd:element name="High" type="xsd:string"/>
<xsd:element name="Hits" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Subcategories">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Path">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Category">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Id" type="xsd:string"/>
<xsd:element name="Name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Children">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Child">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Id" type="xsd:string"/>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Hits" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Hit" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Description" type="xsd:string"/>
<xsd:element name="Headline" type="xsd:string"/>
<xsd:element name="Url" type="xsd:string"/>
<xsd:element name="Availability" type="xsd:string"/>
<xsd:element name="Code" type="xsd:string"/>
<xsd:element name="PersonId" type="xsd:string"/>
<xsd:element name="Image">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Id" type="xsd:string"/>
<xsd:element name="Small" type="xsd:string"/>
<xsd:element name="Medium" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Price">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="currency" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="PriceLabel">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="FixedPrice" type="xsd:string"/>
<xsd:element name="SalePrice" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="taxIncluded" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Point">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Amount" type="xsd:string"/>
<xsd:element name="Times" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Shipping">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Code" type="xsd:string"/>
<xsd:element name="Name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="CategoryIdPath">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Category" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Id" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Brands">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Path">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Brand" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Id" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="JAN" type="xsd:string"/>
<xsd:element name="ISBN" type="xsd:string"/>
<xsd:element name="Store">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Id" type="xsd:string"/>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Url" type="xsd:string"/>
<xsd:element name="Payment">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Method" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Code" type="xsd:string"/>
<xsd:element name="Name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="IsBestStore" type="xsd:string"/>
<xsd:element name="Ratings">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Rate" type="xsd:string"/>
<xsd:element name="Count" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Image">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Id" type="xsd:string"/>
<xsd:element name="Medium" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="index" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="totalResultsAvailable" type="xsd:string"/>
<xsd:attribute name="firstResultPosition" type="xsd:string"/>
<xsd:attribute name="totalResultsReturned" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>