• 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);
  • 相关阅读:
    【设计模式】第九篇:组合模式解决层级关系结构问题
    【设计模式】第八篇:喝豆浆就是装饰者模式吗?
    【设计模式】第七篇:和我一起简单认识桥接模式
    【设计模式】第六篇:来康康适配器模式
    【设计模式】第五篇:什么是原型模式?浅提浅拷贝和深拷贝
    【计算机网络】学习笔记,第三篇:数据链路层(谢希仁版)
    一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
    单例模式的几种实现And反射对其的破坏
    缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了
    图文并茂,带你深入了解AQS的源码
  • 原文地址:https://www.cnblogs.com/nayitian/p/15068682.html
Copyright © 2020-2023  润新知