Tokenwave EN Открыть бота
Главная›Задачи

Типы задач

#HCaptchaTask

Решение hCaptcha на страницах Steam. Вы присылаете адрес страницы, ключ капчи и параметры сессии, в ответ получаете токен для подстановки в запрос Steam.

Важно

Полученный токен действителен 60 секунд после завершения решения и используется один раз.

Для стабильного результата передавайте полный набор параметров, включая User-Agent и cookies: так меньше ошибок при обновлении кода hCaptcha.

Внимание

Решение выполняется на нашей стороне. При необходимости можно передать собственный прокси — поля proxyType, proxyAddress, proxyPort, proxyLogin, proxyPassword.

#Как это работает

Ваша программаAPISteamPOST /createTasktaskIdPOST /getTaskResultкаждые 2–3 секундыstatus: processingPOST /getTaskResultstatus: ready + токентокен в запрос Steam — не позже чем через 60 с
Схема: создание задачи, опрос результата и отправка токена в Steam
  1. Берёте на странице Steam параметры капчи (websiteKey, data) — см. Где взять параметры.
  2. Создаёте задачу методом createTask и получаете taskId.
  3. Раз в 2–3 секунды запрашиваете getTaskResult, пока статус processing.
  4. Получаете gRecaptchaResponse и в течение 60 секунд подставляете его в запрос Steam.

#Какие задания решаем

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

группа как выглядит для пользователя что просят сделать
3×3 / YesNo сетка из 9 картинок, сверху фраза «Identify all …» отметить все картинки, подходящие под условие (животные, транспорт, еда)
Click одна большая картинка с несколькими объектами кликнуть по объекту, подходящему под условие (цифра с нужным значением, движущаяся часть механизма)
DragAndDrop картинка с подвижным элементом и целевой зоной перетащить элемент на нужное место (кусок трубы, деталь машины, фишки)
Важно

При высоком риске от IP hCaptcha переключает отображение на несколько раундов подряд. На цене задачи это не отражается — мы оплачиваем разницу сами.

#Структура объекта task

typestringобязательный
Тип задачи: HCaptchaTask. Значение HCaptchaTaskProxyless тоже принимается и обрабатывается так же; поля своего прокси можно передать с любым из двух типов.
Пример: HCaptchaTask
websiteURLstringобязательный
Полный адрес страницы Steam, на которой показана капча, вместе с https://. Хост должен быть из списка разрешённых: store.steampowered.com, steamcommunity.com, help.steampowered.com.
Пример: https://store.steampowered.com/join/
websiteKeystringобязательный
Ключ hCaptcha (sitekey) этой страницы, строка-UUID. Для Steam берите его из того же ответа refreshcaptcha, что и gid: Steam может выдавать разные ключи в разных запросах.
Пример: e18a349a-46c2-46a0-87a8-74be79345c92
userAgentstringобязательный
User-Agent браузера Windows (Chrome), под которым работает ваша сессия Steam. Он должен совпадать с тем, который вы используете в запросах к Steam.
Пример: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36
isInvisiblebooleanнеобязательный
true, если капча невидимая. Для страницы регистрации Steam передавайте true; для видимой капчи поле не передают.
datastringнеобязательный
Одноразовый параметр капчи. Для Steam — значение gid из ответа refreshcaptcha. Оно действует только для той капчи, которая его выдала: после обновления страницы или нового запроса refreshcaptcha значение меняется, старое использовать нельзя. Для страниц Steam передавайте всегда.
Пример: 14233456855421534
cookiesstringнеобязательный
Cookies вашей сессии Steam одной строкой в формате имя=значение; пары разделяются символами ; (точка с запятой и пробел). Только имена и значения, без атрибутов (Path, Expires и т. п.). Для Steam достаточно sessionid и browserid.
Пример: sessionid=0123456789abcdef01234567; browserid=1234567890123456789
fallbackToActualUAbooleanнеобязательный
true — если переданный User-Agent устарел, мы подставим актуальный и вернём его в solution.userAgent; именно его нужно использовать в запросе к Steam. false или без поля — ваш User-Agent используется как есть. Рекомендуем передавать true.
proxyTypestringнеобязательный
Тип вашего прокси:
http — обычный HTTP/HTTPS-прокси;
https — вариант, если http не подходит;
socks4 — прокси SOCKS4;
socks5 — прокси SOCKS5.
Указывайте вместе с proxyAddress и proxyPort. Без прокси задача решается на нашей стороне.
proxyAddressstringнеобязательный
IP-адрес прокси, IPv4 или IPv6. Имена хостов, локальные адреса (например 127.0.0.1 или 192.168.x.x) и прозрачные прокси не поддерживаются.
Пример: 123.45.67.89
proxyPortintegerнеобязательный
Порт прокси — число от 1 до 65535.
Пример: 8080
proxyLoginstringнеобязательный
Логин прокси. Передавайте, только если прокси требует авторизацию.
proxyPasswordstringнеобязательный
Пароль прокси. Передавайте вместе с proxyLogin.

