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 相关文章推荐
RC4文件加密的python实现方法
Jun 30 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
pandas中的series数据类型详解
Jul 06 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
python 实现线程之间的通信示例
Feb 14 Python
python传到前端的数据,双引号被转义的问题
Apr 03 Python
python要安装在哪个盘
Jun 15 Python
python模块如何查看
Jun 16 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
May 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
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
php中引用符号(&)的使用详解
2013/11/13 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
php实现购物车功能(上)
2020/07/23 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
three.js 入门案例详解
2018/01/23 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
解决vue刷新页面以后丢失store的数据问题
2020/08/11 Javascript
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
初步讲解Python中的元组概念
2015/05/21 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
Django多个app urls配置代码实例
2020/11/26 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
考试作弊被抓检讨书
2014/01/10 职场文书
用电申请报告范文
2015/05/18 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书