VK sometimes requires captcha verification during anonymous TURN credential requests — specifically at theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/SpaceNeuroX/proxy-turn-vk-android/llms.txt
Use this file to discover all available pages before exploring further.
calls.getAnonymousToken step. qWDTT handles this transparently with a configurable multi-stage solver chain, minimising interruptions while giving you manual control when needed.
Captcha Modes
Three captcha modes are available. Set the mode in Settings → Captcha mode in the Android app, or pass-captcha-mode <mode> when running the Go client directly.
The captcha mode setting is global — it applies to all profiles and all worker streams simultaneously, not per-profile.
auto (default)
The auto mode runs a full solver chain, exhausting automated methods before asking for user input. The stages run in order each time a captcha is encountered:
Go v2 solver — 2 attempts
The built-in Go captcha solver runs headlessly with no WebView. It fetches the captcha HTML, extracts the
powInput and difficulty constant, solves the proof-of-work challenge (SHA-256 prefix mining), then submits a captchaNotRobot.check request to the VK API with a randomised browser fingerprint and device JSON. Supports both checkbox and slider captcha types. Up to 2 attempts are made, with identity rotation (new browser_fp, User-Agent, and device dimensions) on each attempt.WebView auto — 2 attempts (10s timeout each)
If the Go solver fails, an Android WebView loads the captcha
redirect_uri in automated mode. The WebView locates the “Я не робот” checkbox label (label.vkc__Checkbox-module__Checkbox) via JavaScript, then dispatches a MotionEvent.ACTION_DOWN / ACTION_UP touch sequence at a randomised point within the label element, with randomised pressure and a 80–180 ms hold duration to mimic a real finger. A JS interceptor on window.fetch and XMLHttpRequest captures the success_token from the captchaNotRobot.check response. Each attempt has a 10-second timeout. If a slider captcha is detected instead of a checkbox, the WebView immediately falls back to the next stage.Final Go v2 attempt — 1 attempt
After the two WebView attempts, one additional Go v2 attempt is made. This covers cases where the WebView timed out but the captcha session is still valid.
Manual WebView — 60s timeout
If all automated stages fail, a visible WebView dialog is opened for the user to solve the captcha manually. The dialog has a 60-second timeout. The user solves the challenge in the WebView; the token is extracted by the same JS interceptor and returned to the Go client.
rjs
The rjs mode prefers the Go v2 solver and falls back to WebView auto only when necessary:
- Go v2 solver — 2 attempts (same as
autostage 1). - If rate-limited or the captcha session is exhausted: WebView auto — 1 attempt with a 10-second timeout.
- If Go v2 fails for any other reason: WebView auto — 1 attempt with a 10-second timeout.
rjs mode. If both stages fail, the global 60-second lockout is applied.
wv
The wv mode always routes captchas to a WebView. The WebView opens in selected mode with a 120-second timeout, giving the user ample time to solve the captcha manually. No Go v2 solver is attempted.
Captcha Session Management
Session expiry and profile rotation
When a captcha session is exhausted — indicated by agetCaptcha status error or error_limit in the VK API response — the Go client rotates the captcha browser fingerprint:
rotateCaptchaBrowserFP()is called, updatingcaptcha_browser_fpand regeneratingvk_profile.jsonin the Go client’s working directory.- The
errCaptchaSessionExpiredsentinel is returned to the credential chain. - The credential fetcher discards the current captcha data and re-requests a fresh captcha challenge from VK (a new
calls.getAnonymousTokencall), then retries the solver chain with the new session.
Global lockout
After 3 failed captcha attempts across all stages, the Go client sets a global lockout timestamp. All worker streams check this timestamp before requesting credentials and wait until the lockout expires (60 seconds from the last failure). This is coordinated via anatomic.Int64 shared across all goroutines.
WebView Captcha IPC Protocol
When the Go client needs a WebView to solve a captcha, it communicates with the Android layer over stdio: Go → Android (stdout):<mode>isauto,manual, orselected<redirect_uri>is the VK captcha page URL<session_token>is the VK captcha session token
<success_token>is the token returned by the VKcaptchaNotRobot.checkAPI on success- On timeout or error, the Android layer sends
CAPTCHA_RESULT|error:timeoutorCAPTCHA_RESULT|error:<reason>
CAPTCHA_SOLVE line to avoid token mix-ups between consecutive captcha attempts.