Nikemmi |
Дата: Четверг, 19.06.2014, 17:25 | Сообщение # 1
|
Хороший))0
Сообщений: 475
Статус: Offline
|
Я буду использовать способ с компонентом webbrowser так как через post запроса могут возникнуть ошибки.
Открываем Delphi после uses пишем mshtml, jpeg
Кинем на форму: 6 таймера с вкладки System, 1 button с вкладки Standart, 2 memo с вкладки Standart, 4 edit с вкладки Standart, image с вкладки additional, label с вкладки standart, idhttp с вкладки indy clients и webbrowser с вкладки Internet, сразу уменьшим его до минимальных размеров
Что получилось
У всех таймеров в свойствах ставим Enabled в значении False. Для таймера 1 интервал 2000, для таймера 2 2000, для 3 таймера 5000, для 4 таймера 1500, для 5 таймера 1500, для 6 таймера 2000.
У всех Memo в свойствах cтавим Visible в значении False и Scrollbars в значении ssBoth
У Label в Сaption пишем что-то типа "Загружаю", "Получаю капчу".
1 Edit- это логин 2 Edit - это почта 3 Edit - это пароль 4 Edit - это капча
Приступим к коду. Нажмем два раза по форме Код webbrowser1.Navigate('http://samp-rp.su/ucp.php?mode=register');// переходим на страницу регистрации через webbrowser timer6.enabled:=true; // включаем таймер 6
Для Таймера 1 Код var Doc:IHTMLDocument2; S:string; begin while WebBrowser1.ReadyState<READYSTATE_COMPLETE do begin Application.ProcessMessages; end; Doc:= WebBrowser1.Document as IHTMLDocument2; s:=doc.body.innerHTML; Memo1.Text:=s; timer2.enabled:=true; // включаем 2 таймер timer1.enabled:=false; // выключаем 2 таймер
Этим кодом мы выводим в Memo1 исходный код страницы.
Для Таймера 2 код Спасибо Ch0c0Cube взял с его урока про парсинг. Код var stroka:string; // Объявляем переменную типа стринг. begin memo2.text:=memo1.Lines[97]; // в этой строке находится капча stroka:=Pars('src="',memo2.Text,'"'); // Выполняем парсинг, от src= в 97 строке до " Memo2.Clear; // Отчищаем мемо. Memo2.Lines.Add(stroka); // Выводим результат timer4.enabled:=true; // включаем 4 таймер timer2.Enabled:=false; // включаем 2 таймер
В 97 строке в исходном коде страницы находится ссылка на капчу.
Почти в самом вверху После
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;
Для таймера 3 код Код var a, a1, a2, a3, a4, a5, a6: variant; begin a1:=webbrowser1.oleobject.document.getelementbyid('username'); // заполняем поле с ником a1.value:=edit1.text; // из edit1 a2:=webbrowser1.oleobject.document.getelementbyid('email'); // поле с почтой a2.value:=edit2.text; a3:=webbrowser1.oleobject.document.getelementbyid('email_confirm'); // повтор почты a3.value:=edit2.text; a4:=webbrowser1.oleobject.document.getelementbyid('new_password'); // пароль a4.value:=edit3.text; a5:=webbrowser1.oleobject.document.getelementbyid('password_confirm'); // повтор пароля a5.value:=edit3.text; a6:=webbrowser1.oleobject.document.getelementbyid('recaptcha_response_field');// капча a6.value:=edit4.text;
a:=webbrowser1.oleobject.document.getelementbyid('submit'); // нажимаем регистрация
WebBrowser1.OleObject.Document.GetElementByID('submit').Click; // нажимаем регистрация
timer3.enabled:=false; timer6.enabled:=true; label1.visible:=true; webbrowser1.Navigate('http://samp-rp.su/ucp.php?mode=register'); // переходим обратно на страницу регистрации Image1.Picture := nil; // удаляем капчу, чтобы загрузить новую end;
Откуда я взял username, submit и т.д? Из исходного кода страницы
[b]Для таймера 4 код Код var a:string; S:TFileStream; begin idhttp1.HandleRedirects:=true; // разрешаем перенаправление a:=IdHTTP1.Get(memo2.text); // посылаем get запрос на капчу из memo2 S:=TFileStream.Create('captcha.jpg',FMCreate); IdHTTP1.Get(memo2.text+'.jpg', S); // получаем капчу из ссылки в memo2 s.free; // освобождаем память, чтобы загружать новую капчу Image1.Picture.LoadFromFile('captcha.jpg'); // загружаем капчу image label1.Visible:=false; timer4.enabled:=false; end;
Для таймера 5 код Код // тут должно быть распознавание капчи, но пока это описывать не буду.
Для таймера 6 код Код var a8: variant; begin a8:=webbrowser1.oleobject.document.getelementbyid('agreed'); // я принимаю условия соглашени WebBrowser1.OleObject.Document.GetElementByID('agreed').Click; timer1.Enabled:=true; timer6.enabled:=false;
Вот и все
Полный код: Код unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, SHDocVw, UrlMon, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, ExtCtrls, IdHTTP, AntiGate, XPMan, mshtml, jpeg;
type
TForm1 = class(TForm) WebBrowser1: TWebBrowser; Button1: TButton; Memo1: TMemo; Timer1: TTimer; IdHTTP1: TIdHTTP; Image1: TImage; Timer2: TTimer; Memo2: TMemo; Timer3: TTimer; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Timer4: TTimer; Timer6: TTimer; Label1: TLabel; XPManifest1: TXPManifest; Timer5: TTimer;
procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure Timer3Timer(Sender: TObject); procedure Timer4Timer(Sender: TObject); procedure Timer6Timer(Sender: TObject);
private { Private declarations } public
{ Public declarations } end;
var Form1: TForm1;
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 timer3.Enabled:=true; // включаем таймер 3 end;
procedure TForm1.FormCreate(Sender: TObject); begin webbrowser1.Navigate('http://samp-rp.su/ucp.php?mode=register'); timer6.enabled:=true; end;
procedure TForm1.Timer1Timer(Sender: TObject); var Doc:IHTMLDocument2; S:string; begin while WebBrowser1.ReadyState<READYSTATE_COMPLETE do begin Application.ProcessMessages; end; Doc:= WebBrowser1.Document as IHTMLDocument2; s:=doc.body.innerHTML; Memo1.Text:=s; timer2.enabled:=true; timer1.enabled:=false;
end;
procedure TForm1.Timer2Timer(Sender: TObject); var stroka:string; // Объявляем переменную типа стринг. begin memo2.text:=memo1.Lines[97]; // в этой строке находится капча stroka:=Pars('src="',memo2.Text,'"'); // Выполняем парсинг, от src= в 97 строке Memo2.Clear; // Отчищаем мемо. Memo2.Lines.Add(stroka); // Выводим результат timer4.enabled:=true; timer2.Enabled:=false; end;
procedure TForm1.Timer3Timer(Sender: TObject); var a, a1, a2, a3, a4, a5, a6: variant;
begin
a1:=webbrowser1.oleobject.document.getelementbyid('username'); // заполняем поле с ником a1.value:=edit1.text; a2:=webbrowser1.oleobject.document.getelementbyid('email'); // понятно a2.value:=edit2.text; a3:=webbrowser1.oleobject.document.getelementbyid('email_confirm'); //понятно a3.value:=edit2.text; a4:=webbrowser1.oleobject.document.getelementbyid('new_password'); // пароль a4.value:=edit3.text; a5:=webbrowser1.oleobject.document.getelementbyid('password_confirm'); a5.value:=edit3.text; a6:=webbrowser1.oleobject.document.getelementbyid('recaptcha_response_field');// капча a6.value:=edit4.text;
a:=webbrowser1.oleobject.document.getelementbyid('submit'); // нажимаем регистрация
WebBrowser1.OleObject.Document.GetElementByID('submit').Click;
timer3.enabled:=false; timer6.enabled:=true; label1.visible:=true; webbrowser1.Navigate('http://samp-rp.su/ucp.php?mode=register'); Image1.Picture := nil; end;
procedure TForm1.Timer4Timer(Sender: TObject); var a:string; S:TFileStream; begin idhttp1.HandleRedirects:=true; // разрешаем перенаправление a:=IdHTTP1.Get(memo2.text); S:=TFileStream.Create('captcha.jpg',FMCreate); IdHTTP1.Get(memo2.text+'.jpg', S); // получаем капчу из ссылки в memo2 s.free; Image1.Picture.LoadFromFile('captcha.jpg'); label1.Visible:=false;
timer4.enabled:=false;
end;
procedure TForm1.Timer6Timer(Sender: TObject); var a8: variant; begin a8:=webbrowser1.oleobject.document.getelementbyid('agreed'); // я принимаю условия соглашени WebBrowser1.OleObject.Document.GetElementByID('agreed').Click; timer1.Enabled:=true; timer6.enabled:=false; end; end.
Delphi программирование [Delphi]Узнаем координаты перса BunnyHop для Steam/Non steam
Сообщение отредактировал Nikemmi - Четверг, 19.06.2014, 17:27 |
|
|
|
_Marcel_ |
Дата: Суббота, 30.08.2014, 14:55 | Сообщение # 3
|
Боец
Сообщений: 88
Статус: Offline
|
Цитата Kulibiaka ( ) Synapse круче Неа, сделал с помощью Synapse, капчу дает все время хуже чем на депозите, которую разгадать можно 1 раз из 10. Так что webbrowser намного лучше
|
|
|
|