!已失效!

抓包分析

获取验证码

获取加密公钥

其中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库模拟登录(四):哔哩哔哩(有加密,有验证码)的更多相关文章

  1. 在Python中用Request库模拟登录(三):Discuz论坛(未加密,有验证码,有隐藏验证)

    以Discuz的官方站为例.直接点击网页右上角的登录按钮,会弹出一个带验证码的登录窗口.输入验证码之后,会检查验证码是否正确.然后登录.首先,通过抓包分析,这些过程浏览器和服务器交换了哪些数据. 抓包 ...

  2. 在Python中用Request库模拟登录(一):字幕库(无加密,无验证码)

    字幕库的登录表单如下所示,其中省去了无关紧要的内容: <form class="login-form" action="/User/login.html" ...

  3. python之cookie, cookiejar 模拟登录绕过验证

    0.思路 如果懒得模拟登录,或者模拟登录过于复杂(多步交互或复杂验证码)则人工登录后手动复制cookie(或者代码读取浏览器cookie),缺点是容易过期. 如果登录是简单的提交表单,代码第一步模拟登 ...

  4. 基于python的request库,模拟登录csdn博客

    以前爬虫用urllib2来实现,也用过scrapy的爬虫框架,这次试试requests,刚开始用,用起来确实比urllib2好,封装的更好一些,使用起来简单方便很多. 安装requests库     ...

  5. python之简单POST模拟登录

    宿舍自从换了校园网的认证系统就不再用客户端了,只能在网页登录.每次上网都要打开浏览器的话很不方便,而且我有时在ubuntu控制台上想联网但终端文本浏览器似乎不支持页面跳转,既然如此,何不写个客户端呢? ...

  6. Python手动构造Cookie模拟登录后获取网站页面内容

    最近有个好友让我帮忙爬取个小说,这个小说是前三十章直接可读,后面章节需要充值VIP可见.所以就需要利用VIP账户登录后,构造Cookie,再用Python的获取每章节的url,得到内容后再使用 PyQ ...

  7. 《转载》python爬虫实践之模拟登录

    有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录.   浏览器访问服务器的过程   在用户访问网页时,不论是通过URL输入域名或IP ...

  8. Python 爬虫实战5 模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 ...

  9. Python 3标准库 第十四章 应用构建模块

    Python 3标准库 The Python3 Standard Library by  Example -----------------------------------------第十四章   ...

随机推荐

  1. android TextView 垂直自动滚动字幕实现

    参考网上一些做法然后进行了修改, 首先继承TextView /** * VerticalScrollTextView.java * 版权所有(C) 2013 * 创建者:cuiran 2013-12- ...

  2. iOS中动态计算不同颜色、字体的文字高度

    在改项目bug的时候,有一个问题动态计算label的高度,前开发者竟然用字符串长度除以14.16这样的常量来计算是否换行,结果cell的高度问题非常严重. 因为label内容里有部分关键字是要另一种颜 ...

  3. EBS R12安装升级(FRESH)(一)

    from:http://nufeng.net/ebs-r12-fresh-installation-and-upgrades/ 文章目录[隐藏] 1 EBS安装前准备 1.1 硬件 1.2 虚拟机vm ...

  4. Mac OS X版本的sublime text 3安装汇编语言语法支持

    sublime是个好东西,小巧.功能强大而且跨平台! 不过默认的语法里没有对asm的支持,这让本猫情何以堪- 下面介绍一下Mac OS X中如何给sublime安装汇编的语法和自动汇编命令补全支持. ...

  5. eclipse下载指南

    官网下载地址 下载https://www.eclipse.org/downloads/ 官网https://www.eclipse.org/ 最新版本 Eclipse OXYGEN Eclipse O ...

  6. minimun depth of binary tree

    Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...

  7. db2 查新索引 主键 sql

    1.查询主键 select * from sysibm.syskeycoluse where tbname='...' 2.查询索引 select * from sysibm.indexs where ...

  8. ORACLE 分页查询

    Oracle之分页查询 Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SE ...

  9. JAVA 平台

    由Java虚拟机和Java核心类所构成.它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么. 目录 1Java术语 2移动平台 3桌面应用平台 4企业级平台 5JRE的成分     1J ...

  10. 分布式消息队列XXL-MQ

    <分布式消息队列XXL-MQ>     一.简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行.并行和广播等多种消息模型.现已开放源代码,开箱即用. 支持三种消息模式: ...