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

用 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 来嗅探一下:

也就是说,POST 的地址是 https://account.xiaomi.com/pass/serviceLoginAuth2。

需要构造的表单参数也很简单(已进行 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(Tornado)模拟登录小米帐号相关推荐

  1. 如何用python批量下载数据_利用python脚本,批量自动下载欧洲中心的气象数据

    登录后查看更多精彩内容~ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 leeol 于 2017-10-27 18:22 编辑 更新:近日我在下数据时发现EC微调了下载方法,具体 ...

  2. python编写登录_通过Python编写一个简单登录功能过程解析

    通过Python编写一个简单登录功能过程解析 需求: 写一个登录的程序, 1.最多登陆失败3次 2.登录成功,提示欢迎xx登录,今天的日期是xxx,程序结束 3.要检验输入是否为空,账号和密码不能为空 ...

  3. 豆瓣用python写的网站_用python写一个豆瓣短评通用爬虫(登录、爬取、可视化)

    原创技术公众号:bigsai,本文在1024发布,祝大家节日快乐,心想事成. @ 前言 在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块.工具知识的使用.然而我所在的组刚好遇到的是 ...

  4. python selenium手动输入验证码_案例:selenium实现登录百度(如有验证码,需要手动输入)...

    func.py baidu_login.py中(如有验证码,需要手动输入) # 导入webdriver import os import time import re from lxml import ...

  5. 简书python自动化运维_简明Python开发教程(4):网络自动化运维的曙光

    写在前面 本打算自动登陆一台路由器,执行查询配置指令,然后用正则表达式分析,获取该路由器的接口连接关系. 现在由于网络问题,导致无法直接telnet路由器,只能通过其他方式获取配置文件,如读取本地文件 ...

  6. python信息管理系统实战_最新python入门+进阶+实战课堂教学管理系统开发全套完整版...

    Python+pillow图像编程1:pillow扩展库安装与基础用法.avi Python+pillow图像编程2:Image子模块用法1.avi Python+pillow图像编程3:Image子 ...

  7. python大数据免费_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  8. python大牛 关东升_《Python从小白到大牛》第4章 Python语法基础

    本章主要为大家介绍Python的一些语法,其中包括标识符.关键字.常量.变量.表达式.语句.注释.模块和包等内容. 标识符和关键字 任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍Pyth ...

  9. python库开源网站_开源Python库

    开源Python库 Python 一个很受人欢迎的原因之一是其有很丰富的第三方库,到本文开始写的时候已经在 PyPI 上有108298个第三方包提供.有人还对第三方库做了很好的总结 Awesome P ...

  10. python要学哪些_学python都要学哪些内容?

    如果培训都是分五个阶段,第一阶段学习Python核心编程,主要是Python语言基础.Linux.MySQL,前期学习Python编程语言基础内容;中期主要涉及OOP基础知识,学习后应该能自己处理OO ...

最新文章

  1. Android获取顶部状态栏statusBar高度、底部导航栏navigationBar高度
  2. 学习笔记27—python中numpy.ravel() 和 flatten()函数
  3. Ubuntu 16.04网速慢解决方法
  4. 【商业落地篇】Gartner第四范式全球首发AutoML系列白皮书(限时免费下载)
  5. java中对象的生存期_JSP中JavaBean的生命周期
  6. mysql 使用正则表达式查询
  7. sphinx和coreseek
  8. mysql error 1201_ERROR 1201 (HY000): Could not initialize master info structure; .....
  9. layui导航栏页面滚动固定_网站建设页面导航如何降低用户寻找的时间
  10. Markdown编辑器基本语法
  11. mysql数据库kj_Python3.7和数据库MySQL 8.0.12 数据库SQLite3连接(三)
  12. 短视频发布之前要注意什么?从配音到发布时间,选对才能吸粉引流
  13. 世界顶级企业的数据中台实践剖析
  14. Eclipse的各种查找,类的查找,方法查找快捷键
  15. matlab if嵌套函数,MATLAB嵌套函数的应用
  16. 【操作系统】概念、功能、特征、分类、运行机制、内核、体系结构、中断和异常、系统调用简介
  17. Java Security(JCE基本概念)
  18. 阿尔法编程python答案第四章_智慧职教Python编程基础答案第四章单元测试答案
  19. 简单的理解position与anchorPoint
  20. 计算机基础(笔记)——计算机网络(计算机网络中的安全)

热门文章

  1. 怎么修改服务器ipmi地址,设置linux服务器ipmi地址
  2. proteus8找不到isis
  3. excel mysql仓库管理_怎样用excel数据库建立仓库管理系统?
  4. html5期末大作业:基于html+css+javascript+jquery+bootstarp响应式图书电商HTML模板网上书店(25页)
  5. 寻找两个有序数组最小相同元素---JavaScript--解决方法
  6. u盘ios刻录_用UltraISO刻录U盘安装系统
  7. 已知任意三点坐标求圆心
  8. 海康威视多路播放开发步骤及参考代码
  9. 噪点测试软件 DeadPixelTest 使用方法
  10. CMOS工作原理和概念