Skip to main content

Documentation 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.

VK sometimes requires captcha verification during anonymous TURN credential requests — specifically at the 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:
1

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.
2

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.
3

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.
4

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.
5

Global lockout — 60 seconds

If all four stages fail, a 60-second global lockout is applied. All worker streams pause credential fetching for 60 seconds before retrying. This prevents VK from rate-limiting the IP further.

rjs

The rjs mode prefers the Go v2 solver and falls back to WebView auto only when necessary:
  1. Go v2 solver — 2 attempts (same as auto stage 1).
  2. If rate-limited or the captcha session is exhausted: WebView auto — 1 attempt with a 10-second timeout.
  3. If Go v2 fails for any other reason: WebView auto — 1 attempt with a 10-second timeout.
No manual WebView is opened in 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 a getCaptcha status error or error_limit in the VK API response — the Go client rotates the captcha browser fingerprint:
  1. rotateCaptchaBrowserFP() is called, updating captcha_browser_fp and regenerating vk_profile.json in the Go client’s working directory.
  2. The errCaptchaSessionExpired sentinel is returned to the credential chain.
  3. The credential fetcher discards the current captcha data and re-requests a fresh captcha challenge from VK (a new calls.getAnonymousToken call), 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 an atomic.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):
CAPTCHA_SOLVE|<mode>|<redirect_uri>|<session_token>
  • <mode> is auto, manual, or selected
  • <redirect_uri> is the VK captcha page URL
  • <session_token> is the VK captcha session token
Android → Go (stdin):
CAPTCHA_RESULT|<success_token>
  • <success_token> is the token returned by the VK captchaNotRobot.check API on success
  • On timeout or error, the Android layer sends CAPTCHA_RESULT|error:timeout or CAPTCHA_RESULT|error:<reason>
The Go client drains any stale result from the channel before emitting each new CAPTCHA_SOLVE line to avoid token mix-ups between consecutive captcha attempts.
If captchas occur frequently during normal operation, try switching VK anon path to vkcalls in Settings — the newer VKCalls API path tends to encounter captchas less often. Adding multiple VK call hashes also helps distribute load and reduces the per-hash request rate.

Build docs developers (and LLMs) love