Geetest 图片验证码
概述
Geetest 是中国和亚洲国家流行的验证码系统,使用拼图拖动和图像识别等交互式挑战。我们提供在浏览器、模拟器和手机农场上解决所有类型的 Geetest 图片(Geetest v3、Geetest v4 等)的服务。
🧩
本文档指导您处理需要用户按顺序识别和点击背景图片上的对象的 Geetest 验证码。对于拖动类型验证码,请遵循 Tiktok 验证码 拖动类型的说明。

1. 创建任务
图片提交格式
分离图标图片和背景图片,如下所示

请求
POST https://api.achicaptcha.com/createTask
参数
| 参数名称 | 数据类型 | 是否必需 | 描述 |
|---|---|---|---|
clientKey | string | 是 | API密钥 |
task.type | string | 是 | GeetestImageCaptchaTask |
task.image | string | 是 | 遵循原则的base64图片列表:icon_1|icon_2|...|icon_n|background(用|分隔的Base64字符串) |
task.subType | int | 是 | 验证码类型:7:按顺序选择对象 |
请求示例
POST /createTask HTTP/1.1
Host: api.achicaptcha.com
Content-Type: application/json
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "GeetestImageCaptchaTask",
"image": "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT...|/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT...|/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT...",
"subType": 7
}
}注意:image 参数必须是图标和背景图片的base64字符串,用 | 分隔。顺序:icon_1|icon_2|icon_3|...|background
响应
成功时,服务器返回 errorId = 0 和 taskId
{
"errorId": 0,
"taskId": "f2fc70d6-c76b-4fba-9480-205ac1fe9fb9"
}2. 获取结果
请求
POST https://api.achicaptcha.com/getTaskResult
参数
| 参数名称 | 数据类型 | 是否必需 | 描述 |
|---|---|---|---|
clientKey | string | 是 | API密钥 |
taskId | string | 是 | 从(1)获取的TaskId |
请求示例
POST /getTaskResult HTTP/1.1
Host: api.achicaptcha.com
Content-Type: application/json
{
"clientKey": "YOUR_API_KEY",
"taskId": "f2fc70d6-c76b-4fba-9480-205ac1fe9fb9"
}响应
{
"errorId": 0,
"status": "ready",
"solution": "x1,y1,x2,y2,x3,y3"
}状态说明
errorId = 0且status = ready:成功解决,在solution中读取结果errorId = 1且status = processing:正在解决验证码,等待1-2秒后重试errorId不是0和1:系统错误,返回错误代码和描述
结果含义
solution:返回要在验证码上点击的坐标,格式x1,y1,x2,y2,x3,y3,...- 每对 (x, y) 表示要在背景图片上点击的像素坐标
- 点击顺序对应显示图标的顺序
集成示例
import requests
import time
def solve_geetest_image(base64_images, sub_type=7, api_key='YOUR_API_KEY'):
# base64_images: "icon1|icon2|icon3|background" - 用|分隔的base64字符串
# 步骤1:创建任务
create_task_url = 'https://api.achicaptcha.com/createTask'
create_task_payload = {
'clientKey': api_key,
'task': {
'type': 'GeetestImageCaptchaTask',
'image': base64_images,
'subType': sub_type
}
}
response = requests.post(create_task_url, json=create_task_payload)
result = response.json()
if result['errorId'] != 0:
raise Exception(result['errorDescription'])
task_id = result['taskId']
# 步骤2:获取结果
get_result_url = 'https://api.achicaptcha.com/getTaskResult'
while True:
time.sleep(2) # 等待2秒
get_result_payload = {
'clientKey': api_key,
'taskId': task_id
}
response = requests.post(get_result_url, json=get_result_payload)
result = response.json()
if result['errorId'] not in [0, 1]:
raise Exception(result['errorDescription'])
if result['status'] == 'ready':
return result['solution'] # "x1,y1,x2,y2,x3,y3"
# 如果 status == 'processing',继续循环
# 使用方法
# 假设您有base64图片
icon1_base64 = '/9j/4AAQSkZJRgABAQEASABIAAD...'
icon2_base64 = '/9j/4AAQSkZJRgABAQEASABIAAD...'
icon3_base64 = '/9j/4AAQSkZJRgABAQEASABIAAD...'
background_base64 = '/9j/4AAQSkZJRgABAQEASABIAAD...'
base64_images = f'{icon1_base64}|{icon2_base64}|{icon3_base64}|{background_base64}'
solution = solve_geetest_image(base64_images, 7, 'YOUR_API_KEY')
print('Geetest坐标:', solution) # "x1,y1,x2,y2,x3,y3"
# 解析坐标并使用
coords = [int(c) for c in solution.split(',')]
for i in range(0, len(coords), 2):
x, y = coords[i], coords[i + 1]
print(f'点击坐标 ({x}, {y})')
# 在坐标 (x, y) 处执行点击常见错误代码
| 错误代码 | 描述 | 备注 |
|---|---|---|
| 0 | 成功 | 成功 |
| 1 | 处理中 | 处理中 |
| 2 | 缺少必填字段 | 缺少必填字段,请再次检查参数 |
| 3 | 不支持的任务 | 不支持的任务类型 |
| 4 | 任务创建失败 | 任务创建失败 |
| 5 | 客户端密钥不存在 | API密钥不存在,请再次检查API密钥 |
| 6 | 账户余额不足 | 账户余额不足,请充值 |
| 7 | 任务失败,请创建新任务 | 任务失败,请创建新任务 |
| 8 | 任务ID不存在 | 任务ID不存在 |
最佳实践
为了在使用Achicaptcha API处理Geetest图片时获得最佳结果,请遵循以下原则:
1. 以正确格式准备图片
- 所有图片必须编码为base64
- 图片顺序:
icon_1|icon_2|...|icon_n|background - Base64图片用
|字符分隔 - 确保背景图片是字符串中的最后一个
2. 正确使用结果
- 返回的结果是坐标字符串:
x1,y1,x2,y2,x3,y3,... - 每对 (x, y) 是背景图片上的像素坐标
- 点击顺序对应显示图标的顺序
- 在坐标处精确点击以完成验证码
3. 轮询间隔
- 在结果检查之间至少等待1-2秒
- 不要用过多连续请求轰炸API
- 设置超时以避免无限循环(建议60秒)
4. 错误处理
- 检查
errorId = 1以获取处理状态 - 对临时错误(errorId = 6, 7)重试
- 如果当前任务失败,创建新任务
- 限制最大重试次数
5. API密钥安全
- 不要在代码中硬编码API密钥
- 使用环境变量
- 不要在客户端暴露API密钥
- 从后端/服务器进行API调用
有用的链接: