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

新しくなった商品検索APIでは、レスポンスデータがJSONに統一されてしまっていましたので、JSONデコード処理を含めたPHPのサンプルコードをこちらの記事ではご紹介いたします。

PHPでwarningがでる

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

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

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

Yahoo APIの仕様変更

APIのサポートサイトを見てみると、いつの間にやらYahoo商品検索APIの仕様が変更されていたようで、API側データが空振りをし続けていたようです。

仕様を再確認していくと、APIのバージョンもVersion1からVersion3にまで変更がされており、取得可能なデータもXML、PHPserialize、JSONPが無くなってしまい、レスポンスはJSONに一本化されてしまっておりました。

Yahoo API 商品検索(V3)の詳細はこちらでご確認どうぞ。

途中にVer2があった??ということを考えると、かなりの期間でエラーが表示されてしまっていたのかもしれません。

APIの仕様に合わせてPHPを改修

リクエスト先URLの変更

APIのバージョン変更に伴い、リクエストURLも変更がされておりましたので、まずはここから修正です。

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

基本パラメータの変更はなし

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

ちなみに、YahooのAPIを利用するにあたっては、Yahoo IDでログインしてアプリケーションの登録が必要になります。アプリケーションの登録は、こちらのAPIご利用ガイドを見つつ簡単にできますので、使う場合はまず登録をして下さい。

それと、dtn.jpのようにこのAPIを使ってアフィリエイトをやってみたい方は、APIレスポンスにバリューコマースのアフィリエイトURLを生成してもらえるので、こちらのアフィリエイトIDの設定ガイドを見つつ設定をてみて下さい。

$YAppid = '0000000000000000000000000000000000000000000000000000000000';
$Yvalueid = "http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=0000000&pid=000000000&vc_url=";

クエリストリングの生成

アプリケーションIDとバリューコマースIDの二つのIDが準備できたら、あとは先程のリクエストURLにパラメータとこのIDをセットして投げればOKです。

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

レスポンスのXML→JSON変更対応

これまではレスポンスデータはXMLでデータを受けていたのですが、商品検索(V3)からはレスポンスデータがJSONに統一されてしまったようです。そこで、$YAPIBuffに入ったJSONデータから商品名、商品画像、金額などのデータを拾い上げたいと思います。

PHPだとJSONを扱うにはjson_decode()関数を使ってデコードすることになりますが、扱うデータをオブジェクト型(stdClass)で扱うか、配列型(Array)で扱うかは選択をすることができます。

どちらかというと、オブジェクト型の方がアロー演算子(->)でデータを引っ張りやすそうなので、json_decode()の第2引数にfalseを指定してオブジェクト型で取ることにしました。このあたりはお好みで選択下さい。

$Yjson = new stdClass;
$Yjson = json_decode( $YAPIBuff , false ) ;

これで$Yjsonにオブジェクト型となったjsonデータが入ってくれたので、あとはforeachで必要なデータを取り出していきます。

foreachでのデータ取得方法は色々あると思いますが、分かりやすくするため、検索結果部分に該当するkeyのhitsを$YItemに一度放り込みつつやってみます。

商品名・URL・画像・金額があれば、「ディレクトリ型検索dtn」、「猫ネコサーチエンジン」の検索ワードに連動した商品検索が作れますので、name、url、exImage->url、priceといった値を空の配列に取り出して積んでいきます。

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

以上でスライダー用配列にデータが入ってくれたので、また昔のように検索結果に検索連動商品広告を表示することができるようになりました。

おわりに

以前に作ったキーワードトレンドチェックサイトにもスライダーがあり、こちらにもAPIを使ったところが多々あったので、そこも一緒に直しておきました。

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

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

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