明天就10月1了,今天已经无心上班了,但又舍不得请假,毕竟请假一时爽,到发工资时才知道自己有多穷。早上起来刷朋友圈,看见一朋友抽奖运气爆表,在朋友圈显摆上了。

看到杯子才想起来之前一直打算买个水杯却忘了,看活动介绍说竟然还有双肩背,正好自己在的背包脏了,要是能抽到就不用洗了。于是在地铁傻呵呵地刷了一路却连毛都没刷到。心想到了公司也没什么事,就玩玩它吧。

分析协议

在浏览器直接打开链接发现跳转到了其他页面,看来页面有根据UA判断设备。打开调试工具开启移动设备选项后成功打开页面。

之后就是操作一次,记录下抽奖的协议后通过分析,得到抽奖的加密算法。

获取cookie

因为这个活动需要通过微信登录,需要在手机上设置代理抓包,通过burp suite拿到cookie后直接跑就可以了,刷礼品代码如下

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
from urllib.parse import urlparse
from hashlib import md5
import requests, random, time, sys
session = requests.session()
# session.proxies['http']='127.0.0.1:8080'
session.headers.update({
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Origin': 'http://oneplus.nn.cagoe.com',
'X-Requested-With': 'XMLHttpRequest',
'Referer': 'http://oneplus.nn.cagoe.com/index.aspx?from=singlemessage',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,en-US;q=0.8',
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
})
# requests.utils.add_dict_to_cookiejar(session.cookies, {
# 'ASP.NET_SessionId': 'your cookie',
# # 'SiteOpenID': 'your cookie',
# 'cg_SiteUserID': 'your cookie'
# })
token = None
def execute():
url = 'http://oneplus.nn.cagoe.com/Ajax/DataInterface.aspx?Method=BufferExecute'
# CanLotteryPoolID=all&Cg_rm=1&Cg_tt=1506749843527&Cg_sg=d0497f1d1b1351019db4098c24eb86bf
body = {
'CanLotteryPoolID': 'all',
'Cg_rm': random.choice([0,1]),
'Cg_tt': int(time.time() * 1000)
}
body['Cg_sg'] = getSign(url, body)
resp = session.post(url, data=body, headers={'Content-Type': 'application/x-www-form-urlencoded'}).json()
if resp['IsSuccess'] != "0":
print('抽奖成功,刷到礼品: ', resp['PrizeDesc'])
print('使用Cookie: ', requests.utils.dict_from_cookiejar(session.cookies))
sys.exit(0)
else:
print('LotteryRecID: ',resp['LotteryRecID'], resp['ErrMsg'])
if '被禁用' in resp['ErrMsg']:
sys.exit(-1)
def updateToken():
# Cg_rm=0&Cg_tt=1506749845634&Cg_sg=03dea6b93079a6480a300c7706a8f707
url = 'http://oneplus.nn.cagoe.com/Cg/Itf/CSharp/CmnMisItf.aspx?method=GetCgTk'
body={}
if token:
body={
'Cg_rm': random.choice([0,1]),
'Cg_tt': int(time.time() * 1000),
}
body['Cg_sg'] = getSign(url, body)
resp = session.post(url, data=body, headers={'Content-Type': 'application/x-www-form-urlencoded'}).json()
if resp['IsSuccess']:
global token
token = resp['CgTk']
def getSign(url:str, params:dict):
assert token, "token为必需参数"
def getParamListFromUrl(u):
query = urlparse(u).query
if query:
return dict(map(lambda x: x.split('=', 1), query.split('&')))
return {}
p = getParamListFromUrl(url)
p.update(params)
n = dict()
for k,v in p.items():
n[k.lower()] = v
r = '&'.join([k + '=' + str(n[k]) for k in sorted(n)]) + 'ItfTokenKey' + token
return md5(r.encode('utf-8')).hexdigest()
if __name__ == '__main__':
session.get('http://oneplus.nn.cagoe.com/index.aspx?from=singlemessage')
print('正在获取Token...')
updateToken()
print('开始刷礼品,当前Token: ', token)
while True:
execute()
time.sleep(random.randrange(15,60))

如果不用微信登录的cookie刷的话刷一段时间会被封ip或cookie。

不得不说运气确实很重要啊。刷了一下午才刷出一个杯子,我的双肩包还是没影。