Java爬虫(四)通过屏幕录制顺序实现目标输入和点击

Java制控制鼠标键盘通过屏幕录制顺序实现输入和点击,用awt包下的Robot实现,awt提供了鼠标事件和键盘事件,我们通过鼠标事件mouseMove()并点击锁定光标位置(这个用录屏实现),然后通过键盘事件KeyEvent()输入需要的内容。

需要源码请联系qq:1101648204

先给大家展示下效果

第一步:启动项目弹出提示框,我们需要手动打开浏览器跳转到拼多多登录页面
在这里插入图片描述
在这里插入图片描述
第二步:根据提示录屏,将鼠标悬停到目标位置
在这里插入图片描述
在这里插入图片描述
第三步:同上将鼠标放发送验证码位置停留10秒
第四步:点击确定就行了
在这里插入图片描述
后面就是定时任务了,后台发现数据库有需要发送短信的手机号就会自动输入然后点击发送短信。

代码解析(代码注释待完成。。。):

键盘输入封装类

import org.springframework.stereotype.Component;

import java.awt.*;

@Component
public class RobotApplication {
    private static RobotKeyBoard robbotKeyBoard;

    static {
        robbotKeyBoard = new RobotKeyBoard();
        Robot robot = null;
        try {
            robot = new Robot();
            robbotKeyBoard.setRobot(robot);
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }

    public static boolean input(String inout){
        return robbotKeyBoard.keyBoardInput(inout);
    }
    
}

键盘事件工具类

import org.springframework.stereotype.Component;

import java.awt.*;
import java.awt.event.KeyEvent;

@Component
public class RobotKeyBoard {

    private Robot robot;

    public boolean keyBoardInput(String input) {

        if (!inputCheck(input)) {
            return false;
        }
        int[] inputKey = stringToIntArray(input);

        for (int in : inputKey) {
            int temp = in;
            if (temp >= 0x5B) {
                in = in - 26;
            } else {
                RobotUtil.keyClick(robot, KeyEvent.VK_CAPS_LOCK);
            }
            RobotUtil.keyClick(robot, in);

            if (temp < 0x5B) {
                RobotUtil.keyClick(robot, KeyEvent.VK_CAPS_LOCK);
            }
        }

        return true;
    }


    private boolean inputCheck(String input) {
        if (input == null || input.trim().equals("")) {
            return false;
        }
        char[] in = input.toCharArray();

        for (char ch : in) {
            if (ch < 48 || (ch < 65 && ch > 57) || (ch < 97 && ch > 90) || ch > 123) {
                return false;
            }
        }

        return true;
    }

    private int[] stringToIntArray(String input) {
        char[] in = input.toCharArray();
        int[] out = new int[in.length];

        for (int i = 0; i < in.length; i++) {
            if (in[i] >= 48 && in[i] <= 65) {
                out[i] = 0x30 + in[i] - 48;
            }

            if (in[i] >= 65 && in[i] <= 90) {
                out[i] = 0x41 + in[i] - 65;
            }
            if (in[i] >= 97 && in[i] <= 123) {
                out[i] = 0x5B + in[i] - 97;
            }
        }
        return out;
    }


    public void setRobot(Robot robot) {
        this.robot = robot;
    }
}

核心处理类

import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.zzx.executor.bo.PositionEntity;
import com.zzx.executor.dao.PhoneDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
@EnableScheduling
@Slf4j
public class RobotStudy implements Runnable{
    private static final String GET_ACCESSTOKEN_URL = "https://mobile.yangkeduo.com/proxy/api/login?pdduid=0";
    private static int times = 0;
    private static int x=906;
    private static int y=153;
    private static int X=1150;
    private static int Y=210;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private PhoneDao dao;

    private static ArrayList<PositionEntity> list=new ArrayList<PositionEntity>();
    List<String> lists = new ArrayList<>();

    public void study() throws InterruptedException {
        JOptionPane.showMessageDialog(null,"请访问网址:【https://mobile.yangkeduo.com/login.html】并进入登录界面");
        Thread.sleep(1000);
        JOptionPane.showMessageDialog(null,"接下来的10秒请将鼠标停留在输入框上【停留时请不要移动鼠标】!");
        Thread.sleep(2000);
        for (int i=0;i<30;i++){
            list.add(dorecord()) ;
            Thread.sleep(200);
        }

        JOptionPane.showMessageDialog(null,"接下来的10秒请将鼠标停留在点击注册按钮上【停留时请不要移动鼠标】!");
        Thread.sleep(2000);
        for (int i=0;i<30;i++){
            list.add(dorecord()) ;
            Thread.sleep(200);
        }
        for(int i=0;i<list.size();i++){
            System.out.println("结果"+list.get(i).toString());
        }
        algorithmX(list);
        algorithmY(list);
        JOptionPane.showMessageDialog(null,"录入完成!");
    }

    private PositionEntity dorecord(){
        PositionEntity positionEntity =new PositionEntity();
        PointerInfo pinfo = MouseInfo.getPointerInfo();
        Point p = pinfo.getLocation();
        int mx = (int)p.getX();
        int my = (int) p.getY();

        positionEntity.setX(mx);
        positionEntity.setY(my);
        return positionEntity;
    }

