這篇文章帶給大家的內容是關於Python模擬微博登陸的方法介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
今天想做一個微博爬個人頁面的工具,滿足一些不可告人的秘密。那麼首先要做那件必做之事!模擬登陸…
我對程式碼進行了最佳化,重構成了Python 3.6 版本,並且加入了大量註解方便大家學習。
PC 登入新浪微博時, 在用戶端用js預先對使用者名稱、密碼都進行了加密, 而且在POST之前會GET 一組參數,這也將作為POST_DATA 的一部分。這樣, 就不能用通常的那種簡單方法來模擬POST 登入( 例如 人人網 )。
1、在提交POST請求之前, 需要GET 取得兩個參數。
網址是:
http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
##得到的資料中有servertime 和nonce 的值, 是隨機的,其他值看起來沒什麼用。def get_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).text p = re.compile('\((.*)\)') try: json_data = p.search(data).group(1) data = json.loads(json_data) servertime = str(data['servertime']) nonce = data['nonce'] return servertime, nonce except: print('获取 severtime 失败!') return None2、透過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 算一次。
def get_pwd(pwd, servertime, nonce): # 第一次计算,注意Python3 的加密需要encode,使用bytes pwd1 = hashlib.sha1(pwd.encode()).hexdigest() # 使用pwd1的结果在计算第二次 pwd2 = hashlib.sha1(pwd1.encode()).hexdigest() # 使用第二次的结果再加上之前计算好的servertime和nonce值,hash一次 pwd3_ = pwd2 + servertime + nonce pwd3 = hashlib.sha1(pwd3_.encode()).hexdigest() return pwd3 def get_user(username): # 将@符号转换成url中能够识别的字符 _username = urllib.request.quote(username) # Python3中的base64计算也是要字节 # base64出来后,最后有一个换行符,所以用了切片去了最后一个字符 username = base64.encodebytes(_username.encode())[:-1] return username3、將參數組織好,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模擬微博登陸的方法介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!