Есть зарубежные фрихосты, для которых бы хотелось написать авторегилку. Все вроде научился делать. Начнем с начала. 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. Еще есть небольшая проблемка сделать циклично, не в цикле, т.к. распознавания капчи нет, а именно циклично, т.е. нужно еще поработать над ошибками так сказать, т.е. выяснить какие могут быть ошибки на странице, и как с ними бороться. Был бы благодарен за помощь и наставление на путь истинный.
думаю, что тут все понятно. Вот только картинку приходится выводить в браузере, т.к. png не выводится в TImage D7, Form1.Image1.Picture.LoadFromFile('c:\cap.png'); все выводится
Чтобы не тормозить весь процесс ожиданием получения письма стоит разделить задачу на получение и распознавание капчи и проверку почты. Тоесть после 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. А затем, когда будет распознано уже достаточное количество капч, можно организовать получение почты в цикле.
Можно сначало сохранить в файл потом из него загрузить в TImage а можно в поток... -------- Вот только картинку приходится выводить в браузере, т.к. png не выводится в TImage Ээээ где тебе такое сказали?