文章目录
登录流程
实战网址
分析思路
- 如何快速找到登录请求?
- 登录请求是静态还是动态?
登录时的图形验证码
图形验证逻辑(实战笔趣阁)
- random->限定长度随机生成字符串->基于字符串生成图片->ip跟cookie与字符串构成映射关系保存在redis/sql ->发送到前端
- 前端输入验证码 ==》发送到服务器
- 服务器判断客户端验证码输入与存在数据库里面的字符串是否相等 ===》可以通过ip取搜索响应
获取图片
实战笔趣阁
在img面板中找到图形验证码的请求
观察图片中带有响应动态Cookie
Python模拟发送请求获取图形验证码
import os
import requests
url_img = "https://www.bbiquge.cc/checkcode.php"
vary_res = requests.get(url=url_img)
vary_res
dir_path = os.path.dirname(__file__)#获取当前python脚本文件的文件夹目录
with open(dir_path+'/vary.png',mode="wb") as f:
f.write(vary_res.content)
开始登录请求
- 找到请求包:
- 构造原有表单数据:
- 在Fiddler的辅助下构造headers
仅带有PHPSESSID便可以成功构造请求
登录请求代码:
import os
import requests
url_img = "https://www.bbiquge.cc/checkcode.php"
vary_res = requests.get(url=url_img)
vary_res
dir_path = os.path.dirname(__file__)#获取当前python脚本文件的文件夹目录
with open(dir_path+'/vary.png',mode="wb") as f:
f.write(vary_res.content)
login_url = "https://www.bbiquge.cc/login.php?do=submit"
headers = {
"content-type": "application/x-www-form-urlencoded",
"cookie": "PHPSESSID=" + vary_res.cookies.get("PHPSESSID")#拿到当前图形验证码对应的cookie
}
checkcode = input("请输入图形验证码:")
data = f"username=jiuwen567&password=test567&checkcode={
checkcode}&usecookie=2592000&action=login&submit=%26%23160%3B%B5%C7%26%23160%3B%26%23160%3B%C2%BC%26%23160%3B"
login_res = requests.post(url=login_url,headers=headers,data=data)
login_res
检验登录请求是否成功:
找不到登录请求的包的情况(实战Minlo)
“username”: “minioadmin”,
“password”: “minioadmin”
如上图登录时很难找到登录请求包,故请出神器Fidder
如上图用Fidder精准找到登录请求包
-
当请求的报文类型设置为json形式的时候,提交报文的类型必须是序列化后的json字符串
-
如果客户端没有序列化json报文以及服务器也没有做序列化请求报文的的逻辑,那么后端就无法正常获取请求的报文
-
如果不序列化则会出现错误如下图
json序列化后:
代码展示:
import json import requests url = "https://portal-minio.zisu.edu.cn/minio/webrpc" headers = { "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.55" } data = { "id":1,"jsonrpc":"2.0","params":{ "username":"minioadmin","password":"minioadmin"},"method":"Web.Login"} res = requests.post(url=url,data=json.dumps(data),headers=headers) res