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字典操作简明总结
Apr 13 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 Python
Python 列表去重去除空字符的例子
Jul 20 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 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-FPM之Chroot执行环境详解
2015/08/03 PHP
使用正则替换变量
2007/05/05 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
Vue2.x中的Render函数详解
2017/05/30 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
js实现烟花特效
2020/03/02 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Python使用os.listdir和os.walk获取文件路径
2020/05/21 Python
Python while true实现爬虫定时任务
2020/06/08 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
服装行业创业计划书范文
2014/02/05 职场文书
安全生产实施方案
2014/02/23 职场文书
硕士生工作推荐信
2014/03/07 职场文书
签约仪式主持词
2014/03/19 职场文书
学期评语大全
2014/04/30 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
讲座新闻稿
2015/07/18 职场文书