См. инструкцию, как найти нужные параметры, — в разделе Где взять параметры.

Токен принимается Steam, если userAgent, cookies и IP (прокси) принадлежат той же сессии, в которую вы затем отправляете токен.

#Создание задачи

Метод: POST https://api.tokenwave.org/createTask

#HCaptchaTask (без прокси)

{
  "clientKey": "ВАШ_КЛЮЧ",
  "task": {
    "type": "HCaptchaTask",
    "websiteURL": "https://store.steampowered.com/join/",
    "websiteKey": "e18a349a-46c2-46a0-87a8-74be79345c92",
    "data": "14233456855421534",
    "isInvisible": true,
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36",
    "cookies": "sessionid=0123456789abcdef01234567; browserid=1234567890123456789",
    "fallbackToActualUA": true
  }
}
curl -X POST https://api.tokenwave.org/createTask \
  -H "Content-Type: application/json" \
  -d '{
    "clientKey": "ВАШ_КЛЮЧ",
    "task": {
      "type": "HCaptchaTask",
      "websiteURL": "https://store.steampowered.com/join/",
      "websiteKey": "e18a349a-46c2-46a0-87a8-74be79345c92",
      "data": "14233456855421534",
      "isInvisible": true,
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36",
      "cookies": "sessionid=0123456789abcdef01234567; browserid=1234567890123456789",
      "fallbackToActualUA": true
    }
  }'
import requests

resp = requests.post("https://api.tokenwave.org/createTask", json={
    "clientKey": "ВАШ_КЛЮЧ",
    "task": {
        "type": "HCaptchaTask",
        "websiteURL": "https://store.steampowered.com/join/",
        "websiteKey": "e18a349a-46c2-46a0-87a8-74be79345c92",
        "data": "14233456855421534",
        "isInvisible": True,
        "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36",
        "cookies": "sessionid=0123456789abcdef01234567; browserid=1234567890123456789",
        "fallbackToActualUA": True,
    },
}).json()
print(resp)   # {'errorId': 0, 'taskId': 407533072}
const resp = await fetch("https://api.tokenwave.org/createTask", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    clientKey: "ВАШ_КЛЮЧ",
    task: {
      type: "HCaptchaTask",
      websiteURL: "https://store.steampowered.com/join/",
      websiteKey: "e18a349a-46c2-46a0-87a8-74be79345c92",
      data: "14233456855421534",
      isInvisible: true,
      userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36",
      cookies: "sessionid=0123456789abcdef01234567; browserid=1234567890123456789",
      fallbackToActualUA: true,
    },
  }),
}).then((r) => r.json());
console.log(resp); // { errorId: 0, taskId: 407533072 }

См. инструкцию, как найти нужные параметры, — в разделе Где взять параметры.

#HCaptchaTask (с использованием ваших прокси)

Добавьте поля proxyType, proxyAddress, proxyPort, proxyLogin, proxyPassword. Капча будет решена с вашего IP — это нужно, когда токен отправляется в Steam с того же адреса.

json
{
  "clientKey": "ВАШ_КЛЮЧ",
  "task": {
    "type": "HCaptchaTask",
    "websiteURL": "https://store.steampowered.com/join/",
    "websiteKey": "e18a349a-46c2-46a0-87a8-74be79345c92",
    "data": "14233456855421534",
    "isInvisible": true,
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36",
    "cookies": "sessionid=0123456789abcdef01234567; browserid=1234567890123456789",
    "fallbackToActualUA": true,
    "proxyType": "http",
    "proxyAddress": "123.45.67.89",
    "proxyPort": 8080,
    "proxyLogin": "user",
    "proxyPassword": "password"
  }
}

См. инструкцию, как найти нужные параметры, — в разделе Где взять параметры.

#Пример ответа

