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中的MongoDB基本操作:连接、查询实例
Feb 13 Python
Python基于递归实现电话号码映射功能示例
Apr 13 Python
python中使用zip函数出现错误的原因
Sep 28 Python
python实现三维拟合的方法
Dec 29 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 Python
Python接口自动化测试的实现
Aug 28 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
Python 内存管理机制全面分析
Jan 16 Python
python 使用openpyxl读取excel数据
Feb 18 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 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
日本十大惊悚动漫
2020/03/04 日漫
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
一个PHP+MSSQL分页的例子
2006/10/09 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
实现PHP搜索加分页
2016/10/12 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
Golang与python线程详解及简单实例
2017/04/27 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
Django+Ajax+jQuery实现网页动态更新的实例
2018/05/28 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
给女儿的表扬信
2014/01/18 职场文书
世博会口号
2014/06/20 职场文书
数学教育专业求职信
2014/07/22 职场文书
护理实习生带教计划
2015/01/16 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书