Модуль на Delphi для работы с сервисом AntiGate.com (Антикаптча)

Так как довольно часто приходится пользоваться услугами сервиса http://antigate.com для распознавания каптчей в своих программах, я решил вынести функции в отдельный файл (модуль), чтобы его можно было легко подключать и использовать в любом своем проекте.

Модуль написан на Дельфи, для работы с HTTP-протоколом используется компонент Synapse. Последнюю версию этого компонента (на момент написания это текста релиз номер 39  не обновлялся аж с 2009 года, но наверно разработчику просто больше нечего добавить в свой проект, он и так отлично работает)  можно скачать по ссылке http://ararat.cz/synapse/doku.php/download либо в конце статьи. На мой взгляд Synapse лучше глючного Indy, хотя я давно не пользуюсь Инди и не знаю, как у них дела обстоят в новых версиях, но в любом случае Synapse компактнее нежели Indy.

Модуль может распознавать каптчу из файла, по ссылке, а также из потока (TStream).

Описание функций:

Функция RecognizeAG – умеет распознавать картинку используя сервис AntiGate.com из потока, по URL-ссылке и из картинки на компьютере.

Параметры функции:

  • ImageData – поток, содержащий каптчу
  • ImageFile – путь к файлу каптчи
  • ImageURL – ссылка на каптчу
  • AGKey – ключ сервиса AntiGate.com для распознавания
  • Cookies – при распознавании по URL можно передать в функцию куки, для открытия каптчи, когда это необходимо
  • CaptchaRes – буффер, в который попадает текст каптчи, либо сообщение об ошибке
  • MinLen – 0 по-умолчанию, помечает минимальную длину текста каптчи
  • MaxLen – 0 – без ограничений, помечает максимальную длину каптчи
  • Phrase – 0 по-умолчанию, 1 помечает что каптча состоит из нескольких слов
  • Regsense – 0 по-умолчанию, 1 помечает что текст каптчи чувствителен к регистру
  • Numeric – 0 по-умолчанию, 1 помечает что текст каптчи состоит только из цифр, 2 помечает что на каптче нет цифр
  • Calc – 0 по-умолчанию, 1 помечает что цифры на каптче должны быть высчитаны
  • Russian – 0 по умолчанию, 1 помечает что вводить нужно только русский текст, 2 – русский или английский

Функция возвращает:

  • Номер каптчи (CaptchaID) – в случае успеха
  • 0 (ноль) – при ошибке

Функция GetBalanceAG – выводит текущий баланс на сервисе AntiGate.com

Параметры функции:

  • AGKey – ключ сервиса AntiGate.com для распознавания

Функция возвращает:

  • Строку с содержанием баланса – при успехе
  • ‘N/A’ – при ошибке

Функция ReportBadAG – отправляет жалобу о неверно распознанной каптче в сервис AntiGate.com

Параметры функции:

  • AGKey – ключ сервиса AntiGate.com для распознавания
  • CaptchaID – номер каптчи, которая была неверно распознана

Функция возвращает:

  • Строку с результатом ответа от сервиса (OK_REPORT_RECORDED – в случае успеха)
  • ‘N/A’ – при ошибке

Для использования модуля в своем проекте, достаточно положить файл AntiGate.pas в папку с проектом и прописать его в Uses. Пример использования функции:

 

В архиве с модулем прилагается два примера программы его использующей. Первое демо имеет оконный интерфейс, текст отгаданной каптчи выводиться в поле внизу окна, откуда его можно скопировать. Так же текст каптчи сохраняется в файл Result.txt:

AntiGate Demo

Второе демо – консольное, работает через командную строку и выводит результат в консоль либо в файл:Console

Скачать AntiGate.rar (Размер: 289.7 KiB / Скачиваний: 4607)

Скачать synapse39.zip (Размер: 694.0 KiB / Скачиваний: 1204)

