MWSでAmazonの最安値を取得する

MWSのサンプルだと設定が不足していて動かなかったのでメモ。

## 1. MWSのClientLibraryをダウンロード

https://developer.amazonservices.com.au/phpclients
※PHPです
「Products」をクリック。

#2. 「.config.inc.php」を編集

MWSProductsPHPClientLibrary-2011-10-01/src/MarketplaceWebServiceProducts/Samples/.config.inc.php
で、以下の項目を埋める。

+ AWS_ACCESS_KEY_ID
+ AWS_SECRET_ACCESS_KEY
+ MERCHANT_ID
+ MARKETPLACE_ID

以下も必要なので、「.config.inc.php」に追記。

```
define('MWS_AUTH_TOKEN', '***');
```

#3. 「GetLowestOfferListingsForASINSample.php」を参考に実装


必要なファイルを読み込む。

```
require_once 'MWSProductsPHPClientLibrary-2011-10-01/src/MarketplaceWebServiceProducts/Client.php';
require_once 'MWSProductsPHPClientLibrary-2011-10-01/src/MarketplaceWebServiceProducts/Exception.php';
require_once 'MWSProductsPHPClientLibrary-2011-10-01/src/MarketplaceWebServiceProducts/Interface.php';
require_once 'MWSProductsPHPClientLibrary-2011-10-01/src/MarketplaceWebServiceProducts/Model/ASINListType.php';
require_once 'MWSProductsPHPClientLibrary-2011-10-01/src/MarketplaceWebServiceProducts/Model.php';
require_once 'MWSProductsPHPClientLibrary-2011-10-01/src/MarketplaceWebServiceProducts/Model/GetLowestOfferListingsForASINRequest.php';
require_once 'MWSProductsPHPClientLibrary-2011-10-01/src/MarketplaceWebServiceProducts/Model/GetLowestOfferListingsForASINResponse.php';
require_once 'MWSProductsPHPClientLibrary-2011-10-01/src/MarketplaceWebServiceProducts/Samples/.config.inc.php';
```

「invokeGetLowestOfferListingsForASIN」という関数をサンプルからコピペし、xmlを返すように改造する。

```
  function invokeGetLowestOfferListingsForASIN(MarketplaceWebServiceProducts_Interface $service, $request)
  {
      try {
        $response = $service->GetLowestOfferListingsForASIN($request);

        echo ("Service Response\n");
        echo ("=============================================================================\n");

        $dom = new DOMDocument();
        $dom->loadXML($response->toXML());
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        //echo $dom->saveXML();
        //echo("ResponseHeaderMetadata: " . $response->getResponseHeaderMetadata() . "\n");

        $xml = $dom->saveXML();
        $xmlObject = simplexml_load_string($xml);
        return $xmlObject;

     } catch (MarketplaceWebServiceProducts_Exception $ex) {
        echo("Caught Exception: " . $ex->getMessage() . "\n");
        echo("Response Status Code: " . $ex->getStatusCode() . "\n");
        echo("Error Code: " . $ex->getErrorCode() . "\n");
        echo("Error Type: " . $ex->getErrorType() . "\n");
        echo("Request ID: " . $ex->getRequestId() . "\n");
        echo("XML: " . $ex->getXML() . "\n");
        echo("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n");
     }
 }
```

requestを作成する。

```
    $serviceUrl = "https://mws.amazonservices.jp/Products/2011-10-01";

    $config = array (
        'ServiceURL' => $serviceUrl,
        'ProxyHost' => null,
        'ProxyPort' => -1,
        'ProxyUsername' => null,
        'ProxyPassword' => null,
        'MaxErrorRetry' => 3,
    );

    $service = new MarketplaceWebServiceProducts_Client(
        AWS_ACCESS_KEY_ID,
        AWS_SECRET_ACCESS_KEY,
        APPLICATION_NAME,
        APPLICATION_VERSION,
        $config
    );
    
    $request = new MarketplaceWebServiceProducts_Model_GetLowestOfferListingsForASINRequest();
    $request->setSellerId(MERCHANT_ID);
    $request->setMWSAuthToken(MWS_AUTH_TOKEN);
    $asinList = new MarketplaceWebServiceProducts_Model_ASINListType();
    $asinList->setASIN('XXXXXXX');// ここでASINを指定する
    $request->setASINList($asinList);
    $request->setMarketplaceId(MARKETPLACE_ID);
    $xml = invokeGetLowestOfferListingsForASIN($service, $request);
```

##4. xmlから最安値を取得する

```
    $amazon_price = null;
    $amazon_used_price = null;

    if (isset($xml->GetLowestOfferListingsForASINResult->Product->LowestOfferListings->LowestOfferListing)) {
        foreach ($xml->GetLowestOfferListingsForASINResult->Product->LowestOfferListings->LowestOfferListing as $listing) {
            if ($listing->Qualifiers->ItemCondition == 'New') {
                $amazon_price = intval($listing->Price->LandedPrice->Amount);
                break;
            }
        }
        foreach ($xml->GetLowestOfferListingsForASINResult->Product->LowestOfferListings->LowestOfferListing as $listing) {
            if ($listing->Qualifiers->ItemCondition == 'Used') {
                $amazon_used_price = intval($listing->Price->LandedPrice->Amount);
                break;
            }
        }
    }
```

## 感想

```
$serviceUrl = "https://mws.amazonservices.jp/Products/2011-10-01";
```

「2011-10-01」これって日付で絞り込むために指定してるのかと思いましたが、バージョンの指定らしいです。
2011年からバージョンアップしてないって、完成度たけーなオイｗｗｗ