Delphi → Компонент Antigate для Delphi

Окт 24, 2010


Надоело постоянно копировать блок кода, отвечающего за распознавание текста с картинки (каптчи), поэтому быстро набросал отдельный модуль для работы через сервис antigate.com. О том как его использовать, читайте далее...



Конструктор Create

Конструктор создает объект класса TAntigate.

constructor Create; overload;

Создает экземпляр класса без дополнительных параметров.

constructor Create(AKey: string); overload;

Создает экземпляр класса, в качестве аргумента AKey указывается ключ сервиса.

constructor Create(AParam: TAntiParam); overload;

Создает экземпляр класса, в качестве аргумента AParam указывается указатель на структуру TAntiParam.

Функция Recognize

Запускает распознавание текста с картинки.

function Recognize: string;

Распознает картинку и возвращает распознанный текст.

Процедура LoadFromFile

Загрузка распознаваемой картинки из файла.

procedure LoadFromFile(AFileName: string);

Загружается файл для распознавания, в качестве параметра AFileName путь до файла.

Процедура LoadFromStream

Загрузка распознаваемой картинки из потока.

procedure LoadFromStream(AFileName: string; AStream: TStream);

Загружается файл для распознавания, в качестве параметров: AFileName - имя файла, AStream - поток данных.

Функция GetBalance

Получение текущего баланса на сервисе.

function GetBalance: string;

Функция возвращает текущий баланс сервиса.

Процедура Abuse

Жалоба на последнюю распознанную каптчу.

procedure Abuse;

Жалуется на последнюю некорректно разгаданную каптчу.

Свойство OnEvent

Событие возникающее при появлении ошибок при распознавании.

property OnEvent: TEvent read FEvent write FEvent;

Свойство в качестве параметра принимает процедуру (событие).

Свойство Key

Задает ключ к antigate.com, если в конструкторе он не был указан.

property Key: string read FKey write FKey;

Свойство в качестве параметра принимает ключ сервиса.

Свойство Phrase

Указывает, что на картинке более одного слова.

property Phrase: integer read FPhrase write FPhrase;

Свойство может принимать следующие значения:
0 - (default) одно слово,
1 - более одного слова

Свойство Regsens

Указывает, что текст зависит от регистра букв.

property Regsens: integer read FRegsens write FRegsens;

Свойство может принимать следующие значения:
0 - (default) не чувствителен к регистру,
1 - чувствителен к регистру

Свойство Calc

Указывает, что цифры на картинке должны быть сложены арифметически.

property Calc: integer read FCalc write FCalc;

Свойство может принимать следующие значения:
0 - (default) не складывать,
1 - складывать арифметически

Свойство Numeric

Указывает, что текст состоит только из цифр или букв.

property Numeric: integer read FNumeric write FNumeric;

Свойство может принимать следующие значения:
0 - (default) возможны буквы и цифры,
1 - только цифры,
2 - только буквы

Свойство Russian

Указывает, что на картинки русские буквы.

property Russian: integer read FRussian write FRussian;

Свойство может принимать следующие значения:
0 - (default) на любом языке,
1 - на русском языке,
2 - на русском и английском языке

Свойство MinLen

Устанавливает минимальное число символов на картинке.

property MinLen: integer read FMinLen write FMinLen;

Свойство может принимать следующие значения:
0 - (default) нет минимальной длины,
0..20 - минимальная длина текста

Свойство MaxLen

Устанавливает максимальное число символов на картинке.

property MaxLen: integer read FMaxLen write FMaxLen;

Свойство может принимать следующие значения:
0 - (default) нет максимальной длины,
0..20 - максимальная длина текста

Свойство MaxRetry

Устанавливает количество повторений между проверкой статуса разгадывания.

property MaxRetry: integer read FMaxRetry write FMaxRetry;

Свойство может принимать все значения от 1 и больше, по умолчанию 10.

Свойство WaitTime

Устанавливает задержку между повторениями проверки статуса разгадывания.

property WaitTime: integer read FWaitTime write FWaitTime;

Свойство может принимать все значения от 0 и больше, задается в миллисекундах, по умолчанию 5000.

Свойство AntiParam

Принимает структуру со значениями основных параметров.

property AntiParam: TAntiParam read FGetAntiParam write FSetAntiParam;

Свойство в качестве параметра принимает структуру TAntiParam.

Структура TAntiParam

Служит для единоразового задания основных параметров сервиса.

type TAntiParam = record
  Key: string;
  Phrase: integer;
  Regsens: integer;
  Calc: integer;
  Numeric: integer;
  Russian: integer;
  MinLen: integer;
  MaxLen: integer;
  MaxRetry: integer;
  WaitTime: integer;
