如何获取亚马逊MWS所有产品的列表

how to get list of all products amazon MWS

你能解释一下如何在我提交 requestReport 时获取所有产品列表 (_GET_MERCHANT_LISTINGS_ALL_DATA_)

我收到以下请求:

<?xml version="1.0"?>
<RequestReportResponse xmlns="http://mws.amazonaws.com/doc/2009-01-01/">
  <RequestReportResult>
    <ReportRequestInfo>
      <ReportType>_GET_MERCHANT_LISTINGS_ALL_DATA_</ReportType>
      <ReportProcessingStatus>_SUBMITTED_</ReportProcessingStatus>
      <EndDate>2016-11-02T12:12:30+00:00</EndDate>
      <Scheduled>false</Scheduled>
      <ReportRequestId>50148017107</ReportRequestId>
      <SubmittedDate>2016-11-02T12:12:30+00:00</SubmittedDate>
      <StartDate>2016-11-02T12:12:30+00:00</StartDate>
    </ReportRequestInfo>
  </RequestReportResult>
  <ResponseMetadata>
    <RequestId>05d33eb0-dbaf-42d0-88c1-794605d55980</RequestId>
  </ResponseMetadata>
</RequestReportResponse>

那我怎样才能得到所有产品的列表呢?

都在这里拼写出来了:http://docs.developer.amazonservices.com/en_US/reports/index.html

基本上,您使用RequestReport 操作提交请求,使用GetReportRequestList 检查请求的状态。完成后,您将获得一个 GeneratedReportId,您将使用它调用 GetReportList and/or GetReport 和报告 ID 以获取报告数据。

由于您已经提交了报告请求,请使用您收到的 ReportRequestId 并致电 GetReportRequestListhttp://docs.developer.amazonservices.com/en_US/reports/Reports_GetReportRequestList.html

这会告诉你状态,让你知道什么时候完成,并给你一个 GeneratedReportId

由于您使用的是 PHP,请下载 PHP 的 SDK,大部分工作已经为您完成。 https://developer.amazonservices.com/doc/bde/reports/v20090101/php.html/154-1105707-5344447

示例脚本:从亚马逊获取您自己的产品

作曲家 要求:cpigroup/php-amazon-mws

此脚本执行 3 个步骤:

  1. 请求报告 (returns ReportRequestId)
  2. 列出报告并获取报告 ID (returns ReportId) (调用它直到我们找到我们请求的报告)
  3. 加载报告 (并保存 ofc)

它不漂亮,但可以完成工作。 您可以根据需要更改它。

/**
 * How to at stack:
 * 
 *
 * Docu at amazon:
 * https://docs.developer.amazonservices.com/en_US/reports/Reports_ReportType.html#ReportTypeCategories__ListingsReports
 *
 * We need to call the api (min) 3 times:
 * 1. request a report                           (returns ReportRequestId)
 * 2. list the report and get the report id      (returns ReportId)
 *    (calling this until we find our requested report)
 * 3. load the report                            (returns report data)
 */


// If got id already, then set here:
$reportRequestId = null;
$reportId = null;

// Set the report type to request.
#$reportType = '_GET_MERCHANT_LISTINGS_DATA_LITE_';
$reportType = '_GET_MERCHANT_LISTINGS_DATA_';

// This method sets the start and end times for the report request.
// If this parameter is set, the report will only contain data that was updated
// between the two times given.
// If these parameters are not set, the report will only contain the most recent data.
$reportTimeFrom = null;#'2015-01-01'; // null or string
$reportTimeTo = null;#'2021-08-28'; // null or string

// This method sets the list of marketplace IDs to be sent in the next request.
// If this parameter is set, the report will only contain data relevant to the marketplaces listed.
$marketPlaces = null; // null, string or array of strings
// $marketPlaces = [
//     // 'A1PA6795UKMFR9', // amazon_de
//     // 'A13V1IB3VIYZZH', // amazon_fr
//     // 'A1F83G8C2ARO7P', // amazon_uk
//     // 'A1RKKUPIHCS9HS', // amazon_es
//     // 'APJ6JRA9NG5V4', // amazon_it
// ];

// For w/e reason we must provide a sales channel.
// But we get all (or the $marketPlaces restricted) products anyway.
// And - tested - amazon_de or _fr ... does not change the response.
// So this does not matter. Just leave it amazon_de.
$salesChannel = 'amazon_de';

// Set file name where to save the report.
$filenamePrefix = '';
if (is_string($marketPlaces)) {
    $filenamePrefix = "{$marketPlaces}_";
} elseif (is_array($marketPlaces)) {
    $filenamePrefix = implode('_', $marketPlaces) . '_';
}
$destinationFile = __DIR__ . "/{$filenamePrefix}products.csv";

// Set the path to the config file.
$configPath = 'config/amazon/amazon_config.php';

