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在校内发人人网状态(人人网看状态)
Feb 19 Python
python生成IP段的方法
Jul 07 Python
python如何查看系统网络流量的信息
Sep 12 Python
python指定写入文件时的编码格式方法
Jun 07 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
Python实现京东秒杀功能代码
May 16 Python
PyQt5 QTable插入图片并动态更新的实例
Jun 18 Python
创建Shapefile文件并写入数据的例子
Nov 26 Python
python语言是免费还是收费的?
Jun 15 Python
python 常见的排序算法实现汇总
Aug 21 Python
python上下文管理的使用场景实例讲解
Mar 03 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 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&mysql(四)
2006/10/09 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
php Session存储到Redis的方法
2013/11/04 PHP
php动态变量定义及使用
2015/06/10 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
JavaScript 不只是脚本
2007/05/30 Javascript
Display SQL Server Version Information
2007/06/21 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
js断点调试经验分享
2017/12/08 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
Python中的类与对象之描述符详解
2015/03/27 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
python分数表示方式和写法
2019/06/26 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
Linux如何压缩可执行文件
2014/03/27 面试题
党课学习思想汇报
2014/01/02 职场文书
采购部经理岗位职责
2014/02/10 职场文书
大学生活自我评价
2014/04/09 职场文书
一体化教学实施方案
2014/05/10 职场文书
个人授权委托书格式
2014/08/30 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电