From 7f6a20e5e1287b8de2361175b0d8f5a690308fc3 Mon Sep 17 00:00:00 2001 From: NMD Date: Sun, 4 Jul 2010 18:26:28 +0600 Subject: [PATCH 01/12] =?UTF-8?q?=D0=9D=D0=B0=20=D0=B2=D1=81=D1=8F=D0=BA?= =?UTF-8?q?=D0=B8=D0=B9=20=D1=81=D0=BB=D1=83=D1=87=D0=B0=D0=B9=20=D1=81?= =?UTF-8?q?=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: NMD --- source/GoogleLogin.dproj | 2 +- source/GoogleLogin.identcache | Bin 67 -> 53 bytes source/uGoogleLogin.pas | 263 ++++++++++++++++++---------------- 3 files changed, 142 insertions(+), 123 deletions(-) diff --git a/source/GoogleLogin.dproj b/source/GoogleLogin.dproj index 0eb8745..bcc391b 100644 --- a/source/GoogleLogin.dproj +++ b/source/GoogleLogin.dproj @@ -21,7 +21,7 @@ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) - C:\Users\Public\Documents\RAD Studio\7.0\Bpl\GoogleLogin.bpl + C:\Documents and Settings\All Users\Документы\RAD Studio\7.0\Bpl\GoogleLogin.bpl 0 true true diff --git a/source/GoogleLogin.identcache b/source/GoogleLogin.identcache index 0cebf3457e62e08672d1aac7fb4d3556dd930d11..376c4cf0d0bc6300acd176896e711e7d400b1ac9 100644 GIT binary patch literal 53 wcmZQ%U|>*jwTem4&ri=uO)SWaDb6n~N=}U_bq9<10 then // + // + if pos('error',LowerCase(LoginResult))>0 then // begin for i:=0 to List.Count-1 do + begin + if pos('error',LowerCase(List[i]))>0 then // begin - if pos('error',LowerCase(List[i]))>0 then // - begin - Result:=GetLoginError(List[i]);// - break; - end; + Result:=GetLoginError(List[i]);// + break; end; - if Result=lrCaptchaRequired then // - begin - FCaptchaURL:=GetCaptchaURL(List); - FLogintoken:=GetCaptchaToken(List); - end; + end; + if Result=lrCaptchaRequired then // + begin + FCaptchaURL:=GetCaptchaURL(List); + FLogintoken:=GetCaptchaToken(List); + end; end -else + else begin Result:=lrOk; for i:=0 to List.Count-1 do - begin - if pos('SID',UpperCase(List[i]))>0 then - FSID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) - else - if pos('LSID',UpperCase(List[i]))>0 then - FLSID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) - else - if pos('AUTH',UpperCase(List[i]))>0 then - FAuth:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))); - end; + begin + if pos('SID',UpperCase(List[i]))>0 then + FSID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) + else + if pos('LSID',UpperCase(List[i]))>0 then + FLSID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) + else + if pos('AUTH',UpperCase(List[i]))>0 then + FAuth:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))); + end; end; -FreeAndNil(List); + FreeAndNil(List); end; function TGoogleLogin.GetCaptchaToken(const cList: TStringList): String; var i:integer; begin for I := 0 to cList.Count - 1 do + begin + if pos('captchatoken',lowerCase(cList[i]))>0 then begin - if pos('captchatoken',lowerCase(cList[i]))>0 then - begin - Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); - break; - end; + Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); + break; end; + end; end; function TGoogleLogin.GetCaptchaURL(const cList: TStringList): string; var i:integer; begin for I := 0 to cList.Count - 1 do + begin + if pos('captchaurl',lowerCase(cList[i]))>0 then begin - if pos('captchaurl',lowerCase(cList[i]))>0 then - begin - Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); - break; - end; + Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); + break; end; + end; end; function TGoogleLogin.GetLoginError(const str: string): TLoginResult; var ErrorText:string; begin -// - ErrorText:=Trim(copy(str,pos('=',str)+1,Length(str)-pos('=',str))); - Result:=TLoginResult(AnsiIndexStr(ErrorText,Errors)+2); + // + ErrorText:=Trim(copy(str,pos('=',str)+1,Length(str)-pos('=',str))); + Result:=TLoginResult(AnsiIndexStr(ErrorText,Errors)+2); end; function TGoogleLogin.GetResultText: string; begin - case FLastResult of - lrNone: Result:=rcNone; - lrOk: Result:=rcOk; - lrBadAuthentication: Result:=rcBadAuthentication; - lrNotVerified: Result:=rcNotVerified; - lrTermsNotAgreed: Result:=rcTermsNotAgreed; - lrCaptchaRequired: Result:=rcCaptchaRequired; - lrUnknown: Result:=rcUnknown; - lrAccountDeleted: Result:=rcAccountDeleted; - lrAccountDisabled: Result:=rcAccountDisabled; - lrServiceDisabled: Result:=rcServiceDisabled; - lrServiceUnavailable: Result:=rcServiceUnavailable; - end; + case FLastResult of + lrNone: Result:=rcNone; + lrOk: Result:=rcOk; + lrBadAuthentication: Result:=rcBadAuthentication; + lrNotVerified: Result:=rcNotVerified; + lrTermsNotAgreed: Result:=rcTermsNotAgreed; + lrCaptchaRequired: Result:=rcCaptchaRequired; + lrUnknown: Result:=rcUnknown; + lrAccountDeleted: Result:=rcAccountDeleted; + lrAccountDisabled: Result:=rcAccountDisabled; + lrServiceDisabled: Result:=rcServiceDisabled; + lrServiceUnavailable: Result:=rcServiceUnavailable; + end; end; function TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string): TLoginResult; var cBody: TStringStream; ResponseText: string; begin - // - cBody:=TStringStream.Create(''); - case FAccountType of - atNone,atHOSTED_OR_GOOGLE:cBody.WriteString('accountType=HOSTED_OR_GOOGLE&'); - atGOOGLE:cBody.WriteString('accountType=GOOGLE&'); - atHOSTED:cBody.WriteString('accountType=HOSTED&'); - end; - cBody.WriteString('Email='+FEmail+'&'); - cBody.WriteString('Passwd='+URLEncode(FPassword)+'&'); - cBody.WriteString('service='+ServiceIDs[ord(FService)]+'&'); - - if Length(Trim(FSource))>0 then - cBody.WriteString('source='+FSource) - else - cBody.WriteString('source='+DefaultAppName); - if Length(Trim(aLoginToken))>0 then - begin - cBody.WriteString('&logintoken='+aLoginToken); - cBody.WriteString('&logincaptcha='+aLoginCaptcha); - end; -// -ResponseText:=SendRequest(cBody.DataString); -// -Result:=ExpertLoginResult(ResponseText); -FLastResult:=Result; -if Assigned(FAfterLogin) then - OnAfterLogin(FLastResult,GetResultText) + // + cBody:=TStringStream.Create(''); + case FAccountType of + atNone,atHOSTED_OR_GOOGLE:cBody.WriteString('accountType=HOSTED_OR_GOOGLE&'); + atGOOGLE:cBody.WriteString('accountType=GOOGLE&'); + atHOSTED:cBody.WriteString('accountType=HOSTED&'); + end; + cBody.WriteString('Email='+FEmail+'&'); + cBody.WriteString('Passwd='+URLEncode(FPassword)+'&'); + cBody.WriteString('service='+ServiceIDs[ord(FService)]+'&'); + + if Length(Trim(FSource))>0 then + cBody.WriteString('source='+FSource) + else + cBody.WriteString('source='+DefaultAppName); + if Length(Trim(aLoginToken))>0 then + begin + cBody.WriteString('&logintoken='+aLoginToken); + cBody.WriteString('&logincaptcha='+aLoginCaptcha); + end; + // + ResponseText:=SendRequest(cBody.DataString); + // + Result:=ExpertLoginResult(ResponseText); + FLastResult:=Result; + if Assigned(FAfterLogin) then + OnAfterLogin(FLastResult,GetResultText) end; function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; @@ -311,42 +324,40 @@ function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; end; var hInternet,hConnect,hRequest : Pointer; dwBytesRead,I,L : Cardinal; - a:string; begin - a:=ParamStr; -try -hInternet := InternetOpen(PChar('GoogleLogin'),INTERNET_OPEN_TYPE_PRECONFIG,Nil,Nil,0); - if Assigned(hInternet) then - begin - // - hConnect := InternetConnect(hInternet,PChar('www.google.com'),Flags_connection,nil,nil,INTERNET_SERVICE_HTTP,0,1); - if Assigned(hConnect) then + try + hInternet := InternetOpen(PChar('GoogleLogin'),INTERNET_OPEN_TYPE_PRECONFIG,Nil,Nil,0); + if Assigned(hInternet) then begin - // - hRequest := HttpOpenRequest(hConnect,PChar(uppercase('post')),PChar('accounts/ClientLogin?'+ParamStr),HTTP_VERSION,nil,Nil,Flags_Request,1); - if Assigned(hRequest) then + // + hConnect := InternetConnect(hInternet,PChar('www.google.com'),Flags_connection,nil,nil,INTERNET_SERVICE_HTTP,0,1); + if Assigned(hConnect) then begin - // - I := 1; - if HttpSendRequest(hRequest,nil,0,nil,0) then + // + hRequest := HttpOpenRequest(hConnect,PChar(uppercase('post')),PChar('accounts/ClientLogin?'+ParamStr),HTTP_VERSION,nil,Nil,Flags_Request,1); + if Assigned(hRequest) then begin - repeat - DataAvailable(hRequest, L);// - - if L = 0 then break; - SetLength(Result,L + I); - if not InternetReadFile(hRequest,@Result[I],sizeof(L),dwBytesRead) then break;// - inc(I,dwBytesRead); - until dwBytesRead = 0; - Result[I] := #0; + // + I := 1; + if HttpSendRequest(hRequest,nil,0,nil,0) then + begin + repeat + DataAvailable(hRequest, L);// - + if L = 0 then break; + SetLength(Result,L + I); + if not InternetReadFile(hRequest,@Result[I],sizeof(L),dwBytesRead) then break;// + inc(I,dwBytesRead); + until dwBytesRead = 0; + Result[I] := #0; + end; end; end; end; - end; -finally - InternetCloseHandle(hRequest); - InternetCloseHandle(hConnect); - InternetCloseHandle(hInternet); -end; + finally + InternetCloseHandle(hRequest); + InternetCloseHandle(hConnect); + InternetCloseHandle(hInternet); + end; end; // , @@ -391,9 +402,9 @@ procedure TGoogleLogin.SetService(cService: TServices); procedure TGoogleLogin.SetSource(cSource: string); begin -FSource:=cSource; -if FLastResult=lrOk then - Disconnect;// + FSource:=cSource; + if FLastResult=lrOk then + Disconnect;// end; function TGoogleLogin.URLDecode(const S: string): string; @@ -504,4 +515,12 @@ function TGoogleLogin.URLEncode(const S: string): string; end; end; +{ TGoogleLoginThread } + +constructor TGoogleLoginThread.Create(CreateSuspennded: Boolean); +begin + inherited Create(CreateSuspennded); + +end; + end. From ffe297b20bcb0896b3498fc4e20cca058ec147c8 Mon Sep 17 00:00:00 2001 From: NMD Date: Sun, 4 Jul 2010 19:36:49 +0600 Subject: [PATCH 02/12] =?UTF-8?q?=D0=91=D0=B5=D0=B7=20=D0=BF=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/uGoogleLogin.pas | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/source/uGoogleLogin.pas b/source/uGoogleLogin.pas index 382c588..5cc172a 100644 --- a/source/uGoogleLogin.pas +++ b/source/uGoogleLogin.pas @@ -136,15 +136,6 @@ TGoogleLogin = class(TComponent) property OnDisconnect: TDisconnect read FDisconnect write FDisconnect; end; -// -type - TGoogleLoginThread=class (TThread) - private - public - google:TGoogleLogin; - constructor Create(CreateSuspennded: Boolean); - end; - procedure Register; @@ -183,12 +174,9 @@ procedure TGoogleLogin.Disconnect; end; constructor TGoogleLogin.Create(AOwner: TComponent); -var - g:TGoogleLoginThread; begin inherited Create(AOwner); FAppname:=DefaultAppName;// - g.google:=Self; end; function TGoogleLogin.ExpertLoginResult(const LoginResult: string): TLoginResult; @@ -515,12 +503,4 @@ function TGoogleLogin.URLEncode(const S: string): string; end; end; -{ TGoogleLoginThread } - -constructor TGoogleLoginThread.Create(CreateSuspennded: Boolean); -begin - inherited Create(CreateSuspennded); - -end; - end. From 5d77b4d36d5ec9f75542c1fd431022f85f40d597 Mon Sep 17 00:00:00 2001 From: NMD Date: Sun, 18 Jul 2010 19:49:28 +0600 Subject: [PATCH 03/12] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC=20=D0=BF=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=BA=D0=B5=20uGoogleLogin.pas=20=D1=80=D0=B0=D0=B7=D0=B1?= =?UTF-8?q?=D0=B8=D1=80=D0=B0=D1=8E=D1=81=D1=8C=20=D1=81=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BF=D1=87=D0=B5=D0=B9=20=D0=B5=D1=89=D0=B5=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B8=D1=82=20=D1=87=D1=82=D0=BE=20=D1=82?= =?UTF-8?q?=D0=BE=20=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20=D0=BE=D1=82=20=D1=81?= =?UTF-8?q?=D1=8E=D0=B4=D0=B0=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=82=D0=BE=D0=B3=D0=BE=20=D1=87=D1=82?= =?UTF-8?q?=D0=BE=D0=B1=D1=8B=20=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=B1?= =?UTF-8?q?=D1=8B=D0=BB=D0=BE=20=D0=B2=D0=BE=D1=81=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=82=D1=8C=D1=81=D1=8F=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D0=BB=D1=83=D1=87=D0=B0=D0=B9=20=D0=B5=D1=81=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=B2=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=83=D1=82=D0=B0=D1=8E=D1=81=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demos/Demo/main.dfm | 22 ++- demos/Demo/main.pas | 38 +++- source/GoogleLogin.dproj | 5 +- source/uGoogleLogin.pas | 380 +++++++++++++++++++++++++++++++-------- 4 files changed, 351 insertions(+), 94 deletions(-) diff --git a/demos/Demo/main.dfm b/demos/Demo/main.dfm index 61b7ea8..d974851 100644 --- a/demos/Demo/main.dfm +++ b/demos/Demo/main.dfm @@ -123,11 +123,25 @@ object Form11: TForm11 Height = 21 TabOrder = 5 end + object Button2: TButton + Left = 232 + Top = 84 + Width = 75 + Height = 21 + Caption = 'Button2' + TabOrder = 6 + OnClick = Button2Click + end object GoogleLogin1: TGoogleLogin - AccountType = atHOSTED_OR_GOOGLE + AppName = + 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/2' + + '0100625 Firefox/3.6.6' + AccountType = atNone Service = tsNone - OnAfterLogin = GoogleLogin1AfterLogin - Left = 256 - Top = 4 + OnAutorization = GoogleLogin1Autorization + OnError = GoogleLogin1Error + OnDisconnect = GoogleLogin1Disconnect + Left = 192 + Top = 48 end end diff --git a/demos/Demo/main.pas b/demos/Demo/main.pas index 58af92a..9802d99 100644 --- a/demos/Demo/main.pas +++ b/demos/Demo/main.pas @@ -14,16 +14,20 @@ TForm11 = class(TForm) PassEdit: TEdit; Button1: TButton; Label4: TLabel; - GoogleLogin1: TGoogleLogin; Label3: TLabel; Label5: TLabel; ComboBox1: TComboBox; Label6: TLabel; AuthEdit: TEdit; ResultEdit: TEdit; + GoogleLogin1: TGoogleLogin; + Button2: TButton; procedure Button1Click(Sender: TObject); - procedure GoogleLogin1AfterLogin(const LoginResult: TLoginResult; - LoginStr: string); + procedure GoogleLogin1Autorization(const LoginResult: TLoginResult; + Result: TResultRec); + procedure GoogleLogin1Error(const ErrorStr: string); + procedure Button2Click(Sender: TObject); + procedure GoogleLogin1Disconnect(const ResultStr: string); private { Private declarations } public @@ -46,11 +50,31 @@ procedure TForm11.Button1Click(Sender: TObject); GoogleLogin1.Login(); end; -procedure TForm11.GoogleLogin1AfterLogin(const LoginResult: TLoginResult; - LoginStr: string); +procedure TForm11.Button2Click(Sender: TObject); +begin + GoogleLogin1.Disconnect; +end; + +procedure TForm11.GoogleLogin1Autorization(const LoginResult: TLoginResult; + Result: TResultRec); +begin + ResultEdit.Text:=Result.LoginStr; + AuthEdit.Text:=Result.Auth; + if LoginResult =lrOk then + ShowMessage(' !!!!!!!!!') + else + ShowMessage(' !!!!!!!!!'); + +end; + +procedure TForm11.GoogleLogin1Disconnect(const ResultStr: string); +begin + ShowMessage('Disconnect'); +end; + +procedure TForm11.GoogleLogin1Error(const ErrorStr: string); begin - ResultEdit.Text:=LoginStr; - AuthEdit.Text:=GoogleLogin1.Auth; + ShowMessage(ErrorStr); end; end. diff --git a/source/GoogleLogin.dproj b/source/GoogleLogin.dproj index bcc391b..d9d26df 100644 --- a/source/GoogleLogin.dproj +++ b/source/GoogleLogin.dproj @@ -97,10 +97,7 @@ 1.0.0.0 - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - + 12 diff --git a/source/uGoogleLogin.pas b/source/uGoogleLogin.pas index 5cc172a..febafb4 100644 --- a/source/uGoogleLogin.pas +++ b/source/uGoogleLogin.pas @@ -18,7 +18,7 @@ interface -uses WinInet, StrUtils, SysUtils, Classes; +uses WinInet, StrUtils, SysUtils, Classes,Windows; resourcestring rcNone = ' '; @@ -33,6 +33,9 @@ interface rcServiceDisabled =' '; rcServiceUnavailable =' , '; rcDisconnect =' '; + // + rcErrServer=' #'; + rcErrDont= ' '; const DefaultAppName = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6'; @@ -71,12 +74,65 @@ interface 'mail','health','local','lh2','annotateweb','wise','sitemaps','youtube'); type - TAfterLogin = procedure (const LoginResult: TLoginResult; LoginStr:string)of object; + TResultRec = packed record + LoginStr:string;// + SID : string;// + LSID : string;// + Auth : string; + end; + +type + TAutorization = procedure (const LoginResult: TLoginResult; Result:TResultRec)of object;// + TErrorAutorization = procedure (const ErrorStr:string)of object;// )) TDisconnect = procedure (const ResultStr:string)of object; type + // HTML + TGoogleLoginThread = class(TThread) + private + { private declarations } + FParamStr : string;// + FLogintoken : string; + // / + FResultRec:TResultRec;// + FCaptchaURL : string; + + FLastResult : TLoginResult;// + + // + FAutorization : TAutorization;// + FErrorAutorization : TErrorAutorization; + + function ExpertLoginResult(const LoginResult:string):TLoginResult;// + function GetLoginError(const str: string):TLoginResult;// + + function GetCaptchaURL(const cList:TStringList):string;// + function GetCaptchaToken(const cList:TStringList):String; + + function GetResultText:string; + + function GetErrorText(const FromServer: BOOLEAN): string;// + + procedure SynAutoriz;// + procedure SynErrAutoriz;// + protected + { protected declarations } + public + { public declarations } + constructor Create(CreateSuspennded: Boolean;aParamStr:string);// + procedure Execute;override;// + published + { published declarations } + // + property OnAutorization:TAutorization read FAutorization write FAutorization;// + property OnError:TErrorAutorization read FErrorAutorization write FErrorAutorization;// (( + end; + + //"" TGoogleLogin = class(TComponent) private + // + FThread:TGoogleLoginThread; // FAppname : string; // , , . FAccountType : TAccountType; @@ -84,27 +140,24 @@ TGoogleLogin = class(TComponent) FEmail : string; FPassword : string; // / - FSID : string;// - FLSID : string;// - FAuth : string; + //FSID : string;// + //FLSID : string;// + //FAuth : string; FService : TServices;// - FSource : string;// FLogintoken : string; FLogincaptcha : string; + // Captcha FCaptchaURL : string; - FAfterLogin : TAfterLogin; + + FAfterLogin:TAutorization; + FErrorAutorization : TErrorAutorization; + FDisconnect : TDisconnect; - function SendRequest(const ParamStr: string):AnsiString; - function ExpertLoginResult(const LoginResult:string):TLoginResult; - function GetLoginError(const str: string):TLoginResult; - function GetCaptchaToken(const cList:TStringList):String; - function GetCaptchaURL(const cList:TStringList):string; - function GetResultText:string; + function SendRequest(const ParamStr: string):AnsiString;// procedure SetEmail(cEmail:string); procedure SetPassword(cPassword:string); procedure SetService(cService:TServices); - procedure SetSource(cSource: string); procedure SetCaptcha(cCaptcha:string); procedure SetAppName(value:string); //////////////// ////////////////////////// @@ -112,27 +165,26 @@ TGoogleLogin = class(TComponent) // url function URLEncode(const S: string): string; // url - function URLDecode(const S: string): string; + function URLDecode(const S: string): string;// public constructor Create(AOwner: TComponent);override; - function Login(aLoginToken:string='';aLoginCaptcha:string=''):TLoginResult;overload; + procedure Login(aLoginToken:string='';aLoginCaptcha:string=''); // procedure Disconnect;// property LastResult: TLoginResult read FLastResult; - property LastResultText:string read GetResultText; - property Auth: string read FAuth; - property SID: string read FSID; - property LSID: string read FLSID; - property CaptchaURL: string read FCaptchaURL; - property LoginToken: string read FLogintoken; - property LoginCaptcha: string read FLogincaptcha write FLogincaptcha; +// property Auth: string read FAuth; +// property SID: string read FSID; +// property LSID: string read FLSID; +// property CaptchaURL: string read FCaptchaURL; +// property LoginToken: string read FLogintoken; +// property LoginCaptcha: string read FLogincaptcha write FLogincaptcha; published property AppName:string read FAppname write SetAppName; property AccountType: TAccountType read FAccountType write FAccountType; property Email: string read FEmail write SetEmail; property Password:string read FPassword write SetPassword; property Service: TServices read FService write SetService; - property Source: string read FSource write FSource; - property OnAfterLogin :TAfterLogin read FAfterLogin write FAfterLogin; + property OnAutorization :TAutorization read FAfterLogin write FAfterLogin; + property OnError:TErrorAutorization read FErrorAutorization write FErrorAutorization;// (( property OnDisconnect: TDisconnect read FDisconnect write FDisconnect; end; @@ -162,13 +214,15 @@ procedure TGoogleLogin.Disconnect; begin FAccountType:=atNone; FLastResult:=lrNone; - FSID:=''; - FLSID:=''; - FAuth:=''; +// FSID:=''; +// FLSID:=''; +// FAuth:=''; FLogintoken:=''; FLogincaptcha:=''; FCaptchaURL:=''; FLogintoken:=''; + if Assigned(FThread) then + FThread.Terminate; if Assigned(FDisconnect) then OnDisconnect(rcDisconnect) end; @@ -178,7 +232,7 @@ constructor TGoogleLogin.Create(AOwner: TComponent); inherited Create(AOwner); FAppname:=DefaultAppName;// end; - +{ function TGoogleLogin.ExpertLoginResult(const LoginResult: string): TLoginResult; var List: TStringList; i:integer; @@ -220,7 +274,8 @@ function TGoogleLogin.ExpertLoginResult(const LoginResult: string): TLoginResult end; FreeAndNil(List); end; - +} +{ function TGoogleLogin.GetCaptchaToken(const cList: TStringList): String; var i:integer; begin @@ -233,7 +288,8 @@ function TGoogleLogin.GetCaptchaToken(const cList: TStringList): String; end; end; end; - +} +{ function TGoogleLogin.GetCaptchaURL(const cList: TStringList): string; var i:integer; begin @@ -246,7 +302,8 @@ function TGoogleLogin.GetCaptchaURL(const cList: TStringList): string; end; end; end; - +} +{ function TGoogleLogin.GetLoginError(const str: string): TLoginResult; var ErrorText:string; begin @@ -254,7 +311,8 @@ function TGoogleLogin.GetLoginError(const str: string): TLoginResult; ErrorText:=Trim(copy(str,pos('=',str)+1,Length(str)-pos('=',str))); Result:=TLoginResult(AnsiIndexStr(ErrorText,Errors)+2); end; - +} +{ function TGoogleLogin.GetResultText: string; begin case FLastResult of @@ -271,12 +329,11 @@ function TGoogleLogin.GetResultText: string; lrServiceUnavailable: Result:=rcServiceUnavailable; end; end; - -function TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string): TLoginResult; +} +procedure TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string); var cBody: TStringStream; ResponseText: string; begin - // cBody:=TStringStream.Create(''); case FAccountType of atNone,atHOSTED_OR_GOOGLE:cBody.WriteString('accountType=HOSTED_OR_GOOGLE&'); @@ -287,8 +344,8 @@ function TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string): TLoginResult; cBody.WriteString('Passwd='+URLEncode(FPassword)+'&'); cBody.WriteString('service='+ServiceIDs[ord(FService)]+'&'); - if Length(Trim(FSource))>0 then - cBody.WriteString('source='+FSource) + if Length(Trim(FAppname))>0 then + cBody.WriteString('source='+FAppname) else cBody.WriteString('source='+DefaultAppName); if Length(Trim(aLoginToken))>0 then @@ -298,54 +355,24 @@ function TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string): TLoginResult; end; // ResponseText:=SendRequest(cBody.DataString); +{ // Result:=ExpertLoginResult(ResponseText); FLastResult:=Result; if Assigned(FAfterLogin) then OnAfterLogin(FLastResult,GetResultText) +} end; function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; - function DataAvailable(hRequest: pointer; out Size : cardinal): boolean; - begin - result := wininet.InternetQueryDataAvailable(hRequest, Size, 0, 0); - end; -var hInternet,hConnect,hRequest : Pointer; - dwBytesRead,I,L : Cardinal; begin - try - hInternet := InternetOpen(PChar('GoogleLogin'),INTERNET_OPEN_TYPE_PRECONFIG,Nil,Nil,0); - if Assigned(hInternet) then - begin - // - hConnect := InternetConnect(hInternet,PChar('www.google.com'),Flags_connection,nil,nil,INTERNET_SERVICE_HTTP,0,1); - if Assigned(hConnect) then - begin - // - hRequest := HttpOpenRequest(hConnect,PChar(uppercase('post')),PChar('accounts/ClientLogin?'+ParamStr),HTTP_VERSION,nil,Nil,Flags_Request,1); - if Assigned(hRequest) then - begin - // - I := 1; - if HttpSendRequest(hRequest,nil,0,nil,0) then - begin - repeat - DataAvailable(hRequest, L);// - - if L = 0 then break; - SetLength(Result,L + I); - if not InternetReadFile(hRequest,@Result[I],sizeof(L),dwBytesRead) then break;// - inc(I,dwBytesRead); - until dwBytesRead = 0; - Result[I] := #0; - end; - end; - end; - end; - finally - InternetCloseHandle(hRequest); - InternetCloseHandle(hConnect); - InternetCloseHandle(hInternet); - end; + // + FThread:=TGoogleLoginThread.Create(true,ParamStr); + FThread.OnAutorization:=Self.OnAutorization; + FThread.OnError:=Self.OnError; + FThread.FreeOnTerminate:=True;// + FThread.Resume;// + // ( ) end; // , @@ -387,14 +414,14 @@ procedure TGoogleLogin.SetService(cService: TServices); Login; // end; end; - +{ procedure TGoogleLogin.SetSource(cSource: string); begin FSource:=cSource; if FLastResult=lrOk then Disconnect;// end; - +} function TGoogleLogin.URLDecode(const S: string): string; var i, idx, len, n_coded: Integer; @@ -503,4 +530,199 @@ function TGoogleLogin.URLEncode(const S: string): string; end; end; +{ TGoogleLoginThread } + +constructor TGoogleLoginThread.Create(CreateSuspennded: Boolean;aParamStr:string); +begin + inherited Create(CreateSuspennded); + FParamStr:=aParamStr; + FResultRec.LoginStr:=''; + FResultRec.SID:=''; + FResultRec.LSID:=''; + FResultRec.Auth:=''; +end; + +procedure TGoogleLoginThread.Execute; + function DataAvailable(hRequest: pointer; out Size : cardinal): boolean; + begin + result := wininet.InternetQueryDataAvailable(hRequest, Size, 0, 0); + end; +var + hInternet,hConnect,hRequest : Pointer; + dwBytesRead,I,L : Cardinal; + sTemp:AnsiString;// +begin + try + hInternet := InternetOpen(PChar('GoogleLogin'),INTERNET_OPEN_TYPE_PRECONFIG,Nil,Nil,0); + if Assigned(hInternet) then + begin + // + hConnect := InternetConnect(hInternet,PChar('www.google.com'),Flags_connection,nil,nil,INTERNET_SERVICE_HTTP,0,1); + if Assigned(hConnect) then + begin + // + hRequest := HttpOpenRequest(hConnect,PChar(uppercase('post')),PChar('accounts/ClientLogin?'+FParamStr),HTTP_VERSION,nil,Nil,Flags_Request,1); + if Assigned(hRequest) then + begin + // + I := 1; + if HttpSendRequest(hRequest,nil,0,nil,0) then + begin + repeat + DataAvailable(hRequest, L);// - + if L = 0 then break; + SetLength(sTemp,L + I); + if not InternetReadFile(hRequest,@sTemp[I],sizeof(L),dwBytesRead) then break;// + inc(I,dwBytesRead); + if Terminated then // + begin + InternetCloseHandle(hRequest); + InternetCloseHandle(hConnect); + InternetCloseHandle(hInternet); + Exit; + end; + until dwBytesRead = 0; + sTemp[I] := #0; + end; + end; + end; + end; + except + Synchronize(SynErrAutoriz); + Exit;// + end; + InternetCloseHandle(hRequest); + InternetCloseHandle(hConnect); + InternetCloseHandle(hInternet); + // + FLastResult:=ExpertLoginResult(sTemp); + FResultRec.LoginStr:=GetResultText; + Synchronize(SynAutoriz); +end; + +function TGoogleLoginThread.ExpertLoginResult(const LoginResult: string): TLoginResult; +var List: TStringList; + i:integer; +begin + // + List:=TStringList.Create; + List.Text:=LoginResult; + // + if pos('error',LowerCase(LoginResult))>0 then // + begin + for i:=0 to List.Count-1 do + begin + if pos('error',LowerCase(List[i]))>0 then // + begin + Result:=GetLoginError(List[i]);// + break; + end; + end; + if Result=lrCaptchaRequired then // + begin + FCaptchaURL:=GetCaptchaURL(List); + FLogintoken:=GetCaptchaToken(List); + end; + end + else + begin + Result:=lrOk; + for i:=0 to List.Count-1 do + begin + if pos('SID',UpperCase(List[i]))>0 then + FResultRec.SID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) + else + if pos('LSID',UpperCase(List[i]))>0 then + FResultRec.LSID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) + else + if pos('AUTH',UpperCase(List[i]))>0 then + FResultRec.Auth:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))); + end; + end; + FreeAndNil(List); +end; + +function TGoogleLoginThread.GetCaptchaToken(const cList: TStringList): String; +var i:integer; +begin + for I := 0 to cList.Count - 1 do + begin + if pos('captchatoken',lowerCase(cList[i]))>0 then + begin + Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); + break; + end; + end; +end; + +function TGoogleLoginThread.GetCaptchaURL(const cList: TStringList): string; +var i:integer; +begin + for I := 0 to cList.Count - 1 do + begin + if pos('captchaurl',lowerCase(cList[i]))>0 then + begin + Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); + break; + end; + end; +end; + +// FromServer TRUE, , . +function TGoogleLoginThread.GetErrorText(const FromServer: BOOLEAN): string; +var + Msg: array[0..1023] of Char; + ErCode, Len: Cardinal; +begin + Len := SizeOf(Msg); + ZeroMemory(@Msg, SizeOf(Msg)); + if FromServer then + if InternetGetLastResponseInfo(ErCode, @Msg, Len) then + Result := rcErrServer + IntToStr(ErCode) + #13 + StrPas( Msg ) + else + Result := rcErrDont + else if FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,nil, GetLastError,GetKeyboardLayout(0),@Msg, SizeOf(Msg), nil) <> 0 then + Result := StrPas(Msg) + else + Result := rcErrDont; +end; + + +function TGoogleLoginThread.GetLoginError(const str: string): TLoginResult; +var ErrorText:string; +begin + // + ErrorText:=Trim(copy(str,pos('=',str)+1,Length(str)-pos('=',str))); + Result:=TLoginResult(AnsiIndexStr(ErrorText,Errors)+2); +end; + +function TGoogleLoginThread.GetResultText: string; +begin + case FLastResult of + lrNone: Result:=rcNone; + lrOk: Result:=rcOk; + lrBadAuthentication: Result:=rcBadAuthentication; + lrNotVerified: Result:=rcNotVerified; + lrTermsNotAgreed: Result:=rcTermsNotAgreed; + lrCaptchaRequired: Result:=rcCaptchaRequired; + lrUnknown: Result:=rcUnknown; + lrAccountDeleted: Result:=rcAccountDeleted; + lrAccountDisabled: Result:=rcAccountDisabled; + lrServiceDisabled: Result:=rcServiceDisabled; + lrServiceUnavailable: Result:=rcServiceUnavailable; + end; +end; + +procedure TGoogleLoginThread.SynAutoriz; +begin + if Assigned(FAutorization) then + OnAutorization(FLastResult,FResultRec); +end; + +procedure TGoogleLoginThread.SynErrAutoriz; +begin + if Assigned(FErrorAutorization) then + OnError(GetErrorText(True));// +end; + end. From 01e13a10244cdb92833c2b4f86cab40da0d36a26 Mon Sep 17 00:00:00 2001 From: NMD Date: Sun, 18 Jul 2010 20:12:21 +0600 Subject: [PATCH 04/12] =?UTF-8?q?=D0=98=D0=B7=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=BE=D1=82=20=D0=BC=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=20ServiceIDs=20(=D0=B4=D1=83=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85),=20=D0=BE=D1=81=D1=82=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BD=D0=B8=20=D1=82=D1=83=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D1=83))TServices=20=D0=BD=D0=B5=D0=BE=D0=B1=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE=20=D0=B1=D1=8B=D0=BB=D0=BE=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B8=D1=82=D1=8C=20ServiceIDs?= =?UTF-8?q?=20=D0=BD=D0=BE=20=D1=8F=20=D0=B7=D0=B0=D0=B1=D1=8B=D0=BB=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=B2=D1=81=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=BE=D1=80=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UTF8 --- demos/Demo/main.dfm | 5 +- demos/Demo/main.pas | 2 +- source/uGoogleLogin.pas | 800 ++++++++++++++++++---------------------- 3 files changed, 366 insertions(+), 441 deletions(-) diff --git a/demos/Demo/main.dfm b/demos/Demo/main.dfm index d974851..551755e 100644 --- a/demos/Demo/main.dfm +++ b/demos/Demo/main.dfm @@ -61,6 +61,7 @@ object Form11: TForm11 Width = 121 Height = 21 TabOrder = 0 + Text = 'GoLabApi@gmail.com' end object PassEdit: TEdit Left = 213 @@ -68,6 +69,7 @@ object Form11: TForm11 Width = 121 Height = 21 TabOrder = 1 + Text = '123456789her' end object Button1: TButton Left = 120 @@ -137,10 +139,7 @@ object Form11: TForm11 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/2' + '0100625 Firefox/3.6.6' AccountType = atNone - Service = tsNone OnAutorization = GoogleLogin1Autorization - OnError = GoogleLogin1Error - OnDisconnect = GoogleLogin1Disconnect Left = 192 Top = 48 end diff --git a/demos/Demo/main.pas b/demos/Demo/main.pas index 9802d99..cd03619 100644 --- a/demos/Demo/main.pas +++ b/demos/Demo/main.pas @@ -20,8 +20,8 @@ TForm11 = class(TForm) Label6: TLabel; AuthEdit: TEdit; ResultEdit: TEdit; - GoogleLogin1: TGoogleLogin; Button2: TButton; + GoogleLogin1: TGoogleLogin; procedure Button1Click(Sender: TObject); procedure GoogleLogin1Autorization(const LoginResult: TLoginResult; Result: TResultRec); diff --git a/source/uGoogleLogin.pas b/source/uGoogleLogin.pas index febafb4..1241121 100644 --- a/source/uGoogleLogin.pas +++ b/source/uGoogleLogin.pas @@ -1,193 +1,194 @@ -{*******************************************************} -{ } -{ Delphi & Google API } -{ } -{ File: uGoogleLogin } -{ Copyright (c) WebDelphi.ru } -{ All Rights Reserved. } -{ } -{ } -{ } -{*******************************************************} - -{*******************************************************} -{ GoogleLogin Component } -{*******************************************************} +{ ******************************************************* } +{ } +{ Delphi & Google API } +{ } +{ File: uGoogleLogin } +{ Copyright (c) WebDelphi.ru } +{ All Rights Reserved. } +{ } +{ } +{ } +{ ******************************************************* } + +{ ******************************************************* } +{ GoogleLogin Component } +{ ******************************************************* } unit uGoogleLogin; interface -uses WinInet, StrUtils, SysUtils, Classes,Windows; +uses WinInet, StrUtils, SysUtils, Classes, Windows, TypInfo; resourcestring - rcNone = ' '; - rcOk = ' '; - rcBadAuthentication =' , '; - rcNotVerified =' , , '; - rcTermsNotAgreed =' '; - rcCaptchaRequired =' CAPTCHA'; - rcUnknown =' '; - rcAccountDeleted =' '; - rcAccountDisabled =' '; - rcServiceDisabled =' '; - rcServiceUnavailable =' , '; - rcDisconnect =' '; - // - rcErrServer=' #'; - rcErrDont= ' '; + rcNone = 'Аутентификация не производилась или сброшена'; + rcOk = 'Аутентификация прошла успешно'; + rcBadAuthentication = + 'Не удалось распознать имя пользователя или пароль, использованные в запросе на вход'; + rcNotVerified = + 'Адрес электронной почты, связанный с аккаунтом, не был подтвержден'; + rcTermsNotAgreed = 'Пользователь не принял условия использования службы'; + rcCaptchaRequired = 'Требуется ответ на тест CAPTCHA'; + rcUnknown = 'Неизвестная ошибка'; + rcAccountDeleted = 'Аккаунт этого пользователя удален'; + rcAccountDisabled = 'Аккаунт этого пользователя отключен'; + rcServiceDisabled = 'Доступ пользователя к указанной службе запрещен'; + rcServiceUnavailable = 'Служба недоступна, повторите попытку позже'; + rcDisconnect = 'Соединение с сервером разорвано'; + // ошибки соединения + rcErrServer = 'На сервере произошла ошибка #'; + rcErrDont = 'Не могу получить описание ошибки'; const - DefaultAppName = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6'; - + // дефолное название приложение через которое якобы происходит соединение с сервером гугла + DefaultAppName = + 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6'; + // настройки wininet для работы с ssl Flags_Connection = INTERNET_DEFAULT_HTTPS_PORT; - - Flags_Request = INTERNET_FLAG_RELOAD or - INTERNET_FLAG_IGNORE_CERT_CN_INVALID or - INTERNET_FLAG_NO_CACHE_WRITE or - INTERNET_FLAG_SECURE or - INTERNET_FLAG_PRAGMA_NOCACHE or - INTERNET_FLAG_KEEP_CONNECTION; - - Errors : array [0..8] of string = ('BadAuthentication','NotVerified', - 'TermsNotAgreed','CaptchaRequired','Unknown','AccountDeleted', - 'AccountDisabled', 'ServiceDisabled','ServiceUnavailable'); + Flags_Request = + INTERNET_FLAG_RELOAD or INTERNET_FLAG_IGNORE_CERT_CN_INVALID + or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_SECURE or + INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_KEEP_CONNECTION; + // ошибки при авторизации + Errors: array [0 .. 8] of string = ('BadAuthentication', 'NotVerified', + 'TermsNotAgreed', 'CaptchaRequired', 'Unknown', 'AccountDeleted', + 'AccountDisabled', 'ServiceDisabled', 'ServiceUnavailable'); type - TAccountType = (atNone ,atGOOGLE, atHOSTED, atHOSTED_OR_GOOGLE); + TAccountType = (atNone, atGOOGLE, atHOSTED, atHOSTED_OR_GOOGLE); type - TLoginResult = (lrNone,lrOk, lrBadAuthentication, lrNotVerified, - lrTermsNotAgreed, lrCaptchaRequired, lrUnknown, - lrAccountDeleted, lrAccountDisabled, lrServiceDisabled, - lrServiceUnavailable); + TLoginResult = (lrNone, lrOk, lrBadAuthentication, lrNotVerified, + lrTermsNotAgreed, lrCaptchaRequired, lrUnknown, lrAccountDeleted, + lrAccountDisabled, lrServiceDisabled, lrServiceUnavailable); type - TServices = (tsNone,tsAnalytics,tsApps,tsGBase,tsSites,tsBlogger,tsBookSearch, - tsCelendar,tcCodeSearch,tsContacts,tsDocLists,tsFinance, - tsGMailFeed,tsHealth,tsMaps,tsPicasa,tsSidewiki,tsSpreadsheets, - tsWebmaster,tsYouTube); - -const - ServiceIDs: array[0..19]of string=('xapi','analytics','apps','gbase', - 'jotspot','blogger','print','cl','codesearch','cp','writely','finance', - 'mail','health','local','lh2','annotateweb','wise','sitemaps','youtube'); + // xapi - это универсальное имя - когда юзер не знает какой сервис ему нужен, то втыкает xapi и просто коннектится к Гуглу + TServices = (xapi, analytics, apps, gbase, jotspot, blogger, print, cl, + codesearch, cp, writely, finance, mail, health, local, lh2, annotateweb, + wise, sitemaps, youtube); type TResultRec = packed record - LoginStr:string;// - SID : string;// - LSID : string;// - Auth : string; + LoginStr: string; // текстовый результат авторизации + SID: string; // в настоящее время не используется + LSID: string; // в настоящее время не используется + Auth: string; end; type - TAutorization = procedure (const LoginResult: TLoginResult; Result:TResultRec)of object;// - TErrorAutorization = procedure (const ErrorStr:string)of object;// )) - TDisconnect = procedure (const ResultStr:string)of object; + TAutorization = procedure(const LoginResult: TLoginResult; + Result: TResultRec) of object; // авторизировались + TErrorAutorization = procedure(const ErrorStr: string) of object; + // а это не авторизировались)) + TDisconnect = procedure(const ResultStr: string) of object; type - // HTML + // поток используется только для получения HTML страницы TGoogleLoginThread = class(TThread) private { private declarations } - FParamStr : string;// - FLogintoken : string; - // / - FResultRec:TResultRec;// - FCaptchaURL : string; + FParamStr: string; // параметры запроса + FLogintoken: string; + // данные ответа/запроса + FResultRec: TResultRec; // структура для передачи результатов + + FCaptchaURL: string; - FLastResult : TLoginResult;// + FLastResult: TLoginResult; // результаты авторизации - // - FAutorization : TAutorization;// - FErrorAutorization : TErrorAutorization; + // События + FAutorization: TAutorization; // авторизация + FErrorAutorization: TErrorAutorization; - function ExpertLoginResult(const LoginResult:string):TLoginResult;// - function GetLoginError(const str: string):TLoginResult;// + function ExpertLoginResult(const LoginResult: string): TLoginResult; + // анализ результата авторизации + function GetLoginError(const str: string): TLoginResult; + // получаем тип ошибки - function GetCaptchaURL(const cList:TStringList):string;// - function GetCaptchaToken(const cList:TStringList):String; + function GetCaptchaURL(const cList: TStringList): string; // ссылка на капчу + function GetCaptchaToken(const cList: TStringList): String; - function GetResultText:string; + function GetResultText: string; - function GetErrorText(const FromServer: BOOLEAN): string;// + function GetErrorText(const FromServer: BOOLEAN): string; + // получаем текст ошибки - procedure SynAutoriz;// - procedure SynErrAutoriz;// + procedure SynAutoriz; // передача значения авторизации в главную форму как положено в потоке + procedure SynErrAutoriz; // передача значения ошибки в главную форму как положено в потоке protected { protected declarations } public { public declarations } - constructor Create(CreateSuspennded: Boolean;aParamStr:string);// - procedure Execute;override;// + constructor Create(CreateSuspennded: BOOLEAN; aParamStr: string); + // используем для передачи логина и пароля и подобного + procedure Execute; override; // выполняем непосредственно авторизацию на сайте published { published declarations } - // - property OnAutorization:TAutorization read FAutorization write FAutorization;// - property OnError:TErrorAutorization read FErrorAutorization write FErrorAutorization;// (( + // события + property OnAutorization + : TAutorization read FAutorization write FAutorization; + // авторизировались + property OnError: TErrorAutorization read FErrorAutorization write + FErrorAutorization; // возникла ошибка (( end; - //"" + // "шкурка" компонента TGoogleLogin = class(TComponent) private - // - FThread:TGoogleLoginThread; - // - FAppname : string; // , , . - FAccountType : TAccountType; - FLastResult : TLoginResult; - FEmail : string; - FPassword : string; - // / - //FSID : string;// - //FLSID : string;// - //FAuth : string; - FService : TServices;// - FLogintoken : string; - FLogincaptcha : string; - - // Captcha - FCaptchaURL : string; - - FAfterLogin:TAutorization; - FErrorAutorization : TErrorAutorization; - - FDisconnect : TDisconnect; - function SendRequest(const ParamStr: string):AnsiString;// - procedure SetEmail(cEmail:string); - procedure SetPassword(cPassword:string); - procedure SetService(cService:TServices); - procedure SetCaptcha(cCaptcha:string); - procedure SetAppName(value:string); - //////////////// ////////////////////////// + // Поток + FThread: TGoogleLoginThread; + // регистрационные данные + FAppname: string; // строка символов, которая передается серверу и идентифицирует программное обеспечение, пославшее запрос. + FAccountType: TAccountType; + FLastResult: TLoginResult; + FEmail: string; + FPassword: string; + // данные ответа/запроса + FService: TServices; // сервис к которому необходимо получить доступ + FLogintoken: string; + FLogincaptcha: string; + // параметры Captcha + FCaptchaURL: string; + FAfterLogin: TAutorization; + FErrorAutorization: TErrorAutorization; + FDisconnect: TDisconnect; + function SendRequest(const ParamStr: string): AnsiString; + // отправляем запрос на сервер + procedure SetEmail(cEmail: string); + procedure SetPassword(cPassword: string); + procedure SetService(cService: TServices); + procedure SetCaptcha(cCaptcha: string); + procedure SetAppName(value: string); + /// /////////////вспомогательные функции////////////////////////// function DigitToHex(Digit: Integer): Char; - // url + // кодирование url function URLEncode(const S: string): string; - // url - function URLDecode(const S: string): string;// + // декодирование url + function URLDecode(const S: string): string; // не используется public - constructor Create(AOwner: TComponent);override; - procedure Login(aLoginToken:string='';aLoginCaptcha:string=''); // - procedure Disconnect;// + constructor Create(AOwner: TComponent); override; + procedure Login(aLoginToken: string = ''; aLoginCaptcha: string = ''); + // формируем запрос + procedure Disconnect; // удаляет все данные по авторизации property LastResult: TLoginResult read FLastResult; -// property Auth: string read FAuth; -// property SID: string read FSID; -// property LSID: string read FLSID; -// property CaptchaURL: string read FCaptchaURL; -// property LoginToken: string read FLogintoken; -// property LoginCaptcha: string read FLogincaptcha write FLogincaptcha; + // property Auth: string read FAuth; + // property SID: string read FSID; + // property LSID: string read FLSID; + // property CaptchaURL: string read FCaptchaURL; + // property LoginToken: string read FLogintoken; + // property LoginCaptcha: string read FLogincaptcha write FLogincaptcha; published - property AppName:string read FAppname write SetAppName; + property AppName: string read FAppname write SetAppName; property AccountType: TAccountType read FAccountType write FAccountType; property Email: string read FEmail write SetEmail; - property Password:string read FPassword write SetPassword; - property Service: TServices read FService write SetService; - property OnAutorization :TAutorization read FAfterLogin write FAfterLogin; - property OnError:TErrorAutorization read FErrorAutorization write FErrorAutorization;// (( + property Password: string read FPassword write SetPassword; + property Service: TServices read FService write SetService default xapi; + property OnAutorization: TAutorization read FAfterLogin write FAfterLogin; + property OnError: TErrorAutorization read FErrorAutorization write + FErrorAutorization; // возникла ошибка (( property OnDisconnect: TDisconnect read FDisconnect write FDisconnect; -end; - + end; procedure Register; @@ -195,7 +196,7 @@ implementation procedure Register; begin - RegisterComponents('WebDelphi.ru',[TGoogleLogin]); + RegisterComponents('WebDelphi.ru', [TGoogleLogin]); end; { TGoogleLogin } @@ -203,8 +204,10 @@ procedure Register; function TGoogleLogin.DigitToHex(Digit: Integer): Char; begin case Digit of - 0..9: Result := Chr(Digit + Ord('0')); - 10..15: Result := Chr(Digit - 10 + Ord('A')); + 0 .. 9: + Result := Chr(Digit + Ord('0')); + 10 .. 15: + Result := Chr(Digit - 10 + Ord('A')); else Result := '0'; end; @@ -212,15 +215,15 @@ function TGoogleLogin.DigitToHex(Digit: Integer): Char; procedure TGoogleLogin.Disconnect; begin - FAccountType:=atNone; - FLastResult:=lrNone; -// FSID:=''; -// FLSID:=''; -// FAuth:=''; - FLogintoken:=''; - FLogincaptcha:=''; - FCaptchaURL:=''; - FLogintoken:=''; + FAccountType := atNone; + FLastResult := lrNone; + // FSID:=''; + // FLSID:=''; + // FAuth:=''; + FLogintoken := ''; + FLogincaptcha := ''; + FCaptchaURL := ''; + FLogintoken := ''; if Assigned(FThread) then FThread.Terminate; if Assigned(FDisconnect) then @@ -230,198 +233,94 @@ procedure TGoogleLogin.Disconnect; constructor TGoogleLogin.Create(AOwner: TComponent); begin inherited Create(AOwner); - FAppname:=DefaultAppName;// -end; -{ -function TGoogleLogin.ExpertLoginResult(const LoginResult: string): TLoginResult; -var List: TStringList; - i:integer; -begin - // - List:=TStringList.Create; - List.Text:=LoginResult; - // - if pos('error',LowerCase(LoginResult))>0 then // - begin - for i:=0 to List.Count-1 do - begin - if pos('error',LowerCase(List[i]))>0 then // - begin - Result:=GetLoginError(List[i]);// - break; - end; - end; - if Result=lrCaptchaRequired then // - begin - FCaptchaURL:=GetCaptchaURL(List); - FLogintoken:=GetCaptchaToken(List); - end; - end - else - begin - Result:=lrOk; - for i:=0 to List.Count-1 do - begin - if pos('SID',UpperCase(List[i]))>0 then - FSID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) - else - if pos('LSID',UpperCase(List[i]))>0 then - FLSID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) - else - if pos('AUTH',UpperCase(List[i]))>0 then - FAuth:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))); - end; - end; - FreeAndNil(List); -end; -} -{ -function TGoogleLogin.GetCaptchaToken(const cList: TStringList): String; -var i:integer; -begin - for I := 0 to cList.Count - 1 do - begin - if pos('captchatoken',lowerCase(cList[i]))>0 then - begin - Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); - break; - end; - end; -end; -} -{ -function TGoogleLogin.GetCaptchaURL(const cList: TStringList): string; -var i:integer; -begin - for I := 0 to cList.Count - 1 do - begin - if pos('captchaurl',lowerCase(cList[i]))>0 then - begin - Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); - break; - end; - end; -end; -} -{ -function TGoogleLogin.GetLoginError(const str: string): TLoginResult; -var ErrorText:string; -begin - // - ErrorText:=Trim(copy(str,pos('=',str)+1,Length(str)-pos('=',str))); - Result:=TLoginResult(AnsiIndexStr(ErrorText,Errors)+2); -end; -} -{ -function TGoogleLogin.GetResultText: string; -begin - case FLastResult of - lrNone: Result:=rcNone; - lrOk: Result:=rcOk; - lrBadAuthentication: Result:=rcBadAuthentication; - lrNotVerified: Result:=rcNotVerified; - lrTermsNotAgreed: Result:=rcTermsNotAgreed; - lrCaptchaRequired: Result:=rcCaptchaRequired; - lrUnknown: Result:=rcUnknown; - lrAccountDeleted: Result:=rcAccountDeleted; - lrAccountDisabled: Result:=rcAccountDisabled; - lrServiceDisabled: Result:=rcServiceDisabled; - lrServiceUnavailable: Result:=rcServiceUnavailable; - end; + FAppname := DefaultAppName; // дефолтное значение end; -} + procedure TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string); -var cBody: TStringStream; - ResponseText: string; +var + cBody: TStringStream; + ResponseText: string; begin - cBody:=TStringStream.Create(''); + cBody := TStringStream.Create(''); case FAccountType of - atNone,atHOSTED_OR_GOOGLE:cBody.WriteString('accountType=HOSTED_OR_GOOGLE&'); - atGOOGLE:cBody.WriteString('accountType=GOOGLE&'); - atHOSTED:cBody.WriteString('accountType=HOSTED&'); + atNone, atHOSTED_OR_GOOGLE: + cBody.WriteString('accountType=HOSTED_OR_GOOGLE&'); + atGOOGLE: + cBody.WriteString('accountType=GOOGLE&'); + atHOSTED: + cBody.WriteString('accountType=HOSTED&'); end; - cBody.WriteString('Email='+FEmail+'&'); - cBody.WriteString('Passwd='+URLEncode(FPassword)+'&'); - cBody.WriteString('service='+ServiceIDs[ord(FService)]+'&'); - - if Length(Trim(FAppname))>0 then - cBody.WriteString('source='+FAppname) + cBody.WriteString('Email=' + FEmail + '&'); + cBody.WriteString('Passwd=' + URLEncode(FPassword) + '&'); + cBody.WriteString('service=' + GetEnumName(TypeInfo(TServices), + Ord(FAccountType)) + '&'); + // cBody.WriteString('service='+ServiceIDs[ord(FService)]+'&'); + ResponseText := GetEnumName(TypeInfo(TServices), Integer(FService)); + + if Length(Trim(FAppname)) > 0 then + cBody.WriteString('source=' + FAppname) else - cBody.WriteString('source='+DefaultAppName); - if Length(Trim(aLoginToken))>0 then + cBody.WriteString('source=' + DefaultAppName); + if Length(Trim(aLoginToken)) > 0 then begin - cBody.WriteString('&logintoken='+aLoginToken); - cBody.WriteString('&logincaptcha='+aLoginCaptcha); + cBody.WriteString('&logintoken=' + aLoginToken); + cBody.WriteString('&logincaptcha=' + aLoginCaptcha); end; - // - ResponseText:=SendRequest(cBody.DataString); -{ - // - Result:=ExpertLoginResult(ResponseText); - FLastResult:=Result; - if Assigned(FAfterLogin) then - OnAfterLogin(FLastResult,GetResultText) -} + // отправляем запрос на сервер + ResponseText := SendRequest(cBody.DataString); end; function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; begin - // - FThread:=TGoogleLoginThread.Create(true,ParamStr); - FThread.OnAutorization:=Self.OnAutorization; - FThread.OnError:=Self.OnError; - FThread.FreeOnTerminate:=True;// - FThread.Resume;// - // ( ) + // отправляем запрос на сервер в отдельном потоке + FThread := TGoogleLoginThread.Create(true, ParamStr); + FThread.OnAutorization := Self.OnAutorization; + FThread.OnError := Self.OnError; + FThread.FreeOnTerminate := true; // чтобы сам себя грухнул после окончания операции + FThread.Resume; // запуск + // тут делать смысла что то нет так как данные еще не получены(они ведь будут получены в другом потоке) end; -// , -// , . +// устанавливаем значение строки символов, которая передается серверу +// идентифицирует программное обеспечение, пославшее запрос. procedure TGoogleLogin.SetAppName(value: string); begin - if not (value ='') then - FAppname:=value + if not(value = '') then + FAppname := value else - FAppname:=DefaultAppName; + FAppname := DefaultAppName; end; procedure TGoogleLogin.SetCaptcha(cCaptcha: string); begin - FLogincaptcha:=cCaptcha; - Login(FLogintoken,FLogincaptcha);// + FLogincaptcha := cCaptcha; + Login(FLogintoken, FLogincaptcha); // перелогиниваемся с каптчей end; procedure TGoogleLogin.SetEmail(cEmail: string); begin - FEmail:=cEmail; - if FLastResult=lrOk then - Disconnect;// + FEmail := cEmail; + if FLastResult = lrOk then + Disconnect; // обнуляем результаты end; procedure TGoogleLogin.SetPassword(cPassword: string); begin - FPassword:=cPassword; - if FLastResult=lrOk then - Disconnect;// + FPassword := cPassword; + if FLastResult = lrOk then + Disconnect; // обнуляем результаты end; procedure TGoogleLogin.SetService(cService: TServices); begin - FService:=cService; - if FLastResult=lrOk then - begin - Disconnect;// - Login; // - end; -end; -{ -procedure TGoogleLogin.SetSource(cSource: string); -begin - FSource:=cSource; - if FLastResult=lrOk then - Disconnect;// + FService := cService; + if FLastResult = lrOk then + begin + Disconnect; // обнуляем результаты + Login; // перелогиниваемся + end; end; -} + function TGoogleLogin.URLDecode(const S: string): string; var i, idx, len, n_coded: Integer; @@ -436,6 +335,7 @@ function TGoogleLogin.URLDecode(const S: string): string; else Result := Ord(HexChar) - Ord('a') + 10; end; + begin len := 0; n_coded := 0; @@ -444,13 +344,13 @@ function TGoogleLogin.URLDecode(const S: string): string; begin n_coded := n_coded + 1; if n_coded >= 3 then - n_coded := 0; + n_coded := 0; end else begin len := len + 1; if S[i] = '%' then - n_coded := 1; + n_coded := 1; end; SetLength(Result, len); idx := 0; @@ -461,8 +361,8 @@ function TGoogleLogin.URLDecode(const S: string): string; n_coded := n_coded + 1; if n_coded >= 3 then begin - Result[idx] := Chr((WebHexToInt(S[i - 1]) * 16 + - WebHexToInt(S[i])) mod 256); + Result[idx] := Chr((WebHexToInt(S[i - 1]) * 16 + WebHexToInt(S[i])) + mod 256); n_coded := 0; end; end @@ -470,26 +370,26 @@ function TGoogleLogin.URLDecode(const S: string): string; begin idx := idx + 1; if S[i] = '%' then - n_coded := 1; + n_coded := 1; if S[i] = '+' then - Result[idx] := ' ' + Result[idx] := ' ' else - Result[idx] := S[i]; + Result[idx] := S[i]; end; end; { -RUS - URL , - , - - ! -US google translator -URL encoding correct a problem with the fact that if a user password is -special character but now he goes through the authorization correctly -just when you query the server special character is simply discarded -the account login is not checked! + RUS + кодирование URL исправило проблему с тем, что если в пароле пользователя есть + спец символ то теперь, он проходит авторизацию корректно + просто при отправке запроса серверу спец символ просто отбрасывался + на счет логина не проверял! + US google translator + URL encoding correct a problem with the fact that if a user password is + special character but now he goes through the authorization correctly + just when you query the server special character is simply discarded + the account login is not checked! } function TGoogleLogin.URLEncode(const S: string): string; @@ -498,11 +398,10 @@ function TGoogleLogin.URLEncode(const S: string): string; begin len := 0; for i := 1 to Length(S) do - if ((S[i] >= '0') and (S[i] <= '9')) or - ((S[i] >= 'A') and (S[i] <= 'Z')) or - ((S[i] >= 'a') and (S[i] <= 'z')) or (S[i] = ' ') or - (S[i] = '_') or (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then - len := len + 1 + if ((S[i] >= '0') and (S[i] <= '9')) or ((S[i] >= 'A') and (S[i] <= 'Z')) + or ((S[i] >= 'a') and (S[i] <= 'z')) or (S[i] = ' ') or (S[i] = '_') or + (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then + len := len + 1 else len := len + 3; SetLength(Result, len); @@ -514,9 +413,8 @@ function TGoogleLogin.URLEncode(const S: string): string; idx := idx + 1; end else if ((S[i] >= '0') and (S[i] <= '9')) or - ((S[i] >= 'A') and (S[i] <= 'Z')) or - ((S[i] >= 'a') and (S[i] <= 'z')) or - (S[i] = '_') or (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then + ((S[i] >= 'A') and (S[i] <= 'Z')) or ((S[i] >= 'a') and (S[i] <= 'z')) + or (S[i] = '_') or (S[i] = '*') or (S[i] = '-') or (S[i] = '.') then begin Result[idx] := S[i]; idx := idx + 1; @@ -532,197 +430,225 @@ function TGoogleLogin.URLEncode(const S: string): string; { TGoogleLoginThread } -constructor TGoogleLoginThread.Create(CreateSuspennded: Boolean;aParamStr:string); +constructor TGoogleLoginThread.Create(CreateSuspennded: BOOLEAN; + aParamStr: string); begin inherited Create(CreateSuspennded); - FParamStr:=aParamStr; - FResultRec.LoginStr:=''; - FResultRec.SID:=''; - FResultRec.LSID:=''; - FResultRec.Auth:=''; + FParamStr := aParamStr; + FResultRec.LoginStr := ''; + FResultRec.SID := ''; + FResultRec.LSID := ''; + FResultRec.Auth := ''; end; procedure TGoogleLoginThread.Execute; - function DataAvailable(hRequest: pointer; out Size : cardinal): boolean; + function DataAvailable(hRequest: pointer; out Size: cardinal): BOOLEAN; begin - result := wininet.InternetQueryDataAvailable(hRequest, Size, 0, 0); + Result := WinInet.InternetQueryDataAvailable(hRequest, Size, 0, 0); end; + var - hInternet,hConnect,hRequest : Pointer; - dwBytesRead,I,L : Cardinal; - sTemp:AnsiString;// + hInternet, hConnect, hRequest: pointer; + dwBytesRead, i, L: cardinal; + sTemp: AnsiString; // текст страницы begin try - hInternet := InternetOpen(PChar('GoogleLogin'),INTERNET_OPEN_TYPE_PRECONFIG,Nil,Nil,0); + hInternet := InternetOpen(PChar('GoogleLogin'), + INTERNET_OPEN_TYPE_PRECONFIG, Nil, Nil, 0); if Assigned(hInternet) then begin - // - hConnect := InternetConnect(hInternet,PChar('www.google.com'),Flags_connection,nil,nil,INTERNET_SERVICE_HTTP,0,1); + // Открываем сессию + hConnect := InternetConnect(hInternet, PChar('www.google.com'), + Flags_Connection, nil, nil, INTERNET_SERVICE_HTTP, 0, 1); if Assigned(hConnect) then + begin + // Формируем запрос + hRequest := HttpOpenRequest(hConnect, PChar(uppercase('post')), + PChar('accounts/ClientLogin?' + FParamStr), HTTP_VERSION, nil, Nil, + Flags_Request, 1); + if Assigned(hRequest) then begin - // - hRequest := HttpOpenRequest(hConnect,PChar(uppercase('post')),PChar('accounts/ClientLogin?'+FParamStr),HTTP_VERSION,nil,Nil,Flags_Request,1); - if Assigned(hRequest) then - begin - // - I := 1; - if HttpSendRequest(hRequest,nil,0,nil,0) then - begin - repeat - DataAvailable(hRequest, L);// - - if L = 0 then break; - SetLength(sTemp,L + I); - if not InternetReadFile(hRequest,@sTemp[I],sizeof(L),dwBytesRead) then break;// - inc(I,dwBytesRead); - if Terminated then // - begin - InternetCloseHandle(hRequest); - InternetCloseHandle(hConnect); - InternetCloseHandle(hInternet); - Exit; - end; - until dwBytesRead = 0; - sTemp[I] := #0; - end; - end; + // Отправляем запрос + i := 1; + if HttpSendRequest(hRequest, nil, 0, nil, 0) then + begin + repeat + DataAvailable(hRequest, L); // Получаем кол-во принимаемых данных + if L = 0 then + break; + SetLength(sTemp, L + i); + if not InternetReadFile(hRequest, @sTemp[i], sizeof(L), + dwBytesRead) then + break; // Получаем данные с сервера + inc(i, dwBytesRead); + if Terminated then // проверка для экстренного закрытия потока + begin + InternetCloseHandle(hRequest); + InternetCloseHandle(hConnect); + InternetCloseHandle(hInternet); + Exit; + end; + until dwBytesRead = 0; + sTemp[i] := #0; + end; end; + end; end; except Synchronize(SynErrAutoriz); - Exit;// + Exit; // сваливаем отсюда end; InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); - // - FLastResult:=ExpertLoginResult(sTemp); - FResultRec.LoginStr:=GetResultText; + // получаем результаты авторизации + FLastResult := ExpertLoginResult(sTemp); + FResultRec.LoginStr := GetResultText; Synchronize(SynAutoriz); end; -function TGoogleLoginThread.ExpertLoginResult(const LoginResult: string): TLoginResult; -var List: TStringList; - i:integer; +function TGoogleLoginThread.ExpertLoginResult(const LoginResult: string) + : TLoginResult; +var + List: TStringList; + i: Integer; begin - // - List:=TStringList.Create; - List.Text:=LoginResult; - // - if pos('error',LowerCase(LoginResult))>0 then // + // грузим ответ сервера в список + List := TStringList.Create; + List.Text := LoginResult; + // анализируем построчно + if pos('error', LowerCase(LoginResult)) > 0 then // есть сообщение об ошибке begin - for i:=0 to List.Count-1 do + for i := 0 to List.Count - 1 do begin - if pos('error',LowerCase(List[i]))>0 then // + if pos('error', LowerCase(List[i])) > 0 then // строка с ошибкой begin - Result:=GetLoginError(List[i]);// + Result := GetLoginError(List[i]); // получили тип ошибки break; end; end; - if Result=lrCaptchaRequired then // + if Result = lrCaptchaRequired then // требуется ввод каптчи begin - FCaptchaURL:=GetCaptchaURL(List); - FLogintoken:=GetCaptchaToken(List); + FCaptchaURL := GetCaptchaURL(List); + FLogintoken := GetCaptchaToken(List); end; end else begin - Result:=lrOk; - for i:=0 to List.Count-1 do + Result := lrOk; + for i := 0 to List.Count - 1 do begin - if pos('SID',UpperCase(List[i]))>0 then - FResultRec.SID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) - else - if pos('LSID',UpperCase(List[i]))>0 then - FResultRec.LSID:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))) - else - if pos('AUTH',UpperCase(List[i]))>0 then - FResultRec.Auth:=Trim(copy(List[i],pos('=',List[i])+1,Length(List[i])-pos('=',List[i]))); + if pos('SID', uppercase(List[i])) > 0 then + FResultRec.SID := Trim(copy(List[i], pos('=', List[i]) + 1, + Length(List[i]) - pos('=', List[i]))) + else if pos('LSID', uppercase(List[i])) > 0 then + FResultRec.LSID := Trim(copy(List[i], pos('=', List[i]) + 1, + Length(List[i]) - pos('=', List[i]))) + else if pos('AUTH', uppercase(List[i])) > 0 then + FResultRec.Auth := Trim(copy(List[i], pos('=', List[i]) + 1, + Length(List[i]) - pos('=', List[i]))); end; end; FreeAndNil(List); end; function TGoogleLoginThread.GetCaptchaToken(const cList: TStringList): String; -var i:integer; +var + i: Integer; begin - for I := 0 to cList.Count - 1 do + for i := 0 to cList.Count - 1 do begin - if pos('captchatoken',lowerCase(cList[i]))>0 then + if pos('captchatoken', LowerCase(cList[i])) > 0 then begin - Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); + Result := Trim(copy(cList[i], pos('=', cList[i]) + 1, + Length(cList[i]) - pos('=', cList[i]))); break; end; end; end; function TGoogleLoginThread.GetCaptchaURL(const cList: TStringList): string; -var i:integer; +var + i: Integer; begin - for I := 0 to cList.Count - 1 do + for i := 0 to cList.Count - 1 do begin - if pos('captchaurl',lowerCase(cList[i]))>0 then + if pos('captchaurl', LowerCase(cList[i])) > 0 then begin - Result:=Trim(copy(cList[i],pos('=',cList[i])+1,Length(cList[i])-pos('=',cList[i]))); + Result := Trim(copy(cList[i], pos('=', cList[i]) + 1, + Length(cList[i]) - pos('=', cList[i]))); break; end; end; end; -// FromServer TRUE, , . +// Если параметр FromServer TRUE, то код ошибки и её текст берется с сервера, в противном случае берется текст локальной ошибки. function TGoogleLoginThread.GetErrorText(const FromServer: BOOLEAN): string; var - Msg: array[0..1023] of Char; - ErCode, Len: Cardinal; + Msg: array [0 .. 1023] of Char; + ErCode, len: cardinal; begin - Len := SizeOf(Msg); - ZeroMemory(@Msg, SizeOf(Msg)); + len := sizeof(Msg); + ZeroMemory(@Msg, sizeof(Msg)); if FromServer then - if InternetGetLastResponseInfo(ErCode, @Msg, Len) then - Result := rcErrServer + IntToStr(ErCode) + #13 + StrPas( Msg ) + if InternetGetLastResponseInfo(ErCode, @Msg, len) then + Result := rcErrServer + IntToStr(ErCode) + #13 + StrPas(Msg) else Result := rcErrDont - else if FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,nil, GetLastError,GetKeyboardLayout(0),@Msg, SizeOf(Msg), nil) <> 0 then - Result := StrPas(Msg) - else - Result := rcErrDont; + else if FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError, + GetKeyboardLayout(0), @Msg, sizeof(Msg), nil) <> 0 then + Result := StrPas(Msg) + else + Result := rcErrDont; end; - function TGoogleLoginThread.GetLoginError(const str: string): TLoginResult; -var ErrorText:string; +var + ErrorText: string; begin - // - ErrorText:=Trim(copy(str,pos('=',str)+1,Length(str)-pos('=',str))); - Result:=TLoginResult(AnsiIndexStr(ErrorText,Errors)+2); + // получили текст ошибки + ErrorText := Trim(copy(str, pos('=', str) + 1, Length(str) - pos('=', str))); + Result := TLoginResult(AnsiIndexStr(ErrorText, Errors) + 2); end; function TGoogleLoginThread.GetResultText: string; begin case FLastResult of - lrNone: Result:=rcNone; - lrOk: Result:=rcOk; - lrBadAuthentication: Result:=rcBadAuthentication; - lrNotVerified: Result:=rcNotVerified; - lrTermsNotAgreed: Result:=rcTermsNotAgreed; - lrCaptchaRequired: Result:=rcCaptchaRequired; - lrUnknown: Result:=rcUnknown; - lrAccountDeleted: Result:=rcAccountDeleted; - lrAccountDisabled: Result:=rcAccountDisabled; - lrServiceDisabled: Result:=rcServiceDisabled; - lrServiceUnavailable: Result:=rcServiceUnavailable; + lrNone: + Result := rcNone; + lrOk: + Result := rcOk; + lrBadAuthentication: + Result := rcBadAuthentication; + lrNotVerified: + Result := rcNotVerified; + lrTermsNotAgreed: + Result := rcTermsNotAgreed; + lrCaptchaRequired: + Result := rcCaptchaRequired; + lrUnknown: + Result := rcUnknown; + lrAccountDeleted: + Result := rcAccountDeleted; + lrAccountDisabled: + Result := rcAccountDisabled; + lrServiceDisabled: + Result := rcServiceDisabled; + lrServiceUnavailable: + Result := rcServiceUnavailable; end; end; procedure TGoogleLoginThread.SynAutoriz; begin if Assigned(FAutorization) then - OnAutorization(FLastResult,FResultRec); + OnAutorization(FLastResult, FResultRec); end; procedure TGoogleLoginThread.SynErrAutoriz; begin if Assigned(FErrorAutorization) then - OnError(GetErrorText(True));// + OnError(GetErrorText(true)); // получаем текст ошибки end; end. From 68ac3ea1eb62eda67f3532d756e092e4297851ae Mon Sep 17 00:00:00 2001 From: NMD Date: Mon, 19 Jul 2010 20:20:54 +0600 Subject: [PATCH 05/12] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0=20=D0=BF=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=20=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B5=D1=81=D1=81=D0=B0=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demos/Demo/main.dfm | 41 ++++++++++++++++++++++++++++++------ demos/Demo/main.pas | 13 +++++++++--- source/uGoogleLogin.pas | 46 ++++++++++++++++------------------------- 3 files changed, 63 insertions(+), 37 deletions(-) diff --git a/demos/Demo/main.dfm b/demos/Demo/main.dfm index 551755e..335c9ee 100644 --- a/demos/Demo/main.dfm +++ b/demos/Demo/main.dfm @@ -2,8 +2,8 @@ object Form11: TForm11 Left = 0 Top = 0 Caption = 'Google Login' - ClientHeight = 167 - ClientWidth = 340 + ClientHeight = 219 + ClientWidth = 355 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -55,6 +55,20 @@ object Form11: TForm11 Height = 13 Caption = 'AUTH' end + object Label7: TLabel + Left = 8 + Top = 168 + Width = 61 + Height = 13 + Caption = 'TLoginResult' + end + object Label8: TLabel + Left = 8 + Top = 195 + Width = 31 + Height = 13 + Caption = 'Label8' + end object EmailEdit: TEdit Left = 38 Top = 27 @@ -112,14 +126,14 @@ object Form11: TForm11 'YouTube Data API') end object AuthEdit: TEdit - Left = 68 + Left = 84 Top = 138 Width = 264 Height = 21 TabOrder = 4 end object ResultEdit: TEdit - Left = 68 + Left = 84 Top = 111 Width = 264 Height = 21 @@ -134,13 +148,28 @@ object Form11: TForm11 TabOrder = 6 OnClick = Button2Click end + object Edit1: TEdit + Left = 84 + Top = 165 + Width = 264 + Height = 21 + TabOrder = 7 + end + object Edit2: TEdit + Left = 84 + Top = 192 + Width = 264 + Height = 21 + TabOrder = 8 + Text = 'Edit2' + end object GoogleLogin1: TGoogleLogin AppName = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/2' + '0100625 Firefox/3.6.6' AccountType = atNone OnAutorization = GoogleLogin1Autorization - Left = 192 - Top = 48 + Left = 176 + Top = 8 end end diff --git a/demos/Demo/main.pas b/demos/Demo/main.pas index cd03619..554e628 100644 --- a/demos/Demo/main.pas +++ b/demos/Demo/main.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, StdCtrls, uGoogleLogin; + Dialogs, StdCtrls, uGoogleLogin,TypInfo; type TForm11 = class(TForm) @@ -22,6 +22,10 @@ TForm11 = class(TForm) ResultEdit: TEdit; Button2: TButton; GoogleLogin1: TGoogleLogin; + Edit1: TEdit; + Label7: TLabel; + Edit2: TEdit; + Label8: TLabel; procedure Button1Click(Sender: TObject); procedure GoogleLogin1Autorization(const LoginResult: TLoginResult; Result: TResultRec); @@ -55,11 +59,14 @@ procedure TForm11.Button2Click(Sender: TObject); GoogleLogin1.Disconnect; end; -procedure TForm11.GoogleLogin1Autorization(const LoginResult: TLoginResult; - Result: TResultRec); +procedure TForm11.GoogleLogin1Autorization(const LoginResult: TLoginResult;Result: TResultRec); +var + temp:string; begin ResultEdit.Text:=Result.LoginStr; AuthEdit.Text:=Result.Auth; + temp:=GetEnumName(TypeInfo(TLoginResult),Integer(LoginResult)); + Edit1.Text:=temp; if LoginResult =lrOk then ShowMessage(' !!!!!!!!!') else diff --git a/source/uGoogleLogin.pas b/source/uGoogleLogin.pas index 1241121..1a7a7ae 100644 --- a/source/uGoogleLogin.pas +++ b/source/uGoogleLogin.pas @@ -59,14 +59,16 @@ interface type TLoginResult = (lrNone, lrOk, lrBadAuthentication, lrNotVerified, - lrTermsNotAgreed, lrCaptchaRequired, lrUnknown, lrAccountDeleted, - lrAccountDisabled, lrServiceDisabled, lrServiceUnavailable); + lrTermsNotAgreed, lrCaptchaRequired, lrUnknown, lrAccountDeleted, + lrAccountDisabled, lrServiceDisabled, lrServiceUnavailable); type // xapi - это универсальное имя - когда юзер не знает какой сервис ему нужен, то втыкает xapi и просто коннектится к Гуглу TServices = (xapi, analytics, apps, gbase, jotspot, blogger, print, cl, - codesearch, cp, writely, finance, mail, health, local, lh2, annotateweb, - wise, sitemaps, youtube); + codesearch, cp, writely, finance, mail, health, local, lh2, annotateweb, + wise, sitemaps, youtube); +type + TStatusThread = (sttActive,sttNoActive);//статус потока type TResultRec = packed record @@ -77,10 +79,8 @@ interface end; type - TAutorization = procedure(const LoginResult: TLoginResult; - Result: TResultRec) of object; // авторизировались - TErrorAutorization = procedure(const ErrorStr: string) of object; - // а это не авторизировались)) + TAutorization = procedure(const LoginResult: TLoginResult; Result: TResultRec) of object; // авторизировались + TErrorAutorization = procedure(const ErrorStr: string) of object; // а это не авторизировались)) TDisconnect = procedure(const ResultStr: string) of object; type @@ -88,6 +88,7 @@ interface TGoogleLoginThread = class(TThread) private { private declarations } + FStatus:TStatusThread;//статус потока FParamStr: string; // параметры запроса FLogintoken: string; // данные ответа/запроса @@ -101,10 +102,8 @@ TGoogleLoginThread = class(TThread) FAutorization: TAutorization; // авторизация FErrorAutorization: TErrorAutorization; - function ExpertLoginResult(const LoginResult: string): TLoginResult; - // анализ результата авторизации - function GetLoginError(const str: string): TLoginResult; - // получаем тип ошибки + function ExpertLoginResult(const LoginResult: string): TLoginResult; // анализ результата авторизации + function GetLoginError(const str: string): TLoginResult;// получаем тип ошибки function GetCaptchaURL(const cList: TStringList): string; // ссылка на капчу function GetCaptchaToken(const cList: TStringList): String; @@ -120,17 +119,13 @@ TGoogleLoginThread = class(TThread) { protected declarations } public { public declarations } - constructor Create(CreateSuspennded: BOOLEAN; aParamStr: string); - // используем для передачи логина и пароля и подобного + constructor Create(CreateSuspennded: BOOLEAN; aParamStr: string); // используем для передачи логина и пароля и подобного procedure Execute; override; // выполняем непосредственно авторизацию на сайте published { published declarations } // события - property OnAutorization - : TAutorization read FAutorization write FAutorization; - // авторизировались - property OnError: TErrorAutorization read FErrorAutorization write - FErrorAutorization; // возникла ошибка (( + property OnAutorization:TAutorization read FAutorization write FAutorization; // авторизировались + property OnError: TErrorAutorization read FErrorAutorization write FErrorAutorization; // возникла ошибка (( end; // "шкурка" компонента @@ -171,7 +166,7 @@ TGoogleLogin = class(TComponent) procedure Login(aLoginToken: string = ''; aLoginCaptcha: string = ''); // формируем запрос procedure Disconnect; // удаляет все данные по авторизации - property LastResult: TLoginResult read FLastResult; + //property LastResult: TLoginResult read FLastResult;//убрал за ненадобностью по причине того что все передается в SynAutoriz // property Auth: string read FAuth; // property SID: string read FSID; // property LSID: string read FLSID; @@ -185,8 +180,7 @@ TGoogleLogin = class(TComponent) property Password: string read FPassword write SetPassword; property Service: TServices read FService write SetService default xapi; property OnAutorization: TAutorization read FAfterLogin write FAfterLogin; - property OnError: TErrorAutorization read FErrorAutorization write - FErrorAutorization; // возникла ошибка (( + property OnError: TErrorAutorization read FErrorAutorization write FErrorAutorization; // возникла ошибка (( property OnDisconnect: TDisconnect read FDisconnect write FDisconnect; end; @@ -252,10 +246,7 @@ procedure TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string); end; cBody.WriteString('Email=' + FEmail + '&'); cBody.WriteString('Passwd=' + URLEncode(FPassword) + '&'); - cBody.WriteString('service=' + GetEnumName(TypeInfo(TServices), - Ord(FAccountType)) + '&'); - // cBody.WriteString('service='+ServiceIDs[ord(FService)]+'&'); - ResponseText := GetEnumName(TypeInfo(TServices), Integer(FService)); + cBody.WriteString('service=' + GetEnumName(TypeInfo(TServices),Integer(FService)) + '&'); if Length(Trim(FAppname)) > 0 then cBody.WriteString('source=' + FAppname) @@ -477,8 +468,7 @@ procedure TGoogleLoginThread.Execute; if L = 0 then break; SetLength(sTemp, L + i); - if not InternetReadFile(hRequest, @sTemp[i], sizeof(L), - dwBytesRead) then + if not InternetReadFile(hRequest, @sTemp[i], sizeof(L),dwBytesRead) then break; // Получаем данные с сервера inc(i, dwBytesRead); if Terminated then // проверка для экстренного закрытия потока From 7f544ca8347f3efcbc2b8a8fd68bcb41a11ff49d Mon Sep 17 00:00:00 2001 From: NMD Date: Mon, 19 Jul 2010 21:32:57 +0600 Subject: [PATCH 06/12] =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=BA=D1=80=D1=83?= =?UTF-8?q?=D1=82=D0=B8=D0=BB=20TProgressAutorization=20=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D1=8E=D1=89=D0=B8=D0=B9=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D1=80=D0=B5=D1=81=D1=81=20=D0=B0=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8,=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=83=D1=81=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B5=D1=89=D0=B5=20=D0=BD=D0=B5=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BA=D1=80=D1=83=D1=82=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demos/Demo/main.dfm | 31 ++++++++++++++++++++- demos/Demo/main.pas | 18 +++++++++++- source/uGoogleLogin.pas | 61 +++++++++++++++++++++++++++++------------ 3 files changed, 90 insertions(+), 20 deletions(-) diff --git a/demos/Demo/main.dfm b/demos/Demo/main.dfm index 335c9ee..b90b602 100644 --- a/demos/Demo/main.dfm +++ b/demos/Demo/main.dfm @@ -2,7 +2,7 @@ object Form11: TForm11 Left = 0 Top = 0 Caption = 'Google Login' - ClientHeight = 219 + ClientHeight = 524 ClientWidth = 355 Color = clBtnFace Font.Charset = DEFAULT_CHARSET @@ -69,6 +69,20 @@ object Form11: TForm11 Height = 13 Caption = 'Label8' end + object Label9: TLabel + Left = 8 + Top = 264 + Width = 162 + Height = 13 + Caption = #1051#1086#1075' '#1082#1086#1083'-'#1074#1072' '#1087#1086#1083#1091#1095#1077#1085#1085#1099#1093' '#1076#1072#1085#1085#1099#1093 + end + object Label10: TLabel + Left = 8 + Top = 222 + Width = 114 + Height = 13 + Caption = #1055#1088#1086#1075#1088#1077#1089#1089' '#1072#1074#1090#1086#1088#1080#1079#1072#1094#1080#1080 + end object EmailEdit: TEdit Left = 38 Top = 27 @@ -163,12 +177,27 @@ object Form11: TForm11 TabOrder = 8 Text = 'Edit2' end + object ProgressBar1: TProgressBar + Left = 8 + Top = 241 + Width = 339 + Height = 17 + TabOrder = 9 + end + object Memo1: TMemo + Left = 8 + Top = 283 + Width = 339 + Height = 233 + TabOrder = 10 + end object GoogleLogin1: TGoogleLogin AppName = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/2' + '0100625 Firefox/3.6.6' AccountType = atNone OnAutorization = GoogleLogin1Autorization + OnProgressAutorization = GoogleLogin1ProgressAutorization Left = 176 Top = 8 end diff --git a/demos/Demo/main.pas b/demos/Demo/main.pas index 554e628..7f1b16a 100644 --- a/demos/Demo/main.pas +++ b/demos/Demo/main.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, StdCtrls, uGoogleLogin,TypInfo; + Dialogs, StdCtrls, uGoogleLogin,TypInfo, ComCtrls; type TForm11 = class(TForm) @@ -26,12 +26,17 @@ TForm11 = class(TForm) Label7: TLabel; Edit2: TEdit; Label8: TLabel; + ProgressBar1: TProgressBar; + Memo1: TMemo; + Label9: TLabel; + Label10: TLabel; procedure Button1Click(Sender: TObject); procedure GoogleLogin1Autorization(const LoginResult: TLoginResult; Result: TResultRec); procedure GoogleLogin1Error(const ErrorStr: string); procedure Button2Click(Sender: TObject); procedure GoogleLogin1Disconnect(const ResultStr: string); + procedure GoogleLogin1ProgressAutorization(const Progress, MaxProgress: Integer); private { Private declarations } public @@ -52,6 +57,7 @@ procedure TForm11.Button1Click(Sender: TObject); GoogleLogin1.Password:=PassEdit.Text; GoogleLogin1.Service:=TServices(ComboBox1.ItemIndex); GoogleLogin1.Login(); +Memo1.Clear;// end; procedure TForm11.Button2Click(Sender: TObject); @@ -84,4 +90,14 @@ procedure TForm11.GoogleLogin1Error(const ErrorStr: string); ShowMessage(ErrorStr); end; +procedure TForm11.GoogleLogin1ProgressAutorization(const Progress, MaxProgress: Integer); +begin + ProgressBar1.Position:=Progress; + ProgressBar1.Max:=MaxProgress; + Memo1.Lines.Add('////////'); + Memo1.Lines.Add('Progress '+IntToStr(Progress)); + Memo1.Lines.Add('MaxProgress '+IntToStr(MaxProgress)); + +end; + end. diff --git a/source/uGoogleLogin.pas b/source/uGoogleLogin.pas index 1a7a7ae..b0a4013 100644 --- a/source/uGoogleLogin.pas +++ b/source/uGoogleLogin.pas @@ -5,9 +5,9 @@ { File: uGoogleLogin } { Copyright (c) WebDelphi.ru } { All Rights Reserved. } -{ } -{ } -{ } +{ не обижайтесь писал на большом мониторе} +{ на счет комментариев, пишу много чтоб было понятно всем} +{ NMD} { ******************************************************* } { ******************************************************* } @@ -23,10 +23,8 @@ interface resourcestring rcNone = 'Аутентификация не производилась или сброшена'; rcOk = 'Аутентификация прошла успешно'; - rcBadAuthentication = - 'Не удалось распознать имя пользователя или пароль, использованные в запросе на вход'; - rcNotVerified = - 'Адрес электронной почты, связанный с аккаунтом, не был подтвержден'; + rcBadAuthentication = 'Не удалось распознать имя пользователя или пароль, использованные в запросе на вход'; + rcNotVerified = 'Адрес электронной почты, связанный с аккаунтом, не был подтвержден'; rcTermsNotAgreed = 'Пользователь не принял условия использования службы'; rcCaptchaRequired = 'Требуется ответ на тест CAPTCHA'; rcUnknown = 'Неизвестная ошибка'; @@ -41,14 +39,17 @@ interface const // дефолное название приложение через которое якобы происходит соединение с сервером гугла - DefaultAppName = - 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6'; + DefaultAppName ='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6'; + // настройки wininet для работы с ssl Flags_Connection = INTERNET_DEFAULT_HTTPS_PORT; - Flags_Request = - INTERNET_FLAG_RELOAD or INTERNET_FLAG_IGNORE_CERT_CN_INVALID - or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_SECURE or - INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_KEEP_CONNECTION; + + Flags_Request =INTERNET_FLAG_RELOAD or + INTERNET_FLAG_IGNORE_CERT_CN_INVALID or + INTERNET_FLAG_NO_CACHE_WRITE or + INTERNET_FLAG_SECURE or + INTERNET_FLAG_PRAGMA_NOCACHE or + INTERNET_FLAG_KEEP_CONNECTION; // ошибки при авторизации Errors: array [0 .. 8] of string = ('BadAuthentication', 'NotVerified', 'TermsNotAgreed', 'CaptchaRequired', 'Unknown', 'AccountDeleted', @@ -80,6 +81,8 @@ interface type TAutorization = procedure(const LoginResult: TLoginResult; Result: TResultRec) of object; // авторизировались + //Progress,MaxProgress переменные которые специально заведены для прогрессбара Progress-текущее состояние MaxProgress-максимальное значение + TProgressAutorization = procedure(const Progress,MaxProgress:Integer)of object;//показываем прогресс при авторизации TErrorAutorization = procedure(const ErrorStr: string) of object; // а это не авторизировались)) TDisconnect = procedure(const ResultStr: string) of object; @@ -88,7 +91,7 @@ interface TGoogleLoginThread = class(TThread) private { private declarations } - FStatus:TStatusThread;//статус потока + //FStatus:TStatusThread;//статус потока FParamStr: string; // параметры запроса FLogintoken: string; // данные ответа/запроса @@ -97,10 +100,12 @@ TGoogleLoginThread = class(TThread) FCaptchaURL: string; FLastResult: TLoginResult; // результаты авторизации - - // События + //для прогресса + FProgress,FMaxProgress:Integer; + //переменные для событий FAutorization: TAutorization; // авторизация - FErrorAutorization: TErrorAutorization; + FProgressAutorization:TProgressAutorization;//прогресс при авторизации для показа часиков и подобных вещей + FErrorAutorization: TErrorAutorization;//ошибка при авторизации function ExpertLoginResult(const LoginResult: string): TLoginResult; // анализ результата авторизации function GetLoginError(const str: string): TLoginResult;// получаем тип ошибки @@ -114,6 +119,7 @@ TGoogleLoginThread = class(TThread) // получаем текст ошибки procedure SynAutoriz; // передача значения авторизации в главную форму как положено в потоке + procedure SynProgressAutoriz;// передача текушего прогресса авторизации в главную форму как положено в потоке procedure SynErrAutoriz; // передача значения ошибки в главную форму как положено в потоке protected { protected declarations } @@ -125,6 +131,7 @@ TGoogleLoginThread = class(TThread) { published declarations } // события property OnAutorization:TAutorization read FAutorization write FAutorization; // авторизировались + property OnProgressAutorization: TProgressAutorization read FProgressAutorization write FProgressAutorization;//прогресс авторизации property OnError: TErrorAutorization read FErrorAutorization write FErrorAutorization; // возникла ошибка (( end; @@ -145,7 +152,9 @@ TGoogleLogin = class(TComponent) FLogincaptcha: string; // параметры Captcha FCaptchaURL: string; + //переменные для событий FAfterLogin: TAutorization; + FProgressAutorization:TProgressAutorization;//прогресс при авторизации для показа часиков и подобных вещей FErrorAutorization: TErrorAutorization; FDisconnect: TDisconnect; function SendRequest(const ParamStr: string): AnsiString; @@ -179,7 +188,8 @@ TGoogleLogin = class(TComponent) property Email: string read FEmail write SetEmail; property Password: string read FPassword write SetPassword; property Service: TServices read FService write SetService default xapi; - property OnAutorization: TAutorization read FAfterLogin write FAfterLogin; + property OnAutorization: TAutorization read FAfterLogin write FAfterLogin;// авторизировались + property OnProgressAutorization:TProgressAutorization read FProgressAutorization write FProgressAutorization;//прогресс авторизации property OnError: TErrorAutorization read FErrorAutorization write FErrorAutorization; // возникла ошибка (( property OnDisconnect: TDisconnect read FDisconnect write FDisconnect; end; @@ -266,6 +276,7 @@ function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; // отправляем запрос на сервер в отдельном потоке FThread := TGoogleLoginThread.Create(true, ParamStr); FThread.OnAutorization := Self.OnAutorization; + FThread.OnProgressAutorization:=Self.OnProgressAutorization;//прогресс авторизации FThread.OnError := Self.OnError; FThread.FreeOnTerminate := true; // чтобы сам себя грухнул после окончания операции FThread.Resume; // запуск @@ -430,6 +441,9 @@ constructor TGoogleLoginThread.Create(CreateSuspennded: BOOLEAN; FResultRec.SID := ''; FResultRec.LSID := ''; FResultRec.Auth := ''; + //переменные для прогресса + FProgress:=0; + FMaxProgress:=0; end; procedure TGoogleLoginThread.Execute; @@ -478,6 +492,10 @@ procedure TGoogleLoginThread.Execute; InternetCloseHandle(hInternet); Exit; end; + FProgress:=i;//текущее значение прогресса авторизации + if FMaxProgress=0 then//зачем постоянно забивать максимальное значение + FMaxProgress:=L+1; + Synchronize(SynProgressAutoriz);//синхронизация прогресса until dwBytesRead = 0; sTemp[i] := #0; end; @@ -641,4 +659,11 @@ procedure TGoogleLoginThread.SynErrAutoriz; OnError(GetErrorText(true)); // получаем текст ошибки end; + +procedure TGoogleLoginThread.SynProgressAutoriz; +begin + if Assigned(FProgressAutorization) then + OnProgressAutorization(FProgress,FMaxProgress); // передаем прогресс авторизации +end; + end. From 10af7ea11f03538cefe3dea79785231e21da9bb0 Mon Sep 17 00:00:00 2001 From: NMD Date: Mon, 19 Jul 2010 23:39:00 +0600 Subject: [PATCH 07/12] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BE=D1=82=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BE=D0=B3=D1=80=D0=B0=D0=BD=D0=BD=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B2=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B0=D1=81=D1=8C.=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D1=87=D0=B8=D0=BD=D0=B0=20=D1=83=D0=B6=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B7=D0=BD=D1=8F=D0=BA=20=D0=BC=D0=B5=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=D1=81=D1=8F=20=D0=BF=D0=BE=D1=80=D0=B0=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B0=D1=82=D1=8C,=20=D0=B7=D0=B0=D0=B2=D1=82=D1=80?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Необходимо ограничить кол-во одновременно запускаемых потоков --- demos/Demo/main.dfm | 13 ++++++++++++- demos/Demo/main.pas | 15 ++++++++++----- source/uGoogleLogin.pas | 33 +++++++++++++++++++++++---------- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/demos/Demo/main.dfm b/demos/Demo/main.dfm index b90b602..a4b1153 100644 --- a/demos/Demo/main.dfm +++ b/demos/Demo/main.dfm @@ -188,9 +188,20 @@ object Form11: TForm11 Left = 8 Top = 283 Width = 339 - Height = 233 + Height = 70 TabOrder = 10 end + object Animate1: TAnimate + Left = 8 + Top = 359 + Width = 80 + Height = 50 + CommonAVI = aviFindFolder + DoubleBuffered = False + ParentDoubleBuffered = False + StopFrame = 29 + Timers = True + end object GoogleLogin1: TGoogleLogin AppName = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/2' + diff --git a/demos/Demo/main.pas b/demos/Demo/main.pas index 7f1b16a..c054cd6 100644 --- a/demos/Demo/main.pas +++ b/demos/Demo/main.pas @@ -1,4 +1,4 @@ -unit main; +unit main; interface @@ -30,6 +30,7 @@ TForm11 = class(TForm) Memo1: TMemo; Label9: TLabel; Label10: TLabel; + Animate1: TAnimate; procedure Button1Click(Sender: TObject); procedure GoogleLogin1Autorization(const LoginResult: TLoginResult; Result: TResultRec); @@ -56,8 +57,8 @@ procedure TForm11.Button1Click(Sender: TObject); GoogleLogin1.Email:=EmailEdit.Text; GoogleLogin1.Password:=PassEdit.Text; GoogleLogin1.Service:=TServices(ComboBox1.ItemIndex); +Memo1.Clear;//очистка лога GoogleLogin1.Login(); -Memo1.Clear;// end; procedure TForm11.Button2Click(Sender: TObject); @@ -74,9 +75,9 @@ procedure TForm11.GoogleLogin1Autorization(const LoginResult: TLoginResult;Resul temp:=GetEnumName(TypeInfo(TLoginResult),Integer(LoginResult)); Edit1.Text:=temp; if LoginResult =lrOk then - ShowMessage(' !!!!!!!!!') + ShowMessage('Мы в гугле!!!!!!!!!') else - ShowMessage(' !!!!!!!!!'); + ShowMessage('Мы НЕ в гугле!!!!!!!!!'); end; @@ -97,7 +98,11 @@ procedure TForm11.GoogleLogin1ProgressAutorization(const Progress, MaxProgress: Memo1.Lines.Add('////////'); Memo1.Lines.Add('Progress '+IntToStr(Progress)); Memo1.Lines.Add('MaxProgress '+IntToStr(MaxProgress)); - + //слишком уж быстро качает я не увидел чтоб анимация работала + if (MaxProgress>Progress) then + Animate1.Active:=True + else + Animate1.Active:=False; end; end. diff --git a/source/uGoogleLogin.pas b/source/uGoogleLogin.pas index b0a4013..eeb0412 100644 --- a/source/uGoogleLogin.pas +++ b/source/uGoogleLogin.pas @@ -85,13 +85,13 @@ interface TProgressAutorization = procedure(const Progress,MaxProgress:Integer)of object;//показываем прогресс при авторизации TErrorAutorization = procedure(const ErrorStr: string) of object; // а это не авторизировались)) TDisconnect = procedure(const ResultStr: string) of object; + TDoneThread = procedure(const Status: TStatusThread) of object; type // поток используется только для получения HTML страницы TGoogleLoginThread = class(TThread) private { private declarations } - //FStatus:TStatusThread;//статус потока FParamStr: string; // параметры запроса FLogintoken: string; // данные ответа/запроса @@ -115,8 +115,7 @@ TGoogleLoginThread = class(TThread) function GetResultText: string; - function GetErrorText(const FromServer: BOOLEAN): string; - // получаем текст ошибки + function GetErrorText(const FromServer: BOOLEAN): string;// получаем текст ошибки procedure SynAutoriz; // передача значения авторизации в главную форму как положено в потоке procedure SynProgressAutoriz;// передача текушего прогресса авторизации в главную форму как положено в потоке @@ -152,11 +151,13 @@ TGoogleLogin = class(TComponent) FLogincaptcha: string; // параметры Captcha FCaptchaURL: string; + FStatus:TStatusThread;//статус потока //переменные для событий FAfterLogin: TAutorization; FProgressAutorization:TProgressAutorization;//прогресс при авторизации для показа часиков и подобных вещей FErrorAutorization: TErrorAutorization; FDisconnect: TDisconnect; + function SendRequest(const ParamStr: string): AnsiString; // отправляем запрос на сервер procedure SetEmail(cEmail: string); @@ -188,6 +189,7 @@ TGoogleLogin = class(TComponent) property Email: string read FEmail write SetEmail; property Password: string read FPassword write SetPassword; property Service: TServices read FService write SetService default xapi; + property Status:TStatusThread read FStatus default sttNoActive;//статус потока property OnAutorization: TAutorization read FAfterLogin write FAfterLogin;// авторизировались property OnProgressAutorization:TProgressAutorization read FProgressAutorization write FProgressAutorization;//прогресс авторизации property OnError: TErrorAutorization read FErrorAutorization write FErrorAutorization; // возникла ошибка (( @@ -238,6 +240,7 @@ constructor TGoogleLogin.Create(AOwner: TComponent); begin inherited Create(AOwner); FAppname := DefaultAppName; // дефолтное значение + FStatus:=sttNoActive;//неактивен ни один поток end; procedure TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string); @@ -271,15 +274,24 @@ procedure TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string); ResponseText := SendRequest(cBody.DataString); end; +// отправляем запрос на сервер в отдельном потоке function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; begin - // отправляем запрос на сервер в отдельном потоке - FThread := TGoogleLoginThread.Create(true, ParamStr); - FThread.OnAutorization := Self.OnAutorization; - FThread.OnProgressAutorization:=Self.OnProgressAutorization;//прогресс авторизации - FThread.OnError := Self.OnError; - FThread.FreeOnTerminate := true; // чтобы сам себя грухнул после окончания операции - FThread.Resume; // запуск + if not Assigned(FThread) then + begin + FThread := TGoogleLoginThread.Create(true, ParamStr); + FThread.OnAutorization := Self.OnAutorization; + FThread.OnProgressAutorization:=Self.OnProgressAutorization;//прогресс авторизации + FThread.OnError := Self.OnError; + FThread.FreeOnTerminate := true; // чтобы сам себя грухнул после окончания операции + FStatus:=sttActive; + FThread.Resume; // запуск + end + else + begin + FThread.Suspend; + FThread.Free; + end; // тут делать смысла что то нет так как данные еще не получены(они ведь будут получены в другом потоке) end; @@ -647,6 +659,7 @@ function TGoogleLoginThread.GetResultText: string; end; end; + procedure TGoogleLoginThread.SynAutoriz; begin if Assigned(FAutorization) then From b8deae2dd567f4b44cc057f2f8f77258efceea9b Mon Sep 17 00:00:00 2001 From: NMD Date: Tue, 20 Jul 2010 19:01:13 +0600 Subject: [PATCH 08/12] =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/uGoogleLogin.pas | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/source/uGoogleLogin.pas b/source/uGoogleLogin.pas index eeb0412..4ddb913 100644 --- a/source/uGoogleLogin.pas +++ b/source/uGoogleLogin.pas @@ -151,7 +151,7 @@ TGoogleLogin = class(TComponent) FLogincaptcha: string; // параметры Captcha FCaptchaURL: string; - FStatus:TStatusThread;//статус потока + //FStatus:TStatusThread;//статус потока //переменные для событий FAfterLogin: TAutorization; FProgressAutorization:TProgressAutorization;//прогресс при авторизации для показа часиков и подобных вещей @@ -189,7 +189,7 @@ TGoogleLogin = class(TComponent) property Email: string read FEmail write SetEmail; property Password: string read FPassword write SetPassword; property Service: TServices read FService write SetService default xapi; - property Status:TStatusThread read FStatus default sttNoActive;//статус потока + //property Status:TStatusThread read FStatus default sttNoActive;//статус потока property OnAutorization: TAutorization read FAfterLogin write FAfterLogin;// авторизировались property OnProgressAutorization:TProgressAutorization read FProgressAutorization write FProgressAutorization;//прогресс авторизации property OnError: TErrorAutorization read FErrorAutorization write FErrorAutorization; // возникла ошибка (( @@ -240,7 +240,7 @@ constructor TGoogleLogin.Create(AOwner: TComponent); begin inherited Create(AOwner); FAppname := DefaultAppName; // дефолтное значение - FStatus:=sttNoActive;//неактивен ни один поток + //FStatus:=sttNoActive;//неактивен ни один поток end; procedure TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string); @@ -277,21 +277,12 @@ procedure TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string); // отправляем запрос на сервер в отдельном потоке function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; begin - if not Assigned(FThread) then - begin - FThread := TGoogleLoginThread.Create(true, ParamStr); - FThread.OnAutorization := Self.OnAutorization; - FThread.OnProgressAutorization:=Self.OnProgressAutorization;//прогресс авторизации - FThread.OnError := Self.OnError; - FThread.FreeOnTerminate := true; // чтобы сам себя грухнул после окончания операции - FStatus:=sttActive; - FThread.Resume; // запуск - end - else - begin - FThread.Suspend; - FThread.Free; - end; + FThread := TGoogleLoginThread.Create(true, ParamStr); + FThread.OnAutorization := Self.OnAutorization; + FThread.OnProgressAutorization:=Self.OnProgressAutorization;//прогресс авторизации + FThread.OnError := Self.OnError; + FThread.FreeOnTerminate := true; // чтобы сам себя грухнул после окончания операции + FThread.Resume; // запуск // тут делать смысла что то нет так как данные еще не получены(они ведь будут получены в другом потоке) end; From 55bcf177c66da48d1410bdf448b67710275f093b Mon Sep 17 00:00:00 2001 From: NMD Date: Tue, 20 Jul 2010 19:28:54 +0600 Subject: [PATCH 09/12] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=80=D1=83?= =?UTF-8?q?=D1=87=D0=BD=D0=BE=D0=B5=20=D1=81=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=20=D0=92=D0=BB=D0=B0=D0=B4=D0=BE=D0=BC))=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BA=D0=B0=D0=BA=20?= =?UTF-8?q?=D1=83=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=B2=D1=81=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20=D1=87=D1=82=D0=BE=20?= =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=81=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/googleLogin_pack/GoogleLogin.identcache | Bin 77 -> 72 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/googleLogin_pack/GoogleLogin.identcache b/packages/googleLogin_pack/GoogleLogin.identcache index 800a2920d0b106b4f47ad6c8e607f50f7f3743a0..e52352bf4c84b129f5ab63df49c0fed258e437c0 100644 GIT binary patch delta 23 ecmebE5M*RvU@&*Jib>DUPtQqBEXbTFW)1*7-v& Date: Mon, 26 Jul 2010 22:08:06 +0600 Subject: [PATCH 10/12] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=B5=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D1=83=20=D0=B0=20=D1=82=D0=BE=20=D0=B7=D0=B0=D0=B1=D1=8B=D0=BB?= =?UTF-8?q?=20=D0=92=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demos/googlelogin_demo/main.dfm | 12 ++++++------ demos/googlelogin_demo/main.pas | 2 +- packages/googleLogin_pack/uGoogleLogin.pas | 10 +++++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/demos/googlelogin_demo/main.dfm b/demos/googlelogin_demo/main.dfm index a4b1153..bc1061d 100644 --- a/demos/googlelogin_demo/main.dfm +++ b/demos/googlelogin_demo/main.dfm @@ -100,11 +100,11 @@ object Form11: TForm11 Text = '123456789her' end object Button1: TButton - Left = 120 + Left = 8 Top = 84 - Width = 75 + Width = 170 Height = 21 - Caption = 'Connect' + Caption = #1051#1086#1075#1080#1085#1080#1084#1089#1103 TabOrder = 2 OnClick = Button1Click end @@ -154,11 +154,11 @@ object Form11: TForm11 TabOrder = 5 end object Button2: TButton - Left = 232 + Left = 184 Top = 84 - Width = 75 + Width = 163 Height = 21 - Caption = 'Button2' + Caption = #1069#1082#1089#1090#1088#1077#1085#1085#1086#1077' '#1090#1086#1088#1084#1086#1078#1077#1085#1080#1077' '#1087#1086#1090#1086#1082#1072 TabOrder = 6 OnClick = Button2Click end diff --git a/demos/googlelogin_demo/main.pas b/demos/googlelogin_demo/main.pas index c054cd6..a342856 100644 --- a/demos/googlelogin_demo/main.pas +++ b/demos/googlelogin_demo/main.pas @@ -63,7 +63,7 @@ procedure TForm11.Button1Click(Sender: TObject); procedure TForm11.Button2Click(Sender: TObject); begin - GoogleLogin1.Disconnect; + GoogleLogin1.Destroy; end; procedure TForm11.GoogleLogin1Autorization(const LoginResult: TLoginResult;Result: TResultRec); diff --git a/packages/googleLogin_pack/uGoogleLogin.pas b/packages/googleLogin_pack/uGoogleLogin.pas index 4ddb913..b9e885a 100644 --- a/packages/googleLogin_pack/uGoogleLogin.pas +++ b/packages/googleLogin_pack/uGoogleLogin.pas @@ -173,6 +173,7 @@ TGoogleLogin = class(TComponent) function URLDecode(const S: string): string; // не используется public constructor Create(AOwner: TComponent); override; + destructor Destroy;//глушим все procedure Login(aLoginToken: string = ''; aLoginCaptcha: string = ''); // формируем запрос procedure Disconnect; // удаляет все данные по авторизации @@ -236,6 +237,13 @@ procedure TGoogleLogin.Disconnect; OnDisconnect(rcDisconnect) end; +destructor TGoogleLogin.Destroy; +begin + if Assigned(FThread) then + FThread.Terminate; + inherited Destroy; +end; + constructor TGoogleLogin.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -281,7 +289,7 @@ function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; FThread.OnAutorization := Self.OnAutorization; FThread.OnProgressAutorization:=Self.OnProgressAutorization;//прогресс авторизации FThread.OnError := Self.OnError; - FThread.FreeOnTerminate := true; // чтобы сам себя грухнул после окончания операции + FThread.FreeOnTerminate := True; // чтобы сам себя грухнул после окончания операции FThread.Resume; // запуск // тут делать смысла что то нет так как данные еще не получены(они ведь будут получены в другом потоке) end; From 7cb86b5f951386cff5f113bc427968f48442acb7 Mon Sep 17 00:00:00 2001 From: NMD Date: Wed, 28 Jul 2010 19:08:52 +0600 Subject: [PATCH 11/12] =?UTF-8?q?=D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D1=8B=20=D1=81=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BF=D1=87=D0=B5=D0=B9=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demos/googlelogin_demo/Demo.dproj | 6 +- demos/googlelogin_demo/main.dfm | 27 +++- demos/googlelogin_demo/main.pas | 18 ++- packages/googleLogin_pack/GoogleLogin.dpk | 3 +- packages/googleLogin_pack/GoogleLogin.dproj | 1 + packages/googleLogin_pack/uGoogleLogin.pas | 135 ++++++++++++++++---- 6 files changed, 159 insertions(+), 31 deletions(-) diff --git a/demos/googlelogin_demo/Demo.dproj b/demos/googlelogin_demo/Demo.dproj index 584ac4b..17346ec 100644 --- a/demos/googlelogin_demo/Demo.dproj +++ b/demos/googlelogin_demo/Demo.dproj @@ -20,6 +20,7 @@ true + vcl;rtl;vclx;vclimg;vclactnband;dbrtl;vcldb;vcldbx;bdertl;vcltouch;xmlrtl;dsnap;dsnapcon;TeeUI;TeeDB;Tee;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_100_140;Intraweb_100_140;VclSmp;vclie;websnap;webdsnap;inetdb;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DbxClientDriver;DataSnapServer;DBXInterBaseDriver;DBXMySQLDriver;dbxcds;DBXFirebirdDriver;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver;WDSearchStat;CompThread;Package1 WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias) Demo.exe 00400000 @@ -91,10 +92,7 @@ 1.0.0.0 - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - + Demo.dpr diff --git a/demos/googlelogin_demo/main.dfm b/demos/googlelogin_demo/main.dfm index bc1061d..e975923 100644 --- a/demos/googlelogin_demo/main.dfm +++ b/demos/googlelogin_demo/main.dfm @@ -83,6 +83,13 @@ object Form11: TForm11 Height = 13 Caption = #1055#1088#1086#1075#1088#1077#1089#1089' '#1072#1074#1090#1086#1088#1080#1079#1072#1094#1080#1080 end + object Image1: TImage + Left = 8 + Top = 359 + Width = 241 + Height = 74 + AutoSize = True + end object EmailEdit: TEdit Left = 38 Top = 27 @@ -193,7 +200,7 @@ object Form11: TForm11 end object Animate1: TAnimate Left = 8 - Top = 359 + Top = 466 Width = 80 Height = 50 CommonAVI = aviFindFolder @@ -202,12 +209,30 @@ object Form11: TForm11 StopFrame = 29 Timers = True end + object Edit3: TEdit + Left = 208 + Top = 456 + Width = 121 + Height = 21 + TabOrder = 12 + Text = 'Edit3' + end + object Button3: TButton + Left = 216 + Top = 488 + Width = 75 + Height = 25 + Caption = 'Button3' + TabOrder = 13 + OnClick = Button3Click + end object GoogleLogin1: TGoogleLogin AppName = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/2' + '0100625 Firefox/3.6.6' AccountType = atNone OnAutorization = GoogleLogin1Autorization + OnAutorizCaptcha = GoogleLogin1AutorizCaptcha OnProgressAutorization = GoogleLogin1ProgressAutorization Left = 176 Top = 8 diff --git a/demos/googlelogin_demo/main.pas b/demos/googlelogin_demo/main.pas index a342856..b34a1ea 100644 --- a/demos/googlelogin_demo/main.pas +++ b/demos/googlelogin_demo/main.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, StdCtrls, uGoogleLogin,TypInfo, ComCtrls; + Dialogs, StdCtrls, uGoogleLogin,TypInfo, ComCtrls, ExtCtrls; type TForm11 = class(TForm) @@ -31,6 +31,9 @@ TForm11 = class(TForm) Label9: TLabel; Label10: TLabel; Animate1: TAnimate; + Image1: TImage; + Edit3: TEdit; + Button3: TButton; procedure Button1Click(Sender: TObject); procedure GoogleLogin1Autorization(const LoginResult: TLoginResult; Result: TResultRec); @@ -38,6 +41,8 @@ TForm11 = class(TForm) procedure Button2Click(Sender: TObject); procedure GoogleLogin1Disconnect(const ResultStr: string); procedure GoogleLogin1ProgressAutorization(const Progress, MaxProgress: Integer); + procedure GoogleLogin1AutorizCaptcha(PicCaptcha: TPicture); + procedure Button3Click(Sender: TObject); private { Private declarations } public @@ -66,6 +71,11 @@ procedure TForm11.Button2Click(Sender: TObject); GoogleLogin1.Destroy; end; +procedure TForm11.Button3Click(Sender: TObject); +begin + GoogleLogin1.Captcha:=Edit3.Text; +end; + procedure TForm11.GoogleLogin1Autorization(const LoginResult: TLoginResult;Result: TResultRec); var temp:string; @@ -74,6 +84,7 @@ procedure TForm11.GoogleLogin1Autorization(const LoginResult: TLoginResult;Resul AuthEdit.Text:=Result.Auth; temp:=GetEnumName(TypeInfo(TLoginResult),Integer(LoginResult)); Edit1.Text:=temp; + Edit2.Text:=Result.SID; if LoginResult =lrOk then ShowMessage('Мы в гугле!!!!!!!!!') else @@ -81,6 +92,11 @@ procedure TForm11.GoogleLogin1Autorization(const LoginResult: TLoginResult;Resul end; +procedure TForm11.GoogleLogin1AutorizCaptcha(PicCaptcha: TPicture); +begin + Image1.Picture:=PicCaptcha; +end; + procedure TForm11.GoogleLogin1Disconnect(const ResultStr: string); begin ShowMessage('Disconnect'); diff --git a/packages/googleLogin_pack/GoogleLogin.dpk b/packages/googleLogin_pack/GoogleLogin.dpk index 99034b8..277156e 100644 --- a/packages/googleLogin_pack/GoogleLogin.dpk +++ b/packages/googleLogin_pack/GoogleLogin.dpk @@ -26,7 +26,8 @@ package GoogleLogin; requires rtl, - vcl; + vcl, + vclimg; contains uGoogleLogin in 'uGoogleLogin.pas'; diff --git a/packages/googleLogin_pack/GoogleLogin.dproj b/packages/googleLogin_pack/GoogleLogin.dproj index d9d26df..390c75b 100644 --- a/packages/googleLogin_pack/GoogleLogin.dproj +++ b/packages/googleLogin_pack/GoogleLogin.dproj @@ -43,6 +43,7 @@ + Base diff --git a/packages/googleLogin_pack/uGoogleLogin.pas b/packages/googleLogin_pack/uGoogleLogin.pas index b9e885a..d46cc87 100644 --- a/packages/googleLogin_pack/uGoogleLogin.pas +++ b/packages/googleLogin_pack/uGoogleLogin.pas @@ -18,7 +18,9 @@ interface -uses WinInet, StrUtils, SysUtils, Classes, Windows, TypInfo; +uses WinInet, StrUtils,Graphics, SysUtils, Classes, Windows, TypInfo,jpeg; +//jpeg для поддержки формата jpeg +//Graphics для поддержки формата TPicture resourcestring rcNone = 'Аутентификация не производилась или сброшена'; @@ -81,6 +83,9 @@ interface type TAutorization = procedure(const LoginResult: TLoginResult; Result: TResultRec) of object; // авторизировались + //непосредственно само изображение капчи + TAutorizCaptcha = procedure(PicCaptcha:TPicture) of object; // не авторизировались нужно ввести капчу + //Progress,MaxProgress переменные которые специально заведены для прогрессбара Progress-текущее состояние MaxProgress-максимальное значение TProgressAutorization = procedure(const Progress,MaxProgress:Integer)of object;//показываем прогресс при авторизации TErrorAutorization = procedure(const ErrorStr: string) of object; // а это не авторизировались)) @@ -93,17 +98,19 @@ TGoogleLoginThread = class(TThread) private { private declarations } FParamStr: string; // параметры запроса - FLogintoken: string; + // данные ответа/запроса FResultRec: TResultRec; // структура для передачи результатов + FLastResult: TLoginResult; // результаты авторизации + FCaptchaPic:TPicture;//изображение капчи FCaptchaURL: string; - - FLastResult: TLoginResult; // результаты авторизации + FCapthaToken: string; //для прогресса FProgress,FMaxProgress:Integer; //переменные для событий FAutorization: TAutorization; // авторизация + FAutorizCaptcha:TAutorizCaptcha;//не авторизировались необходимо ввести капчу FProgressAutorization:TProgressAutorization;//прогресс при авторизации для показа часиков и подобных вещей FErrorAutorization: TErrorAutorization;//ошибка при авторизации @@ -116,8 +123,10 @@ TGoogleLoginThread = class(TThread) function GetResultText: string; function GetErrorText(const FromServer: BOOLEAN): string;// получаем текст ошибки + function LoadCaptcha(aCaptchaURL:string):Boolean;//загрузка капчи procedure SynAutoriz; // передача значения авторизации в главную форму как положено в потоке + procedure SynCaptcha; //передача значения авторизации в главную форму как положено в потоке о том что необходимо ввести капчу procedure SynProgressAutoriz;// передача текушего прогресса авторизации в главную форму как положено в потоке procedure SynErrAutoriz; // передача значения ошибки в главную форму как положено в потоке protected @@ -130,6 +139,7 @@ TGoogleLoginThread = class(TThread) { published declarations } // события property OnAutorization:TAutorization read FAutorization write FAutorization; // авторизировались + property OnAutorizCaptcha:TAutorizCaptcha read FAutorizCaptcha write FAutorizCaptcha; //не авторизировались необходимо ввести капчу property OnProgressAutorization: TProgressAutorization read FProgressAutorization write FProgressAutorization;//прогресс авторизации property OnError: TErrorAutorization read FErrorAutorization write FErrorAutorization; // возникла ошибка (( end; @@ -147,13 +157,14 @@ TGoogleLogin = class(TComponent) FPassword: string; // данные ответа/запроса FService: TServices; // сервис к которому необходимо получить доступ - FLogintoken: string; - FLogincaptcha: string; // параметры Captcha - FCaptchaURL: string; +// FCaptchaURL: string;//ссылка на капчу + FCaptcha: string; //Captcha + FCapchaToken: string; //FStatus:TStatusThread;//статус потока //переменные для событий - FAfterLogin: TAutorization; + FAfterLogin: TAutorization;//авторизировались + FAutorizCaptcha:TAutorizCaptcha;//не авторизировались необходимо ввести капчу FProgressAutorization:TProgressAutorization;//прогресс при авторизации для показа часиков и подобных вещей FErrorAutorization: TErrorAutorization; FDisconnect: TDisconnect; @@ -182,16 +193,17 @@ TGoogleLogin = class(TComponent) // property SID: string read FSID; // property LSID: string read FLSID; // property CaptchaURL: string read FCaptchaURL; - // property LoginToken: string read FLogintoken; - // property LoginCaptcha: string read FLogincaptcha write FLogincaptcha; + // property CapchaToken: string read FCapchaToken; published property AppName: string read FAppname write SetAppName; property AccountType: TAccountType read FAccountType write FAccountType; property Email: string read FEmail write SetEmail; property Password: string read FPassword write SetPassword; + property Captcha: string read FCaptcha write SetCaptcha; property Service: TServices read FService write SetService default xapi; //property Status:TStatusThread read FStatus default sttNoActive;//статус потока property OnAutorization: TAutorization read FAfterLogin write FAfterLogin;// авторизировались + property OnAutorizCaptcha:TAutorizCaptcha read FAutorizCaptcha write FAutorizCaptcha; //не авторизировались необходимо ввести капчу property OnProgressAutorization:TProgressAutorization read FProgressAutorization write FProgressAutorization;//прогресс авторизации property OnError: TErrorAutorization read FErrorAutorization write FErrorAutorization; // возникла ошибка (( property OnDisconnect: TDisconnect read FDisconnect write FDisconnect; @@ -225,12 +237,11 @@ procedure TGoogleLogin.Disconnect; FAccountType := atNone; FLastResult := lrNone; // FSID:=''; - // FLSID:=''; - // FAuth:=''; - FLogintoken := ''; - FLogincaptcha := ''; - FCaptchaURL := ''; - FLogintoken := ''; + //FLSID:=''; + //FAuth:=''; + FCapchaToken := ''; + FCaptcha := ''; + //FCaptchaURL := ''; if Assigned(FThread) then FThread.Terminate; if Assigned(FDisconnect) then @@ -273,7 +284,7 @@ procedure TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string); cBody.WriteString('source=' + FAppname) else cBody.WriteString('source=' + DefaultAppName); - if Length(Trim(aLoginToken)) > 0 then + if (Length(Trim(aLoginToken)) > 0) or (Length(Trim(aLoginCaptcha))>0) then begin cBody.WriteString('&logintoken=' + aLoginToken); cBody.WriteString('&logincaptcha=' + aLoginCaptcha); @@ -287,6 +298,7 @@ function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; begin FThread := TGoogleLoginThread.Create(true, ParamStr); FThread.OnAutorization := Self.OnAutorization; + FThread.OnAutorizCaptcha:=Self.OnAutorizCaptcha;//не авторизировались необходимо ввести капчу FThread.OnProgressAutorization:=Self.OnProgressAutorization;//прогресс авторизации FThread.OnError := Self.OnError; FThread.FreeOnTerminate := True; // чтобы сам себя грухнул после окончания операции @@ -306,8 +318,8 @@ procedure TGoogleLogin.SetAppName(value: string); procedure TGoogleLogin.SetCaptcha(cCaptcha: string); begin - FLogincaptcha := cCaptcha; - Login(FLogintoken, FLogincaptcha); // перелогиниваемся с каптчей + FCaptcha := cCaptcha; + Login(FCapchaToken, FCaptcha); // перелогиниваемся с каптчей end; procedure TGoogleLogin.SetEmail(cEmail: string); @@ -443,8 +455,7 @@ function TGoogleLogin.URLEncode(const S: string): string; { TGoogleLoginThread } -constructor TGoogleLoginThread.Create(CreateSuspennded: BOOLEAN; - aParamStr: string); +constructor TGoogleLoginThread.Create(CreateSuspennded: BOOLEAN; aParamStr: string); begin inherited Create(CreateSuspennded); FParamStr := aParamStr; @@ -455,6 +466,9 @@ constructor TGoogleLoginThread.Create(CreateSuspennded: BOOLEAN; //переменные для прогресса FProgress:=0; FMaxProgress:=0; + //изображение капчи + FCaptchaPic:=TPicture.Create; + end; procedure TGoogleLoginThread.Execute; @@ -522,8 +536,21 @@ procedure TGoogleLoginThread.Execute; InternetCloseHandle(hInternet); // получаем результаты авторизации FLastResult := ExpertLoginResult(sTemp); + // текстовый результат авторизации FResultRec.LoginStr := GetResultText; - Synchronize(SynAutoriz); + + //требует ввести капчу + if FLastResult=lrCaptchaRequired then + begin + LoadCaptcha(FCaptchaURL); + Synchronize(SynCaptcha); + end; + FLastResult:=FLastResult; + //если все хорошо, авторизировались + if FLastResult= lrOk then + begin + Synchronize(SynAutoriz); + end; end; function TGoogleLoginThread.ExpertLoginResult(const LoginResult: string) @@ -549,7 +576,7 @@ function TGoogleLoginThread.ExpertLoginResult(const LoginResult: string) if Result = lrCaptchaRequired then // требуется ввод каптчи begin FCaptchaURL := GetCaptchaURL(List); - FLogintoken := GetCaptchaToken(List); + FCapthaToken := GetCaptchaToken(List); end; end else @@ -581,7 +608,7 @@ function TGoogleLoginThread.GetCaptchaToken(const cList: TStringList): String; begin Result := Trim(copy(cList[i], pos('=', cList[i]) + 1, Length(cList[i]) - pos('=', cList[i]))); - break; + break; end; end; end; @@ -658,6 +685,59 @@ function TGoogleLoginThread.GetResultText: string; end; end; +//загрузка капчи +function TGoogleLoginThread.LoadCaptcha(aCaptchaURL: string): Boolean; + function DataAvailable(hRequest: pointer; out Size: cardinal): BOOLEAN; + begin + Result := WinInet.InternetQueryDataAvailable(hRequest, Size, 0, 0); + end; +var + hInternet, hConnect,hRequest: pointer; + dwBytesRead, i, L: cardinal; + sTemp: AnsiString; // текст страницы + memStream: TMemoryStream; + jpegimg: TJPEGImage; + url:string; +begin + Result:=False;; + url:='http://www.google.com/accounts/'+aCaptchaURL; + hInternet := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); + try + if Assigned(hInternet) then + begin + hConnect := InternetOpenUrl(hInternet, PChar(url), nil, 0, 0, 0); + if Assigned(hConnect) then + try + i := 1; + repeat + SetLength(sTemp, L + i); + if not InternetReadFile(hConnect, @sTemp[i], sizeof(L),dwBytesRead) then + break; // Получаем данные с сервера + inc(i, dwBytesRead); + until dwBytesRead = 0; + //sTemp[i] := #0; + finally + InternetCloseHandle(hConnect); + end; + end; + finally + InternetCloseHandle(hInternet); + end; + memStream := TMemoryStream.Create; + jpegimg := TJPEGImage.Create; + try + memStream.Write(sTemp[1], Length(sTemp)); + memStream.Position := 0; + //загрузка изображения из потока + jpegimg.LoadFromStream(memStream); + FCaptchaPic.Assign(jpegimg); + finally + //очистка + memStream.Free; + jpegimg.Free; + end; + Result:=True; +end; procedure TGoogleLoginThread.SynAutoriz; begin @@ -665,6 +745,13 @@ procedure TGoogleLoginThread.SynAutoriz; OnAutorization(FLastResult, FResultRec); end; +//необходимо ввести капчу +procedure TGoogleLoginThread.SynCaptcha; +begin + if Assigned(FAutorizCaptcha) then + OnAutorizCaptcha(FCaptchaPic); +end; + procedure TGoogleLoginThread.SynErrAutoriz; begin if Assigned(FErrorAutorization) then From eaab3c169eacbae9ae1458522d2cd953ebabe881 Mon Sep 17 00:00:00 2001 From: NMD Date: Wed, 28 Jul 2010 20:08:54 +0600 Subject: [PATCH 12/12] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BA=D0=B0=D0=BF=D1=87=D1=83(?= =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=BB).=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D0=BB=20=D0=BE?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=D0=BE=20=D1=82=D0=B0=D0=BA=20=D1=87=D1=82?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B5=20=D0=BA=D0=B0=D1=87=D0=B0=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demos/googlelogin_demo/main.pas | 2 ++ packages/googleLogin_pack/uGoogleLogin.pas | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/demos/googlelogin_demo/main.pas b/demos/googlelogin_demo/main.pas index b34a1ea..bb95c9d 100644 --- a/demos/googlelogin_demo/main.pas +++ b/demos/googlelogin_demo/main.pas @@ -73,7 +73,9 @@ procedure TForm11.Button2Click(Sender: TObject); procedure TForm11.Button3Click(Sender: TObject); begin + //Memo1.Lines.Add(GoogleLogin1.CapchaToken); GoogleLogin1.Captcha:=Edit3.Text; + end; procedure TForm11.GoogleLogin1Autorization(const LoginResult: TLoginResult;Result: TResultRec); diff --git a/packages/googleLogin_pack/uGoogleLogin.pas b/packages/googleLogin_pack/uGoogleLogin.pas index d46cc87..b87b98d 100644 --- a/packages/googleLogin_pack/uGoogleLogin.pas +++ b/packages/googleLogin_pack/uGoogleLogin.pas @@ -96,6 +96,7 @@ interface // поток используется только для получения HTML страницы TGoogleLoginThread = class(TThread) private + FParentComp:TComponent; { private declarations } FParamStr: string; // параметры запроса @@ -125,15 +126,17 @@ TGoogleLoginThread = class(TThread) function GetErrorText(const FromServer: BOOLEAN): string;// получаем текст ошибки function LoadCaptcha(aCaptchaURL:string):Boolean;//загрузка капчи + procedure SynAutoriz; // передача значения авторизации в главную форму как положено в потоке procedure SynCaptcha; //передача значения авторизации в главную форму как положено в потоке о том что необходимо ввести капчу + procedure SynCapchaToken;//передача значения в свойство шкурки procedure SynProgressAutoriz;// передача текушего прогресса авторизации в главную форму как положено в потоке procedure SynErrAutoriz; // передача значения ошибки в главную форму как положено в потоке protected { protected declarations } public { public declarations } - constructor Create(CreateSuspennded: BOOLEAN; aParamStr: string); // используем для передачи логина и пароля и подобного + constructor Create(CreateSuspennded: BOOLEAN; aParamStr: string;aParentComp:TComponent); // используем для передачи логина и пароля и подобного procedure Execute; override; // выполняем непосредственно авторизацию на сайте published { published declarations } @@ -193,7 +196,7 @@ TGoogleLogin = class(TComponent) // property SID: string read FSID; // property LSID: string read FLSID; // property CaptchaURL: string read FCaptchaURL; - // property CapchaToken: string read FCapchaToken; + property CapchaToken: string read FCapchaToken; published property AppName: string read FAppname write SetAppName; property AccountType: TAccountType read FAccountType write FAccountType; @@ -296,7 +299,7 @@ procedure TGoogleLogin.Login(aLoginToken, aLoginCaptcha: string); // отправляем запрос на сервер в отдельном потоке function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString; begin - FThread := TGoogleLoginThread.Create(true, ParamStr); + FThread := TGoogleLoginThread.Create(true, ParamStr,Self); FThread.OnAutorization := Self.OnAutorization; FThread.OnAutorizCaptcha:=Self.OnAutorizCaptcha;//не авторизировались необходимо ввести капчу FThread.OnProgressAutorization:=Self.OnProgressAutorization;//прогресс авторизации @@ -455,9 +458,11 @@ function TGoogleLogin.URLEncode(const S: string): string; { TGoogleLoginThread } -constructor TGoogleLoginThread.Create(CreateSuspennded: BOOLEAN; aParamStr: string); +constructor TGoogleLoginThread.Create(CreateSuspennded: BOOLEAN; aParamStr: string;aParentComp:TComponent); begin inherited Create(CreateSuspennded); + FParentComp:=TComponent.Create(nil); + FParentComp:=aParentComp; FParamStr := aParamStr; FResultRec.LoginStr := ''; FResultRec.SID := ''; @@ -538,7 +543,6 @@ procedure TGoogleLoginThread.Execute; FLastResult := ExpertLoginResult(sTemp); // текстовый результат авторизации FResultRec.LoginStr := GetResultText; - //требует ввести капчу if FLastResult=lrCaptchaRequired then begin @@ -551,6 +555,7 @@ procedure TGoogleLoginThread.Execute; begin Synchronize(SynAutoriz); end; + Synchronize(SynCapchaToken); end; function TGoogleLoginThread.ExpertLoginResult(const LoginResult: string) @@ -746,6 +751,12 @@ procedure TGoogleLoginThread.SynAutoriz; end; //необходимо ввести капчу +procedure TGoogleLoginThread.SynCapchaToken; +begin + if Assigned(FParentComp) then + TGoogleLogin(FParentComp).FCapchaToken:=Self.FCapthaToken; +end; + procedure TGoogleLoginThread.SynCaptcha; begin if Assigned(FAutorizCaptcha) then