先看代码
/**
* nodejs的request模块模拟登陆开源中国
*/
//密码加密模块
let CryptoJS = require('crypto-js');
let request = require('request');
//登陆post地址
let url = 'https://www.oschina.net/action/user/hash_login?from=';
//登陆的用户邮箱和密码
let user = {
email: '[email protected]',
pwd: '*********',
};
//登陆post的所有数据
let datas = {
email: user.email,
pwd: CryptoJS.SHA1(user.pwd).toString(),
verifyCode: '',
save_login: 1,
};
//设置头部
let headers = {
'User-Agent': `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36`,
};
let opts = {
url: url,
method: 'POST',
headers: headers,
form: datas,
};
//模拟登陆
request(opts, (e, r, b) => {
// console.log(r.headers['set-cookie']);
//登陆后访问首页
let opts = {
url: "https://www.oschina.net/",
headers: {
'User-Agent': `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36`,
Cookie: r.headers['set-cookie'], //这里是登陆后得到的cookie,(重点)
}
};
request(opts, (e, r, b) => {
console.log('是否登陆成功:', b.indexOf('意外金喜') > 0);
});
});
介绍
本文nodejs模拟登陆使用的模块:
模拟登陆:request - 官网:https://www.npmjs.com/package/request
密码加密:crypto-js - 官网:https://www.npmjs.com/package/crypto-js
一般网站模拟登陆都是获取到登陆后的cookie,然后就可以模拟登陆网站了。
网站分析
用户模拟登陆,
首先要有用户名和密码,本文使用的是邮箱和密码登陆。
然后要获得登陆post的url,
开源中国的是:https://www.oschina.net/action/user/hash_login?from=
这个url是怎么获得的呢?登陆了后会重定向,就找不到原来的url了。这里介绍一个小技巧,
使用谷歌浏览器,打开登陆的页面,F12,选择Network,勾上Preserve log
然后输入邮箱,密码再点登陆,工具就会记录所有的url
到这里就得到了登陆的url和登陆需要传递的参数。这密码是经过加密后的,继续探索网站,
看网站是使用的什么加密?
加密分析
回到登陆页面:https://www.oschina.net/home/login
审查页面的登陆button,
目测是根据btn-login这class绑定登陆事件的,不要问为什么。
然后开发者工具选择Sources,里面有页面所有的资源包括css,js,图片等。
在里面一个一个的js文件里搜索btn-login这字符串,最终找到了登陆的方法。
到这里就能看到密码是用的CryptoJS.SHA1加密,正好,nodejs有这加密模块crypto-js
获取登陆后的cookie
上面的代码:r.headers['set-cookie']就是获取登陆后的cookie。
打印出来是这样子的:
访问首页
headers带上登陆后得到的cookie,访问首页。我的开源中国用户名也是意外金喜。
判断了下访问首页后的html是否包含他:
console.log('是否登陆成功:', b.indexOf('意外金喜') > 0);
值为 true,证明模拟登陆成功。
大部分网站,只要研究透了他的登陆和反爬虫机制都能搞定。只是大部分。。。
意外金喜的博客:http://blog.csdn.net/zzwwjjdj1