gifts2017

Распознать код на изображении (капчи) с помощью 1С и сайта http://antigate.com/

Опубликовал Эдуард Петрович (eduardpetrovych) в раздел Программирование - Практика программирования

Нужно с помощь 1с распознать код на изображении (капчи). Решить данную проблему удалось используя API сайта http://antigate.com/panel.php?action=api

Для распознавания кода на изображении (капчи) потребуется аккаунт в системе antigate.

Регистрация аккаунта в системе antigate:

  1. Зайдите на сайт http://antigate.com/panel.php
  2. Заполните поля регистрационной формы и нажмите "регистрация"
  3. Войдите в систему
  4. Перейдите к пополнению баланса (финансы > пополнить баланс)
  5. Введите необходимую сумму (можно ввести 0.1)
  6. Следуйте указаниям системы.
Рекомендую выставлять ставку 2 (распознавание > ставки)
После регистрации и пополнения баланса перейдите к настройкам аккаунта (инструменты > настройки аккаунта).
Скопируйте ключ капчи(captcha ключ).
Теперь, когда у нас есть аккаунт в системе antigate и captcha ключ, приступим к разгадыванию кода на изображении(капчи):
  1. Нужно сохранить изображение(капчу);
  2. Отправить изображение(капчу) и получить идентификатор капчи;
  3. Получить символы с изображения(капчи).

1. Сохраняем изображение(капчу):

&НаКлиенте
Процедура СохранитьКартинкуКапчи()		
	СслкаНаКапчу = "Ваша ссылка на капчу";
	Сервер = "Ваш сервер";
	АдресРесурсаКапчи = СтрЗаменить(СслкаНаКапчу,Сервер ,"")
Попытка
		HTTP =  Новый HTTPСоединение(Сервер);
		ФайлРезультатаКапчи = ПолучитьИмяВременногоФайла("JPG");
		
		КапчаКартинка = Новый HTTPЗапрос(АдресРесурсаКапчи);
		КапчаКартинка.Заголовки.Вставить("Referer", Элементы.ПолеHTMLДокумента.Документ.url);
		КапчаКартинка.Заголовки.Вставить("User-Agent", Элементы.ПолеHTMLДокумента.ИнформацияПрограммыПросмотра);
		КапчаКартинка.Заголовки.Вставить("Cookie", Элементы.ПолеHTMLДокумента.Документ.cookie);
		ОтветКапчи = HTTP.Получить(КапчаКартинка);
		ДвоичныеДанные = ОтветКапчи.ПолучитьТелоКакДвоичныеДанные();
		
		Попытка 			
			ДвоичныеДанные.Записать(ФайлРезультатаКапчи);	
			КапчаИД = ФайлРезультатаКапчи;
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Картинка капчи записана. " + ФайлРезультатаКапчи;
			Сообщение.Сообщить();
				
			ОтправитьКапчуИПолучитьИДКапчи(ФайлРезультатаКапчи);//(следующий пункт №2)
		Исключение
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Картинка капчи не записана. ";
			Сообщение.Сообщить(); 
		КонецПопытки; 
			
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не удалось установить соединение и получить картинку капчи. " + ОписаниеОшибки();
		Сообщение.Сообщить(); 
	КонецПопытки;
КонецПроцедуры

2. Отправляем изображение(капчу) и получаем идентификатор капчи:

