Интерактивный ввод капчи

17.02.17

Интеграция - WEB-интеграция

Краткое описание того, что делать, если нужно получить некоторые данные с определенного сайта, требующего от пользователя ввода текстовой капчи.

Итак, перед нами некая страница сайта с формой и капчей. В данном примере будет рассмотрена страница проверки полисов РСА, для начала нам понадобится проверить, как именно реализовано "общение" пользователя с сайтом, а именно - какая структура данных отправляется на сервер при отправке формы и что выдает сервер в ответ. Для этого довольно удобно использовать браузер Firefox* с включенным дополнением Firebug* (как установить, можно найти на просторах интернета).

*в принципе можно использовать любой другой браузер с подобными инструментами разработчика, имеющими возможность показать отладочную информацию отправляемых web-запросов.

Запускаем Firebug нажатием F12, переходим в нем на панель "консоль" и пробуем отправить форму, заполнив необходимые поля случайными данными, капчу вводим правильно
в нашем примере отправка формы асинхронная (без перезагрузки страницы или перехода на другую страницу) и при отправке формы мы видим в консоли строку примерно такого содержания:

+ POST http://dkbm-web.autoins.ru/dkbm-web-1.0/osagovehicle.htm 200 OK 23ms

Разворачиваем, нажав на плюсик, чтобы увидеть подробности отправленного POST - запроса.
Здесь нас интересуют вкладки Post и Ответ:

- на вкладке Post видим:

Параметры         application/x-www-form-urlencoded
answer fd31g (указанный нами текст капчи)
dateRequest 01.01.2017
numberOsago 1111111111
serialOsago ЕЕЕ
...

имена этих параметров понадобятся нам для программной отправки формы.

- на вкладке Ответ видим строку, представляющую из себя JSON-кодированный объект:

{"insurerName":null,"bodyNumber":null,"chassisNumber":null,"licensePlate":null,"policyStatus":null,"vin" :null,"errorMessage":null,"warningMessage":"Сведения о полисе ОСАГО с указанными серией и номером не найдены","errorId":0,"validCaptcha":true}

Отправим форму еще раз, только уже с не правильно указанной капчей, чтобы потом программно отловить эту ошибку и сообщить пользователю.
Увидим ответ:

{"insurerName":null,"bodyNumber":null,"chassisNumber":null,"licensePlate":null,"policyStatus":null,"vin" :null,"errorMessage":null,"warningMessage":null,"errorId":0,"validCaptcha":false}

Очевидно, что в отлове можно будет основываться на значение ключа validCaptcha.

Казалось бы вот и все, но нет, чтобы механизм капчи работал, нам нужно узнать как хранится идентификатор нашей сессии, иначе сервер не будет знать какую до этого капчу он нам выдал и, соответственно, не сможет определить, верно ли мы ее ввели.
Переходим в firebug на панель Cookies и берем оттуда все параметры.
в данном примере параметр всего один - "JSESSIONID" с некоторым значением. Значение это нам не понадобятся, т.к. для нашего http-запроса его будет назначать сам сервер сайта.

Ну и конечно же нам нужно получить адрес картинки-капчи: нажимаем по картинке правой кнопкой мыши -> Исследовать элемент с помощью Firebug. На панели HTML автоматически находится и подсвечивается нужный нам кусок кода <img id="captcha" name="captcha" src="simpleCaptcha.png?0.7484971124912407"> - кликаем по нему правой кнопкой - Открыть в новой вкладке. В свежеоткрытой вкладке пробуем убрать из адреса нашей картинки все, что после знака "?", вместе с самим знаком и переходим по новому адресу. В нашем примере капча работает, значит GET-параметры после адреса картинки не обязательны (в данном случае околослучайный GET-параметр нужен для предотвращения кэширования картинки браузерами).

Что мы имеем в итоге:

При заходе на страницу, сервер дает нам идентификатор сессии "JSESSIONID", генерирует некую картинку-капчу "simpleCaptcha.png" из случайного строкового кода расшифровки и ждет от нас форму с этим кодом расшифровки. При получении формы с кодом сервер проверяет его соответствие прошлому сгенерированному, и если они не соответствуют то выдает соответствующую ошибку. Если код верный, далее идут уже проверки другого уровня, например, валидные ли были отправлены данные и т.п.

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

Теперь можно перейти к реализации.

Создадим форму с реквизитами (все строкового типа, неограниченной длины):

  • АдресСервера
  • ПутьДоСтраницыЗапроса
  • ПутьДоКартинкиКапчи
  • ИмяПараметраSESSID
  • ТекстКапчи
  • Результат
  • Капча

