Как отправить изображение как часть составного POST-запроса - Java HtmlUnit - PullRequest
4 голосов
/ 01 августа 2010

Я пытаюсь использовать Java для отправки капчи на decaptcher.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>

Я должен отправить такой запрос на веб-сервер и получить возвращенную мне строку.Вот моя попытка реализовать это в 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 - это имя изображения, которое я пытаюсь отправить).

Ответы [ 3 ]

3 голосов
/ 04 августа 2010

Существует механизм более высокого уровня для отправки этого файла, вам не нужно создавать 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 голос
/ 02 августа 2010

Вы не должны использовать NameValuePair для этого, но его подкласс, KeyDataPair.Таким образом, вы можете указать файл для загрузки.

Должно работать следующее:

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

Параметр типа содержимого является типом файла MIME .Поскольку вы загружаете файл PNG, он должен быть image/png.

0 голосов
/ 03 августа 2010

Вот что я пытался набрать:

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

Зашифрованы ли файлы PNG в UTF-8?Это то, как я бы указал KeyDataPair для ввода файла?Я думаю, что я либо указываю неправильный contentType или неправильный charSet, либо оба.Я должен положить их во все заглавные буквы?

...