end;

Передается объекту TAntigate в конструкторе или присвоением свойства AntiParam.

Класс TAntiError

Содержит константы со всеми ошибками сервиса.

type
  TAntiError = class
    private
    public
      const CAPTCHA_NOT_READY = 'CAPCHA_NOT_READY';
      const ERROR_NO_SLOT_AVAILABLE = 'ERROR_NO_SLOT_AVAILABLE';
      const ERROR_KEY_DOES_NOT_EXIST = 'ERROR_KEY_DOES_NOT_EXIST';
      const ERROR_ZERO_CAPTCHA_FILESIZE = 'ERROR_ZERO_CAPTCHA_FILESIZE';
      const ERROR_TOO_BIG_CAPTCHA_FILESIZE = 'ERROR_TOO_BIG_CAPTCHA_FILESIZE';
      const ERROR_WRONG_FILE_EXTENSION = 'ERROR_WRONG_FILE_EXTENSION';
      const ERROR_IP_NOT_ALLOWED = 'ERROR_IP_NOT_ALLOWED';
      const ERROR_WRONG_ID_FORMAT = 'ERROR_WRONG_ID_FORMAT';
      const ERROR_NO_SUCH_CAPCHA_ID = 'ERROR_NO_SUCH_CAPCHA_ID';
      const ERROR_URL_METHOD_FORBIDDEN = 'ERROR_URL_METHOD_FORBIDDEN';
      const OK_REPORT_RECORDED = 'OK_REPORT_RECORDED';
      const ERROR_HTTP_REQUEST = 'ERROR_HTTP_REQUEST';
      const ERROR_CAPTCHA_TIMEOUTED = 'ERROR_CAPTCHA_TIMEOUTED';
  end;

Необходим при обработке возвращаемых значений в OnEvent(AMessage: string);

Пример использования:

unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Antigate;

type
  TfrmAntigate = class(TForm)
    btnRecognize: TButton;
    lstLog: TListBox;
    procedure btnRecognizeClick(Sender: TObject);
  private
  public
    procedure OnLog(AMessage: string);
  end;

var
  frmAntigate: TfrmAntigate;

implementation

{$R *.dfm}

procedure TfrmAntigate.btnRecognizeClick(Sender: TObject);
var
Antigate: TAntigate;
begin
Antigate := TAntigate.Create;
Antigate.OnEvent := OnLog;
Antigate.Key := 'ключ_антикаптчи';
Antigate.LoadFromFile('C:\captcha.jpg');
ShowMessage(Antigate.Recognize);
Antigate.Abuse;
ShowMessage(Antigate.Balance);
Antigate.Free;
end;

procedure TfrmAntigate.OnLog(AMessage: string);
begin
lstLog.Items.Add(AMessage);
end;

end.

Скачать antigate.zip
Размер: 2 kB – Скачиваний: 340 – Скачан последний раз: 16.08.2012 14:17

Post to Twitter

Похожие статьи:

  1. Создаем компонент TCP на Winsock (Часть 2)
  2. Привязка к железу в Delphi
  3. Создаем компонент TCP на Winsock (Часть 1)
  4. Компонент QuickSlide
  5. Многопоточность в Delphi

