从特定URL下载验证码

时间:2015-11-25 11:28:19

标签: java

我试图从特定的网址下载验证码图片,因为我正在开发一个解决简单验证码的程序。 我正在使用的网址:https://www.mannschaftsfoto-nrw.de/rpc/captcha/Ddc3Lp5eOshwmzWfpgL4cNCTnZTcOU2T 我以前读过很多帖子并尝试了不同的东西,我现在使用的是这段代码:

URL url = new URL("https://www.mannschaftsfoto-nrw.de/rpc/captcha/Ddc3Lp5eOshwmzWfpgL4cNCTnZTcOU2T"); 
  InputStream in = new BufferedInputStream(url.openStream());
  ByteArrayOutputStream out = new ByteArrayOutputStream();
  byte[] buf = new byte[1024];
  int n = 0;
  while (-1!=(n=in.read(buf)))
  {
    out.write(buf, 0, n);
  }
  out.close();
  in.close();
  byte[] response = out.toByteArray();
  FileOutputStream fos = new FileOutputStream("C://captcha.jpg");
  fos.write(response);
  fos.close();

事实上,当我使用不同的网址(例如Google图片)时,这确实有用,但它对我的链接不起作用。我得到了例外: Exception: javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 这个功能是否可以正常工作,虽然链接不会以" .png"

结束

2 个答案:

答案 0 :(得分:1)

我尝试执行上面的相同程序。它很酷,图像下载到C:\ captcha.jpg。这是下面的代码。

因此,无需在链接末尾添加.jpg即可下载图像。我用了jdk1.6.0_45。

对于SSL问题,解决方法如下,

从版本2.4.7开始,mod_ssl将使用DH参数,其中包括长度超过1024位的素数。但是,Java 7及更早版本将它们对DH prime大小的支持限制为最多1024位。

如果基于Java的客户端因例外java.lang.RuntimeException而中止:无法生成DH密钥对和java.security.InvalidAlgorithmParameterException:Prime大小必须是64的倍数,并且只能在512到1024之间(包括)和httpd日志tlsv1警告内部错误(SSL警报号80)(在LogLevel信息或更高版本),您可以使用SSLCipherSuite重新排列mod_ssl的密码列表(可能与SSLHonorCipherOrder一起使用),或者您可以使用自定义DH具有1024位素数的参数,它始终优先于任何内置DH参数。

要生成自定义DH参数,请使用openssl dhparam 1024命令。

因此,您的代码应该与没有ssl问题的java 8完美配合。

package stack.overflow;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

public class Testing {
    public static void main(String[] args) {
         URL url = null;
        try {
            url = new URL("https://www.mannschaftsfoto-nrw.de/rpc/captcha/Ddc3Lp5eOshwmzWfpgL4cNCTnZTcOU2T");
          InputStream in = new BufferedInputStream(url.openStream());
          ByteArrayOutputStream out = new ByteArrayOutputStream();
          byte[] buf = new byte[1024];
          int n = 0;
          while (-1!=(n=in.read(buf)))
          {
            out.write(buf, 0, n);
          }
          out.close();
          in.close();
          byte[] response = out.toByteArray();
          FileOutputStream fos = new FileOutputStream("C://captcha.jpg");
          fos.write(response);
          fos.close();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
}

答案 1 :(得分:0)

您需要使用open ssl

从服务器下载所有证书/证书链

假设您已安装OpenSSL(默认在Mac OS X和Linux系统上可用),请查看s_client命令:

openssl s_client -host google.com -port 443 -prexit -showcerts

以上命令将google.com的完整证书链打印到stdout。现在,您只需将每个证书复制到单独的PEM文件(例如googleca.pem)。最后,您可以导入(Java)信任库中的每个证书。要导入一个证书:

keytool -import -alias gca -file googleca.pem -keystore trust.jks

现在使用此信任库以安全HTTP模式与网站建立连接。