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实现360皮肤按钮控件示例
Feb 21 Python
在Python中操作列表之list.extend()方法的使用
May 20 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 Python
python直接访问私有属性的简单方法
Jul 25 Python
python删除不需要的python文件方法
Apr 24 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
Feb 04 Python
基于python图像处理API的使用示例
Apr 03 Python
python实例化对象的具体方法
Jun 17 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
如何使用scrapy中的ItemLoader提取数据
Sep 30 Python
python实现调用摄像头并拍照发邮箱
Apr 27 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利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
Python request操作步骤及代码实例
2020/04/13 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
露营世界:Camping World
2017/02/02 全球购物
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
老教师工作总结的自我评价
2013/09/27 职场文书
工厂仓管员岗位职责
2014/01/01 职场文书
法务专员岗位职责
2014/01/02 职场文书
大学校庆邀请函
2014/01/11 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
1000字打架检讨书
2014/11/03 职场文书
琅琊山导游词
2015/02/05 职场文书
通知的格式范文
2015/04/27 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
签字仪式主持词
2015/07/03 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS