新浪微博爬取之模拟登录(附完整代码)
目标地址
随便输入一个用户名和密码(毕竟还不想真的登录进去)。
看到请求中的prelogin
登录的url为https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)
而另一个login中的内容是
_:里的一串数字是一样的,英国是时间戳
上面的client里面有个ssologin.js,应该是和login登录有关的json
在elements里面查找
打开这个网址
在之前的query string parameters里面可以找到一个参数su,在这个里面看看su被赋值成了什么
搜索su =
request.su = sinaSSOEncoder.base64.encode(urlencode(username));
意味就是把我们的用户名url编码后再进行base64编码即可,此处获得用户名的加密方法
python实现的话就是
def encode_username(usr):
return base64.b64encode(usr.encode('utf-8'))
su发送的字符为MTIz
Python 实现相同的效果,验证没错
后面一段是password的加密
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;
这段看上去就很让人头大了,写了微博密码的加密过程,有rsa和wsse两个加密分支
有大佬验证过了基本上都是走rsa分支的,另一个分支不用管(我应该直说我不会哈哈哈哈哈)
那么我门仿造他的rsa
import rsa
import binascii
def get_password(message, n):
"""RSA加密用户密码"""
pub_key = rsa.PublicKey(int(n, 16), int('10001', 16))
crypto = rsa.encrypt(message.encode('utf8'), pub_key)
return binascii.b2a_hex(crypto)
也是把"10001"加进PublicKey,然后进行encrypt,然后看下结果
(当然了直接用json里面的对象进行加密也可以咯)
publickey = rsa.PublicKey(int(pubkey, 16), int(‘10001’, 16))
message = str(servertime) + ‘\t’ + str(nonce) + ‘\n’ + str(password)
sp = rsa.encrypt(message.encode(), publickey)
res = binascii.b2a_hex(self.sp)
需要好多username以及password之外的信息,所以还是先请求一波,获取信息。
Form data里面可以看到好多东西,加密方式也是咱们的rsa2,从刚才的加密方式可以看出需要里面的servertime,nonce,pubkey
url = ’ = self.username,tstamp = time.time() * 1000)
try:
res = self.session.get(url).text
print(res)
进行一波访问可以看到获得的内容
用正则表达式取出{}里面的内容
res = re.findall("{.*}",res)[0]###
用json加载,变成字典
self.res = json.loads(res)
这样就获得了我们需要的一些参数。其他的固定的东西直接填上就好。
我的密码也是乱填的123
发出的消息是