Yahooが提供する商品検索APIのバージョンが上がり、古いバージョンのAPIからデータが取れなくなっていたので、新バージョンの商品検索APIに対応するようPHPを修正しました。

新しくなった商品検索APIでは、レスポンスデータがJSONに統一をされていましたので、PHPでJSONデータをパースするサンプルコードなども合わせてご紹介したいと思います。

PHPでwarningが発生

ディレクトリ型検索エンジンdtn」、「猫ネコサーチエンジン」の検索結果画面には、Yahoo商品検索APIを使った、検索連動広告がでるようにしてあります。

久々に自分のサイトで検索をしてみたところ、PHPのWarningが複数表示されてしまっておりました。warningの内容を見るとAPI関連のエラーのようです。

猫ネコサーチエンジンの検索結果にプログラムエラーが表示される
検索するとPHPのWarningが….

YahooショッピングAPIの仕様が変更されていた

APIのサポートサイトを見てみると、いつの間にやらYahoo商品検索APIの仕様が変更されてしまっていました。このため、旧APIへのリクエストが全て空振りを続けてしまっていたようです。

改めて、APIの仕様をサポートサイトで確認してみると、これまで使っていたAPIのVersion1がVersion3にまで変更されており、取得可能なデータもXML、PHPserialize、JSONPが無くなり、JSONに一本化されておりました

商品検索(v3)

商品検索はYahoo!ショッピングの商品検索結果を取得することが可能なAPIです。
デベロッパーは日本最大級の商品データベースからキーワードでの商品検索をはじめ、JANコード、ジャンルカテゴリID、ブランドID、ストアIDでの商品検索を行い、JSON形式で各種商品情報を取得できます。

Yahoo API 商品検索(V3)の詳細

PHPのコードを書いた時にはAPIのVersionは1でしたが、既にVersion3となっておりましたので、途中にVersion2があった?ということを考えると、かなりの期間にエラーが表示されてしまっていたのかもしれません。

成果がほとんど期待できない検索連動広告でしたが、エラーが表示されて相当見栄えが悪い状態が続いてしまっていたようです。お恥ずかしい限りです。

Yahoo API 商品検索(v3)向けPHP

リクエスト先URLの確認

APIのバージョン変更に伴い、リクエストURLも変更されていましたので、まずはそこから修正をしていきます。ヤフーの商品検索API Version3用のリクエストURLは下記となっています。

【JSON】

https://shopping.yahooapis.jp/ShoppingWebService/V3/itemSearch

Yahoo API 商品検索(v3)のリクエストURL

PHPで設定していたリクエストURLをこのURLに変更します。

$YitemsearchUrl = "https://shopping.yahooapis.jp/ShoppingWebService/V3/itemSearch";

リクエストパラメータに変更はなし

APIに投げるリクエストパラメータの仕様はほぼ昔のままだったので、Version1で利用していたアプリケーションIDとバリューコマースアフィリエイトIDをそのまま流用することができました

YahooのショッピングAPIを利用するためには、アプリケーションIDとバリューコマースアフィリエイトIDの2つのキーが必要となります。お持ちでない場合には、下記の作業を一通りすれば無料で取得することができます。

  1. YahooのIDを取得する
  2. YahooのデベロッパーネットワークでアプリケーションIDを取得する
  3. バリューコマースに登録する
  4. バリューコマースでYahooショッピングと提携する
  5. Yahooショッピングのテキスト広告を作成する
  6. テキスト広告からバリューコマースアフィリエイトIDを生成する

YahooのショッピングAPIアフィリエイトについては、下記に細かくやり方やコツをまとめてあります。プログラミングアフィリエイトを実践してみたいという方はこちらもご参照下さい。

APIリクエストを生成する

アプリケーションIDとバリューコマースIDの二つのIDが準備できていれば、あとは先程のリクエストURLにパラメータとこのIDをセットして投げればJSONレスポンスデータを受け取ることができます。

例として、検索キーワードに関連した商品のうち、サイズ:146pxの画像が用意されている商品を10件取得するリクエストは、このような形で生成することができます。

//Yahoo API 商品検索(v3)リクエストURL
$YitemsearchUrl = "https://shopping.yahooapis.jp/ShoppingWebService/V3/itemSearch";

//お持ちのYahooアプリケーションID
$YAppid = "あなたの登録したアプリケーションID";

//生成したバリューコマースアフィリエイトID
$Yvalueid = "あなたのバリューコマースアフィリエイトID";

//キーワード
$KEYWORD = "キーワード";

//$KEYWORDに関連した、サイズ146の画像がある商品を10件
$YQuery = $YitemsearchUrl . '?appid=' . $YAppid . '&affiliate_type=vc&affiliate_id=' . urlencode($Yvalueid) . '&query=' . urlencode($KEYWORD) . '&image_size=146&hits=10';

//file_get_contents()でJSONを取得
$YAPIBuff = file_get_contents($YQuery);

JSONレスポンスデータの処理方法

ヤフーショッピングAPI Version1の時には、レスポンスデータはXMLで受け取っていましたが、商品検索(V3)からはレスポンスデータがJSONに統一されました。

先ほどのコードで$YAPIBuffにセットされたJSONデータから、商品名・商品画像・金額などのデータを拾い出します。

//file_get_contents()でJSONを取得
$YAPIBuff = file_get_contents($YQuery);

PHPでは、JSONデータをそのまま扱うことができないため、json_decode()という関数で「配列型」、もしくは「オブジェクト型」に変換します。アロー演算子「->」を使うことができるオブジェクト型の方が楽にデータが取れると思います。

PHPでJSONデータをパースする

取得した「$YAPIBuff」をjson_decode()する際に、第2引数部分にfalseを指定しておけばオブジェクト型で取ることができます。

//標準クラスのインスタンスを生成
$Yjson = new stdClass;
//オブジェクト型でデコードする
$Yjson = json_decode( $YAPIBuff , false ) ;

これで$Yjsonにオブジェクト型となったJSONデータが入ってくれたので、アロー演算子「->」をforeachで回していくことで、必要なデータを取り出していくことができます。

$Yjsonに入ったJSONデータから、商品名・URL・画像・金額を抜き出すサンプルコードです。順繰りに取り出したデータは、それぞれ空の配列に積み上げて保存をしていきます。

foreach($Yjson -> hits as $YItem){
  //タイトル用商品名
  $Yheadtitle[] = (string)$YItem -> name;        
  //アフィリエイトURL
  $YaffiliateUrl[] = (string)$YItem -> url;
  //アイテム画像[0]
  $YImageUrls[] = (string)$YItem -> exImage -> url;
  //価格
  $YPrice[] = (string)$YItem -> price;
}

商品名・URL・画像・金額といった、検索連動広告に必要となるデータを連想配列データに揃えることができました。この取得したデータを元に、広告データをフロントに表示させてあげれば検索連動広告の完成です。

おわりに

以前に制作したキーワードトレンドチェックサイトにもキーワード連動広告のスライダーを作ってありましたので、こちらもプログラムの修正をしておきました。

ところで、サイトに表示されていた商品キーワードをみると、上位にあるものがマスク、体温計、アルコールジェルとかばかりになっていて、コロナ禍で世の中が一気に変わったんだということが実感できました。

ECキーワードのランキングサイトKeyword Tool++にはコロナ関連商品ばかりが並ぶ
マスク、マスク、マスク……

会社そばのコンビニに感染者が出て閉店になったりと、益々近づいているコロナですが、色々と気を付けたいと思いました。