Задача создана:

json
{ "errorId": 0, "taskId": 407533072 }

Ошибка, например при нулевом балансе:

json
{
  "errorId": 1,
  "errorCode": "ERROR_ZERO_BALANCE",
  "errorDescription": "Account has zero or negative balance."
}

#Примеры запросов для страниц Steam

Разрешены три сайта: store.steampowered.com, steamcommunity.com, help.steampowered.com. Основные страницы с hCaptcha:

страница websiteURL откуда берётся data и websiteKey
Регистрация https://store.steampowered.com/join/ запрос POST /join/refreshcaptcha/
Восстановление доступа https://help.steampowered.com/en/wizard/HelpWithLoginInfo запрос POST /en/wizard/RefreshCaptcha

Примеры выше показаны для страницы регистрации. Для страницы восстановления доступа:

Пример для страницы восстановления доступа — help.steampowered.com

#Без прокси

json
{
  "clientKey": "ВАШ_КЛЮЧ",
  "task": {
    "type": "HCaptchaTask",
    "websiteURL": "https://help.steampowered.com/en/wizard/HelpWithLoginInfo",
    "websiteKey": "464c5638-2416-4818-8fa8-91e669b4d6a8",
    "data": "14233456855513666",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36"
  }
}

#С использованием ваших прокси

json
{
  "clientKey": "ВАШ_КЛЮЧ",
  "task": {
    "type": "HCaptchaTask",
    "websiteURL": "https://help.steampowered.com/en/wizard/HelpWithLoginInfo",
    "websiteKey": "464c5638-2416-4818-8fa8-91e669b4d6a8",
    "data": "14233456855513666",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36",
    "proxyType": "http",
    "proxyAddress": "123.45.67.89",
    "proxyPort": 8080,
    "proxyLogin": "user",
    "proxyPassword": "password"
  }
}

См. инструкцию, как найти параметры для этой страницы, — в разделе Где взять параметры.

#Получение результата

Метод: POST https://api.tokenwave.org/getTaskResult. В зависимости от нагрузки решение приходит через 15–60 секунд. Опрашивайте не чаще одного раза в 2–3 секунды.

curl -X POST https://api.tokenwave.org/getTaskResult \
  -H "Content-Type: application/json" \
  -d '{"clientKey": "ВАШ_КЛЮЧ", "taskId": 407533072}'
import requests

res = requests.post("https://api.tokenwave.org/getTaskResult", json={
    "clientKey": "ВАШ_КЛЮЧ",
    "taskId": 407533072,
}).json()
print(res["status"])
const res = await fetch("https://api.tokenwave.org/getTaskResult", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ clientKey: "ВАШ_КЛЮЧ", taskId: 407533072 }),
}).then((r) => r.json());
console.log(res.status);

Задача ещё в работе:

json
{ "errorId": 0, "status": "processing" }

Решение готово:

json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "gRecaptchaResponse": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hKdwYXNza2V5xQb9Jvlb…",
    "respKey": "E0_eyJ0eXAiOiJKV1Qi…",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36"
  },
  "cost": "0.004000"
}

Не решено (деньги за задачу не списываются):

json
{
  "errorId": 1,
  "errorCode": "ERROR_CAPTCHA_UNSOLVABLE",
  "errorDescription": "The captcha could not be solved. This is usually a temporary condition, try again."
}

#Что содержится в ответе (solution)

gRecaptchaResponse
токен для подстановки в форму или запрос Steam. Действует 60 секунд, одноразовый
userAgent
User-Agent, с которым решалась капча (если вернулся — используйте его в запросе к Steam)
respKey
значение hcaptcha.getRespKey(), если страница его предоставляет. Для страниц Steam поля, как правило, нет

#Где взять параметры

Для задачи нужны три значения со страницы Steam: websiteKey, data и cookies. Все они доступны в браузере. Параметры капчи (gid и sitekey) Steam отдаёт в ответе на запрос refreshcaptcha, который страница отправляет сама при загрузке, — остаётся только прочитать этот ответ.

страница запрос что в ответе
Регистрация, store.steampowered.com/join/ POST /join/refreshcaptcha/ gid и sitekey
Восстановление доступа, help.steampowered.com/en/wizard/HelpWithLoginInfo POST /en/wizard/RefreshCaptcha gid и sitekey

Прочитать ответ можно вручную через инструменты разработчика браузера (F12) или сразу получить всё кодом — см. Получение параметров кодом.

