Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2012, 03:58   #1
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию Регистрация на сайте. Проблемы с капчей

Написал программу на Delphi XE для регистрации на yandex.ru. Возникла проблема с капчей.
Регистрация идет через http://passport.yandex.ru/passport?mode=simplereg
На форме Edit1 - для ввода логина(он же имя и фамилия), Image1 - туда капча грузиться, Edit2 - для ввода капчи, Button1 - парсит капчу на странице регистрации, сохраняет на комп и загружает в Image1, Button2 - посылает Post-запрос с параметрами регистрации(по сниферу делал), idHttp1(HandleRedirects-true), и на всякий случай IdCookieManager1 и IdSSLIOHandlerSocketOpenSSL1 - они связаны в Idhttp1.
Сам код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
  IdSSL, IdSSLOpenSSL, IdCookieManager, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, gifimg; //gifimg для формата GIF

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    IdCookieManager1: TIdCookieManager;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    Edit1: TEdit;
    Button1: TButton;
    Image1: TImage;
    Edit2: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a, b, e, f, j:string;
c:tmemorystream; //для сохранения капчи
d:tstringlist;

implementation


{$R *.dfm}
 //для парсинга
function Pars(T_, ForS, _T: string): string;
var
  a, b: integer;
begin
  Result := '';
  if (T_ = '') or (ForS = '') or (_T = '') then
    Exit;
  a := Pos(T_, ForS);
  if a = 0 then
    Exit
  else
    a := a + Length(T_);
  ForS := Copy(ForS, a, Length(ForS) - a + 1);
  b := Pos(_T, ForS);
  if b > 0 then
    Result := Copy(ForS, 1, b - 1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//записал  ссылку в переменную b;
b:='http://passport.yandex.ru/passport?mode=simplereg'; 
//get-запрос по ссылке
 j:=form1.IdHTTP1.Get(b);
//парсинг нужного параметра для пост-запроса
  e:=pars('"idkey" value="',j,'"');
  c:=tmemorystream.Create;
//парсинг ссылки на капчу и гет запрос по ней для сохранения
  form1.idhttp1.get(('http:'+Pars('class="captcha-img" src="',j,'"')),c);
   c.Position:=0;
//сохранение капчи 
   c.SaveToFile('C:\111.gif');
//загрузка капчи на форму
   form1.Image1.Picture.LoadFromFile('C:\111.gif');
end;

//После Button1 - всё отлично - капчу загружает

procedure TForm1.Button2Click(Sender: TObject);
begin
   d:=tstringlist.Create;
   d.Add('idkey='+e);//постоянно меняеться, надо парсить (спарсил в баттон1) - про ето ниже
   d.Add('submode=try_reg');//не меняеться
   d.Add('iname=');//пустое
   d.Add('fname=');//пустое
   d.Add('time=1342907806404');//это время регистрации (ниже про это)
   d.Add('gmt_offset='+form1.Edit2.Text);//сюда писать логин
   d.Add('lang=ru');//не меняеться
   d.Add('iname_user='+form1.Edit2.Text);//имя
   d.Add('fname_user='+form1.Edit2.Text);//фамилия
   d.Add('password=ig865fg8i6egfi6y56y');//пароль
   d.Add('password_confirm=ig865fg8i6egfi6y56y');//повтор пароля
   d.Add('hintq=0');//не меняеться
   d.Add('udhintq=');//пустое
   d.Add('hinta=');//пустое
   d.Add('phonenumber=');//пустое
   d.Add('code='+Form1.Edit1.Text);//сюда писать символы с капчи
   d.Add('agreed=yes');//не меняеться
   form1.IdHTTP1.Post('http://passport.yandex.ru/passport?mode=simplereg', d);//собствено пост запрос по ссылке для регистрации с нужными параметрами
end;

end.
igrok111 вне форума Ответить с цитированием
Старый 22.07.2012, 03:58   #2
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию не поместилось

Про время регистрации - я не знаю как его высчитать, я поставил время, которое мне выбил снифер, когда я вручную регистрировал, ошибок с етим нет.

По сути дела:
Я включаю сниффер, нажимаю Button1 - капча загрузилась, потом ввожу логин в Edit2, капчу с картинки в Edit1 - и нажимаю Button2 - и в итоге я смотрю в снифере - меня отправило на страницу, где написано - "Контрольные символы введены неправильно.". Я пробывал много раз, символы введены правильно - проблема в другом.
Когда я первый раз гет-запросом парсю капчу - она одна. А потом пост-запрос посылаеться на уже страницу с другой капчей, ведь я же второй раз "нажимаю" по ссылке регистрации, капча обновилась, а я записал в едит- старую капчу. Тогда я подумал послать пост по "старому гету".
Место
Код:
form1.IdHTTP1.Post('http://passport.yandex.ru/passport?mode=simplereg', d);
я сделал:
Код:
form1.IdHTTP1.Post(j, d);
j это первый гет запрос по ссылке с регистраией
Код:
j:=form1.IdHTTP1.Get(b);
Что б оно послало параметры по "старой странице". Мне выбило ошибку - Socket Error #11001. Host not found. Тоесть оно не нашло ссылку, по которой посылать запрос.
Про параметр (d.Add('idkey='+e)), который я парсил получаеться еще из первого запроса - я теперь думаю, может в нем дело? может стоит в баттон2 его парсить? Этот параметр - имеет такой же хеш как и капча!
Пример:
idkey" value="06d1342915001iW4qz15MU"
Капча: passport.yandex.ru/digits?idkey=06d1342915001iW4qz15MU
Если первый раз спарсить капчу и нажать по ссылке - капча будет та же, что и на форме с регистраицей.
Может там в итоге посылаеться разные хешы и с етим проблема?
Вообщем ошибок никаких нет, просто каким-то образом нужно послать пост запрос на ссылку с нужной капчей, вы можете у себя в делфи (Делфи ХЕ) скомпилировать и попробывать что-то сделать.
Я надеюсь на вашу помошь, проблему постарался доходчиво обьяснить.
igrok111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регистрация на сайте Lalacinar Общие вопросы Web 6 02.02.2013 21:02
Регистрация на сайте. Alest Работа с сетью в Delphi 10 09.06.2010 16:10
Регистрация на сайте Cpluser Общие вопросы .NET 13 13.01.2010 13:52
Регистрация на сайте Masiana JavaScript, Ajax 3 17.08.2009 14:39
Регистрация на сайте Terikon Работа с сетью в Delphi 3 16.03.2009 21:02