4

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>

そのような投稿要求を 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 オブジェクトに設定する必要がありますか? (captcha.png は、送信しようとしている画像の名前です)。

4

3 に答える 3

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();
于 2010-08-04T09:41:04.240 に答える
1

これには a を使用しないNameValuePairでください。そのサブクラスKeyDataPair. このようにして、アップロードするファイルを指定できます。

以下が機能するはずです。

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

コンテンツ タイプ パラメータは、ファイルのMIMEタイプです。PNGファイルをアップロードしているので、image/png.

于 2010-08-02T16:31:42.123 に答える
0

ここに私が入力しようとしていたものがあります:

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

PNG ファイルは UTF-8 でエンコードされていますか? それは、ファイル入力の KeyDataPair を指定する方法ですか? 間違った contentType または間違った charSet、あるいはその両方を指定していると思います。それらをすべて大文字にすることになっていますか?

于 2010-08-03T02:02:52.537 に答える