// =====================================================================
// 1. Report Request.
// =====================================================================
if ($reportRequestId === null and $reportId === null) {
    echo "Got no report request id and no report id - do a new report request ....\r\n";
    $api = new \AmazonReportRequest(
        $salesChannel,
        false, // mock param
        null, // mock param
        $configPath
    );
    $api->setThrottleStop();
    $api->setReportType($reportType);
    if ($reportTimeFrom !== null and $reportTimeTo !== null) {
        $api->setTimeLimits($reportTimeFrom, $reportTimeTo);
    }
    $api->setShowSalesChannel(true);
    if ($marketPlaces !== null) {
        $api->setMarketplaces($marketPlaces);
    }
    $api->requestReport(); // Actual api call.
    $response = $api->getResponse();
    // Example response:
    // [
    //     'ReportRequestId'        => '111111111111',
    //     'ReportType'             => '_GET_MERCHANT_LISTINGS_DATA_LITE_',
    //     'StartDate'              => '2021-08-27T17:17:52+00:00',
    //     'EndDate'                => '2021-08-27T17:17:52+00:00',
    //     'Scheduled'              => 'false',
    //     'SubmittedDate'          => '2021-08-27T17:17:52+00:00',
    //     'ReportProcessingStatus' => '_SUBMITTED_',
    // ];
    if (!isset($response['ReportRequestId'])) {
        echo "Missing report request response[ReportRequestId].\r\n";
        exit(1);
    }
    $reportRequestId = $response['ReportRequestId'];
    echo var_export($response, true) . PHP_EOL; // debug
    echo "ReportRequestId: '{$reportRequestId}' --OK.\r\n";
    echo "\r\n";
}

// =====================================================================
// 2. Report List.
// =====================================================================
if ($reportRequestId !== null and $reportId === null) {
    echo "Got a report request id '{$reportRequestId}' (no report id) - list the report request ...\r\n";
    $api = new \AmazonReportList(
        $salesChannel,
        false, // mock param
        null, // mock param
        $configPath
    );
    $api->setThrottleStop();
    // Search for the exact report we requested above (by report request id and type).
    $api->setRequestIds($reportRequestId);
    $api->setReportTypes($reportType);
    do {
        $api->fetchReportList(); // Actual api call.
        $list = $api->getList();
        // Example list:
        // [
        //     [
        //         'ReportId'        => '22222222222222222',
        //         'ReportType'      => '_GET_MERCHANT_LISTINGS_DATA_LITE_',
        //         'ReportRequestId' => '111111111111',
        //         'AvailableDate'   => '2021-08-27T17:18:11+00:00',
        //         'Acknowledged'    => 'false',
        //     ],
        // ];
        // Search our report request in the list.
        foreach ($list as $row) {
            if (!isset($row['ReportRequestId'])) {
                echo "Missing report list row[ReportRequestId].\r\n";
                exit(1);
            }
            if ((string)$row['ReportRequestId']
                === (string)$reportRequestId
            ) {
                // Found our report request.
                // Get the report id.
                if (!isset($row['ReportId'])) {
                    echo "Missing report list row[ReportId].\r\n";
                    exit(1);
                }
                $reportId = $row['ReportId'];
                echo var_export($row, true) . PHP_EOL; // debug
                break 2; // Break out of foreach AND do loop.
            } else {
                echo "Different report request '{$row['ReportRequestId']}' --SKIP.\r\n";
            }
        }
        if ($reportId === null) {
            $waitSec = 4;
            echo "Could not find report with request id '{$reportRequestId}'. --RETRY in {$waitSec} sec.\r\n";
            // See https://docs.developer.amazonservices.com/en_US/reports/Reports_RequestReport.html
            //      Throttling
            //      Maximum request quota    Restore rate                Hourly request quota
            //      15 requests              One request every minute    60 requests per hour
            for ($i = 0; $i < $waitSec; $i++) {
                echo ".";
                sleep(1);
            }
            echo "\r\n";
        }
    } while ($reportId === null);
    echo "ReportId: '{$reportId}' --OK.\r\n";
    echo "\r\n";
}

// =====================================================================
// 3. Load Report by id.
// =====================================================================
if ($reportId !== null) {
    echo "Load Report by id '{$reportId}' ...\r\n";
    $api = new \AmazonReport(
        $salesChannel,
        null, // report id (optional)
        false, // mock param
        null, // mock param
        $configPath
    );
    $api->setThrottleStop();
    $api->setReportId($reportId);
    $api->fetchReport(); // Actual api call.
    $r = file_put_contents($destinationFile, $api->getRawReport());
    if ($r === false) {
        echo "Cannot save report to file '{$destinationFile}'.\r\n";
    } else {
        echo "Report saved to file '{$destinationFile}'.\r\n";
    }
}
echo "Finished.\r\n";

示例输出:

// Got no report request id and no report id - do a new report request ....
// array (
//     'ReportRequestId'        => '111111111111',
//     'ReportType'             => '_GET_MERCHANT_LISTINGS_DATA_',
//     'StartDate'              => '2014-12-31T23:58:00+00:00',
//     'EndDate'                => '2021-08-26T23:58:00+00:00',
//     'Scheduled'              => 'false',
//     'SubmittedDate'          => '2021-08-27T18:25:53+00:00',
//     'ReportProcessingStatus' => '_SUBMITTED_',
// )
// ReportRequestId: '111111111111' --OK.
//
// Got a report request id '111111111111' (no report id) - list the report request ...
// Could not find report with request id '111111111111'. --RETRY in 15 sec.
// ...............
// array (
// 'ReportId'           => '22222222222222222',
// 'ReportType'         => '_GET_MERCHANT_LISTINGS_DATA_',
// 'ReportRequestId'    => '111111111111',
// 'AvailableDate'      => '2021-08-27T18:26:07+00:00',
// 'Acknowledged'       => 'false',
// )
// ReportId: '22222222222222222' --OK.
//
// Load Report by id '22222222222222222' ...
// Report saved to file 'tmp/_test.log'.
// Finished.

玩得开心=)