string extPath = @"C:\zen\CapMonster Cloud — automated captcha solver 1.11.12.0.crx"; // Расширение .crx CapMonsterCloud
string apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Апи ключ CapMonsterCloud
int attempCnt = 3; // Количество попыток разгадать каптчу от 0 до 9
// Устанавливаем расширение
instance.InstallCrxExtension(extPath);
// Активируем установленное расширение
_ = instance.GetExtensionById("pabjfbciaedomjjfelfafejkppknjleh").Activate();
// Проверка на автивацию расширения
_ = !instance.IsExtensionWorking ? throw new Exception("Не удается активировать расширение CapMonsterCloud !") : true;
// Объявим упрощенное обращение к активированному расширению
Tab ext = instance.ActiveExtension;
// Вводим Api ключ CapMonsterCloud в расширение
ext.FindElementByXPath("//input[@type='text']", 0).SetValue(apiKey.Trim(), "Full");
// Дождемся с прокликом, пока станет активной иконка сохранения Api ключа
while (true)
{
HtmlElement saveIcon = ext.FindElementByXPath("//span[@class='anticon']/*[@fill='#46B982']", 0);
if(!saveIcon.IsNull && !saveIcon.IsVoid)
{
saveIcon.Click();
break;
}
}
// Ожидаем прогрузку баланса
string balance = "";
var timer = System.Diagnostics.Stopwatch.StartNew();
while (true)
{
try
{
if (timer.ElapsedMilliseconds > 10000) throw new Exception("Не удалось соединиться с сервером CapMonsterCloud в течении 10 секунд !");
balance = ext.FindElementByXPath("//span[starts-with(@class, 'ant-typography')]", 3).InnerText;
if (balance.Contains("$")) break;
else if (balance.Contains("Неверный ключ")) throw new Exception("Неверный Api ключ CapMonsterCloud !");
}
finally { timer.Stop(); }
}
// Проверим на низкий баланс
double buy = double.Parse(new string(balance.Where(x => char.IsDigit(x) || x == '.').ToArray()), System.Globalization.CultureInfo.InvariantCulture);
if (buy < 0.05) throw new Exception($"Слишком маленький баланс CapMonsterCloud: {buy}$ !");
// Выбираем кол-во повторных решений, в случае ошибки распознавания
if (0 < attempCnt && attempCnt < 10)
{
ext.FindElementByXPath("//span[@class='ant-select-selection-item']", 0).Click();
ext.FindElementByXPath("//*[@class='ant-select-item-option-content']", attempCnt).Click();
}
// Выбираем токен как вариант решения hcaptcha
HtmlElement he = instance.ActiveExtension.FindElementByAttribute("span", "innertext", "Token", "regexp", 1);
if (he.IsVoid) return -1;
// Задержка эмуляции
instance.WaitFieldEmulationDelay();
// Вызвать событие "click"
he.RiseEvent("click", instance.EmulationLevel);
// Клик по кнопке Закрыть
HtmlElement helem = instance.ActiveExtension.GetDocumentByAddress("0").FindElementByAttribute("button", "class", "ant-btn\\ ant-btn-text\\ sc-1om12l0\\ lnoqzy", "regexp", 0);
if (helem.IsVoid) return -1;
// Задержка эмуляции
instance.WaitFieldEmulationDelay();
// Вызвать событие "click"
helem.RiseEvent("click", instance.EmulationLevel);
// Убираем расширение с экрана
instance.ActiveTab.FindElementByXPath("/html", 0).Click();