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多重继承的方法解析执行顺序实例分析
May 26 Python
Python实现简易过滤删除数字的方法小结
Jan 09 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
Jan 30 Python
Python实现的爬取百度文库功能示例
Feb 16 Python
Python enumerate函数功能与用法示例
Mar 01 Python
解决python3中的requests解析中文页面出现乱码问题
Apr 19 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
通过实例解析python描述符原理作用
Jan 22 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
python-jwt用户认证食用教学的实现方法
Jan 19 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 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 星际争霸
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
2014/01/14 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
2016/07/05 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
浅析Python 中整型对象存储的位置
2016/05/16 Python
python实现获取Ip归属地等信息
2016/08/27 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
如何在python中使用selenium的示例
2017/12/26 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
python实现猜数游戏
2020/03/27 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
倩碧英国官网:Clinique英国
2018/08/10 全球购物
法律专业自我鉴定
2013/10/03 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
合伙协议书
2014/04/23 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
先进党支部事迹材料
2014/12/24 职场文书
世界环境日活动总结
2015/02/11 职场文书
毕业生个人总结
2015/02/28 职场文书
python计算列表元素与乘积详情
2022/08/05 Python