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中函数的参数与作用域
Mar 20 Python
python基础教程之匿名函数lambda
Jan 17 Python
浅析Python装饰器以及装饰器模式
May 28 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
Python中*args和**kwargs的区别详解
Sep 17 Python
python的time模块和datetime模块实例解析
Nov 29 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
详解python方法之绑定方法与非绑定方法
Aug 17 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 Python
Python绘制组合图的示例
Sep 18 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
php获取后台Job管理的实现代码
2011/06/10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
Yii2如何批量添加数据
2016/05/17 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
JQuery autocomplete 使用手册
2010/04/01 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
javascript版2048小游戏
2015/03/18 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
详解Vite的新体验
2021/02/22 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
处理textarea中的换行和空格
2019/12/12 HTML / CSS
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
毕业自我评价范文
2013/11/17 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
四群教育工作实施方案
2014/03/26 职场文书
个人作风建设自查报告
2014/10/22 职场文书
资金申请报告范文
2015/05/14 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技