新・楽天市場APIを叩いても403エラーしか返ってこない。対処法は…。

さて、楽天市場の商品情報を取得するために楽天ウェブサービスの商品検索APIを利用しているのだけれど、インフラのアップグレードがあるそうで、

アプリの再登録、新しいAPIドメインへの移行、最新APIバージョンのご利用が必須となります。

…という案内が届いた。

言われるままに従来のコードを更新してみる。

まずアプリを再登録して、新しいアプリケーションIDやらアクセスキーを取得、以前のものと置き換える。

そして、これまで利用してきた API エンドポイントを、新しいやつ( https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601) に書き換えて、試しにリクエストを送信。

…。

何度トライしても「403」エラーが返ってくる。接続を拒否られている。APIのテストフォームで生成した URL をコピーしてきて試してみても駄目。

いろいろ情報を集めてみると、どうやら、リクエスト時の HTTP ヘッダに「Origin: <アプリ登録時に入力したサイトドメイン>」を付けてやるとリクエストが通るらしい。

アプリを登録したときに "許可されたWebサイト" 欄に入力したドメイン。

PHP で cURL を利用する場合は以下のような感じ。

<?php
$url = 'https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601?' ;
$param = array(
             'accessKey' => 'アクセスキー' ,
             'applicationId' => 'アプリケーションID' ,
             'format' => 'json' ,
             'keyword' => '検索ワード'
        ) ;

// リクエストURLを組み立て
foreach( $param as $key => $val ){
        $url .= $key . '=' . $val . '&' ;
}
$url = rtrim( $url , '&' ) ; // いちおう末尾の & を削除。

// cURL の設定(最低限)
$ch = curl_init( $url ) ;
curl_setopt( $ch , CURLOPT_RETURNTRANSFER,1); // 結果を文字列として取得
curl_setopt( $ch , CURLOPT_HTTPHEADER , array('Origin: https://your_registered_domain.com')) ;

// 実行して結果を取得
$result = curl_exec( $ch ) ;

if( !$result ){
    echo '[ERROR]'.curl_error( $ch ) ; // エラーの場合
}else{
    echo $result ;
}

オレンジ文字の部分を、自身の環境に合わせて書き換えてください。

どうだ。

カテゴリ: