Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   авторегилка фрихостов. (https://forum.antichat.xyz/showthread.php?t=110067)

fastiktut 09.03.2009 10:08

авторегилка фрихостов.
 
Есть зарубежные фрихосты, для которых бы хотелось написать авторегилку. Все вроде научился делать. Начнем с начала.
1) Нажимаю на кнопку и получаю картинку, вот код:
Код:

procedure TForm1.GetImage;
var
  html: string;
  tmpImage: TMemoryStream;
begin
  html := http.Get(memo1.Lines[0]+'/register.jsp');
  id:=getcaptchakey(html);
  label1.Caption:=id;
  tmpImage := TMemoryStream.Create;
    http.Request.Referer := (memo1.lines[0]+'/register.jsp');
    http.Get(memo1.lines[0]+'/captcha.jsp?key='+id, tmpImage);
    tmpImage.Position := 0;
    tmpImage.SaveToFile('c:\cap.png');
    tmpImage.Free;
    webimage.Navigate('c:/cap.png');

думаю, что тут все понятно. Вот только картинку приходится выводить в браузере, т.к. png не выводится в TImage :)
Поехали дальше, получив картинку и выведя ее для введения вводим и нажимаем следующую кнопку, после нажатия на которую посылаем пост запрос с нужными данными. Вот код:
Код:

procedure TForm1.Button7Click(Sender: TObject);
Var
  Data : TStrings;
  html : String;
begin
  Data:=TStringList.Create;

  Data.Add('user_name='+edit3.Text);
  Data.Add('password=123456789');
  Data.Add('password_confirm=123456789');
  Data.Add('email='+memo3.Lines[0]);
  Data.Add('tos=1');
  Data.Add('how_found=Yahoo');
  Data.Add('how_found_1='+'');
  Data.Add('captcha_key='+label1.Caption);
  Data.Add('captcha_input='+edit1.Text);
  Data.Add('mode=save_email');

  http.Request.Referer:=(memo1.Lines[0]+'/register.jsp');
  html:=http.Post(memo1.Lines[0]+'/register.jsp', Data);
  Data.Free;        //We have just sent an email at the email you entered. In order to create the account, please follow the instructions from the email.
  if pos('We have just sent an email at the email you entered. In order to create the account, please follow the instructions from the email',html)<>0 then
  else
  if pos('Error occurred',html)<>0 then showmessage('Error occurred')

end;

тут тоже все понятно я думаю, вот только вместо того, чтобы выводить сообщения нужно, чтобы шло следующее действие, т.е. в моем случае получение ссылки с мыла. Вот код, но я думаю, что следовало бы сделать функцию, а не процедуру, но не очень понимаю пока какую, надеюсь на Вашу помощь:
Код:

procedure TForm1.pop;
var j:string;
begin
 POP3.Connect;
 if  POP3.Retrieve(1,IdMessage) then  // получение одного сообщения
begin
memo2.Clear;
 Memo2.Lines.AddStrings(IdMessage.Body); // передача сообщения из компонента IdMessage в memo
 j:= memo2.Text;
 POP3.Delete(1); // удаление с сервера, полученного сообщения
edit2.Text:=ExtractEmails(memo2.Text);  // получение именно ссылки.
label4.Caption:=getkey(edit2.Text) ;
 POP3.Disconnect;
  end else
  begin
    POP3.Disconnect; // разрыв связи
    sleep(5000);
    pop;
  end;

end;

следует тут сделать акцент ExtractEmails(memo2.Text).
Смотрим код:
Код:


