Типы задач
#HCaptchaTask
Решение hCaptcha на страницах Steam. Вы присылаете адрес страницы, ключ капчи и параметры сессии, в ответ получаете токен для подстановки в запрос Steam.
Полученный токен действителен 60 секунд после завершения решения и используется один раз.
Для стабильного результата передавайте полный набор параметров, включая User-Agent и cookies: так меньше ошибок при обновлении кода hCaptcha.
Решение выполняется на нашей стороне. При необходимости можно передать собственный прокси — поля proxyType, proxyAddress, proxyPort, proxyLogin, proxyPassword.
#Как это работает
- Берёте на странице Steam параметры капчи (
websiteKey,data) — см. Где взять параметры. - Создаёте задачу методом
createTaskи получаетеtaskId. - Раз в 2–3 секунды запрашиваете
getTaskResult, пока статусprocessing. - Получаете
gRecaptchaResponseи в течение 60 секунд подставляете его в запрос Steam.
#Какие задания решаем
На странице Steam hCaptcha может показать три группы задач. Все они решаются на нашей стороне — покупатель на выходе получает только токен и визуальные задания не видит. Таблица — чтобы вы понимали, что происходит внутри.
| группа | как выглядит для пользователя | что просят сделать |
|---|---|---|
| 3×3 / YesNo | сетка из 9 картинок, сверху фраза «Identify all …» | отметить все картинки, подходящие под условие (животные, транспорт, еда) |
| Click | одна большая картинка с несколькими объектами | кликнуть по объекту, подходящему под условие (цифра с нужным значением, движущаяся часть механизма) |
| DragAndDrop | картинка с подвижным элементом и целевой зоной | перетащить элемент на нужное место (кусок трубы, деталь машины, фишки) |
При высоком риске от IP hCaptcha переключает отображение на несколько раундов подряд. На цене задачи это не отражается — мы оплачиваем разницу сами.
#Структура объекта task
typestringобязательныйHCaptchaTask. Значение HCaptchaTaskProxyless тоже принимается и обрабатывается так же; поля своего прокси можно передать с любым из двух типов.Пример:
HCaptchaTaskwebsiteURLstringобязательныйhttps://. Хост должен быть из списка разрешённых: store.steampowered.com, steamcommunity.com, help.steampowered.com.Пример:
https://store.steampowered.com/join/websiteKeystringобязательныйrefreshcaptcha, что и gid: Steam может выдавать разные ключи в разных запросах.Пример:
e18a349a-46c2-46a0-87a8-74be79345c92userAgentstringобязательныйПример:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36isInvisiblebooleanнеобязательныйtrue, если капча невидимая. Для страницы регистрации Steam передавайте true; для видимой капчи поле не передают.datastringнеобязательныйgid из ответа refreshcaptcha. Оно действует только для той капчи, которая его выдала: после обновления страницы или нового запроса refreshcaptcha значение меняется, старое использовать нельзя. Для страниц Steam передавайте всегда.Пример:
14233456855421534cookiesstringнеобязательныйимя=значение; пары разделяются символами ; (точка с запятой и пробел). Только имена и значения, без атрибутов (Path, Expires и т. п.). Для Steam достаточно sessionid и browserid.Пример:
sessionid=0123456789abcdef01234567; browserid=1234567890123456789fallbackToActualUAbooleanнеобязательныйtrue — если переданный User-Agent устарел, мы подставим актуальный и вернём его в solution.userAgent; именно его нужно использовать в запросе к Steam. false или без поля — ваш User-Agent используется как есть. Рекомендуем передавать true.proxyTypestringнеобязательныйhttp — обычный HTTP/HTTPS-прокси;https — вариант, если http не подходит;socks4 — прокси SOCKS4;socks5 — прокси SOCKS5.Указывайте вместе с
proxyAddress и proxyPort. Без прокси задача решается на нашей стороне.proxyAddressstringнеобязательный127.0.0.1 или 192.168.x.x) и прозрачные прокси не поддерживаются.Пример:
123.45.67.89proxyPortintegerнеобязательныйПример:
8080proxyLoginstringнеобязательный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 с того же адреса.
{
"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"
}
}
См. инструкцию, как найти нужные параметры, — в разделе Где взять параметры.
#Пример ответа
Задача создана:
{ "errorId": 0, "taskId": 407533072 }
Ошибка, например при нулевом балансе:
{
"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
#Без прокси
{
"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"
}
}
#С использованием ваших прокси
{
"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);
Задача ещё в работе:
{ "errorId": 0, "status": "processing" }
Решение готово:
{
"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"
}
Не решено (деньги за задачу не списываются):
{
"errorId": 1,
"errorCode": "ERROR_CAPTCHA_UNSOLVABLE",
"errorDescription": "The captcha could not be solved. This is usually a temporary condition, try again."
}
#Что содержится в ответе (solution)
gRecaptchaResponseuserAgentrespKeyhcaptcha.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:
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. Ключ будет в атрибуте блока капчи:
<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 непосредственно перед созданием задачи.
#На странице регистрации
- Откройте
F12на вкладке Network и загрузитеhttps://store.steampowered.com/join/. - Найдите запрос
refreshcaptcha(он уходит сам при загрузке страницы) и откройте вкладку Response. Ответ выглядит так:
{
"gid": "14233456855421534",
"type": 3,
"sitekey": "e18a349a-46c2-46a0-87a8-74be79345c92",
"s": null
}
- Возьмите из ответа
gid— этоdata, иsitekey— этоwebsiteKey.
#На странице восстановления доступа
- Откройте
F12на вкладке Network и загрузитеhttps://help.steampowered.com/en/wizard/HelpWithLoginInfo. - Найдите запрос
RefreshCaptcha. На вкладке Payload видно его тело:
sessionid=<ваш sessionid>&wizard_ajax=1&gamepad=0&usage=3&hCaptcha=1
Значение sessionid берётся из cookie sessionid вашей сессии. Без него Steam отвечает ошибкой 403.
- На вкладке Response будет такой ответ:
{
"gid": "14233456855513666",
"type": 3,
"sitekey": "464c5638-2416-4818-8fa8-91e669b4d6a8",
"s": null
}
- Возьмите
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 МБ при первом запуске).
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. Платная часть здесь ещё не начиналась, деньги не списываются |