авторегилка фрихостов.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fastiktut, 9 Mar 2009.

  1. fastiktut

    fastiktut New Member

    Joined:
    28 Jan 2009
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Есть зарубежные фрихосты, для которых бы хотелось написать авторегилку. Все вроде научился делать. Начнем с начала.
    1) Нажимаю на кнопку и получаю картинку, вот код:
    Code:
    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 :)
    Поехали дальше, получив картинку и выведя ее для введения вводим и нажимаем следующую кнопку, после нажатия на которую посылаем пост запрос с нужными данными. Вот код:
    Code:
    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;
    
    тут тоже все понятно я думаю, вот только вместо того, чтобы выводить сообщения нужно, чтобы шло следующее действие, т.е. в моем случае получение ссылки с мыла. Вот код, но я думаю, что следовало бы сделать функцию, а не процедуру, но не очень понимаю пока какую, надеюсь на Вашу помощь:
    Code:
    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).
    Смотрим код:
    Code:
     
    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 посылаю гет запрос с этой ссылкой. После чего второй пост запрос для завершения процесса регистрации. код:

    Code:
    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.
    Еще есть небольшая проблемка сделать циклично, не в цикле, т.к. распознавания капчи нет, а именно циклично, т.е. нужно еще поработать над ошибками так сказать, т.е. выяснить какие могут быть ошибки на странице, и как с ними бороться. Был бы благодарен за помощь и наставление на путь истинный.
     
    #1 fastiktut, 9 Mar 2009
    Last edited: 9 Mar 2009
    1 person likes this.
  2. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    для начала сделай вывод капчи на форму

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

    fastiktut New Member

    Joined:
    28 Jan 2009
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    ну она выводится, какая разница как, главное. что выводится.
     
  4. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    думаю, что тут все понятно. Вот только картинку приходится выводить в браузере, т.к. png не выводится в TImage

    D7,

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

    все выводится ;)
     
  5. 0rs

    0rs Member

    Joined:
    30 Dec 2008
    Messages:
    70
    Likes Received:
    23
    Reputations:
    3
    Чтобы не тормозить весь процесс ожиданием получения письма стоит разделить задачу на получение и распознавание капчи и проверку почты.
    Тоесть после
    Code:
    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.
    А затем, когда будет распознано уже достаточное количество капч, можно организовать получение почты в цикле.
     
  6. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Можно сначало сохранить в файл потом из него загрузить в TImage а можно в поток...


    --------

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

    Ээээ где тебе такое сказали?
     
  7. ][yZ

    ][yZ Member

    Joined:
    3 Mar 2009
    Messages:
    66
    Likes Received:
    46
    Reputations:
    10
    на самом деле эт зависит от старости делфи :)
     
  8. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    ты через рор3 парсил гмайл?