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格式化字符串实例总结
Sep 28 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
在Mac OS上搭建Python的开发环境
Dec 24 Python
老生常谈python的私有公有属性(必看篇)
Jun 09 Python
对python requests的content和text方法的区别详解
Oct 11 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
Python实现在Windows平台修改文件属性
Mar 05 Python
Python3.7安装pyaudio教程解析
Jul 24 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
详解Python中的文件操作
Jan 14 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简单防盗链实现方法
2015/07/29 PHP
php实现的xml操作类
2016/01/15 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
JQuery toggle使用分析
2009/11/16 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
详解React中setState回调函数
2018/06/14 Javascript
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
用python简单实现mysql数据同步到ElasticSearch的教程
2018/05/30 Python
Python socket套接字实现C/S模式远程命令执行功能案例
2018/07/06 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
十佳美德少年事迹材料
2014/02/05 职场文书
致接力运动员广播稿
2014/02/17 职场文书
项目建议书模板
2014/05/12 职场文书
会计求职自荐信
2014/06/20 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库