Как исправить ERROR_KEY_DOES_NOT_EXIST: ключ не найден в системе

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 Key Validation. Важны две вещи: включена ли проверка ключа и, если включена, точная строка ключа. Скопируйте ключ с этого экрана, а не набирайте его заново. Большинство обращений по ERROR_KEY_DOES_NOT_EXIST заканчивается на этом.

Раз уж вы в Settings, проверьте заодно и порт. Неверный порт даёт ошибку соединения, а не эту, но проверить оба сразу всё равно стоит. руководство по настройке подробно разбирает весь этот экран.

Правильная передача ключа в каждом SDK

Все четыре SDK используют одно и то же имя опции, apiKey, и ни один из них не читает переменные окружения сам. Если вы храните ключ в CAPSKIP_API_KEY, прочитайте его в своём коде и передайте через опцию apiKey. Задайте её явно на время отладки, чтобы не гадать, что именно отправляется.

# 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, но так и не передаёте его в конструктор. Ни один SDK не читает эту переменную сам, поэтому клиент, созданный без apiKey, отправляет своё значение по умолчанию, а оно не равно вашему ключу. Отсюда и ошибка. То же самое происходит, когда ваш код всё-таки читает переменную, но ничего в ней не находит: файл .env, который во время выполнения никто не загружает, или ключ, экспортированный в одной оболочке, тогда как скрипт запущен в другой.

Выведите то, что собираетесь отправить. Одна строка, и вопрос закрыт:

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, altcha, capy, captchafox, friendly_captcha, amazon_waf, datadome, 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.

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