Тема: Qiwi
Показать сообщение отдельно
  #3  
Старый 07.04.2017, 12:45
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

Как и обещал, выкладываю написанную функцию авторизации в системе 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;
Ответить с цитированием