ディレクトリ型検索dtn猫ネコサーチエンジンの検索結果画面には、Yahoo商品検索APIを使って、検索ワードに関連した商品リンクがでるようにしてあります。久々に自分のサイトで検索をしてみたところ、PHPのWarningが複数表示されてしまっており、warningの詳細を見るとAPI関連のエラーというのが分かりました。

検索するとPHPのWarningが….

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

APIのバージョンもVersion1からVersion3に変更がされており、取得可能なデータもXML、PHPserialize、JSONPが無くなって、JSONに一本化されてしまっておりました。商品検索(V3)の詳細はこちらでご確認どうぞ。

途中にVer2があった??となると、かなりの期間エラーが表示されてしまっていたのかもしれません。取り急ぎ、このあたりを修正してみましたので、今回はそんな話となります。

リクエストURL自体もv1→v3にURLが変更されているので、まずはここから修正です。

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

リクエストで投げるパラメータの仕様はほぼ昔のままっぽいので、以前に利用していたアプリケーション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データが入っていたのですが、商品検索(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・画像・金額があれば検索結果スライダーは作ることができるので、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;
}

以上でスライダー用配列にデータが入ってくれたので、また昔のように検索結果に商品画像がでてくれるようになりました。

以前に作ったキーワードトレンドチェックサイトにもスライダーがあったので、そこも一緒に直しておきました。

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

マスク、マスク、マスク……

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