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实现rsa加密实例详解
Jul 19 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
pandas值替换方法
Jul 10 Python
Python使用matplotlib实现交换式图形显示功能示例
Sep 06 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
python实现梯度下降和逻辑回归
Mar 24 Python
用python读取xlsx文件
Dec 17 Python
python 数据类型强制转换的总结
Jan 25 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 Python
Python列表的索引与切片
Apr 07 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
php环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
javascript解析json实例详解
2014/11/05 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
浅析vue数据绑定
2017/01/17 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
django允许外部访问的实例讲解
2018/05/14 Python
Django Rest framework权限的详细用法
2019/07/25 Python
python能做什么 python的含义
2019/10/12 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
人事专员工作职责
2014/02/22 职场文书
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
学员自我鉴定
2014/03/19 职场文书
合伙经营协议书
2014/04/18 职场文书
学术诚信承诺书
2014/05/26 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
督导岗位职责范本
2015/04/10 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python
MySQL 不等于的三种使用及区别
2021/06/03 MySQL