Как и обещал, выкладываю написанную функцию авторизации в системе QIWI.
Код:
uses
ssl_openssl,httpsend,Parser;
Код:
unit Parser;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
Procedure ParseTicket( Const S: String; Tag1, Tag2: String; list:TStrings );
Procedure ParseHREF( Const S: String; Tag1, Tag2: String; list:TStrings );
implementation
Procedure ParseTicket( Const S: String; Tag1, Tag2: String; list:TStrings );
Var
pScan, pEnd, pTag1, pTag2: PChar;
foundText: String;
searchtext: String;
Begin
searchtext := Uppercase(S);
Tag1:= Uppercase( Tag1 );
Tag2:= Uppercase( Tag2 );
pTag1:= PChar(Tag1);
pTag2:= PChar(Tag2);
pScan:= PChar(searchtext);
Repeat
pScan:= StrPos( pScan, pTag1 );
If pScan <> Nil Then Begin
Inc(pScan, Length( Tag1 ));
pEnd := StrPos( pScan, pTag2 );
If pEnd <> Nil Then Begin
SetString( foundText,
Pchar(S) + (pScan- PChar(searchtext) ),
pEnd - pScan );
list.Add( foundText );
pScan := pEnd + Length(tag2);
End { If }
Else { Error, no end tag found for start tag, abort. }
pScan := Nil;
End; { If }
Until pScan = Nil;
End;
Procedure ParseHREF( Const S: String; Tag1, Tag2: String; list:TStrings );
Var
pScan, pEnd, pTag1, pTag2: PChar;
foundText: String;
searchtext: String;
Begin
searchtext := Uppercase(S);
Tag1:= Uppercase( Tag1 );
Tag2:= Uppercase( Tag2 );
pTag1:= PChar(Tag1);
pTag2:= PChar(Tag2);
pScan:= PChar(searchtext);
Repeat
pScan:= StrPos( pScan, pTag1 );
If pScan <> Nil Then Begin
Inc(pScan, Length( Tag1 ));
pEnd := StrPos( pScan, pTag2 );
If pEnd <> Nil Then Begin
SetString( foundText,
Pchar(S) + (pScan- PChar(searchtext) ),
pEnd - pScan );
list.Add( foundText );
pScan := pEnd + Length(tag2);
End { If }
Else { Error, no end tag found for start tag, abort. }
pScan := Nil;
End; { If }
Until pScan = Nil;
End;
end.
Код:
function Qiwi_Auth (phone_number,password:string):Boolean;
var
HTTP:THTTPsend;
Post,Data:TStringStream;
ticket,href,Balance:TStringList;
begin
HTTP:=THTTPSend.Create;
HTTP.Headers.Clear;
HTTP.Cookies.Clear;
POST:=TStringStream.Create('{"login":"'+phone_number+'","password":"'+password+'","captcha":""}');
data:=TStringStream.Create('');
HTTP.MimeType:='application/json';
HTTP.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36';
HTTP.Document.LoadFromStream(POST);
HTTP.HTTPMethod('POST','https://auth.qiwi.com/cas/tgts');
HTTP.Document.SaveToStream(Data);
Post.Free;
if data.DataString <> '' then
begin
ticket:=TStringList.Create;
ParseTicket(data.DataString,'"ticket":"','"}',ticket);
href:=TStringList.Create;
ParseHref(data.DataString,'href":"','"}]}',href);
end;
if (href.Text <> '') and (ticket.Text <> '') then
begin
Data.Clear;
POST:=TStringStream.Create('{"ticket":"'+Trim(ticket.Text)+'","service":"https://qiwi.com/j_spring_cas_security_check"}');
HTTP.Document.LoadFromStream(POST);
HTTP.MimeType:='application/json';
HTTP.HTTPMethod('POST','https://auth.qiwi.com/cas/sts');
HTTP.Document.SaveToStream(Data);
Post.Free;
Data.Clear;
POST:=TStringStream.Create('{"ticket":"'+Trim(ticket.Text)+'","service":"https://qiwi.com/j_spring_cas_security_check"}');
HTTP.Document.LoadFromStream(POST);
HTTP.MimeType:='application/json';
HTTP.HTTPMethod('POST','https://auth.qiwi.com/cas/sts');
HTTP.Document.SaveToStream(Data);
Post.Free;
end;
if Utf8ToAnsi(Data.DataString) <> '' then
begin
ticket.Clear;
ParseTicket(data.DataString,'"ticket":"','"}',ticket);
ticket.Text:=Trim(ticket.Text);
Data.Clear;
POST:=TStringStream.Create('{"ticket":"'+Trim(ticket.Text)+'","service":"https://visa.qiwi.com/j_spring_cas_security_check"}');
HTTP.MimeType:='application/json';
HTTP.HTTPMethod('GET','https://qiwi.com/j_spring_cas_security_check?ticket='+Trim(ticket.Text));
HTTP.Document.SaveToStream(Data);
Post.Free;
HTTP.Headers.Clear;
Data.Clear;
HTTP.HTTPMethod('GET','https://qiwi.com/main.action');
end;
if HTTP.Cookies.Count <> 4 then
begin
Result:=False;
exit;
end
else
Result:=True;
exit;
end;
Пример использования
Код:
if Qiwi_Auth('+79200000000','0000000000') = True then
begin
ShowMessage ('Success!');
end
else
ShowMessage ('FAIL!');
end;
|