Java用Jsoup登录网站,以JSON格式提交(POST)数据,处理JSON格式返回结果,并将处理结果保存到系统剪贴板

因工作需要,写了一个自动登录某网站的线程,每隔一秒检查有否有新图片(图片为验证码),有的话,将图片以BASE64编码格式提交到网站,再将网站处理结果保存到系统剪贴板,供自己的前台程序调用。

主程序如下:

package com.clzhang.sample.net;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.jsoup.Jsoup;
import java.util.HashMap;
import java.util.Map;
import java.text.SimpleDateFormat;

import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.io.File;
import java.io.IOException;

import com.clzhang.util.Base64Util;

public class PredictThread extends Thread {
    // 验证码图片路径
    String imagePath = "D:\\TDDOWNLOAD\\code\\mycode.gif";
    // 文件最后修改时间
    long lastModified = 0L;
    // 登录用户名
    String username = "usertest";
    // 登录密码
    String password = "password123";
    // 备注字段: 可以不写
    String remark = "输出计算结果";
    // 默认 3 数英混合
    String typeid = "3";
    // 处理总数量
    int count = 0;

    // 初始化时,读取文件最后修改时间。此段代码也可以放到实例初始化块中。
    public PredictThread() {
        File file = new File(imagePath);
        lastModified = file.lastModified();
    }

    @Override
    public void run() {
        while (true) {
            try {
                // 检查图片是否更新
                File file = new File(imagePath);
                long time = file.lastModified();
                if (time > lastModified) {
                    count++;
                    
                    // 清空剪贴板
                    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(""), null);
                    
                    // 开始处理
                    lastModified = time;
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    System.out.println("有新的验证码需要上传……" + sdf.format(time));
                    Map<String, String> data = new HashMap<>();
                    data.put("username", username);
                    data.put("password", password);
                    data.put("typeid", "3");
                    data.put("remark", remark);
                    data.put("image", Base64Util.getImageStr(imagePath));

                    try {
                        String resultString = Jsoup.connect("http://api.somesite.com/predict")
                                .requestBody(JSON.toJSONString(data))
                                .header("Content-Type", "application/json")
                                .ignoreContentType(true)
                                .timeout(120000)
                                .post()
                                .text();
                        JSONObject jsonObject = JSONObject.parseObject(resultString);
                        if (jsonObject.getBoolean("success")) {
                            String result = jsonObject.getJSONObject("data").getString("result");
                            // 如果长度不正确,即识别错误,修正
                            if(result.length() < 4 ) {
                                for(int i=result.length();i<=4;i++) {
                                    result = result + "1";
                                }
                            }else if (result.length() > 4 ) {
                                result = result.substring(0, 4);
                            }
                            
                            // 将返回结果存放到剪贴板中,等待前台调用
                            StringSelection selection = new StringSelection(result);
                            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);

                            System.out.println(count + " : " + result);
                        } else {
                            // 识别错误,放一个值到剪贴板中,保证前台程序往下走
                            StringSelection selection = new StringSelection("0000");
                            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);

                            System.out.println("识别失败原因为:" + jsonObject.getString("message"));
                        }
                    } catch (IOException ex) {
                        // 如果程序走到这里,比如说网络异常,暂时不处理,即程序停止:因为没有返回数据给前台。
                        ex.printStackTrace();
                    }
                }

                // 间隔时间
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        PredictThread ins = new PredictThread();
        ins.start();
        System.out.println("守候线程已经启动……");
    }
}

一、程序需要引用fastjson-1.2.76.jar

 可以自行从网络下载,或者通过此链接下载: https://pan.baidu.com/s/130l4cGiUEYy7rXvY22eLMw 提取码: c3vx 

二、程序中,将图片与Base64编码进行转换的Base64Util类

参考:使用Java,实现图片与Base64编码互转的程序

三、清空系统剪贴板

                    // 清空剪贴板
                    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(""), null);

注意,需要引用:

import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;

四、将数据放进系统剪贴板

                            // 将返回结果存放到剪贴板中,等待前台调用
                            StringSelection selection = new StringSelection(result);
                            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);
posted @ 2021-07-28 06:39  那些年的事儿  阅读(1030)  评论(0编辑  收藏  举报