ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

авторегилка фрихостов.
  #1  
Старый 09.03.2009, 10:08
fastiktut
Новичок
Регистрация: 28.01.2009
Сообщений: 9
Провел на форуме:
35186

Репутация: 7
Smile авторегилка фрихостов.

Есть зарубежные фрихосты, для которых бы хотелось написать авторегилку. Все вроде научился делать. Начнем с начала.
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.
Еще есть небольшая проблемка сделать циклично, не в цикле, т.к. распознавания капчи нет, а именно циклично, т.е. нужно еще поработать над ошибками так сказать, т.е. выяснить какие могут быть ошибки на странице, и как с ними бороться. Был бы благодарен за помощь и наставление на путь истинный.

Последний раз редактировалось fastiktut; 09.03.2009 в 10:13..
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