我正在尝试使用Java向captaptcher.com提交验证码。 Decaptcher并没有真正解释如何使用他们的API,所以我试图弄清楚如何使用HTTP POST请求来提交验证码。以下是我从他们的网站获得的示例代码:
<form
method="post"
action="http://poster.decaptcher.com/"
enctype="multipart/form-data">
<input type="hidden" name="function" value="picture2">
<input type="text" name="username" value="client">
<input type="text" name="password" value="qwerty">
<input type="file" name="pict">
<input type="text" name="pict_to" value="0">
<input type="text" name="pict_type" value="0">
<input type="submit" value="Send">
</form>
我应该将这样的帖子请求发送到Web服务器并获取返回给我的字符串。这是我尝试在Java中实现它。
public String getDecaptcherAnswer(String username, String password){
try{
URL decaptcherPostURL = new URL("http://poster.decaptcher.com/");
WebRequestSettings request = new WebRequestSettings(decaptcherPostURL, HttpMethod.POST);
request.setEncodingType(FormEncodingType.MULTIPART);
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new NameValuePair("function", "picture2"));
params.add(new NameValuePair("username", username));
params.add(new NameValuePair("password", password));
//I added this block in
File file = new File("captcha.png");
params.add(new KeyDataPair("pict", capFile, "png", "utf-8"));
//----------------------
params.add(new NameValuePair("pict_to", "0"));
params.add(new NameValuePair("pict_type", "0"));
request.setRequestParameters(params);
request.setUrl(decaptcherPostURL);
HtmlPage page = webClient.getPage(request);
System.out.println(page.asText());
System.out.println("--------------------------------------");
System.out.println(page.asXml());
return page.asText();
}catch (Exception e){
e.printStackTrace();
return null;
}
}
我是否应该将pict的值设置为File对象而不是指向验证码存储位置的String? (captcha.png是我要提交的图片的名称)。
答案 0 :(得分:3)
有一个更高级别的机制来发送该文件,您不需要创建WebRequestSettings
并设置其各自的值。
你应该在某个地方托管那个静态html并执行类似下面的操作。
如果您仍有问题,请在HtmlUnit错误跟踪器中提交错误报告。
顺便说一句,HtmlUnit 2.8即将发布,试一试。
WebClient webClient = new WebClient();
HtmlPage page = webClient.getPage("http://some_host/test.html");
HtmlForm form = page.getForms().get(0);
form.getInputByName("username").setValueAttribute(username);
form.getInputByName("password").setValueAttribute(password);
form.getInputByName("pict_to").setValueAttribute("0");
form.getInputByName("pict_type").setValueAttribute("0");
form.getInputByName("pict").setValueAttribute("full_path_to_captcha_png");
form.<HtmlFileInput>getInputByName("pict").setContentType("image/png");//optional
HtmlPage page2 = form.getInputByValue("Send").click();
答案 1 :(得分:1)
你不应该使用NameValuePair
作为它的子类KeyDataPair
。这样您就可以指定要上传的文件。
以下内容应该有效:
new KeyDataPair("pict", new File(fileName), "image/png", "utf-8");
内容类型参数是文件的MIME类型。由于您要上传PNG文件,因此该文件应为image/png
。
答案 2 :(得分:0)
这是我试图输入的内容:
File file = new File("captcha.png");
params.add(new KeyDataPair("pict", capFile, "png", "utf-8"));
PNG文件是否使用UTF-8编码?这是我如何指定文件输入的KeyDataPair?我想我要么指定错误的contentType或错误的charSet,要么两者都指定。我应该把它们全部盖上吗?