极验验证是一种在计算机领域用于区分自然人和机器人的,通过简单集成的方式,为开发者提供安全、便捷的云端验证服务(又是滑动验证码)。与以往传统验证码不同的是,极验通过分析用户完成拼图过程中的行为特征,通过数据分析来判断是人还是机器。用户不必面对眼花缭乱的英文字符或汉字,整个验证过程变的像游戏一样有趣。
但是对于爬虫攻城狮来说,这就一点也不有趣了T_T。下面来实例看一下什么是极验验证码。
这个就是某网站的滑动验证码,当鼠标点击滑动的按钮的时候,图片上会随机的出现一个滑块缺口的位置,你需要将滑块移动至缺口处,例如像这样:
这样的验证码只能人工解决吗,答案是未必的。如今深度学习技术应用很广,我们当然可以使用深度学习来解决这个问题,我们只需对大量的样本数据进行数据标注,即将滑块的位置标注,用目标识别的模型,预测出滑块位置,最后通过轨迹方程,从而通过滑块验证。你可以自己搭建模型或者github上克隆别人的目标识别模型代码,但通常项目作者与自己所使用的库版本不兼容,或者什么劈里啪啦的原因,导致使用的时候会报错(本人在学习yoloV3的时候深有体会…)。如果你想快速的开发上线功能的话,报错、准确率不高的情况就比较愁人。
但是我们也有更加快的方法,就是利用服务商的代码服务,从而通过极验。
下面给出他们家的网址:https://2captcha.com/2captcha-api#solving_geetest
我们应该怎么使用别人的接口解决问题呢。我们先通过注册账号,然后能发现其实geetest(极验)的价格也比较公道。让我们打开api看看。
我们以***查为例子,打开f12,使用全局搜索模式搜索一下initGeetest这个函数
发现果然有这个的定义。
根据官网的提示,gt是静态值, challenge是动态值(每次的验证码的值都是不一样的),那么我们打上断点看看。
然后我们就拿到的两个参数,下面我们打上敲上代码,向服务商发送我们的数据。请求url: https://2captcha.com/in.php?
from requests import request
from urllib.parse import urlencode
from json import loads
url = 'https://2captcha.com/in.php?'
params = {
'key': 'c*********************a48', # 服务的密钥
'method': 'geetest', # 直接赋值
'gt': "b6cc0fc51ec7995d8fd3c637af690de3",
'challenge': "cd7f0ca9109b6ffeb26a79cf0206fbb9",
'pageurl': 'https://*******.com/login',
'json': 1 # 返回json形式的数据
}
response = request(method='get', url=url+urlencode(params)).text
result = loads(response)
print(result)
{'status': 1, 'request': '62987873476'}
果然我们成功的拿到的数据。下面我们根据request再次向服务器拿到相应,请求地址现在为:https://2captcha.com/res.php?
url = 'https://2captcha.com/res.php'
params = {
'key': 'c********************8',
'action': 'get',
'id': result['request']
}
response = request(method='get', url=url+urlencode(params)).text
result = loads(response)
print(result)
{
"challenge":"a789356b693da2fa46439473d82d1ef7d1",
"validate":"f02210e64349c3174e0cfe08cf477fcb",
"seccode":"3ea1c81f59e31de064b93a4dfc4d27c8|jordan"
}
再次的,我们又拿到的返回的数据,那我们应该怎么使用这些数据呢???
我们通过全局搜索再次发现,原来极验是通过拿到这3个值后将数据post给这个网址的,所以我们也可以构造一下这个form
url = 'https://****/verify/sms.json?'
params = {
'phone': '***********',
'type': 'login',
'funtype': '***'
"challenge":"a789356b693da2fa46439473d82d1ef7d1",
"validate":"f02210e64349c3174e0cfe08cf477fcb",
"seccode":"3ea1c81f59e31de064b93a4dfc4d27c8|jordan"
}
response = request(method='post', url=url, data=params)
最后我们刷新一下发现,我们就通过了验证了。原来别人的产品是真的不错。
最后,我在这里说一下,对于开发周期太短,技术实现太复杂的情况我推荐用服务商的接口,因为如果花太多时间在绕过验证码这方面,还不如优化一下代码,使得代码运行速度更快、鲁棒性更强,(另外实在不行的情况下我们也可以让功能先上线再说…技术的东西慢慢不上),毕竟攻城狮能合理调配资源解决问题也是好攻城狮;
如果大家对深度学习感兴趣,特别是计算机视觉方面的,也可以与我交流一起学习(ps:我是深度学习小白)