Комментарии (18)

  1. avatar

    Redfern.89
    Ноябрь 13th, 2010 at 07:22 #

    супер! огромное спасибо!

  2. avatar

    Юрик
    Ноябрь 23rd, 2010 at 21:26 #

    При компиляции модуль выдаёт ошибку:
    constructor TAntiGate.Create;
    begin
    inherited Create;
    FHTTP := TIdHTTP.Create; // ЗДЕСЬ РУГАЕТСЯ!!!;
    ………

    Модуль просто прописал uses. Нечего ещё не делал

  3. avatar

    Юрик
    Ноябрь 23rd, 2010 at 22:23 #

    Люди подсказали что надо TIdHTTP.Create(nil); И все будет ОК.

  4. avatar

    GlooK
    Ноябрь 24th, 2010 at 01:53 #

    2Юрик:
    Спасибо за багрепорт!
    Действительно, немного некорректное создание экземпляра.

  5. avatar

    Vladimir
    Ноябрь 29th, 2010 at 13:42 #

    Установил компонент в Delphi7. Добавил в Uses. Но при попытке сделать в своей программе скажем, так: antigate.key:=edit1.text выходит Undeclared identifier: ‘key’. Когда же я набираю в тексте программы antigate и ставлю точку, мне в выпадающем списке не показывается никаких свойств, как у вас на рисунке, а есть только TEvent и TAntigate.

  6. avatar

    GlooK
    Ноябрь 29th, 2010 at 13:53 #

    2Vladimir:
    Попробуйте полностью скопировать пример в проект.
    Файл antigate.pas должен лежать в папке с проектом.

  7. avatar

    Vladimir
    Ноябрь 29th, 2010 at 13:54 #

    Извиняюсь, разобрался :)

  8. avatar

    Aydar
    Январь 1st, 2011 at 00:05 #

    Вот вопрос по Antigate.Abuse; это функция жалуеться на распознование так? ну я вызываю ее, потом смотрю в стате акка это капча без абузы? что не так?

  9. avatar

    Юрик
    Январь 25th, 2011 at 12:48 #

    Неплохо было бы добавить возможность загрузки картинок без сохранения.

  10. avatar

    GlooK
    Январь 25th, 2011 at 13:13 #

    Обязательно сделаю в ближайшее время. Думаю уже завтра добавлю эти функции.

  11. avatar

    Ghostonline
    Январь 28th, 2011 at 16:04 #

    Похвально:
    То что завернул этов класс, и более того знаешь про процедурные типы, свойства и события в отличие от большинства говнокодеров с ачата.
    Не похвально:
    Почему для локальных переменных ты используешь префикс А? этот префикс для аргументов, если ты уж решил придерживаться стиля именования принятого в Delphi.
    Загрузка из файла — в топку, надо сразу делать из потока, а из файла просто как дополнительная возможность. У тебя же наоборот — из файла сразу сделал, а по-нормальному из потока только собираешься.
    На хера так: StrPos(PChar(AMessage) nil. Чем такой способ лучше Pos()>0 ? Или ты просто скопировал говнокод из антигейтовского примера?
    Зачем многочисленные properties? Каждый раз создавая объект мне надо присваивать эти значения, и хранятся многие копии одних и тех же настроек(ведь в подавляющем большинстве случаев настройки для всех объектов будут одни), а если мне понадобится 1000 экземпляров? Почему бы не сделать это как class property? Чтобы настраивать один раз на всех и не хранить копии? Или обернуть эти настройки в отдельный класс/запись, а в объектах Tantigate хранить указатель(всего то 4 байта) и сделать его свойством?

  12. avatar

    GlooK
    Январь 28th, 2011 at 16:14 #

    Спасибо за советы по оптимизации! Писалось это все на скорую руку, поэтому есть недочеты и упущения. Про StrPos и Pos — думаю разницы никакой нет, поэтому изначально стал придерживаться этого стиля. Насчет создания отдельного класса под параметры, это хорошая идея.

  13. avatar

    GlooK
    Январь 29th, 2011 at 02:53 #

    Сделал все что просили. Жду багрепортов от вас =)

  14. avatar

    Ghostonline
    Январь 30th, 2011 at 17:00 #

    Ты немного не то сделал — копии настроек опять хранятся в каждом экземпляре. А я говорил по то чтобы в экземплярах хранились всего лишь указатели на структуру или класс настроек.
    методы FGetAntiParam и FSetAntiParam — жесть, не надоело столько писать? Зачем все это копировать? И зачем локальная переменная
    var
    AntiParam: TAntiParam;
    если можно сразу Result.Key := …….;
    И вообще такой подход не по ООП. Вот надо будет добавить новый парметр, так тебе
    1. Добавить в структуру
    2. Добавить в объявление класса Тантигйет
    3. Прописать присваивание в обоих методах
    когда можно просто ссылаться по указателю на общие настройки?

  15. avatar

    Ghostonline
    Январь 30th, 2011 at 17:12 #

  16. avatar

    Некто
    Июнь 11th, 2011 at 16:32 #

    При установке компонента выдает ошибки, что не знает таких модулей и все остальное полетело..Что делать?

  17. avatar

    Tip.the.besT
    Апрель 10th, 2012 at 13:18 #

    Отличный компонент, автор молодцом. Первый раз юзаю антигейт, не думал, что будет так легко. Ещё раз спасибо.

  18. avatar

    Antispamernolf
    Апрель 13th, 2012 at 12:09 #

    Админ, если тебе как и мне надоели спам-боты на форуме, читай мануал как избавиться от них, а заодно как заставить всех ботов зависнуть и глючить:
    http://antibots.livejournal.com/

    Реально рабочие методики. Помогут избавиться от всяких хрумеров раз и навсегда.
    И уж извините что наследил, но информация однозначно полезная!

    Подписывайтесь на блог, ещё много интересного расскажу.

    Спасибо за внимание!

Ваш комментарий

Rambler's Top100 Яндекс.Метрика