超詳細的Python實現新浪微博模擬登陸

2022-01-03 編程派

本文已獲原作者授權發布。

原文連結:http://www.jianshu.com/p/816594c83c74

文 | resolvewang

最近由於需要一直在研究微博的爬蟲,第一步便是模擬登陸,從開始摸索到走通模擬登陸這條路其實還是挺艱難的,需要一定的經驗,為了讓朋友們以後少走點彎路,這裡我把我的分析過程和代碼都附上來。

首先,我們先用正常的帳號登陸,具體看會有些什麼請求。這裡我用的是 Http Analyzer 抓包(Filders 也是一個不錯的選擇)。下面是正常登陸流程的截圖:

圖 1

接下來我會詳細說明各個過程。

第一步:預登陸。

現在微博、空間等大型網站在輸入用戶名後基本都會做編碼或者加密處理,這裡在用戶名輸入框輸入我的帳號,通過抓包工具可以看到伺服器會返回一段字符串:

圖 2

這一步就是預登陸過程,同學們可以自己試試。登陸的時候我們需要用到其中的 servertime、nonce、pubkey 等欄位。當然這個不是我自己猜想的,後面的步驟會做說明。

還有一點,就是預登陸的 url:

http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1461819359582

這裡 su 的值是自己用戶名經過 base64 編碼的值。但可能你們會問我是如何知道的呢,待會兒我會講到。經過實測,如果我們這裡不給 su 傳參數,其實也是可以的。為了最真實的模擬用戶登錄,我們最好還是帶上它的值。

請看圖一的第一條 js 請求http://i.sso.sina.com.cn/js/ssologin.js,同學們可以點進去看,這個就是前面提到的加密用戶名和密碼等一系列的加密文件了,如果有同學非要問我是怎麼找到這個加密文件的,我也只有說:反覆抓包,從在瀏覽器輸入 weibo.com 過後就找 js 文件請求路徑,然後再用代碼格式化工具打開,挨著一個一個看,在代碼中搜關鍵字,比如這裡我們可以搜"nonce"、"servertime"等,就能找到加密文件了。

打開加密文件我們可以看到加密用戶名的代碼,在加密 js 文件中搜索'username',可以看到有一行代碼為:

_username = sinaSSOEncoder.base64.encode(urlencode(username));  _現在我們可以直接查找 encode 方法(代碼太多就不貼上來了),即可查找到對應方法了,為了驗證我們的猜想,我們可以在 webstorm 中 copy 這個 encode 函數帶上自己的用戶名運行,返回的結果就是 su 的值,這個值在之後進行 post 提交的時候也會用到。如果對加密有一定經驗的同學可能一眼就會看出這個是 base64 編碼,python 中有個 base64 模塊可以幹這個事情。我們再回到圖一,http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)這個地址就是進行 post 提交數據的地址,下面是我自己提交的數據:

圖三

這裡我們需要自己構造 su(加密後的用戶名),sp(加密後的密碼),servertime,nonce,rsakv 等數據,其它數據都不用變。有同學問我為哈其它數據不用變?你自己可以多登陸幾次,看變化的值,那麼那些值就是需要構造的值,其它值就直接拿過來用就行了。這裡的 su,servertime,nonce,rsakv 都已經拿到了,所以當前需要的就只是 sp 的值了。我們還是按照原來的方法在 js 文件中查找"sp",可以找到requests.sp=password這段代碼,所以我們就只需要看 password 怎麼構造的了。通過查找可以看到關鍵加密代碼:

password = RSAKey.encrypt([me.servertime,me.nonce].join("t") "n" password)

這一段代碼便是加密密碼的代碼,有經驗的同學一看就知道是用的 RSA 加密,python 中也有相應的 rsa 加密庫可用。但是我們假設大家都沒看出來或者不知道 python 中有 rsa 這個第三方庫。這時候就要給大家介紹一些我的經驗了,我現在已經知道的有三種模擬登陸方案:a) 最簡單暴力,效率也是最高的,直接把 js 源碼轉化為相應的 python 代碼,模擬加密流程進行加密 b) 使用 selenium phantomjs/firefox 的方案直接模擬人的操作填寫表單提交數據進行模擬登陸,這種方式最為簡單,效率稍微低一些。如果有同學對這種簡單暴力的方式感興趣,可以到我的 github 上查看一下源碼 c) 比較折中的方案,通過 pyv8/pyexecjs 等渲染 js 代碼進行執行,本文主要就是講的這種方式。第一種方式如果是遇到微博調整了登陸加密算法,就必須改加密代碼,第二種方式和第三種方式不存在這個問題。

