Вывод капчи в окно с VK

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ArkNet, 20 May 2010.

  1. ArkNet

    ArkNet Banned

    Joined:
    15 May 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Как вывести капчу в Отдельное окно с Edit1, а потом отправить разшыфрованую обратно в ВК..? :confused:
     
  2. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    на тебе на примере логина вк. Код взят из моего компонента, так что некоторые строчки тупо удаляй

    Code:
    
    // ---- Вывод диалога ввода кода капчи ----
    procedure TidVKClient.ShowCaptchaDialog(const captcha_sid: string);
    var
      MS  : TMemoryStream;
      Jpg : TJpegImage;
    begin
       Ms  := TMemoryStream.Create;
       Jpg := TJpegImage.Create;
      try
       HTTP.Get('http://vkontakte.ru/captcha.php?s=1&sid=' + captcha_sid, Ms);
       Ms.Position := 0;
       Jpg.LoadFromStream(ms);
       DlgForm.imgKey.Picture.Graphic := Jpg;
      finally
       Jpg.Free;
       Ms.Free;
      end; 
       DlgForm.Caption := 'Enter Code';
       DlgForm.ShowModal;
    end;
    
    // ---- Авторизация ----
    function TIdVKClient.Login: boolean;
    var
      Hash    : string;
      sid     : string;
      Tmp     : TStringList;
      APost   : TStringList;
      I       : Integer;
      Cookie  : TidCookieManager;
    begin
    (* --- Авторизация начата --- *)
    
     // Создаем объекты
      Tmp := TStringList.Create;
      APost := TStringList.Create;
      HTTP := TidHTTP.Create(nil);
      Cookie := TidCookieManager.Create(nil);
    
      HTTP.AllowCookies := True;
      HTTP.HandleRedirects := True;
      HTTP.CookieManager := Cookie;
    
      with HTTP.Request do
      begin
        UserAgent := FHeaders.UserAgent;
        Accept := FHeaders.Accept;
        AcceptLanguage := FHeaders.AcceptLanguage;
        AcceptCharset := FHeaders.AcceptCharset;
        ContentType := FHeaders.ContentType;
        Connection := FHeaders.Connection;
        CustomHeaders.AddStrings(FHeaders.CustomHeaders);
      end;
    
      Tmp.Text := HTTP.Post('http://vkontakte.ru/login.php', APost);
    
     // Если капча, то покажем дилог ввода кода с картинки
     If Pos('captcha_sid', tmp.Text) <> 0 Then
     begin
       sid := tmp.Text;
       sid := Copy(sid, Pos('":"', sid) + 3, Length(sid));
       Delete(sid, Pos(#34, sid), Length(sid));
    
       (* Код для вывода дилога *)
    
       ShowCaptchaDialog(sid);
    
       APost.Add('op=a_login_attempt');
       APost.Add('captcha_sid=' + sid);
       APost.Add('captcha_key=' + key);
    
       HTTP.Post('http://vkontakte.ru/login.php', APost);
     end;
    
     // Подготовка
      APost.Clear;
      APost.Add('act=login');
      APost.Add('email=' + FEmail);
      APost.Add('pass=' + FPass);
    
     // Отсылаем запрос
      Tmp.Text := HTTP.Post('http://login.vk.com/', APost);
      
     // Проверка на ошибки ;)
     If Pos('error', Tmp.Text) <> 0 Then LOGIN_FLAG := False Else LOGIN_FLAG := True;
    
     Result := LOGIN_FLAG;
    
    (* Следующий фрагмент кода будет правильно работать при успешной авторизации *) 
    
     // Ищем хэш в теле ответа и выдергиваем его
      For I := 0 To Tmp.Count -1 Do // Крутим строки...
      begin
        If Pos('id='#39's'#39, Tmp[i]) <> 0 Then // Если нашли строку id='s', ...
        begin // Вытаскиваем из нее хэш
          Hash := Tmp[i];
          Hash := Copy(Hash, Pos('value=', Hash) +7, Length(Hash));
          Delete(Hash, Pos(#39, Hash), Length(Hash));
        end;
      end;
      
     // Ура!!1!1 нашли хэш! Шлем его на сервер
      APost.Clear;
      APost.Add('op=slogin');
      APost.Add('s=' + Hash);
    
      Tmp.Text := HTTP.Post('http://vkontakte.ru/login.php', APost);
    
     // Чистим память
      Tmp.Free;
      APost.Free;
    
    (* --- Авторизация завершена --- *)
    end;
    
     
  3. ArkNet

    ArkNet Banned

    Joined:
    15 May 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    При отправке ПОСТ запроса получаю в мемо такой код
    {"ok":-2,"captcha_sid":"198480237911","text":"Enter code"}
     
  4. ArkNet

    ArkNet Banned

    Joined:
    15 May 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Спасибо за код RedFern.89 , как твой компонент установить.И какие методы есть и для чего они служат
     
  5. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    RedFern.89,
    исходя из количества несущей информации выше заданного вопроса, можно твёрдо сказать, что вряд-ли он поймет хотя бы начало твоего кода :(

    ArkNet
    ,
    твой вопрос идентичен:"Что такое стенка? Она покрашена". Мой тебе совет:
    1. Напиши язык программирования, на котором ты кодишь.
    2. Опиши конкретней цели, которые ты преследуешь. А то же НИЧЕРТА непонятно, ты хочешь вывести капчу в виде текстовой строки в текстовое поле? Или ты хочешь его вывести как картинку? Отправить обратно куда? И что значит "расшифрованную"?
     
  6. ArkNet

    ArkNet Banned

    Joined:
    15 May 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    RedFern.89 розобрался с твоим кодом.Его смысл такой
    Отправляем пост запрос пустой, если вылезла капча то для вывода ее используем самую верхнюю процедуру.
    Потом отправляем пост запросс с нашими данными.
    А теперь скажы что у тебя в USES
    И какой надо Инди чтоб твой ВК компонент установить?
     
  7. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    инди 7-9, в uses idHTTP, idCookieManager, jpeg; - это конкретно для процедуры. а компонент установить легко - Component -> Install Component. Список функций, подробности установки и т.д. смотри тут: https://forum.antichat.ru/threadnav204126-1-10.html
     
  8. ArkNet

    ArkNet Banned

    Joined:
    15 May 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Компилируется нормально но при запуске выдает ошибку "access violation at address 00403404 in module 'Project1.exe'. Read of address D284562F"
    Вот код:
    Добавил на форму кукименеджер и связал его с ашттп.
    procedure Dialog(const captcha_sid: string);
    var
    MS : TMemoryStream;
    Jpg : TJPEGImage;
    begin
    Ms := TMemoryStream.Create;
    Jpg := TJPEGImage.Create;
    try
    Form1.idHttp1.Get('http://vkontakte.ru/captcha.php?s=1&sid=' + captcha_sid, Ms);
    Ms.Position := 0;
    Jpg.LoadFromStream(ms);
    Form1.Image1.Picture.Graphic:= Jpg;
    finally
    Jpg.Free;
    Ms.Free;
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    Hash, sid: string;
    Tmp,APost: TStringList;
    begin
    Tmp.Text := IdHTTP1.Post('http://vkontakte.ru/login.php', APost);
    If Pos('captcha_sid', tmp.Text) <> 0 Then
    begin
    sid := tmp.Text;
    sid := Copy(sid, Pos('":"', sid) + 3, Length(sid));
    Delete(sid, Pos(#34, sid), Length(sid));
    Dialog(sid);
    APost.Add('op=a_login_attempt');
    APost.Add('captcha_sid=' + sid);
    APost.Add('captcha_key=' + Edit1.Text);
    IdHTTP1.Post('http://vkontakte.ru/login.php', APost);
    end;
    APost.Clear;
    APost.Add('act=login');
    APost.Add('email=' + Edit2.Text);
    APost.Add('pass=' + Edit3.Text);
    Tmp.Text := IdHTTP1.Post('http://login.vk.com/', APost);
    Hash:=copy(Tmp.Text, 286, 56);
    APost.Clear;
    APost.Add('op=slogin');
    APost.Add('s=' + Hash);
    Tmp.Text := IdHTTP1.Post('http://vkontakte.ru/login.php', APost);
    Memo1.Text:=Tmp.Text;
    Tmp.Free;
    APost.Free;
    end;
     
    #8 ArkNet, 20 May 2010
    Last edited: 20 May 2010
  9. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    =)))

    Интерессно, а как ты загрузишь что-то в класс TStringList, не создаве его в памяти как объект? о_О
    в начале напиши:
    Tmp := TStringList.Create;
    APost := TStringList.Create;