在平时的接口测试当中,会遇到登录的密码或者其他请求参数会需要进行加密处理
这里写的是py当中的hashlib 模块,在模块内可进行查看md5的调用方法。
一般进行接口加密的要求:
1、对接口请求参数进行ASCII码排序
2、做url类型encode编码 (如:username & password & …)
3、最后做md5加密处理
#举例
data=xxxxx
import hashlib
md5 = hashlib.Md5()
md5.update(data.encode("utf-8"))
print(md5.hexdigest())
#函数形式
def get_md5(data):
md5 = hashlib.md5("abcdefg") md5.update(data) r = md5.hexdigest() return r
那么这里就写一个简单的登录数据示例:
如:存在一个登录数据:userdata={"username":"qika","password":"123456"}
--->对参数进行ascii码排序:
userdata=dict ( sorted ( userdata.items(), key = lambda item : item[0] ) )
--->做url类型encode编码:
from urllib import parse
data=parse.urlencode(userdata)
--->md5加密:
import hashlib
md5 = hashlib.Md5()
md5.update(data.encode("utf-8"))
print(md5.hexdigest())
写成一个函数:(动态获取参数加密)
userdata=xxxxxxx
def get_Md5(**kwargs):
userdata=dict ( sorted ( userdata.items(), key = lambda item : item[0] ) )
data=parse.urlencode(userdata)
md5 = hashlib.Md5()
md5.update(data.encode("utf-8"))
return md5.hexdigest()
实例:---------------------------------------------------
例1: 禅道登录接口: import requests import hashlib def MD5_login(str): #这里的参数:就是要加密的内容 md5_qika= hashlib.md5() md5_qika.update(str.encode(encoding='utf-8')) return md5_qika.hexdigest()
password = 'qika123456' #登陆密码:'qika123456',这也是马上要用来加密的内容 url = 'http://xxxx/zentao/login.html '
data = {'account':'qika','password':MD5_login(password),'referer':'/zentao/'} #这是对密码进行Md5加密,所以直接调用上面的方法 response = requests.post(url,data=data) # 发送post请求 print(response.content.decode('utf-8'))
例2: 用md5加密图片名字,爬取图片的时候防止图片重复出现。把它放到下载图片循环里,例如: for ii in i.xpath('div/div/img/@data-original'): img_url = ii[2:] wei = img_url[-4:] md5 = hashlib.md5(wei.encode("gb2312")) listss = md5.hexdigest() if listss in ['.jpg','.gif','.png']: make_files(img_name + '\\' + str(random.randint(1, 99999999999999)) + listss, img_url) else: print(img_url)
例3: #coding:utf-8 """ 功能: 登录验证模块 详细说明: 1.密码文件为passwd 2.passwd未创建或丢失,会提示:密码文件不存在,建议重新注册!! 3.未注册用户登录会提示:用户名不存在,请您先进行注册! 4.已注册用户登录时,忘记密码,尝试3次后密码还不正确则退出验证,等一会儿则可以重新登录 5.作为装饰器进行登录验证 """ import json import hashlib import os pwd = os.getcwd() fileName = os.path.join(pwd,"passwd") #将明文密码通过md5进行加密,返回一个加密后的md5的值 def calc_md5(passwd): md5 = hashlib.md5("abcdefg") md5.update(passwd) ret = md5.hexdigest() return ret #新用户注册模块 def register(): #判断密码文件passwd是否存在,存在则载入列表,不存在就重新创建一个空字典 if os.path.exists(fileName): #载入用户列表,数据结构为字典,k=userName,v=passwdMd5 with open("passwd", "r+") as loadsFn: userDB = json.loads(loadsFn.read()) else: userDB = {} #让用户输入用户名 userName = raw_input("姓名:") #标志位:控制循环跳出 flag = True while flag: #用户注册时,需输入两次密码 passwd1 = raw_input("密码:") passwd2 = raw_input("确认密码:") #如果两次密码不一致,则不执行下一步,再次输入密码并进行确认 if not passwd1 == passwd2: continue else: #两次输入密码一致,标志位置为False,下次跳出循环 flag = False #调用calc_md5函数将明文密码转为对应的md5值,用于保存 passwdMd5 = calc_md5(passwd1) #将用户名与密码对应存入字典userDB中 userDB[userName] = passwdMd5 #将用户名和密码存入文件 with open(fileName, "w") as dumpFn: dumpFn.write(json.dumps(userDB)) #用户登录验证,装饰器 def login(func): def decorater(*args,**kwargs): #判断passwd文件是否存在,存在则载入userDB(用户:密码),否则就重新注册新的passwd文件并返回 if os.path.exists(fileName): with open("passwd", "r+") as loadsFn: userDB = json.loads(loadsFn.read()) else: print "密码文件不存在,建议重新注册!!" register() return name = raw_input("用户名:") #用户名是否存在,存在就继续输入密码,不存在则进行注册 if name in userDB.keys(): flag = True counter = 0 #循环输入密码,密码正确,flag=False(下次直接跳出循环)并执行函数,密码错误则允许尝试3次,超过3次验证失败,退出验证 while flag: passwd = raw_input("密码:") passwdMd5 = calc_md5(passwd) if passwdMd5 == userDB[name]: flag = False func(*args,**kwargs) elif counter > 2: print "您已经尝试了3次,请过会儿再试!!" return else: counter += 1 else: print "用户名不存在,请您先进行注册!" register() return decorater if __name__ == "__main__": @login def hello(): print "Hello world!" hello()