а также реквизиты для соответствующих отправляемых параметров

  • СерияПолиса для "serialOsago"
  • НомерПолиса для "numberOsago"
  • ДатаПроверки для "dateRequest"

Разместим реквизиты на форме, при этом вид поля, связанного с реквизитом "Капча" укажем как "Поле картинки"

При открытии формы нам нужно установить соединение с сервером, получить идентификатор сессии и картинку капчи

&НаКлиенте
Процедура ПриОткрытии()
	АдресСервера = "dkbm-web.autoins.ru";
	ПутьДоСтраницыЗапроса = "/dkbm-web-1.0/osagovehicle.htm";
	ПутьДоКартинкиКапчи = "/dkbm-web-1.0/simpleCaptcha.png";
	ИмяПараметраSESSID = "JSESSIONID";
	
	НачатьСессию();
	ПолучитьКапчу();
КонецПроцедуры

Начав сессию, запишем в реквизит формы SESSID значение полученного идентификатора

&НаКлиенте
Процедура НачатьСессию()
	
	Соединение = Новый HTTPСоединение(АдресСервера); 
	
	Ответ = Соединение.GET(Новый HTTPЗапрос(ПутьДоСтраницыЗапроса));
	
	мстр = СтрЗаменить(Ответ.Заголовки["Set-Cookie"], ";",Символы.ПС);
	Для нСтр = 1 по СтрЧислоСтрок(мстр) Цикл
		тСтр = СтрПолучитьСтроку(мстр,нСтр);
		Если Найти(тСтр,ИмяПараметраSESSID) > 0 Тогда
			SESSID = СокрЛП(СтрЗаменить(СтрЗаменить(тСтр,ИмяПараметраSESSID,""),"=",""));
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Получим картинку капчи и отобразим ее на форме

&НаКлиенте
Процедура ПолучитьКапчу()
	
	Соединение = Новый HTTPСоединение(АдресСервера);
	
	Заголовки = Новый Соответствие();
	Заголовки.Вставить("Accept","application/json");
	Заголовки.Вставить("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	Заголовки.Вставить("Connection","keep-alive");
	Заголовки.Вставить("Host",АдресСервера);
	Заголовки.Вставить("Referer",АдресСервера+ПутьДоСтраницыЗапроса);
	Заголовки.Вставить("Cookie",ИмяПараметраSESSID+"="+SESSID);

	Ответ = Соединение.GET(Новый HTTPЗапрос(ПутьДоКартинкиКапчи,Заголовки));
	
	Капча = ПоместитьВоВременноеХранилище(Ответ.ПолучитьТелоКакДвоичныеДанные(), УникальныйИдентификатор);

КонецПроцедуры

Далее конечному пользователю остается только ввести данные и проверить результат

&НаКлиенте
Процедура Проверить(Команда)
	Соединение = Новый HTTPСоединение(АдресСервера);
	
	Заголовки = Новый Соответствие();
	Заголовки.Вставить("Accept","application/json");
	Заголовки.Вставить("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	Заголовки.Вставить("Connection","keep-alive");
	Заголовки.Вставить("Host",АдресСервера);
	Заголовки.Вставить("Referer",АдресСервера+ПутьДоСтраницыЗапроса);
	Заголовки.Вставить("Cookie",ИмяПараметраSESSID+"="+SESSID);
	
	ПараметрыЗапроса = Новый Структура();
	
	ПараметрыЗапроса.Вставить("serialOsago",СерияПолиса);
	ПараметрыЗапроса.Вставить("numberOsago",НомерПолиса);
	ПараметрыЗапроса.Вставить("dateRequest",ДатаПроверки);
	ПараметрыЗапроса.Вставить("answer",ТекстКапчи);
	
	СодержимоеЗапроса = Новый HTTPЗапрос(ПутьДоСтраницыЗапроса, Заголовки);
	СодержимоеЗапроса.УстановитьТелоИзСтроки(СтрСоединитьСтруктуру(ПараметрыЗапроса,"&","="));
	
	Ответ = Соединение.POST(СодержимоеЗапроса);
	
	Результат = Ответ.ПолучитьТелоКакСтроку();
	
	ТекстКапчи = "";
	
	ПолучитьКапчу();
	
КонецПроцедуры
Функция СтрСоединитьСтруктуру(Структура, РазделительЭлементов="", РазделительКлючЗначение="", ВставлятьРазделительКлючаЗначенияПриПустомЗначении=Истина) Экспорт
	Строка = "";
	Если ТипЗнч(Структура) = Тип("Структура") ИЛИ ТипЗнч(Структура) = ТИП("Соответствие") Тогда
		Для Каждого Элемент Из Структура Цикл
			Строка = "" + Строка + Элемент.Ключ
				+ ?(ЗначениеЗаполнено(Элемент.Значение) ИЛИ ВставлятьРазделительКлючаЗначенияПриПустомЗначении
					,РазделительКлючЗначение + Элемент.Значение
					,""
				)
				+ РазделительЭлементов;
		КонецЦикла;
	Иначе
		Возврат Ложь;
	КонецЕсли;
	Возврат Лев(Строка, СтрДлина(Строка)-СтрДлина(РазделительЭлементов));
КонецФункции

- в поле результат отобразится ответ в виде строки JSON-кодированного объекта, который можно распарсить соответствующими средствами 1С.

Для удобства работы с JSON создадим еще пару функций-прослоек

Функция json_decode(Строка,ИменаСвойствСоЗначениемДата=Неопределено) Экспорт	
	ЧтениеJSON = Новый ЧтениеJSON();
	ЧтениеJSON.УстановитьСтроку(Строка);
	Результат = ПрочитатьJSON(ЧтениеJSON,,ИменаСвойствСоЗначениемДата);
	ЧтениеJSON.Закрыть();
	Возврат Результат;
КонецФункции

Функция json_encode(Знач Данные) Экспорт
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,,,ЭкранированиеСимволовJSON.СимволыВнеASCII,Истина,Истина,Истина,Истина));	
	ЗаписатьJSON(ЗаписьJSON,Данные,,"ВСтроку",ЭтаФорма);
	Возврат ЗаписьJSON.Закрыть();
