[Урок 14] . 100%-распознавание капчи reCaptcha v.2 в iMacros+JS через сервис rucaptcha.com

Вот мы и подошли к вопросу, который интересует большинство ботоводов и скриптописателей. Сегодня мы будем создавать эффективный алгоритм для распознавания гугловской reCaptcha v2 при помощи iMacros. Первая версия этой капчи была проще, там нужно было ввести пару слов с картинки. В интернете есть различные скрипты, в том числе и для iMacros, по распознаванию капчи, но не всегда они способны работать четко и бесперебойно. Сегодня я сначала рассмотрю некоторые сервисы по распознаванию и мы напишем хорошего и быстрого бота по решению рекапча на iMacros и Javascript.

Сервисы для распознавания капчи

Сервис Rucaptcha.com

https://rucaptcha.com — самый популярный и удобный сервис для распознавания изображений. Помимо разгадывания обычных капч, позволяет распознавать reCaptcha2 без отправки изображений на сервер распознавания, да и в принципе без браузера, удобно для ботов на get-запросах, и шанс распознавания 100%.

Еще у них очень хороший раздел с русской документацией, там есть различные примеры и подробнейшее описание API. Количество работников, единовременно распознающих капчи, зависит от времени суток и иногда достигает 4000 человек. Скорость распознавания бывает разная, но обычно 10-40 сек. у меня.

Расценки за 1000 распознаваний(актуально на 17.01.2017):

  • 22-44 руб. Простые капчи
    Сумма высота и ширины картинки меньше 400px
  • 50 рубБольшая капча
    Сумма высота и ширины картинки больше 400px, например, стандартная reCaptcha v2. имеет размер  300x300px — в сумме получается 600px. 
  • 70 руб.ReCaptcha2
     От большой капчи отличается тем, что распознавателю накладывается сетка и они кликает по ней. Не использую этот вариант, поскольку он дороже большой капчи.
  • 160 руб.ReCaptcha2 без необходимости слать изображения на сервер распознавания
    Самый крутой, но и самый дорогой вариант, поскольку гарантирует 100% распознавание и можно использовать в ботах, не имеющих браузерного движка. Вы шлете id вашей капчи и работники рукапчи распознают и шлют вам ответ, в-будущем может появится необходимость слать еще и ваш прокси, но пока гугл не блочит разницу в ip между отправителем и получателем капчи.

Сервис antigate.com

Более старый аналог рукапчи, но цены выше, в районе 1$(около 60 руб. за 1000 распознаваний на данный момент). Не использую.

Программа CapMonster 2 от Zennolab

zennolab.com/ru/products/capmonster/buy-now/ — Автоматизированное ПО для распознавания более 160 видов различных капч, самый простой вариант на 20 одновременных потоков стоит 97$ в год. Также позволяет разгадывать аудиокапчу , что особенно ценно и reCaptcha v2.

http://zennolab.com/ru/products/capmonster/capmonster-lite-samples/ — Тут примеры капч, которые он распознает.

Программа ставится на компьютер и для распознавания использует ресурсы вашего компьютера, поддерживается использование всех ядер CPU и даже распознавание на GPU(видеокарте). То есть, это не облачный сервис и распознавание осуществляется непосредственно вашим компьютером. При запуске, программа создает локальный сервер, на который можно слать капчи из любых программ и скриптов, в том числе и iMacros по стандартному http-протоколу, точно также, как мы будем слать капчи в это статье на сервис рукапчи.

Пару слов о старом способе распознавания reCaptcha 2 с отправкой изображения на сервер

Любое написание бота нужно начинать с исследования, чтобы можно было предусмотреть все различные варианты событий. Давайте для начала откроем сайт с демкой рекапчи https://www.google.com/recaptcha/api2/demo.

Теперь попробуем посмотреть какая капча нам может попасться:

