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中的mock库对Python代码进行模拟测试
Apr 16 Python
python实现将文本转换成语音的方法
May 28 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
python 读取摄像头数据并保存的实例
Aug 03 Python
使用python 写一个静态服务(实战)
Jun 28 Python
python和c语言的主要区别总结
Jul 07 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
在notepad++中实现直接运行python代码
Dec 18 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
Feb 13 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
python os模块在系统管理中的应用
Jun 22 Python
Python使用Kubernetes API访问集群
May 30 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面向对象分析设计的61条军规小结
2010/07/17 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
php教程之魔术方法的使用示例(php魔术函数)
2014/02/12 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
javascript正则表达式总结
2016/02/29 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
JS实现显示当前日期的实例代码
2018/07/03 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
Python中列表(list)操作方法汇总
2014/08/18 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
python os.fork() 循环输出方法
2019/08/08 Python
python opencv如何实现图片绘制
2020/01/19 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
Python 爬虫的原理
2020/07/30 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
研究生毕业鉴定
2014/01/29 职场文书
小学五年级学生评语
2014/04/22 职场文书
跑操口号
2014/06/12 职场文书
股份转让协议书范本
2015/01/27 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技