-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcore.js
106 lines (89 loc) · 2.47 KB
/
core.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
/**
*
* @Author zhangyq
* @Date 2016-07-01
*
*/
'use strict';
var assert = require('assert');
var URL = require('url');
var request = require('request');
var headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'
};
var obj2query = function(obj) {
if (typeof obj !== 'object') return '';
return Object.keys(obj).map(function(key) {
return key + (obj[key] !== void 0 ? '=' + obj[key] : '');
}).join('&');
};
var getParam = function(body, host) {
var jschl_vc = body.match(/name=\"jschl_vc\"\s+value=\"([^\"]+)\"/);
var pass = body.match(/name=\"pass\"\s+value=\"([^\"]+)\"/);
var answer;
var url = body.match(/id=\"challenge-form\"\s+action=\"([^\"]+)\"/);
var ov = body.match(/(\w+)\=\{\"(\w+)\"\:([\+\!\[\]\(\)]+)\};/);
var iv = body.match(/(;\w+\.\w+[\%\*\/\-\+]\=[\+\!\[\]\(\)]+)+;/);
var code = 'var ' + ov[1] + ';' + ov[0] + iv[0] + ';return ' + ov[1] + '.' + ov[2] + ';';
var fn = new Function(code);
return {
url: url[1],
param: {
jschl_vc: jschl_vc[1],
pass: pass[1],
jschl_answer: fn() + host.length
}
};
};
var doRequest = function(opts, _time, cb) {
var url = opts.url,
headers = opts.headers,
time = opts.time;
request({
url: url,
headers: headers,
jar: true
}, function(err, res, body) {
if (err) {
cb && cb(err);
return;
};
console.log(res.statusCode);
switch (res.statusCode) {
case 503:
var param = getParam(body, URL.parse(url).host);
opts.url = URL.resolve(url, param.url + '?' + obj2query(param.param));
if (_time > opts.time) {
cb && cb(Error('Request failed. The Request time is more than ' + opts.time));
} else {
setTimeout(function() {
doRequest(opts, _time + 1, cb);
}, opts.frequency);
}
break;
case 200:
cb && cb(null, body, res.req._headers.cookie);
break;
default:
cb && cb(Error('Get an unknown status code `'+ res.statusCode +'`.'));
}
});
};
var run = function(url, cb) {
var opts = {
headers: headers,
time: 20,
frequency: 4000
};
if (typeof url === 'string') {
opts.url = url;
}
if (typeof url === 'object') {
Object.assign(opts, url);
}
assert.equal(typeof opts.url, 'string', 'The value of `url` option is invalid.');
assert.ok(opts.frequency >= 3000, 'The value of `frequency` option should not less than 3000.');
var _time = 0;
doRequest(opts, _time, cb);
};
module.exports = run;