文章目錄
  1. 1. 模拟思路
  2. 2. 代码

上一篇日记讲的用nodejs模拟一个简单的网站登录并发帖,当碰到v2ex这种有经验的网站就需要懂点脑筋。

模拟思路

想用node模拟拿到v2ex的福利需要经过如下几步:

  1. 访问http://v2ex.com/signin,拿到隐藏的once和当前页面的cookie
  2. 用拿到的cookie和once,添加账户和密码posthttp://v2ex.com/signin页面,结束后组合新设置的cookie,每一次都必须保持cookie的完整性才能走下一步。
    此时的cookie

    1
    Cookie:PB3_SESSION="2|1:0|10:1456402302|11:PB3_SESSION|36:djJleDoxODMuNjAuOTAuODI6NDc3MzEwMDY=|756ddc25710006ff35e3cf0a5939cea49f1873cf2b6b2d5f53f0f1e3f9596fb4"; _gat=1; _ga=GA1.2.1026641497.1456402470; A2="2|1:0|10:1456402318|2:A2|56:MjI3MDQ0NDJmM2QxMDVhYzQ1M2ZiOGNmNzg4NWI1ZDEzZGM5NzY3ZQ==|050c5d97a7d20a74e9f4d29005d84616401fc0cbf055c90e44efe01d6d4a38b6"; V2EX_LANG=zhcn
  3. 已经拿到登录的cookie,按照常理这一步就应该访问http://v2ex.com/mission/daily页面获取福利,这是你会发现v2ex提醒你说你的浏览器有些奇奇怪怪的设置,请换一个干净的浏览器,原来的cookie的信息不完整。缺少如下信息:

    1
    V2EX_TAB="2|1:0|10:1456402318|8:V2EX_TAB|8:dGVjaA==|7a47087a9137bc9476f0c222a2723a058eb6e44a9f5f5a8600441ae9d5c92589"; expires=Thu, 10 Mar 2016 12:11:58 GMT; Path=/

    而这些信息需要访问首页才能拿到,这时候可以访问http://v2ex.com拿到缺少的信息,访问首页还可以获取最新的once,因为登录后这个once就变了,同时还可以测试是否登录,因为登录了顶部栏会显示用户的名称。

  4. 所有的准备工作都做好了,访问/mission/daily/redeem?once=还是不行,用抓包工作或者浏览器都可以看到原来访问这个地址后返回302,然后立马访问http://v2ex.com/mission/daily.这时所有的谜团才揭开,出现成功领取福利的提示。

代码

复制下面的代码或者直接从github上面取node-v2ex

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
var EventProxy = require('eventproxy'),
superagent = require('superagent'),
cheerio = require('cheerio'),
loginUrl = 'http://v2ex.com/signin',
baseUrl = 'http://v2ex.com',
dairyMissionUrl = 'http://v2ex.com/mission/daily',
redeem = baseUrl + '/mission/daily/redeem?once=';
var ep = new EventProxy();

var formData = {
'u': 'name@gmail.com',
'p': '123455',
'once': '61048',
'next': '/mission/daily'
};
var headers = {
'Content-Type': 'application/x-www-form-urlencoded',
Host: 'v2ex.com',
Origin: 'http://v2ex.com',
Referer: 'http://v2ex.com/signin',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0'
};

var headers2 = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip,deflate,sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Proxy-Connection': 'keep-alive',
'Host': 'v2ex.com',
'Referer': 'http://v2ex.com/mission/daily',
'Upgrade-Insecure-Requests': 1,
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0'
};

var ep = new EventProxy();

var cookie = null;

console.log('登录中...\n此过程你有被封IP的危险...');
superagent
.get(loginUrl)
.set(headers)
.end(function(err, res) {
$ = cheerio.load(res.text);
var iptonce = $('input');
formData.once = iptonce[3].attribs.value;
var setPreCookie = res.headers['set-cookie'];
cookie = setPreCookie[0] + ";" + setPreCookie[1];
superagent
.post(loginUrl)
.set(headers)
.set('Cookie', cookie)
.type('form')
.send(formData)
.redirects(0)
.end(function(err, result) {
if (typeof(result) == 'undefined') {
console.log("登录失败\n");
} else {
var setLoginCookie = result.headers['set-cookie'];
if (typeof(setLoginCookie) == 'undefined') {
console.log("登录失败\n");
} else {
cookie = setLoginCookie[0] + ";" + setLoginCookie[1] + ";" + cookie;
ep.emit("cookie", cookie);
}
}
});
});


//访问首页判断是否成功,并获取相对应的cookie信息
ep.on("cookie", function(cookie) {
console.log('测试是否登陆成功中...');
superagent
.get(baseUrl)
.set(headers)
.set('Cookie', cookie)
.end(function(err, res) {

var setTabCookie = res.headers['set-cookie'];
var fulicookie = setTabCookie[0] + ";" + setTabCookie[1] + ";" + cookie;
$ = cheerio.load(res.text);
var name = $('.top')[1].children[0].data;
console.log(name + "登录成功");
var temp = res.text;
var fuliurl = redeem + res.text.substr(res.text.indexOf('once') + 5, 5);
ep.emit("fuliurl", fuliurl);
ep.emit("fulicookie", fulicookie);
});
})

//访问福利网址
ep.all("fuliurl", "fulicookie", function(fuliurl, fulicookie) {
superagent
.get(fuliurl)
.set(headers2)
.redirects(0)
.set('Cookie', fulicookie)
.end(function(err, res) {
superagent
.get(dairyMissionUrl)
.set(headers2)
.set('Cookie', cookie)
.end(function(err, res) {
$ = cheerio.load(res.text);
console.log($('.message').text());
})
})
})

comments powered by Disqus
文章目錄
  1. 1. 模拟思路
  2. 2. 代码