Python(Tornado)模拟登录小米抢手机

时间:2021-09-03 16:15:03 

今天看到同事参与小米的抢购,几经数个星期的尝试,终于抢到了一台小米电视……看了一下小米的抢购流程,似乎可以用程序可破。于是想写点东西玩玩(你懂的……),第一步肯定是先得模拟登录小米帐号,当练手吧。
用 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,小米
0
投稿

猜你喜欢

  • 解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题

    2022-01-14 12:27:24
  • python基于socket函数实现端口扫描

    2022-02-06 09:22:37
  • Python 爬虫爬取指定博客的所有文章

    2021-09-10 04:44:51
  • Python Print实现在输出中插入变量的例子

    2022-06-07 11:12:09
  • Python语言实现机器学习的K-近邻算法

    2023-04-25 02:09:58
  • python写入已存在的excel数据实例

    2021-05-17 15:08:17
  • Python实现对照片中的人脸进行颜值预测

    2023-04-05 18:21:12
  • 图文详解如何利用PyTorch实现图像识别

    2023-02-04 00:54:13
  • HTML5 的五个激动人心的特性

    2009-01-02 17:36:00
  • 浅谈flask源码之请求过程

    2023-12-17 10:36:48
  • Python实现一个服务器监听多个客户端请求

    2022-10-18 15:32:14
  • JSONObject.toString

    2008-03-09 19:12:00
  • ASp使用AspJpeg组件制作透明文字水印

    2008-01-15 20:25:00
  • 解决Python selenium get页面很慢时的问题

    2022-08-29 02:08:22
  • XHTML1.0与HTML兼容指引16条[译]

    2009-06-10 14:45:00
  • 在mac下查找python包存放路径site-packages的实现方法

    2023-06-12 21:12:36
  • asp如何用JMail同时给多人发信?

    2010-06-12 12:52:00
  • 详解Python结合Genetic Algorithm算法破解网易易盾拼图验证

    2023-05-22 01:34:36
  • asp防止盗链HTTP_REFERER判断代码

    2010-03-12 10:41:00
  • 对python中的logger模块全面讲解

    2021-01-17 00:49:17
  • asp之家 网络编程 m.aspxhome.com