Для распознавания кода на изображении (капчи) потребуется аккаунт в системе 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); ПолучитьСимволыСКапчи(КапчаИД); Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Капча не распознана. Код ошибки: " + ТекстОтветаСимволыСКапчи; Сообщение.Сообщить(); КонецЕсли; Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не удалось установить соединение и получить символы с капчи. " + ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; КонецПроцедуры