0

Bing Ads API v8 の背景: 私の node.js スクリプトでは、SubmitGenerateReport オペレーションを使用して Campaign PerformanceReportRequest を作成しています。これは ID を返します。これを使用して、長い URL を返す PollGenerateReport を呼び出します。例:

https://download.api.bingads.microsoft.com/ReportDownloadAdCenterAPIDownload.aspx?q=M3poINDSV[約200文字削除]05GUMsXBg%3d

ブラウザまたは wget でその URL を取得すると、すぐに必要なファイルが返されます。

ブラウザを使えば「CampaignPerformanceReport_08_29_2013_11_06_54.zip」のようなわかりやすいファイル名も出てきます…wgetで-Oを指定してファイル名をつけています。

理想的には、zip ファイルを adm-zip にストリーミングして、その場で解凍する、またはそのような方法が必要です。

ただし、node https または node-request を使用して URL から response.statusCode プロパティを取得することさえできません。

ノードにいくつかの既知の ECONNRESET 問題があるという議論を検索して見ましたが、私が知る限り、それらは私の状況には当てはまらないようです。

私の現在の考えは、次のいずれかです。

  1. .zip ファイルへの長い URL の応答がノードによって検出されない - リダイレクトを検出しようとしましたが、前述のように、statusCode を取得することさえできません。

  2. Bing Ads API を満足させるために指定する必要があるヘッダーがあるのではないでしょうか?

関連するエラーを含むコードを次に示します。

ノード HTTPS の使用:

https.get(file_url, function(res) {
  console.log("Got response: " + res.statusCode);
  console.log("headers.location: " + res.headers.location);
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

約 35 秒後、次のエラーが返されます。

Got error: read ECONNRESET

.on エラーなしで、より詳細に:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: read ECONNRESET
    at errnoException (net.js:901:11)
    at TCP.onread (net.js:556:19)

ノードリクエストの使用:

request(file_url, function (error, response, body) {
    if (!response.statusCode == 200) {
       console.log(response.statusCode)
    }
});

約 35 秒後、次のエラーが返されます。

TypeError: Cannot read property 'statusCode' of undefined
    at Request._callback (C:\Program Files\nodejs\testzipstream.js:35:18)
    at self.callback (C:\Program Files\nodejs\node_modules\request\index.js:148:
22)
    at Request.EventEmitter.emit (events.js:95:17)
    at ClientRequest.self.clientErrorHandler (C:\Program Files\nodejs\node_modul
es\request\index.js:257:10)
    at ClientRequest.EventEmitter.emit (events.js:95:17)
    at CleartextStream.socketErrorListener (http.js:1528:9)
    at CleartextStream.EventEmitter.emit (events.js:95:17)
    at Socket.onerror (tls.js:1424:17)
    at Socket.EventEmitter.emit (events.js:117:20)
    at net.js:441:14

不足しているもの、および/または他に何を調査する必要がありますか? ありがとう!

4

2 に答える 2

1

httpヘッダーに関連していると確信しています。私はかつて同様の問題を抱えていました.wgetまたはcurlを使用してファイルをダウンロードできましたが、nodeは500エラー応答を返しました。

Accept: */*wget と curl sendおよび node はデフォルトではそうではなかったことが判明しました。(そして、何らかの理由で、サーバーはこのヘッダーが欠落していることを好まなかった)

それを理解するために、ngrepを使用してヘッダーを盗聴しました。

それで、それを試して、wgetで請願を嗅ぎ、次にnodeでそれを嗅ぎます。

次に、ヘッダーを比較します。ヘッダー ノード send を wget と同じになるように置き換えます。それだけです。

于 2013-08-30T15:26:35.827 に答える
0

Bing Ads API は SSLv3 を使用し、ノードはデフォルトで SSLv1 を使用します。https globalAgent で SSLv3 を使用するように指定すると、それが機能します。

https.globalAgent.options.secureProtocol='SSLv3_method';
于 2014-11-18T15:35:31.033 に答える