Распознать код на изображении (капчи) с помощью 1С и сайта http://antigate.com/
Нужно с помощь 1с распознать код на изображении (капчи). Решить данную проблему удалось используя API сайта http://antigate.com/panel.php?action=api
- Описание
- Подробнее
Описание
Для распознавания кода на изображении (капчи) потребуется аккаунт в системе antigate.Регистрация аккаунта в системе antigate:
- Зайдите на сайт http://antigate.com/panel.php
- Заполните поля регистрационной формы и нажмите «регистрация»
- Войдите в систему
- Перейдите к пополнению баланса (финансы > пополнить баланс)
- Введите необходимую сумму (можно ввести 0.1)
- Следуйте указаниям системы.
Рекомендую выставлять ставку 2 (распознавание > ставки)После регистрации и пополнения баланса перейдите к настройкам аккаунта (инструменты > настройки аккаунта).Скопируйте ключ капчи(captcha ключ).Теперь, когда у нас есть аккаунт в системе antigate и captcha ключ, приступим к разгадыванию кода на изображении(капчи):- Нужно сохранить изображение(капчу);
- Отправить изображение(капчу) и получить идентификатор капчи;
- Получить символы с изображения(капчи).
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);
ПолучитьСимволыСКапчи(КапчаИД);
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Капча не распознана. Код ошибки: " + ТекстОтветаСимволыСКапчи;
Сообщение.Сообщить();
КонецЕсли;
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось установить соединение и получить символы с капчи. " + ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
КонецПроцедуры
&НаКлиенте Процедура ОтправитьКапчуИПолучитьИДКапчи(ФайлРезультатаКапчи) Сервер = "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" Тогда ОтправитьКапчуИПолучитьИДКапчи(ФайлРезультатаКапчи); Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Капча отправлена, но есть ошибки. Код ошибки: " + ТекстОтвета; Сообщение.Сообщить(); КонецЕсли; Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не удалось установить соединение и получить картинку капчи. " + ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; КонецПроцедуры

