【问题标题】:Amazon Advertising API - Download Report Data and Unzip in NodeJS亚马逊广告 API - 在 NodeJS 中下载报告数据并解压缩
【发布时间】:2022-02-01 04:13:06
【问题描述】:

我正在尝试调用亚马逊广告 api 并下载活动报告,到目前为止成功地能够做到以下几点:

创建一个活动报告,获取报告 ID 并使用报告 ID,我可以获得 s3 下载 url。

问题在于,当我尝试下载数据时 - api 返回的响应应该是经过压缩的 json 格式并采用以下格式:

��VJN�-H�L��LQ�2227��45�017�����b%+����������

如何从这种压缩格式中提取 json 数据?我在 SO 上搜索并找到了一个类似的线程:

Why does Amazon Advertising report API return a .bin instead of .json

我还可以使用此线程中建议的“发送和下载”选项从邮递员那里获取有效的 json 文件。

但是在nodejs中尝试实现解压代码时卡住了,解析响应数据的代码sn-p

await axios.get(downloadurl, options)

        .then(async response => {
         console.log(response.data);
        
        // Calling gzip method
        zlib.gzip(response.data, (err, buffer) => {
  
        // Calling unzip method
        zlib.unzip(buffer, (err, buffer) => {
  
       console.log(buffer.toString('utf8'));
       finaldata =  buffer.toString('utf8');
      
     });
 });

// write data to file
 await fsPromises.writeFile('/Users/asbdb/Downloads/test1/test.json', finaldata);
    
        })
        .catch(error => {
            console.log({ error });
        });

任何关于如何以字符串格式解压缩和转换数据的指示都会非常有帮助。

上面的代码 sn -p 将其写入输出文件: output in file

【问题讨论】:

  • 请不要将失败的打印二进制数据尝试复制并粘贴到问题中。将二进制文件转换为十六进制或 base64 并将其放入您的问题中。带有问号的黑色菱形流完全没有用,并且会阻止人们试图帮助您。
  • 感谢 Mark 的指点,我能够对此进行更多挖掘,现在可以下载 .bin 文件 - 这是 api 返回的格式。我是 nodejs 新手,需要帮助了解如何将 .bin 文件转换/解压缩为 json 文件。
  • 您需要提供.bin文件。在您的问题中作为链接或编码(十六进制或base64)。如果它很长,请至少将前一百个字节放在问题中。
  • 嗨,马克,我正在附加 .bin 文件。我能够通过在线工具将其解压缩并获得未压缩的文件。我现在正在尝试以编程方式访问此文件中的数据 - 无论我尝试什么,乱码文本都会从文件中返回。
  • 到目前为止我所尝试的,1/ 将文件作为 .json 从 api 响应保存到磁盘。 2/ 从 api 响应中将文件作为 .bin 保存到磁盘。 3/ 我也将文件保存为“.gz”格式,然后尝试在 nodejs 中使用 zlib 解压缩它 - 这也不起作用。从 api 响应中附加以不同格式保存到磁盘的文件。文件在这里:drive.google.com/drive/folders/…

标签: node.js gzip amazon-advertising-api


【解决方案1】:

使用zlib.gunzip()提取内容。

您所拥有的是 gzip 流,而不是 zip 文件,因此 zlib.unzip() 无济于事。 zlib.gzip() 压缩,与提取相反,您正在寻找提取。

【讨论】:

  • 一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。
  • 最好先看看它是否能解决问题,但无论如何我都添加了文本。
  • 是的,这解决了问题 - 我能够从文件中提取内容,以下 sn-p 工作:
  • 这解决了问题!以下 sn-p 工作: 1/ 打开保存的文件并在缓冲区中读取数据 2/ Gunzip 使用 zlib.gunzip() 提取内容 3/ 提取内容并在控制台上打印 async function readFile() { const buffer = fs.readFileSync("/Users/jss/Downloads/test1/test.json"); console.log("来自文件的缓冲区:"+buffer); zlib.gunzip(buffer, (err, buffer) => { console.log("gunzip解压后的缓冲区数据:"+buffer.toString('utf8')); }); } 打印的数据是:[{"campaignId":227589508475555,"clicks":0,"impressions":4}]
  • 非常感谢 Mark 提供的帮助,在试图弄清楚如何使用这种数据格式时被困了很长时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多