⑮MWS実践-レポート(出品リスト取得)-PHP-lib
- 2015年10月13日
- Amazon_MWS徹底解説
AmazonMWSで自分が出品している商品リストを取得する方法を説明します。PHPサンプルプログラム(題名にlibと記載しているのはAmazonのライブラリを利用するためです。)をつけて具体的に説明します。日々、変更される自分の出品リストを取得するのを自動化できますので、作業の効率化につながります。
まず、処理の流れを把握しておく必要があります。出品リストの取得はレポートAPIを用いて実施し要求を出してすぐに応答が返ってくるわけではありません。数分~1,2時間後(Amazonサーバの負荷状況や出品数に依存)に結果が返ってきて処理が完了し出品リストが取得できます。時間もかかるので私は毎日バッチファイルで取得するようにしています。
処理は下図の流れで処理されます。各①~③の処理はリクエストとレスポンスのREST-APIで処理され、①RequestReportでリクエストを送信し②GetRequestReportListで要求処理の状態を把握します。②でDONE(完了)になれば、③GetReportで作成された出品リストを取得します。
詳細はAmazonのこちらを参照してください。
①レポート要求処理【RequestReport】
Amazonに対して出品リスト(レポート)の作成依頼の要求を行います。ReportTypeを”_GET_MERCHANT_LISTINGS_DATA_”で行うことで出品リストを取得できる。要求の受付応答時に”ReportRequestId”を取得でき、状況確認・結果取得等に用います
②レポート処理状態確認【GetRequestReportList】
レポート要求の処理状態の確認を行う。処理の状態が”_DONE_”になれば処理は完了です。最近の処理が全て一覧で取得でき、処理を特定するため、①で取得した”ReportRequestId”を用いて、処理状態の確認を行います。
③レポート結果取得【GetReport】
②で処理の完了したものに対して、結果の取得を行います。今回でいけば出品リストが作成されているのでその取得を行います。①で取得した”ReportRequestId”を用いて、どの結果を取得するかを選択します。
以下が上記の流れを一通りの処理を行うPHPプログラムです。基本的にAmazonのライブラリを利用するので処理することを記載していけば動きます。★のところは各自の状況に合わせて修正してください。また、出力画面も綺麗ではないので、定義修正してください。
【Amazonのクライアントライブラリ】はこちら
(フィードとレポートAPIはライブラリが同一でした。商品APIなどは別です。)
【MWS接続方法】はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
<?php /** * Marketplace Web Service PHP5 Library * Generated: Thu May 07 13:07:36 PDT 2009 */ include_once ('.config.inc.php'); // 現在のディレクトリ(パス)を取得する $path = getcwd(); // 保存したいディレクトリを指定する。 // 今回は現在のディレクトリ配下に"List"というフォルダに入れる。(ディレクトリは作成済) $outBaseDir = $path . "List"; // ★★適宜修正★★ // USのAmazonに出品しているのでUSのエンドポイントを設定 $serviceUrl = "https://mws.amazonservices.com"; // HTTPの設定 $config = array ( 'ServiceURL' => $serviceUrl, 'ProxyHost' => null, 'ProxyPort' => -1, 'MaxErrorRetry' => 3, ); // *****************************リクエストの送信*************************** // パラメータ設定 $service = new MarketplaceWebService_Client( AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, $config, APPLICATION_NAME, APPLICATION_VERSION); $marketplaceIdArray = array("Id" => array('ABCDEFGHIJKLMN')); //★★修正要★★ $parameters = array ( 'Merchant' => MERCHANT_ID, 'MarketplaceIdList' => $marketplaceIdArray, 'ReportType' => '_GET_MERCHANT_LISTINGS_DATA_', 'ReportOptions' => 'ShowSalesChannel=true', ); $request = new MarketplaceWebService_Model_RequestReportRequest($parameters); // invokeRequestReportにより、リクエストの要求送信とリクエスト番号を取得 $procRequestId = invokeRequestReport($service, $request); // *************************リクエスト処理状況確認************************** $parameters = array ( 'Merchant' => MERCHANT_ID, ); $request = new MarketplaceWebService_Model_GetReportRequestListRequest($parameters); while (true){ // invokeGetReportRequestListにより処理中のリクエスト番号の状況把握 list($getProcRequetStatus, $getProcGeneratedId) = invokeGetReportRequestList($service, $request, $procRequestId); if ( $getProcRequetStatus == "_DONE_") break; sleep(180); } // *************************リクエスト結果取得 ************************** $parameters = array ( 'Merchant' => MERCHANT_ID, 'Report' => @fopen('php://memory', 'rw+'), 'ReportId' => $getProcGeneratedId, ); $request = new MarketplaceWebService_Model_GetReportRequest($parameters); $getReportCont = invokeGetReport($service, $request); // ファイルを開き出品データを保存する。 $outDir = sprintf('%s\%s', $outBaseDir, date('Y')); if (!is_dir($outDir)) { if (!mkdir($outDir, 0777, true)) { die('Failed to create output Directory [makdir]...'); } } $filename = sprintf('%s\List_%s_%s.csv', $outDir, date('Ymd'), date('His')); // ★★適宜修正★★ $fp = fopen( $filename , 'w'); fwrite($fp, $getReportCont); fclose($fp); // ●●●●●●●●●●●●●●●● サブ関数 ●●●●●●●●●●●●●●●● /** * Get Report List Action */ function invokeRequestReport(MarketplaceWebService_Interface $service, $request) { try { $response = $service->requestReport($request); if ($response->isSetRequestReportResult()) { $requestReportResult = $response->getRequestReportResult(); if ($requestReportResult->isSetReportRequestInfo()) { $reportRequestInfo = $requestReportResult->getReportRequestInfo(); if ($reportRequestInfo->isSetReportRequestId()) { print date( "Y" ) . "年" . date( "n月j日 G時i分s秒\t" ); printf("ReportRequestId\t"); printf($reportRequestInfo->getReportRequestId() . "\n"); } } } return $reportRequestInfo->getReportRequestId(); // エラー時の処理 } catch (MarketplaceWebService_Exception $ex) { print date( "Y" ) . "年" . date( "n月j日 G時i分s秒\n" ); printf("Caught Exception: " . $ex->getMessage() . "\n"); printf("Response Status Code: " . $ex->getStatusCode() . "\n"); printf("Error Code: " . $ex->getErrorCode() . "\n"); printf("Error Type: " . $ex->getErrorType() . "\n"); printf("Request ID: " . $ex->getRequestId() . "\n"); printf("XML: " . $ex->getXML() . "\n"); printf("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n"); } } /** * Get Report List Action */ function invokeGetReportRequestList(MarketplaceWebService_Interface $service, $request, $procRequestId ) { try { $response = $service->getReportRequestList($request); if ($response->isSetGetReportRequestListResult()) { $getReportRequestListResult = $response->getGetReportRequestListResult(); $reportRequestInfoList = $getReportRequestListResult->getReportRequestInfoList(); foreach ($reportRequestInfoList as $reportRequestInfo) { // ReportRequestIDが設定されていればIF分内の処理 if ($reportRequestInfo->isSetReportRequestId()) { $curRequestId = $reportRequestInfo->getReportRequestId(); // ReportRequestIDが処理中のRequestIDならIF分内の処理 if ( $curRequestId == $procRequestId ) { printf("ReportRequestId\t"); printf($reportRequestInfo->getReportRequestId() ); if ($reportRequestInfo->isSetReportProcessingStatus()) { print "\t" . date( "Y" ) . "年" . date( "n月j日 G時i分s秒\t" ); printf("\tReportProcessingStatus\t"); printf($reportRequestInfo->getReportProcessingStatus() . "\n"); $curStatus = $reportRequestInfo->getReportProcessingStatus(); } if ($reportRequestInfo->isSetGeneratedReportId()) { print "\t" . date( "Y" ) . "年" . date( "n月j日 G時i分s秒\t" ); printf("GeneratedReportId\t"); printf($reportRequestInfo->getGeneratedReportId() . "\n"); $curGeneratedReportId = $reportRequestInfo->getGeneratedReportId(); } } } } } if (isset($curGeneratedReportId)){ return array($curStatus, $curGeneratedReportId); } else { return array($curStatus, 1); } // エラー時の処理 } catch (MarketplaceWebService_Exception $ex) { print date( "Y" ) . "年" . date( "n月j日 G時i分s秒\n" ); printf("Caught Exception: " . $ex->getMessage() . "\n"); printf("Response Status Code: " . $ex->getStatusCode() . "\n"); printf("Error Code: " . $ex->getErrorCode() . "\n"); printf("Error Type: " . $ex->getErrorType() . "\n"); printf("Request ID: " . $ex->getRequestId() . "\n"); printf("XML: " . $ex->getXML() . "\n"); printf("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n"); } } /** * Get Report Action */ function invokeGetReport(MarketplaceWebService_Interface $service, $request) { try { $response = $service->getReport($request); if ( $response->getResponseHeaderMetadata() ) { print date( "Y" ) . "年" . date( "n月j日 G時i分s秒\n" ); printf(" ResponseHeaderMetadata: " . $response->getResponseHeaderMetadata() . "\n"); } return stream_get_contents($request->getReport()); // エラー時の処理 } catch (MarketplaceWebService_Exception $ex) { print date( "Y" ) . "年" . date( "n月j日 G時i分s秒\n" ); printf("Caught Exception: " . $ex->getMessage() . "\n"); printf("Response Status Code: " . $ex->getStatusCode() . "\n"); printf("Error Code: " . $ex->getErrorCode() . "\n"); printf("Error Type: " . $ex->getErrorType() . "\n"); printf("Request ID: " . $ex->getRequestId() . "\n"); printf("XML: " . $ex->getXML() . "\n"); printf("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n"); } } ?> |
コメントを残す