2012-11-20 4 views
0

기본 Captcha 이미지가 포함 된 웹 페이지가 있습니다. 웹 사이트에서 이미지를 다운로드하고 Tesaract를 사용하여 해결했습니다. 이 함수를 사용하여 다운로드하지 않고 Timage 객체에 이미지를 표시합니다. 델파이 페이지를 새로 고침하지 않고 이미지 다운로드

FUNCTION DownloadImage(CONST URL : STRING ; ImageType : TGraphicClass = NIL) : TBitMap; 
    VAR 
    HTTP  : TIdHttp; 
    S   : TStream; 
    IMG   : TGraphic; 
    STR   : AnsiString; 
    LHandler: TIdSSLIOHandlerSocketOpenSSL; 

    BEGIN 
    HTTP:=TIdHttp.Create(NIL); 
    LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    TRY 
     HTTP.IOHandler:=LHandler; 
     S:=TMemoryStream.Create; 
     TRY 
     HTTP.Get(URL,S); 
     IF NOT Assigned(ImageType) THEN BEGIN 
      S.Position:=0; 
      SetLength(STR,5); 
      S.Read(STR[1],LENGTH(STR)); 
      IF COPY(STR,1,2)='BM' THEN 
      ImageType:=TBitMap 
      ELSE IF COPY(STR,1,3)='GIF' THEN 
      ImageType:=TGIFImage 
      ELSE IF COPY(STR,2,3)='PNG' THEN 
      ImageType:=TPngImage 
      ELSE IF (ORD(STR[1])=$FF) AND (ORD(STR[2])=$D8) THEN 
      ImageType:=TJPEGImage 
     END; 
     IF NOT Assigned(ImageType) THEN RAISE EInvalidImage.Create('Unrecognized file format!'); 
     IMG:=ImageType.Create; 
     TRY 
      S.Position:=0; 
      IMG.LoadFromStream(S); 
      Result:=TBitMap.Create; 
      TRY 
      Result.Assign(IMG) 
      EXCEPT 
      Result.Free; 
      RAISE 
      END 
     FINALLY 
      IMG.Free 
     END 
     FINALLY 
     S.Free 
     END 
    FINALLY 
     HTTP.Free 
    END 
    END; 

또는 다운로드 이미지

문제가 웹 사이트에 연결하는 기능을 모두 이미지를 얻을 이로 인해 나는 내 양식 다운로드 보안 문자 사진을 웹 브라우저로 페이지를 탐색 할 때입니다
function DownLoadInternetFile(Source, Dest : String): Boolean; 
begin 
    try 
    Result := URLDownloadToFile(nil,PChar(Source),PChar(Dest),0,nil) = 0 
    except 
    Result := False; 
    end; 
end; 

및 브라우저 페이지의 captcha 그림이 다르다. 내가하고 싶은 것은 embedwb 나 webbrowser 객체의 그림을 문서가 완성 될 때 직접 가져 오는 것이다. 또한 런타임시 webbrowser의 스크린 샷을 얻으려고 시도하지만 실패했다. 웹 페이지는 다음과 같다. "https://esgm.sgk.gov.tr/Esgm/", 미리 감사드립니다. 나쁜 영어에 대해 죄송합니다.

+2

captcha는 수행하려고 시도하는 것을 멈추게합니다. 당신이 그것을 격파한다면, 당신은 당신 자신의 기술로 그렇게 할 수 있습니다! –

+0

이 문제에 대한 잘못된 접근 방식을 사용하고 있습니다. Captcha가 어떻게 작동하는지 파악한 다음, Captcha를 물리 칠 방법을 찾아야합니다. 힌트 : 동일한 이미지를 두 번 가져 오지 마십시오. 페이지의 HTML은 항상 동일하며 새로 고침 할 때마다 쿠키가 변경되지 않습니다. 그것은 100 % 서버 측이고, 그것이 약점입니다. –

답변

1

양식의 TWebBrowser 인 경우 해당 문서를 수정할 수 있습니다. 문서에 캔바스를 추가하고 캔바스에 이미지를 그린 다음 canvas.toDataURL을 사용하여 이미지의 base64 인코딩 된 표현을 가져올 수 있습니다.

이와 비슷한 질문은 자바 스크립트에서만 가능합니다. Get image data in JavaScript?

그러면 델파이에서 이와 같은 결과가 발생합니다.

function GetBase64Image(WebBrowser: TWebBrowser; ImageId: string): string; 
var 
    Document, Image, Canvas, Context: OleVariant; 
begin 
    Document := WebBrowser.Document; 
    Image := Document.getElementById(ImageId); 
    Canvas := Document.createElement('canvas'); 
    Canvas.Width := Image.Width; 
    Canvas.Height := Image.Height; 

    Context := Canvas.getContext('2d'); 
    Context.drawImage(Image, 0, 0); 

    Result := Canvas.toDataURL('image/png'); 
    // Have to fix this. No time, sorry. 
    //return dataURL.replace(/^data:image\/(png|jpg);base64,/, ""); 
end; 
+0

시도하지는 않았지만 IE 9가 설치되어 있어야 작동 할 것으로 생각됩니다. TWebBrowser 사용자 IE와 IE 8은 HTML5 캔버스를 지원하지 않습니다. – GolezTrol

관련 문제