2015-01-11 1 views
0

Captcha 이미지를 복사하여 그림 상자에 표시하려고 시도하고 있습니다. 당신은 확실히 일하고 페이지 :VB.Net 사용자 입력 대기 보안 문자

  Dim htmlDocument As HtmlDocument = Me.IEMC.Document 
      Dim htmlElementCollection As HtmlElementCollection = htmlDocument.Images 
      For Each htmlElement As HtmlElement In htmlElementCollection 
       Dim imgUrl As String = htmlElement.GetAttribute("id") 
       If imgUrl.Contains("wlspispHIPBimg") Then 

        GRABMYDARNIMG! 

       End If 
      Next 

를 새로 고칠 때 나는 현재이 끊임없이 변화하기 때문에, 해당 ID를 찾으려면 다음 코드를 사용하고

. 올바른 ID를 찾을 수 있습니다. 하지만이 ID의 이미지 콘텐츠를 복사하여 내 그림 상자에 붙여 넣으려면 어떻게해야합니까?

   IEMC.Document.GetElementById(imgUrl).Focus() 
       IEMC.Document.ExecCommand("Copy", False, Nothing) 

을 그러나 어디를 붙여 넣거나 제대로 요소를 복사하는 방법에 대한 확실하지 수없는 것 :

나는 다음 시도했다.

Dim O As Object 

Set O = WebBrowser1.Document.body.createControlRange() 
Call O.Add(WebBrowser1.Document.All("imgcode")) 
Call O.execCommand("Copy") 

Set Picture1.Picture = Clipboard.GetData 

을하지만 그 VB.NET에서 작동하지 않습니다 :

나는이 같은 것을 시도했다. 다음에 무엇을 시도해야할지 모르겠습니다.

이미지를 그림 상자에 붙여 넣기는 클립 보드에 복사되는 것으로 가정하면 충분히 쉽습니다. 이 코드 줄을 사용하면됩니다.

PictureBox1.Image = Clipboard.GetImage 

누구든지이 작업을 수행하는 방법을 알고 있다면 매우 감사 할 것입니다.

참고 :URL에서 이미지를 다운로드 할 수 없습니다. 웹 브라우저의 이미로드 된 요소에서 가져와야합니다. captcha 이미지가 한 번로드되면 이미지 URL이 삭제됩니다.

EDIT : 아래 제안을 시도했습니다. 그러나 어떤 img도 저장하지 않습니다.

Dim doc As mshtml.IHTMLDocument = DirectCast(IEMC.Document.DomDocument, mshtml.IHTMLDocument) 
        Dim imgRange As mshtml.IHTMLControlRange = DirectCast(DirectCast(doc.body, mshtml.HTMLBody).createControlRange(), mshtml.IHTMLControlRange) 
        Dim imagename As String = String.Empty 
        Try 
         For Each img As mshtml.IHTMLImgElement In doc.images 
          imgRange.add(DirectCast(img, mshtml.IHTMLControlElement)) 
          imgRange.Select() 
          imgRange.execCommand("Copy", False, Nothing) 
          Using bmp As Bitmap = DirectCast(Clipboard.GetDataObject().GetData(DataFormats.Bitmap), Bitmap) 
           bmp.Save("C:\captchaPic.jpg") 
          End Using 
          imagename = img.nameProp 

          Exit For 
         Next 
        Catch aaa As System.Exception 
        End Try 

답변

1

나는 CaptchaImage를 디스크에 저장 한 다음 decaptcha API로 보내는 것과 비슷한 작업을 수행했습니다. 여기 내 코드는 C#입니다.하지만 쉽게 변환 할 수 있습니다 : 그래서 디스크에 저장하고 그림 상자에 넣으십시오. 내가 제대로이 변환하는 방법에 아주 확실하지 않다

 IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument; 
    IHTMLControlRange imgRange = (IHTMLControlRange)((HTMLBody)doc.body).createControlRange(); 
       string imagename = string.Empty; 
       try 
        { 
        foreach (IHTMLImgElement img in doc.images) 
        { 
         imgRange.add((IHTMLControlElement)img); 
         imgRange.execCommand("Copy", false, null); 
         using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap)) 
           { 
            bmp.Save(@"captchaimages\captchaPic.jpg"); 
           } 
           imagename = img.nameProp; 
           break; 

          } 
         } 
         catch (System.Exception aaa) 
         { 
         } 
+0

흠 는 .. .. 나는 코드 컨버터를 사용했다,하지만 난 그것을 작동하도록하는 것 캔트. 특히 imgRange.add 및 imgRange.execCommand뿐만 아니라 doc.body. – Gematria

+0

mshtml에 대한 참조를 추가해야한다고 생각합니다. – confusedMind

+0

너무 빨리 말하십시오. 실행했지만 실제로는 아무 것도 저장하지 않습니다. 실제로는 이미지를 찾지 못합니다. – Gematria

-1
For Each capimg As HtmlElement In WebBrowser6.Document.Images 
    If capimg.GetAttribute("src").Contains("papi/media?") Then 
     Dim CD As mshtml.IHTMLDocument2 = CType(WebBrowser6.Document.DomDocument, Global.mshtml.IHTMLDocument2) 
     Dim Images As mshtml.IHTMLControlRange = CType(CType(CD.body, mshtml.HTMLBody).createControlRange, Global.mshtml.IHTMLControlRange) 
     For Each imgs As mshtml.IHTMLImgElement In CD.images 
      If imgs.GetAttribute("src").ToString.Contains("papi/media?") Then 
       Images.add(CType(imgs, Global.mshtml.IHTMLControlElement)) 
       Images.execCommand("Copy", False, Nothing) 
       Dim captchaimage As Image 
       captchaimage = CType(Clipboard.GetDataObject.GetData(DataFormats.Bitmap), Image) 
       PictureBox1.Image = captchaimage 

      End If 
     Next 
    End If 
Next