繁体   English   中英

如何将图片作为多部分POST请求的一部分发送 - Java HtmlUnit

[英]How to send a picture as part of a multipart POST request - Java HtmlUnit

我正在尝试使用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是我试图提交的图片的名称)。

有一个更高级别的机制来发送该文件,您不需要创建WebRequestSettings并设置其各自的值。

你应该在某个地方托管那个静态html并执行类似下面的操作。

如果您仍有问题,请在HtmlUnit错误跟踪器中提交错误报告。

BTW,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();

你不应该为它使用NameValuePair ,而是它的子类KeyDataPair 这样您就可以指定要上载的文件。

以下应该有效:

new KeyDataPair("pict", new File(fileName), "image/png", "utf-8");

内容类型参数是文件的MIME类型。 由于您要上传PNG文件,因此它应该是image/png

这是我试图输入的内容:

File file = new File("captcha.png");
params.add(new KeyDataPair("pict", capFile, "png", "utf-8"));

PNG文件是用UTF-8编码的吗? 这是我如何指定文件输入的KeyDataPair? 我想我要么指定错误的contentType或错误的charSet,要么两者都指定。 我应该把它们全部盖上吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM