一、功能简介:
通过接口进行网站的注册和登录请求,目的是提供用户名和密码即可一键注册成功。此为学习之作,只求功能实现。
涉及到的知识有:request请求--json数据处理--数字型图形验证码识别pytesseract--数据库操作pymysql--unittest使用--将元组转换为字符串
二、准备工作:
需要安装以下模块:
python3
Tesseract-OCR
pip install requests
pip install jsonpointer
pip install Pillow
pip install pytesseract
pip install pymysql
可能遇到的问题如下:
1.若进行图像识别时出现错误,则参考如下链接:
https://www.cnblogs.com/tanghuang/p/6380588.html
https://www.cnblogs.com/hupeng1234/p/7136442.html
2. 安装Pillow时对pip版本有要求,若pip版本太低,则需要升级pip。windows下的升级命令为:python -m pip install -U pip;
linux或者macos上的pip升级命令为为:pip install -U pip。若升级时提示已经升级成功,但使用时pip命令时,版本还是升级前的版本,则进入到D:\Program Files (x86)\Python34\Lib\site-packages,将pip-10.0.1.dist-info文件夹删除,再重新运行pip更新命令即可。
三、代码片段:
1. request请求&json数据处理:
import requests import json import jsonpointer
body = {"loginName": mobile, "loginPwd": loginPwd,"appVersion": "3.0.4","clientSide": "web"} http_client = requests.post("https://www.xxxxxx/webapi/login", data=body) rev_msg = http_client.json() #json.dumps()用来以json格式展示pyton对象。ensure_ascii默认为True,这会导致python对象中的中文字符展示为ascii编码。indent表示缩进 rev_msg = json.dumps(rev_msg, ensure_ascii=False, indent=2) print("-------------登录请求的结果-------------") print(rev_msg) # json.loads()用于解码 JSON 数据,该函数返回 Python 字段的数据类型 json_dict = json.loads(rev_msg) code = jsonpointer.resolve_pointer(json_dict, "/code") self.assertEqual(code, 0)
2. 数字型图形验证码识别:
from PIL import Image import pytesseract
#获取图形验证码 body = {"moduleId":"REGISTERIMAGE", "height":"35", "width": "84", "r": "12345678"} http_client = requests.get("https://xxxxxxx/webapi/generateImageCode", params=body) #文件一定要以二进制方式打开 with open('picture.jpg','wb') as file1: file1.write(http_client.content) file1.close() sms_code = pytesseract.image_to_string(Image.open("picture.jpg")) print("-------------图形验证码-------------") print(sms_code)
3. 数据库操作pymysql&将元组转换为字符串:
pymysql的使用方法,详见https://www.cnblogs.com/wt11/p/6141225.html
import pymysql
conn = pymysql.connect(host="xxx", port=xxx, user="root", passwd="xxx", db="xxx" ,charset="utf8") cursor = conn.cursor() eff_row = cursor.execute("SELECT a.content FROM xxx.xxx a WHERE a.mobile = %s ORDER BY a.create_time DESC LIMIT 1",(mobile)) rows = cursor.fetchone() print(rows[0]) #将元组转换为字符串并截取第4到8位 rowone = "".join(rows)[4:8] print("-------------注册短信验证码-------------") print(rowone) conn.connect() cursor.close() conn.close()
4. unittest的使用方法:
unittest的使用方法详见:https://www.cnblogs.com/111testing/p/6477005.html
self.assertEqual(code, 0) def casesuite(): suite = unittest.TestSuite() suite.addTest(RegisterCase("Register")) runner = unittest.TextTestRunner() runner.run(suite) if __name__ == "__main__": casesuite()