Вывод captcha.php

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sere@, 13 Mar 2012.

  1. sere@

    sere@ New Member

    Joined:
    12 Mar 2012
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток требуется помощь плиз как Вывести captcha.php из WebBrowser1 на фому в Image1

    Делал так но нечего не получается :confused: :confused:

    Code:
    procedure TForm1.Button3Click(Sender: TObject); var body, imgs, controlRange: olevariant; begin    body := WebBrowser1.OleObject.document.body;    imgs := WebBrowser1.OleObject.document.images.item(0).src='captcha/captcha-ff/captcha.php';    controlRange := body.createControlRange;    controlRange.add(imgs);    controlRange.execCommand('Copy', False, EmptyParam);    if ClipBoard.HasFormat(CF_BITMAP) then begin    Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0);    Clipboard.Clear; end; end;  end.
    
    Надо выкавернуть с этого сайта http://www.vip-prom.net

    HTML:
    <div class="captcha"><img id="siimage" src="captcha/captcha-ff/captcha.php" alt="" /></div>
    Надеюсь найдутся профисиональные люди!!!
    Зарание спасибо!
     
    #1 sere@, 13 Mar 2012
    Last edited: 13 Mar 2012
  2. xenosapien

    xenosapien New Member

    Joined:
    10 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Не получишь ты капчу из веббраузера, делай через другие компы Inhttp к примеру.
     
  3. sere@

    sere@ New Member

    Joined:
    12 Mar 2012
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Мда а вот мне нужно через веббраузера.
     
  4. t3cHn0iD

    t3cHn0iD Banned

    Joined:
    6 Apr 2009
    Messages:
    313
    Likes Received:
    63
    Reputations:
    66
    А зачем ? Это изврат.
     
  5. sere@

    sere@ New Member

    Joined:
    12 Mar 2012
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Ну ты прям скажеш что незнаеш зачем чтобы входить было на сайт легче вот зачем
     
  6. BigSnake

    BigSnake New Member

    Joined:
    20 Apr 2010
    Messages:
    15
    Likes Received:
    1
    Reputations:
    0
    1-й вариант
    загрузить страницу , потом в ней выполнить JS , в котором считать в массив цвета картинки, потом этот массив преобразовать в строку с разделителями и запихнуть в какой-нибуть созданый элемент

    пример получения массива данных о картинке
    PHP:
              function GetImg(Canva)           {             return Canva.getContext('2d').getImageData(0,0,Canva.widthCanva.height);           }
    потом получить значение этого элемента и распарсить строку собрать в битмам, вывести битмап где нужно

    2-й вариант
    поднять на каком нибуть локальном порту прокси через эту же программу, прописать в вебброузере этот прокси и в этом прокси ловить уже нужные данные
     
  7. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Советую почитать еще немного книги по Delphi и посмотреть примеры авторизаций в интернете, на Indy например. Не тупите! :)
     
  8. sere@

    sere@ New Member

    Joined:
    12 Mar 2012
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    BigSnake, Все это канешно заманчиво звучит ну ток это каким нужно быть профисиональным програмистом чтоб всё это понять я же пока мало опотен в этом.
     
  9. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Наверное по-этому тебе предлагают взять: свой браузер, руки и почитать как пользоваться Indy...
     
  10. t3cHn0iD

    t3cHn0iD Banned

    Joined:
    6 Apr 2009
    Messages:
    313
    Likes Received:
    63
    Reputations:
    66
    Предлагаю несколько вариантов ответа на задачу ТС:
    Вариант 1.
    Работаем с изображением в WebBrowser
    Вариант 2.
    Два способа загрузки капчи
    Вариант 3.Для него необходимы компоненты PNGImage, jpeg и GIFimage
    3.1:
    Как получить капчу
    3.2.Свой вариант:
    3.2.0.В uses добавляем PNGImage, jpeg или GIFimage, тут все зависит от того, какой формат изображения собираемся парсить, иногда браузер выдает формат GIF, а оказывается, что там Png и соответственно будут вылазить ошибки.В таком случае проще всего скачать картинку и посмотреть ее заголовок hex или текстовым редактором.
    3.2.1.Добавляем на форму компонент IdHttp1 и IdCookieManager1.
    Да, иногда для парсинга капчи придется еще и куки получить.
    Выделяем компонент IdHttp1 и в инспекторе объектов выставляем свойство AllowCookies в true, так же в свойстве CookieManager выбираем IdCookieManager1.
    3.2.2.После «{$R *.dfm}» пишем:
    HTML:
    function Pars(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;
    Эта функция как раз и будет парсить необходимый нам кусок кода для получения капчи.
    3.2.3.Добавляем на форму компоненты TImage, TButton и 3 TEdit.В обработчик события Onclick кнопки пишем следующий код:
    HTML:
    procedure TForm1.Button1Click(Sender: TObject);
    var  Page, Image :string; //тут мы объявляем переменные 
    captcha:TStream;  
    gif:TGIFImage;  
    begin  
    gif:=TGifImage.Create;
    try  
    Page:=IdHTTP1.Get('http://www.zyll.net/games/game.php?id='+Edit1.text+''); //Тут указываем страницу, с которой мы будем получать капчу.Ее можно было получить с определенной страницы, но я сделал возможность ввода для 
    параметра id в  Edit1
    except  
    end;  
    Image:=(Pars('<input name="kod1" type="hidden" value=',Page,' ></td>'));  //Здесь функция Pars запишет в строковую переменную Image нужный нам кусок кода
    try 
    captcha:=TStringStream.Create(IdHTTP1.Get('http://www.zyll.net/games/kod'+Image+'.gif')); //тут мы в памяти создаем изображение формата gif, получив его полный адрес
    except  
    end;  
    Edit2.Text:=Image; //Для наглядности выведем в Edit2 кусок кода, который получили в результате работы функции pars 
    gif.LoadFromStream(captcha); //Загружаем изображение из памяти 
    Form1.Image1.Picture.Assign(gif); //Выводим полученное изображение на компонент Image1
    end;
    Вот, собственно и все.
    3.2.4.Дополнение.
    Выше я писал о том, что в uses нужно подключать компонент того формата изображения, с которым мы работаем.
    Если бы мы выводили изображение формата jpg, то наш код изменился бы так:
    HTML:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Page, Image :string;
    captcha:TStream;
    jpg:TJPEGImage;
    begin
    jpg:=TJPEGImage.Create;
    try
    Page:=IdHTTP1.Get('http://www.zyll.net/games/game.php?id='+Edit1.text+'');
    except
    end;
    Image:=(Pars('<input name="kod1" type="hidden" value=',Page,' ></td>'));
    try
    captcha:=TStringStream.Create(IdHTTP1.Get('http://www.zyll.net/games/kod'+Image+'.jpg'));
    except
    end;
    Edit2.Text:=Image;
    jpg.LoadFromStream(captcha);
    Image1.Picture.Assign(jpg);
    end;
    
    Для Png так:
    HTML:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Page, Image :string;
    captcha:TStream;
    png:TPNGObject;
    begin
    png:=TPNGObject.Create;
    try
    Page:=IdHTTP1.Get('http://www.zyll.net/games/game.php?id='+Edit1.text+'');
    except
    end;
    Image:=(Pars('<input name="kod1" type="hidden" value=',Page,' ></td>'));
    try
    captcha:=TStringStream.Create(IdHTTP1.Get('http://www.zyll.net/games/kod'+Image+'.png'));
    except
    end;
    Edit2.Text:=Image;
    png.LoadFromStream(captcha);
    Image1.Picture.Assign(png);
    end;
    3.1.5.Дополнение 2.
    Как можно было заметить, я писал парсер капчи для сайта http://www.zyll.net.Движок там самопальный (там и XSS, и скули есть, но это уже тема другого плана) и как я впоследствии выяснил, что капча там фиксированная и у каждого изображения есть порядковый номер, который, собственно, мы и выводили выше в Edit2.Всего там ровно 7 изображений.На основе этого я написал простейший, если так можно выразиться, механизм распознавания:
    HTML:
    begin
      if Form1.Edit2.Text=IntToStr(StrToInt('0')) //считываем порядковый номер изображения из Edit2, если он = 0
     then //тогда
      Form1.Edit3.Text:=IntToStr(StrToInt('1111')); //ответ будет такой
    end;
    Далее по аналогии:
    begin
      if Form1.Edit2.Text=IntToStr(StrToInt('1')) then
      Form1.Edit3.Text:=IntToStr(StrToInt('1164'));
    end;
    begin
      if Form1.Edit2.Text=IntToStr(StrToInt('2')) then
      Form1.Edit3.Text:=IntToStr(StrToInt('1217'));
    end;
    begin
      if Form1.Edit2.Text=IntToStr(StrToInt('3')) then
      Form1.Edit3.Text:=IntToStr(StrToInt('1270'));
    end;
    begin
      if Form1.Edit2.Text=IntToStr(StrToInt('4')) then
      Form1.Edit3.Text:=IntToStr(StrToInt('1323'));
    end;
    begin
      if Form1.Edit2.Text=IntToStr(StrToInt('5')) then
      Form1.Edit3.Text:=IntToStr(StrToInt('1376'));
    end;
    begin
      if Form1.Edit2.Text=IntToStr(StrToInt('6')) then
      Form1.Edit3.Text:=IntToStr(StrToInt('1429'));
    end;
    3.1.6.Исходник.
    Если у ТС возникнут непонятки, то на всякий случай выкладываю исходник и скомпилированный вариант программы, в которой реализовал парсинг капчи.Компилируется на Delphi XE, но думаю, что переписать под другую версию труда не составит, да и просто нагляднее будет:
    Скачать Commenter

    Вариант 4.
    HTML:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    html:WideString;
    Stream:TStream;
    png:TPNGObject;
    begin
    try
    png:=TPNGObject.Create;
    html:=IdHTTP1.Get('http://freelance.ru/registration/?cmd=agree');
    Delete(html,1,pos('<td><img src="',html)+length('<td><img src="'));
    Delete(html,pos('" id',html),length(html));
    Stream:=TStringStream.Create(IdHTTP1.Get('http://freelance.ru/'+html));
    png.LoadFromStream(Stream);
    Image1.Picture.Assign(png);
    Stream.Free;
    png.Free;
    except
    on e:Exception do
    begin
    png.Free;
    Stream.Free;
    end;
    end;
    end;
     
    #10 t3cHn0iD, 17 Mar 2012
    Last edited: 17 Mar 2012
    1 person likes this.
  11. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    t3cHn0iD, Спасибо за развернутый ответ =)