#websiteKey

Ключ hCaptcha (sitekey) на странице можно найти двумя способами.

Вкладка Network. Откройте F12, перейдите на вкладку Network и перезагрузите страницу. Найдите запрос, адрес которого начинается с checksiteconfig. В его адресе есть параметр sitekey — это и есть websiteKey:

text
https://api.hcaptcha.com/checksiteconfig?v=…&host=store.steampowered.com&sitekey=e18a349a-46c2-46a0-87a8-74be79345c92&sc=1&swa=1

Вкладка Elements. Нажмите Ctrl+F и введите data-sitekey. Ключ будет в атрибуте блока капчи:

html
<div class="h-captcha" data-sitekey="e18a349a-46c2-46a0-87a8-74be79345c92" data-size="invisible"></div>

Отдельно искать sitekey обычно не нужно: для Steam он приходит в ответе refreshcaptcha вместе с gid (см. ниже). Берите оба значения из одного ответа — у разных страниц ключи разные.

#data (для Steam — gid)

data — одноразовый идентификатор капчи, который Steam выдал вашей сессии. Для Steam это поле gid из ответа refreshcaptcha.

Внимание

Значение gid всегда одноразовое. После обновления страницы или нового запроса refreshcaptcha Steam выдаёт новый gid, старый использовать нельзя. Получайте gid непосредственно перед созданием задачи.

#На странице регистрации

  1. Откройте F12 на вкладке Network и загрузите https://store.steampowered.com/join/.
  2. Найдите запрос refreshcaptcha (он уходит сам при загрузке страницы) и откройте вкладку Response. Ответ выглядит так:
json
{
  "gid": "14233456855421534",
  "type": 3,
  "sitekey": "e18a349a-46c2-46a0-87a8-74be79345c92",
  "s": null
}
  1. Возьмите из ответа gid — это data, и sitekey — это websiteKey.

#На странице восстановления доступа

  1. Откройте F12 на вкладке Network и загрузите https://help.steampowered.com/en/wizard/HelpWithLoginInfo.
  2. Найдите запрос RefreshCaptcha. На вкладке Payload видно его тело:
text
sessionid=<ваш sessionid>&wizard_ajax=1&gamepad=0&usage=3&hCaptcha=1

Значение sessionid берётся из cookie sessionid вашей сессии. Без него Steam отвечает ошибкой 403.

  1. На вкладке Response будет такой ответ:
json
{
  "gid": "14233456855513666",
  "type": 3,
  "sitekey": "464c5638-2416-4818-8fa8-91e669b4d6a8",
  "s": null
}
  1. Возьмите gid → data, sitekey → websiteKey.

#cookies и userAgent

Передавайте cookies и User-Agent той же сессии, в которой получили gid (для страницы регистрации достаточно sessionid и browserid, для восстановления доступа — sessionid). В запросе userAgent обязателен; если он устарел, добавьте "fallbackToActualUA": true — тогда мы подставим актуальный и вернём его в solution.userAgent.

#Получение параметров кодом

Скрипты делают два запроса к Steam (страница и refreshcaptcha) в одной сессии и возвращают всё, что нужно для задачи: data, websiteKey и cookies.

#Страница регистрации

import requests

UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
JOIN = "https://store.steampowered.com/join/"


def get_params():
    s = requests.Session()
    s.headers["User-Agent"] = UA
    s.get(JOIN, timeout=20)                      # выдаёт cookies сессии
    r = s.post(JOIN + "refreshcaptcha/", data={"hcaptcha": 1, "count": 1}, timeout=20, headers={
        "X-Requested-With": "XMLHttpRequest",
        "Origin": "https://store.steampowered.com",
        "Referer": JOIN,
    }).json()
    cookies = "; ".join(f"{k}={v}" for k, v in s.cookies.get_dict().items())
    return {"data": r["gid"], "websiteKey": r["sitekey"], "cookies": cookies, "userAgent": UA}


print(get_params())
const UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36";
const JOIN = "https://store.steampowered.com/join/";

