python使用rsa加密算法模塊模擬新浪微博登錄
PC登錄新浪微博時(shí),在客戶(hù)端用js預(yù)先對(duì)用戶(hù)名、密碼都進(jìn)行了加密,而且在POST之前會(huì)GET一組參數(shù),這也將作為POST_DATA的一部分。這樣,就不能用通常的那種簡(jiǎn)單方法來(lái)模擬POST登錄(比如人人網(wǎng))。
通過(guò)爬蟲(chóng)獲取新浪微博數(shù)據(jù),模擬登錄是必不可少的。
1、在提交POST請(qǐng)求之前,需要GET獲取四個(gè)參數(shù)(servertime,nonce,pubkey和rsakv),不是之前提到的只是獲取簡(jiǎn)單的servertime,nonce,這里主要是由于js對(duì)用戶(hù)名、密碼加密方式改變了。
1.1 由于加密方式的改變,我們這里將使用到RSA模塊,有關(guān)RSA公鑰加密算法的介紹可以參考網(wǎng)絡(luò)中的有關(guān)內(nèi)容。下載并安裝rsa模塊:
下載:https://pypi.python.org/pypi/rsa/3.1.1
rsa模塊文檔地址:http://stuvel.eu/files/python-rsa-doc/index.html
根據(jù)自己的Python版本選擇適合自己的rsa安裝包(.egg),在win下安裝需要通過(guò)命令行使用easy_install.exe(win上安裝setuptool從這里下載:setuptools-0.6c11.win32-py2.6.exe 安裝文件 )進(jìn)行安裝,例如:easy_install rsa-3.1.1-py2.6.egg,最終命令行下測(cè)試import rsa,未報(bào)錯(cuò)則安裝成功。
1.2 獲得以及查看新浪微博登錄js文件
查看新浪通行證url (http://login.sina.com.cn/signup/signin.php)的源代碼,其中可以找到該js的地址 http://login.sina.com.cn/js/sso/ssologin.js,不過(guò)打開(kāi)后里面的內(nèi)容是加密過(guò)的,可以在網(wǎng)上找個(gè)在線(xiàn)解密站點(diǎn)解密,查看最終用戶(hù)名和密碼的加密方式。
1.3 登錄
登錄第一步,添加自己的用戶(hù)名(username),請(qǐng)求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方法得到以下類(lèi)似內(nèi)容:
sinaSSOController.preloginCallBack({"retcode":0,"servertime":1362041092,"pcid":"gz-6664c3dea2bfdaa3c94e8734c9ec2c9e6a1f","nonce":"IRYP4N","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":1})
進(jìn)而從中提取到我們想要的servertime,nonce,pubkey和rsakv。當(dāng)然,pubkey和rsakv的值我們可以寫(xiě)死在代碼中,它們是固定值。
2、之前username 經(jīng)過(guò)BASE64計(jì)算:
username_ = urllib.quote(username)
username = base64.encodestring(username)[:-1]
password經(jīng)過(guò)三次SHA1加密,且其中加入了 servertime 和 nonce 的值來(lái)干擾。即:兩次SHA1加密后,結(jié)果加上servertime和nonce的值,再SHA1算一次。
在最新的rsa加密方法中,username還是以前一樣的處理;
password加密方式和原來(lái)有所不同:
2.1 先創(chuàng)建一個(gè)rsa公鑰,公鑰的兩個(gè)參數(shù)新浪微博都給了固定值,不過(guò)給的都是16進(jìn)制的字符串,第一個(gè)是登錄第一步中的pubkey,第二個(gè)是js加密文件中的‘10001'。
這兩個(gè)值需要先從16進(jìn)制轉(zhuǎn)換成10進(jìn)制,不過(guò)也可以寫(xiě)死在代碼里。這里就把10001直接寫(xiě)死為65537。代碼如下:
rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) #創(chuàng)建公鑰
message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到
passwd = rsa.encrypt(message, key) #加密
passwd = binascii.b2a_hex(passwd) #將加密信息轉(zhuǎn)換為16進(jìn)制。
2.2 請(qǐng)求通行證url:login_url =‘http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)'
需要發(fā)送的報(bào)頭信息
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'
}
請(qǐng)求的內(nèi)容中添加了rsakv,將pwencode的值修改為rsa2,其他跟以前一致。
將參數(shù)組織好,POST請(qǐng)求。檢驗(yàn)是否登錄成功,可以參考POST后得到的內(nèi)容中的一句 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則表示登錄失敗。登錄成功后結(jié)果與之類(lèi)似,不過(guò)retcode的值是0。
3、登錄成功后,在body中的replace信息中的url就是我們下一步要使用的url。然后對(duì)上面的url使用GET方法來(lái)向服務(wù)器發(fā)請(qǐng)求,保存這次請(qǐng)求的Cookie信息,就是我們需要的登錄Cookie了。
相關(guān)文章
Python使用lambda拋出異常實(shí)現(xiàn)方法解析
這篇文章主要介紹了Python使用lambda拋出異常實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
解決Pycharm 包已經(jīng)下載,但是運(yùn)行代碼提示找不到模塊的問(wèn)題
今天小編就為大家分享一篇解決Pycharm 包已經(jīng)下載,但是運(yùn)行代碼提示找不到模塊的問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python函數(shù)中的不定長(zhǎng)參數(shù)相關(guān)知識(shí)總結(jié)
今天給大家?guī)?lái)的是關(guān)于Python函數(shù)的相關(guān)知識(shí),文章圍繞著Python不定長(zhǎng)參數(shù)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Python的Flask框架標(biāo)配模板引擎Jinja2的使用教程
Jinja2是Python世界的一款高人氣template engine,是許多開(kāi)源Web框架的選擇,包括Flask這樣的明星級(jí)項(xiàng)目,這里我們就來(lái)共同學(xué)習(xí)Python的Flask框架標(biāo)配模板引擎Jinja2的使用教程2016-07-07
Python繪制折線(xiàn)圖可視化神器pyecharts案例
這篇文章主要介紹了Python繪制折線(xiàn)圖可視化神器pyecharts,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
Python中函數(shù)調(diào)用9大方法小結(jié)
在Python中,函數(shù)是一種非常重要的編程概念,它們使得代碼模塊化、可重用,并且能夠提高代碼的可讀性,本文將深入探討Python函數(shù)調(diào)用的9種方法,需要的可以參考下2024-01-01
Django數(shù)據(jù)庫(kù)操作的實(shí)例(增刪改查)
下面小編就為大家?guī)?lái)一篇Django數(shù)據(jù)庫(kù)操作的實(shí)例(增刪改查)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
解決django.db.utils.IntegrityError:(1048, Column las
這篇文章主要介紹了解決django.db.utils.IntegrityError:(1048, Column last_login cannot be null)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

