|
#1
|
|||
|
|||
Qiwi
Народ, вот такой вопрос, давно давно делал для себя программу, для авторизации в киви кошельке, и был свой функционал, в плоть до переводов на карты, сейчас опять понадобилась такая программа, но с другим функционалом, в основном просто чек баланса каждые 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 и примеры по переводу денег?
Привет, интересная статья, а есть код написанный под FMX и примеры по переводу денег?
Спасибо. |
#12
|
|||
|
|||
А для особо невнимательных, разъясняю. В приведенном коде НЕТ НИ СТРОЧКИ, связанной с визуальной частью. Т.е. приведенный код должен работать и в VCL приложении, и в FMX.
|
#13
|
|||
|
|||
От "особо не внимательных", спасибо за ответ.
А по второй части вопроса, есть ли примеры по переводам? |
#14
|
|||
|
|||
Видимо, нет.
Хотя, исходя из кода, там просто REST сервис сидит. Надо добывать доку на API. Обычно, для этого надо как-то зарегистрироваться девелопером или подписаться на сервис. Смотри на сайте. Соответственно, это будет какой-то адрес с соотв. параметрами, на который надо будет сделать POST запрос. Но это просто мои предположения, основанные на том, как выглядит представленный выше код. Сам не проверял и не смотрел. |
#15
|
|||
|
|||
Понял, а не известны ли вам случайно...
Понял, а не известны ли вам случайно готовые библиотеки для Delphi 10.N решающие эти вопросы?
Я готов за это заплатить. |