Используя старый способ распознавания капчи, мы бы нажимали кнопку смены капчи, до тех пор, пока бы нам не попалась капча 2×4 или 3×3 клетки. Самую ублюдскую картинку 4х4 со знаками и улицами следовало бы игнорировать. Однако при 100% — распознавании, которое я хочу рассмотреть, нам это не потребуется. 

Несколько наблюдений при использовании старого способа с отправкой картинки на рукапчу:

  • Названия кнопок, текст задания, могут отличаться в зависимости от языка операционной системы или браузера. Поэтому не используем в скриптах селекторы по тексту кнопки.
  • Если вы залогинены в свой гугл-аккаунт, вам придется реже вводить капчу, иногда будет пропускать и без выбора картинок.
  • Бывает так, что вы выбираете картинку, а она исчезает и нужно выбирать другую. Такие ситуации геморройно отслеживать и в итоге цена капчи в такой ситуации будет невыгодна, если такое происходит постоянно, то нужно использовать способ за 160 руб за 1000 распознаваний, где подобная проблема решена и шанс распознавания 100%.
  • На решение капчи вам дается 75 секунд, после чего окошко с картинками автоматом закрывается и после повторного открытия, капча изменяется на другую.
  • За частое распознавание аудиокапчи можно словить бан, за распознавание и частую смену картинок бан не получить и менять картинки можно сколько угодно.
  • Часто слышал про дополнительный тип капчи, называемый «Ассоциации», который появляется, если активно ботоводить, распознавая reCaptcha 2 с одного айпи.

Если вы знаете еще какие-то особенности при работе с рекапчей, пишите, пожалуйста в комментариях.

100%-распознавание reCaptcha 2 при помощи iMacros+Javascript без отправки картинки на сервер рукапчи

Я не буду рассматривать старые способы разгадывания капчи за 50 руб. Я рассмотрю способ, который обойдется в 160 руб. за 1000 распознаваний, но со 100% вероятностью. Наверное, это не подойдет тем, кто привык собирать халявные биткойны с кранов и прочую валюту с различных бонусников. Даже учитывая текущую цену биткойна в ~50 000 руб., стоимость одного разгадывания капчи будет 16 копеек(320 сатоши), а очень редкие краны дают больше 100-200 сатоши за клейм. Это невыгодно и убыточно.

Я все же пришел к выводу, что сбор таких бонусов — неэффективен в плане заработка. Выгоднее написать бота, который ведет группу в вк или наполняет сайт на автомате, размещает рекламные посты на досках, регается и постит на форумах и т.д., в-общем работает более эффективно, привлекая рефераллов или траффик на целевой сайт.

Ладно, ближе к делу. Суть способа в том, что мы получаем параметр data-sitekey у рекапчи и отсылаем его на сервер распознавания. После, получаем код с рукапчи, который вставляем в скрытую textarea. Все, капча пройдена, можно делать сабмит формы. Что любопытно, галочку на самой рекапче ставить не надо, так как гугл пока не проверяет поведение пользователя и нажатие на эту кнопку.

Для отправки запроса на сервер рукапчи мы будем использовать XMLHttpRequest.
Важная деталь: нам не подойдет window.XMLHttpRequest(); — мы будем использовать Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1"). Объясняю почему: на некоторых сайтах стоит защита от изменения DOM-дерева, например прописана политика безопасности контента CSP(Content Security Policy), из-за которой нельзя изменять DOM-дерево и соответственно использовать new window.XMLHttpRequest();. Вариант, который я предложил, мы можем использовать, поскольку он выполняется не в контексте текущего защищенного окна, а в контексте браузера.

Мой скрипт отправляет код капчи на сервер рукапчи и потом каждые 5 секунд проверят, разгдана капча или нет. Если в течении 70 секунд разгадать по каким-либо причинам не удалось, то скрипт завершает свою работу. Что бы, не случилось, скрипт возвращает объект, в котором указано разгадана ли была капча, были ли ошибки и текст ошибки.

Полный скрипт для 100-% распознавания reCaptcha 2 на JS+iMacros:

var Nagibaka = {


	/**
	 *  Solve Google reCaptcha v.2 with rucaptcha.com service
	 *
	 *  @author: Nagibaka<nagibaka.ru>
	 *  @date: 18.01.2017
	 *  @version : 1.0
	 *  
	 *  @param {String} ruCaptchaKey [API key from rucaptcha.com]
	 *  @return {JSON} [Object with info about success or errors]
	 */
	fuckReCaptcha2: function (ruCaptchaKey) {
	
		iimPlayCode('SET !EXTRACT_TEST_POPUP NO');
		iimPlayCode('SET !ERRORIGNORE YES');
		iimPlayCode('SET !TIMEOUT_STEP 0');		

		var out = {
			isSolved: false,
			hasError: false,
			errorText: "no text"
		};

		var reqCount = 0;


		function checkSolution (gkey, rucapKey) {

			if (reqCount > 14) {  // 14 * 5 = 70 second timeout

				out = {
					isSolved: false,
					hasError: true,
					errorText: "Rucaptcha timeout error."
				};

				return;

			}

			iimPlayCode('WAIT SECONDS=5');	

			var XMLHttpRequestT = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");
			var xhr = new XMLHttpRequestT();
			var url = "http://rucaptcha.com/res.php?key=" + ruCaptchaKey + "&action=get&id=" + gkey + "&json=1"
			xhr.open('GET', url, false);
			xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
			xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

			xhr.timeout = 60000;
			
			
			// processing results
			try {

				xhr.send();

				if (xhr.status != 200) {
					out = {
						isSolved: false,
						hasError: true,
						errorText: xhr.statusText
					};		
				} else {					
					var res = JSON.parse(xhr.responseText);
					if (res.status == 1) {
						window.document.querySelector('.g-recaptcha-response').style = "";
						window.document.querySelector('.g-recaptcha-response').textContent = res.request;					
						out = {
							isSolved: true,
							hasError: false,
							errorText: "Success!"
						};
						
					} else {
						reqCount++;
						checkSolution (gkey, ruCaptchaKey)
					}	
				}			

			} catch (e) {				
				out = {
					isSolved: false,
					hasError: true,
					errorText: e.name
				};
				
			}


		}


		
		if (window.document.querySelector('.g-recaptcha') == null) {
			return {
				isSolved: false,
				hasError: true,
				errorText: "Recaptcha not found on page."
			};
		}

		var dataSiteKey = window.document.querySelector('.g-recaptcha').getAttribute('data-sitekey');
		var domen = window.location.host;
	
		var params = "key=" + ruCaptchaKey + "&method=userrecaptcha&googlekey=" + dataSiteKey + "&pageurl=" + domen + "&json=true&header_acao=1";

		var XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");
		var xhr = new XMLHttpRequest();
		xhr.open('POST', "http://rucaptcha.com/in.php", false);
		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
		xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
		xhr.timeout = 60000;

		try {

			xhr.send(params);

			if (xhr.status != 200) {
				out = {
					isSolved: false,
					hasError: true,
					errorText: xhr.statusText
				};		
			} else {				
				var res = JSON.parse(xhr.responseText);
				if (res.status == 1) {
					checkSolution(res.request, ruCaptchaKey);
				} else {
					out = {
						isSolved: false,
						hasError: true,
						errorText: xhr.statusText
					};
				}		
			}			

		} catch (e) {			
			out = {
				isSolved: false,
				hasError: true,
				errorText: e.name
			};
			
		}

		return out;

	}

};



// Пример использования на сайте https://www.google.com/recaptcha/api2/demo
iimPlayCode('SET !TIMEOUT 30\r\nURL GOTO=https://www.google.com/recaptcha/api2/demo');

var result = Nagibaka.fuckReCaptcha2("ruCaptcha API-key here...");	
window.console.log(result);