由於我用的是 Python3,並不支持 PyV8,所以我選了和它類似的 PyexecJS,這個也可以直接執行 js 代碼。我也不是很熟悉 Javascript 代碼,所以我直接定義了一個函數處理加密密碼,並沒對其加密原始碼修改太多:

function    get_pass(mypass,nonce,servertime,rsakey){

        varRSAKey = newsinaSSOEncoder.RSAKey();

        RSAKey.setPublic(rsakey,"10001");

        password= RSAKey.encrypt([servertime,nonce].join("t") "n" mypass)

        return    password

}

這個函數中的東西其實就是 copy 的加密文件的加密過程代碼。為了試驗,我直接使用之前自己登陸抓到的 nonce、servertime、rsakey 等數據,在 webstorm 中調用這個函數,但是報錯了,提示"navigator is undefined",webstorm 使用的 nodejs 的運行時環境,而 navigator 為瀏覽器的某個屬性,所以運行會出問題。於是我就是用 phantomjs 來作為運行時環境.考慮到有同學不知道 phantomjs 怎麼使用,這裡我簡要說一下吧。使用 windows 的同學先要去 phantomjs 官網下載它的可執行文件,然後設置環境變量。在命令行輸入"phantomjs some.js"即可執行 some.js 文件,其實就和在命令行執行 python 或者 java 文件一樣,如果不清楚的可以百度執行命令行執行 python 的方法,仿照著來就可以了,再不清楚就問我。使用 ubuntu 的同學可以直接用 sudo apt-get install phantomjs,就可以安裝使用了。我直接把加密的 js 文件使用 phantomjs 運行,果然好著呢。原因是因為 phantomjs 其實就是一款無 ui 的瀏覽器,自然支持 navigator、window 等屬性。而 pyexecjs 支持使用 phantomjs 作為運行時環境,具體用法 pyexecjs 的 git 主頁有,我也在代碼中有所體現。

with open('G:/javascript/sinajs.js','r') as f:

        source = f.read()

        phantom = execjs.get('PhantomJS')

        getpass = phantom.compile(source)

        mypass = getpass.call('getpass',mypass,nonce,servertime,pubkey)

這段代碼就可以得到加密過後的密碼了。

之後,便可以進行 post 提交,提交地址可以從抓包工具看到:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)。

根據經驗,到這裡過程基本就完了。但是微博有點坑啊,這裡還需要有一步,就是圖一所示的類似http://passport.weibo.com/wbsso/login?ssosavestate=1493447127&url=http://weibo.com/ajaxlogin.php?framelogin=1&callback;=parent.sinaSSOController.feedBackUrlCallBack&ticket=ST-NTc3NTg1MjMwNw==-1461911127-gz-1DE185DF04280D7E96BDCD14D9D8E235&retcode=0,這一步會將請求重定向,返回當前帳號的登陸信息,如下圖:

圖三

那麼問題來了,怎麼獲取上面的請求地址呢。分析上面地址,有 ticket 欄位,這個應該是讓你登陸的憑據,所以這個地址應該是服務端返回的,如果不是,起碼 ticket 是服務端返回的,於是我們又使用抓包工具查看在請求這段 url 之前返回的信息,發現有和上述 url 吻合的信息:

圖四

這段代碼是使用 post 後回復的內容,所以可以直接從中提取出我們需要的 url。然後再使用 get 方式請求上述的 url,它會經歷一次重定向,直接返回登陸信息。這個時候,就代表成功登陸了。

PS:授人以魚不如授人以漁,這是我一直秉承的信念。可能有的老手覺得我寫得很囉嗦,但其實很多新手可能都不知道這些細節,所以我把我在分析新浪微博模擬登陸的過程全寫了出來。另外,除了這種方式,本文提到的另外兩種方式也有實現。最暴力的方式需要使用 rsa 這個第三方庫,具體我在代碼上有詳細注釋,還有一種是使用 selenium phantomjs 這種方式,我也在代碼中關鍵地方有注釋.

Talk is cheap,show me the code!

最後奉上本文的所有方式的模擬登陸代碼(如果覺得喜歡或者看了對你有幫助,不妨在 github 上給個 star,也歡迎 fork)