КонецФункции

Функция ВСтроку(Свойство,Значение,ДополнительныеПараметры,Отказ) Экспорт
	Возврат ""+Значение;
КонецФункции

Теперь, получив нужные значения, можно использовать их порграммно для тех или иных целей. Например так:

Попытка
	СтруктураРезультата = json_encode(Результат);
	
	Сообщения = СтруктураРезультата.errorMessage+СтруктураРезультата.warningMessage;
	Если ЗначениеЗаполнено(Сообщения) Тогда
		Сообщить(Сообщения);
	КонецЕсли;
	
	Если НЕ СтруктураРезультата.validCaptcha Тогда
		Сообщить("Капча введена не правильно");
	Иначе
		Сообщить(СтруктураРезультата.policyStatus);
	КонецЕсли;
Исключение
	Сообщить(ОписаниеОшибки());
КонецПопытки;

По этому же принципу, немного доработав код, можно реализовать, например, долговременную авторизацию на каком-либо сайте (типа функции "запомнить меня") , имеющем капчу на форме входа. Для этого также понадобится узнать имя параметра сессии, где хранится ее идентификатор,  проанализировать принцип работы  этого самого функционала "запомнить меня", зайдя на сайт с включенной функцие и с выключенной и сравнив состав cookie в обоих случаях, и, получив необходимое имя параметра cookie хранить его значение в базе и т.д.

captcha капча интерактивный ввод

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    17802    19    22    

17

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    19886    13    17    

17

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    14437    42    8    

18

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    1208    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VitaliyCeban 465 23.02.17 11:36 Сейчас в теме
Осталось прикрутить антигейт (лёгкий вариант, но медленный, в среднем 15 секунд на распознавание, неприемлемо) или искусственную нейронную сеть, для автораспознавания, благо капча относительно легкая.
unmensch; +1 Ответить
2. senkin 21.09.17 12:18 Сейчас в теме
А можно у Вас попросить готовую обработку? И если возможно, то заказать обработку на Проверку КБМ с этого же сайта?
3. gaabora 46 22.09.17 19:55 Сейчас в теме
(2)
Есть одна небольшая проблема - сайт автоинс теперь использует не ту примитивную капчу, что была описана в статье, а гугл-капчу, основанную на более сложном в плане интерактива принципе, чем распознавание человеком текста с одной картинки ... а чтобы реализовать работу с гугловской капчей скорее всего придется переписывать код с нуля.
4. пользователь 25.08.18 06:22
Сообщение было скрыто модератором.
...
5. пользователь 25.08.18 06:22
Сообщение было скрыто модератором.
...
7. пользователь 24.05.23 06:05
Сообщение было скрыто модератором.
...
8. пользователь 24.05.23 06:57
Сообщение было скрыто модератором.
...
Оставьте свое сообщение