在Python中用Request库模拟登录(四):哔哩哔哩(有加密,有验证码)
!已失效!
抓包分析
获取验证码

获取加密公钥

其中hash是变化的,公钥key不变
登录

其中用户名没有被加密,密码被加密。
因为在获取公钥的时候同时返回了一个hash值,推测此hash值与密码加密有关。
通过谷歌浏览器控制台分析js代码
右键登录按钮,检查,查看 Event Listeners ,点击a.btn.btn-login右边的login.4f030c3....js:6查看js代码。

点击左下角的{}展开代码

因为获取公钥和hash的链接中有action=getkey,尝试在源代码中搜索getkey,于是找到这样一个函数:
encryptPassword: function (e, t) {
var n = this,
r = !1;
return $.ajax({
url: "https://passport.bilibili.com/login?act=getkey&r=" + Math.random(),
async: !1
}).done(function (t) {
t && t.error && (n.publicTip = "登录失败,服务端出现异常", e = null);
var i = new JSEncrypt;
i.setPublicKey(t.key);
var a = i.encrypt(t.hash + e);
e = a,
r = !0
}),
r ? e : ""
}
观察第10、11行,可知hash和变量e相加后被RSA加密,现在需要确定e是什么。在第11行代码所在的位置设置一个断点,输入用户名密码验证码之后点击登录,在这里密码框输入的是‘mypassword’

