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

时间:2015-04-02 12:12:26

标签: java captcha htmlunit impersonation

如果我请求以下网址

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

我将获得旧的无脚本版验证码,其中包含Google街道号码的图片,如此

enter image description here

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

enter image description here

它始终发生:浏览器中的真实街道号码和来自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可以观察到过程。

2 个答案:

答案 0 :(得分:0)

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

标题是后端可以获取客户端信息的方式(Firefox,Chrome等)以及它在您的情况下是什么?设置正确的标题,例如对于Firefox:

        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的代码中删除,则需要根据需要调整它。

答案 1 :(得分:0)

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

WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER);

你如何解决问题?