从WebBrowser控件到一个图片框的验证码图像

时间:2009-10-24 15:19:42

标签: c# .net-3.5

我需要能够将验证码图像放入我的表格上的图片框中,原因是我需要缩放验证码图像以供视觉受损的用户使用。

这似乎是一项如此简单的任务,只需从网页上拍摄图像并将其放入图片框即可,但事实证明并非如此简单。 我有WebBrowser控件的形式和在一个网站注册,我需要在图片框中的验证码图像。问题是验证码图像是由JavaScript生成的,当java脚本运行时,它会给出验证码图像的URL。但每当java脚本运行时,验证码图像就会发生变化。我只想要在WebBrowser上控制当前页面的验证码图像。

非常感谢任何帮助。


这是我的代码。

public void FacebookRegistration()
{
  HTMLDoc = (mshtml.HTMLDocument)WBrowser.Document.DomDocument;
  iHTMLCol = HTMLDoc.getElementsByTagName("input");
  foreach (IHTMLElement iHTMLEle in iHTMLCol)
  {
    if (iHTMLEle.getAttribute("name", 0) != null)
    {
      strAttriName = iHTMLEle.getAttribute("name", 0).ToString();
      if (strAttriName == "firstname")
      {
        iHTMLEle.setAttribute("value", FirstName, 0);
        continue;
      }
      if (strAttriName == "lastname")
      {
        iHTMLEle.setAttribute("value", LastName, 0);
        continue;
      }
      if (strAttriName == "reg_email__")
      {
        iHTMLEle.setAttribute("value", EmailID, 0);
        continue;
      }
      if (strAttriName == "reg_passwd__")
      {
        string s = GetRandomString();
        Random ran = new Random();
        iHTMLEle.setAttribute("value", s+ran.Next(1111,9999), 0);
        break;
      }
    }
  }
  iHTMLCol = HTMLDoc.getElementsByTagName("option");
  foreach (IHTMLElement iHTMLEle in iHTMLCol)
  {
    try
    {
      if (iHTMLEle.innerText.Contains("Male"))
      {
        iHTMLEle.setAttribute("selected", "selected",0);
      } 
      if (iHTMLEle.innerText.Contains("Jun"))
      {
        iHTMLEle.setAttribute("selected", "selected", 0);
      }
      Random ran = new Random();
      if (iHTMLEle.innerText.Contains("4"))
      {
        iHTMLEle.setAttribute("selected", "selected", 0);
      }
      Random ran1 = new Random();
      if (iHTMLEle.innerText.Contains(ran1.Next(1920,1985).ToString()))
      {
        iHTMLEle.setAttribute("selected", "selected", 0);
      }
    }
    catch { }
  }

  iHTMLCol = HTMLDoc.getElementsByTagName("input");
  int i = 0;
  foreach (IHTMLElement iHTMLEle in iHTMLCol)
  {
    string s = iHTMLEle.className;
    if (iHTMLEle.className == "UIButton_Text" && iHTMLEle.getAttribute("value", 0).ToString() == "Sign Up")
    {
      if (i != 0)
      {
        iHTMLEle.click();
        break;
      }
      i++;
    }
  }

  private void WBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  {
    if (CurrentSocial == "facebook")
    {
      FacebookRegistration();
    }
  }
}

在facebook.com的注册页面,有验证码,如果你去页面源,那么你只会看到这个:

<input type="hidden" id="captcha_persist_data" name="captcha_persist_data" value="AAAAAQAQiCw5zhFGOsVF6TbDBX8d_wAAAGvqENqFy5KkvMip5AIv3QSF7BS7goiHfAC7fTkzr8hW61cq3s1d23Tw7m-WAi-21Uzt1l3frkLf4obBEuZZMwga_hbcUhnWXu4P382QsJ7J0WtAbo5USXWuVjzv_KD1SMyTWhf34AGorQd27dFqZc0a" /?;

并在此输入标记中,我找到了javascript的url,它提供了captcha url

javascript url: http://api.recaptcha.net/challenge?k=6LezHAAAAAAAADqVjseQ3ctG3ocfQs2Elo1FTa_a&ajax=1&xcachestop=0.31520985781374&authp=nonce.tt.time.new_audio_default&psig=H48rD9d3_QogBfxxKAmzFZ7CG10&nonce=hl77BQn58EsYsPpPwQ2TIA&tt=r3zaWETv27-0igoIw5ndwnHt_W4&time=1256413208&new_audio_default=1

如果你浏览这个网址,你会得到像这样的验证码:

var RecaptchaState = {
challenge : '02UflxsCli4nYg-oG48n5bNDm6ywMlvE62UwXQssF__eJAfSiv2TXuac-1tbu2FThwakgH65IdExWDy9qyr1sYbRuwyQFZD7Dk1eE_fXuoSn9tliqnYeMq__LEF6-GTEm0H6TChOtvpwL2G3C1BsBriw8FFaKqkaTwbNoJeAfzI_j9qYnPaqtHJYillevhRsxyaQVYfLvqai7p0Sfu3849BFpamlbfE3to3KTXi5cZ0xlmuGkMkuZhvq_GyK_z-ZXq9z_Ls8xZlywN0jlIOsSEvI9QJq_69X-X3Moq9lFBcmqWYaKbf7faRQt19aJGB4DdBC1PqQIC',
timeout : 25000,
server : 'http://api.recaptcha.net/',
site : '6LezHAAAAAAAADqVjseQ3ctG3ocfQs2Elo1FTa_a',
error_message : '',
programming_error : '',
is_incorrect : false
};

Recaptcha.challenge_callback();

和原始验证码网址如下所示:

http://api.recaptcha.net/image?c=027CxC4LbBbzVJKy-1xX_wRBf7Gmi4AvgikDVaKeYjBCmiX4XBzGymWC7XRfWx4LLQgfscKnfeB7U305MhlVN0X4vAkrK84ac3jybRJ3UJPUQ8rnlJOS7lqNqpRpolYSd6WBxMShhrzqbx-5ScL0JAsN7cJRMLMqeQsPHg1QB7g4kp4KxKO1aEONsUibahnCC8baLHGSIYJ5Q1Gcr1MPvJ9i_a5qQCilT1tWXwAKE_fkVGi31_un3OxHbNm9UmMemRp7IZ9C9ZLU4IjMApxVJOWXMYqjt588z_ZVcYG2dtY6Dh0b4R1aAQcp0UXFTggdWtsjPw7wIC

然后你会得到验证码,但不是我想要的,因为javascript每次都会改变capthca图像。所以我没有得到目前正在webbrowser中显示的验证码

2 个答案:

答案 0 :(得分:2)

您可以copy the image to the clipboard并从那里阅读。或者,您可以解析页面以获取图片的网址,看看是否可以dig the image file out of the cache

How To Programmatically Copy an IMG Element to the Clipboard

答案 1 :(得分:-1)

是否可以使用reCaptcha.net?您可以免费注册,将脚本添加到您的页面,然后他们完成剩下的工作。他们可能没有为视障人士进行缩放,但他们确实有文字转语音。如果你不需要,重新发明轮子是没有意义的。当然,您需要访问您网页上的互联网,因此如果您的网站是某种内部网或私人网络,这可能会成为一个问题。希望有所帮助。