Python 模擬微博登陸,親測有效!

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

Python 模擬微博登陸,親測有效! 科技 第1張

Python 模擬微博登陸,親測有效! 科技 第2張

作者 | 上海小胖

責編 |胡巍巍

今天想做一個微博爬個人頁面的工具,滿足一些不可告人的秘密。那麼首先就要做那件必做之事!模擬登陸……

代碼是參考了:https://www.douban.com/note/201767245/,我對代碼進行了優化,重構成了Python 3.6 版本,並且加入了大量註釋方便大家學習。

PC 登錄新浪微博時, 在客戶端用JS預先對用戶名、密碼都進行了加密,而且在POST之前會GET 一組參數,這也將作為POST_DATA 的一部分。這樣,就不能用通常的那種簡單方法來模擬POST 登錄( 比如人人網 )。

Python 模擬微博登陸,親測有效! 科技 第3張

在提交POST請求之前,需要GET 獲取兩個參數。地址是:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)。

得到的數據中有 servertime 和 nonce 的值, 是隨機的,其他值好像沒什麼用。

defget_servertime():url='http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'#返回出來的是一個Response對象,無法直接獲取,text後,可以通過正則匹配到#大概長這樣子的:sinaSSOController.preloginCallBack({"retcode":0,"servertime":1545606770,...})data=requests.request('GET',url).textp=re.compile('((.*))')try:json_data=p.search(data).group(1)data=json.loads(json_data)servertime=str(data['servertime'])nonce=data['nonce']returnservertime,nonceexcept:print('獲取severtime失敗!')returnNone

Python 模擬微博登陸,親測有效! 科技 第4張

通過 httpfox 觀察 POST 的數據,參數較複雜,其中「su” 是加密後的username, sp 是加密後的password,servertime 和 nonce 是上一步得到的,其他參數是不變的。

username 經過了 BASE64 計算:

username=base64.encodestring(urllib.quote(username))[:-1]

password 經過了三次SHA1 加密,且其中加入了 servertime 和 nonce 的值來干擾。即:兩次SHA1加密後,將結果加上 servertime 和 nonce 的值,再SHA1 算一次。

defget_pwd(pwd,servertime,nonce):#第一次計算,注意Python3的加密需要encode,使用bytespwd1=hashlib.sha1(pwd.encode()).hexdigest()#使用pwd1的結果在計算第二次pwd2=hashlib.sha1(pwd1.encode()).hexdigest()#使用第二次的結果再加上之前計算好的servertime和nonce值,hash一次pwd3_=pwd2+servertime+noncepwd3=hashlib.sha1(pwd3_.encode()).hexdigest()returnpwd3defget_user(username):#將@符號轉換成url中能夠識別的字符_username=urllib.request.quote(username)#Python3中的base64計算也是要字節#base64出來後,最後有一個換行符,所以用了切片去了最後一個字符username=base64.encodebytes(_username.encode())[:-1]returnusername

Python 模擬微博登陸,親測有效! 科技 第5張

將參數組織好,POST請求。這之後還沒有登錄成功,POST後得到的內容中包含一句:

location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3")

這是登錄失敗時的結果,登錄成功後結果與之類似,不過 retcode 的值是0。接下來再請求這個URL,這樣就成功登錄到微博了。記得要提前build 緩存。

Python 模擬微博登陸,親測有效! 科技 第6張

作者簡介:上海小胖,四大咨詢的Tech Lead,MongoDB Professional獲得者。「Python專欄」專注Python領域的各種技術:爬蟲、DevOps、人工智能、Web開發等。還有「大航海計劃」,各種內推活動。

聲明:本文為作者投稿,版權歸其個人所有。

工程師有話說|外包工程師,混得最差勁

我就是那個錯過了喬布斯的變態老碼農

難逃寒冬裁員的「大追殺」,30 歲女碼農該何去何從?

「iPhone 3 年內必死!」

IPFS 深入淺出:從《黑鏡》說起

清華首批7門標桿課程,到底有多牛?

雲計算的概念 – 初識雲計算知識專欄(1)

print_r('點個好看吧!');var_dump('點個好看吧!');NSLog(@"點個好看吧!");System.out.println("點個好看吧!");console.log("點個好看吧!");print("點個好看吧!");printf("點個好看吧!");cout<<"點個好看吧!"<<endl;Console.WriteLine("點個好看吧!");fmt.Println("點個好看吧!");Response.Write("點個好看吧!");alert("點個好看吧!")echo "點個好看吧!";

Python 模擬微博登陸,親測有效! 科技 第7張

點擊「閱讀原文」,打開 CSDN App 閱讀更貼心!

Python 模擬微博登陸,親測有效! 科技 第8張

喜歡就點擊「好看」吧!

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!