某网站验证码绕过详解
一、通过抓包找到验证码图片的链接
二、发现找到的图片和合展示的图片不一样,链接地址的图片是乱序,需要我们重新拼接
三、继续往上找,找到该图片链接的来源,发现在一个叫slidecode请求包的响应内容里面
四、代码实现获取图片链接地址
import requests
import re
#通过该地址获取验证码图片的地址
url = 'https://XXXXX.com/authcode/slidecode' # 替换为你要请求的URL
headers = {'User-Agent': 'Mozilla/5.0'} # 可选,设置请求头
response = requests.get(url, headers=headers) # 发送GET请求
响应内容 = response.text#获取网页的响应内容
正则 = re.compile(r'url\(([^\)]+)\)')
匹配结果 = 正则.findall(响应内容)#通过正则匹配获取图片的链接
print(匹配结果[0]) # 输出响应数据
print("整理后的结果:"+'http:'+匹配结果[0].replace('"',''))
运行结果:
五、知道图片链接,将图片保存到本地
图片链接='http:'+匹配结果[0].replace('"','')
response = requests.get(图片链接, stream=True)
with open("123.png", 'wb') as f:
f.write(response.content)
六、继续分析上面url的响应内容,发现一大堆类似坐标的东西,猜测这是每个错乱图片的正确位置
七、提取这些坐标
坐标=re.compile("class='gt_cut_fullbg_slice' style='background-position.*?)px (.*?)px",re.S|re.I)
坐标xy=坐标.findall(响应内容)
坐标xy=[[abs(int(xy[0])),abs(int(xy[1]))] for xy in 坐标xy]#将字符串改为数字
print(坐标xy)
运行结果:
[[91, 75], [234, 0], [143, 75], [130, 75], [52, 0], [39, 75], [156, 25], [26, 50], [13, 25], [208, 75], [91, 50], [26, 75], [13, 50], [65, 75], [52, 50], [78, 0], [234, 50], [117, 25], [65, 25], [65, 0], [247, 50], [143, 50], [0, 0], [169, 50], [91, 25], [247, 75], [52, 25], [247, 25], [169, 0], [26, 0], [182, 75], [117, 0], [91, 0], [143, 0], [26, 25], [156, 75], [247, 0], [39, 25], [13, 0], [65, 50], [104, 0], [130, 0], [78, 75], [0, 50], [169, 25], [78, 50], [195, 0], [156, 50], [117, 75], [0, 25], [182, 50], [221, 75], [78, 25], [182, 0], [221, 0], [104, 25], [195, 25], [208, 25], [208, 50], [208, 0], [156, 0], [195, 50], [117, 50], [104, 50], [169, 75], [221, 25], [234, 75], [195, 75], [0, 75], [234, 25], [39, 0], [130, 25], [52, 75], [182, 25], [130, 50], [13, 75], [39, 50], [104, 75], [221, 50], [143, 25]]
八、将图片切割,并按正确顺序放回到原位
打开图片 = Image.open('123.png')
# 将切片保存到列表
图片列表 = []
for p in 坐标xy:
if p[1] == 0: # y的坐标为0,说明在第一行
图片列表.append(打开图片.crop((p[0], 0, p[0] + 13, 25)))
if p[1] == 25: # y的坐标为0,说明在第一行
图片列表.append(打开图片.crop((p[0], 25, p[0] + 13, 50)))
if p[1] == 50: # y的坐标为0,说明在第一行
图片列表.append(打开图片.crop((p[0], 50, p[0] + 13, 75)))
if p[1] == 75: # y的坐标为0,说明在第一行
图片列表.append(打开图片.crop((p[0], 75, p[0] + 13, 100)))
新建图片 = Image.new("RGB", (260, 100))
x = 0
y = 0
for i in 图片列表:
if x == 260: # 从左贴到右了
x = 0
y += 25
新建图片.paste(i, (x, y))
x += 13
新建图片.save("456.png")
|