-
Notifications
You must be signed in to change notification settings - Fork 6
/
login_and_search_topic.js
126 lines (121 loc) · 5.25 KB
/
login_and_search_topic.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
var utils = require('./utils');
var searchTopic = require('./search_topic').searchTopic;
var args = utils.argsParse();
var sinaSSOEncoder = require('./sinassobase').sinaSSOEncoder;
var input_authcode = function() {
var consoleRead = utils.consoleRead;
return consoleRead("请输入pin.png的验证码:");
}
var login_error = function(errmsg){
if(errmsg)
console.log(errmsg);
else
console.log('login failed!', '检查用户名和密码,重新尝试登录!');
phantom.exit();
}
console.log('ready to login into sina...');
var page = require('webpage').create();
page.settings.userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36";
page.settings.loadImages = false; //don't load the inlined images to improve the performance
page.customHeaders = {
"Connection:": "keep-alive"
};
var user = args.username;
var password = args.password;
user = sinaSSOEncoder.getSuByUsername(user);
var preloginurl = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=" + user +
"&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=" + (new Date).getTime();
var pincodeurl = "http://login.sina.com.cn/cgi/pin.php";
var loginurl = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)';
page.open(preloginurl, function(status) {
if (status != "success") {
console.log("unable to access network");
} else {
var content = page.content;
var regex = /\{(.*)\}/;
//console.log(content);
var ret_json = JSON.parse(regex.exec(content)[0]);
utils.log(ret_json);
if (ret_json.pcid) {
//request the captchat and download it to the local
var _pincodeurl = utils.getPinCodeUrl(ret_json.pcid, pincodeurl);
console.log(_pincodeurl);
page.customHeaders = {
"Accept": "image/png,image/*;q=0.8,*/*;q=0.5",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "en-US,en;q=0.5",
"Connection": "keep-alive"
};
page.viewportSize = { width: 100, height: 40 };
page.open(_pincodeurl, function(status) {
if (status == 'success') {
page.render("pin.png",{format:"png",quality:"100"});
console.log("please waiting the captcha...");
var authcode = input_authcode();
var e = new sinaSSOEncoder.RSAKey;
e.setPublic(ret_json.pubkey, "10001");
//encrypt username and password
var sp = e.encrypt([ret_json.servertime, ret_json.nonce].join("\t") + "\n" + password);
var postdata = {
'door': authcode,
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'userticket': '1',
'pagerefer': '',
'cfrom': '1',
'vsnf': '1',
'su': user,
'service': 'miniblog',
'servertime': ret_json.servertime,
'nonce': ret_json.nonce,
'pwencode': 'rsa2',
'rsakv': ret_json.rsakv,
'pcid': ret_json.pcid,
'sp': sp,
'sr': '1440*900',
'encoding': 'UTF-8',
'prelt': '503',
'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META'
};
page.customHeaders = {
"Content-Type": "application/x-www-form-urlencoded",
"Connection": "keep-alive"
};
postdata = utils.httpBuildQuery(postdata);
page.open(loginurl, 'post', postdata, function(status) {
if (status == 'success') {
var waiting = utils.progressbar.start('Sign up.');
//try to delay 5s for waiting the response from sina SSO authentication
setTimeout(function(){
utils.progressbar.stop(waiting);
if (page.cookies.some(function(ele,index){return ele.name === "SSOLoginState"})){
console.log("login successfully!");
//开始搜索数据
searchTopic(page, args.topic, undefined);
}else{
login_error();
}
},5000);
}else{
var regex = /location\.replace\(.*\)/;
//获取出错的信息,因为页面是gbk的编码设定,使用了辅助方法urldecode解析,否则默认的utf编码会导致乱码
if(regex.test(page.content)){
a = regex.exec(page.content)[0].split('&').filter(function(ele,index){return ele.startsWith('retcode=') || ele.startsWith('reason=')});
var ret = [];
a.forEach(function(ele,index){utils.urldecode(ele.replace('")',""),'gb2312',function(str){ret.push(str.split('=')[1]);})});
//解码的方法实际上更新了DOM,并通过回调函数设置返回值,这里读取返回值变量时,使用setTimeout(...,0)
setTimeout(function(){login_error(['login failed!', 'errcode:', ret[0], 'errmsg:', ret[1]].join(" "))},0);
setTimeout(function(){if(ret.every(function(ele){return ele === undefined})){
login_error();
}},100);
}
}
});
}
});
}
}
});