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的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
Jul 09 Python
Python随机生成彩票号码的方法
Mar 05 Python
深入理解Python中装饰器的用法
Jun 28 Python
Python自动生产表情包
Mar 17 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
Python实现找出数组中第2大数字的方法示例
Mar 26 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
python实现两个文件夹的同步
Aug 29 Python
python使用Geany编辑器配置方法
Feb 21 Python
Anaconda安装pytorch及配置PyCharm 2021环境
Jun 04 Python
Python字典和列表性能之间的比较
Jun 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
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
php数组遍历类与用法示例
2019/05/24 PHP
Node.js插件的正确编写方式
2014/08/03 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
nodejs动态创建二维码的方法
2017/08/12 NodeJs
JS实现标签滚动切换效果
2017/12/25 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
Python md5与sha1加密算法用法分析
2017/07/14 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
基于keras中的回调函数用法说明
2020/06/17 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
应届生污水处理求职信
2013/11/06 职场文书
毕业留言寄语大全
2014/04/10 职场文书
拉歌口号大全
2014/06/13 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
python爬虫框架feapde的使用简介
2021/04/20 Python