async function getParams() {
  const page = await fetch(JOIN, { headers: { "User-Agent": UA } });
  const cookies = page.headers.getSetCookie().map((c) => c.split(";")[0]).join("; ");
  const res = await fetch(JOIN + "refreshcaptcha/", {
    method: "POST",
    headers: {
      "User-Agent": UA,
      Cookie: cookies,
      "Content-Type": "application/x-www-form-urlencoded",
      "X-Requested-With": "XMLHttpRequest",
      Origin: "https://store.steampowered.com",
      Referer: JOIN,
    },
    body: "hcaptcha=1&count=1",
  });
  const { gid, sitekey } = await res.json();
  return { data: gid, websiteKey: sitekey, cookies, userAgent: UA };
}

console.log(await getParams());

Если в ответе refreshcaptcha пришло gid: -1 и пустой sitekey, Steam временно не выдал капчу этому IP. Повторите запрос позже или с другого IP.

#Страница восстановления доступа

На этой странице в теле запроса нужен sessionid из cookie: без него Steam отвечает ошибкой 403.

import requests

UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
HELP = "https://help.steampowered.com/en/wizard/HelpWithLoginInfo"


def get_params_help():
    s = requests.Session()
    s.headers["User-Agent"] = UA
    s.get(HELP, timeout=20)                      # выдаёт cookies сессии
    r = s.post("https://help.steampowered.com/en/wizard/RefreshCaptcha", timeout=20, headers={
        "X-Requested-With": "XMLHttpRequest",
        "Origin": "https://help.steampowered.com",
        "Referer": HELP,
    }, data={"sessionid": s.cookies.get("sessionid"), "wizard_ajax": 1, "gamepad": 0, "usage": 3, "hCaptcha": 1}).json()
    cookies = "; ".join(f"{k}={v}" for k, v in s.cookies.get_dict().items())
    return {"data": r["gid"], "websiteKey": r["sitekey"], "cookies": cookies, "userAgent": UA}


print(get_params_help())
const UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36";
const HELP = "https://help.steampowered.com/en/wizard/HelpWithLoginInfo";

async function getParamsHelp() {
  const page = await fetch(HELP, { headers: { "User-Agent": UA } });
  const pairs = page.headers.getSetCookie().map((c) => c.split(";")[0]).filter((c) => !c.endsWith("=deleted"));
  const cookies = pairs.join("; ");
  const sessionid = pairs.find((c) => c.startsWith("sessionid=")).split("=")[1];
  const res = await fetch("https://help.steampowered.com/en/wizard/RefreshCaptcha", {
    method: "POST",
    headers: {
      "User-Agent": UA,
      Cookie: cookies,
      "Content-Type": "application/x-www-form-urlencoded",
      "X-Requested-With": "XMLHttpRequest",
      Origin: "https://help.steampowered.com",
      Referer: HELP,
    },
    body: new URLSearchParams({ sessionid, wizard_ajax: "1", gamepad: "0", usage: "3", hCaptcha: "1" }),
  });
  const { gid, sitekey } = await res.json();
  return { data: gid, websiteKey: sitekey, cookies, userAgent: UA };
}

console.log(await getParamsHelp());

#Получение параметров через Playwright

Запускает настоящий браузер (headless Chromium) и перехватывает ответ refreshcaptcha так, как он доходит до страницы Steam. Работает, если Steam поменяет внутренний JS или добавит проверки. Стоит дороже: нужна установка playwright и браузера (~200 МБ при первом запуске).

bash
pip install playwright
python -m playwright install chromium

#Страница регистрации

from playwright.sync_api import sync_playwright

PAGE_URL = "https://store.steampowered.com/join/"
REFRESH_URL = "https://store.steampowered.com/join/refreshcaptcha/"


def get_params_pw():
    with sync_playwright() as pw:
        browser = pw.chromium.launch(headless=True)
        context = browser.new_context()
        page = context.new_page()
        with page.expect_response(
            lambda r: r.url == REFRESH_URL and r.request.method == "POST",
            timeout=20000,
        ) as handle:
            page.goto(PAGE_URL)
        body = handle.value.json()
        cookies = "; ".join(f"{c['name']}={c['value']}" for c in context.cookies())
        ua = page.evaluate("navigator.userAgent")
        browser.close()
        return {"data": body["gid"], "websiteKey": body["sitekey"], "cookies": cookies, "userAgent": ua}


print(get_params_pw())

#Страница восстановления доступа

from playwright.sync_api import sync_playwright

PAGE_URL = "https://help.steampowered.com/en/wizard/HelpWithLoginInfo"
REFRESH_URL = "https://help.steampowered.com/en/wizard/RefreshCaptcha"


