【问题标题】:How google server can distinguish between browser and HtmlUnit?google server 如何区分浏览器和HtmlUnit?
【发布时间】:2015-06-07 09:24:56
【问题描述】:

如果我请求以下网址

http://www.google.com/recaptcha/api/noscript?k=MYPUBLICKEY

我会得到旧的无脚本版本的验证码,包含谷歌街道号码的图像,像这样

但是如果我对HtmlUnit 做同样的事情,我会得到一些伪造的图像版本,如下所示:

它一直在发生:来自浏览器的真实街道号码和来自HtmlUnit 的黑色扭曲文本。公钥是一样的。

Google 服务器如何区分浏览器和 HtmlUnit?

HtmlUnit 代码如下:

final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);
final HtmlPage page = webClient.getPage("http://www.google.com/recaptcha/api/noscript?k=" + getPublicKey());
HtmlImage image = page.<HtmlImage>getFirstByXPath("//img");
ImageReader imageReader = image.getImageReader();

使用 Fiddler 可以观察到进程。

【问题讨论】:

  • 很可能是 User-Agent http 标头。

标签: java captcha htmlunit impersonation


【解决方案1】:

如何为您的请求设置正确的HeadersUser-Agent 是这里的关键。

标头是后端获取客户端信息(Firefox、Chrome 等)的方式,您的情况是什么?设置正确的标题,例如。火狐浏览器:

        conn.setRequestProperty("User-Agent", " Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1");
        conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");

如果从我使用 Apache HttpClient 的代码中截取,您需要对其进行调整以适应您的需求。

【讨论】:

    【解决方案2】:

    我知道这是旧帖子,但是,好的方法是使用

    WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER);
    

    你是如何解决你的问题的?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      相关资源
      最近更新 更多