PC登入新浪微博時,在客戶端用js預先對使用者名稱、密碼都進行了加密,而且在POST之前會GET一組引數,這也將作為POST_DATA的一部分。這樣,就不能用通常的那種簡單方法來模擬POST登入(比如人人網)。 透過爬蟲獲取新浪微博資料,模擬登入是必不可少的。 1、在提交POST請求之前,需要GET獲取四個引數(servertime,nonce,pubkey和rsakv),不是之前提到的只是獲取簡單的servertime,nonce,這裡主要是由於js對使用者名稱、密碼加密方式改變了。 1.1由於加密方式的改變,我們這裡將使用到RSA模組,有關RSA公鑰加密演算法的介紹可以參考網路中的有關內容。下載並安裝rsa模組: 下載:https//pypi.python.org/pypi/rsa/3.1.1 rsa模組文件地址:http//stuvel.eu/files/python-rsa-doc/index.html 根據自己的Python版本選擇適合自己的rsa安裝包(.egg),在win下安裝需要透過命令列使用easy_install.exe(win上安裝setuptool從這裡下載:setuptools-0.6c11.win32-py2.6.exe安裝檔案)進行安裝,例如:easy_installrsa-3.1.1-py2.6.egg,最終命令列下測試importrsa,未報錯則安裝成功。 1.2獲得以及檢視新浪微博登入js檔案 檢視新浪通行證url(http//login.sina.com.cn/signup/signin.php)的原始碼,其中可以找到該js的地址http//login.sina.com.cn/js/sso/ssologin.js,不過開啟后里面的內容是加密過的,可以在網上找個線上解密站點解密,檢視終端使用者名和密碼的加密方式。 1.3登入 登入第一步,新增自己的使用者名稱(username),請求prelogin_url連結地址: prelogin_url="http//login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)"%username 使用get方法得到以下類似內容: sinaSSOController.preloginCallBack({"retcode":0,"servertime":1362041092,"pcid":"gz-6664c3dea2bfdaa3c94e8734c9ec2c9e6a1f","nonce":"IRYP4N","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":1}) 進而從中提取到我們想要的servertime,nonce,pubkey和rsakv。當然,pubkey和rsakv的值我們可以寫死在程式碼中,它們是固定值。 2、之前username經過BASE64計算: 複製程式碼程式碼如下: username_=urllib.quote(username) username=base64.encodestring(username)[:-1] password經過三次SHA1加密,且其中加入了servertime和nonce的值來干擾。即:兩次SHA1加密後,結果加上servertime和nonce的值,再SHA1算一次。 在最新的rsa加密方法中,username還是以前一樣的處理; password加密方式和原來有所不同: 2.1先建立一個rsa公鑰,公鑰的兩個引數新浪微博都給了固定值,不過給的都是16進位制的字串,第一個是登入第一步中的pubkey,第二個是js加密檔案中的‘10001"。 這兩個值需要先從16進位制轉換成10進位制,不過也可以寫死在程式碼裡。這裡就把10001直接寫死為65537。程式碼如下: 複製程式碼程式碼如下: rsaPublickey=int(pubkey,16) key=rsa.PublicKey(rsaPublickey,65537)#建立公鑰 message=str(servertime)+"\t"+str(nonce)+"\n"+str(password)#拼接明文js加密檔案中得到 passwd=rsa.encrypt(message,key)#加密 passwd=binascii.b2a_hex(passwd)#將加密資訊轉換為16進位制。 2.2請求通行證url:login_url=‘http//login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)" 需要傳送的報頭資訊 複製程式碼程式碼如下: postPara={ "entry":"weibo", "gateway":"1", "from":"", "savestate":"7", "userticket":"1", "ssosimplelogin":"1", "vsnf":"1", "vsnval":"", "su":encodedUserName, "service":"miniblog", "servertime":serverTime, "nonce":nonce, "pwencode":"rsa2", "sp":encodedPassWord, "encoding":"UTF-8", "prelt":"115", "rsakv":rsakv, "url":"http//weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack", "returntype":"META" } 請求的內容中添加了rsakv,將pwencode的值修改為rsa2,其他跟以前一致。 將引數組織好,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=101則表示登入失敗。登入成功後結果與之類似,不過retcode的值是0。 3、登入成功後,在body中的replace資訊中的url就是我們下一步要使用的url。然後對上面的url使用GET方法來向伺服器發請求,儲存這次請求的Cookie資訊,就是我們需要的登入Cookie了。
一種是知道加密演算法,post加密後的演算法,比較麻煩,需要看js。 一種用一些web瀏覽器核心模擬登入行為,直接輸入密碼即可!
PC登入新浪微博時,在客戶端用js預先對使用者名稱、密碼都進行了加密,而且在POST之前會GET一組引數,這也將作為POST_DATA的一部分。這樣,就不能用通常的那種簡單方法來模擬POST登入(比如人人網)。 透過爬蟲獲取新浪微博資料,模擬登入是必不可少的。 1、在提交POST請求之前,需要GET獲取四個引數(servertime,nonce,pubkey和rsakv),不是之前提到的只是獲取簡單的servertime,nonce,這裡主要是由於js對使用者名稱、密碼加密方式改變了。 1.1由於加密方式的改變,我們這裡將使用到RSA模組,有關RSA公鑰加密演算法的介紹可以參考網路中的有關內容。下載並安裝rsa模組: 下載:https//pypi.python.org/pypi/rsa/3.1.1 rsa模組文件地址:http//stuvel.eu/files/python-rsa-doc/index.html 根據自己的Python版本選擇適合自己的rsa安裝包(.egg),在win下安裝需要透過命令列使用easy_install.exe(win上安裝setuptool從這裡下載:setuptools-0.6c11.win32-py2.6.exe安裝檔案)進行安裝,例如:easy_installrsa-3.1.1-py2.6.egg,最終命令列下測試importrsa,未報錯則安裝成功。 1.2獲得以及檢視新浪微博登入js檔案 檢視新浪通行證url(http//login.sina.com.cn/signup/signin.php)的原始碼,其中可以找到該js的地址http//login.sina.com.cn/js/sso/ssologin.js,不過開啟后里面的內容是加密過的,可以在網上找個線上解密站點解密,檢視終端使用者名和密碼的加密方式。 1.3登入 登入第一步,新增自己的使用者名稱(username),請求prelogin_url連結地址: prelogin_url="http//login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)"%username 使用get方法得到以下類似內容: sinaSSOController.preloginCallBack({"retcode":0,"servertime":1362041092,"pcid":"gz-6664c3dea2bfdaa3c94e8734c9ec2c9e6a1f","nonce":"IRYP4N","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":1}) 進而從中提取到我們想要的servertime,nonce,pubkey和rsakv。當然,pubkey和rsakv的值我們可以寫死在程式碼中,它們是固定值。 2、之前username經過BASE64計算: 複製程式碼程式碼如下: username_=urllib.quote(username) username=base64.encodestring(username)[:-1] password經過三次SHA1加密,且其中加入了servertime和nonce的值來干擾。即:兩次SHA1加密後,結果加上servertime和nonce的值,再SHA1算一次。 在最新的rsa加密方法中,username還是以前一樣的處理; password加密方式和原來有所不同: 2.1先建立一個rsa公鑰,公鑰的兩個引數新浪微博都給了固定值,不過給的都是16進位制的字串,第一個是登入第一步中的pubkey,第二個是js加密檔案中的‘10001"。 這兩個值需要先從16進位制轉換成10進位制,不過也可以寫死在程式碼裡。這裡就把10001直接寫死為65537。程式碼如下: 複製程式碼程式碼如下: rsaPublickey=int(pubkey,16) key=rsa.PublicKey(rsaPublickey,65537)#建立公鑰 message=str(servertime)+"\t"+str(nonce)+"\n"+str(password)#拼接明文js加密檔案中得到 passwd=rsa.encrypt(message,key)#加密 passwd=binascii.b2a_hex(passwd)#將加密資訊轉換為16進位制。 2.2請求通行證url:login_url=‘http//login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)" 需要傳送的報頭資訊 複製程式碼程式碼如下: postPara={ "entry":"weibo", "gateway":"1", "from":"", "savestate":"7", "userticket":"1", "ssosimplelogin":"1", "vsnf":"1", "vsnval":"", "su":encodedUserName, "service":"miniblog", "servertime":serverTime, "nonce":nonce, "pwencode":"rsa2", "sp":encodedPassWord, "encoding":"UTF-8", "prelt":"115", "rsakv":rsakv, "url":"http//weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack", "returntype":"META" } 請求的內容中添加了rsakv,將pwencode的值修改為rsa2,其他跟以前一致。 將引數組織好,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=101則表示登入失敗。登入成功後結果與之類似,不過retcode的值是0。 3、登入成功後,在body中的replace資訊中的url就是我們下一步要使用的url。然後對上面的url使用GET方法來向伺服器發請求,儲存這次請求的Cookie資訊,就是我們需要的登入Cookie了。