W tym artykule staraliśmy się odpowiedzieć na wszystkie najważniejsze pytania. Pierwszym krokiem w rozwiązywaniu problemu jest ustalenie, jaki system ochrony jest używany. W tym celu możesz skorzystać z listy popularnych captcha i systemów ochrony antybotowej, gdzie znajdziesz przykłady graficzne oraz kluczowe cechy, które pomogą szybko rozpoznać, z czym masz do czynienia.
Jeśli okaże się, że na Twojej stronie używany jest ALTCHA, kolejnym krokiem będzie dokładniejsze poznanie jej właściwości i sposobu działania. W tym artykule możesz również zapoznać się z instrukcją integracji systemu ALTCHA, aby w pełni zrozumieć, jak funkcjonuje on na Twojej stronie. Dzięki temu nie tylko lepiej poznasz obecną ochronę, ale też świadomie zaplanujesz jej dalsze utrzymanie.
Jak rozwiązać ALTCHA przez CapMonster Cloud
Podczas testowania formularzy z ALTCHA często trzeba zweryfikować, czy captcha jest poprawnie zintegrowana i działa.
Możesz ręcznie sprawdzić captchę na swojej stronie.
- Otwórz stronę formularza i upewnij się, że captcha się wyświetla.
- Spróbuj wysłać formularz bez rozwiązania — serwer powinien zwrócić błąd.
- Po poprawnym rozwiązaniu formularz musi wysłać się bez problemów.
Do automatycznego rozwiązywania wykorzystaj narzędzia takie jak CapMonster Cloud, które przyjmują parametry captcha, przetwarzają je na serwerach i zwracają gotowy token. Wstaw go do formularza, aby przejść weryfikację bez udziału użytkownika.
Praca z CapMonster Cloud poprzez API zazwyczaj obejmuje następujące kroki:
W żądaniu rozwiązania ALTCHA należy podać następujące parametry:
type - CustomTask
class - altcha
websiteURL - adres strony, na której rozwiązywana jest captcha
websiteKey - dla tego zadania dopuszczalne jest przesłanie pustego ciągu.
challenge (w metadata) - unikalny identyfikator zadania uzyskany ze strony internetowej.
iterations (w metadata) - liczba iteracji lub maksymalna liczba do obliczeń. Ważne: parametr iterations odpowiada wartości maxnumber!
salt (w metadata) - salt uzyskany ze strony, używany do generowania hashy.
signature (w metadata) - cyfrowy podpis żądania.
userAgent - User-Agent przeglądarki. Przekazuj tylko aktualny UA z Windows.
https://api.capmonster.cloud/createTask{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "altcha",
"websiteURL": "https://example.com",
"websiteKey": "",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36",
"metadata": {
"challenge": "3dd28253be6cc0c54d95f7f98c517e68744597cc6e66109619d1ac975c39181c",
"iterations": "5000",
"salt":"46d5b1c8871e5152d902ee3f?edk=1493462145de1ce33a52fb569b27a364&codeChallenge=464Cjs7PbiJJhJZ_ReJ-y9UGGDndcpsnP6vS8x1nEJyTkhjQkJyL2jcnYEuMKcrG&expires=1761048664",
"signature": "4b1cf0e0be0f4e5247e50b0f9a449830f1fbca44c32ff94bc080146815f31a18"
}
}
}
{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"status": "ready",
"solution": {
"data": {
"token": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiNjMxOGUzYzc2NjhlOTZiMmFlYjg2NGU2NmRmMTliODRkYmYwZDBhMWRjNjYwMDdiMGM5ZGI4ODZiNTUxNjQxNiIsIm51bWJlciI6MTY0NDcsInNhbHQiOiJiMTQ1YWE5ZmU5MjA3NjBiMDgxYTAwNTMiLCJzaWduYXR1cmUiOiI5NzM4MmJlODE2NDUwNzk5MzlhYmU2M2ZkYzZjN2E3ZGYwOTM5MzNjODljZTk0ZjgzNTgxYmUyNDU3ZmI4MDM0IiwidG9vayI6MTczLjl9",
"number": "16447"
}
}
}
- Pełny token — zestaw parametrów zakodowany w base64 (w tym number).
- Tylko number — jeśli serwer oczekuje jedynie identyfikatora rozwiązania.
// npm install playwright
// npx playwright install chromium
const { chromium } = require("playwright");
const API_KEY = "YOUR_API_KEY";
const ALTCHA_PAGE = "https://example.com"; // Twoja strona z ALTCHA
(async () => {
const browser = await chromium.launch({ headless: false, devtools: true });
const context = await browser.newContext();
const page = await context.newPage();
// Przechwytywanie wszystkich odpowiedzi z endpointu Altcha
let challengeResp = null;
page.on("response", async (response) => {
try {
const url = response.url();
if (url.startsWith("https://captcha.example.com/altcha")) { // Endpoint Altcha
challengeResp = await response.json();
console.log("Captured Altcha response:", challengeResp);
}
} catch (err) {
console.warn("Error parsing Altcha response:", err);
}
});
await page.goto(ALTCHA_PAGE, { waitUntil: "networkidle" });
// Kliknij widżet, jeśli istnieje
const widgetHandle = await page.$("altcha-widget");
if (widgetHandle) {
try {
await widgetHandle.click();
} catch {}
}
// Czekamy na pojawienie się challenge
const start = Date.now();
while (!challengeResp && Date.now() - start < 60000) { // Zwiększony timeout
await new Promise((r) => setTimeout(r, 300));
}
if (!challengeResp) {
console.error("Failed to capture Altcha challenge.");
await browser.close();
return;
}
const { challenge, salt, signature, maxnumbers } = challengeResp;
// Tworzymy zadanie w CapMonster Cloud
const createTaskBody = {
clientKey: API_KEY,
task: {
type: "CustomTask",
class: "altcha",
websiteURL: ALTCHA_PAGE,
websiteKey: "",
userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36",
metadata: {
challenge,
iterations: maxnumbers || 100000,
salt,
signature,
},
},
};
const taskResp = await fetch("https://api.capmonster.cloud/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(createTaskBody),
}).then((r) => r.json());
console.log("CreateTask response:", taskResp);
if (!taskResp?.taskId) {
console.error("CreateTask failed:", taskResp);
await browser.close();
return;
}
const taskId = taskResp.taskId;
// Pobieramy rozwiązanie
let fullSolution = null;
const pollStart = Date.now();
while (Date.now() - pollStart < 120000) {
const res = await fetch("https://api.capmonster.cloud/getTaskResult", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey: API_KEY, taskId }),
}).then((r) => r.json());
if (res.status === "ready") {
fullSolution = res.solution;
console.log("Solution:", fullSolution);
break;
}
await new Promise((r) => setTimeout(r, 3000));
}
if (!fullSolution) {
console.error("No solution received in time.");
await browser.close();
return;
}
const token = fullSolution?.data?.token || fullSolution?.token || fullSolution?.data;
if (!token) {
console.error("Token not found in solution:", fullSolution);
await browser.close();
return;
}
//Wstawiamy token
await page.evaluate((t) => {
let input = document.querySelector("#captchaParaValidar");
if (!input) {
input = document.createElement("input");
input.type = "hidden";
input.id = "captchaParaValidar";
input.name = "captchaParaValidar";
(document.querySelector("form") || document.body).appendChild(input);
}
input.value = t;
let alt = document.querySelector('input[name="altcha"]');
if (!alt) {
alt = document.createElement("input");
alt.type = "hidden";
alt.name = "altcha";
(document.querySelector("form") || document.body).appendChild(alt);
}
alt.value = t;
const widget = document.querySelector("altcha-widget");
if (widget) {
widget.setAttribute("data-state", "verified");
const checkbox = widget.querySelector("input[type='checkbox']");
if (checkbox) {
checkbox.checked = true;
checkbox.dispatchEvent(new Event("change", { bubbles: true }));
}
const label = widget.querySelector(".altcha-label");
if (label) label.textContent = "Verified";
}
}, token);
console.log("Token injected:", token);
})();1. Instalacja widżetu
Opcja 1 — przez CDN (najprostsze). Dodaj do <head> swojego HTML:
<script async defer src="https://cdn.jsdelivr.net/gh/altcha-org/altcha/dist/altcha.min.js" type="module"></script>Opcja 2 — przez npm:
npm install altchaImportuj widżet do swojego pliku JS:
import "altcha";2. Dodanie widżetu do formularza.
Wstaw komponent <altcha-widget> w formularzu, gdzie wymagana jest ochrona:
<form method="POST" action="/submit">
<altcha-widget challengeurl="/altcha/challenge"></altcha-widget>
<button type="submit">Send</button>
</form>challengeurl — Twój endpoint serwera do wydawania zadań (challenge).
Jeśli używasz ALTCHA Sentinel (gotowa ochrona serwera przed botami i spamem z uczeniem maszynowym i analizą ruchu), zamiast własnego serwera użyj jego URL:
<altcha-widget
challengeurl="https://sentinel.example.com/v1/challenge?apiKey=YOUR_API_KEY">
</altcha-widget>3. Weryfikacja po stronie serwera.
Jak przebiega weryfikacja:
- 1) Widżet generuje payload — JSON zakodowany w Base64, zwykle wysyłany jako pole formularza altcha.
- 2) Na serwerze weryfikujesz payload kryptograficznie (bez dodatkowych żądań API).
- 3) Po pomyślnej weryfikacji można przetworzyć formularz.
Weryfikacja przez ALTCHA Sentinel:
import { verifyServerSignature } from 'altcha-lib';
// Sekretny klucz API wygenerowany w Sentinel
const apiKeySecret = 'sec_...';
// Payload otrzymany od widżetu
const payload = '...';
// Weryfikacja
const { verificationData, verified } = await verifyServerSignature(payload, apiKeySecret);
if (verified) {
// Weryfikacja zakończona sukcesem — dane formularza mogą być przetwarzane
}
const resp = await fetch('https://sentinel.example.com/v1/verify/signature', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ payload }),
});
const { verified } = await resp.json();
if (verified) {
// Weryfikacja zakończona sukcesem — przetwarzanie formularza
}
API automatycznie zapobiega ponownemu użyciu tego samego payload.
4. Weryfikacja bez Sentinel (własny serwer)
Generowanie challenge:
import { createChallenge } from 'altcha-lib';
const hmacKey = '$ecret.key'; // Twój sekretny klucz HMAC
const challenge = await createChallenge({ hmacKey });
// Zwracamy challenge w JSON dla widżetuWeryfikacja payload przy wysyłaniu formularza:
import { verifySolution } from 'altcha-lib';
const hmacKey = '$ecret.key'; // Twój sekretny klucz HMAC
const verified = await verifySolution(payload, hmacKey);
if (verified) {
// Weryfikacja zakończona sukcesem — przetwarzanie danych formularza
}
W tym przypadku sam tworzysz endpoint /altcha/challenge do wydawania zadań i weryfikujesz je na serwerze.
Obsługiwane captchas
Jeśli przejąłeś stronę internetową, na której jest już zainstalowany captcha lub inny system zabezpieczeń, a jednocześnie nie masz dostępu do kodu — to nic strasznego! Dość łatwo jest ustalić, jaka dokładnie technologia jest używana. Aby sprawdzić poprawność działania, możesz skorzystać z usługi rozpoznawania CapMonster Cloud w odizolowanym środowisku testowym, żeby upewnić się, że mechanizm przetwarzania tokenów i logika weryfikacji działają prawidłowo.
W przypadku ALTCHA wystarczy rozpoznać system, przeanalizować jego zachowanie i upewnić się, że zabezpieczenie działa poprawnie. W artykule pokazaliśmy, jak zidentyfikować ALTCHA oraz gdzie znaleźć instrukcje dotyczące jego podłączenia lub ponownej konfiguracji, aby móc pewnie utrzymywać ochronę i kontrolować jej działanie.