    private void algorithmX(ArrayList<PositionEntity> list){
        ArrayList<Integer> inputX=new ArrayList<Integer>();
        ArrayList<Integer> inputY=new ArrayList<Integer>();
        for(int i=0;i<30;i++){
            inputX.add(list.get(i).getX());
            inputY.add(list.get(i).getY());
        }
         x=dolist(inputX);
         y=dolist(inputY);
        System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxx="+x);
        System.out.println("yyyyyyyyyyyyyyyyyyyyyyyyyy="+y);
    }

    private void algorithmY(ArrayList<PositionEntity> list){
        ArrayList<Integer> inputX=new ArrayList<Integer>();
        ArrayList<Integer> inputY=new ArrayList<Integer>();
        for(int i=31;i<60;i++){
            inputX.add(list.get(i).getX());
            inputY.add(list.get(i).getY());
        }
         X=dolist(inputX);
         Y=dolist(inputY);
        System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXX="+X);
        System.out.println("YYYYYYYYYYYYYYYYYYYYYYYYYY="+Y);
    }


    private int dolist(ArrayList<Integer> list){

        Map<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<list.size();i++){
            if(map.containsKey(list.get(i))){
               int j= map.get(list.get(i))+1;
               map.remove(list.get(i));
               map.put(list.get(i),j);
            }else {
                map.put(list.get(i),1);
            }
        }
        int v=0;
        int k=0;
        for (Integer key : map.keySet()) {
            if(map.get(key)>v){
                v=map.get(key);
                k=key;
            }
            System.out.println("key= "+ key + " and value= " + map.get(key));
        }

        return k;
    }



    @Lazy(value = false)
    @Scheduled(cron = "* */2 * * * ?")
    public void openAndLogin() throws InterruptedException, AWTException {
        if (times == 0) {
            System.out.println("进入定时任务");
            Thread.sleep(35000);
            times = 1;
        }

        lists = dao.getphone();
        int times_one = lists.size();
        if (times_one == 0) {
            log.info("没有失效的token");
            return ;
        }
        for (int i = 0; i < times_one; i++) {
            //TODO 在这个将token存数据库!
            Thread.sleep(20000);
            String jsonObject= String.valueOf(dorobbot(lists.get(i)).get("access_token"));
            System.out.println("Token参数:"+jsonObject);
            if(jsonObject.equals("null")){
                return;
            }
            int succesfull=dao.updateuser(jsonObject,lists.get(i));
            if(succesfull==1){
                log.info("成功!token:{},手机号:{}",jsonObject,jsonObject,lists.get(i));
            }
        }

    }


    private JSONObject dorobbot(String phone) throws AWTException, InterruptedException {
        Robot robot = new Robot();
        Thread.sleep(3000);


//移动鼠标
        if (x == 0 || y == 0|| X==0||Y==0) {
            System.out.println("没有收到xy");
            return null;
        }
        robot.mouseMove(x, y);
//        robot.mouseMove(906, 153);
        RobotUtil.mouseClick(robot);
        RobotUtil.keyClick(robot, KeyEvent.VK_HOME);
        for (int i = 0; i < 12; i++) {
            RobotUtil.keyClick(robot, KeyEvent.VK_DELETE);
        }
        RobotApplication.input(phone);
//        core.mouseMove(700, 150);
//        robot.mouseMove(1150, 210);
        robot.mouseMove(X, Y);
        RobotUtil.mouseClick(robot);
        Thread.sleep(30000);
        String code = dao.getcode(phone);
        if (code != null) {
            return getAccessToken(phone, code);
        }
        log.info("验证码为空!");
        return null;
    }

    /**
     * 获取token
     *
     * @param mobile
     * @param code
     * @return
     */
    public JSONObject getAccessToken(String mobile, String code) {
        log.info("手机号:{},短信code:{}", mobile, code);
        JSONObject res = new JSONObject();
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            Gson gson = new Gson();
            Map<String, Object> params = new HashMap<>();
            params.put("app_id", 5);
            params.put("mobile", mobile);
            params.put("code", code);
            HttpEntity<Object> entity = new HttpEntity<>(gson.toJson(params), headers);
            String result = restTemplate.postForObject(GET_ACCESSTOKEN_URL, entity, String.class);
            res = JSONObject.parseObject(result);
        } catch (HttpClientErrorException e) {
            //捕捉HTTP异常
            res = JSONObject.parseObject(e.getResponseBodyAsString());
            log.info("失败结果:{}", e.getResponseBodyAsString());
        } catch (Exception e) {
            //捕捉所有异常
            e.printStackTrace();
        }
        return res;
    }

    @Override
    public void run() {
        try {
            study();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

鼠标事件封装类
```import org.springframework.stereotype.Component;

import java.awt.*;
import java.awt.event.InputEvent;


@Component
public class RobotUtil {

    public static void keyClick(Robot robot, int key){
        robot.keyPress(key);
        robot.keyRelease(key);
    }
    public static void mouseClick(Robot robot){
        //点击鼠标
        //鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //鼠标右键
//        core.mousePress(InputEvent.BUTTON3_MASK);
//        core.mouseRelease(InputEvent.BUTTON3_MASK);
    }
}

启动

   @Bean
    public void initial() {
        threadPool.submit(study);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值