本文学习笔记整理自【Python开发】接口测试教程
一. cookies
0. cookie扫盲:
a. 保存在客户端, 一般由浏览器负责存储在本地
b. 通常是加密存储, 不过因本地存储, 不宜保存敏感信息
c. 哪些信息需要保存, 保存多久吗一般是有服务器决定, 所以http协议中的response header中有set-cookie域来指示浏览器保存cookie信息
d. cookie保存在客户端本地的目的是为了下次访问网站的时候可以直接取出来, 上送服务器
1. 抓取cookie
登录cookie = 登录后的cookie - 登录前的cookie
2. cookie组成
Fiddler抓包只能看到cookie的name和value值
完整的cookie组成结构如下:
1 cookie = {u'domain':u'cnblogs.com', 2 u'name':u'CNBlogsCookie', 3 u'value':u'xxx', 4 u'expiry':1491997887, 5 u'path':u'/', 6 u'httpOnly':True, 7 u'secure':False}
name:cookie的名称
value: cookie对应的值, 动态生成的
domain:服务器域名
expiry:Cookie有效终止日期
path: Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
httpOnly: 防脚本攻击
secure: 在Cookie的标记该变量, 表面只有当浏览器和Web Server之间的通信协议为加密认证协议时, 浏览器才向服务器提交相应的Cookie, 当前这种协议只有一种, 即为HTTPS
3. 添加登录cookie
1. 先用get打开登录页面, 获取一部分cookie
2. set里面参数按括号里面的参数
coo = requests.cookie.RequestCookieJar() coo.set('cookie-name','cookie-value') s.cookie.update(coo)
3. 用update方法添加登录的2个cookie
二. session
0. session扫扫盲
1. session一般翻译成"会话"
2. session是一种管理用户状态和信息的机制, session的数据保存在服务器端, 一般放在服务器的内存里
3. 客户端和服务端通过一个sessionID来进行沟通, sessionID一般是一个较长的随机字符串(一般32或48字节)
1. session保持会话
跨请求情况:比如登录之后发帖, 这个发帖是依赖登录的(需要传登录cookie)
1 # coding: utf-8 2 3 import requests 4 5 s = requests.session() 6 7 login_url = "https://account.cnblogs.com/signin" 8 head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"} 9 r1 = s.get(url=login_url, header=head, verify=False) 10 print(r1.cookies) 11 12 # 添加cookie 13 c = requests.cookies.RequestCookieJar() 14 c.set("cookie-name", "cookie-value") 15 16 # 添加cookie到session 17 s.cookies.update(c) 18 print(r1.cookies) 19 20 # 验证是否登录成功 21 post_url = "" 22 r2 = s.get(post_url, verify=False) 23 print(r2.text)
2. session关联
1. 用session保持会话:s=requests.session()
2. 先get获取部分cookie
3. 登录s.post()账号密码登录(或添加cookie绕过登录)
4. 登录后继续发其他请求, 如s.get(), s.post()
三. 重定向
1. 未登录时候打开博客园编辑页面, 会跳转到登录页面
2. 重定向的地址在response的headers里location 参数会告诉指向下一地址
3. requests模块会自动处理重定向的请求, 可通过r.history查看重定向历史请求记录
1 # coding: utf-8 2 3 import requests 4 5 s = requests.sessions() 6 login_url = "https://i-beta.cnblogs.com/posts/edit" 7 head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"} 8 r1 = s.get(url=login_url, header=head, verify=False) 9 # 禁止重定向:在get/post方法出加参数: allow_redirects=False (默认参数是True) 10 # r1 = s.get(url=login_url, header=head, verify=False, allow_redirects=False) 11 12 # 自动处理重定向的请求 13 print(r1.status_code) 14 15 # 历史请求记录, list类型 16 print(r1.history) 17 18 # 打印出每个重定向的内容 19 for i in r1.history: 20 print(i.status_code) 21 print(i.url)
四. token登录
1. token: 一般app的登录, 都是用token来校验的
2. post请求一定会带token参数, token位置不固定