function TForm1.ExtractEmails(const AInputString: string): string;  // Обратите внимание, что если эта функция будет использоваться часто, // то наша реализация далека от оптимальной. // Правильнее тогда использовать заранее (при инициализации программы) // созданный TRegExpr с уже откомпилированным выражением  const  EmailRE = '(http)://([\w\d-]+(\.[\w\d\-]+)+)(([\w\d\-=\?&\\\./]+)+)*';  var  r : TRegExpr;  begin  Result := '';    r := TRegExpr.Create;  // Создание объекта - не забывайте об этом, 10% писем ко мне  // связаны с тем, что объект начинают использьвать, не создав его.    try // гарантирует освобождение занятой объектом памяти      r.Expression := EmailRE;        // Присваиваем исходный текст регулярного выражения.        // При первой же необходимости (например, при вызове метода Exec)        // оно будет откомпилировано. Если в выражении есть ошибки, то        // будет вызвано исключение      if r.Exec (AInputString) then      REPEAT        Result := Result + r.Match [0] + '';      UNTIL not r.ExecNext;    finally r.Free;    end;  end;

Использовал библиотеку с регулярными выражениями, чтобы из текста полученного письма получить именно ссылку, после чего послать гет запрос на сайт.
Вот именно в этом моменте как правило появляется проблема. Делаю так: регю мыло на гмайле, а так как не получается с него парсить, то делаю редирект на маил.ру Получаю с него сообщение. Делаю задержки и т.п. Но не всегда работает. Надеюсь выслушать предложения в этом месте. Ну пойдем дальше, получив ссылку с текста письма и выведя его в edit посылаю гет запрос с этой ссылкой. После чего второй пост запрос для завершения процесса регистрации. код:

Код:

Var  Data : TStrings;  html : String; begin Data:=TStringList.Create;  // создаем еще строки, для второго пост.  Data.Add('password=123456789');  Data.Add('first_name=ALEX');  Data.Add('last_name=FAST');  Data.Add('city=Tokio'); Data.Add('province='); Data.Add('postal_code='); Data.Add('country='+'JP'); Data.Add('phone='); Data.Add('extra_domain='); Data.Add('id='+edit3.Text); Data.Add('code='+label4.Caption); // часть того гет запроса, что пришел на мыло  http://www.justfree.com/register.jsp?mode=confirm_email&code=bdd29987a8a759b&id=asdf-as-detrwertwer  Data.Add('mode=save_data'); http.Request.Referer:=(edit2.Text);  html:=http.Post(memo1.Lines[0]+'/register.jsp', Data);  Data.Free; if pos('The account has been created successfully',html)<>0 then done.Lines.Add(edit3.Text)

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

AlexTheC0d3r 09.03.2009 10:50

для начала сделай вывод капчи на форму

есть компоненты для работы с png

fastiktut 10.03.2009 13:08

ну она выводится, какая разница как, главное. что выводится.

ex3me 13.03.2009 23:04

думаю, что тут все понятно. Вот только картинку приходится выводить в браузере, т.к. png не выводится в TImage

D7,

Form1.Image1.Picture.LoadFromFile('c:\cap.png');

все выводится ;)

0rs 14.03.2009 10:17

Чтобы не тормозить весь процесс ожиданием получения письма стоит разделить задачу на получение и распознавание капчи и проверку почты.
Тоесть после
Код:

if pos('We have just sent an email at the email you entered. In order to create the account, please follow the instructions from the email',html)<>0 then
будет идти вызов TForm1.GetImage.
А затем, когда будет распознано уже достаточное количество капч, можно организовать получение почты в цикле.

De-visible 14.03.2009 11:03

Цитата:

Сообщение от AlexTheC0d3r
для начала сделай вывод капчи на форму

есть компоненты для работы с png

Можно сначало сохранить в файл потом из него загрузить в TImage а можно в поток...


--------

Вот только картинку приходится выводить в браузере, т.к. png не выводится в TImage

Ээээ где тебе такое сказали?

][yZ 18.03.2009 15:47

Цитата:

Сообщение от De-visible
Можно сначало сохранить в файл потом из него загрузить в TImage а можно в поток...


--------

Вот только картинку приходится выводить в браузере, т.к. png не выводится в TImage

Ээээ где тебе такое сказали?

на самом деле эт зависит от старости делфи :)

ntldr 18.03.2009 16:21

ты через рор3 парсил гмайл?


Время: 12:22