Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2017, 18:11   #21
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вот через WinInit попробуйте
Код:
Uses
...WinInit;

//Функция для чтения заголовка ответа сервера
function GetQueryInfo(hRequest: Pointer): string;
var code: String;
    size,index:Cardinal;
begin
  SetLength(code,8);//достаточная длина для чтения статус-кода
  size:=Length(code);
  index:=0;
  if HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF ,PChar(code),size,index)then
    Result:=Code
  else
    if GetLastError=ERROR_INSUFFICIENT_BUFFER then //увеличиваем буффер
      begin
        SetLength(code,size);
        size:=Length(code);
        if HttpQueryInfo(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF,PChar(code),size,index) then
          Result:=code;
      end
  else
      Result:='';
end;

//Функция WinInit для запросов Get и Post
function GetPostSite(Method, URLRes: String; SendHeader: string=''; SendStream: TStream=nil): string;
const
 Accept = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + sLineBreak;
 ProxyConnection = 'Proxy-Connection: Keep-Alive' + sLineBreak;
 LNG = 'Accept-Language: ru' + sLineBreak;
 AGENT = 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '+
 'Chrome/56.0.2924.87 Safari/537.36 OPR/43.0.2442.1144 (Edition Yx)' + sLineBreak;
var
Host, URL, URL_Base, URL_Page, s: String;
hInet, hCon, hReq: Pointer;
  Status, StatusSize, Index, Port: DWORD;
  bytes, b, posi: Cardinal;
  ResponseString: AnsiString;
  SRequest: String;
begin

//Разбираем строку запроса
  URL:= URLRes;
  if pos('http://', URL) <> 0 then
  Port:= 80
  else
  if pos('https://', URL) <> 0 then
  Port:= 443;

  B:= pos('://', URL);
  if b > 0 then
  delete(URL, 1, B + 2);

  B:= pos('/', URL);
  if b > 0 then
  URL_Base:= copy(URL, 1, b - 1)
  else
  URL_Base:= URL;

  B:= pos(':', URL_Base);
  if  b > 0 then
  begin
  Port:= StrToInt(Copy(URL_Base, b + 1, MaxInt));
  delete(URL_Base, b, maxint);
  end;

  b:= pos('/', URL);
  if b <> 0 then
  URL_Page:= copy(URL, b, maxint)
  else
  URL_Page:= '/';

 hInet:= InternetOpen('My Agent',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
 if not Assigned(hInet) then
begin
Showmessage('Error: InternetOpen');
exit;
end;

 hCon:= InternetConnect(hInet, PChar(URL_Base), Port, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  if not Assigned(hCon) then
  begin
  Showmessage('Error: InternetConnect');
  exit;
   end;

  if Port <> 443 then
  hReq:= HttpOpenRequest(hCon, PAnsichar(Method), PAnsichar(URL_Page),HTTP_VERSION, nil,nil,
  INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_RELOAD, 0)
  else
  hReq:= HttpOpenRequest(hCon, PAnsichar(Method), PAnsichar(URL_Page),HTTP_VERSION, nil,nil,
  INTERNET_FLAG_SECURE, 0);

  if not Assigned(hReq) then
  begin
  Showmessage('Error: HttpOpenRequest');
  exit;
  end;

         // добавляем необходимые заголовки к запросу
      Host:= 'Host: ' + URL_Base;
     if Port <> 80 then
     Host:= Format('%s:%d', [Host, Port]);
     HttpAddRequestHeaders(hReq, PAnsiChar(Host),
     Length(Host), HTTP_ADDREQ_FLAG_ADD);

      HttpAddRequestHeaders(hReq, Accept,
        Length(Accept), HTTP_ADDREQ_FLAG_ADD);
      HttpAddRequestHeaders(hReq, ProxyConnection,
        Length(ProxyConnection), HTTP_ADDREQ_FLAG_ADD);
      HttpAddRequestHeaders(hReq, LNG,
        Length(LNG), HTTP_ADDREQ_FLAG_ADD);
      HttpAddRequestHeaders(hReq, AGENT,
        Length(AGENT), HTTP_ADDREQ_FLAG_ADD);

      if SendHeader <> '' then
     begin
     HttpAddRequestHeaders(hReq, PAnsichar(SendHeader),
     Length(SendHeader), HTTP_ADDREQ_FLAG_ADD);
     end;

        // Проверяем запрос:
      StatusSize := 0;
      Index := 0;
      SRequest := '';
      HttpQueryInfo(hReq, HTTP_QUERY_RAW_HEADERS_CRLF or
        HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], StatusSize, Index);
      if StatusSize > 0 then
      begin
         SetLength(SRequest, StatusSize);
        HttpQueryInfo(hReq, HTTP_QUERY_RAW_HEADERS_CRLF or
          HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], StatusSize, Index);
      end;

  // Отправляем запрос
  if (SendStream <> nil) then
  begin
  if not (HttpSendRequest(hReq, nil, 0, TMemoryStream(SendStream).Memory, SendStream.Size)) then
  begin
  Showmessage('Error: HttpSendRequest SendStream');
  exit;
  end;
  end
  else
  if  not (HttpSendRequest(hReq, nil, 0, nil, 0)) then
  begin
  Showmessage('Error: HttpSendRequest');
  exit;
  end;
  
  //Смотрим заголовок ответа сервера, если это не нужно то за комментируйте это
//=========================
     S:= GetQueryInfo(hReq);
     Result:= Copy(S, 1, Length(S)-1);
