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

error_key_does_not_exist - How to Fix ERROR_KEY_DOES_NOT_EXIST and 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_METHODThe method — параметр отсутствует или написан с ошибкойИспользовать userrecaptcha, turnstile, geetest, post или base64
ERROR_BAD_PARAMETERSОбязательный параметр для этого метода отсутствуетСверьтесь со списком параметров метода перед повторной отправкой
ERROR_GOOGLEKEYsitekey отклонёнСчитайте его заново с «живой» страницы, а не из кешированного источника
ERROR_PAGEURLURL страницы отсутствует или составлен неверноОтправляйте полный 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.

Весь этот класс проблем становится меньше, когда решатель — это локальный сервис распознавания капчи под вашим контролем: нет аккаунта, нет баланса, нет ротации учётных данных, есть один ключ, который вы можете прочитать на экране прямо перед собой.