我正在尝试将curl请求转换为nodeJS脚本,但不知何故它在我身上失败。通过失败的方式,我使用cloudflare设置的url触发验证码,而当我使用卷曲时它没有请求我从开发工具复制>网络标签。
这里是卷曲
curl -q 'https://foo.bar/path' -H 'cookie: somecookie' -H 'origin: https://foo.bar' -H 'accept-encoding: gzip, deflate, br' -H 'accept-language: en-US,en;q=0.9,pt;q=0.8' -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' -H 'content-type: application/x-www-form-urlencoded; charset=UTF-8' -H 'accept: */*' -H 'referer: https://foo.bar/path' -H 'authority: www.foo.bar' -H 'x-requested-with: XMLHttpRequest' --data "foo=bazz" --compressed
这里是nodeJS代码
var request = require('request');
var url = 'https://foo.bar/path';
var cookie = 'somecookie';
var ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36';
var baseRequest = request.defaults({
headers: {
'Cookie': cookie,
'User-Agent': ua,
'origin': 'https://foo.bar',
'referer': 'https://foo.bar/path'
}
});
baseRequest.post({ url: url, formData: {
foo: 'bazz'
}}, function(err, response, body) {
console.log(body);
});
答案 0 :(得分:3)
有些在线工具可以为您提供https://curl.trillworks.com/#node
按照我为你做的方式,结果是:
var request = require('request');
var headers = {
'cookie': 'somecookie',
'origin': 'https://foo.bar',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US,en;q=0.9,pt;q=0.8',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'accept': '*/*',
'referer': 'https://foo.bar/path',
'authority': 'www.foo.bar',
'x-requested-with': 'XMLHttpRequest'
};
var dataString = 'foo=bazz';
var options = {
url: 'https://foo.bar/path',
method: 'POST',
headers: headers,
body: dataString
};
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
}
request(options, callback);
答案 1 :(得分:1)
exec(`curl -q 'https://foo.bar/path' -H 'cookie: somecookie' -H 'origin: https://foo.bar' -H 'accept-encoding: gzip, deflate, br' -H 'accept-language: en-US,en;q=0.9,pt;q=0.8' -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' -H 'content-type: application/x-www-form-urlencoded; charset=UTF-8' -H 'accept: */*' -H 'referer: https://foo.bar/path' -H 'authority: www.foo.bar' -H 'x-requested-with: XMLHttpRequest' --data "foo=bazz" --compressed`
, (error, result, metadata) => {
console.log(result);
});
您可以使用exec
答案 2 :(得分:0)
从 ES6 开始,您可以使用 async/await 来使用 curl 来执行子进程。这是一个简单的例子:
const { exec: execAsync } = require('child-process-async');
const { result, stderr } = await execAsync(`curl -s https://api.ipdata.co/country_name?api-key=test`);
console.log(result);