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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2016, 11:34   #21
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Сделал авторизацию, теперь осталось научить программу отправлять сообщение на стену. В интернете нашёл пример, но он под Delphi 2010, но у меня, Delphi 7
Код:
procedure TForm1.Button2Click(Sender: TObject);
  var
    Param : TStringList ;
    Url   : string   ;
    I     : Integer  ;
begin
  Param := TStringList.Create ;
  Param.Add('owner_id=' + IdUser);
  Param.Add('message=' + Memo1.Lines.Text);
  Url := Format('https://api.vk.com/method/wall.post?access_token=%s', [Token]);
  for I := 0 to Param.Count - 1 do
    Param.ValueFromIndex[I] := IdHTTP.Url.ParamsEncode(Param.ValueFromIndex[I]);
  try
    IdHTTP.Post(Url, Param);
    if IdHTTP.ResponseCode = 200 then
      StatusBar1.Panels[0].Text := 'Пост добавлен'
    else
      StatusBar1.Panels[0].Text := 'Ошибка'

  except on E : Exception do
  begin
    MessageBox(Application.Handle, PChar(Format('Ошибка: %s',[e.Message])), 'Error', MB_ICONHAND);
    exit ;
  end;
  end;
  FreeAndNil(Param);
end;
и поэтому код
Код:
for I := 0 to Param.Count - 1 do
    Param.ValueFromIndex[I] := IdHTTP.Url.ParamsEncode(Param.ValueFromIndex[I]);
у меня не работает. У компонента ТIdHTTP, в 7 версии Делфи, нет IdHTTP.Url. Вообще, хотелось бы поподробней узнать, что делает эта строка и как её можно заменить, для совместимости с моей версией Делфи?
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 28.03.2016, 12:07   #22
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Проблема решена. На самом деле, свойство URL есть, просто, вместо IdHTTP нужно было написать IdHTTP1.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 28.03.2016, 17:26   #23
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Разобрался с кодом

Код:
for I := 0 to Param.Count - 1 do
    Param.ValueFromIndex[I] := IdHTTP1.Url.ParamsEncode(Param.ValueFromIndex[I]);
он шифрует параметры, для отправки по HTTPS. Но после отправки запроса на сервер,приходит ошибка 10. Это значит внутренняя ошибка сервера, просят отправить запрос немного позже. Но с помощью других аналогичных программ всё нормально отправляется. В чём может быть проблема?
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 28.03.2016, 17:34   #24
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
вместо IdHTTP нужно было написать IdHTTP1.
Цитата:
У компонента ТIdHTTP, в 7 версии Делфи, нет IdHTTP.Url
Надо давать всему нормальные имена, а не Edit15, Button42 и IdHttp3.
И понимать разницу между классом и экземпляром класса.

Вообще смысл кидать невизуальные компоненты на форму не особо есть, проще в коде их и создавать.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 28.03.2016, 17:51   #25
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

Цитата:
Вообще смысл кидать невизуальные компоненты на форму не особо есть, проще в коде их и создавать.
Это уже нюансы, которые меня сейчас мало интересуют. С этим у меня проблем нет. Проблема в другом.

Indy нормально отправляет данные и возвращает ответ (но, это, насколько я понимаю...). Но в ответе ошибка 10. Вот, получаю, примерно такую строку.

