探索'request'包以在办公室执行一些自动化任务。
要求是自动登录服务器(但有很多),导航到网页然后收集信息,然后用它创建报告。
事实上,这些服务器首先要求提供用户帐户,然后他们生成一个挑战号码,一个人可以复制并粘贴到另一个服务器中,作为质询响应进行解析。此响应将粘贴回我希望脚本登录的网页。
尝试通过'请求'来弄清楚如何做到这一点。以下代码只能循环到输入用户名的页面:
"use strict"
var request = require('request');
var getJar = request.jar();
var opts = {
method: 'GET',
uri: 'https://serverIP/path/to/post/action',
agentOptions: {
rejectUnauthorized: false
},
jar: getJar,
followAllRedirects: true
};
var postJar = request.jar();
var postOpts = {
method: 'POST',
uri: 'https://serverIP/path/to/post/action',
form: {
userName: 'init'
},
agentOptions: {
rejectUnauthorized: false
},
postJar: postJar,
followAllRedirects: true,
headers: {
'Referer': 'value I see in dev console'
}
};
request(opts, function (err, res, body) {
console.log('GET error is: ' + JSON.stringify(err));
console.log('GET response is: ' + res);
console.log('GET body is: ' + body);
var cookie_string = getJar.getCookieString(opts.uri);
var cookies = getJar.getCookies(opts.uri);
console.log(JSON.stringify(cookies) + '\n' + cookie_string);
postOpts.postJar.setCookie(cookie_string, postOpts.uri);
request(postOpts, function (err, res, body) {
console.log('POST error is: ' + JSON.stringify(err));
console.log('POST response is: ' + res);
console.log('POST body is: ' + body);
});
});
代码段中的表单参数是我在Firefox>网络版>下的开发者控制台中看到的内容。 POST请求>通过浏览器提交用户名时的参数。
代码只会将我带回请求用户名的页面。有点卡在那里。我知道这一点,通过将POST主体的值记录到控制台,它会发出请求该值的HTML代码,而不是HTML,您可以看到挑战字符串和输入字段,以便粘贴质询响应。
我可以采取哪些不同的方式?
答案 0 :(得分:0)
我使用了'request-debug'包进一步了解。事实证明,第一个GET请求成功发生,我从中获取了cookie = sessionId值,并将其注入POST消息jar,如我的初始片段所示。
启用调试后,我能够检测到重定向到URL的错误说明了cookiesRequired'最后,请求正在遵循此重定向并生成第二个GET,在那里我显示了HTML代码,其中包含消息'无效会话,您必须登录'。
然后我发现,cookie会话系统无法正常工作。我从第二个GET看到它插入了一个标题,其中包含从cookie中获取的会话ID。所以我把这个标题注入了postJar,如下所示:
var cookie_string = getJar.getCookieString(opts.uri);
console.log('ATTENTION--- The cookie from getJar is:\t' + cookie_string);
postOpts.headers.cookie = cookie_string;
此行甚至不影响到目前为止的行为:
postOpts.jar.setCookie(cookie_string, '/');
插入cookie标题后,我现在被提示解决下一阶段的身份验证。