Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.04.2017, 14:53
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию Qiwi

Народ, вот такой вопрос, давно давно делал для себя программу, для авторизации в киви кошельке, и был свой функционал, в плоть до переводов на карты, сейчас опять понадобилась такая программа, но с другим функционалом, в основном просто чек баланса каждые 20 минут,
Так вот, столкнулся с проблемой авторизации, HTTPDebugger просто молчит при авторизации, и не получается отснифать трафик, для формирования запросов, может кто чем поможет?
в хроме через ф12 вроде все нашел, все просто, отправляется JSON запрос на адрес... но в делфи ничего не получается реальзовать
Ответить с цитированием
  #2  
Старый 05.04.2017, 17:10
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

Вопрос начал исчерпывать сам себя, удалось отловить запрос и пройти первую часть авторизации, на 2 и 3 нет времени) рабочий день подошел к концу, если кому нужно, выложу авторизацию завтра вечером
Ответить с цитированием
  #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;

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

Знатоки, подскажите пожалуйста.
Написанная мной функция прекрасно работает и я очень доволен!
Но есть одно НО:

Все манипуляции я производил с запущенным снифером, а конкретно "HttpAnalyzerStdV7". Так вот, если его закрыть, то функция почему то перестает работать, т.е. данные на сервер отправляются или не верные, или "кривые".
Вопрос заключается в следующем: "как HttpAnalyzerStdV7 вляет на работу моего приложения и как сделать так, что бы все работало без запущенного HttpAnalyzerStdV7"

_________________________________________________
Ответить с цитированием
  #5  
Старый 07.04.2017, 21:41
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от ApxaHGe1
..."как HttpAnalyzerStdV7 вляет на работу моего приложения и как сделать так, что бы все работало без запущенного HttpAnalyzerStdV7"...
На ваше приложение - никак, цель сниффера - системный браузер, он встаёт посредником на открытые порта и после "анализа" отправляет\принимает все перехваченные пакеты по назначению и видимо, делает это по всем правилам. Возможно здесь не хватает задержек типа sleep() и поэтому данные не успевают "перевариться", где их ставить - вам виднее
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ApxaHGe1 (08.04.2017)
  #6  
Старый 08.04.2017, 15:42
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

Цитата:
Сообщение от Alegun
На ваше приложение - никак, цель сниффера - системный браузер, он встаёт посредником на открытые порта и после "анализа" отправляет\принимает все перехваченные пакеты по назначению и видимо, делает это по всем правилам. Возможно здесь не хватает задержек типа sleep() и поэтому данные не успевают "перевариться", где их ставить - вам виднее

В сниферы видны пакеты и от моего приложения.... собственно так и проводил анализ авторизации в случаи ошбки... сравнивал запросы/ответы от браузера и моего приложения ...
Ответить с цитированием
  #7  
Старый 09.04.2017, 02:26
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

Кстати, проверил на другом компьютере, все прекрасно работает как и должно, без всяких запущенных сниферов, а на рабочей машине, собственно где и писалось приложение, ну ни как без снифера
Ответить с цитированием
  #8  
Старый 10.04.2017, 10:55
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от ApxaHGe1
...проверил на другом компьютере, все прекрасно работает как и должно...
Видимо здесь могут быть две догадки - либо synapse там более свежий или на сборочной проблема с кодировкой поскольку екземлярчик THTTPsend инициализируется с дефолтными для данного класса параметрами, а они возможно не совсем оптимальны для этой системы и мож на ней настройки браузера отличны от проверочной машинке. И только пжлст, не надо говорить про "...В сниферы видны пакеты и от моего приложения...", всё всёравно через задействованный в системе тырнет-обозреватель проистекает, вернее, с его настройками
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ApxaHGe1 (10.04.2017)
  #9  
Старый 10.04.2017, 12:40
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

Сегодня хотел написать дополнение к приложению, а конкретно - оплата мобильного телефона и перевод с киви на карту...
и о чудо все без снифера заработало... не пойму в чем проблема )
Ответить с цитированием
  #10  
Старый 10.04.2017, 19:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Есть подозрение, что проблема в самом снифере. Он садится как прокси и при вырубании не совсем корректно подчищает за собой. Т.е. перезагруз мог решить проблему на твоем компе. Но это просто предположение на основе твоего описания.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
ApxaHGe1 (12.04.2017)
  #11  
Старый 28.08.2017, 18:20
Lexdreami Lexdreami вне форума
Прохожий
 
Регистрация: 28.08.2017
Сообщения: 3
Версия Delphi: Delphi 10.2
Репутация: 10
По умолчанию А есть код под FMX и примеры по переводу денег?

Привет, интересная статья, а есть код написанный под FMX и примеры по переводу денег?

Спасибо.
Ответить с цитированием
  #12  
Старый 28.08.2017, 19:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А для особо невнимательных, разъясняю. В приведенном коде НЕТ НИ СТРОЧКИ, связанной с визуальной частью. Т.е. приведенный код должен работать и в VCL приложении, и в FMX.
Ответить с цитированием
  #13  
Старый 28.08.2017, 19:49
Lexdreami Lexdreami вне форума
Прохожий
 
Регистрация: 28.08.2017
Сообщения: 3
Версия Delphi: Delphi 10.2
Репутация: 10
Радость

От "особо не внимательных", спасибо за ответ.
А по второй части вопроса, есть ли примеры по переводам?
Ответить с цитированием
  #14  
Старый 29.08.2017, 00:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Видимо, нет.
Хотя, исходя из кода, там просто REST сервис сидит. Надо добывать доку на API. Обычно, для этого надо как-то зарегистрироваться девелопером или подписаться на сервис. Смотри на сайте.
Соответственно, это будет какой-то адрес с соотв. параметрами, на который надо будет сделать POST запрос. Но это просто мои предположения, основанные на том, как выглядит представленный выше код. Сам не проверял и не смотрел.
Ответить с цитированием
  #15  
Старый 29.08.2017, 10:32
Lexdreami Lexdreami вне форума
Прохожий
 
Регистрация: 28.08.2017
Сообщения: 3
Версия Delphi: Delphi 10.2
Репутация: 10
По умолчанию Понял, а не известны ли вам случайно...

Понял, а не известны ли вам случайно готовые библиотеки для Delphi 10.N решающие эти вопросы?

Я готов за это заплатить.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter