看了几个破解Geetest 四代滑块的视频和文章,有点望而生畏,github上也有收集极验四代滑块所有图片后经过ai训练做的破解代码,但作者说成功率只有90%。
于是考虑通过python透传的方法,j就是对自动化脚本套个【网页界面】的壳,把滑块验证放在壳上(网页),验证过程还是由真人去完成,这就需要让python端作为代理,分别转发/load 和 /verify的请求和响应了。
浏览器前端 (Web SDK)
↓ (1) /load: GET 请求 / JSONP响应
↓ (3) /verify GET 请求 / JSONP响应
Python 代理服务器 (Flask/Django)
↓ (2) 转换成Androdi SDK格式,模拟 Android SDK → 发真实 /load
↓ (4) 转换成Androdi SDK格式,模拟 Android SDK → 发真实 /verify
GeeTest 服务器
如果都是web sdk的话,就不需要转换格式,直接转发即可。
django_geetest_proxy/
├── manage.py
├── project/ # Django 项目目录
│ ├── settings.py
│ ├── urls.py
└── geetest_app/ # 核心应用
├── views.py
├── static/ # 静态文件目录
│ └── js/
│ └── gt4.js # 下载 GeeTest v4 SDK 脚本放这里
└── templates/
└── index.html
# views.py
import re
import requests
from django.http import HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
# 渲染首页
def index(request):
CAPTCHA_ID = 'xxxxxxxxxxxxxxxxxx'
context = { 'captcha_id': CAPTCHA_ID,}
return render(request, 'index.html', context)
# 代理 /load
def geetest_load(request):
url = 'https://gcaptcha4.geetest.com/load'
params = request.GET.dict()
headers = {
# 直接复制抓包的headers
}
resp = requests.get(url, params=params, headers=headers, verify=False)
text = resp.text
return HttpResponse(text, content_type="text/javascript") #JSONP 必须content_type="text/javascript"
# 代理 /verify
@csrf_exempt
def geetest_verify(request):
url = 'https://gcaptcha4.geetest.com/verify'
params = request.GET.dict()
headers = {
# 直接复制抓包的headers
}
resp = requests.get(url, params=params, headers=headers, verify=False)
text = resp.text
return HttpResponse(text, content_type="text/javascript")
前端:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>GeeTest Android-Proxy Demo</title>
<!-- 引入极验 Web SDK(v4) -->
{% load static %}
<script src="{% static 'js/gt4.js' %}"></script>
</head>
<body>
<button id="geetest-btn">点击验证 (Android 代理)</button>
<div id="captcha-container"></div>
<script>
const CAPTCHA_ID = '{{ captcha_id }}';
document.getElementById('geetest-btn').addEventListener('click', () => {
initGeetest4({
captchaId: CAPTCHA_ID,
product: 'popup',
protocol: window.location.protocol + '//',
language: 'en',
apiServers: [window.location.host]
}, function (captchaObj) {
captchaObj.appendTo('#captcha-container');
captchaObj.onReady(function () {
// 验证器加载完成
});
captchaObj.onSuccess(function () {
const result = captchaObj.getValidate();
alert('验证成功: ' + JSON.stringify(result));
});
});
});
</script>
</body>
</html>
urlpatterns = [
path('', views.index, name='index'),
path('load', views.geetest_load, name='geetest_load'),
path('verify', views.geetest_verify, name='geetest_verify'),
]
if settings.DEBUG:# 如果gt4.js放在本地的话,需加上这句
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATICFILES_DIRS[0])