点击e就会显示出e的值,看来e就是密码明文。
于是,可以猜测,加密的过程是:密码字符串前面串接hash值,然后进行RSA加密。下面通过测试检查猜测是否正确。
模拟登录
每一次请求的headers都完全复制抓包的内容。
1.获取验证码
def get_code():
url='https://passport.bilibili.com/captcha?r=0.1265352187487443'
headers={复制抓包到的headers}
session.headers.clear()
session.headers.update(headers)
r=session.get(url)
file=open('code.jpg','wb')
file.write(r.content)
file.close()
2.getkey
def get_key():
url='https://passport.bilibili.com/login?act=getkey&r=0.4365052982637341'
headers={复制抓包到的headers}
session.headers.clear()
session.headers.update(headers)
r=session.get(url)
jsondata=json.loads(r.text)
#hash变化,key不变
return (jsondata['hash'],jsondata['key'])
3.加密,具体可以参考博客园的模拟登录的附录部分
def encrypt(Hash,key,password):
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from base64 import b64encode
encryptor=PKCS1_v1_5.new(RSA.importKey(bytes(key,'utf-8')))
return str(b64encode(encryptor.encrypt(bytes(Hash+password,'utf-8'))),'utf-8')
4.登录
def login(code,username,password):
#注意,在登录页面中验证码会自动转成大写
url='https://passport.bilibili.com/web/login'
headers={复制抓包到的headers}
data={',
',
'captcha':code,
'user':username,
'pwd':password,
'keep':'true',
'gourl':'http://www.bilibili.com/'}
session.headers.clear()
session.headers.update(headers)
r=session.post(url,data=data)
return r.text
如果登录成功,将返回 "code":0
5.测试
testurl='https://www.bilibili.com/account/dynamic'
在未登录时,testurl的标题为“bilibili - 提示”,登录时标题为“哔哩哔哩 (゜-゜)つロ 干杯~-bilibili”
session.headers.clear()
r=session.get(testurl)
p=r.text.find('<title>')+len('<title>')
print(r.text[p:r.text.find('<',p)])
在Python中用Request库模拟登录(四):哔哩哔哩(有加密,有验证码)的更多相关文章
- 在Python中用Request库模拟登录(三):Discuz论坛(未加密,有验证码,有隐藏验证)
以Discuz的官方站为例.直接点击网页右上角的登录按钮,会弹出一个带验证码的登录窗口.输入验证码之后,会检查验证码是否正确.然后登录.首先,通过抓包分析,这些过程浏览器和服务器交换了哪些数据. 抓包 ...
- 在Python中用Request库模拟登录(一):字幕库(无加密,无验证码)
字幕库的登录表单如下所示,其中省去了无关紧要的内容: <form class="login-form" action="/User/login.html" ...
- python之cookie, cookiejar 模拟登录绕过验证
0.思路 如果懒得模拟登录,或者模拟登录过于复杂(多步交互或复杂验证码)则人工登录后手动复制cookie(或者代码读取浏览器cookie),缺点是容易过期. 如果登录是简单的提交表单,代码第一步模拟登 ...
- 基于python的request库,模拟登录csdn博客
以前爬虫用urllib2来实现,也用过scrapy的爬虫框架,这次试试requests,刚开始用,用起来确实比urllib2好,封装的更好一些,使用起来简单方便很多. 安装requests库 ...
- python之简单POST模拟登录
宿舍自从换了校园网的认证系统就不再用客户端了,只能在网页登录.每次上网都要打开浏览器的话很不方便,而且我有时在ubuntu控制台上想联网但终端文本浏览器似乎不支持页面跳转,既然如此,何不写个客户端呢? ...
- Python手动构造Cookie模拟登录后获取网站页面内容
最近有个好友让我帮忙爬取个小说,这个小说是前三十章直接可读,后面章节需要充值VIP可见.所以就需要利用VIP账户登录后,构造Cookie,再用Python的获取每章节的url,得到内容后再使用 PyQ ...
- 《转载》python爬虫实践之模拟登录
有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录. 浏览器访问服务器的过程 在用户访问网页时,不论是通过URL输入域名或IP ...
- Python 爬虫实战5 模拟登录淘宝并获取所有订单
经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 ...
- Python 3标准库 第十四章 应用构建模块
Python 3标准库 The Python3 Standard Library by Example -----------------------------------------第十四章 ...
随机推荐
- Gradle 1.12用户指南翻译——第三十九章. IDEA 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- Java泛型type体系
最近看开源代码,看到里面很多Java泛型,并且通过反射去获取泛型信息.如果说要看懂泛型代码,那还是比较容易,但是如果要自己利用泛型写成漂亮巧妙的框架,那必须对泛型有足够的了解.所以这两三天就不在不断地 ...
- web报表工具FineReport常用函数的用法总结(文本函数)
文本函数 CHAR CHAR(number):根据指定数字返回对应的字符.CHAR函数可将计算机其他类型的数字代码转换为字符. Number:用于指定字符的数字,介于1Number:用于指定字符的数字 ...
- 【Android 应用开发】Activity生命周期 与 Activity 之间的通信
一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...
- Mina源码阅读笔记(二)- IoBuffer的封装
在阅读IoBuffer源码之前,我们先看Mina对IoBuffer的描述:A byte buffer used by MINA applications. This is a replacement ...
- 使用vs2010 opencv2.4.4编译release版本程序
大体上要注意一下几点内容: 1.vc++目录的选择上,库目录选择为opencv目录中的staticlib目录 2.在链接->输入->附加依赖库,中添加,相应的staticlib库目录中的所 ...
- How to configure ODBC DSN to access local DB2 for Windows
How to configure ODBC DSN to access local DB2 for Windows MA Genfeng (GuangdongUnitoll Services inco ...
- 一个CSS背景颜色问题
div{ background: rgba(0,0,0,.1); background-color: #19FFFFFF; } 安卓下会显示上面的透明颜色,而在iOS上则显示下面的颜色,并且其 ...
- Runtime - ③ - 分类Category探究
写博客只是为了让自己学的更深刻,参考:https://tech.meituan.com/DiveIntoCategory.html 分类(Category)是个啥玩意儿这里就不多介绍了,这里主要是研究 ...
- 我如何踏上IT路
第一次开技术博客,第一篇博文就聊聊自己是如何走上IT这条路的.一直听人说"搞IT的"颇含贬低色彩,也有IT前辈奉劝不要轻易踏上这条路,但最终我这个本是化学化工专业的门外汉还是义无反 ...