Как исправить ERROR_KEY_DOES_NOT_EXIST и Wrong User Key

Короткий ответ: ERROR_KEY_DOES_NOT_EXIST означает, что API-ключ в вашем запросе не является ключом, который распознаёт решатель. С капчей, sitekey и URL страницы всё в порядке. Запрос просто не дошёл до этапа решения. В этом руководстве — три реальные причины, исправление во всех четырёх SDK и почему иногда вместо него приходит ERROR_WRONG_USER_KEY , а не первое.
Что означает ERROR_KEY_DOES_NOT_EXIST
Он приходит из /in.php, на этапе отправки, ещё до начала решения. API сравнил параметр key из вашего запроса с ключом, который он настроен принимать, и совпадения не нашёл.
# Submitting with a key the app does not know: curl "http://127.0.0.1:8080/in.php?key=WRONG&method=userrecaptcha&googlekey=YOUR_SITEKEY&pageurl=https://example.com" ERROR_KEY_DOES_NOT_EXIST
Поскольку он возвращается на этапе отправки, вы никогда не получаете captcha ID, а значит, опрашивать на /res.phpнечего. Если ваш код крутится в цикле и ждёт, он ждёт ID, который никогда не был выдан.
Вот что сбивает с толку тех, кто переходит с хостингового сервиса: CapSkip — это 2Captcha-совместимый API, работающий на вашей собственной машине, поэтому ключ здесь не учётные данные аккаунта и не привязан к балансу. Это локальная проверка доступа на API-сервере. Это меняет само значение слов “неверный ключ”, и именно поэтому исправления ниже такие короткие.
Сначала проверьте, включена ли проверка ключа вообще
В CapSkip проверка ключа необязательна. Когда она выключена, подойдёт любая непустая строка и эту ошибку вы не увидите никогда. Когда включена — ключ должен совпадать точно.
Откройте приложение CapSkip, перейдите в Settings и найдите раздел API server. Важны две вещи: включена ли проверка ключа и, если включена, точная строка ключа. Скопируйте ключ с этого экрана, а не набирайте его заново. Большинство обращений по ERROR_KEY_DOES_NOT_EXIST заканчивается на этом.
Раз уж вы в Settings, проверьте заодно и порт. Неверный порт даёт ошибку соединения, а не эту, но проверить оба сразу всё равно стоит. руководство по настройке подробно разбирает весь этот экран.
Правильная передача ключа в каждом SDK
Все четыре SDK используют одно и то же имя опции и читают одну и ту же переменную окружения, CAPSKIP_API_KEY. Задайте её явно на время отладки, чтобы не гадать, что именно отправляется.
# pip install capskip
from capskip import CapSkip
# apiKey defaults to "capskip", which only works when
# key validation is turned off in the app.
solver = CapSkip(
apiKey="YOUR_API_KEY",
host="127.0.0.1",
port=8080,
)// npm install capskip
const { CapSkip } = require('capskip');
const solver = new CapSkip({
apiKey: 'YOUR_API_KEY',
host: '127.0.0.1',
port: 8080,
});// composer require capskip/capskip
use CapSkip\CapSkip;
$solver = new CapSkip([
'apiKey' => 'YOUR_API_KEY',
'host' => '127.0.0.1',
'port' => 8080,
]);// dotnet add package CapSkip
using CapSkip;
var solver = new CapSkipClient(
apiKey: "YOUR_API_KEY",
host: "127.0.0.1",
port: 8080);Полные сигнатуры всех методов — на странице SDK для распознавания капчи .
Три причины, которые стоит проверить
1. Ключ так и не покинул ваш код
Вы задали CAPSKIP_API_KEY в файле .env , но во время выполнения никто не загружает .env . Или вы экспортировали переменную в одной оболочке, а скрипт запустили в другой. SDK откатывается к значению по умолчанию, а оно не равно вашему ключу — отсюда и ошибка.
Выведите то, что собираетесь отправить. Одна строка — и вопрос закрыт:
import os
# Never print the whole key in a shared log.
key = os.environ.get("CAPSKIP_API_KEY", "<unset>")
print(len(key), repr(key[:4]))Вывод длины ловит случай, который скрывает маскировка: ключ есть, но пустой, или в конце у него перевод строки, например от cat key.txt.
2. Ключ верный, но искажён в URL
Это бьёт только по тем, кто вызывает сырой API. Если ключ содержит символы, имеющие особое значение в строке запроса, их нужно закодировать процентами. Символ + превращается в пробел, & обрывает параметр раньше времени, а # отсекает всё, что идёт после него.
# Wrong: curl sends this raw and the key gets cut at the & curl "http://127.0.0.1:8080/in.php?key=ab&cd&method=userrecaptcha" # Right: let curl encode the parameter for you curl -G http://127.0.0.1:8080/in.php \ --data-urlencode "key=ab&cd" \ --data-urlencode "method=userrecaptcha"
Либо отправьте параметры POST-запросом в теле формы — это обходит весь класс проблемы целиком. У MDN есть короткая справка по процентному кодированию , если нужен точный список символов. SDK кодируют за вас, так что эта причина исчезает в тот момент, когда вы переходите на SDK.
3. Вы сменили ключ, но что-то всё ещё держит старый
Долгоживущий worker, Docker-контейнер, собранный с зашитым ключом, секрет в CI, отдельно настроенное браузерное расширение. В приложении уже новый ключ, а один вызывающий всё ещё держит старый — и падает только он. Если часть ваших запросов проходит, а часть нет, почти всегда дело именно в этом.
ERROR_KEY_DOES_NOT_EXIST vs ERROR_WRONG_USER_KEY
Две строки ошибок, одно семейство. Относитесь к ним как к одной проблеме в двух формах.
| Ошибка | На что указывает | Что проверить первым |
|---|---|---|
ERROR_KEY_DOES_NOT_EXIST | Ключ был прочитан и не совпал ни с одним известным ключом | Саму строку ключа, скопированную из Settings |
ERROR_WRONG_USER_KEY | Проверка ключа включена, а отправленный ключ неверен | Сначала — включена ли проверка вообще, затем саму строку |
В SDK оба проявляются как ApiException, поэтому ловите именно этот тип и читайте сообщение, а не ветвитесь по строке.
from capskip import CapSkip, ApiException, NetworkException
solver = CapSkip(apiKey="YOUR_API_KEY")
try:
result = solver.recaptcha(
sitekey="YOUR_SITEKEY",
url="https://example.com/page-with-recaptcha",
)
except ApiException as e:
# Key problems land here, with the raw code in the message.
print("api rejected the request:", e)
except NetworkException as e:
# The app is not running, or the port is wrong.
print("cannot reach capskip:", e)Соседние коды ошибок
Если с ключом всё в порядке, следующие несколько сбоев на этапе отправки выглядят похоже, но означают совсем другое.
| Код | Причина | Исправить |
|---|---|---|
ERROR_WRONG_METHOD | The method — параметр отсутствует или написан с ошибкой | Использовать userrecaptcha, turnstile, geetest, post или base64 |
ERROR_BAD_PARAMETERS | Обязательный параметр для этого метода отсутствует | Сверьтесь со списком параметров метода перед повторной отправкой |
ERROR_GOOGLEKEY | sitekey отклонён | Считайте его заново с «живой» страницы, а не из кешированного источника |
ERROR_PAGEURL | URL страницы отсутствует или составлен неверно | Отправляйте полный URL вместе со схемой |
| Connection refused | Приложение не запущено или порт отличается | Запустите CapSkip, убедитесь, что API server включён |
Каждый код, который может вернуть API, перечислен в Документация по API.
Часто задаваемые вопросы
Нужен ли мне API-ключ вообще?
Только если в приложении включена проверка ключа. Когда она выключена, принимается любая непустая строка, и значение SDK по умолчанию capskip работает нормально. Ключ — это локальная проверка доступа, а не аккаунт.
Может ли ERROR_KEY_DOES_NOT_EXIST означать, что у меня закончились средства?
Нет. Здесь нет баланса, который мог бы закончиться. Решение происходит на вашей машине, поэтому ошибка ключа — это всегда несовпадение между тем, что вы отправили, и тем, что ожидает приложение.
Нужно ли передавать ключ и в запросе опроса?
Да. /res.php принимает тот же параметр key , что и /in.php. Если вы исправили только вызов отправки, опрос всё ещё может падать на старом значении.
Почему мой старый ключ 2Captcha здесь не работает?
Потому что он выдан их сервисом и ничего не значит для решателя, работающего на вашей машине. Форма API та же, учётные данные — нет. Направьте клиент на 127.0.0.1 и используйте ключ из CapSkip Settings.
Сводка
Проверьте, включена ли проверка ключа, скопируйте ключ из Settings вместо ручного ввода, убедитесь, что значение действительно доходит до вашего процесса, и корректно закодируйте его, если собираете URL вручную. Это покрывает практически каждый случай error_key_does_not_exist.
Весь этот класс проблем становится меньше, когда решатель — это локальный сервис распознавания капчи под вашим контролем: нет аккаунта, нет баланса, нет ротации учётных данных, есть один ключ, который вы можете прочитать на экране прямо перед собой.
