- 需求:
最近得到一个需求,需要模拟登陆网页,然后通过网页接口获取相应数据。一共两个网页,其中没有验证码的网页比较容易的模拟登陆成功。但是另一个带有验证码(图片)却总是登陆失败。
- 代码:
public class AliYun {
private static Logger logger = Logger.getLogger(AliYun.class);
// 通过图片请求地址 获取图片Base64编码
public static String getImageStrFromUrl(String imgURL) {
byte[] data = null;
InputStream inStream = null;
try {
// 创建URL
URL url = new URL(imgURL);
// 创建链接 (注意:稍后更改代码在这一部分)
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
inStream = conn.getInputStream();
BufferedImage src = ImageIO.read(inStream);
File file = new File("D:\\temp.jpg");
ImageIO.write(src, "jpg", file);
InputStream inputStream = new FileInputStream(file);
data = new byte[inputStream.available()];
inputStream.read(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
// 返回Base64编码过的字节数组字符串
return encoder.encode(data);
}
// 获取识别后的验证码
public static String getLoginCode(String imgPath) {
String baseImg = getImageStrFromUrl(imgPath);//base64转换
baseImg = baseImg.replaceAll("\\r\\n", "");
String host = "http://jisuyzmsb.market.alicloudapi.com";
String path = "/captcha/recognize";
String appcode = "你购买接口之后的Code";
Map<String, String> bodys = new HashMap<String, String>();
bodys.put("pic", baseImg);
HttpRequest request = HttpRequest.post(host + path + "?type=en4", bodys, true).header("Authorization", "APPCODE " + appcode).header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
String result = request.body();
logger.debug("阿里云接口识别结果:" + result);
JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject.containsKey