&НаКлиенте 
Процедура ОтправитьКапчуИПолучитьИДКапчи(ФайлРезультатаКапчи)
	Сервер = "antigate.com";
	АдресРесурса = "/in.php";
	Попытка
		HTTP =  Новый HTTPСоединение(Сервер);
		ФайлЗапроса = Новый Файл(ПолучитьИмяВременногоФайла("TXT"));
		
		Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
		
		ФайлОтправки = Новый ЗаписьТекста(ФайлЗапроса.ПолноеИмя, КодировкаТекста.UTF8, Символы.ПС, Ложь); 
	        //Определяем раздел двоичных данных 
		ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 
	        ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""method""" + Символы.ПС + Символы.ПС); 				
		ФайлОтправки.ЗаписатьСтроку("base64");
		
		ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 
	        ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""key""" + Символы.ПС + Символы.ПС); 				
		ФайлОтправки.ЗаписатьСтроку(XMLСтрока(СокрЛП(КлючАнтиКапчи)));
		
	        ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 
		ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""body"""); 
		ФайлОтправки.ЗаписатьСтроку("Content-Type: image/jpeg" + Символы.ПС + Символы.ПС); 
		СодержимоеФайла = Base64Строка(Новый ДвоичныеДанные(ФайлРезультатаКапчи));
		ФайлОтправки.ЗаписатьСтроку(СодержимоеФайла);
		
		ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 
	        ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""numeric""" + Символы.ПС + Символы.ПС); 				
		ФайлОтправки.ЗаписатьСтроку("1");
		
		//Завершение сообщения для сервера 
	        ФайлОтправки.ЗаписатьСтроку("--" + Boundary + "--"); 

	        ФайлОтправки.Закрыть(); 
		
		ЗаголовокHTTP = Новый Соответствие(); 
		//Обязательные поля заголовка 
		//Укажем формат данных Content-Type 
	        ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
		ЗаголовокHTTP.Вставить("Accept-Language", "ru");
		
		HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, ЗаголовокHTTP) ;
		HTTPЗапрос.УстановитьИмяФайлаТела(ФайлЗапроса.ПолноеИмя);
		
	        ФайлРезультата = ПолучитьИмяВременногоФайла("TXT");
		
		Ответ = HTTP.ОтправитьДляОбработки(HTTPЗапрос,ФайлРезультата);
		Ответ = Новый ТекстовыйДокумент();
		Ответ.Прочитать(ФайлРезультата, КодировкаТекста.UTF8);
		
		ТекстОтвета = Ответ.ПолучитьТекст();
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ТекстОтвета + " После передачи капчи ";
		Сообщение.Сообщить(); 
		Если Лев(ТекстОтвета,3) = "OK|" Тогда
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Ждем 10 секунд";
			Сообщение.Сообщить(); 
			
			Задержка(10);
			
			ПолучитьСимволыСКапчи(КапчаИД);
		ИначеЕсли ТекстОтвета = "ERROR_NO_SLOT_AVAILABLE" Тогда
			ОтправитьКапчуИПолучитьИДКапчи(ФайлРезультатаКапчи);	
		Иначе
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Капча отправлена, но есть ошибки. Код ошибки: " + ТекстОтвета;
			Сообщение.Сообщить();	
		КонецЕсли; 
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не удалось установить соединение и получить картинку капчи. " + ОписаниеОшибки();
		Сообщение.Сообщить(); 
	КонецПопытки;
КонецПроцедуры

3. Получаем символы с изображения(капчи):

&НаКлиенте 
Процедура ПолучитьСимволыСКапчи(КапчаИД)
	Сервер = "antigate.com";
	АдресРесурса = "/res.php?key="+КлючАнтиКапчи+"&action=get&id=" + КапчаИД;
	Попытка
		HTTP =  Новый HTTPСоединение(Сервер);
		ФайлРезультатаКапчиИД = ПолучитьИмяВременногоФайла("TXT");
		
		HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
		
		ОтветКапчиИД = HTTP.Получить(HTTPЗапрос,ФайлРезультатаКапчиИД);
		ОтветКапчиИД = Новый ТекстовыйДокумент();
		ОтветКапчиИД.Прочитать(ФайлРезультатаКапчиИД, КодировкаТекста.UTF8);
		
		ТекстОтветаСимволыСКапчи = ОтветКапчиИД.ПолучитьТекст();
		
		Если Лев(ТекстОтветаСимволыСКапчи,3) = "OK|" Тогда
			СимволыСКапчи = СокрЛП(СтрЗаменить(ТекстОтветаСимволыСКапчи,"OK|",""));
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = СимволыСКапчи + " - символы с капчи";
			Сообщение.Сообщить(); 
		ИначеЕсли СокрЛП(ТекстОтветаСимволыСКапчи) = "CAPCHA_NOT_READY" Тогда 
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "" + ТекстОтветаСимволыСКапчи + Символы.ПС + "Ждем еще 5 секунд";
			Сообщение.Сообщить(); 
			
			Задержка(5);
			ПолучитьСимволыСКапчи(КапчаИД);
		Иначе
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Капча не распознана. Код ошибки: " + ТекстОтветаСимволыСКапчи;
			Сообщение.Сообщить();	
		КонецЕсли;		
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не удалось установить соединение и получить символы с капчи. " + ОписаниеОшибки();
		Сообщение.Сообщить(); 	
	КонецПопытки;
