![]() |
|
|
#1
|
|||
|
|||
|
Народ, вот такой вопрос, давно давно делал для себя программу, для авторизации в киви кошельке, и был свой функционал, в плоть до переводов на карты, сейчас опять понадобилась такая программа, но с другим функционалом, в основном просто чек баланса каждые 20 минут,
Так вот, столкнулся с проблемой авторизации, HTTPDebugger просто молчит при авторизации, и не получается отснифать трафик, для формирования запросов, может кто чем поможет? в хроме через ф12 вроде все нашел, все просто, отправляется JSON запрос на адрес... но в делфи ничего не получается реальзовать |
|
#2
|
|||
|
|||
|
Вопрос начал исчерпывать сам себя, удалось отловить запрос и пройти первую часть авторизации, на 2 и 3 нет времени) рабочий день подошел к концу, если кому нужно, выложу авторизацию завтра вечером
|
|
#3
|
|||
|
|||
|
Как и обещал, выкладываю написанную функцию авторизации в системе 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;Последний раз редактировалось ApxaHGe1, 07.04.2017 в 12:51. |
|
#4
|
|||
|
|||
|
Знатоки, подскажите пожалуйста.
Написанная мной функция прекрасно работает и я очень доволен! Но есть одно НО: Все манипуляции я производил с запущенным снифером, а конкретно "HttpAnalyzerStdV7". Так вот, если его закрыть, то функция почему то перестает работать, т.е. данные на сервер отправляются или не верные, или "кривые". Вопрос заключается в следующем: "как HttpAnalyzerStdV7 вляет на работу моего приложения и как сделать так, что бы все работало без запущенного HttpAnalyzerStdV7" _________________________________________________ |
|
#5
|
||||
|
||||
|
Цитата:
|
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
ApxaHGe1 (08.04.2017)
| ||
|
#6
|
|||
|
|||
|
Цитата:
В сниферы видны пакеты и от моего приложения.... собственно так и проводил анализ авторизации в случаи ошбки... сравнивал запросы/ответы от браузера и моего приложения ... |
|
#7
|
|||
|
|||
|
Кстати, проверил на другом компьютере, все прекрасно работает как и должно, без всяких запущенных сниферов, а на рабочей машине, собственно где и писалось приложение, ну ни как без снифера
|
|
#8
|
||||
|
||||
|
Цитата:
|
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
ApxaHGe1 (10.04.2017)
| ||
|
#9
|
|||
|
|||
|
Сегодня хотел написать дополнение к приложению, а конкретно - оплата мобильного телефона и перевод с киви на карту...
и о чудо все без снифера заработало... не пойму в чем проблема ) |
|
#10
|
|||
|
|||
|
Есть подозрение, что проблема в самом снифере. Он садится как прокси и при вырубании не совсем корректно подчищает за собой. Т.е. перезагруз мог решить проблему на твоем компе. Но это просто предположение на основе твоего описания.
|
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
ApxaHGe1 (12.04.2017)
| ||
|
#11
|
|||
|
|||
|
Привет, интересная статья, а есть код написанный под FMX и примеры по переводу денег?
Спасибо. |
|
#12
|
|||
|
|||
|
А для особо невнимательных, разъясняю. В приведенном коде НЕТ НИ СТРОЧКИ, связанной с визуальной частью. Т.е. приведенный код должен работать и в VCL приложении, и в FMX.
|
|
#13
|
|||
|
|||
|
От "особо не внимательных", спасибо за ответ.
А по второй части вопроса, есть ли примеры по переводам? |
|
#14
|
|||
|
|||
|
Видимо, нет.
Хотя, исходя из кода, там просто REST сервис сидит. Надо добывать доку на API. Обычно, для этого надо как-то зарегистрироваться девелопером или подписаться на сервис. Смотри на сайте. Соответственно, это будет какой-то адрес с соотв. параметрами, на который надо будет сделать POST запрос. Но это просто мои предположения, основанные на том, как выглядит представленный выше код. Сам не проверял и не смотрел. |
|
#15
|
|||
|
|||
|
Понял, а не известны ли вам случайно готовые библиотеки для Delphi 10.N решающие эти вопросы?
Я готов за это заплатить. |