Nodejs模拟登陆人人遇到问题,求大大们解答
Nodejs模拟登陆人人遇到问题,求大大们解答
个人觉得好像是cookie没有保存,怎么办? <pre> var request = require(‘request’); var fs = require(‘fs’);
var request = request.defaults({jar: true});
request.post(‘http://www.renren.com/ajaxLogin/login’,{form:{email:'’,password:’}},function (error,response,body){ console.log(body);
request.get({url:'http://www.renren.com/Home.do'},function (error,response,body){
fs.writeFileSync('body.txt', body);
})
});
</pre>
在第二个request.get()方法并没有取得想要的主页内容,Home.do判断你没有登陆。。
Node.js 模拟登录人人网遇到问题
大家好,我最近在尝试使用 Node.js 来模拟登录人人网(Renren),但是在执行过程中遇到了一些问题。我怀疑是 cookie 没有正确保存导致的,希望各位大佬能帮忙解答一下。
代码示例
首先,我使用了 request
和 fs
这两个库来发送 HTTP 请求并保存响应内容。以下是部分代码:
var request = require('request');
var fs = require('fs');
// 使用 jar 选项自动处理 cookies
var request = request.defaults({ jar: true });
// 发送 POST 请求进行登录
request.post({
url: 'http://www.renren.com/PLogin.do',
form: {
email: 'your-email@example.com',
password: 'your-password'
}
}, function(error, response, body) {
console.log(body);
// 发送 GET 请求获取首页内容
request.get({
url: 'http://www.renren.com/Home.do'
}, function(error, response, body) {
fs.writeFileSync('body.txt', body);
console.log('Homepage content saved to body.txt');
});
});
问题分析
在这个代码片段中,我通过 request.defaults({ jar: true })
来启用自动管理 cookie 的功能。但是,从实际运行结果来看,第二次请求时并没有获得预期的登录后页面内容,而是返回了一个未登录的状态。
解决方案
根据我的经验,有几个可能的原因导致这个问题:
- URL 错误:请确保你发送 POST 请求的 URL 是正确的。人人网的登录 URL 可能与示例中的不同。
- 表单数据错误:检查
email
和password
是否正确,并且符合人人网登录表单的要求。 - Cookie 管理:确保
request.defaults({ jar: true })
正确配置并且被所有请求使用。
示例改进
你可以尝试以下改进后的代码:
var request = require('request');
var fs = require('fs');
// 启用自动处理 cookies
var request = request.defaults({ jar: true });
// 发送 POST 请求进行登录
request.post({
url: 'http://www.renren.com/PLogin.do',
form: {
email: 'your-email@example.com',
password: 'your-password'
}
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
// 登录成功后发送 GET 请求获取首页内容
request.get({
url: 'http://www.renren.com/Home.do'
}, function(error, response, body) {
fs.writeFileSync('body.txt', body);
console.log('Homepage content saved to body.txt');
});
} else {
console.error('Login failed:', body);
}
});
希望以上信息对你有所帮助!如果还有其他问题,请随时提问。
根据官方文档来说,request.defaults({jar: true});
这一句已经开启了全局 cookiejar 了。
所以我怀疑两点:
-
第一次 post 登陆没有成功
-
试着把第二次放在 setImmediate 里面试试,说不定有奇效。
第一点,当你修改post里面的账号不对的时候,返回的是“用户名和密码不匹配”所以post应该是成功了的。放进去还是没有效果啊。本人刚接触node不久
http请求是即时关闭的连接, 不是长连接.
也就是你的账号密码在get的时候还要发送
或者你有取得目标网站发送的cookie来跟踪账户
后来通信就是利用cookie通信了吧,不然难道在Home.do?email=***&password=***这样吗?这样明文传输不对吧
已经解决
根据你的描述,问题可能是由于Cookie没有正确保存或传递导致的。为了确保Cookie能够被正确地保存和使用,你可以尝试使用request-promise
库来处理Promise,并确保在整个会话中Cookie都能被正确传递。
以下是改进后的示例代码:
const request = require('request-promise');
const fs = require('fs');
async function loginAndFetchHomePage() {
const loginUrl = 'https://www.renren.com/ajaxLogin/login';
const homePageUrl = 'http://www.renren.com/Home.do';
try {
// 登录请求
const loginResponse = await request({
method: 'POST',
url: loginUrl,
form: {
email: 'your-email@example.com',
password: 'your-password'
},
jar: true, // 启用cookie管理
resolveWithFullResponse: true
});
console.log('登录响应:', loginResponse.body);
// 获取主页内容
const homePageResponse = await request({
url: homePageUrl,
jar: true // 确保使用同一个jar对象以保持cookie
});
console.log('主页内容:', homePageResponse);
// 将主页内容写入文件
fs.writeFileSync('homePageContent.txt', homePageResponse);
} catch (error) {
console.error('错误:', error);
}
}
loginAndFetchHomePage();
解释:
- 启用Cookie管理:在
request
选项中添加jar: true
来启用Cookie管理。 - 异步处理:使用
request-promise
库使请求返回Promise,便于使用async/await
语法进行异步操作。 - 使用同一个Jar对象:确保两次请求(登录和获取主页)使用的是同一个Cookie容器,这样可以保证会话的一致性。
- 错误处理:添加了错误处理逻辑,以便于调试。
确保将your-email@example.com
和your-password
替换为实际的用户名和密码。此外,如果目标网站的结构发生变化,请相应调整URL和表单数据。