КонецПроцедуры

См. также

Подписаться Добавить вознаграждение
Комментарии
1. OldthiefXXX OldthiefXXX (OldthiefXXX) 29.06.14 17:30
2. Сергей (seermak) 30.06.14 07:05
3. Эдуард Петрович (eduardpetrovych) 01.07.14 11:58
(1) OldthiefXXX, не нашел готового решения - разбирался сам. Вот тем что получилось делюсь со всеми.
4. Andrew Master (creatermc) 02.07.14 09:54

Не дурно, я бы сказал интересно.
5. Эдуард Петрович (eduardpetrovych) 02.07.14 18:57
Если у кого то есть другие решения моей задачи, прошу поделится если можете...буду рад ознакомится
6. Станислав Раташнюк (stanru1) 15.08.14 16:20
Сам изобретал такой же велосипед, и никак не хотел уходить ключ в антигейт. Благодаря этой обработке понял, где у меня была ошибка =) Спасибо!
7. Мищенко Вадим (vslimv) 27.01.15 07:43
(6) stanru1, Аналогичная ситуация)) Решил у себя небольшую проблемку.
Статье однозначно +. Автору спасибо, хоть и очень запоздало))
8. Agregad (Agregad) 10.03.15 13:31
Здравствуйте.
разве перед вызовом "ПолучитьСимволыСКапчи(КапчаИД);" не надо вырезать ИД с ответа?
9. Эдуард Петрович (eduardpetrovych) 14.03.15 00:25
(8) Agregad, ничего не нужно вырезать КапчаИД это сохраненная картинка капчи, её надо передать в Антигейт для распознавания
10. Виталий Трач (vitalya24) 31.05.15 23:01
Вам спасибо за публикацию, но вот сейчас переделыю на rucaptcha, параметры апи такие же 1 в 1, но не могу передать капчу пишет что ERROR_ZERO_CAPTCHA_FILESIZE, капча есть и ее размер 2-3 кб, и как пишут в описании апи уже кодирую юрл энкод. Но похоже не отправляется капча на сайт толком... может что-то подскажете?
11. Игорь Алексеев (1c_programmist) 05.07.15 12:40
Ооооо, крутая крутотень. Как раз ищу подобное. Большое спасибо. Сейчас тестирую
12. Капитан Немо (capitan) 12.03.16 21:34
Не взлетит.
Если запрашивать капчу с сервера - он вернет следующую картинку, а не ту которую надо ввести на странице запроса.
13. Эдуард Петрович (eduardpetrovych) 13.03.16 01:17
(12) capitan, в процедуре СохранитьКартинкуКапчи(), когда мы запрашываем картинку с сервера то мы передаем "Cookie" в HTTPЗапрос, без них возвращает новую картинку, а не ту с которой нужно ввести изображение, с ними возвращает нужную картинку.

P.S. Код полностью рабочий, работал он в этой обработке - Бот для он-лайн игры GanjaWars.ru (ГБот) , пока там не поменяли защиту, раньше нужно было ввести цыфры с картинки, а сейчас сопоставить две картинки - я это планирую доделать.
14. Капитан Немо (capitan) 10.05.16 14:46
А вот и реальная задачка ;)
https://egrul.nalog.ru/
Взлетит ?
15. Эдуард Петрович (eduardpetrovych) 10.05.16 18:46
(14) capitan, без проблем взлетит, нужно только правильную картинку отправить
16. Капитан Немо (capitan) 11.05.16 14:08
Есть очень полезное расширение конфигурации http://infostart.ru/public/510293/
Попробуйте в него добавить своим методом распознавание, а я своим.
Ваш проще, если он взлетит, то и чудесно.