今天和京东斗智斗勇了一天,终于还是成功了,记录下过程
验证码图片的处理
京东的验证码的完整图实际上只有10张(2019.01.26),我直接把10张图给截出来了,由于PS不过关,我是选的缺口尽量靠右下方的图,然后把滑块移动到缺口处截图。方法基本笨,但基本能行。
效果图如下
验证码原图的匹配
现在手头有10张验证码原图,在登陆验证时,需要把待滑动的图与原图匹配起来,如需要将下面的带缺口的图与上面的图匹配。
这里参考了Pillow实现图片对比
def img_difference(img1, img2):
"""
比较两图片差异
:param img1: 图片1
:param img2: 图片2名称
:return: 差异大小
"""
image1 = img1
image2 = Image.open(img2)
h1 = image1.histogram()
h2 = image2.histogram()
result = math.sqrt(reduce(operator.add, list(map(lambda a, b: (a - b) ** 2, h1, h2))) / len(h1))
return result
def img_match(image):
"""
比较两图片差异
:param image: 带缺口图片
:return: 匹配到的图片名称
"""
image_list = []
for i in range(1, 11):
image_list.append('jd' + str(i) + '.png') # 我将图片命名为jd1.png,jd2.png,…,jd10.png
results = {
}
for img in image_list:
results[img] = self.img_difference(image, img)
image_match = min(results, key=lambda x: results[x])
print(image_match)
return image_match
大概就是先把图像转为影像直方图,计算两张图片亮度累积的像素数量的均方误差,均方误差最小的即为匹配结果。
或者直接一个函数
def img_match(self, image):
"""
比较两图片差异
:param image: 带缺口图片
:return: 匹配到的图片名称
"""
image_list = []
for i in range(1, 11):
image_list.append('jd' + str(i) + '.png')
results = {
}
for img in image_list:
results[img] = self.img_difference(image, img)
image_match = min(results, key=lambda x: results[x])
print(image_match)
return image_match
最最最最恶心的 滑动轨迹
尝试过各种轨迹,基本都失败了,想说不然查一查别人怎么做的,发现也现在(2019.01.26)也都不能用,自己人工拖了几下,发现,把验证码拉过头停顿一会儿再往回拉,竟然都能成功!
def get_track(distance):
"""
根据偏移量获取移动轨迹
这里把距离加长,拉过头
:param distance: 偏移量
:return: 移动轨迹
"""
# 加长距离,拉过头
distance += 6
# 移动轨迹
track = []
# 当前位移
current = 0
# 变速阈值
if distance > 100:
mid1 = distance * 1 / 3
mid2 = distance * 7 / 8
else:
mid1 = distance * 1 / 2
mid2 = distance * 5 / 6
# 间隔时间
t = 0.3
# 初速度
v = 3
while current < distance:
if current < mid1:
a = random.uniform(3, 5)