Так как довольно часто приходится пользоваться услугами сервиса
Модуль написан на Дельфи, для работы с HTTP-протоколом используется компонент Synapse. Последнюю версию этого компонента (на момент написания это текста релиз номер 39 не обновлялся аж с 2009 года, но наверно разработчику просто больше нечего добавить в свой проект, он и так отлично работает) можно скачать по ссылке
Модуль может распознавать каптчу из файла, по ссылке, а также из потока (TStream).
Описание функций:
Функция RecognizeAG – умеет распознавать картинку используя сервис AntiGate.com из потока, по URL-ссылке и из картинки на компьютере.
1 2 3 4 5 6 7 8 |
// Распознать картинку их потока function RecognizeAG(ImageData: TMemoryStream; AGKey: String; var CaptchaRes: String; MinLen: integer=0; MaxLen: integer=0; Numeric: integer=0; Phrase: integer=0; RegSense: integer=0; Calc: integer=0; Russian: integer=0): Integer; overload; // Распознать картинку из файла function RecognizeAG(ImageFile: String; AGKey: String; var CaptchaRes: String; MinLen: integer=0; MaxLen: integer=0; Numeric: integer=0; Phrase: integer=0; RegSense: integer=0; Calc: integer=0; Russian: integer=0): Integer; overload; // Распознать картинку по ссылке function RecognizeAG(ImageURL: String; AGKey: String; var CaptchaRes: String; Cookies: String; MinLen: integer=0; MaxLen: integer=0; Numeric: integer=0; Phrase: integer=0; RegSense: integer=0; Calc: integer=0; Russian: integer=0): Integer; overload; |
Параметры функции:
Функция возвращает:
Функция GetBalanceAG – выводит текущий баланс на сервисе AntiGate.com
1 2 |
// Получить ваш текущий денежный баланс function GetBalanceAG(AGKey: String): String; |
Параметры функции:
Функция возвращает:
Функция ReportBadAG – отправляет жалобу о неверно распознанной каптче в сервис AntiGate.com
1 2 |
// Пожаловаться на неправильно разгаданный текст function ReportBadAG(AGKey: String; CaptchaID: Integer): String; |
Параметры функции:
Функция возвращает:
Для использования модуля в своем проекте, достаточно положить файл AntiGate.pas в папку с проектом и прописать его в Uses. Пример использования функции:
1 2 3 4 5 6 7 8 |
procedure Test; var CaptchaID: integer; CaptchaText, AntiGateKey: String; begin AntiGateKey := 'c54fa68f4d5s6df245s4d5c1a4s5d8f4'; // Ключ не настоящий CaptchaID := RecognizeAG('c:\image.jpg', AntiGateKey, CaptchaText); ShowMessage(CaptchaText); end; |
В архиве с модулем прилагается два примера программы его использующей. Первое демо имеет оконный интерфейс, текст отгаданной каптчи выводиться в поле внизу окна, откуда его можно скопировать. Так же текст каптчи сохраняется в файл Result.txt:
Второе демо – консольное, работает через командную строку и выводит результат в консоль либо в файл:
Скачать AntiGate.rar (Размер: 289.7 KiB / Скачиваний: 5135)
Скачать synapse39.zip (Размер: 694.0 KiB / Скачиваний: 1348)
Большое спасибо! Интересный модуль и главное очень полезный. Давно использую антикапчу в своих проектах.
Добавил сайт в закладки. Буду ждать новых статей.
Подскажи, пожалуйста, как организовать запись текста капчи в .txt файл?
Я могу немного изменить демку, добавить командную строку и возможность записи в txt-файл
Добавил сохранение в текстовый файл и отдельной демкой пример с командной строкой
А можете переделать этот модуль для работы с сервисом anti-captcha.net?
Там надо заменить URL передачи картинки на сервис и получения результата
Вряд ли, этот сервис не такой известный, как два вышеприведенных, тем более переделать данный исходник под Ваш сервис совсем несложно. Поменять имя сервера и расширение php на asp.
Прога может только jpg капчи распознать?
Нет, еще gif и png может распознавать.
ах да, я не правильно ссылку вставлял.
Теперь проблема распознаю капчу которую генерирует php скрипт и отправляю ответ post запросом. Но он сново требует новую капчу.
Получается прога делает один запрос и получает капчу и распознает, потом обрывает сессию или как? Там при каждом новом запросе другаю капча
Вообще это только модуль для распознавания каптчи, как Вы реализуете запрос каптчи в своей программе – это уже Ваше дело, скорее всего надо куки получать.
а у меня и BMP неплохо обрабатывает
А можно показать примерчик работы отправки капчи из потока?)
Распознавание из потока Вы можете увидеть в самом модуле AntiGate.pas посмотрите функцию :
// Распознать картинку по ссылке
function RecognizeAG
она именно так и работает
Да, я видел, спасибо за хороший модуль, все понятно закомментировано, я просто походу сам поток картинки ему криво передаю, выдается ошибка с antigate.com ERROR_ZERO_CAPTCHA_FILESIZE. Раньше просто файл передавал, все работало, но решил с помощью потока эт дело замутить и не разберусь, делаю это так:
var controlRange: Olevariant;
kartinka:TMemoryStream;
img, captchaID:Integer;
rez, keyAG:String;
....
OleInitialize(nil);
controlRange:=Browser.OleObject.Document.Frames.Item(0).Document.body.createControlRange; controlRange.add(browser.OleObject.Document.Frames.Item(0).Document.Images.Item(img));
controlRange.execCommand('Copy', False, EmptyParam);
if ClipBoard.HasFormat(CF_BITMAP) then
Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0);
OleUninitialize;
kartinka:= TMemorystream.Create;
image1.Picture.bitmap.SaveToStream (kartinka);
Application.ProcessMessages;
captchaID:=RecognizeAG(kartinka,keyAG,rez);
Ну вот, в этом коде изображение сперва из веббраузера копируется в буфер, а потом из буфера в image, и вот из него уже хочу отправить поток. Напрямую ссылку к капче не передать так как путь к ней ‘http://сайт.ру/captcha.php’ поэтому приходится высчитывать номер картинки капчи в веббраузере. Поможете разобраться с этой проблемой
Даже в случае с путем captcha.php тоже должно работать, возможно надо куки передавать. Если скинете адрес сайта могу посмотреть
Здесь ты картинку не правильно в поток передаешь вместо
image1.Picture.Bitmap.SaveToStream(kartinka);
надо
image1.Picture.Graphic.SaveToStream(kartinka);
Все разобрался!!! Я сразу в твоей функции function RecognizeAG указал мой поток, тогда пришел результат, а просто передав в параметрах поток картинки че то не хочет работать
А еще такой вопрос, а для чего в function RecognizeAG, объявляется и создается поток Image? А то я ее убрал, в параметрах ж у тебя уже объявлен поток ImageData, я ему и присваиваю поток своей картинки, и чуть подправил в коде, изменил image на imagedata, незнай правильно так или нет, но работает.)
Точно не помню для чего создавал, то ли для отлова ошибок при не существовании потока, или просто когда код переделывал в функцию забыл убрать
А ну да точно, у тебя там все как положено, создается поток, используется, потом уничтожается, эт я все не возьму в привычку чистить за собой). Блин я все не разберусь полностью с использованием synapse, раньше всегда юзал компоненты indy, и у меня на нем все работало. А пишут что synapse в разы лучше работает, чем он, вот и хочу переделать свои программы под synapse. А щас у меня вызывает сложность даже тупо отправить файл на сервер, или проверить на существование файла в инете через него, хоть примеров куча в инете, или дажь твой пример взять отправку капчи на сервер, то там код такой замудренный по сравнению отправки через indy, что не пойму что там важно, а что не нужно при простой отправки.))
Получилось через ссылку отправлять капчу если она типа captcha.php, оказалось там не так все замудренно, а просто скопировать куки из webbrowser в куки synapse, синапс хоть и качает совсем другую картинку, не ту что отображена в данный момент в веббраузере, но после ввода все оказывается верным)
Ну да, все верно, просто синапс заново перекачивает эту картинку и та что видна в браузере уже не действительна
Извини, что щас не по теме напишу, видно ты многое знаешь в программировании, хочу спросить, как можно выдрать нужное значение переменной из скрипта в webbrowser, к примеру в нижеприведенном коде, функция как я понял добавляет последнии сообщения в чат и вот как узнать значение переменной txt?
function add_chat(txt) { // Добавить сообщение в окно чата _chat.document.getElementById('chat').innerHTML=_chat.document.getElementById('chat').innerHTML+txt;
_chat.window.scrollBy(0, 65000);
А то у меня получается получить содержимое всего чата, а мне нужно знать содержимое именно последних добавлений которые хранятся в переменной txt, чтобы сканировать ее и выполнять определенные действия.
Честно говоря, не знаю, с компонентом WebBrowser почти не работал. Ну а так полностью страницу бы неплохо было увидеть, чтобы понять как javascript-функция срабатывает, может txt и содержит весь текст чата сразу. Если получается прочитать весь чат, попробуй выделять из него именно последние сообщения, например по дате, если она указана. Это можно сделать с помощью регулярных выражений, либо функций pos/copy
С помощью регулярных выражений можно, но тогда процессор в геометрической прогрессии будет нагружаться, то что в чате текста все прибавляется. Полную страницу не проблема показать, она так состоит из 7 фреймов, скрипты работы с чатом и др. находятся на главной странице, ее залилhttp://upwap.ru/2096119
если что и страницы фреймов покажу, но там вроде ничего интересного нет)
Пробую выполнить скрипт сам
Webbrowser1.OleObject.Document.parentWindow.add_chat('любой текст');
Добавляется в чат это сообщение, но его походу никто не видит, просто отображается текст в чате ни от кого, что доказывает что именно в txt хранятся последнии сообщения)
Вот еще нашел англоязычный сайтhttp://www.delphidabbler.com/articles?article=21 на тему как запускать скрипты и получать их результат из webbrowser, там пример приведен, только в этом примере в скрипт передается параметр и получаем результат выполнения скрипта, никак не догадаюсь как это может помочь моей проблеме.
Ну в общем, нашел я тот сайт, о котором ты говоришь, вообще при отправлении сообщения в чат выполняется POST-запрос на следующий адрес
/game.php?fun=m_chat_add&map=1
и содержит он такие параметры:
ToName=&txt=cообщение&x=11&y=6
но если ты работаешь через компонент WebBrowser то тебе наверно лучше переходить на этот фрейм:
/game.php?fun=m_input&map=1
заполнять поля и нажимать кнопку “ОК”.
P.S.: почему-то такое ощущение, что через браузер тоже сообщение не сохраняется. Я написал несколько сообщений через Opera обновил страницу и они пропали.
Так при нажатии на кнопку ОК я передам только свое сообщение в чат, а где вот хранятся все новые сообщения , в чат же не заново загружаются все сообщения, а только последнии, типа отправляются сообщения игроков на сервер, а потом сервер через определенные промежутки передает новые в чат. В обработчике BeforeNavigate2 смотрел, в чат добавляются новые сообщения именно когда навигация происходит на адрес
'/game.php?fun=m_chat_work&map=2'
целевой фрейм _chat_work
А вот когда я ввожу свое сообщение и нажимаю ОК, то навигация происходит в
/game.php?fun=m_chat_add&map=1
целевой фрейм _chat_addВот такая система)
Щас еще через синапс с указанием кук скачал страницу ‘/game.php?fun=m_chat_work&map=2′ выдало мне новые сообщения которых еще нет в чате, но то сообщение что я получил через синапс оно в чате уже не отображается, тут уже все ясно как что происходит, но вот как эти данные перехватить в переменную с webbrowser, можно ж полюбому эт сделать…
А когда передается таким образом из моей программы ключ доступа к сервису антикапча
HTTP.HTTPMethod('GET', 'http://' + AntiServer + '/res.php?key=' +
AGKey + '&action=get&id=' + CaptchaID
Его через сниффер можно заполучить? А то если да, то не подскажешь как мне передачу зашифровать, чтобы не смогли мой ключ халявно использовать)
Если софт “белый”, то просто сделай в настройках пусть каждый свой ключ вводит. Если же у тебя софт, который должен работать скрытно, то тут надо какой-то другой выход искать.
Чтобы шифровать трафик надо работать через ssl-соединение (https), но, насколько я знаю, antigate не поддерживает такое соединение.
Можно попробовать сделать промежуточный скрипт для распознавания каптчи и положить его на свой сервер. Т.е. программа будет обращаться к твоему серверу без ключа, просто передавая ему картинку, а уже скрипт на этом сервере будет отсылать ее на антигейт и отдавать ответ твоей программе.
А точно! Спасибо, хорошая идея, если ума хватит так замутить, то будет прекрасно. У меня просто бот для игры, и замутил два способа для доступа к сервису антикапча, оплачивая просто на мой счет и получать определенное количество автовводов или идти на сайт антигейт, региться и вводить ключ. Большая часть выбирают через меня и вот боюсь что когда народу будет много пользоваться моей программой, за всеми не уследишь и какой нить прохаванный просниффит мою прогу и заполучит ключ, поэтому нужно сразу присекать такие уязвимости) я как чуть заработаю тебя отблагодарю)
Мыслишка появилась, даже если замутить отправку мне на сервак только куки пользователя, а мой скрипт на серваке будет скачивать капчу, отправлять их в сервис, получать результат и отправлять ответ, так дажь юзеру сокращу чуть трафик)
Ну да, если программа с одним сайтом работает, то можно и так сделать. Потом, если вдруг они адрес каптчи изменят, то тебе достаточно будет в скрипте поменять его и все, не придется обновлять программу всем пользователям.
код просто крах…
Ну я сразу сказал, что я быдлокодер
Если не трудно укажи на ошибки.
Пример очень пригодился. Достаточно легко за вечер создал программу-автоголосовалку для сайта, в котором голосовать можно не чаще 30 секунд, и вводить каптчу. Приделал к примеру вэббраузер, по таймерам обновляется сайт, виртуальными клавишами и мышью сохраняется каптча (правая кнопка мыши, сохранить рисунок как, сохраняется в BMP), рапознается, вставляется куда надо, голосуется. Обрабатываются сообщения об ошибках, если каптча пришла неверна. Даже пожаловаться можно, нажав клавишу. буду унифицировать, чтобы легко настраивалась под другие сайты. Спасибо за пример.
Хорошая работа. Вот хотел встроить в свою программу подобное решение (думал организовать в пост запросе отправку и гет запросом парсить результат, что в принципе просто), но ваш модуль понравился. Ценю такую работу. Буду пользоваться. Спасибо.
Как можно считать капчу с сайта 3s-business.info/users/sign_in
Помогите с примером
Картинка каждый раз меняет название, поэтому нужно сначала загружать эту страницу, а потом парсить название картинки
src="/captcha/78075ae71bfe.png"
Просто супер! Но вот столкнулся с такой проблемой, в ваших исходниках поправил что передаю картинку с Кириллицей но вместо кириллицы в окне результата появляется абракадабра. Пример: на картинке изображено 4ПЭ возвращается 4Р_Р-. Может с кодировкой что то не так? В другом примере, было 21БЭ пришло 21Р‘Р-. На каждую буквы приходит по 2 символа. Не подскажите в чем дело?
Заранее огромное спасибо и за статью особенно. Очень нужная вещь!
Да это кодировка UTF-8 не верно обрабатывается
Спасибо огромное за ответ! Уже поправил это место и все заработало! Очень благодарен, спасибо за статью и примеры.
Здравствуйте уважаемый Geograph! Если можно хотел бы попросить у вас помощи. Для работы с сайтом я использую компонент Webbrowser и с его помощью получаю страничку. На страничке есть каптча, зная id элемента (рисунок каптчи), я получаю ссылку на него: a:=webbrowser1.oleobject.document.getelementbyid(‘ctl00$ctl00$main$cphLeft$ctlSearch$ctlCaptcha$captcha$ig’); ссылка на картинку есть, а как из ссылки получить значение src=’…’
Если вам не трудно подскажите пожалуйста. Спасибо вам за статью очень содержательно и доходчиво. Заранее спасибо за помощь!
Спасибо, что то голова совсем не работает… Уже нашел a.src. Спасибо.
Здравствуйте, Geograph, спасибо за модуль, только вот проблем ка такая как сделать, так что бы кнопки распознать имели разное имя или убрать одну “распознать по ссылке”, задаю поиск объекта (нажать кнопку “распознать” по файлу, а находит и исполняет распознать по ссылке. (в программировании и языке 0 )
Благодарю за внимание!
Там же и так есть отдельная кнопка рядом с выбором файла. Вы по ней нажимаете?
Добрый день!!! Все замечательно работает, но можно ли организовать работу через прокси сервер… Заранее спасибо…
Да, в модуле используется компонент THTTPSend из Synapse
Прокси добавляется достаточно просто, можете добавить после Create у HTTP:
HTTP.ProxyHost = '';
HTTP.ProxyPort = '';
HTTP.ProxyUser = '';
HTTP.ProxyPass = '';
GetBalanceAG рабоатет, а вот RecognizeAG (распознать картинку из файла) выдает ошибку: Socket error #11001. Host not found.
разобрался…. сеньк
подскажите пожалуйста…мне нужна чтобы во время распознования программа не висела..
подскажите где подправить.я что то не нахожу где это…sleep(1000) убрал вроде бы,все равно висит.
Спасибо.
Чтобы программа “не висела” нужно выделять распознавание в отдельный поток. Гугулите “многопоточность в Delphi”
С сайта habarovsk.drom.ru/nissan/tiida/11455990.html капчу распознает неправильно
я так понимаю, что данная программа не поддерживает русский текст?
Это всего лишь модуль, компонент для включения в Вашу программу, а с ним я просто выложил демку, как пример использования. И да, модуль поддерживает параметр is_russian для этого в последнем параметре функции
RecognizeAG (Russian) надо поставить '1'.
Но русские капчи распознаются не очень хорошо, т.к. в сервисе antigate не очень много русскоязычных капчевбивальщиков.
Тестирование через сайт 2-ух картинок показало, что действительно не очень. Результат 17 и 128 секунд.
Что-то выдает 404 при скачивание
Спасибо за то, что сообщили – проблема на сервере с nginx’ом скоро будет решена
Сегодня модуль перестал работать, выдает ошибку Ошибка капчи: ERROR_IMAGE_TYPE_NOT_SUPPORTED
Только что проверил, все работает. Только часто выводит “ERROR_NO_SLOT_AVAILABLE”, т.к. сервис перегружен. Лечиться повышением ставки.
Видимо у Вас что-то с картинкой, в каком она формате?
У меня проблема с распознаванием капчи vk.com. Всё работала с вашим модулем 10 месяцев, а вот сегодня….http://antigate.com/in.php и в ответ такая ошибка ERROR_IMAGE_TYPE_NOT_SUPPORTED.
Визуально капча не изменилась такая же. Проснифил запросы программы – картинка капчи удачно скачивается с vk.com, дальше как обычно идет запрос отправки картинки на
Не могу понять в чем дело.
формат JFIF
Русскую капчу не разгадывает, приходит аброказябра
Отличное описание, да ещё и с примерами. Спасибо! Понажимал на всю рекламу и даже на счётчик лиру
не могли бы вы подсказать как решить проблему с кодировкой? а то не распознает русскую каптчу.
как установить Ваш модуль в браузере googl chrome, чтоб он заработал, существует ли установочный файл этого модуля?
Нет, этот модуль служит больше для программистов, для включения в проект на Delphi.
Наверное под Google Chrome уже существует что-то подобное попробуйте поискать.
выдаёт такую (AntiGate.pas(54,24) Fatal: Can not find unit HttpSend used by AntiGate.) ошибку в этой строке
(uses
SysUtils, Classes, HttpSend, SynAUtil; )
Нужен компонент Synapse
А как этот компонент поставить?
нашёл такую штуку. Можете её тоже написать?
http://antigate.com/load.php
статистика системы в реальном времени:
waiting: количество работников ожидающих капчу. Максимально показываемое число – 50.
load: процент загрузки работников
minbid: минимальная ставка необходимая для прохождения вашей капчи
averageRecognitionTime: среднее время (в секундах) за которое в данный момент разгадываются капчи
вот что у меня получилось. Подредактируйте
procedure TForm1.Button6Click(Sender: TObject);
var HTTP:THTTPSend;
begin
HTTP := THTTPSend.Create;
if HTTP.HTTPMethod(‘POST’, ‘http://antigate.com/load.php’) then
memo2.lines.LoadFromStream(HTTP.Document);
end;
POST-запрос тут не нужен, достаточно GET-запроса:
А какая разница между post и get ?
GET – ты просто запрашиваешь страницу, как будто в браузере открываешь
POST – ты отправляешь какие-то данные на сайт, это как в браузере ты набрал этот комментарий и нажал “Отправить”
Спасибо за статью! Но я столкнулся с проблемой. Приходит постоянно неверный ответ. Пробовал слать разные картинки и с цифрами и с буквами. Просто набрал в нете штук 5 картинок и проверил. Ни одна не правильно разгадана! Прошу помощи!
Если приходит именно ответ, а не ошибка начинающаяся с “ERROR_”, то значит, что работник сервиса не правильно разгадал капчу, возможно капча с русскими буквами.
Все разобрался. Дело в том что использовал ключи левые. Сейчас зарегистрировался сам, закинул 1$ и проверил. Все работает на ура! Спасибо за статью