// Check if captcha solved
if (result.isSolved) {
	window.document.querySelector('#recaptcha-demo-submit').click();
} else {
	window.console.log(result.errorText)
}

 

Кода могло быть и поменьше, но я постарался предусмотреть различные ситуации, которые могут привести к остановке работы скрипта и предотвратил их. Всегда нужно стремиться писать такие скрипты, которые могут бесперебойно работать 24\7.

 

60 комментариев

  1. Классный блог у тебя 😉 Жду статей в категории nodejs+imacros, было бы интересно почитать.
    Насчет рекапчи вконтакте, не знаешь каким образом отправлять пост запрос после того как получил ответ от рукапчи? Кнопки отправить там нет, я так понимаю нужно повторить пост запрос, на который вышла рекапча, но с добавлением кода разгадки рекапчи, но как это смоделировать не понимаю.

    Ответить
    • По Node.js+iMacros будут статьи для раздела «Создаем свой ботнет». Но, чуть позже, сначала хочу дописать основной материал по «Урокам iMacros+JS».

      Ответить
  2. У тебя тут странная форма комментирования, после отправки непонятно отправилось ли или нет.. Просто страница перезагружается.
    Поэтому еще раз напишу, у тебя есть решение как прикрутить к ВК такую капчу? Там нужно отправить пост запрос после разгадывания, потому что кнопки отправить там нет. Как это смоделировать? Как повторить пост запрос с добавлением кода разгадывания? Хоть в какую сторону копать подскажи пожалуйста ))

    Ответить
    • Ваши комментарии почему-то попали в спам.
      По поводу вконтакте, думаю там можно инициировать сабмит, но надо разбираться и смотреть что там и как.
      И есть ньюанс, на рукаптче в faq пишут, что на вк 100%-способ разгадывания капчи не всегда прокатывает, возможно там используются дополнительные способы защиты или анализа поведения пользователя.

      Ответить
  3. Укажите куда нужно вставлять gкеy и ключ рукаптчи вернее выделите в коде скрипта приведенным вами примере

    Ответить
    • я так понимаю, скрипт сам его выдергивает из странички которую ты указываешь в запросе iimPlayCode(‘SET !TIMEOUT 30\r\nURL GOTO=https://www.google.com/recaptcha/api2/demo’);

      gкеy он выдергивает в коде на 105 — 106 строке
      «var dataSiteKey = window.document.querySelector(‘.grecaptcha’).getAttribute(‘data-sitekey’);
      var domen = window.location.host;»

      ключ капчи надо указывать в строчке 160 вместо ruCaptcha API-key here…

      Ответить
  4. Здравствуйте, у вас годный блог, регулярно захожу и не зря) Но вот столкнулся с проблемой, искал в гугле, по форумах и у вас смотрел — не нашел ответа, может вы подскажите как картинку загрузить в переменную, можно ли вообще такое сделать. Мне нужно вставить картинку вместе с текстом на почте для рассылки. Если загрузить картинку средствами на самом рамблере, то она идет прикрепленным файлом, а хотелось бы чтобы человек открыл письмо, а там красивая инфографика.

    Ответить
    • Женя, сделать можно.
      За 5 минут я тебе решение не накидаю, но куда двигаться — подскажу.
      Такую задачу решать в лоб реально, но геморройно и времязатратно и я думаю у вас знаний js просто не хватит.
      Если задача — рассылка красивых писем с определенного адреса, то можно использовать какие-нибудь скрипты на node.js например + запуск стороннего скрипта отправки почты из iMacros. К любой почте можно подключиться через стандартный SMTP-протокол.

      Ответить
      • Да, вот видите не хватает знаний-то раз обращаюсь) А не подскажите ресурс для изучения ноды, с ней не работал никогда.

        Ответить
  5. помогите разобраться попробовал код вставив туда ключ от рекапчи скрипт не чего не делает(((

    Ответить
  6. браузер луна
    в фаерфоксе выдает ошибку
    Error: Accessing content window is not supported in multiprocess Firefox, line 208 (Error code: -991)

    Ответить
  7. ок спс помогло
    чтобы разгадать копчю в другом месте надо только поменять эту строчку?
    // Пример использования на сайте https://www.google.com/recaptcha/api2/demo
    iimPlayCode(‘SET !TIMEOUT 30\r\nURL GOTO=https://www.google.com/recaptcha/api2/demo’);

    Ответить
  8. скрипт отрабатывает деньги на рукапче списываются а галка на капче не появляется?(ставится)

    Ответить
    • Алексей, все верно. При данном методе галка и не нужна для прохождения капчи. Важно, что на сервер отправляется корректный запрос, галка — это просто часть интерфейса.

      Ответить
  9. извеняюсь еще раз но можно чтобы скрипт взаимодействовал с интерфейсом а то вроде и кача разгадана и результата нет
    https://yadi.sk/i/yJBb-1ej3GKjwb
    появляется окно с каким то набором символов((

    Ответить
  10. я так понимаю это обращение на рукапчю XMLHttpRequest();
    а это
    if (res.status == 1) {
    checkSolution(res.request, ruCaptchaKey);
    если капча разгадана отправляет на сайт с капчей
    тока теперь не как не дойдет как это можно все через макрос в ответ запехнуть чтобы кнопка далее заработала?

    Ответить
    • Алексей, добрый вечер!
      Похоже это вы писали мне на почту через сайт, но указали свой неправильный адрес.

      В-целом, если вы не перепутали примеры(просто обычно disabled у неактивной кнопки стоит, а вы написали наоборот) — то решение следующее:

      // Добавляем атрибут disabled
      window.document.querySelector('#idForwardButton').setAttribute('disabled', 'disabled');
      window.document.querySelector('#idForwardButton').click();

      // на всякий случай код для удаления атрибута disabled
      window.document.querySelector('#idForwardButton').removeAttribute('disabled');

      Если там нету дополнительных механизмов защиты, то должно сработать. Если это не помогло — нужно сайт смотреть.

      Спасибо.

      Ответить
  11. супер спазибо кнопка позеленела)))
    я действительно ошибся дисайбл на нерабочей кнопке

    Ответить
  12. Как быть, если на сайте нету формы подтверждение на которую необходимо нажать(строка 165)?

    Ответить
    • Андрей, да, планирую!
      Будет много интересного, также скоро начну добавлять статьи в раздел «Создаем свой ботнет».
      Пока сильно занят другими делами, но скоро время появится на блог.

      Ответить
      • Nagibaka, Это радует! Хотел бы выразить вам благодарность за старания! На данный момент ваш блог является лучшим сосредоточением полезной информации касательно imacros + js.

        Ответить
  13. Что то не работает, ошибку выдает в TypeError: Nagibaka is undefined, line 3 (Error code: -991), так и непонятно куда ключ от рекапчи точно вставлять, может подскажете новичку?

    Ответить
    • Добрый вечер, Сергей!

      Ключ от рекапчи вставляйте вместо фразы «ruCaptcha API-key here…»
      По поводу ошибки, сходу сложно сказать.
      Вы весь код скопировали?
      Версия imacros 8.9.7? Firefox 35?

      Ответить
      • Добрый вечер! Спасибо за ответ.
        да Версия imacros 8.9.7? Firefox 35?
        Вот в этой строчки ошибку показывает: var result = Nagibaka.fuckReCaptcha2(«ruCaptcha API-key here…»);

        Ответить
  14. Подскажите пожалуйста почему скрипт зависает на таком моменте и может крутить здесь очень долго после чего заного перезагружает страницу и начинает заного?
    for (var i = 0; i < linkList.length; i++) {

    window.console.log('====' + (i + 1) + " Link ===="); // behavior

    window.console.log("Link text: ", linkList[i].innerHTML);
    window.console.log("Link title: ", linkList[i].getAttribute('title'));
    window.console.log("Link href: ", linkList[i].getAttribute('href'));
    }

    Ответить
  15. Здраствуйте я все скопировал и 160 линее поставил свой ключ нажал воспроизвести в макросе выходить это
    MacroSyntaxError: unknown command: VAR, line 1 (Error code: -910)
    помогите чайнику )))

    Ответить
  16. Здравствуйте Подскажите пожалуйста в Контакте как нибудь этим скриптом можно капчю разгадывать?

    Ответить
  17. Здравствуйте. Решил использовать Ваш скрипт, но не пойму как. Можете объяснить.
    Вставлял в iMacros, но он не запускается.
    Расскажите что и как сделать надо.

    Ответить
  18. Уважаемый нагибака вставил ваш код в обработчик imacros но он не хочет заводится
    unknown command: VAR, line 1 (Error code: 910)
    в разном регистре писал, все в пустую

    Ответить
  19. Очень классный сайт! Очень много полезного для себя нашел!
    Подскажите, пожалуйста, что нужно поменять в коде, чтобы использовать при разгадывании рекапчи на CapMonster 2?
    Заранее благодарю!

    Ответить
  20. unknown command: VAR, line 1 (Error code: -910). Скажите, что не так! Пробовал и Firefox 38 и 30, толку нет, эта ошибка ((((((

    Ответить
  21. Получилось решить проблему изменив расширение файла с «.iim» на «.js». Но косяк в том, что js-файлы нельзя зациклить в imacros. Что нужно добавить в код, чтобы он зациклился и стартовал каждые 70 секунд?

    Ответить
  22. Привет
    Подскажите, не могу определиться с айдишкой и классом в рекапче2, которая вылазит во фрейме!
    перебрал не мало вариантов…

    Ответить
  23. Здравствуйте. Подскажите а возможно ли таким способом отправлять на капмонстр капчу ? Или можете подсказать какой-либо другой способ ?

    Ответить
  24. Привет. Все время вылазит ошибка вот на эти строки
    } catch (e) {
    out = {
    isSolved: false,
    hasError: true,
    errorText: e.name
    };

    Ответить
  25. Здравсте. ) Подскажи почему консоль браузера не воспринимает var переменные? То есть когда пишу:
    var xhr = new XMLHttpRequestT();
    \\ Пишет undefined
    xhr = new XMLHttpRequestT();
    \\ Все создается без проблем.

    Ответить
    • И еще вопросик, строка 128 получаем джейсон текст, парсим — получаем объект. Стр 130 вызываешь от объекта .request. Внимание вопрос!) Не нашел в нете точного значения request, где то написано что это nodejs , где-то написано что это метод , тогда почему нет скобок? Поясни пож.

      Ответить
  26. Добрый день. Подскажите как реализовать разгадывание рекапчи Вашим способов в iframe окне (конкретно в вк.)
    Заранее спасибо

    Ответить
  27. иногда на 144 строчке выдает ошибку.
    } catch (e) {
    out = {
    isSolved: false,
    hasError: true,
    errorText: e.name //144 строка
    };

    Ответить
  28. Что делать если например FRAME F= любое значение принимает при каждой перезагрузки страницы? Как поставить постоянное значение?

    Ответить
  29. Добрый вечер ! Судя по отсутствующим ответам от автора сайта к обращавшимся за последние 9 месяцев , следует ли что Nagibaka больше не поддерживает эту тему ? Очень много насущных вопросов прозвучало ,на которые не последовало ответов от автора , ошибка на 144 строке скрипта — errorText: e.name — похоже у многих скрипт на ней вылетает ,а также — «что нужно поменять в коде, чтобы использовать при разгадывании рекапчи2 на CapMonster 2 расположенного на удаленном сервере ?». Ждем не дождемся возвращения уважаемого многими автора под ником Nagibaka !)

    Ответить

Оставить комментарий