声明:本文仅限交流学习使用,请勿使用在任何非法商业活动,禁止用于非法用途。否则后果自负。如有侵权,请告知删除,谢谢
1.获取验证码
2.验证码还原
3.环境检测分析
1.某像中完整的验证码是长在叼样的
2.而接口返回的验证码图片是撕裂的
3.话不多说先看看验证码接口图片参数、OK了这些参数没什么东西,下面看下图片还原
w: 300 验证码宽固定
h: 150 验证码高固定
s: 50 未知固定
ak: 99de95ad1f23597c23b3558d932ded3c 滑块
c: 6266217fsZ7JJoGNGHTUbHx82jSrbDTdMxgJ9xA1 随机数
jsv: 1.5.26.108 滑块版本
aid: dx-1650860742126-54245604-3 时间戳随机数
wp: 1
de: 0
uid:
lf: 0
tpc:
cid: 95786668 随机不重要
_r: 0.699649593094317 随机小数
1.Canvas断点调试、其中 a.drawImage 截切图片具体原理百度、既然要截切图片我们就得知道这组数数组、往上跟栈
r , i 图片宽高、o图片被分裂的份数、32 组说明这张验证码被平均切割了32份,是与不是自己数了蛤
2.调用En函数传入图片链接生成数组
3.取图片链接后半部分值进行了 charCodeAt 转码、这里也没啥东西,继续看图片还原
4.图片拼合的逻辑照着他写的搬就行了
5.最后附上图片拼合的源码
import requests
import numpy as np
from PIL import Image
from io import BytesIO
def ar(r):
""" 生成数组的字符串 """
t = []
for n in range(len(r)):
e = ord(r[n])
if 32 == n:
break
while e % 32 in t:
e += 1
t.append(e % 32)
return t
def img_recover(location_array, img_url):
""" 图片拼合 """
img = np.array(Image.open(BytesIO(requests.get(url=img_url, verify=False).content)))
new_img = np.zeros((200, 400, 3), dtype=np.uint8)
lk = len(location_array)
ck = int(400 / lk)
for cp in range(lk):
c = location_array[cp] % lk * ck
xp = cp % lk * ck
slice_img = img[0: 200, c: c + ck]
new_img[0: 200, xp:xp + len(slice_img[0])] = slice_img
return new_img
p1 = "你的验证码图链接"
img_recover(self.ar(p1[p1.rfind('/') + 1: p1.rfind('.')]), p1)