原計劃這篇博客寫在6月1日,沒想到居然因爲寫pandas給耽誤了 查看pandas系列請移步javascript
課程 | 連接 |
---|---|
Python數據分析庫之pandas,你該這麼學!No.1 | dream.blog.csdn.net/article/det… |
看一篇,學一篇,今日份的pandas,你該這麼學!No.2 | dream.blog.csdn.net/article/det… |
點開,看一段,你就會喜歡上學習pandas,你該這麼學!No.3 | dream.blog.csdn.net/article/det… |
學習也能夠有趣,喜歡上pandas,你該這麼學!No.4 | dream.blog.csdn.net/article/det… |
「戲精少女」的pandas學習之路,你該這麼學!No.5 | dream.blog.csdn.net/article/det… |
對不起,給pandas配表情包太難了,pandas你該這麼學,No.6 | dream.blog.csdn.net/article/det… |
大週末的不休息,繼續學習pandas吧,pandas你該這麼學,No.7 | dream.blog.csdn.net/article/det… |
週一不睡覺,也要把pandas groupy 肝完,你該這麼學,No.8 | dream.blog.csdn.net/article/det… |
破週三,前不着村後不着店的,只好學pandas了,你該這麼學,No.9 | dream.blog.csdn.net/article/det… |
學習pandas apply方法,看這一篇就夠了,你該這麼學,No.10 | dream.blog.csdn.net/article/det… |
pandas愈來愈難學,只能本身找趣味了,你該這麼學,No.11 | dream.blog.csdn.net/article/det… |
略微休息一下,繼續爬蟲百例教程,本篇是66講,偏後期的教程了php
今天研究一下如何登陸微博java
打開模擬登陸,這個步驟可使用不一樣的抓包工具,谷歌自帶的開發者工具也能夠實現python
請注意,微博實現登陸,入口和方式不少ajax
最多見的正則表達式
passport.weibo.cn/signin/logi… json
my.sina.com.cn/profile/unl… 服務器
經過在網頁填寫用戶名和密碼,點擊登陸進行數據抓取cookie
這個地方發現一個比較神奇的事情,用谷歌的開發者工具抓取,居然空白,啥都沒有session
青花瓷
軟件 看圖,果真有的
entry=weibo //入口,目測永久爲weibo
gateway=1 //入口?1
from= // from 空
savestate=7 // 存儲狀態 7
qrcode_flag=false //二維碼相關
useticket=1 // 用戶憑證
pagerefer=https.......一個超連接 //某個頁面
vsnf=1
su=bmV0ZHolNDBzaW5hLmNvbQ%3D%3D // su是什麼???
service=miniblog // 忽略
servertime=1560214975 //服務器時間????
nonce=87F5BK // nonce 是什麼?
pwencode=rsa2
rsakv=1330428213 // rsakv ??? rsa加密參數?
sp=一段加密的字符串 // sp加密的字符串
sr=1920*1080
encoding=UTF8
prelt=54
url=https......一個超連接
returntype=META
複製代碼
簡單分析以後,你能夠提取一些關鍵的參數出來,有些參數保持默認值便可
咱們看一下,有哪些參數是最重要的 su
,servertime
,nonce
,sp
這四個參數最爲重要
翻看一下剛纔的連接,不難發現servertime
與nonce
兩個參數已經被找到了
繼續關注抓包數據
ssologin.js
這種js文件出如今這個位置,必定是用來加密的(爬蟲寫的多了,就知道了)
進入到內部,找數據來源
javascript格式化,自行進行便可
在這個連接中,咱們找到一個回調函數 preloginCallBack
請注意,這個地方還有一個參數爲su
查看su的值su: bmV0ZHolNDBzaW5hLmNvbQ==
簡單猜想一下,比較容易,爲Base64加密,Base64加密通常是一個=
結尾?這裏咋出現了兩個?
沒事,一會刪掉一個便可
繼續翻ssologin.js
在裏面找相關的方法 而後找到這部分源碼
var makeRequest = function(username, password, savestate, qrcode_flag) {
var request = {
entry: me.getEntry(),
gateway: 1,
from: me.from,
savestate: savestate,
qrcode_flag: qrcode_flag,
useticket: me.useTicket ? 1 : 0
};
if (me.failRedirect) {
me.loginExtraQuery.frd = 1
}
request = objMerge(request, {
pagerefer: document.referrer || ""
});
request = objMerge(request, me.loginExtraFlag);
request = objMerge(request, me.loginExtraQuery);
request.su = sinaSSOEncoder.base64.encode(urlencode(username));
if (me.service) {
request.service = me.service
}
if ((me.loginType & rsa) && me.servertime && sinaSSOEncoder && sinaSSOEncoder.RSAKey) {
request.servertime = me.servertime;
request.nonce = me.nonce;
request.pwencode = "rsa2";
request.rsakv = me.rsakv;
var RSAKey = new sinaSSOEncoder.RSAKey();
RSAKey.setPublic(me.rsaPubkey, "10001");
password = RSAKey.encrypt([me.servertime, me.nonce].join("\t") + "\n" + password)
} else {
if ((me.loginType & wsse) && me.servertime && sinaSSOEncoder && sinaSSOEncoder.hex_sha1) {
request.servertime = me.servertime;
request.nonce = me.nonce;
request.pwencode = "wsse";
password = sinaSSOEncoder.hex_sha1("" + sinaSSOEncoder.hex_sha1(sinaSSOEncoder.hex_sha1(password)) + me.servertime + me.nonce)
}
}
request.sp = password;
try {
request.sr = window.screen.width + "*" + window.screen.height
} catch(e) {}
return request
};
複製代碼
哇,發現全部的參數都找到了,厲害了
注意看request.sp = password
password是經過三次sha1
加密實現的
全部的參數目前爲止,咱們都找到了,下面要實現的就是寫代碼了
from urllib.parse import quote
import requests,re,json,time,base64
def prelogin(username):
su = base64.b64encode(username.encode())
url = "https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su={}&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_={}".format(quote(su),int(time.time()*1000))
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']
rsakv = data['rsakv']
pubkey = data['pubkey']
return servertime, nonce,rsakv,pubkey
except:
print('沒有獲取到 severtime、nonce、rsakv 、pubkey')
return None
if __name__ == '__main__':
params = prelogin("你的微博登陸郵箱")
print(params)
複製代碼
上述代碼,能夠成功的獲得一些關鍵參數,拿到參數以後,就要進行下一步操做了
pip install rsa
from urllib.parse import quote
from binascii import b2a_hex
import requests,re,json,time,base64,rsa
def prelogin(username):
pass
def get_sp(pubkey,servertime,nonce,password):
'''用rsa對明文密碼進行加密,加密規則翻譯JS代碼'''
# 生成公鑰
# var RSAKey = new sinaSSOEncoder.RSAKey();
# RSAKey.setPublic(me.rsaPubkey, "10001");
# password = RSAKey.encrypt([me.servertime, me.nonce].join("\t") + "\n" + password)
publickey = rsa.PublicKey(int(pubkey, 16), int('10001', 16))
message = str(servertime) + '\t' + str(nonce) + '\n' + str(password)
sp = rsa.encrypt(message.encode(), publickey)
return b2a_hex(sp)
if __name__ == '__main__':
servertime, nonce, rsakv, pubkey = prelogin("你的郵箱")
sp = get_sp(pubkey, servertime, nonce, "你的密碼")
複製代碼
一番努力之下,你已經成功獲取到加密以後的sp參數
這部分代碼比較簡單了,就是湊齊請求參數,發起請求便可 重要的請注意,參數必定要寫準
若是碰到還不清楚的參數,能夠多嘗試一下
好比返回類型這裏,屢次嘗試後,發現使用
returntype = 'TEXT' 能夠返回正確的JSON 而設置 META則須要獲取content了(本身試試吧)
def login(username,password,servertime,nonce,rsakv,pubkey):
data = {
'entry': 'weibo',
'gateway': '1',
'from': 'null',
'savestate': '7',
'useticket': '1',
'vsnf': '1',
'su': get_su(username),
'service': 'account',
'servertime': servertime,
'nonce': nonce,
'pwencode': 'rsa2',
'rsakv': rsakv,
'sp': get_sp(pubkey,servertime,nonce,password),
'sr': '1920*1080',
'encoding': 'UTF-8',
'prelt': random.randint(1,100),
'url': 'https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'TEXT'
}
print(data)
url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'
json_data = session.post(url,data=data).json()
print(json_data)
#判斷post登陸是否成功
if json_data['retcode'] == '0':
params = {
'ticket': json_data['ticket'],
'ssosavestate': int(time.time()),
'callback': 'sinaSSOController.doCrossDomainCallBack',
'scriptId': 'ssoscript0',
'client': 'ssologin.js(v1.4.19)',
'_': int(time.time()*1000)
}
#二次登陸網頁驗證
url = 'https://passport.weibo.com/wbsso/login'
res = session.get(url,params=params)
print(res.text)
json_data1 = json.loads(re.search(r'({"result":.*})', res.text).group())
#判斷是否登陸成功
if json_data1['result'] is True:
print(res.cookies)
print(json_data1)
else:
print(json_data1)
else:
print(json_data)
複製代碼
最終獲得重要信息,表示登陸成功
url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'
json_data = session.post(url,data=data).content.decode("GBK")
print(json_data)
return
複製代碼
返回的數據,須要使用正則表達式進行匹配
怎麼找到我,本身想辦法把
關注公主號,博客左側有
回覆微博,獲取源碼