看了几个破解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.pyimport 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.textreturn 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.textreturn 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])