def get_params_help_pw():
    with sync_playwright() as pw:
        browser = pw.chromium.launch(headless=True)
        context = browser.new_context()
        page = context.new_page()
        with page.expect_response(
            lambda r: r.url.startswith(REFRESH_URL) and r.request.method == "POST",
            timeout=20000,
        ) as handle:
            page.goto(PAGE_URL)
        body = handle.value.json()
        cookies = "; ".join(f"{c['name']}={c['value']}" for c in context.cookies())
        ua = page.evaluate("navigator.userAgent")
        browser.close()
        return {"data": body["gid"], "websiteKey": body["sitekey"], "cookies": cookies, "userAgent": ua}


print(get_params_help_pw())

#Готовый клиент

Функция solve_hcaptcha создаёт задачу, ждёт результат и возвращает solution. Вместе с get_params() из предыдущего раздела получается полный цикл.

import time
import requests

API = "https://api.tokenwave.org"
KEY = "ВАШ_КЛЮЧ"


class CaptchaError(Exception):
    pass


def call(method, payload):
    r = requests.post(f"{API}/{method}", json={"clientKey": KEY, **payload}, timeout=30).json()
    if r.get("errorId"):
        raise CaptchaError(r.get("errorCode"))
    return r


def solve_hcaptcha(task, timeout=120, interval=3):
    task_id = call("createTask", {"task": task})["taskId"]
    deadline = time.time() + timeout
    while time.time() < deadline:
        time.sleep(interval)
        res = call("getTaskResult", {"taskId": task_id})
        if res["status"] == "ready":
            return res["solution"]
    raise CaptchaError("TIMEOUT")


params = get_params()                            # из предыдущего раздела
solution = solve_hcaptcha({
    "type": "HCaptchaTask",
    "websiteURL": "https://store.steampowered.com/join/",
    "isInvisible": True,
    "fallbackToActualUA": True,
    **params,
})
token = solution["gRecaptchaResponse"]           # подставьте в запрос Steam в течение 60 секунд
print(token[:40], "…")
const API = "https://api.tokenwave.org";
const KEY = "ВАШ_КЛЮЧ";

async function call(method, payload) {
  const r = await fetch(`${API}/${method}`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ clientKey: KEY, ...payload }),
  }).then((r) => r.json());
  if (r.errorId) throw new Error(r.errorCode);
  return r;
}

async function solveHcaptcha(task, timeoutMs = 120000, intervalMs = 3000) {
  const { taskId } = await call("createTask", { task });
  const deadline = Date.now() + timeoutMs;
  while (Date.now() < deadline) {
    await new Promise((r) => setTimeout(r, intervalMs));
    const res = await call("getTaskResult", { taskId });
    if (res.status === "ready") return res.solution;
  }
  throw new Error("TIMEOUT");
}

const params = await getParams();                // из предыдущего раздела
const solution = await solveHcaptcha({
  type: "HCaptchaTask",
  websiteURL: "https://store.steampowered.com/join/",
  isInvisible: true,
  fallbackToActualUA: true,
  ...params,
});
console.log(solution.gRecaptchaResponse.slice(0, 40), "…"); // подставьте в запрос Steam в течение 60 секунд

Если задача вернула ERROR_CAPTCHA_UNSOLVABLE, создайте новую с новым gid: старый мог устареть.

#Частые проблемы

что происходит возможная причина и что делать
ERROR_CAPTCHA_UNSOLVABLE data (gid) устарел или уже использован — получите новый и создайте задачу заново. Если ошибка редкая — временный сбой, достаточно повторить
ERROR_BAD_PARAMETERS не переданы websiteURL или websiteKey
ERROR_SITE_NOT_SUPPORTED адрес страницы не из списка разрешённых (store.steampowered.com, steamcommunity.com, help.steampowered.com)
ERROR_ZERO_BALANCE на балансе меньше стоимости задачи — пополните его в боте
ERROR_NO_SLOT_AVAILABLE больше 600 одновременных задач на ключ — дождитесь завершения части
Steam не принимает токен токен прожил больше 60 секунд или уже использован; userAgent, cookies или IP отличаются от тех, с которыми получен gid
refreshcaptcha вернул gid: -1 Steam временно не выдаёт капчу этому IP — повторите позже или смените IP. Платная часть здесь ещё не начиналась, деньги не списываются
© Tokenwave. Решение hCaptcha для Steam.Поддержка: кнопка «Помощь» в боте