Robot类实现代填

目标:实现代填功能

原理:模拟用户的键鼠操作来实现代填。

优势:适用于大部分应用,完全可控。

目前遗留的问题:要求应用登陆页面光标一定要在账号的输入框中。

                代填过程中要求用户不能控制键鼠。

Robot类方法使用

方法名

使用说明

使用实例

delay(n)

延迟电脑操作n毫秒,类似于Thread.sleep()

robot.delay(1000);

keyPress()

模拟手动按下电脑键盘上的某个键

robot.keyPress(KeyEvent.VK_A); //按下A

keyRelease()

模拟手动松开电脑键盘上的某个键

robot.keyRelease(KeyEvent.VK_A); //松开A

mouseMove(x,y)

将鼠标移动到指定的x,y位置

robot.mouseMove(300, 400);  //将鼠标移动到距离左边框300px,距离上边框400px的位置。因为一些不可预见的因素,一般都和循环搭配使用,一般循环5~6次鼠标就可以移动到我们指定的位置

mousePress()

按下鼠标上的某个键

robot.mousePress(InputEvent.BUTTON1_MASK);

//按下左键

mouseRelease()

松开鼠标上的某个键

robot.mouseRelease(InputEvent.BUTTON1_MASK);

 //松开左键

mouseWheel

鼠标滚轮事件

  robot.mouseWheel(1);//移动鼠标滚轮的“凹槽”数。负值表示向上/远离用户,正值表示向下/朝向用户

getPixelColor

获取到指定点的颜色

 robot.getPixelColor(300,400); //获取距离左边框300px,距离上边框400px的颜色。

代码展示:

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.client.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

@Slf4j
@Service
public class test {
    @Autowired
    RestHighLevelClient restHighLevelClient;

    @SneakyThrows
    public static void main(String[] args) {
//        Robot robot = new Robot();
//        robot.delay(500);
//        robot.keyPress(33);

        pointUse("1012685", "1012685!", "E:\\TIM\\Bin\\QQScLauncher.exe");
    }


    /**
     * Robot类
     *
     * @param username 账号
     * @param password 密码
     * @param path     应用的路径
     * @Author: wangyuxin
     * @Date: 2021/6/25
     * @return:
     */
    public static void pointUse(String username, String password, String path) throws Exception {

        //打开应用
        Runtime a = Runtime.getRuntime();
        Process p = a.exec(path);
        Thread.sleep(5000);

        Robot robot = new Robot();
        robot.delay(500);

        //输入账号
        char[] nameArray = username.toCharArray();

        for (char c : nameArray) {
            //翻译为键盘码
            int translate = parseAscii(String.valueOf(c));

            if ((47 <= translate && translate <= 57) || (65 <= translate && translate <= 90)) {
                robot.keyPress(translate);

            } else if (97 <= translate && translate <= 122) {//英文小写
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_SPACE);
                robot.keyRelease(KeyEvent.VK_SPACE);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(translate - 32);

            } else { //特殊符号
                symbolAscii(robot, translate);

            }

            robot.delay(30);
        }

        //tab键
        robot.keyPress(9);

        //输入密码
        char[] passwordArray = password.toCharArray();

        for (char c : passwordArray) {
            //翻译为键盘码
            int translate = parseAscii(String.valueOf(c));

            if ((47 <= translate && translate <= 57) || (65 <= translate && translate <= 90)) {
                robot.keyPress(translate);

            } else if (97 <= translate && translate <= 122) {//英文小写
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_SPACE);
                robot.keyRelease(KeyEvent.VK_SPACE);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(translate - 32);

            } else { //特殊符号
                symbolAscii(robot, translate);

            }

            robot.delay(30);

        }

        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);

    }


    public static int parseAscii(String str) {
        int num;
        byte[] bs = str.getBytes();
        num = bs[0];
        return num;
    }

    public static void symbolAscii(Robot robot, Integer translate) {
        if (translate == 33) {
            robot.keyPress(KeyEvent.VK_SHIFT);
            robot.keyPress(KeyEvent.VK_1);
            robot.keyRelease(KeyEvent.VK_1);
            robot.keyRelease(KeyEvent.VK_SHIFT);
        }
    }

}

备注:

1.Robot类 1.2 、1.5中部分值不可以使用。例如特殊符号、组合键,目前解决的办法就是通过两个键位的组合来实现效果。

实现特殊符号 !

    

public static void symbolAscii(Robot robot, Integer translate) {
    if (translate == 33) {
        robot.keyPress(KeyEvent.VK_SHIFT);
        robot.keyPress(KeyEvent.VK_1);
        robot.keyRelease(KeyEvent.VK_1);
        robot.keyRelease(KeyEvent.VK_SHIFT);
    }
}

2.Robot类目前没有小写英文的封装,直接输入ASCII码值会报错。目前解决的方法是按照调整输入法后通过输入的大写英文转成小写英文。

if (97 <= translate && translate <= 122) {//英文小写
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_SPACE);
    robot.keyRelease(KeyEvent.VK_SPACE);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyPress(translate - 32);

}

希望对你可以有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值