用Python(Tornado)模擬登錄小米帳號

小米搶購程序的簡單思路
服務器君一共花費了271.909 ms進行了8次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

今天看到同事參與小米的搶購,幾經數個星期的嘗試,終于搶到了一臺小米電視……看了一下小米的搶購流程,似乎可以用程序可破。于是想寫點東西玩玩(你懂的……),第一步肯定是先得模擬登錄小米帳號,當練手吧。

用 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.824886.live&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.824886.live', '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.824886.live', '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月),后續小米那邊可能會改變一些規則。

本文地址:http://www.824886.live/librarys/veda/detail/2553,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.824886.live/librarys/veda/detail/2553

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏。

大家都在看

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《JavaScript高級程序設計(第2版)》 尼古拉斯·澤卡斯(Nicholas C.Zakas) (作者), 李松峰 (譯者), 曹力 (譯者)

《JavaScript高級程序設計(第2版)》在上一版基礎上進行了大幅度更新和修訂,融入了近幾年來JavaScript應用發展的最新成果,幾乎涵蓋了所有需要理解的重要概念和最新的JavaScript應用成果。從頗具深度的JavaScript語言基礎到作用域(鏈),從引用類型到面向對象編程,從極其靈活的匿名函數到閉包的內部機制,從瀏覽器對象模型(BOM)、文檔對象模型(DOM)到基于事件的Web腳本設計,從XML(E4X)到Ajax及JSON,從高級前端開發技術到前沿的客戶端存儲,從最佳編程實踐到即將成為現實的API,直至JavaScript未來的發展,全景式地展示了JavaScript高級程序設計的方方面面。

更多計算機寶庫...

云南快乐十分走势一定牛 国际篮联男篮篮球世 一码公开免费资料 北京麻将手机版 下期平码如何计算出来 2018中超联赛积分榜 老k南宁麻将 免费游戏四人打麻将 全民欢乐捕鱼技巧 大庆52麻将客服 西甲视频直播在哪看