嗨,我现在正在尝试开始学习 NodeJS,并且正在创建一个应用程序。目前的目标是通过节点调用网站,获取身份验证令牌,然后现在使用 POST 有效负载再次调用该网站,其中包括我的登录信息和身份验证令牌。 我使用 python 创建了相同的程序,我得到了 200 响应,而在 nodeJS 中我得到了 302。
我相信这是一个快速的解决方案,我想问题的主要内容是我对 NodeJS 缺乏理解,其中: 1.如果我应该将这些请求相互嵌套,因为它们应该是同一"会话"的一部分,并且 2.如果是这样,我该如何转到最后一个URL,example.com/poll 并能够存储/修改该信息(这只是一个json(,因为/如果我使用浏览器访问 example.com/poll URL,浏览器会自动下载它包含的文件是JSON格式,而不仅仅是显示它,这就是我需要的。这样我就可以将该数据保存在字符串等中,而不是下载它
在python中,我这样做(创建一个会话而不是进行两次调用(
url = "https://example.com/"
session = requests.session()
first_req = session.get(url)
auth_token_str = re.search(XXX, first_req.text)
login_url = 'https://example.com/sessions'
payload = { 'session[username_or_email]' : 'username', 'session[password]' : 'password', 'redirect_after_login':'/', 'authenticity_token': authenticity_token }
login_req = session.post(login_url, data=payload, headers=user_agent)
print "login_req response: ", login_req.status_code //gets me 200
然后在节点 JS 中:
var initLoad = {
method: 'GET',
url: 'https://example.com/',
headers: {
'User-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
}
};
request(initLoad, function(error, response, body) {
if (error) throw new Error(error);
var $ = cheerio.load(body, {xmlMode: false});
var authenticityToken = $("input[name=authenticity_token]").val();
console.log(authenticityToken);
var options = {
method: 'POST',
url: 'https://example.com/sessions',
headers: response.headers,
form: {
'session[username_or_email]': 'someUsername',
'session[password]': 'somePassword',
redirect_after_login: '/',
authenticity_token: authenticityToken
}
};
request(options, function(error, response2, body2) {
if (error) throw new Error(error);
console.log(response2.statusCode); //gets me 302 not 200
var analytics_url = 'https://example.com/poll';
var tripleload = {
method: 'GET',
url: analytics_url,
headers: response2.headers
};
request(tripleload, function(error, response3, body3) {
if (error) throw new Error(error);
res.end(body3);
});
});
});
302 表示临时移动的重定向,由于错误页面显示给您(或在这种情况下提供给您的服务器(。这个调用有一些东西你做错了,如果像这样生成,也许 url 是错误的。
您的代码很混乱,因为您是节点中的新手,并且您使用的请求是准系统,并且在编写这些东西时几乎没有舒适感。
使用类似 Axios: https://github.com/mzabriskie/axios 的东西来更轻松地编写这样的请求。