//=========================

         posi := 1;
          b := 1;
          ResponseString := '';
          while b > 0 do
          if InternetQueryDataAvailable( hReq, bytes, 0, 0 ) then
          begin
            SetLength(ResponseString, Length(ResponseString) + bytes );
            InternetReadFile(hReq, @ResponseString[Posi], bytes, b );
            Inc(Posi, b);
          end;

   InternetCloseHandle(hReq);
   InternetCloseHandle(hCon);
   InternetCloseHandle(hInet);

  Result:= Result + ResponseString;
end;

//Функция Парсинг
function Pars(ForS, T_, _T: string): string;
var
  a, b: integer;
begin
  Result := '';
  if (T_ = '') or (ForS = '') or (_T = '') then
    Exit;
  a := Pos(AnsiLowerCase(T_), AnsiLowerCase(ForS));
  if a = 0 then
    Exit
  else
    a := a + Length(T_);
  ForS := Copy(ForS, a, Length(ForS) - a + 1);
  b := Pos(AnsiLowerCase(_T),  AnsiLowerCase(ForS));
  if b > 0 then
    Result := Copy(ForS, 1, b - 1);
end;

//Получаем нужную инфу для авторизации
procedure TForm1.Button1Click(Sender: TObject);
var
stream: TStringStream;
URL, SURL, LoginURL: String;
begin
try
stream:= TStringStream.Create('');
memo1.Text:= UTF8ToAnsi(GetPostSite('GET', 'https://login.mts.ru/amserver/UI/Login'));
Label1.Caption:= Pars(memo1.Text, '<input type="hidden" name="csrf.sign" value="', '"');
Label2.Caption:= Pars(memo1.Text, '<input type="hidden" name="csrf.ts" value="', '"');
URL:= Pars(memo1.Text, '<form id="form" action="', '"');

stream.WriteString('&amp;csrf.sign=' + Label1.Caption + '&amp;csrf.ts=' + Label2.Caption);
memo1.Text:= UTF8ToAnsi(GetPostSite('POST', URL, '', stream));

Label1.Caption:= Pars(memo1.Text, '<input type="hidden" name="csrf.sign" value="', '"');
Label2.Caption:= Pars(memo1.Text, '<input type="hidden" name="csrf.ts" value="', '"');
LoginURL:= Pars(memo1.Text, '<input type="hidden" name="loginURL" value="', '"');
SURL:= Pars(memo1.Text, '<iframe src="', '"'); //Получаем ссылку на вход

finally
stream.Free;
end;
end;
Остается выполнить скрипт авторизации по ссылке из параметра SURL= http://oauth.mts.ru/social-2.0/buttons.jsp?goto=
с параметрами полученными Button1Click.

Последний раз редактировалось Aliens_wolfs; 31.05.2017 в 00:02.
Aliens_wolfs вне форума Ответить с цитированием
Старый 31.05.2017, 10:31   #22
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
HTTP/1.1 401 Unauthorized
Поробовал... Не вышло. Потом обратил внимание, что нет пароля и логина Добавил:
Код:
stream.WriteString('&amp;IDToken1=' + Edit1.Text + '&amp;IDToken2=' + Edit2.Text + '&amp;csrf.sign=' + Label1.Caption + '&amp;csrf.ts=' + Label2.Caption);
Всё равно не вышло...
Решил на всякий случай попробовать так:
Код:
stream.WriteString('&amp;IDToken1=' + Edit1.Text + '&amp;IDToken2=' + Edit2.Text + '&amp;csrf.sign=' +
                      '&amp;encoded=false&amp;loginURL=/amserver/UI/Login?gx_charset=UTF-8'+
                      Label1.Caption + '&amp;csrf.ts=' + Label2.Caption);
Но результат остался тем же.

Или я чего-то не понимаю... Но мне кажется, что это не та ссылка, которая должна в результате получиться
И ещё я не пойму где найти эту ссылку в Хроме?
F12->Network->галка на "Preserve Log" -> в списке "Login?gx_charset=UTF-8"
Там в FormData отправляемые от формы данные, как я понимаю.
А ссылка, которая должна получиться, должна быть в Response Headers? Там oauth только в таком виде:
Цитата:
Access-Control-Allow-Origin:https://oauth.mts.ru
Ship_1 вне форума Ответить с цитированием
Старый 01.06.2017, 20:13   #23
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
Или я чего-то не понимаю... Но мне кажется, что это не та ссылка, которая должна в результате получиться
https://oauth.mts.ru:443/social-2.0/buttons.jsp?goto=
И ещё я не пойму где найти эту ссылку в Хроме?
в коде страницы эта ссылка выглядит так
<iframe src="https://oauth.mts.ru:443/social-2.0/buttons.jsp?goto=" frameborder="0" scrolling="no" width="100%" height="35" allowtransparency="true" class="social_container"></iframe>

Цитата:
А ссылка, которая должна получиться, должна быть в Response Headers? Там oauth только в таком виде:
Access-Control-Allow-Origin:https://oauth.mts.ru
Нужно смотреть не в заголовке ответа сервера, а в самой странице, алгоритм из пункта скрипта buttons.jsp нужно правильно выполнить, либо выполнить сам скрипт, тогда я думаю можно войти.
Смотрите код страницы через меню CTRL+U, ну или через меню.

Последний раз редактировалось Aliens_wolfs; 01.06.2017 в 20:32.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Может кто объяснить что происходит в этих двух строках. pompiduskus Общие вопросы C/C++ 7 01.11.2015 00:42
Что означает void setup, кто может объяснить, напишите(((((( yulja-uk Помощь студентам 1 21.12.2011 10:58
Кто нибудь может объяснить почему это так? Fedor111 Общие вопросы C/C++ 1 24.09.2011 20:12
кто может объяснить??? Надежда Карунова Помощь студентам 1 25.11.2010 17:38
дойти не может что к чему if-soft Паскаль, Turbo Pascal, PascalABC.NET 7 07.10.2008 10:45