GeeTest · Live demo

GeeTest v3 Demo

The slide-to-fit puzzle challenge from GeeTest.

  • Free, no signup
  • The real provider widget
  • See the verification response

Live GeeTest v3 widget

Click the bar, then slide the puzzle piece into place. It verifies as soon as GeeTest returns the challenge, validate and seccode values.

How to Solve GeeTest v3

The box above is a live GeeTest v3 challenge, the slide-to-fit puzzle. This page shows three easy ways to solve GeeTest v3 and get the three values it returns, geetest_challenge, geetest_validate and geetest_seccode: automatically with the CapSkip browser extension, in your own code with the CapSkip SDK, or by routing the captcha service your tools already call to CapSkip. CapSkip runs locally on your device, so there are no per solve fees and nothing leaves your machine.

No code needed

Option 1: Solve GeeTest v3 with the browser extension

The simplest way to bypass GeeTest v3 is the CapSkip captcha solver extension for Chrome and Firefox. It finds the gap in the puzzle, drags the piece into place with a human-like motion and hands the site a valid seccode, with no code to write.

1

Install the extension

Add CapSkip from the Chrome Web Store or Firefox Add-ons. It also works in Brave, Edge, Opera and Vivaldi.

2

Run the CapSkip app

Install and open the CapSkip desktop app. It does the solving on your own device and pairs with the extension.

3

It solves automatically

Reload this page and CapSkip slides the puzzle piece into the gap for you. Prefer to stay in control? Switch to manual mode anytime.

For developers

Option 2: Solve GeeTest v3 with the CapSkip SDK

Building automation, a scraper or a bot? Use the CapSkip captcha solving SDK to solve GeeTest v3 from Python, Node.js, PHP or C#. You pass this page's gt, a fresh challenge and the page URL, and CapSkip returns the solved challenge, validate and seccode values you can submit like a real one.

Captcha ID (gt)
e3a600a044ef0ad51749da5c451adca0
Page URL
https://capskip.com/captcha-demo/geetest-v3/

Before you start

CapSkip solves locally. Download and run the CapSkip desktop app and keep it open in the background. The SDK talks to it on 127.0.0.1:8080, so there are no cloud calls and no per solve fees.

The challenge expires

Unlike a reCAPTCHA site key, GeeTest v3 needs two values. The gt above is static and never changes, but the challenge is single use and dies after about a minute, and it is burned the moment the widget loads it. Fetch a fresh one immediately before every solve, which is exactly what step 2 does.

1

Install the SDK

Add the official CapSkip client to your project.

pip install capskip
npm install capskip
composer require capskip/capskip
dotnet add package CapSkip
2

Get a fresh gt and challenge

This page registers its GeeTest challenge server side and prints the nonce it needs in an inline capskipCaptcha object. Read that, then ask the page for a challenge of your own so the one the widget is using stays untouched.

import json, re, requests

PAGE = "https://capskip.com/captcha-demo/geetest-v3/"
AJAX = "https://capskip.com/wp-admin/admin-ajax.php"

session = requests.Session()
html = session.get(PAGE).text

# The page prints its ajax nonce and page id in an inline capskipCaptcha object
cfg = json.loads(re.search(r"capskipCaptcha\s*=\s*(\{.*\});", html).group(1))

# Register a fresh challenge (single use, expires in about a minute)
data = session.post(AJAX, data={
    "action": "capskip_geetest_register",
    "nonce": cfg["nonce"],
    "post_id": cfg["postId"],
}).json()["data"]

gt, challenge = data["gt"], data["challenge"]
print(gt, challenge)
const PAGE = 'https://capskip.com/captcha-demo/geetest-v3/';
const AJAX = 'https://capskip.com/wp-admin/admin-ajax.php';

const html = await (await fetch(PAGE)).text();

// The page prints its ajax nonce and page id in an inline capskipCaptcha object
const cfg = JSON.parse(html.match(/capskipCaptcha\s*=\s*(\{.*\});/)[1]);

// Register a fresh challenge (single use, expires in about a minute)
const res = await fetch(AJAX, {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    action: 'capskip_geetest_register',
    nonce: cfg.nonce,
    post_id: cfg.postId,
  }),
});

const { gt, challenge } = (await res.json()).data;
console.log(gt, challenge);
<?php
$page = 'https://capskip.com/captcha-demo/geetest-v3/';
$ajax = 'https://capskip.com/wp-admin/admin-ajax.php';

$html = file_get_contents($page);

// The page prints its ajax nonce and page id in an inline capskipCaptcha object
preg_match('/capskipCaptcha\s*=\s*(\{.*\});/', $html, $m);
$cfg = json_decode($m[1], true);

// Register a fresh challenge (single use, expires in about a minute)
$res = file_get_contents($ajax, false, stream_context_create([
    'http' => [
        'method'  => 'POST',
        'header'  => 'Content-Type: application/x-www-form-urlencoded',
        'content' => http_build_query([
            'action'  => 'capskip_geetest_register',
            'nonce'   => $cfg['nonce'],
            'post_id' => $cfg['postId'],
        ]),
    ],
]));

$data = json_decode($res, true)['data'];
$gt = $data['gt'];
$challenge = $data['challenge'];
echo $gt, ' ', $challenge;
using System.Text.Json.Nodes;
using System.Text.RegularExpressions;

const string Page = "https://capskip.com/captcha-demo/geetest-v3/";
const string Ajax = "https://capskip.com/wp-admin/admin-ajax.php";

var http = new HttpClient();
var html = await http.GetStringAsync(Page);

// The page prints its ajax nonce and page id in an inline capskipCaptcha object
var cfg = JsonNode.Parse(Regex.Match(html, @"capskipCaptcha\s*=\s*(\{.*\});").Groups[1].Value)!;

// Register a fresh challenge (single use, expires in about a minute)
var form = new FormUrlEncodedContent(new Dictionary<string, string> {
    ["action"] = "capskip_geetest_register",
    ["nonce"] = cfg["nonce"]!.ToString(),
    ["post_id"] = cfg["postId"]!.ToString(),
});
var res = await http.PostAsync(Ajax, form);
var data = JsonNode.Parse(await res.Content.ReadAsStringAsync())!["data"]!;

string gt = data["gt"]!.ToString();
string challenge = data["challenge"]!.ToString();
Console.WriteLine($"{gt} {challenge}");

You get the page's gt plus a fresh 32 character challenge. Solve it right away.

3

Solve GeeTest v3 and get the three values

Pass the gt, the challenge you just registered and this page's url to geetest(). CapSkip drags the puzzle piece into the gap and returns the solved triplet.

from capskip import CapSkip

# Connect to the CapSkip app running on your machine
solver = CapSkip(host="127.0.0.1", port=8080)

# Solve the GeeTest v3 slider on this page
result = solver.geetest(
    gt=gt,
    challenge=challenge,
    url="https://capskip.com/captcha-demo/geetest-v3/",
)

print(result["challenge"])   # geetest_challenge
print(result["validate"])    # geetest_validate
print(result["seccode"])     # geetest_seccode
const { CapSkip } = require('capskip');

// Connect to the CapSkip app running on your machine
const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });

// Solve the GeeTest v3 slider on this page
const result = await solver.geetest(
  gt,
  challenge,
  'https://capskip.com/captcha-demo/geetest-v3/',
);

console.log(result.challenge); // geetest_challenge
console.log(result.validate);  // geetest_validate
console.log(result.seccode);   // geetest_seccode
<?php
require 'vendor/autoload.php';

use CapSkip\CapSkip;

// Connect to the CapSkip app running on your machine
$solver = new CapSkip(['host' => '127.0.0.1', 'port' => 8080]);

// Solve the GeeTest v3 slider on this page
$result = $solver->geetest(
    $gt,
    $challenge,
    'https://capskip.com/captcha-demo/geetest-v3/'
);

echo $result['challenge'];  // geetest_challenge
echo $result['validate'];   // geetest_validate
echo $result['seccode'];    // geetest_seccode
using CapSkip;

// Connect to the CapSkip app running on your machine
var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);

