TSPD
TSPD — это WAF-защита (Web Application Firewall), предназначенная для предотвращения автоматизированных атак и подозрительной активности на сайте. Для обычного пользователя её работа почти незаметна, так как основная цель — блокировка скриптов и ботов. В браузере проявления TSPD встречаются редко, и чаще всего они становятся заметны только при нестандартных или массовых запросах к серверу.
-
Для выполнения данной задачи используйте ваши собственные прокси.
-
Прокси в задачах TSPD должен поддерживать статическую сессию. Один и тот же выходной IP должен использоваться на всех этапах (получение cookies → решение задачи → использование полученных cookies). Смена сессии или IP между этапами может привести к ошибкам.
-
После решения вы получите cookies, которые необходимо передавать в последующих запросах к целевому сайту.
Параметры запроса
ВАЖНО: значения некоторых параметров являются динамическими — они меняются при каждом рендеринге страницы с TSPD.
Извлекайте их непосредственно перед созданием задачи, чтобы избежать ошибок при решении. Примеры автоматического извлечения параметров см. в разделах Как получить cookies, Как получить base64 и Примеры автоматического решения TSPD .
type<string>requiredCustomTask
class<string>requiredtspd
websiteURL<string>requiredАдрес страницы, на которой находится TSPD.
tspdCookie (внутри metadata)<string>requiredКуки, полученные на странице с TSPD-challenge: "tspdCookie": "TS386a400d029=082670627aab2800722d179e73a60b575d00c96728a9f8dedd8be27a40f6a1aa5df467cebf7da7315a4e16675f010245; ....; ....;"
htmlPageBase64 (внутри metadata)<string>requiredВся страница с TSPD в формате base64, например: "htmlPageBase64": "PCFET0NUWVBFIGh0bWw+DQo8aHRtbD48aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IlByYWdtYSIgY29udGVudD0ibm8tY2FjaGUiLz4NCjxtZXRhIGh0dHAtZXF1aXY9IkV4cGlyZXMiIGNvbnRlbnQ9Ii0xIi8+DQo8bWV0YSBodHRwLWVxdWl2PSJDYWNoZUNvbnRyb2.....L2JvZHk+PC9odG1sPg=="
userAgent<string>optionalUser-Agent браузера. Используйте текущее значение, поддерживаемое CapMonster Cloud: userAgentPlaceholder
Получить актуальное значение можно по адресу: https://capmonster.cloud/api/useragent/actual.
proxyType<string>requiredhttp - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.
proxyAddress<string>requiredIP адрес прокси IPv4/IPv6. Не допускается:
- использование прозрачных прокси (там где можно видеть IP клиента);
- использование прокси на локальных машинах.
proxyPort<integer>requiredПорт прокси.
proxyLogin<string>requiredЛогин прокси-сервера.
Ограничения: не должен содержать символы ; , |, )
proxyPassword<string>requiredПароль прокси-сервера.
Метод создания задачи
https://api.capmonster.cloud/createTask
Для пользователей из России также доступен:
https://ru.api.capmonster.cloud/createTask
Подробнее в разделе createTask.
Пример запроса
{
"type": "CustomTask",
"class": "tspd",
"websiteUrl": "https://yourwebsite.com/page-with-tspd",
"metadata": {
"tspdCookie": "TS386a400d029=08...010245; TS386a400d029=08...01a06e; TS386a400d078=08...dbb3b0c; TSd2153684027=08...1944",
"htmlPageBase64": "PCFET0NU...k+PC9odG1sPg=="
},
"userAgent": "userAgentPlaceholder",
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
Пример ответа
{
"errorId": 0,
"taskId": 407533072
}
Метод получения результата задачи
Используйте метод getTaskResult, чтобы получить решение TSPD.
Важно: при успешном прохождении в новых версиях TSPD может возвращаться cookie
TSPD_101_DID, тогда как в более старых версиях он может отсутствовать.
https://api.capmonster.cloud/getTaskResult
Для пользователей из России также доступен:
https://ru.api.capmonster.cloud/getTaskResult
Подробнее в разделе getTaskResult.
Пример запроса
{
"clientKey":"API_KEY",
"taskId": 407533072
}
Пример ответа
{
"errorId":0,
"status":"ready",
"solution": {
"Domains": {
"example.com": {
"Cookies": {
"TS386a400d029": "08267...01a06e",
"TS386a400d078": "08267...bb3b0c",
"TSd2153684027": "08267...11944",
"TS00000000076": "08267...b70fc2",
"TSPD_101_DID": "08267...1d53f",
"TS386a400d075": "0402b...1000"
}
}
}
}
}
Работа со страницей с TSPD
Пример HTML-страницы с TSPD-challenge
При отправке GET-запроса на страницу с TSPD-challenge, вы получите HTML, который нужно закодировать в Base64 и передать в параметре htmlPageBase64. Также при первом запросе сервер выдаст специальные cookies (например, TS386a...400d029) — их необходимо передать в tspdCookie, так как они обязательны для корректного решения TSPD и получения ответа от API.
GET-запрос к странице с TSPD-challenge
GET https://example.com/login?client_id=example.client.id&authorization_id=example_auth_id
sec-ch-ua: "Not:A-Brand";v="99", "Google Chrome";v="150", "Chromium";v="150"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
upgrade-insecure-requests: 1
user-agent: userAgentPlaceholder
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
sec-fetch-site: none
sec-fetch-mode: navigate
sec-fetch-user: ?1
sec-fetch-dest: document
accept-encoding: gzip, deflate, br
accept-language: en-US
priority: u=0,i
Upgrade-Insecure-Requests: 1
Страница с TSPD-challenge (пример)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="-1"/>
<meta http-equiv="CacheControl" content="no-cache"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="icon" href="data:;base64,iVBOw0KGgo="/>
<!-- Скрипт TSPD / ThreatMetrix Fingerprinting -->
<script type="text/javascript">
(function() {
// Признак TSPD: переменная bobcmn содержит зашифрованные данные fingerprinting / session
window["bobcmn"] = "101110111110102000000042000000052000000062000000012386a400d200000096200000000200000002300000000300000000300000006/TSPD/300000008TSPD_10130000000cTSPD_101_DID300000005https3000000b0082670627aab200065e4de40b46b945b49688c1d7f2da4f189123687c7515bd58ed223d60435730b086f24771b0a2800da70f3141fd5255393c12c8c87a64a83b8168f256387790c28dd3abb533560e42a9a0970df08ebd7300000002TS200000000200000000";
// Признак TSPD: failureConfig для определения "неправильной" попытки или ошибки на странице
window["failureConfig"] = "524f6f70732e2e2e2e736f6d657468696e672077656e742077726f6e672e2e2e2e20796f757220737570706f72742069642069733a2025444f534c372e6368616c6c656e67652e737570706f72745f6964252e1338353931363039373735373932323232353437062f545350442f171801";
window.AtT = !!window.AtT;
// Основной JS TSPD
try {
(function(){
var z = {
decrypt: function(z){
try {
return JSON.parse(
function(z){
z = z.split("l");
var s = "";
for (var _=0; _<z.length; ++_) s += String.fromCharCode(z[_]);
return s;
}(z)
);
} catch(_) {}
}
};
return z = { configuration: z.decrypt("123l34l97l99l116l105l118l101l34l58l34l110l111l34l44l34l100l101l98l117l103l103l105l110l34l58l34l110l111l34l44l34l109l111l100l117l108l11149l34l58l34l101l110l97l98l108l101l100l34l44l34l109l111l100l117l108l101l50l34l58l34l101l110l97l98l108l101l100l34l44l34l109l111l100l117l108l101l51l34l58l34l101l110l97l98l108l101l100l34l44l34l109l111l100l117l108l101l52l34l58l34l101l110l97l98l108l101l100l34l125")};
})();
var sz = 15;
// Проверка окружения браузера, признаки IE9/IE9RGB
zs(window[Zs[J(1086839, sz)]] === Zs);
zs(typeof ie9rgb4 !== J(1242178186184, sz));
})();
})();
</script>
<!-- TSPD / ThreatMetrix fingerprinting скрипт, тип 8 -->
<script type="text/javascript" src="/TSPD/082670627aab2000b8cb2cd11a623629ab3f79c29c36f891be5a445796e6258af0d27cef4a5db1d4?type=8"></script>
<script type="text/javascript">
// Еще один признак TSPD: blobfp и slobfp - уникальные отпечатки устройства
(function(){
window["blobfp"] = "01010101b00400000100e803000000000d4200353665636365626565343132626436353030363938386138663833326530623934356538333435633861363438623036643666386238363263333064396466633465210068747470733a2f2f72652e73656375726974792e66356161732e636f6d2f72652f0700545350445f3734";
window["slobfp"] = "0827420c940b100087cabc9b010dfd3b94ac7988b1dcbba0";
})();
</script>
<!-- TSPD / ThreatMetrix fingerprinting скрипт, тип 12 -->
<script type="text/javascript" src="/TSPD/082670627aab2000b8cb2cd11a623629ab3f79c29c36f891be5a445796e6258af0d27cef4a5db1d4?type=12"></script>
<noscript>
Please enable JavaScript to view the page content.<br/>
Your support ID is: 8591609775792222547.
<link rel="stylesheet" href="/TSPD/?type=25" />
</noscript>
</head>
<body>
</body>
</html>
Пример успешного принятия cookie (TSPD не появляется при повторном запросе)
При повторном запросе к целевой странице с cookies от CapMonster Cloud сервер вернёт обычный HTML со статусом 200 и без признаков TSPD. Это означает, что cookies приняты и можно продолжать работу с вашим сайтом.
GET-запрос к странице
GET https://example.com/login?client_id=example.client.id&authorization_id=example_auth_id
sec-ch-ua: "Not:A-Brand";v="99", "Google Chrome";v="150", "Chromium";v="150"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
upgrade-insecure-requests: 1
user-agent: userAgentPlaceholder
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
sec-fetch-site: none
sec-fetch-mode: navigate
sec-fetch-user: ?1
sec-fetch-dest: document
accept-encoding: gzip, deflate, br
accept-language: en-US
# Используйте cookies, полученные в результате решения задачи через CapMonster Cloud
# Замените примерные значения ниже на реальные cookies из ответа API
# Формат: cookie: имя1=значение1; имя2=значение2; ...
cookie: TS386a400d029=08267...01a06e; TS386a400d078=0826...dbb3b0c; TSd2153684027=082670...811944; TS00000000076=082670...b70fc2; TSPD_101_DID=08267...1d53f; TS386a400d075=0402b1...701000
priority: u=0,i
Upgrade-Insecure-Requests: 1
HTML страницы (пример)
<!DOCTYPE html>
<html lang="demo">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/png" href="/sandbox.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Sample Portal</title>
<!-- Demo Font -->
<link rel="stylesheet" href="https://demo-cdn.com/fonts/demo-font.css" />
<!-- Icons -->
<link rel="stylesheet" href="https://assets-sandbox.com/icons/demo-icons.css"/>
<link rel="stylesheet" href="/static/sandbox.css">
<script type="module" crossorigin src="/scripts/demo-app.js"></script>
<link rel="stylesheet" crossorigin href="/styles/sample-theme.css">
</head>
<body>
<noscript>Please enable scripts to continue.</noscript>
<div id="sandbox-root"></div>
</body>
</html>
Как получить cookies
Представленный ниже пример кода отправляет GET-запрос на страницу авторизации example.com/login с браузерными заголовками, выводит статус ответа, полный HTML страницы и полученные cookies (включая те, что начинаются на TS).
Пример на Node.js
const url =
"https://example.com/login?client_id=example.client&authorization_id=example123";
// === Заголовки ===
const headers = {
"sec-ch-ua":
'"Not(A:Brand";v="8", "Chromium";v="150", "Google Chrome";v="150"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"Upgrade-Insecure-Requests": "1",
"user-agent":
"userAgentPlaceholder",
accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "navigate",
"sec-fetch-user": "?1",
"sec-fetch-dest": "document",
"accept-language": "en-US",
priority: "u=0,i",
referer: "https://example.com/"
};
async function main() {
const response = await fetch(url, {
method: "GET",
headers,
redirect: "follow",
});
console.log("Status:", response.status);
console.log("Final URL:", response.url);
// === Получаем HTML ===
const html = await response.text();
console.log("\n===== FULL HTML RESPONSE =====\n");
console.log(html);
// === Получаем cookies ===
const rawHeaders = response.headers;
let setCookies = [];
if (typeof rawHeaders.getSetCookie === "function") {
setCookies = rawHeaders.getSetCookie();
}
// fallback (если доступно)
else if (rawHeaders.raw) {
setCookies = rawHeaders.raw()["set-cookie"] || [];
}
console.log("\n===== COOKIES FROM RESPONSE =====\n");
setCookies.forEach((c) => {
const cookiePair = c.split(";")[0];
console.log(cookiePair);
});
// === Только TS cookies ===
const tspdCookies = setCookies
.map((c) => c.split(";")[0])
.filter((c) => c.startsWith("TS"));
console.log("\n===== TSPD COOKIES =====\n");
console.log(tspdCookies);
}
main().catch(console.error);
Важно:
Если сервер возвращает cookies в следующем формате (три или четыре строки):
TS386a400d029=082670...87599c;
TS386a400d029=082670...40a8ea3;
TS386a400d078=082670...b4cbe2c;
TSd2153684027=082670...4415a6
TS386a400d029=08777...83ff9,
TS386a400d029=08777...fb459e,
TSd2153684027=08777...f0ad368
или:
TS014d0691=01fef...1244b,
TS01fe94e8=01fef...9ed38,
TSafd868f7027=082670...a7ea7c
и при этом отсутствует cookie TSPD_101_DID, это указывает на то, что запрос был обработан защитным механизмом и выдана страница блокировки (TSPD challenge). В данном случае необходимо:
- Передать полученный набор cookies в CapMonster Cloud.
- Дождаться результата решения.
- Использовать обновлённые cookies для последующих запросов (см. ниже примеры автоматического решения TSPD).
Как получить Base64 страницы
После того, как вы получили HTML страницы с TSPD-challenge, его необходимо закодировать в Base64. Это можно сделать с помощью различных инструментов или программных библиотек. Ниже приведён пример на Node.js, который выполняет эту задачу:
Пример на Node.js
const url =
"https://example.com/login";
// === Задайте нужные заголовки ===
const headers = {
"sec-ch-ua":
'"Not(A:Brand";v="8", "Chromium";v="150", "Google Chrome";v="150"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"Upgrade-Insecure-Requests": "1",
"user-agent":
"userAgentPlaceholder",
accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "navigate",
"sec-fetch-user": "?1",
"sec-fetch-dest": "document",
"accept-language": "en-US",
priority: "u=0,i",
referer: "https://example.com/"
};
async function main() {
const response = await fetch(url, {
method: "GET",
headers,
redirect: "follow",
});
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
// Получаем полный HTML
const html = await response.text();
// Кодируем в Base64
const base64 = Buffer.from(html, "utf-8").toString("base64");
console.log("===== BASE64 RESULT =====\n");
console.log(base64);
}
main().catch(console.error);
Примеры автоматического решения TSPD
Примеры носят демонстрационный характер и показывают общую логику работы с сайтами, использующими защиту TSPD. В реальных проектах код может потребовать адаптации под конкретный сайт, его запросы и заголовки.
Важные данные (API‑ключи, настройки прокси и т.п.) рекомендуется хранить в .env или переменных окружения.
Как работает алгоритм:
-
Первый запрос. Скрипт делает HTTP-запрос к странице через прокси с браузерными заголовками.
-
Получение cookies. Из ответа извлекаются нужные cookies защиты. Если возвращается cookie
TSPD_101_DID(означает, что защита уже пройдена) или формат некорректный — выполнение прекращается. -
Создание задачи. Скрипт отправляет в CapMonster Cloud задачу типа CustomTask (class: tspd) с данными:
-
URL страницы
-
cookies защиты
-
HTML страницы (Base64)
-
User-Agent
-
прокси
-
-
Получение решения. Скрипт ждёт результат через API (getTaskResult) и получает корректные cookies.
-
Финальный запрос. Запрос повторяется с полученными cookies, после чего возвращается обычная HTML-страница.
- JavaScript
- Python
Показать код (Node.js)
import { gotScraping } from "got-scraping";
import fs from "fs";
// =========================================================
// КОНФИГУРАЦИЯ (рекомендуется хранить данные в отдельном файле или переменных окружения)
// =========================================================
const API_KEY = "YOUR_CAPMONSTER_API_KEY"; // Замените на ваш реальный API ключ CapMonster Cloud
const CAPMONSTER_URL = "https://api.capmonster.cloud";
const url = "https://example.com"; // Замените на целевой URL, где есть TSPD защита
// Установите настройки прокси
const proxy = {
host: "your-proxy-address",
port: 1234,
login: "your-proxy-login",
password: "your-proxy-password",
type: "http"
};
const proxyUrl = `${proxy.type}://${proxy.login}:${proxy.password}@${proxy.host}:${proxy.port}`;
// User-Agent для имитации реального браузера Chrome
const userAgent =
"userAgentPlaceholder";
// =========================================================
// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
// =========================================================
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function extractValidTspdCookies(setCookies) {
/** Извлечение cookies из заголовков Set-Cookie */
const cookies = setCookies.map((c) => c.split(";")[0].trim());
console.log("\nПолученные cookies:");
console.log(cookies);
// Извлечение всех cookies начинающихся с "TS"
const tsCookies = cookies.filter((c) => c.startsWith("TS"));
// Проверка блокировки - TSPD_101_DID указывает на блокировку
const hasDid = cookies.some((c) => c.startsWith("TSPD_101_DID="));
if (hasDid) {
console.log("Обнаружен TSPD_101_DID. Запрос был заблокирован.");
return null;
}
// Проверка формата TS cookies
const validFormat = tsCookies.every((c) => /^[^=]+=[^=]+$/.test(c));
if (!validFormat) {
console.log("Неверный формат TS cookies.");
return null;
}
console.log("Обнаружен валидный набор TSPD cookies.");
return tsCookies.join("; ");
}
function solutionToCookieHeader(solution) {
/** Извлечение cookies из результата решения */
const domain = Object.keys(solution.domains)[0];
const cookies = solution.domains[domain].cookies || {};
const result = [];
for (const [name, value] of Object.entries(cookies)) {
result.push(`${name}=${value}`);
}
return result.join("; ");
}
// =========================================================
// ОСНОВНЫЕ ФУНКЦИИ ДЛЯ РАБОТЫ С CAPMONSTER CLOUD
// =========================================================
async function createTask(task) {
/** Создание задачи в CapMonster Cloud для решения TSPD */
const response = await gotScraping
.post(`${CAPMONSTER_URL}/createTask`, {
json: {
clientKey: API_KEY,
task,
},
})
.json();
if (response.errorId !== 0) {
throw new Error(response.errorDescription);
}
return response.taskId;
}
async function getTaskResult(taskId) {
/** Получение результата решения TSPD от CapMonster Cloud */
while (true) {
await delay(3000);
const response = await gotScraping
.post(`${CAPMONSTER_URL}/getTaskResult`, {
json: {
clientKey: API_KEY,
taskId,
},
})
.json();
if (response.errorId !== 0) {
throw new Error(response.errorDescription);
}
if (response.status === "ready") {
return response.solution;
}
console.log("Ожидание решения...");
}
}
// =========================================================
// ОСНОВНАЯ ФУНКЦИЯ
// =========================================================
async function main() {
/** Главная функция для обхода TSPD защиты */
try {
console.log("Отправка первого запроса...");
// Первый запрос для получения TSPD защиты
const response = await gotScraping(url, {
proxyUrl,
headers: {
"sec-ch-ua":
'"Not:A-Brand";v="99", "Google Chrome";v="150", "Chromium";v="150"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"upgrade-insecure-requests": "1",
"user-agent": userAgent,
accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "navigate",
"sec-fetch-user": "?1",
"sec-fetch-dest": "document",
"accept-language": "en-US",
},
});
let html = response.body;
const htmlBase64 = Buffer.from(html).toString("base64");
const setCookies = response.headers["set-cookie"] || [];
const tspdCookies = extractValidTspdCookies(setCookies);
if (!tspdCookies) {
console.log(
"Остановка скрипта. Не обнаружено валидных TSPD cookies. Продолжение обычного взаимодействия с сайтом.",
);
return;
}
// Формирование задачи для CapMonster Cloud
const task = {
type: "CustomTask",
class: "tspd",
websiteUrl: url,
metadata: {
tspdCookie: tspdCookies,
htmlPageBase64: htmlBase64,
},
userAgent,
proxyType: proxy.type,
proxyAddress: proxy.host,
proxyPort: proxy.port,
proxyLogin: proxy.login,
proxyPassword: proxy.password,
};
console.log("\nСоздание задачи в CapMonster Cloud...");
const taskId = await createTask(task);
console.log("ID задачи:", taskId);
// Получение результата
const solution = await getTaskResult(taskId);
console.log("\nПолучено решение:");
console.log(JSON.stringify(solution, null, 2));
// Извлечение cookies из решения
const cookieHeader = solutionToCookieHeader(solution);
console.log("\nФинальный Cookie заголовок:");
console.log(cookieHeader);
// Формирование финальных заголовков
const finalHeaders = {
"sec-ch-ua":
'"Not:A-Brand";v="99", "Google Chrome";v="150", "Chromium";v="150"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"upgrade-insecure-requests": "1",
"user-agent": userAgent,
accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "navigate",
"sec-fetch-user": "?1",
"sec-fetch-dest": "document",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "en-US",
cookie: cookieHeader,
priority: "u=0,i",
"Upgrade-Insecure-Requests": "1",
};
console.log("\nФинальные заголовки запроса:");
console.log(JSON.stringify(finalHeaders, null, 2));
// Финальный запрос с полученными cookies
const finalResponse = await gotScraping(url, {
proxyUrl,
headers: finalHeaders,
followRedirect: true,
});
console.log("\nДлина финальной страницы:", finalResponse.body.length);
// Сохранение страницы
fs.writeFileSync("final_page.html", finalResponse.body);
console.log("Страница сохранена в final_page.html");
console.log("\n" + "=".repeat(60));
console.log("РЕЗУЛЬТАТ:");
console.log(JSON.stringify({ cookies: cookieHeader }, null, 2));
console.log("=".repeat(60));
} catch (err) {
console.error("Ошибка:", err.message);
}
}
main();
Показать код
import asyncio
import base64
import json
import aiohttp
from urllib.parse import urlparse
# =========================================================
# КОНФИГУРАЦИЯ (рекомендуется хранить данные в отдельном файле или переменных окружения)
# =========================================================
API_KEY = "YOUR_CAPMONSTER_API_KEY" # Замените на ваш реальный API ключ CapMonster Cloud
BASE_URL = "https://example.com" # Замените на целевой URL, где есть TSPD защита
CAPMONSTER_URL = "https://api.capmonster.cloud"
USER_AGENT = "userAgentPlaceholder"
# Установите настройки прокси
PROXY = {
"host": "your-proxy-address",
"port": 1234,
"login": "your-proxy-login",
"password": "your-proxy-password",
"type": "http"
}
# =========================================================
# ОСНОВНОЙ КЛАСС
# =========================================================
class TSPDBypass:
"""Класс для решения TSPD с помощью CapMonster Cloud"""
def __init__(self):
self.domain = urlparse(BASE_URL).hostname
def build_headers(self, cookies=None):
"""Формирование HTTP заголовков для запроса"""
headers = {
"Host": self.domain,
"User-Agent": USER_AGENT,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "en-US",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"sec-ch-ua": '"Google Chrome";v="150", "Not.A/Brand";v="8", "Chromium";v="150"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
}
if cookies:
headers["Cookie"] = cookies
return headers
def build_proxy_url(self):
"""Формирование URL для подключения к прокси"""
if not PROXY.get("host"):
return None
return f"{PROXY['type']}://{PROXY['login']}:{PROXY['password']}@{PROXY['host']}:{PROXY['port']}"
@staticmethod
def extract_ts_cookies(set_cookie_headers):
"""Извлечение cookies из заголовков Set-Cookie"""
cookies = [line.split(";", 1)[0].strip() for line in set_cookie_headers if "=" in line.split(";", 1)[0]]
return "; ".join(cookies)
def extract_solution_cookies(self, solver_result):
"""Извлечение cookies из результата решения капчи"""
solution = solver_result["solution"]
domains = solution.get("Domains") or solution.get("domains")
cookies_dict = domains[self.domain].get("Cookies") or domains[self.domain].get("cookies")
return "; ".join([f"{k}={v}" for k, v in cookies_dict.items()])
async def request_page(self, cookies=None):
"""Выполнение HTTP запроса к целевому сайту"""
proxy = self.build_proxy_url()
async with aiohttp.ClientSession(
connector=aiohttp.TCPConnector(ssl=False),
cookie_jar=aiohttp.DummyCookieJar()
) as session:
async with session.get(
BASE_URL,
headers=self.build_headers(cookies),
proxy=proxy,
allow_redirects=True
) as response:
html = await response.text()
tspd_cookies = self.extract_ts_cookies(response.headers.getall("Set-Cookie", []))
is_tspd = "/TSPD/" in html or "TSPD_101" in html or "tspd" in html.lower()
return {
"success": not is_tspd,
"html": html,
"html_base64": base64.b64encode(html.encode()).decode(),
"cookies": tspd_cookies
}
async def create_task(self, html_page_base64, tspd_cookie):
"""Создание задачи в CapMonster Cloud для решения TSPD"""
payload = {
"clientKey": API_KEY,
"task": {
"type": "CustomTask",
"class": "tspd",
"websiteUrl": BASE_URL,
"userAgent": USER_AGENT,
"metadata": {
"tspdCookie": tspd_cookie,
"htmlPageBase64": html_page_base64
},
"proxyType": PROXY.get("type"),
"proxyAddress": PROXY.get("host"),
"proxyPort": PROXY.get("port"),
"proxyLogin": PROXY.get("login"),
"proxyPassword": PROXY.get("password")
}
}
async with aiohttp.ClientSession(cookie_jar=aiohttp.DummyCookieJar()) as session:
async with session.post(
f"{CAPMONSTER_URL}/createTask",
json=payload,
headers={"Content-Type": "application/json"}
) as response:
text = await response.text()
try:
data = json.loads(text)
except json.JSONDecodeError:
print(f"Ошибка: Получен не-JSON ответ: {text}")
raise
if data.get("errorId") != 0:
raise Exception(data)
return data["taskId"]
async def get_result(self, task_id):
"""Получение результата решения TSPD от CapMonster Cloud"""
async with aiohttp.ClientSession(cookie_jar=aiohttp.DummyCookieJar()) as session:
while True:
payload = {"clientKey": API_KEY, "taskId": task_id}
async with session.post(
f"{CAPMONSTER_URL}/getTaskResult",
json=payload,
headers={"Content-Type": "application/json"}
) as response:
text = await response.text()
try:
data = json.loads(text)
except json.JSONDecodeError:
print(f"Ошибка: Получен не-JSON ответ: {text}")
raise
if data.get("errorId") != 0:
raise Exception(data)
if data["status"] == "ready":
return data
await asyncio.sleep(5)
async def bypass(self):
"""Основной метод для решения TSPD"""
print("Отправка первого запроса...")
# Первый запрос для получения TSPD защиты
first_response = await self.request_page()
html = first_response["html"]
html_base64 = first_response["html_base64"]
tspd_cookies = first_response["cookies"]
print("\nПолученные cookies:")
print(tspd_cookies)
# Проверка блокировки
if "TSPD_101_DID=" in tspd_cookies:
print("Обнаружен TSPD_101_DID. Запрос был заблокирован.")
return {"success": False, "cookies": tspd_cookies, "html": html}
# Проверка формата TS cookies
ts_cookies = [c for c in tspd_cookies.split("; ") if c.startswith("TS")]
valid_format = all("=" in c for c in ts_cookies)
if not valid_format:
print("Неверный формат TS cookies.")
return {"success": False, "cookies": tspd_cookies, "html": html}
print("Обнаружен валидный набор TSPD cookies.")
# Создание задачи в CapMonster Cloud
print("\nСоздание задачи в CapMonster Cloud...")
first_solver = await self.create_task(html_base64, tspd_cookies)
print("ID задачи:", first_solver)
# Получение результата
first_result = await self.get_result(first_solver)
print("\nПолучено решение:")
print(json.dumps(first_result["solution"], indent=2, ensure_ascii=False))
# Извлечение cookies из решения
final_cookies = self.extract_solution_cookies(first_result)
print("\nФинальный Cookie заголовок:")
print(final_cookies)
# Формирование финальных заголовков
final_headers = self.build_headers(final_cookies)
final_headers["sec-ch-ua"] = '"Google Chrome";v="150", "Not.A/Brand";v="8", "Chromium";v="150"'
final_headers["sec-ch-ua-mobile"] = "?0"
final_headers["sec-ch-ua-platform"] = '"Windows"'
final_headers["Upgrade-Insecure-Requests"] = "1"
final_headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8"
final_headers["Accept-Encoding"] = "gzip, deflate, br, zstd"
final_headers["Accept-Language"] = "en-US"
final_headers["priority"] = "u=0,i"
print("\nФинальные заголовки запроса:")
print(json.dumps(final_headers, indent=2, ensure_ascii=False))
# Финальный запрос с полученными cookies
final_response = await self.request_page(final_cookies)
print("\nДлина финальной страницы:", len(final_response["html"]))
# Сохранение страницы
with open("final_page.html", "w", encoding="utf-8") as f:
f.write(final_response["html"])
print("Страница сохранена в final_page.html")
return {
"cookies": final_cookies,
"html": final_response["html"]
}
async def main():
"""Главная функция"""
bypasser = TSPDBypass()
try:
result = await bypasser.bypass()
print("\n" + "="*60)
print("РЕЗУЛЬТАТ:")
print(json.dumps({"cookies": result["cookies"]}, indent=4, ensure_ascii=False))
print("="*60)
except Exception as err:
print("Ошибка:", str(err))
if __name__ == "__main__":
asyncio.run(main())
Используйте библиотеку SDK
- JavaScript
- Python
- C#
Показать код (для браузера)
// https://github.com/CapMonsterCloud/capmonster-nodejs-captcha-solver
import {
CapMonsterCloudClientFactory,
ClientOptions,
TSPDRequest
} from "@zennolab_com/capmonstercloud-client";
document.addEventListener("DOMContentLoaded", async () => {
const API_KEY = "YOUR_API_KEY"; // Укажите ваш API-ключ CapMonster Cloud
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// TSPD решается только с использованием вашего прокси
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password",
};
const tspdRequest = new TSPDRequest({
websiteURL: "https://yourwebsite.com/page-with-tspd",
userAgent: "userAgentPlaceholder",
metadata: {
tspdCookie:
"TS386a400d029=08...010245; TS386a400d029=08...01a06e; TS386a400d078=08...dbb3b0c; TSd2153684027=08...1944",
htmlPageBase64: "your_html_page_base64",
},
proxy,
});
// При необходимости можно проверить баланс
const balance = await client.getBalance();
console.log("Balance:", balance);
const result = await client.Solve(tspdRequest);
console.log("Solution:", result.solution);
});
Показать код (Node.js)
// https://github.com/CapMonsterCloud/capmonster-nodejs-captcha-solver
const {
CapMonsterCloudClientFactory,
ClientOptions,
TSPDRequest,
} = require("@zennolab_com/capmonstercloud-client");
const API_KEY = "YOUR_API_KEY"; // Укажите ваш API-ключ CapMonster Cloud
async function solveTSPD() {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY }),
);
// TSPD решается только с использованием вашего прокси
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password",
};
const tspdRequest = new TSPDRequest({
websiteURL: "https://yourwebsite.com/page-with-tspd",
userAgent: "userAgentPlaceholder",
metadata: {
tspdCookie:
"TS386a400d029=08...010245; TS386a400d029=08...01a06e; TS386a400d078=08...dbb3b0c; TSd2153684027=08...1944",
htmlPageBase64: "your_html_page_base64",
},
proxy,
});
// При необходимости можно проверить баланс
const balance = await client.getBalance();
console.log("Balance:", balance);
const result = await client.Solve(tspdRequest);
console.log("Solution:", result.solution);
}
solveTSPD().catch(console.error);
Показать код
# https://github.com/CapMonsterCloud/capmonster-python-captcha-solver
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TspdCustomTaskRequest
from capmonstercloudclient.requests.proxy_info import ProxyInfo
API_KEY = "YOUR_API_KEY" # Укажите ваш API-ключ CapMonster Cloud
async def solve_tspd():
client = CapMonsterClient(
options=ClientOptions(api_key=API_KEY)
)
# TSPD решается только с использованием вашего прокси
proxy = ProxyInfo(
proxyType="http",
proxyAddress="123.45.67.89",
proxyPort=8080,
proxyLogin="username",
proxyPassword="password",
)
tspd_request = TspdCustomTaskRequest(
websiteUrl="https://yourwebsite.com/page-with-tspd",
userAgent="userAgentPlaceholder",
metadata={
"tspdCookie": (
"TS386a400d029=08...010245; "
"TS386a400d029=08...01a06e; "
"TS386a400d078=08...dbb3b0c; "
"TSd2153684027=08...1944"
),
"htmlPageBase64": "your_html_page_base64",
},
proxy=proxy,
)
# При необходимости можно проверить баланс
balance = await client.get_balance()
print("Balance:", balance)
result = await client.solve_captcha(tspd_request)
print("Solution:", result)
asyncio.run(solve_tspd())
Показать код
// https://github.com/CapMonsterCloud/capmonster-dotnet-captcha-solver
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
// Укажите ваш API-ключ CapMonster Cloud
var clientOptions = new ClientOptions
{
ClientKey = "YOUR_API_KEY"
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// TSPD решается только с использованием вашего прокси
var tspdRequest = new TspdCustomTaskRequest(
"TS386a400d029=08...010245; " +
"TS386a400d029=08...01a06e; " +
"TS386a400d078=08...dbb3b0c; " +
"TSd2153684027=08...1944",
"your_html_page_base64"
)
{
WebsiteUrl = "https://yourwebsite.com/page-with-tspd",
UserAgent = "userAgentPlaceholder",
Proxy = new ProxyContainer(
"123.45.67.89",
8080,
ProxyType.Http,
"username",
"password"
)
};
// При необходимости можно проверить баланс
var balance = await cmCloudClient.GetBalanceAsync();
Console.WriteLine("Balance: " + balance);
var tspdResult = await cmCloudClient.SolveAsync(tspdRequest);
Console.WriteLine("Solution:");
Console.WriteLine(
JsonConvert.SerializeObject(
tspdResult.Solution,
Formatting.Indented
)
);
}
}
