Python(Tornado)模拟登录小米抢手机
程序员文章站
2022-06-12 11:06:55
今天看到同事参与小米的抢购,几经数个星期的尝试,终于抢到了一台小米电视……看了一下小米的抢购流程,似乎可以用程序可破。于是想写点东西玩玩(你懂的……),第一步肯定是先得模拟...
今天看到同事参与小米的抢购,几经数个星期的尝试,终于抢到了一台小米电视……看了一下小米的抢购流程,似乎可以用程序可破。于是想写点东西玩玩(你懂的……),第一步肯定是先得模拟登录小米帐号,当练手吧。
用 python 来实现吧,由于是写一个web应用,那么框架就选 tornado。
首先是定义应用的 url:
def main():
tornado.options.parse_command_line()
application = tornado.web.application([
(r"/", mainhandler),
(r"/mibuy/", mibuyhandler),
],**settings)
http_server = tornado.httpserver.httpserver(application)
http_server.listen(options.port)
tornado.ioloop.ioloop.instance().start()
接下来就是寻找需要 post 过去的数据,用 fiddler 来嗅探一下:
也就是说,post 的地址是 https://account.xiaomi.com/pass/serviceloginauth2
需要构造的表单参数也很简单(已进行 url 编码):passtoken=&user=www.nowamagic.net&pwd=password&callback=https%3a%2f%2faccount.xiaomi.com&sid=passport&qs=%253fsid%253dpassport&hidden=&_sign=kkkrvcpzodc%2bgldeyosdmhwv0xg%3d。即:
post_data = urllib.urlencode({'passtoken':'', 'user': 'www.nowamagic.net', 'pwd': 'password', 'callback':'https://account.xiaomi.com', 'sid':'passport', 'qs':'%3fsid%3dpassport', 'hidden':'', '_sign':'kkkrvcpzodc+gldeyosdmhwv0xg='})
path = 'https://account.xiaomi.com/pass/serviceloginauth2'
接下来函数也可以写出来了:
class mibuyhandler(tornado.web.requesthandler):
def get(self):
cj = cookielib.cookiejar()
post_data = urllib.urlencode({'passtoken':'', 'user': 'www.nowamagic.net', 'pwd': 'password', 'callback':'https://account.xiaomi.com', 'sid':'passport', 'qs':'%3fsid%3dpassport', 'hidden':'', '_sign':'kkkrvcpzodc+gldeyosdmhwv0xg='})
path = 'https://account.xiaomi.com/pass/serviceloginauth2'
cookiehandle = urllib2.httpcookieprocessor(cj)
opener = urllib2.build_opener(cookiehandle)
#opener.addheaders = [('user-agent', 'opera/9.23')]
urllib2.install_opener(opener)
req = urllib2.request(path, post_data)
response = urllib2.urlopen(req)
html = response.read()
self.render("mibuy.html",message=html)
如何需要把 cookie 打印出来,直接 print cj 就可以看到 cookie 的内容。
接下来的事情貌似也很简单,就是解析 hdcontrol (url:http://tc.hd.xiaomi.com/hdget?callback=hdcontrol) 这个 json。
hdcontrol(
{
stime: 1383645496,
status: {
allow: true,
miphone: {
hdurl: "",
duration: null,
hdstop: true,
reg: true,
pmstart: false,
hdstart: false
},
mibox: {
hdurl: "",
duration: null,
hdstop: true,
reg: true,
pmstart: false,
hdstart: false
},
mitv: {
hdurl: "",
duration: null,
hdstop: true,
reg: false,
pmstart: false,
hdstart: false
}
}
})
当 allow 为 true 的时候,hdurl 会有值,比如 ?_a=20131105_phone_a212a2b30e5&_op=choose&_s=72b686828&_m=1 之类的,这个就是真实的抢购地址,直接访问这个地址应该就不用再点排队的按钮。仅当抛砖引玉,懂程序的各位都该知道怎么办了吧……
仅仅适用于目前(2013年11月),后续小米那边可能会改变一些规则。
用 python 来实现吧,由于是写一个web应用,那么框架就选 tornado。
首先是定义应用的 url:
复制代码 代码如下:
def main():
tornado.options.parse_command_line()
application = tornado.web.application([
(r"/", mainhandler),
(r"/mibuy/", mibuyhandler),
],**settings)
http_server = tornado.httpserver.httpserver(application)
http_server.listen(options.port)
tornado.ioloop.ioloop.instance().start()
接下来就是寻找需要 post 过去的数据,用 fiddler 来嗅探一下:
也就是说,post 的地址是 https://account.xiaomi.com/pass/serviceloginauth2
需要构造的表单参数也很简单(已进行 url 编码):passtoken=&user=www.nowamagic.net&pwd=password&callback=https%3a%2f%2faccount.xiaomi.com&sid=passport&qs=%253fsid%253dpassport&hidden=&_sign=kkkrvcpzodc%2bgldeyosdmhwv0xg%3d。即:
复制代码 代码如下:
post_data = urllib.urlencode({'passtoken':'', 'user': 'www.nowamagic.net', 'pwd': 'password', 'callback':'https://account.xiaomi.com', 'sid':'passport', 'qs':'%3fsid%3dpassport', 'hidden':'', '_sign':'kkkrvcpzodc+gldeyosdmhwv0xg='})
path = 'https://account.xiaomi.com/pass/serviceloginauth2'
接下来函数也可以写出来了:
复制代码 代码如下:
class mibuyhandler(tornado.web.requesthandler):
def get(self):
cj = cookielib.cookiejar()
post_data = urllib.urlencode({'passtoken':'', 'user': 'www.nowamagic.net', 'pwd': 'password', 'callback':'https://account.xiaomi.com', 'sid':'passport', 'qs':'%3fsid%3dpassport', 'hidden':'', '_sign':'kkkrvcpzodc+gldeyosdmhwv0xg='})
path = 'https://account.xiaomi.com/pass/serviceloginauth2'
cookiehandle = urllib2.httpcookieprocessor(cj)
opener = urllib2.build_opener(cookiehandle)
#opener.addheaders = [('user-agent', 'opera/9.23')]
urllib2.install_opener(opener)
req = urllib2.request(path, post_data)
response = urllib2.urlopen(req)
html = response.read()
self.render("mibuy.html",message=html)
如何需要把 cookie 打印出来,直接 print cj 就可以看到 cookie 的内容。
接下来的事情貌似也很简单,就是解析 hdcontrol (url:http://tc.hd.xiaomi.com/hdget?callback=hdcontrol) 这个 json。
复制代码 代码如下:
hdcontrol(
{
stime: 1383645496,
status: {
allow: true,
miphone: {
hdurl: "",
duration: null,
hdstop: true,
reg: true,
pmstart: false,
hdstart: false
},
mibox: {
hdurl: "",
duration: null,
hdstop: true,
reg: true,
pmstart: false,
hdstart: false
},
mitv: {
hdurl: "",
duration: null,
hdstop: true,
reg: false,
pmstart: false,
hdstart: false
}
}
})
当 allow 为 true 的时候,hdurl 会有值,比如 ?_a=20131105_phone_a212a2b30e5&_op=choose&_s=72b686828&_m=1 之类的,这个就是真实的抢购地址,直接访问这个地址应该就不用再点排队的按钮。仅当抛砖引玉,懂程序的各位都该知道怎么办了吧……
仅仅适用于目前(2013年11月),后续小米那边可能会改变一些规则。
上一篇: js实现全屏和缩放 js
下一篇: 如何运行Python程序的方法