Python(Tornado)模拟登录小米抢手机


Posted in Python onNovember 12, 2013

今天看到同事参与小米的抢购,几经数个星期的尝试,终于抢到了一台小米电视……看了一下小米的抢购流程,似乎可以用程序可破。于是想写点东西玩玩(你懂的……),第一步肯定是先得模拟登录小米帐号,当练手吧。
用 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 来嗅探一下:
Python(Tornado)模拟登录小米抢手机
也就是说,POST 的地址是 https://account.xiaomi.com/pass/serviceLoginAuth2
Python(Tornado)模拟登录小米抢手机
需要构造的表单参数也很简单(已进行 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 相关文章推荐
深入解析Python编程中super关键字的用法
Jun 24 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
Python中一些不为人知的基础技巧总结
May 19 Python
python看某个模块的版本方法
Oct 16 Python
Python Pexpect库的简单使用方法
Jan 29 Python
python基于SMTP协议发送邮件
May 31 Python
pyQT5 实现窗体之间传值的示例
Jun 20 Python
用pyqt5 给按钮设置图标和css样式的方法
Jun 24 Python
python实现计算器功能
Oct 31 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
python/golang 删除链表中的元素
Sep 14 Python
Python使用pandas导入csv文件内容的示例代码
Dec 24 Python
Python3实现的腾讯微博自动发帖小工具
Nov 11 #Python
python正则分组的应用
Nov 10 #Python
python Django连接MySQL数据库做增删改查
Nov 07 #Python
使用Python下载Bing图片(代码)
Nov 07 #Python
python中文乱码的解决方法
Nov 04 #Python
python Django模板的使用方法(图文)
Nov 04 #Python
使用python Django做网页
Nov 04 #Python
You might like
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
一个更简单的无限级分类菜单代码
2007/01/16 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
分享php多功能图片处理类
2016/05/15 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
python实现倒计时的示例
2014/02/14 Python
python批量处理txt文件的实例代码
2020/01/13 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
环境日宣传活动总结
2014/07/09 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
匿名检举信范文
2015/03/02 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书