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

Java 谷歌服务器如何区分浏览器和HtmlUnit?,java,captcha,htmlunit,impersonation,Java,Captcha,Htmlunit,Impersonation,如果我请求以下URL http://www.google.com/recaptcha/api/noscript?k=MYPUBLICKEY 我将得到旧的无脚本版本的验证码,包含谷歌街道号码的图像,如下所示 但是如果我对HtmlUnit做同样的操作,我会得到一些伪造的图像,如下所示: 它总是发生:浏览器中的真实街道号码和HtmlUnit中的黑色扭曲文本。公钥是相同的 谷歌服务器如何区分浏览器和HtmlUnit HtmlUnit代码如下所示: final WebClient webClient

如果我请求以下URL

http://www.google.com/recaptcha/api/noscript?k=MYPUBLICKEY
我将得到旧的无脚本版本的验证码,包含谷歌街道号码的图像,如下所示

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

它总是发生:浏览器中的真实街道号码和
HtmlUnit
中的黑色扭曲文本。公钥是相同的

谷歌服务器如何区分浏览器和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();
final-WebClient-WebClient=新的WebClient(BrowserVersion.FIREFOX_17);
最终HtmlPage=webClient.getPage(“http://www.google.com/recaptcha/api/noscript?k=“+getPublicKey());
HtmlImage=page.getFirstByXPath(“//img”);
ImageReader=image.getImageReader();

通过Fiddler可以观察到该过程。

为您的请求设置正确的
标题如何<代码>用户代理
是此处的一个键

标题是后端获取客户端信息(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的代码中删除,您需要根据自己的需要对其进行调整。

我知道这是一篇老文章,但最好的方法是使用

WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER);

如何解决问题?

最有可能是用户代理http头。