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

3
如果我请求以下网址:
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可以观察进程。


很可能是用户代理HTTP头。 - Erwin Bolwidt
2个回答

0
设置请求正确的头信息如何呢?User-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编写的,您需要根据自己的需求进行调整。

0

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

WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接