80 комментариев: Модуль на Delphi для работы с сервисом AntiGate.com (Антикаптча)

  • Rob inzon говорит:

    Большое спасибо! Интересный модуль и главное очень полезный. Давно использую антикапчу в своих проектах. :smile:
    Добавил сайт в закладки. Буду ждать новых статей. :wink:

  • Максим говорит:

    Подскажи, пожалуйста, как организовать запись текста капчи в .txt файл?

  • Geograph говорит:

    Я могу немного изменить демку, добавить командную строку и возможность записи в txt-файл

  • Geograph говорит:

    Добавил сохранение в текстовый файл и отдельной демкой пример с командной строкой

  • Serque говорит:

    А можете переделать этот модуль для работы с сервисом anti-captcha.net?
    Там надо заменить URL передачи картинки на сервис и получения результата

    • Geograph говорит:

      Вряд ли, этот сервис не такой известный, как два вышеприведенных, тем более переделать данный исходник под Ваш сервис совсем несложно. Поменять имя сервера и расширение php на asp.

  • Geek говорит:

    Прога может только jpg капчи распознать?

    • Geograph говорит:

      Нет, еще gif и png может распознавать.

      • Geek говорит:

        ах да, я не правильно ссылку вставлял.
        Теперь проблема распознаю капчу которую генерирует php скрипт и отправляю ответ post запросом. Но он сново требует новую капчу.
        Получается прога делает один запрос и получает капчу и распознает, потом обрывает сессию или как? Там при каждом новом запросе другаю капча

        • Geograph говорит:

          Вообще это только модуль для распознавания каптчи, как Вы реализуете запрос каптчи в своей программе – это уже Ваше дело, скорее всего надо куки получать.

      • YuriLaz говорит:

        а у меня и BMP неплохо обрабатывает

  • Сергей говорит:

    А можно показать примерчик работы отправки капчи из потока?)

    • Geograph говорит:

      Распознавание из потока Вы можете увидеть в самом модуле 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’ поэтому приходится высчитывать номер картинки капчи в веббраузере. Поможете разобраться с этой проблемой :sad:

    • Geograph говорит:

      Даже в случае с путем captcha.php тоже должно работать, возможно надо куки передавать. Если скинете адрес сайта могу посмотреть

    • Geograph говорит:

      Здесь ты картинку не правильно в поток передаешь вместо
      image1.Picture.Bitmap.SaveToStream(kartinka);
      надо
      image1.Picture.Graphic.SaveToStream(kartinka);

  • Сергей говорит:

    Все разобрался!!! Я сразу в твоей функции function RecognizeAG указал мой поток, тогда пришел результат, а просто передав в параметрах поток картинки че то не хочет работать :eek:

  • Сергей говорит:

    А еще такой вопрос, а для чего в function RecognizeAG, объявляется и создается поток Image? А то я ее убрал, в параметрах ж у тебя уже объявлен поток ImageData, я ему и присваиваю поток своей картинки, и чуть подправил в коде, изменил image на imagedata, незнай правильно так или нет, но работает.)

    • Geograph говорит:

      Точно не помню для чего создавал, то ли для отлова ошибок при не существовании потока, или просто когда код переделывал в функцию забыл убрать :)

  • Сергей говорит:

    А ну да точно, у тебя там все как положено, создается поток, используется, потом уничтожается, эт я все не возьму в привычку чистить за собой). Блин я все не разберусь полностью с использованием synapse, раньше всегда юзал компоненты indy, и у меня на нем все работало. А пишут что synapse в разы лучше работает, чем он, вот и хочу переделать свои программы под synapse. А щас у меня вызывает сложность даже тупо отправить файл на сервер, или проверить на существование файла в инете через него, хоть примеров куча в инете, или дажь твой пример взять отправку капчи на сервер, то там код такой замудренный по сравнению отправки через indy, что не пойму что там важно, а что не нужно при простой отправки.))

  • Сергей говорит:

    Получилось через ссылку отправлять капчу если она типа captcha.php, оказалось там не так все замудренно, а просто скопировать куки из webbrowser в куки synapse, синапс хоть и качает совсем другую картинку, не ту что отображена в данный момент в веббраузере, но после ввода все оказывается верным)

    • Geograph говорит:

      Ну да, все верно, просто синапс заново перекачивает эту картинку и та что видна в браузере уже не действительна

  • Сергей говорит:

    Извини, что щас не по теме напишу, видно ты многое знаешь в программировании, хочу спросить, как можно выдрать нужное значение переменной из скрипта в webbrowser, к примеру в нижеприведенном коде, функция как я понял добавляет последнии сообщения в чат и вот как узнать значение переменной txt?
    function add_chat(txt) { // Добавить сообщение в окно чата _chat.document.getElementById('chat').innerHTML=_chat.document.getElementById('chat').innerHTML+txt;
    _chat.window.scrollBy(0, 65000);

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

    • Geograph говорит:

      Честно говоря, не знаю, с компонентом 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, там пример приведен, только в этом примере в скрипт передается параметр и получаем результат выполнения скрипта, никак не догадаюсь как это может помочь моей проблеме.

  • Geograph говорит:

    Ну в общем, нашел я тот сайт, о котором ты говоришь, вообще при отправлении сообщения в чат выполняется 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

    Его через сниффер можно заполучить? А то если да, то не подскажешь как мне передачу зашифровать, чтобы не смогли мой ключ халявно использовать)

    • Geograph говорит:

      Если софт “белый”, то просто сделай в настройках пусть каждый свой ключ вводит. Если же у тебя софт, который должен работать скрытно, то тут надо какой-то другой выход искать.

      Чтобы шифровать трафик надо работать через ssl-соединение (https), но, насколько я знаю, antigate не поддерживает такое соединение. 

      Можно попробовать сделать промежуточный скрипт для распознавания каптчи и положить его на свой сервер. Т.е. программа будет обращаться к твоему серверу без ключа, просто передавая ему картинку, а уже скрипт на этом сервере будет отсылать ее на антигейт и отдавать ответ твоей программе.

  • Сергей говорит:

    А точно! Спасибо, хорошая идея, если ума хватит так замутить, то будет прекрасно. У меня просто бот для игры, и замутил два способа для доступа к сервису антикапча, оплачивая просто на мой счет и получать определенное количество автовводов или идти на сайт антигейт, региться и вводить ключ. Большая часть выбирают через меня и вот боюсь что когда народу будет много пользоваться моей программой, за всеми не уследишь и какой нить прохаванный просниффит мою прогу и заполучит ключ, поэтому нужно сразу присекать такие уязвимости) я как чуть заработаю тебя отблагодарю)

  • Сергей говорит:

    Мыслишка появилась, даже если замутить отправку мне на сервак только куки пользователя, а мой скрипт на серваке будет скачивать капчу, отправлять их в сервис, получать результат и отправлять ответ, так дажь юзеру сокращу чуть трафик)

    • Geograph говорит:

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

  • mops говорит:

    код просто крах…

    • Geograph говорит:

      Ну я сразу сказал, что я быдлокодер :)
      Если не трудно укажи на ошибки.

  • YuriLaz говорит:

    Пример очень пригодился. Достаточно легко за вечер создал программу-автоголосовалку для сайта, в котором голосовать можно не чаще 30 секунд, и вводить каптчу. Приделал к примеру вэббраузер, по таймерам обновляется сайт, виртуальными клавишами и мышью сохраняется каптча (правая кнопка мыши, сохранить рисунок как, сохраняется в BMP), рапознается, вставляется куда надо, голосуется. Обрабатываются сообщения об ошибках, если каптча пришла неверна. Даже пожаловаться можно, нажав клавишу. буду унифицировать, чтобы легко настраивалась под другие сайты. Спасибо за пример.

  • Антно говорит:

    Хорошая работа. Вот хотел встроить в свою программу подобное решение (думал организовать в пост запросе отправку и гет запросом парсить результат, что в принципе просто), но ваш модуль понравился. Ценю такую работу. Буду пользоваться. Спасибо.

  • Аристократ говорит:

    Как можно считать капчу с сайта 3s-business.info/users/sign_in
    Помогите с примером

  • Geograph говорит:

    Картинка каждый раз меняет название, поэтому нужно сначала загружать эту страницу, а потом парсить название картинки
    src="/captcha/78075ae71bfe.png"

  • Иван говорит:

    Просто супер! Но вот столкнулся с такой проблемой, в ваших исходниках поправил что передаю картинку с Кириллицей но вместо кириллицы в окне результата появляется абракадабра. Пример: на картинке изображено 4ПЭ возвращается 4Р_Р-. Может с кодировкой что то не так? В другом примере, было 21БЭ пришло 21БЭ-. На каждую буквы приходит по 2 символа. Не подскажите в чем дело?
    Заранее огромное спасибо и за статью особенно. Очень нужная вещь!

    • Geograph говорит:

      Да это кодировка UTF-8 не верно обрабатывается

      • Иван говорит:

        Спасибо огромное за ответ! Уже поправил это место и все заработало! Очень благодарен, спасибо за статью и примеры.

  • Макс говорит:

     
      Здравствуйте уважаемый Geograph! Если можно хотел бы попросить у вас помощи. Для работы с сайтом я использую компонент Webbrowser и с его помощью получаю страничку. На страничке есть каптча, зная id элемента (рисунок каптчи), я получаю ссылку на него: a:=webbrowser1.oleobject.document.getelementbyid(‘ctl00$ctl00$main$cphLeft$ctlSearch$ctlCaptcha$captcha$ig’); ссылка на картинку есть, а как из ссылки получить значение src=’…’
      Если вам не трудно подскажите пожалуйста. Спасибо вам за статью очень содержательно и доходчиво. Заранее спасибо за помощь!
     

    • Макс говорит:

      Спасибо, что то голова совсем не работает… Уже нашел a.src. Спасибо.

  • Vladimir говорит:

    Здравствуйте, Geograph, спасибо за модуль, только вот проблем ка такая как сделать, так что бы кнопки распознать имели разное имя или убрать одну “распознать по ссылке”, задаю поиск объекта (нажать кнопку “распознать” по файлу, а находит и исполняет  распознать по ссылке. (в программировании и языке 0 )
    Благодарю за внимание!

    • Geograph говорит:

      Там же и так есть отдельная кнопка рядом с выбором файла. Вы по ней нажимаете?

  • Алексей говорит:

    Добрый день!!! Все замечательно работает, но можно ли организовать работу через прокси сервер… Заранее спасибо…

  • Geograph говорит:

    Да, в модуле используется компонент THTTPSend из Synapse
    Прокси добавляется достаточно просто, можете добавить после Create у HTTP:
    HTTP.ProxyHost = '';
    HTTP.ProxyPort = '';
    HTTP.ProxyUser = '';
    HTTP.ProxyPass = '';

  • Дмитрий говорит:

    подскажите пожалуйста…мне нужна чтобы во время распознования программа не висела..
    подскажите где подправить.я что то не нахожу где это…sleep(1000) убрал вроде бы,все равно висит.
    Спасибо.

    • Geograph говорит:

      Чтобы программа “не висела” нужно выделять распознавание в отдельный поток. Гугулите “многопоточность в Delphi”

  • Akella225 говорит:

    С сайта habarovsk.drom.ru/nissan/tiida/11455990.html капчу распознает неправильно :(

  • Akella225 говорит:

    Неправильно вводят русский текст или вводят вместо него английский

    Чтобы корректно распознавать русские капчи ваша программа должна слать флаг is_russian=1 вместе с капчей в наш сервис. Обратитесь к автору вашей программы за реализацией такой функции.
    Если же вы уже шлете этот флаг и работник ввел текст неверно, то скорее всего наш модератор уже разъясняет в данный момент работнику (который ввел вашу капчу неправильно) неправильность такого поступка =)

    я так понимаю, что данная программа не поддерживает русский текст?

    • Geograph говорит:

      Это всего лишь модуль, компонент для включения в Вашу программу, а с ним я просто выложил демку, как пример использования. И да, модуль поддерживает параметр is_russian для этого в последнем параметре функции RecognizeAG (Russian) надо поставить '1'.

      Но русские капчи распознаются не очень хорошо, т.к. в сервисе antigate не очень много русскоязычных капчевбивальщиков.

  • Akella225 говорит:

    Тестирование через сайт 2-ух картинок показало, что действительно не очень. Результат 17 и 128 секунд.

  • Денис говорит:

    Что-то выдает 404 при скачивание 

    • Geograph говорит:

      Спасибо за то, что сообщили – проблема на сервере с nginx’ом скоро будет решена

  • Максим говорит:

    Сегодня модуль перестал работать, выдает ошибку Ошибка капчи: ERROR_IMAGE_TYPE_NOT_SUPPORTED

    • Geograph говорит:

      Только что проверил, все работает. Только часто выводит “ERROR_NO_SLOT_AVAILABLE”, т.к. сервис перегружен. Лечиться повышением ставки.

      Видимо у Вас что-то с картинкой, в каком она формате?

      • Максим говорит:

        У меня проблема с распознаванием капчи vk.com. Всё работала с вашим модулем 10 месяцев, а вот сегодня….  
        Визуально капча не изменилась такая же. Проснифил запросы программы – картинка капчи удачно скачивается с vk.com, дальше как обычно идет запрос отправки картинки на http://antigate.com/in.php и в ответ такая ошибка ERROR_IMAGE_TYPE_NOT_SUPPORTED. 
        Не могу понять в чем дело.

      • Максим говорит:

        формат JFIF

  • Grumlin говорит:

    Русскую капчу не разгадывает, приходит аброказябра

  • Andrey говорит:

    Отличное описание, да ещё и с примерами. Спасибо! Понажимал на всю рекламу и даже на счётчик лиру :)

  • wiom говорит:

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

  • Павел говорит:

    как установить Ваш модуль в браузере googl chrome, чтоб он заработал, существует ли установочный файл этого модуля?

    • Geograph говорит:

      Нет, этот модуль служит больше для программистов, для включения в проект на Delphi.
      Наверное под Google Chrome уже существует что-то подобное попробуйте поискать.

  • Роман говорит:

    выдаёт такую (AntiGate.pas(54,24) Fatal: Can not find unit HttpSend used by AntiGate.) ошибку в этой строке

    (uses
    SysUtils, Classes, HttpSend, SynAUtil; )

  • Роман говорит:

    нашёл такую штуку. Можете её тоже написать?
    статистика системы в реальном времени:
    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;

      • Geograph говорит:

        POST-запрос тут не нужен, достаточно GET-запроса:

        procedure TForm1.Button6Click(Sender: TObject);
        var HTTP:THTTPSend;
        begin
          HTTP := THTTPSend.Create;
          if HTTP.HTTPMethod('GET', 'http://antigate.com/load.php') then
            Memo2.Lines.LoadFromStream(HTTP.Document);
          HTTP.Free;
        end;
        

        • Роман говорит:

          А какая разница между post и get ?

          • Geograph говорит:

            GET – ты просто запрашиваешь страницу, как будто в браузере открываешь
            POST – ты отправляешь какие-то данные на сайт, это как в браузере ты набрал этот комментарий и нажал “Отправить”

  • Алексей говорит:

    Спасибо за статью! Но я столкнулся с проблемой. Приходит постоянно неверный ответ. Пробовал слать разные картинки и с цифрами и с буквами. Просто набрал в нете штук 5 картинок и проверил. Ни одна не правильно разгадана! Прошу помощи!

    • Geograph говорит:

      Если приходит именно ответ, а не ошибка начинающаяся с “ERROR_”, то значит, что работник сервиса не правильно разгадал капчу, возможно капча с русскими буквами.

      • Алексей говорит:

        Все разобрался. Дело в том что использовал ключи левые. Сейчас зарегистрировался сам, закинул 1$ и проверил. Все работает на ура! Спасибо за статью

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Не пропусти новые записи. Подпишись в соц. сетях:

E-mail рассылка блога:

Календарь

Июнь 2016
Пн Вт Ср Чт Пт Сб Вс
« Авг    
 12345
6789101112
13141516171819
20212223242526
27282930