java通过调用鼠标模拟自动添加微信好友

java通过调用鼠标模拟自动添加微信好友,第1张

鼠标模拟自动添加微信好友
  • 背景
  • 实现

背景

x乎上刷到的帖子
试了几次,没试出来,想着能不能暴力一点,把所有可能的微信号输出出来,然后微信自动添加好友。

实现

参考这位大佬的帖子
他是通过键盘发消息,我是通过鼠标点击。

package Api;

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

public class AutoAdd {
    public static void main(String[] args) throws InterruptedException {
        // 要搜索的微信号、手机号等等(此处有一个bug)
        String friendNickName = "weixinhao";

        searchMyFriendAndSend(friendNickName);
    }

    /**
     * 出现一个bug,聊天记录中不能有搜索的值不然就会先d出聊天记录,导致搜索微信号的坐标不对了
     * @param friendNickName
     * @throws InterruptedException
     */
    private static void searchMyFriendAndSend(String friendNickName) throws InterruptedException {
        // 创建Robot对象
        Robot robot = getRobot();
        //打开微信 Ctrl+Alt+W
        assert robot != null;
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_ALT);
        robot.keyPress(KeyEvent.VK_W);
        //释放Ctrl按键,像Ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放
        robot.keyRelease(KeyEvent.VK_CONTROL);
        robot.keyRelease(KeyEvent.VK_ALT);

        // 该延迟不能少,否则无法搜索
        robot.delay(1000);

        // Ctrl + F 搜索指定好友
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_F);
        robot.keyRelease(KeyEvent.VK_CONTROL);

        // 将好友昵称发送到剪切板
        Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable tText = new StringSelection(friendNickName);
        clip.setContents(tText, null);
        // 以下两行按下了ctrl+v,完成粘贴功能
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        robot.delay(1000);
        robot.keyPress(KeyEvent.VK_ENTER);
        robot.delay(2000);


        //这是当前鼠标的坐标值
        Point point = MouseInfo.getPointerInfo().getLocation();
        System.out.println(point);
        //这是你的屏幕坐标信息
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        System.out.println(screenSize);


        // 鼠标移动,瞬移到屏幕指定的(x,y)位置:此位置搜索微信号位置
        robot.mouseMove(1200,312);
        point(1200,312,robot);
        robot.delay(1000);
        Thread.sleep(1* 1000); // 休眠 1 秒
        // 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
        robot.mousePress(MouseEvent.BUTTON1_MASK);
