前言
抓取登录状态
我们先通过Fiddler进行抓取禅道的登录接口,查看禅道登录接口都有哪些内容。
通过上图片可以看到禅道登录的接口地址、请求方式、请求类型、登录的账号名和密码,细心的小伙伴们可以看出来,在登录的账号名密码中,密码是通过进行加密过后的一段字符,但是密码是怎么加密的,这个没有办法知道。
分析请求体
我们可以先通过进行发送请求这个接口地址,看看返回的内容有没有一些提示信息:
import requests url = 'http://127.0.0.1/pro/user-login.html' r = requests.get(url) print(r.content.decode('utf-8')) |
通过requests进行发送请求,查看我们的返回的内容,可以看到一段关于请求内容一些加密情况。
这里很清楚的描述了,密码的加密情况,密码是通过MD5的方式进行一层加密,然后加上了一个verifyRand这个字符内容又进行了一层加密。
分析到这里,我们可以知道只要找到verifyRand这个字符的内容就能通过MD5的加密方式求出加密后的密码内容。
安静这里多次抓包发现verifyRand这个值每次请求页面的时候都会发生改变,并且在我们的返回内容中也找到了值的位置。
既然发现在我们的请求返回值中可以找到,那么就可以通过正则表达式的形式进行提取出来。
import requests import re url = 'http://127.0.0.1/pro/user-login.html' r = requests.get(url) verify = re.findall(r"name='verifyRand' id='verifyRand' value='(.*?)' />",r.content.decode('utf-8')) print(verify) |
通过上述内容,执行后可以看出,已经将verifyRand的值提取出来了。
MD5加密
前面的步骤已经将登录的所需要的内容都找到了,接下来就是通过MD5进行加密了,这里安静介绍一个python的MD5加密的库:hashlib进行完成加密。
这里的密码进行了双重加密:
import requests import re import hashlib # 通过session的方式进行请求 s = requests.session() user = 'anjing_test' password = 'test_anjing' url = 'http://127.0.0.1/pro/user-login.html' r = s.get(url) # print(r.content.decode('utf-8')) verify = re.findall(r"name='verifyRand' id='verifyRand' value='(.*?)' />", r.content.decode('utf-8'))[0] # 第一次加密密码 pwd1md5 = hashlib.md5() pwd1md5.update(password.encode('utf-8')) pwd1_result = pwd1md5.hexdigest() # 第2次加密 pwd2md5 = hashlib.md5() pwd2md5.update((pwd1_result+verify).encode('utf-8')) pwd2_result = pwd2md5.hexdigest() |
这里将密码进行了2层加密后,我们再次带上加密后的密码,进行请求登录接口。
注意:因为这里后续要进行请求其他网址,安静用了session的方式进行请求。
完成登录
这里安静加了一个判断内容,通过请求进入测试页面,如果进入了测试页面,说明我们的登录成功了;如果没有进入,就是登录失败了。
import requests import re import hashlib # 通过session的方式进行请求 s = requests.session() user = 'anjing_test' password = 'test_anjing' url = 'http://127.0.0.1/pro/user-login.html' r = s.get(url) # print(r.content.decode('utf-8')) verify = re.findall(r"name='verifyRand' id='verifyRand' value='(.*?)' />", r.content.decode('utf-8'))[0] # 第一次加密密码 pwd1md5 = hashlib.md5() pwd1md5.update(password.encode('utf-8')) pwd1_result = pwd1md5.hexdigest() # 第2次加密 pwd2md5 = hashlib.md5() pwd2md5.update((pwd1_result+verify).encode('utf-8')) pwd2_result = pwd2md5.hexdigest() body = { "account": user, "password": pwd2_result, "passwordStrength": 1, "referer": "/pro/", "verifyRand": verify, "keepLogin": 0, } r = s.post('http://127.0.0.1/pro/user-login.html', data=body) # 访问测试页面 test = s.get("http://127.0.0.1/pro/qa/") if "测试主页" in test.text: print('登录成功!!') else: print('登录失败!!') |
通过执行后发现,我们已经登录成功了。
自动提交bug
通过上面的步骤已经完成了对禅道的登录,接下来就是抓取提bug的接口信息,然后模拟接口自动提交bug内容。
分析提交bug接口
继续通过Fiddler进行抓取提交bug接口:
通过分析接口可以看出来,我们是通过表单的形式进行请求的,requests没有请求表单的内容。
表单提交
这里我们需要引入第3方库requests-toolbelt进行完成,这个库需要通过pip进行安装:
pip install requests-toolbelt |
安装过后,我们将上述抓到的信息填写到请求体中,然后在携带这请求体进行请求提交bug的接口内容。
import requests import re import hashlib from requests_toolbelt import MultipartEncoder s = requests.session() user = 'anjing_test' password = 'test_anjing' url = 'http://127.0.0.1/pro/user-login.html' r = s.get(url) # print(r.content.decode('utf-8')) verify = re.findall(r"name='verifyRand' id='verifyRand' value='(.*?)' />", r.content.decode('utf-8'))[0] # 第一次加密密码 pwd1md5 = hashlib.md5() pwd1md5.update(password.encode('utf-8')) pwd1_result = pwd1md5.hexdigest() # 第2次加密 pwd2md5 = hashlib.md5() pwd2md5.update((pwd1_result+verify).encode('utf-8')) pwd2_result = pwd2md5.hexdigest() body = { "account": user, "password": pwd2_result, "passwordStrength": 1, "referer": "/pro/", "verifyRand": verify, "keepLogin": 0, } r = s.post('http://127.0.0.1/pro/user-login.html', data=body) # 访问测试页面 test = s.get("http://127.0.0.1/pro/qa/") if "测试主页" in test.text: print('登录成功!!') else: print('登录失败!!') # 提交bug接口 url2 = 'http://127.0.0.1/pro/bug-create-1-0-moduleID=0.html' body2 = MultipartEncoder( fields=[ ('product', "1"), ('module', '0'), ('project', ' '), ('openedBuild[]', 'trunk'), ('assignedTo', 'admin'), ('deadline', ''), ('type', 'codeerror'), ('os', ''), ('browser', ''), ('title', '正确的账号密码登录失败'), # bug 名称 ('color', ''), ('severity', '3'), ('pri', '3'), ('steps', '<p>[步骤]</p>\n<p>输入正确的账号名密码进行完成登录</p>\n<br />\n<p>[结果]</p>\n登录失败<br />\n<p>[期望]</p>\n登录成功<br />'), ('story', '0'), ('task','0'), ('oldTaskID', '0'), ('mailto[]', ''), ('contactListMenu', ''), ('keywords', ''), ('status', 'active'), ('labels[]', ''), ('files[]', ''), ('uid', '602f5eb06ddc9'), ('case', '0'), ('caseVersion', '0'), ('caseVersion', '0'), ('result', '0'), ('testtask', '0'), ], ) # 请求提交bug接口 r2 = s.post(url2, headers={'Content-Type': body2.content_type}, data=body2) if '保存成功' in r2.text: print('bug提交成功!') else: print('bug提交失败') |
通过执行后,再次返回到我们的bug页面,会发现已经提交成功了。
总结
这里登录禅道以及自动提交bug的过程,主要运用了requests的一些方法以及如何通过代码的形式进行提交表单类型,以及如何通过python进行MD5的加密。
版权声明:本文出自《51测试天地》第六十一期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任