概述:(超简单)破解文泉学堂的登陆验证
破解文泉学堂的登陆验证
写在开头声明应用程序&依赖思路检查登陆是否影响资源的访问权限解析登陆请求,尝试模拟登陆获得请求链接获得请求参数解析登陆思路使用Python进行模拟登陆总结
写在开头
说起来挺尴尬的
昨天上午刚刚分享了文泉学堂的Jwt-HS256加解密详解,下午服务器就被恶意爬虫攻击了。
console.log('真的不是我干的')
文泉学堂爬虫:Jwt-HS256加解密详解
https://blog.csdn.net/m0_46261074/article/details/104162067
于是文泉暂时关闭服务器,更新了反爬机制后重新上线。
说实话人家服务器都被玩崩了也挺惨的,于是火急火燎上线了登陆验证,不登号的一律不许学习。
声明
- 本文尽仅涉及到获取 文泉学堂登陆状态 的可用Cookie ,不涉及书籍的下载与爬取; 本文仅限学习交流使用,不得用于商业或非法用途,否则,一切后果请用户自负。 如有侵权请邮件与我联系处理。
应用程序&依赖
Chrome
python 3.8
PyCharm
PostMan Canary
pip install requests
思路
跳过登陆或模拟登陆,访问我们需要的资源。
- 检查登陆是否影响资源的访问权限; 解析登陆请求,尝试模拟登陆;
检查登陆是否影响资源的访问权限
从网站中随意拿一个api出来尝试请求:
api_initRead = 'https://www.wqxuetang.com/v1/read/initread' 1 import requests session = requests.session() api_initRead = 'https://www.wqxuetang.com/v1/read/initread' response = session.get(api_initRead) print(response.text)
{“data”:[],“errcode”:3001,“errmsg”:“请先登录”}
哦豁完蛋,以前能请求到的资源现在要登陆才能看到了。
解析登陆请求,尝试模拟登陆
进入文泉学堂官网,发现要求进行登陆:
https://www.wqxuetang.com/#/
点击去登陆跳转进登陆界面,选择用密码登陆并进入控制台,查看登陆按钮所对应的JS函数:
看到登陆按钮响应 post_login
函数。
全局搜索post_login函数,并点击进入函数体:
通过分析函数体,我们可以了解到:post_login函数执行了ajax请求,我们在函数结尾打断点并登陆,查看具体的链接和参数信息。
获得请求链接
网页在断点暂停,可以看到请求链接和请求参数,发现请求链接是由/checklogin?和u[1]拼接,在控制台输出u[1] :
response_type=code&client_id=wqxuetang&redirect_uri=https%3A%2F%2Fwww.wqxuetang.com%2Fv1%2Flogin%2Fcallbackwq&scope=userinfo&state=https%3A%2F%2Flib-nuanxin.wqxuetang.com%2F%23%2F
与baseUrl和/checklogin?拼接:
http://open.izhixue.cn/checklogin?response_type=code&client_id=wqxuetang&redirect_uri=https%3A%2F%2Fwww.wqxuetang.com%2Fv1%2Flogin%2Fcallbackwq&scope=userinfo&state=https%3A%2F%2Flib-nuanxin.wqxuetang.com%2F%23%2F
发现Url中有通过UrlEncode编码的文字,进行UrlEncode解码后:
http://open.izhixue.cn/checklogin?response_type=code&client_id=wqxuetang&redirect_uri=https://www.wqxuetang.com/v1/login/callbackwq&scope=userinfo&state=https://lib-nuanxin.wqxuetang.com/#/
api_checklogin = 'http://open.izhixue.cn/checklogin?response_type=code&client_id=wqxuetang&redirect_uri=https://www.wqxuetang.com/v1/login/callbackwq&scope=userinfo&state=https://lib-nuanxin.wqxuetang.com/#/'
至此成功生成登陆请求链接,在这里命名为api_checklogin。
获得请求参数
请求参数就是data中的内容,包含accout和password两个部分,毫无疑问就是账号和密码。不过这里的登陆参数居然是用明文传输的真的是震撼狗妈,清华总是给我们惊喜。
data = 'account=XXXXXXXXXXX&password=XXXXXXXXXXX'
解析登陆思路
在获得请求链接和请求参数之后我们使用Postman进行Post请求尝试登陆:
Tips:注意POST请求需要设置对应的Content-Type,否则可能导致请求失败!
可以看到请求成功,返回值是一串JSON,包含code,message和data三个字段,可以看到唯一有效的字段就是data,同样是一段通过UrlEncode编码后的网址信息:
尝试使用UrlEncode解码后:
https://www.wqxuetang.com/v1/login/callbackwq?code=f3e9b5931b53764aeebd529a3d03fc5ed9ce9f33&state=https://lib-nuanxin.wqxuetang.com/#/
Tips: 该网址在一次解码后仍有urlencode编码的文字,进行第二次解码后才可以得出以上内容。
至此成功生成Callback链接,在这里命名为api_callback。
api_callback = 'https://www.wqxuetang.com/v1/login/callbackwq?code=f3e9b5931b53764aeebd529a3d03fc5ed9ce9f33&state=https://lib-nuanxin.wqxuetang.com/#/'
之后继续分析JS,发现在第一次请求成功后,会调用windows.location.href
函数请求该网址:
由此得出结论,登陆时会先请求checklogin链接,认证成功后返回callback链接,再由浏览器请求callback链接并将callback返回的Cookie信息设置给浏览器。
使用Python进行模拟登陆
直接上代码,注释写的很清楚:
import urllib.parse import requests def login(account, password): api_checklogin = 'http://open.izhixue.cn/checklogin?response_type=code&client_id=wqxuetang&redirect_uri=https://www.wqxuetang.com/v1/login/callbackwq&scope=userinfo&state=https://lib-nuanxin.wqxuetang.com/#/' # 创建了一个请求Session session = requests.session() # 生成登陆参数 headers = {"Content-Type": 'application/x-www-form-urlencoded;charset=UTF-8'} data = 'account={}&password={}'.format(account, password) # 进行请求 response_checklogin = session.post(api_checklogin, data=data, headers=headers) # 解码回调链接 api_callback = urllib.parse.unquote(response_checklogin.json()['data']) # 请求回调链接,并返回需要调Cooike response_callback = session.get(api_callback, allow_redirects=False) return response_callback.cookies def get_user(cookies): session = requests.session() api_login = 'https://www.wqxuetang.com/v1/login/checklogin' response = session.get(api_login, cookies=cookies) return response.text if __name__ == '__main__': account = 'XXXXXXXX' password = 'XXXXXXXX' cookies = login(account, password) userInfo = get_user(cookies) print(userInfo)
可以看到成功返回了登陆的用户信息。
总结
挺简单的。
编辑于 Tues Feb 4 19:20:46 2020
左素