//        robot.delay(1000);
        robot.mouseRelease(MouseEvent.BUTTON1_MASK);
        robot.delay(1000);


        // 鼠标移动,瞬移到屏幕指定的(x,y)位置:此位置是搜索账号异常,然后点击确定
        robot.mouseMove(1344,596);
        point(1344,596,robot);
        // 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
        robot.mousePress(MouseEvent.BUTTON1_MASK);
        robot.mouseRelease(MouseEvent.BUTTON1_MASK);
        robot.delay(1000);


        // 鼠标移动,瞬移到屏幕指定的(x,y)位置:此位置是添加好友位置
        robot.mouseMove(1642,574);
        point(1642,574,robot);
        robot.delay(1000);
        Thread.sleep(1* 1000); // 休眠 1 秒
        // 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
        robot.mousePress(MouseEvent.BUTTON1_MASK);
        robot.mouseRelease(MouseEvent.BUTTON1_MASK);
        robot.delay(1000);

        //我是xxx
        String Im="我是李xx";
        AutoIm(Im,1479,223,robot);

        //备注xxx
        String note="想似手机号的人";
        AutoIm(note,1472,335,robot);

        // 鼠标移动,瞬移到屏幕指定的(x,y)位置:此位置是确定添加好友位置
        robot.mouseMove(1265,948);
        point(1265,948,robot);
        // 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
        robot.mousePress(MouseEvent.BUTTON1_MASK);
        robot.mouseRelease(MouseEvent.BUTTON1_MASK);
        robot.delay(1000);
    }

    /**
     * 函数的目的是确定鼠标的坐标,不然鼠标的坐标老对不上
     * 1、输入的值(鼠标想去的坐标)
     * 2、循环判断。当前的鼠标的坐标和想要去的坐标的区别,如果当前坐标和想去的绝对值小于等2,就退出去。
     * @param x
     * @param y
     * @throws InterruptedException
     */
    private static void point(int x,int y,Robot robot) throws InterruptedException{
        robot.mouseMove(x,y);
        Point point = MouseInfo.getPointerInfo().getLocation();
        while(Math.abs(x-point.getX())>2||Math.abs(y-point.getY())>2){
            robot.mouseMove(x,y);
            point = MouseInfo.getPointerInfo().getLocation();
        }
    }

    /**
     * 添加好友之我是xxx
     *      1、先把之前的删除了
     *      2、剪切板里获取自己输入的
     * @return
     */
    private static void AutoIm(String Im,int x,int y,Robot robot) throws InterruptedException{
        point(x,y,robot);//使鼠标位置定位到对应位置上
        // 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
        robot.mousePress(MouseEvent.BUTTON1_MASK);
        robot.mouseRelease(MouseEvent.BUTTON1_MASK);
        //先清除自带的(最多20次)
        for(int i=0;i<20;i++){
            robot.keyPress(KeyEvent.VK_BACK_SPACE);
            robot.delay(100);
            robot.keyRelease(KeyEvent.VK_BACK_SPACE);
        }
        // 将我是xxx发送到剪切板
        Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable tText = new StringSelection(Im);
        clip.setContents(tText, null);
        // 以下两行按下了ctrl+v,完成粘贴功能
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        robot.delay(1000);
        Thread.sleep(5*1000);
    }

    /**
     * 备注,其实函数和自动添加我是xxx一样的
     *      1、先把之前的删除了
     *      2、剪切板里获取自己输入的
     * @return
     */
    private static void AutoNote(String Im,int x,int y,Robot robot) throws InterruptedException{
        point(x,y,robot);//使鼠标位置定位到对应位置上
        // 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
        robot.mousePress(MouseEvent.BUTTON1_MASK);
        robot.mouseRelease(MouseEvent.BUTTON1_MASK);
        //先清除自带的(最多20次)
        for(int i=0;i<15;i++){
            robot.keyPress(KeyEvent.VK_BACK_SPACE);
            robot.delay(100);
            robot.keyRelease(KeyEvent.VK_BACK_SPACE);
        }
        // 将我是xxx发送到剪切板
        Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable tText = new StringSelection(Im);
        clip.setContents(tText, null);
        // 以下两行按下了ctrl+v,完成粘贴功能
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        robot.delay(1000);
        Thread.sleep(5*1000);
    }

    //获取Robot
    private static Robot getRobot(){
        // 创建Robot对象
        Robot robot = null;
        try {
            robot = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }
        return robot;
    }
}

代码应该很好理解,就是讲一下里面的获取坐标值,每个电脑应该不一样。
先给代码:这个代码就是不断获取你当前鼠标的坐标值。

    @Test()
    public void test() throws InterruptedException{
        //这个函数不断执行,获取当前鼠标坐标
        while(true){
            Point point = MouseInfo.getPointerInfo().getLocation();
            System.out.println(point);
//            System.out.println(System.currentTimeMillis());
            Thread.sleep(5 * 1000); // 休眠 3 秒
//            System.out.println(System.currentTimeMillis());
//            [x=1479,y=223] [x=1472,y=335]
        }
    }

看上图,代码核心就是模拟鼠标点击事件。
所以先让鼠标移动到图中红框的位置,再模拟点击。这时我们要先获取红框坐标(鼠标点击坐标),再模拟鼠标点击。

这是我电脑的配置信息,所以x轴最大1920,y轴是1080,坐标原点在左上角。

参考链接:
https://blog.csdn.net/qq_42761569/article/details/109121451?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165249887016781685397462%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165249887016781685397462&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-7-109121451-null-null.nonecase&utm_term=java%E5%BE%AE%E4%BF%A1%E8%87%AA%E5%8A%A8%E5%8A%A0%E5%A5%BD%E5%8F%8B&spm=1018.2226.3001.4450

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/921124.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存