(一)接口请求+加密基础

发布时间 2023-11-17 01:43:05作者: yangsxuan

一、requests 库示例

  • 安装 requests 库:pip install requests
import requests

"""python
1、接口的组成
    - 请求方法:post、get、put、delete等
    - url:ip+port+path
    - 参数:body
    - 请求头:headers
2、何时写函数?何时写类?
    - 函数:一个功能处理一个逻辑,不需要后续关联
    - 类:处理一个业务,例如:店铺业务中有查询、修改、新增接口,或者后续需要扩展的模块,例如店铺下有份店铺
"""

HOST = "http://192.168.0.128/api.php"


def login(in_data):
    # url
    url = f"{HOST}/user/login"
    # 参数
    payload = in_data
    # 请求头(不一定需要)
    headers = {}
    # 发送请求
    """
    3、请求的参数类型
    data:默认是表单
    json:json
    params:get请求使用
    files:文件上传
    """
    resp = requests.post(url=url, data=payload)
    print(resp.json())


if __name__ == '__main__':
    login_payload = {"accounts": "test001", "pwd": "123456", "type": "username"}
    login(login_payload)

二、requests 库请求的参数类型

请求参数 请求头中数据默认类型 描述
data Content-Type:application/x-www-form-urlencoded 请求体是表单格式:a=1&b=2
json Content-Type:application/json 请求体是 json 格式:
params get 请求 参数在 url 上,如:http://192.168.0.128/api.php?a=1&b=2
file Content-Type:multipart/form-data 文件上传接口中使用

三、requests 库请求相关信息与响应相关信息

  • 例如发送请求:resp = requests.post(url=url, data=payload)
请求相关信息 响应相关信息
resp.request.url -
resp.request.hearders resp.hearders
resp.request.body resp.text

四、requests 库响应消息四种格式

响应数据返回格式 说明 备注
resp.text 返回字符串类型 获取 html 响应数据/xml 格式响应
resp.json() 返回字典 响应数据必须是json字符串才可使用,得到的是字典
resp.content 返回字节类型 下载图片/文件时使用
resp.raw 返回原始 源数据

五、token 技术

  • 图解 token:通过账号密码可以获取一个临时令牌(token),提供给后续作为身份校验

  • 概念:令牌,一般在前后端分离的项目中使用,作为身份的校验

  • 详情:服务后端程序产生的,存放到服务端,一般是缓存中(内存/磁盘),同时返回给客户端

  • 时效性:多久过期有开发或者项目本身决定

  • redis使用场景:登录的 token 会存放到 redis

  • 项目代码的处理:

    • 一般通过登录接口请,成功之后,在响应数据中有 token 值

    • 后续其他接口关联使用这个 token,一般放在后续接口的请求头里

  • 示例:假如 token 值在响应中,可以通过字典取值、jsonpath取值、正则取值

# 下面为举例代码,并非可直接执行的代码

# 字典取值
resp = requests.post(url=url, data=payload)
print(resp.json()['token'])

# jsonpath取值,需要导入 jsonpath 库(需要自行安装:pip install jsonpath
)
import jsonpath
resp = requests.post(url=url, data=payload)
print(jsonpath.jsonpath(obj=resp.json(), expr='$..token'))

# 正则取值,需要导入 re 库
import re
resp = requests.post(url=url, data=payload)
pattern = re.compile('"token":(.*?),')
match = pattern.search(resp.text)
print(match.groups()[0])
# 或者
resp = requests.post(url=url, data=payload)
match = re.search(pattern='"code":(.*?),', string=resp.text)
print(match.groups()[0])

六、加密技术

  • 在登录接口请求参数中看到的密码如果为加密的,是前端做的

  • 常见的加密算法:

MD5 RSA AES SM4
原理 Hash 算法,32位数据 非对称加密 对称加密 国密:分组密码算法
分类 MD5加密/盐值加密/双层盐值加密 公钥加密、私钥加密、私钥签名、公钥签名 加密密钥和解密密钥是一样的 SM3/SM4
特点 简单的可以破解(库爆破) 安全,但加密速度慢 加密速度快,但密钥丢失,就容易解密密文,安全性较差 https://baike.baidu.com/item/SM4.0/3901780?fr=ge_ala

1、MD5

  • MD5 加密函数
import hashlib


# MD5 加密函数(加盐)
# 加盐例如:123456+盐值(字符串、数字、时间戳、随机数)
def get_md5_data(data: str, salt='') -> str:
    """
    :param data: 被加密的数据
    :param salt: 盐值,默认是空字符串
    :return: 密文
    """
    # 1、创建 md5 对象
    md5 = hashlib.md5()
    # 2、进行加密
    data = f'{data}{salt}'
    md5.update(data.encode('utf-8'))
    # 3、返回加密后的密文
    return md5.hexdigest()


print(get_md5_data("123456", ''))
- 改进上面登录接口使得密码进行了 MD5 加密
import requests
from utils.handle_encrypt import get_md5_data

HOST = "http://192.168.0.128/api.php"


def login(in_data):
    # url
    url = f"{HOST}/user/login"
    # 入参
    in_data['pwd'] = get_md5_data(in_data['pwd'])
    payload = in_data
    resp = requests.post(url=url, data=payload)
    print(resp.json()['data']['token'])


if __name__ == '__main__':
    login_payload = {"accounts": "test001", "pwd": "123456", "type": "username"}
    login(login_payload)

2、RSA

3、AES

4、SM4


七、cookies 技术