复制
import io
import json
from pathlib import Path
from PIL import Image
import base64
import cv2
import time
import requests
sess = requests.session()
class SlideCrack(object):
def __init__(self, front, bg, out=None):
"""
init code
:param front: 缺口图片
:param bg: 背景图片
:param out: 输出图片
"""
self.front = front
self.bg = bg
self.out = out
@staticmethod
def clear_white(img):
img = cv2.imread(img)
rows, cols, channel = img.shape
min_x = 255
min_y = 255
max_x = 0
max_y = 0
for x in range(1, rows):
for y in range(1, cols):
t = set(img[x, y])
if len(t) >= 2:
if x <= min_x:
min_x = x
elif x >= max_x:
max_x = x
if y <= min_y:
min_y = y
elif y >= max_y:
max_y = y
img1 = img[min_x:max_x, min_y: max_y]
return img1
def template_match(self, tpl, target):
th, tw = tpl.shape[:2]
result = cv2.matchTemplate(target, tpl, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
tl = max_loc
br = (tl[0] + tw, tl[1] + th)
cv2.rectangle(target, tl, br, (0, 0, 255), 2)
return tl[0]
@staticmethod
def image_edge_detection(img):
edges = cv2.Canny(img, 100, 200)
return edges
def discern(self):
img1 = self.clear_white(self.front)
img1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
slide = self.image_edge_detection(img1)
back = cv2.imread(self.bg, 0)
back = self.image_edge_detection(back)
slide_pic = cv2.cvtColor(slide, cv2.COLOR_GRAY2RGB)
back_pic = cv2.cvtColor(back, cv2.COLOR_GRAY2RGB)
x = self.template_match(slide_pic, back_pic)
return int(x)
def bg_captcha_0(img,bgarray:list):
"""
滑块背景图还原
"""
if isinstance(img, (str, Path)):
_img = Image.open(img)
elif isinstance(img, bytes):
_img = Image.open(io.BytesIO(img))
else:
return
new_img = Image.new('RGB', (300, 200))
__imgx = 300
__imgy = 200
_cutX = int(__imgx / 10)
_cutY = int(__imgy / 2)
for i in range(len(bgarray)):
if i<10:
crop_tuple = (int(i*_cutX),0,int((i+1)*_cutX),100)
else:
crop_tuple = (int((i-10)*_cutX),100,int((i-10+1)*_cutX),200)
img_cut = _img.crop(crop_tuple)
if bgarray[i]<10:
new_img.paste(img_cut,(bgarray[i]*30,0))
else:
new_img.paste(img_cut, ((bgarray[i]-10)*30,100))
new_img.save('./image/bg.png')
return new_img
def indexOf(arr,str_):
if arr and arr.index:
return arr.index(str_)
lenarr = len(arr)
for i in range(lenarr):
if arr[i] == str_:
return i
return -1
def get_tracks(distance, rate=0.5, t=0.2, v=0):
"""
将distance分割成小段的距离
:param distance: 总距离
:param rate: 加速减速的临界比例
:param a1: 加速度
:param a2: 减速度
:param t: 单位时间
:param t: 初始速度
:return: 小段的距离集合
"""
tracks = []
mid = rate * distance
s = 0
while s < distance:
v0 = v
if s < mid:
a = 20
else:
a = -3
s0 = v0 * t + 0.5 * a * t * t
v = v0 + a * t
tracks.append(round(s0))
s += s0
datelist = ''
distance = 0
for i in tracks[1:]:
distance += i
datelist_time = round(time.time() * 1000)
datelist += str(distance) + ',' + str(datelist_time) + '|'
time.sleep(0.005)
return datelist[:-1]
def check_request(data):
headers = {
'Cookie': 'ASP.NET_SessionId=qnfya5nvtn2b3pkycs5hs1zv; gr_user_id=f0c2c220-c9b3-4d70-96dd-1ee89e08a87f; gr_session_id_81eec0d0f0be2df1=da98e241-8c1a-4496-a734-61ad1907ef90; gr_session_id_81eec0d0f0be2df1_da98e241-8c1a-4496-a734-61ad1907ef90=true; xCloseNew=27; redSpot=false',
'Host': 'gov.pkulaw.cn',
'Origin': 'http://gov.pkulaw.cn',
'Pragma': 'no-cache',
'Referer': 'http://gov.pkulaw.cn/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
url = 'http://gov.pkulaw.cn/VerificationCode/GetVerifiCodeResult'
res = sess.post(url,headers=headers,data=data)
return res
def process_main():
register_data = {
'act': 'getcode',
'spec': '300*200'
}
data = json.loads(json.loads(check_request(register_data).text))
bgarray = [int(i) for i in data['array'].split(',')]
normal = data['normal'].split(',')[1]
small = data['small'].split(',')[1]
b64decode = base64.b64decode(normal)
bg_captcha_0(b64decode, bgarray=bgarray)
hk_image = base64.b64decode(small)
with open('./image/hk.png', 'wb') as f:
f.write(hk_image)
sc = SlideCrack('./image/bg.png','./image/hk.png')
slide_s = sc.discern()
check_data = {
'act': 'check',
'point': str(slide_s),
'timespan': '452',
'datelist': get_tracks(slide_s),
}
print(check_request(check_data).text)
process_main()
https://www.cnblogs.com/wyh0923/p/16528354.html
复制如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