您好我正在尝试开始学习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
然后在Node 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);
});
});
});
答案 0 :(得分:0)
302表示临时移动的重定向,您将获得正确的错误页面(或在此情况下提供给您的服务器)。这个调用有一些东西你做错了,如果生成这样的话,url可能是错误的。
你的代码很乱,因为你是节点中的新手,因为你使用的是准确的请求,并且写这些东西几乎没有任何安慰。
使用像Axios这样的东西:https://github.com/mzabriskie/axios,以便更轻松地编写这样的请求。