ComplexImageTask YandexSmartCaptcha решение YandexSmartCaptcha
Объект содержит данные о задаче на решение YandexSmartCaptcha.
Пример изображения
Структура объекта
Параметр | Тип | Обязательный | Возможные значения | Описание |
type | String | да | ComplexImageTask | Определяет тип объекта задачи |
class | String | да |
| Определяет класс объекта задачи |
imagesBase64 | Array | да | [ “ | Список с одним изображением в формате base64. |
Пример запроса
Адрес https://api.capmonster.cloud/createTask
{
"clientKey": "b06025dbcd87ee02a315f0faadefa63c",
"task": {
"type": "ComplexImageTask",
"class": "yandexsmartcaptcha",
"imagesBase64": ["iVBORw0KGgoAAAANSUhEUgAAASwLbb..."]
}
}
Пример ответа
{
"errorId":0,
"taskId":407533072
}
Получение результата
Используйте метод getTaskResult чтобы получить решение капчи. В зависимости от загрузки системы вы получите ответ через время в диапазоне от 300мс до 6 с.
Свойство | Тип | Описание |
answer | Array | Список координат |
metadata | Null | Не несет полезной информации |
Пример:
{
"solution": {
"answer": [
{
"X": 98,
"Y": 140
},
{
"X": 103,
"Y": 54
},
{
"X": 273,
"Y": 117
},
{
"X": 32,
"Y": 89
},
{
"X": 189,
"Y": 149
}
],
"metadata": null
},
"cost": 0.0002,
"status": "ready",
"errorId": 0,
"errorCode": null,
"errorDescription": null
}
Ценообразование:
Наименование | Стоимость за 1000 картинок, $ |
---|---|
Yandex SmartCaptcha (click) | 0.2 |
Формат картинки
Капча с заданием передается одной картинкой. Размер на сервисах яндекса 300x220, на сторонник сайтах 320x220.
Расстояние от картинки до контейнера с текстом задания нужно сделать 4px(margin-top). В оригинале 13px.
Работа с ZennoPoster
Нам требуется подготовить задание, сделать скриншот элемента и отправить его на распознавание в CapmonsterCloud.
Для подготовки задания к отправке и получении картинки в base64 можно воспользоваться следующим C# сниппетом:
// Найдём элемент с заданием(выделен нижней красной рамкой на скриншоте выше)
HtmlElement taskContainer = instance.ActiveTab.FindElementByXPath("//div[@class=\"AdvancedCaptcha-SilhouetteTask\"]", 0);
// Установим ему соотвествующий стиль
taskContainer.SetAttribute("style", "margin-top: 4px;");
// Найдём контейнер с главной картинкой
HtmlElement image = instance.ActiveTab.FindElementByXPath("//div[@class=\"AdvancedCaptcha AdvancedCaptcha_silhouette\"]", 0);
// Получим base64 нужного размера
return image.DrawPartToBitmap(0, 0, 300, 220, false);
Если сохранить результат выполнения этого кубика в переменную imageBase64
, то отправка POST-запроса на /createTask
будет выглядеть следующим образом:
После получения результата распознавания, можно воспользоваться следющим C# сниппетом для прокликивания координат:
// Получаем значение переменной, в которой хранится результат
// от /getTaskResult
string jsonStr = project.Variables["cmcloudTaskResult"].Value;
// Загружаем JSON
project.Json.FromString(jsonStr);
// Находим контейнер с заданием и получаем его координаты
HtmlElement imageContainer = instance.ActiveTab.FindElementByXPath("//div[@class=\"AdvancedCaptcha AdvancedCaptcha_silhouette\"]", 0);
int imageContainerX = int.Parse(imageContainer.GetAttribute("left"));
int imageContainerY = int.Parse(imageContainer.GetAttribute("top"));
for (int i = 0; i < project.Json.solution.answer.Count; ++i) {
int X = Convert.ToInt32(project.Json.solution.answer[i].X);
int Y = Convert.ToInt32(project.Json.solution.answer[i].Y);
// К координатам элемента нужно прибавить координаты от сервиса,
// ведь мы отправляли на распознавание не всю страницу, а конкретный
// контейнер с капчей
instance.ActiveTab.FullEmulationMouseMove(imageContainerX + X, imageContainerY + Y);
instance.ActiveTab.FullEmulationMouseClick("left", "click");
}
// Отправляем капчу
HtmlElement submitBtn = instance.ActiveTab.GetDocumentByAddress("0").FindElementByTag("form", 0).FindChildByAttribute("span", "class", "CaptchaButton-SubmitContent", "regexp", 0);
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(submitBtn);
instance.ActiveTab.FullEmulationMouseClick("left", "click");
Итоговый тестовый проект(не забудьте прописать свой API ключ от capmonster cloud)
Работа с другими программами
Большинство фреймворков для автоматизации(Selenium/Puppeteer/Playwright и тд) предоставляют возможности для создания скриншота.
Например, таким образом можно получить картинку с заданием в playwright:
// Установить нужный стиль элементу
const taskTextContainer = await page.locator('//div[@class="AdvancedCaptcha-SilhouetteTask"]');
await taskTextContainer.evaluate((element) => {
element.style.marginTop = "4px";
}, {}, { timeout: 5000 });
// Получить картинку
const taskContainer = await page.locator('//div[@class="AdvancedCaptcha AdvancedCaptcha_silhouette"]');
const imageWithExtraStuff = await screenshotContainer.screenshot({ scale: "css", timeout: 5000});
После картинку нужно обрезать. Для этого воспользуемся библиотекой sharp:
const sharpImageFull = sharp(imageWithExtraStuff);
const sharpImageCropped = sharpImageFull
.trim({ background: "#FFFFFF", threshold: 0 })
.extract({ top: 0, left: 0, height: 220, width: 300 });