簡體   English   中英

無法解碼亞馬遜廣告 API 下載報告

[英]Unable to decode Amazon Advertising API downloaded report

我在使用亞馬遜廣告 api 時遇到問題。 我正在使用 nodejs 庫( https://github.com/humanstupidity/amazon-advertising-api )從亞馬遜獲取報告,該報告返回一個似乎是二進制的主體,但我無法使其可讀JSON。

我在郵遞員中嘗試了請求,它返回相同的二進制響應。 我必須從郵遞員那里下載並解壓縮文件以使其可讀,但不知何故我無法使其在 nodeJS 中工作。

這是庫中很重要的部分:

const request = require('request');
const util = require('util');

const requestPromise = util.promisify(request);
const postRequestPromise = util.promisify(request.post);
const getRequestPromise = util.promisify(request.get);


module.exports = class AdvertisingClient {
    async getReport(reportId) {

        while (true) {

            let reportRequest = JSON.parse(await this._operation(`sp/reports/${reportId}`));

            if (reportRequest.status === 'SUCCESS') {
                return this._download(reportRequest.location);
            }

            await sleep(500);

        }

    }
    _download(location, auth = true)
    {
        let headers = {}

        if (auth) {
            headers.Authorization = 'Bearer ' + this.options.accessToken;
        }

        if (this.options.profileId) {
            headers['Amazon-Advertising-API-Scope'] = this.options.profileId;
        }

        let requestOptions = {
            url: location,
            headers: headers,
            followRedirect: false,
            gzip: true
        }

        return this._executeRequest(requestOptions);
    }

    async _executeRequest(requestOptions){

        let response = await getRequestPromise(requestOptions);

        if (response.statusCode == 307) {
            let finalResult = await this._download(response.headers.location, false);
            return finalResult;
        }

        let result={
            success: false,
            code: response.statusCode,
            response: response.body,
            requestId: 0
        };

        console.log(result);

        if (!(response.statusCode < 400 && response.statusCode >= 200)) {
            let data = JSON.parse(response.body);

            if (data && data.requestId) {
                requestId = data.requestId;
            }

            result = false;
        } else {
            result.success = true;
        }

       return result

    }

    async _operation(_interface, data, method = 'GET') {
        let url = `https://${this.endpoint}/v2/${_interface}`;
        let headers = {
            'Authorization': 'Bearer ' + this.options.accessToken,
            'Amazon-Advertising-API-ClientId': this.options.clientId,
            'Content-Type': 'application/json',
        }

        if (this.options.profileId) {
            headers['Amazon-Advertising-API-Scope'] = this.options.profileId;
        }

        let requestOptions={
            url: url,
            headers: headers,
            method: method,
            gzip: true,
        }

        if (method=="GET") {
            requestOptions.qs=data;
        }else{
            requestOptions.json=data;
        }

        let response = await requestPromise(requestOptions)

        let resData = response.body;

        if (!resData.error) {
            return resData;
        } else {
            throw resData.error;
        }

    }
}

我通過函數調用代碼:

let reportResult = await client.getReport(reportID);

這是我得到的結果:

{
  success: false,
  code: 200,
  response: '\u001f�\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000���j�@\u0010\u0006�{�B<�\u0010�������P�\u0016�[���M�F\r\u001a\u000b����\u0002y�nӖ�!�7����7�O\u001faRT�p�Fa\u0012g�8}�g�p\u0002H\\\u0019�H�����.M^��4ۗ���"�Z�\u0016q��I8��MR:��y3�\u001a/�F�P3\u0004�C�\u0017�t\\\u0017Y\u001a��\u001b��v��Hf��(`��0�+֧�g�8��]\u000b\u0019\u0013�\u001d-I\u001b.%��g��`���$���\u001f(��f~�tʐ�`H�/C���\u0011�>\u0014M\u0000�Fw\f��\u001b\u0018���\f�71`.���]Ev9[4\r1��5��!�˥�i\u0018�m�\u001c�R�=3��I�VL(����t�~sm_��\\i!\u0005\n' +
    '�٠�aU���=��e�\u0007KW�Ypk�z(��Q��\u0003\u0013$`�em\u0010�\u0018=�d�����}���y3��\u000b.��=9\u0004\u0000\u0000',
  requestId: 0
}

我也玩過 zlib,但只收到錯誤Error: unexpected end of file

我對 nodeJS 很陌生,真的不知道問題是什么。

非常感謝您的幫助!

正文是一個gzip 'ed(壓縮)JSON。 您需要先對其進行gunzip

如果您使用amazon-advertising-api-sdk包,它會自動為您執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM