Files
SMSBoom/check_code/usual_code.py
T

99 lines
3.5 KiB
Python

# -*- coding: utf-8 -*-
# @Time :2023/5/4 8:02
# @File : usual_code.py
# @Software: PyCharm
# 普通四字母验证码
import time
import cv2 as cv
import pytesseract
from PIL import Image
import requests
import numpy as np
def recognize_text(image_url):
# 使用OpenCV解码图像
image = cv.imread(image_url)
blur = cv.pyrMeanShiftFiltering(image, sp=8, sr=60)
# 灰度图像
gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
# 二值化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
print(f'二值化自适应阈值:{ret}')
# 形态学操作 获取结构元素 开操作
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 2))
bin1 = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
kernel = cv.getStructuringElement(cv.MORPH_OPEN, (2, 3))
bin2 = cv.morphologyEx(bin1, cv.MORPH_OPEN, kernel)
# 逻辑运算 让背景为白色 字体为黑 便于识别
cv.bitwise_not(bin2, bin2)
# 识别
test_message = Image.fromarray(bin2)
text = pytesseract.image_to_string(test_message)
print(f'识别结果:{text}')
def save_image(image_url,name="code.jpg"):
# 图片保存到本地
response = requests.get(image_url)
with open(name, 'wb') as f:
f.write(response.content)
available = {
# 中昱维信
"https://vip.veesing.com/vip-web/register/vcode": {
# 验证码地址
"code": "https://vip.veesing.com/vip-web/register/photocode?timestamp=%s",
# 发送验证码参数
"parameter": {
"phone": "18600000000",
"code": "1234"
},
"headers": {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"referer": "https://vip.veesing.com/",
"User-Agent": "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Mobile Safari/537.36"
}
},
# 逐浪小说
"https://www.zhulang.com/home/login/sendCode.html": {
"code": "https://www.zhulang.com/login/verify.html?_t=%s",
"parameter": {
"phone": "18600000000",
"code": "1234"
},
# 验证码参数映射,如果验证码参数名不是code,则需要映射
"map_param": {
"code": "charcode"
},
"headers": {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"referer": "https://www.zhulang.com/login/phone.html",
"User-Agent": "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Mobile Safari/537.36"
}
}
}
for index,target in enumerate(available):
img_name = "code_%s.jpg" % str(index)
save_image(available[target]["code"] % str(time.time() * 1000),img_name)
validate_code = recognize_text(img_name)
if "map_param" in available[target]:
for key in available[target]["map_param"]:
available[target]["parameter"][available[target]["map_param"][key]] = validate_code
# delte the old key
del available[target]["parameter"][key]
else:
available[target]["parameter"]["code"] = validate_code
available[target]["parameter"]["phone"] = "13886686058"
# post提供表单数据
response = requests.post(target, data=available[target]["parameter"], headers=available[target]["headers"])
try:
print(response.json())
except:
print(response.text)
# for url in ["code.jpg","code_0.jpg","code_1.jpg"]:
# recognize_text(url)