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计算最小优先级队列代码分享
Dec 18 Python
Python3学习笔记之列表方法示例详解
Oct 06 Python
pyqt5简介及安装方法介绍
Jan 31 Python
python2 与 python3 实现共存的方法
Jul 12 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
搞清楚 Python traceback的具体使用方法
May 13 Python
使用Python和Scribus创建一个RGB立方体的方法
Jul 17 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
Sep 06 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
详解pycharm连接不上mysql数据库的解决办法
Jan 10 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
PHP中str_replace函数使用小结
2008/10/11 PHP
PHP 可阅读随机字符串代码
2010/05/26 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
javascript OFFICE控件测试代码
2009/12/08 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
vue中使用input[type="file"]实现文件上传功能
2018/09/10 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
python使用循环实现批量创建文件夹示例
2014/03/25 Python
Python open()文件处理使用介绍
2014/11/30 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
实习单位接收函
2014/01/11 职场文书
安全事故检讨书
2014/01/18 职场文书
实习评语大全
2014/04/26 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
会议主持词通用版
2019/04/02 职场文书
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android