用Python(Tornado)模拟登录小米帐号
2013-11-05 00:00
851 查看
今天看到同事参与小米的抢购,几经数个星期的尝试,终于抢到了一台小米电视……看了一下小米的抢购流程,似乎可以用程序可破。于是想写点东西玩玩(你懂的……),第一步肯定是先得模拟登录小米帐号,当练手吧。
用 Python 来实现吧,由于是写一个Web应用,那么框架就选 Tornado。
首先是定义应用的 URL:
接下来就是寻找需要 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。即:
接下来函数也可以写出来了:
如何需要把 cookie 打印出来,直接 print cj 就可以看到 cookie 的内容。
接下来的事情貌似也很简单,就是解析 hdcontrol (URL:http://tc.hd.xiaomi.com/hdget?callback=hdcontrol) 这个 json。
当 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月),后续小米那边可能会改变一些规则。
相关文章推荐
- 雷军是谁,他为什么而奋斗?小米上市和雷军的英雄主义
- 知道你们为什么抢不到红米吗?来看看这个
- php中通过curl模拟登陆discuz论坛的实现代码
- 中国版“苹果”,小米将走向国际市场!
- 创建https需要的证书
- 生产环境下如何优雅地重启 Tornado
- 热河评判小米2的功过是非?
- 抄小米策略,纽曼你成吗?
- php模拟post提交数据,用处很多,可用来网站的采集,登陆等等
- Tornado Web 服务器
- HttpClient、Tornado服务器开启gzip压缩功能
- mac OSX上eclipse adb无法识别(调试)小米的解决方案
- Vxworks的IDE“Tornado”在Win7上的安装教程
- Vxworks系统调试仿真教程
- 2014小米校园招聘笔试(10.13北京)
- 小米2013招聘笔试题:朋友圈
- 2013小米笔试题--异形数
- python进阶ing——创建第一个Tornado应用
- 使用Tornado进行网络异步编程
- Basic distinguish between web.py / flup and tornado web process handling model (TBC)