Код:
{"error":{"error_code":10,"error_msg":"Internal server error: could not get application","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"wall.post"},{"key":"owner_id","value":"piarclub21"},{"key":"message","value":"зашифрованное сообщение"}]}}
Согласно документации ВК это внутренняя ошибка сервера. Значит, что сообщение зашифровано неправильно или составлено неверно? Помогите разобраться, очень нужно.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 30.03.2016, 00:51   #26
Smagulov85
Форумчанин
 
Аватар для Smagulov85
 
Регистрация: 22.11.2009
Сообщений: 142
По умолчанию

а где headers?
Если помог: Нажми Весы и оставь отзыв!!!
Smagulov85 вне форума Ответить с цитированием
Старый 30.03.2016, 01:12   #27
vlad1389
Форумчанин
 
Регистрация: 02.02.2016
Сообщений: 290
По умолчанию

Там же, где и cookies. В умных книжках, которые нам недосуг читать.
vlad1389 вне форума Ответить с цитированием
Старый 10.12.2021, 03:45   #28
Mr Robot
 
Регистрация: 27.07.2019
Сообщений: 5
По умолчанию

У меня Rad studio XE7
Рядом с программой обязательны libeay32.dll и ssleay32.dll
Код:
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdCookieManager,
  Vcl.Buttons, sSpeedButton,inifiles, Vcl.StdCtrls, sEdit,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,StrUtils,
  Vcl.OleCtrls, SHDocVw, sLabel, JPEG, Vcl.ExtCtrls, acImage,
  sGroupBox, Vcl.ComCtrls, sStatusBar, IdCookie,IdURI;
 
//Метод сохраняет куки в документ ./Cookies.Cookies (Рядом с программой)
procedure T_SaveCookies(IdCookieManager:TIdCookieManager);
var
  Cookies: TIdCookieList;
  Cookie: TIdCookie;
  I: Integer;
  S: string;
  F:TextFile;
begin
  Cookies := IdCookieManager.CookieCollection.LockCookieList(caRead);
  try
    AssignFile(F,ExtractFilePath(Application.ExeName)+'Cookies.Cookies');
    Rewrite(F);
    Append(F);
    for I := 0 to Cookies.Count-1 do
    begin
      Cookie := Cookies[I];
      S := Cookie.ServerCookie;
      Writeln(F,S);
    end;
  finally
    CloseFile(F);
    IdCookieManager.CookieCollection.UnlockCookieList(caRead);
  end;
end;
// Метод парсинга от и до символов
function Parss(T_, ForS, _T: string): string;
var
  a, b: integer;
begin
  Result := '';
  if (T_ = '') or (ForS = '') or (_T = '') then
    Exit;
  a := Pos(T_, ForS);
  if a = 0 then
    Exit
  else
    a := a + Length(T_);
  ForS := Copy(ForS, a, Length(ForS) - a + 1);
  b := Pos(_T, ForS);
  if b > 0 then
    Result := Copy(ForS, 1, b - 1);
end;
// Метод авторизации vk.com
function AuthVK(email,pass,ip,port:string):Boolean;
var
http: TidHTTP;
IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
//-----------------------------------------------------
//IdCookieManager: TIdCookieManager;
//-----------------------------------------------------
listlist: TStringList;
stream:TMemoryStream;
jpeg:TJPEGImage;
i,j,k,l:Integer;
Fam,Name,Foto:string;
response,ip_h,lg_domain_h,s,hash_str: string;
begin
    Result := False;
    try
      // Создаём TIdHTTP и TStringList и IdSSLIOHandlerSocketOpenSSL
      //=====================================================================================
      http := TIdHTTP.Create();
      listlist := TStringList.Create();
      IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create();
      //-----------------------------------------------------
      // IdCookieManager := TIdCookieManager.Create();
      //-----------------------------------------------------
      //=====================================================================================
      // Включаем ssl в TIdHTTP (Для https запросов) "Обязательно!!! Рядом с программой libeay32.dll и ssleay32.dll"
      http.IOHandler := IdSSLIOHandlerSocketOpenSSL;
      http.HandleRedirects := true;
      //-----------------------------------------------------
      // Включаем куки в нашем TIdHTTP
      // http.CookieManager := IdCookieManager;
      // http.AllowCookies := True;
      //-----------------------------------------------------
      // Ставим proxy на TIdHTTP
      if ip <> '' then
      begin
      http.ProxyParams.ProxyServer:=ip;
      http.ProxyParams.ProxyPort:=strtoint(port);
      end
      else if ip = '' then
      begin
       http.ProxyParams.ProxyServer:='';
       http.ProxyParams.ProxyPort := 0;
      end;
      //=====================================================================================
      // Заполняем заголовок будущего GET запроса
      http.Request.Clear;
      http.Request.Accept :='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
      http.Request.UserAgent :='Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0';
      http.Request.ContentType := 'application/x-www-form-urlencoded';
      http.Request.AcceptLanguage := 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3';
      http.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7';
      http.Request.Host := 'login.vk.com';
      http.Request.Connection := 'keep-alive';
      http.Request.Referer := 'http://m.vk.com/';
      // Делаем GET запрос что бы спарсить ip_h и lg_domain_h
      response := http.Get('https://m.vk.com');
      //=====================================================================================
      // Тут парсим ip_h и lg_domain_h
      j := Pos('ip_h', response);
      if j > 0 then
      begin
        ip_h := Copy(response, j + length('ip_h='), 18);
      end;
      k := Pos('lg_domain_h', response);
      if k > 0 then
      begin
        lg_domain_h := Copy(response, k + length('lg_domain_h='), 18);
      end;
      response := '';
      //=====================================================================================
      // Собираем POST запрос на авторизацию в вк
      listlist.Clear;
      listlist.Add('role=al_frame');
      listlist.Add('expire=');
      listlist.Add('recaptcha=');
      listlist.Add('captcha_sid=');
      listlist.Add('captcha_key=');
      listlist.Add('_origin=http://m.vk.com');
      listlist.Add('ip_h='+ip_h);                   // Тут передаём ip_h
      listlist.Add('lg_h=');
      listlist.Add('lg_domain_h='+lg_domain_h);     // Тут передаём lg_domain_h
      listlist.Add('ul=');
      listlist.Add('email=' + email);               // Тут передаём номер или почту в sEdit1.Text
      listlist.Add('pass=' + pass);                 // Тут передаём пароль в sEdit2.Text
      // Делаем POST запрос на авторизацию vk.com
      response := http.Post('https://login.vk.com/?act=login',listlist);
      //=====================================================================================
      // Если авторизовались то получаем фото с именем профиля
      l := Pos('"token":"', response);
      if l > 0 then
      begin
        //-----------------------------------------------------
        // Сохраняем куки если нужно
        // if T_SaveCookies(IdCookieManager); = True then
        // Application.ProcessMessages;
        //-----------------------------------------------------
        Fam := Parss('"lastName":"',response, '",');
        Name := Parss('"firstName":"',response, '",');
        Foto := Parss('"photo":"',response, '",');
        // Приводим ссылку в читабельный вид
        while Pos('\',Foto) <> 0 do
        Delete(Foto, Pos('\',Foto), 1);
        // Выводим link и firstName и lastName и email и pass
        Form1.sLabel1.Caption := 'https://'+Parss('"link":"\/',response, '",');
        Form1.sLabel2.Caption := Name +' '+Fam;
        Form1.sLabel8.Caption := email;
        Form1.sLabel9.Caption := pass;
        //=====================================================================================
        // Парсим фото по ссылки
        try
          stream:=TMemoryStream.Create();
          jpeg:=TJPEGImage.Create();
          http.Request.ContentRangeEnd:=9999999;
          // Делаем GET запрос на ссылку с аватаркой
          http.Get(Foto,Stream);
          stream.Position:=0;
          jpeg.LoadFromStream(stream);
          // Выводим фото в компонент simage1
          Form1.simage1.Picture.Bitmap.Assign(jpeg);
        finally
          // Отмываем компоненты :D
          FreeAndNil(jpeg);
          FreeAndNil(stream);
        end;
        Result := True;       //Результат положительный
      end;
      //=====================================================================================
    finally
      // Чистим, чистим, не расслабляемся :D
      FreeAndNil(http);
      FreeAndNil(listlist);
      FreeAndNil(IdSSLIOHandlerSocketOpenSSL);
      //-----------------------------------------------------
      // FreeAndNil(IdCookieManager);
      //-----------------------------------------------------
      response := '';
    end;
end;
Используй так:
Код:
if  AuthVK(sEdit1.Text, sEdit2.Text,'','') = True then ShowMessage('Успех! Мы авторизовались.') else ShowMessage('Нет.');

Последний раз редактировалось Mr Robot; 10.12.2021 в 03:47.
Mr Robot вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Авторизация на сайте idhttp Fahman Общие вопросы Delphi 21 10.01.2014 12:46
idHTTP + авторизация на Торренте?! Kudryavtsev Работа с сетью в Delphi 6 14.05.2011 23:13
IdHTTP и авторизация celovec Работа с сетью в Delphi 4 06.12.2010 21:33
Авторизация через Idhttp xakkkkker Работа с сетью в Delphi 1 08.02.2009 17:10
Авторизация выполена, но с ошибкой(idHTTP) KiDoki Работа с сетью в Delphi 2 06.12.2008 19:45