// Solve the GeeTest v3 slider on this page
var result = await solver.GeetestAsync(
    gt,
    challenge,
    "https://capskip.com/captcha-demo/geetest-v3/");

Console.WriteLine(result.Challenge);  // geetest_challenge
Console.WriteLine(result.Validate);   // geetest_validate
Console.WriteLine(result.Seccode);    // geetest_seccode

You get challenge, validate and seccode, ready to submit.

4

Use the three values

Post the triplet back under the names the widget itself uses. On this page that is the same admin-ajax call the Check step makes, which verifies the seccode against GeeTest before it turns green.

// The three values GeeTest returns, exactly as the widget produces them
const payload = {
  geetest_challenge: result.challenge,
  geetest_validate:  result.validate,
  geetest_seccode:   result.seccode,
};

// Send them to whatever endpoint the site verifies with, then submit the form.
// This demo posts challenge, validate and seccode to admin-ajax.php with
// action=capskip_captcha_verify and provider=geetest_v3.
Advanced

Using CapSkip on other GeeTest v3 sites

To solve GeeTest v3 anywhere you need three things from the page:

  • gt: the public captcha ID, static per site. It is the gt query parameter on the widget's calls to api.geetest.com/gettype.php and get.php.
  • challenge: a single-use value that comes from the site's own init or register request, usually a small JSON response next to the gt. Replay that one request before every solve to get a fresh challenge.
  • Page URL: the full address of the page.

Regional API servers and proxies

Some sites are pinned to a regional GeeTest endpoint such as api-na.geetest.com. Pass it as api_server on the HTTP API when that is the case. A proxy (proxy and proxytype) is also supported, which helps when the site ties the challenge to your IP.

result = solver.geetest(
    gt="GT_FROM_PAGE",
    challenge="FRESH_CHALLENGE",   # register a new one right before every solve
    url="https://example.com/login",
)

challenge = result["challenge"]   # geetest_challenge
validate = result["validate"]     # geetest_validate
seccode = result["seccode"]       # geetest_seccode
const result = await solver.geetest(
  'GT_FROM_PAGE',
  'FRESH_CHALLENGE',   // register a new one right before every solve
  'https://example.com/login',
);

const { challenge, validate, seccode } = result;
$result = $solver->geetest(
    'GT_FROM_PAGE',
    'FRESH_CHALLENGE',   // register a new one right before every solve
    'https://example.com/login'
);

$challenge = $result['challenge'];  // geetest_challenge
$validate = $result['validate'];    // geetest_validate
$seccode = $result['seccode'];      // geetest_seccode
var result = await solver.GeetestAsync(
    "GT_FROM_PAGE",
    "FRESH_CHALLENGE",   // register a new one right before every solve
    "https://example.com/login");

string challenge = result.Challenge;  // geetest_challenge
string validate = result.Validate;    // geetest_validate
string seccode = result.Seccode;      // geetest_seccode

If a solve comes back rejected, the usual cause is a stale challenge: it was already used by the page or it sat unused for more than a minute.

Not using Python, Node.js, PHP or C#? The SDKs are just wrappers over the CapSkip HTTP API (the standard in.php / res.php endpoints with method=geetest), so you can solve GeeTest v3 from any language, framework or tool. See the GeeTest v3 API reference.

No code changes

Option 3: Send your existing solver-service code to CapSkip

Already solving GeeTest v3 through a pay-per-captcha service such as 2Captcha, Anti-Captcha or CapMonster? You do not have to rewrite a line. The CapSkip app includes a service emulator that speaks those services' own APIs locally: pick the service you use, click Add to hosts file, and every request your bot, scraper or off-the-shelf tool already sends to it is answered by CapSkip on your own machine, for a flat price instead of a per-solve bill.

1

Pick your service

Open the CapSkip app and choose the service your code already talks to: 2Captcha, RuCaptcha, Anti-Captcha, CapMonster Cloud, CapSolver, DeathByCaptcha, SolveCaptcha or Captchas.io.

2

Add to hosts file

One click in the app points that service's domain at CapSkip, so the calls your tool makes are answered on your own machine instead of going out to a paid API.

3

Run your tool unchanged

Same API key, same request, same polling loop. CapSkip replies in that service's own format and your code gets the solved challenge, validate and seccode values back.

Nothing below changes when you switch. It is the same call your code makes today, except that GeeTest v3 is now solved locally and the solved challenge, validate and seccode values comes back from CapSkip:

POST https://2captcha.com/in.php
     key=YOUR_EXISTING_API_KEY
     method=geetest
     gt=e3a600a044ef0ad51749da5c451adca0
     challenge=FRESH_CHALLENGE_FROM_THE_PAGE
     pageurl=https://capskip.com/captcha-demo/geetest-v3/

GET  https://2captcha.com/res.php?key=YOUR_EXISTING_API_KEY&action=get&id=2122988149
     {"geetest_challenge":"…","geetest_validate":"…","geetest_seccode":"…"}

Client libraries work the same way: an Anti-Captcha style createTask / getTaskResult pair, or any wrapper built on one of these services, keeps working once the emulator is on. The full request and response reference lives in the CapSkip API docs.

About this GeeTest v3 demo

This page is a live GeeTest v3 demo where you can test how the slide-to-fit puzzle works and watch it get solved in real time. GeeTest v3 is the slider captcha you meet on login and signup forms worldwide: a piece is cut out of a picture and you drag it back into the gap. Solve it and GeeTest hands back three values, geetest_challenge, geetest_validate and geetest_seccode, which your server checks against GeeTest before it trusts the request.

Developers, testers and automation engineers can use this GeeTest v3 test page to watch the challenge register, the slider fire and the triplet come back, and to benchmark how CapSkip solves GeeTest v3. Whether you need to solve GeeTest once or automate thousands of solves, CapSkip is a GeeTest solver that works three ways: the no-code captcha solver extension for Chrome and Firefox, and the captcha solving SDK for Python, Node.js, PHP and C#, and drop-in emulation of the captcha services you may be paying per solve today, all with unlimited solving on one flat price. All three are driven by the same desktop AI captcha solver, installed once and running on your own machine, so nothing is queued on a remote server and nothing is billed per solve.

Can I keep my existing 2Captcha or Anti-Captcha code?
Yes. The CapSkip app emulates the APIs of 2Captcha, RuCaptcha, Anti-Captcha, CapMonster Cloud, CapSolver, DeathByCaptcha and SolveCaptcha. Pick your service in the app, click "Add to hosts file", and the requests your code already sends are solved locally by CapSkip, with no code changes and no per-solve fee.
How do I solve GeeTest v3?
Install the CapSkip extension or the SDK, run the CapSkip desktop app, and CapSkip returns a valid challenge, validate and seccode for the gt and challenge you pass it. The extension slides the puzzle piece for you in the page, while the SDK lets you solve GeeTest v3 from your own code.
Can GeeTest v3 be bypassed?
Yes. CapSkip is a GeeTest v3 solver that works out where the gap is, drags the piece into it, and hands you the geetest_challenge, geetest_validate and geetest_seccode triplet you can submit like a real user.
Why do I need a new challenge for every solve?
GeeTest v3 splits its parameters in two. The gt is a static site identifier, but the challenge is single use and expires in about a minute, and loading the widget consumes it. Register a fresh challenge immediately before each solve, exactly as step 2 above does, or GeeTest will reject the answer.
How fast does CapSkip solve GeeTest v3?
CapSkip usually returns a GeeTest v3 triplet within a few seconds. Every solve runs locally on your own device, so nothing is queued on a remote server, which matters here because the challenge expires quickly.
Can I use CapSkip with other programming languages?
Yes. Beyond the Python, Node.js, PHP and C# SDKs, CapSkip exposes a standard HTTP API, so you can solve GeeTest v3 from any language, framework or tool. See the GeeTest v3 API reference.
Is CapSkip a free GeeTest solver?
The extension is free to install, and a one dollar trial gives you full access for seven days with 1,000 solves. Paid licenses unlock unlimited solving at one flat price, with no per captcha fees.