1. url: https://weibo.com/php
2. target: 登陸python
3. 分析。因爲須要填寫驗證碼,本篇只分析破解用戶名和密碼加密部分,不作驗證碼識別。json
3.1 老規矩,F12,隨便輸入一個賬號密碼,點擊登陸,看看都發起了哪些請求。找到其中的post請求(通常登陸都是post請求)。咱們找到了登陸請求以後,看看都須要哪些參數,加密的參數基本以下:cookie
也就su,servertime,nonce,rsakv,sp幾個參數做了加密。而servertime是時間戳,over。nonce,rsakv這兩個都是能夠在上一個請求的響應中找到的,over。只剩下su和sp。猜想一個是賬號一個是密碼。就先破sp吧。session
3.2 直接搜sp確定是不方便的,目標太大,那就搜一下它上下看起來相關的,並且惟一性比較強的參數,pwencode。看名字也知道跟密碼編碼有關,那就搜它吧。dom
很快就找到了下面這些東西:函數
3.3 打斷點調試,su就是su,b就是sp 。post
3.4 扣js代碼過程,略。就一個一個函數地搞就能夠。學習
4. python代碼:編碼
from afterWork.config import proxies, userAgent import requests import json import execjs import time import re import random def getJsCode(): with open('jsCode.js', 'r') as f: jsCode = f.read() return jsCode def getSu(ctx, account): su = ctx.call('getUser', account) # print(su) return su def getServerTimeNoncePubkey(su): # print('1577263612028') ts = re.sub(r'\.', '', str(time.time())) ts = ts[:13] data = { 'entry': 'weibo', 'callback': 'sinaSSOController.preloginCallBack', 'su': su, 'rsakt': 'mod', 'checkpin': '1', 'client': 'ssologin.js(v1.4.15)', '_': ts } res = requests.get(url='https://login.sina.com.cn/sso/prelogin.php', params=data) # print(res.text) # print(json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))) nonce = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['nonce'] pubkey = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['pubkey'] servertime = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['servertime'] rsakv = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['rsakv'] pcid = json.loads(res.text.lstrip('sinaSSOController.preloginCallBack(').strip(')'))['pcid'] return servertime, pubkey, nonce, rsakv, ts, pcid def getLoginData(su, serverTime, nonce, rsakv, sp, ts): # print('1577263612028') ts = re.sub(r'\.', '', str(time.time()))[:-4] # url='https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_={}'.format(ts) headers = { 'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14', 'Host': 'login.sina.com.cn', 'Referer': 'https://www.weibo.com/login.php', } data = { 'entry': 'sso', 'gateway': '1', 'from': 'null', 'savestate': '30', 'useticket': '0', 'pagerefer': 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)', 'vsnf': '1', 'su': su, 'service': 'sso', 'servertime': serverTime, 'nonce': nonce, 'pwencode': 'rsa2', 'rsakv': rsakv, 'sp': sp, 'sr': '1536*864', 'encoding': 'UTF-8', 'cdult': '3', 'domain': 'sina.com.cn', 'prelt': '113', 'returntype': 'TEXT', } res = requests.post(url='https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_={}'.format(ts), data=data, headers=headers, timeout=10) res.encoding = 'GBK' # print(res.text) loginResult = json.loads(res.text) print(loginResult) return def getSp(ctx, pw, serverTime, nonce, pubKey): sp = ctx.call('getPw', pw, serverTime, nonce, pubKey) # print(sp) return sp def mainFun(): account = '你的賬號' pw = '你的密碼' ctx = execjs.compile(getJsCode()) su = getSu(ctx, account) serverTime, pubKey, nonce, rsakv, ts, pcid = getServerTimeNoncePubkey(su) sp = getSp(ctx, pw, serverTime, nonce, pubKey) getLoginData(su, serverTime, nonce, rsakv, sp, ts) # login(account, sp, pcid, serverTime, nonce) if __name__ == '__main__': mainFun()
結果:
到這裏,已經完成了登陸,能夠用session會話攜帶cookie去訪問一些須要登陸才能訪問的信息。
學習交流,勿做他用。