代碼連結,歡迎 fork 和 star:https://github.com/w1796246076/smart_login/

題圖:pexels,CC0 授權。

點擊閱讀原文,查看更多 Python 教程和資源。

相關焦點

  • 硬幹formdata加密實現知乎模擬登陸
    你是不是就想使用 selenium 來模擬登陸?不過好像知乎對 selenium 也進行了相應的反爬處理,哈哈。但是我不也想用 selenium,效率太慢了,直接破解 js 才是我最喜歡挑戰的。好,我現在教你如何用 js 硬擼破解,廢話不多說,直接進入正題。
  • Python爬蟲超詳細講解(零基礎入門,老年人都看的懂)
    講解我們的爬蟲之前,先概述關於爬蟲的簡單概念(畢竟是零基礎教程)爬蟲網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人)就是模擬瀏覽器發送網絡請求,接收請求響應,一種按照一定的規則,自動地抓取網際網路信息的程序。原則上,只要是瀏覽器(客戶端)能做的事情,爬蟲都能夠做。
  • 【震驚】官方微博也飆車 新浪軍事一石激起千層浪
    今天(6月7號)早上八點四十九分,新浪軍事官方微博@新浪軍事 發布了一則題為【疑似駐日美國大兵與日本女兵不雅視頻網上瘋傳】的微博,配圖大量打了馬賽克的不雅照
  • 神器 VS Code,超詳細Python配置使用指南
    神器 VS Code,超詳細Python配置使用指南大家好,我是 Lemon。VS Code 官網02 在終端運行程序在沒有安裝其他 Python 插件的情況下,可以在 VS Code 中通過使用終端 (Terminal)直接運行 python
  • 運用python實現埠掃描
    前言最近在學習掃描器,web掃描器的內容,今天就分享一下python下的namp的埠掃描功能模塊的實現並在代碼中了解一下在
  • 年度大颶風」麥可「已對準美國,登陸強度將超颱風山竹!
    但是,麥可的走位非常巧妙,它從加勒比海、墨西哥灣之間的狹窄水道穿過,繞開了墨西哥、古巴的所有高山;麥可登陸前恰逢大槽南下,它會在一種叫「槽爆」的現象中巨幅受益並猛烈增強。歐洲數值對颶風麥可的集合分析,中氣愛製作因此按我國的標準,麥可登陸美國前有可能達到強颱風上限甚至超強颱風的強度(15-16級),超過山竹登陸廣東時。
  • 商業人物日報5.3 阿里3年給微博帶來3億美元,但微博也被淘寶廣告攻陷了
    【國內】阿里3年給微博帶來3億美元,但微博也被淘寶廣告攻陷了新浪微博日前遞交給SEC的文件顯示,阿里巴巴2013年、2014年、2015年分別給新浪微博帶來4913萬美元、1.07億美元、外媒稱,在阿里巴巴成新浪微博的股東後,國內網民看到,新浪微博中嵌入的阿里巴巴網絡購物廣告越來越多,新浪微博也成為淘寶、天貓兩大平臺的新增流量來源。截止到2016年3月31日,新浪持有新浪微博54.5%的股權,擁有78.3%投票權,阿里巴巴作為第二大股東,持有30.5%的股權,有14.6%投票權。新浪CEO曹國偉擁有1.4%的股權。
  • 「漢光」全追蹤 蔡英文全副武裝視察,模擬「反登陸」
    據臺灣媒體報導,今年的「漢光32號」演習從22日起展開為期5天的攻防演練,模擬檢驗大陸「猝然對臺發動攻擊」時,臺軍有無能力「擊退敵軍保衛『國家』」,而蔡英文今天首次以「三軍統帥」身份到現場觀演。蔡英文全副武裝視察,模擬「反登陸」作戰
  • 暴雪起訴新浪手遊抄襲,PS+歐服9月會免,Xbox精英無線手柄2代,《異界鎖鏈》S+評級超帥戰鬥演示
    據外媒Polygon報導,暴雪娛樂本月16日向加州法庭提交了訴訟,稱新浪遊戲的免費手遊《Glorious Saga》「幾乎整個抄襲了他們的《魔獸》遊戲以及相關產品」。外媒指出新浪遊戲(Sina Games)是中國軟體和科技公司新浪集團的分部,暴雪認為該公司的「很多」遊戲都是「基於」知名系列遊戲而推出的,包括《遊戲王》、《火影》以及《魔獸》。
  • python:pandas入門詳細教程
    前面介紹了numpy的入門基本知識,今天本文要對pandas進行入門詳細介紹
  • CatBoost的Python與R實現
    Python實現CatBoost1.加載數據:```pythonfrom catboost.datasets import titanicimport numpy as npfrom sklearn.model_selection import
  • 李曉明教授作業題算法的python編程實現
    11月10日,北京大學李曉明教授在浙江省江山中學上了一堂精彩的高中信息技術新課標的試驗課,其課堂鞏固環節的作業題如下:  比較普通的算法是用普裡姆算法實現
  • python實現高斯樸素貝葉斯分類器
    python實現高斯樸素貝葉斯分類器    在這篇文章中,我們將使用我最喜歡的機器學習庫scikit-learn在Python中實現樸素貝葉斯分類器。接下來,我們將使用經過訓練的樸素貝葉斯(監督分類法)模型來預測人口收入。
  • Python 實現 BP 神經網絡
    ,每層由單元組成;輸入層由訓練集的實例特徵向量傳入,經過連接結點的權重傳入下一層,前一層的輸出是下一層的輸入;隱藏層的個數是任意的,輸入層只有一層,輸出層也只有一層;除去輸入層之外,隱藏層和輸出層的層數和為n,則該神經網絡稱為n層神經網絡,如下圖為2層的神經網絡;一層中加權求和,根據非線性方程進行轉化輸出;理論上,如果有足夠多的隱藏層和足夠大的訓練集,可以模擬出任何方程
  • 16號颱風浪卡登陸海南,17號颱風在醞釀!南方要一直下雨嗎
    按照官方判定,它是2020年海南省的首個登陸颱風。雷達圖可見,登陸前後浪卡有很明顯的核心區,達到了強熱帶風暴強度。浪卡登陸前,海南、廣東已開始颳風下雨,香港天文臺還為其發了史上最遠的8號波,打破了2014年海鷗颱風的紀錄。但總體來說,由於浪卡強度弱結構散,廣東和海南的風雨不強,完全可防禦。浪卡的「8號波」,也是史上最弱的8號波之一。
  • 【新媒體】紅魔評論:一條微博評論如何從1到億?
    而這條破億的微博竟然引發了一場觀光熱潮,路人為表示對一億評論的驚嘆與好奇,紛紛留言,稱自己為「一億觀光團的路人。」  早在2012年9月10日,吉尼斯世界記錄就正式宣布鹿晗的微博獲得了13162859條評論,創造了「微博上最多評論的博文」的世界記錄!圖:評論過億微博
  • python數據科學系列:pandas入門詳細教程
    pandas,python+data+analysis的組合縮寫,是python中基於numpy和matplotlib的第三方數據分析庫,與後兩者共同構成了python數據分析的基礎工具包,享有數分三劍客之名。
  • 颱風登陸泰國,近期去泰國需謹慎!盤點那些登陸泰國的颱風
    ,登陸時為熱帶風暴強度,最大風力9級。上一次登陸泰國的颱風,是1997年的linda。正因為颱風登陸泰國是非常罕見的事,泰國方面對並不強大的帕布極為重視。帕布登陸泰國前後的雷達圖動畫,來自泰國氣象部門和一般人的印象相反,地處熱帶的泰國,颱風登陸反而非常少,1951年以來一共只有6個命名颱風登陸,和「颱風之國」菲律賓有天壤之別。
  • 解放軍南海搶灘登陸演練!臺媒稱正模擬攻臺
    不但在渤黃東南四大海及整個臺海持續不斷進行史無前例的超大規模、超大範圍、超大強度、超密集的多兵種實彈實戰化軍演,我解放軍戰機戰艦也不斷超高頻警巡東海、戰巡南海、前出西太、繞島巡航!除此,我解放軍還不斷在東南部海域進行具有明確針對性的多兵種、立體聯合作戰、搶灘登陸奪島實彈實戰化訓練演練。據央視軍事,近日,我解放軍就在南海進行了一場大規模的搶灘登陸奪島實彈實戰化演練!
  • HarmonyOS微博第三方登錄實現
    在微博開放平臺註冊一個網站應用,微博開放平臺地址如下:https://open.weibo.com/connect