一、网站http://www.gsxt.gov.cn滑动验证码概述
二、极验验证码破解-抓包分析
三、极验验证码破解-搭建本地验证码服务
四、极验验证码破解-分析geetest.js,得到所需参数
五、极验验证码破解-Track的获取
六、极验验证码破解-获取背景图片及缺口距离d的计算
七、极验验证码破解-总结
参考文献
运行截图
为了方便统计,我按个位数将Track存放在10个文件中。
我们将所有的Track整合为dict(t_dict.pkl),格式如下:
{k1:v1},其中k1为缺口位置,v1为Track(字符串形式)。
至此我们得到Track备用列表,我们可以根据实际的缺口位置获得相应的Track值,下一节我们将会讲解如何得到缺口距离验证码左边的相对距离d。
可以发现图片已经乱码,这是因为返回的图片是局部重合产生的。
查看验证码图片的审查元素:
可以发现,展示的图片是从原始乱码图片中多次截取小段,合成而成的。具体的合成方式如background-position所示。
如background-position:-157px,-58px。则该小段图片为源乱码图片的(157,58,157+10,58+58)。根据上述分析,我么可以还原bg和fullbg的非乱码图片(即所看见的背景图片)。
我们通过比较两张图片的像素值,即可得到缺口的位置,缺口左上角横坐标的值即为d。我们封装了get_dist函数如下:
# 计算缺口距离
def get_dist(image1,image2):
# 合并图片使用
location_list=cPickle.load(open('location_list.pkl'))
jpgfile1=cStringIO.StringIO(urllib2.urlopen(image1).read())
new_image1=get_merge_image(jpgfile1,location_list)
new_image1.save('image1.jpg')
jpgfile2=cStringIO.StringIO(urllib2.urlopen(image2).read())
new_image2=get_merge_image(jpgfile2,location_list)
new_image2.save('image2.jpg')
i=0
for i in range(260):
for j in range(116):
if is_similar(new_image1,new_image2,i,j)==False:
# 找到缺口 返回缺口的横坐标i
# 因为图片是水平移动 所以不需要缺口的纵坐标
return i
函数其它细节请参见项目源码。