🔥 三分钟学会!自动化给她发微信 👩 送春节祝福!

6,026 阅读4分钟

PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛

距离2022年春节还有半个月时间了,按照习俗,我们都会在过年的时候去拜年。拜年是中国民间的传统习俗,是人们辞旧迎新、相互表达美好祝愿的一种方式。古时“拜年”一词原有的含义是为长者拜贺新年,包括向长者叩头施礼、祝贺新年如意、问候生活安好等内容。遇有同辈亲友,也要施礼道贺。随着时代的发展,拜年的习俗亦不断增添新的内容和形式。除了沿袭以往的拜年方式外,又兴起了电话拜年、短信拜年、网络拜年等。而我们年轻人通常都会通过微信给亲朋好友发送节日的问候,表达心意。

废话说了一箩筐,今天的正菜是什么呢?

小黑今天带大家用Java代码来实现一个自动发微信,拜年的功能,怎么样?敢不敢兴趣?要不先给我点个赞?

哈哈,好了,开搞。

功能分析

先来分析分析,要通过Java程序自动发微信,你觉得应该如何实现?

一开始,我想的是可能要调用微信的官方API接口,传入要发送的消息,和接收消息人的用户ID,可能在这个过程中再加入一些官方的鉴权之类的一些操作等等,但是我在官方找了一大圈,结果就是。。。。没找着。

难道说微信为了用户信息安全的考虑?或者为了用户体验没提供这样的接口?

这个方法不行,那咱也不能放弃呀,咱们再想想其他办法,你别说,还真让我想到了。

放心,这个方法绝对安全,不会涉及到信息泄露,也不会有第三方代理登录你的微信,更不会转走你微信上的money。

官方没有接口,那我们就模拟自己发微信的整个过程,来实现一个自动化。注意,该功能只能在PC端使用。

首先,我们要打开微信;

然后,找到要发消息的人;

image-20220117213414718

接着,输入要发送的消息;

回车,消息发送完毕。

就是这么简单的一套流程,我们只需要通过程序能够自动化模拟出来这个过程就OK了。

功能实现

这里先要给大家介绍一个类Robot,我后面的代码内容都是基于这个类开发的。

image-20220117213940750

按照官方文档的描述,Robot类主要用于做一些自动化测试,可以自动运行一些鼠标,键盘的操作,控制其他应用程序等。

接下来,我们就来通过Robot类来实现我们自动发微信的功能。

第一步:创建一个Robot对象

因为后面所有的操作都要用到Robot对象,所以我们先创建出一个Robot实例。

Robot robot = new Robot();

第二步:打开微信聊天页面

在执行这一步时,你需要先将微信应用启动,并登录成功。

这里我们会用到微信的快捷键,Ctrl+Alt+w快捷键可以呼出微信聊天页面

private static void openWechat(Robot robot) {
    // 通过robot模拟按键Ctrl+Alt+w
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_ALT);
    robot.keyPress(KeyEvent.VK_W);
    // 松开Ctrl+Alt
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_ALT);
	// 让robot延迟1秒钟,防止页面响应时间长
    robot.delay(1000);
}

第三步:查找要发送消息的好友

同样使用快捷键的方式,在微信聊天页面,使用Ctrl+F可以快速搜索好友。

这里还会用到系统剪贴板,将要查找的好友昵称设置到剪贴板中,然后通过Ctrl+V粘贴,达到输入内容的目的。

private static void findFriend(Robot robot, String userName) {
    // 模拟按键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(userName);
    clip.setContents(tText, null);
    // 模拟ctrl+V,完成粘贴功能
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    // 延迟1秒,防止查询慢
    robot.delay(1000);
    // 回车,定位到好友聊天输入框
    robot.keyPress(KeyEvent.VK_ENTER);
}

第四步:发送消息

同样,将内容设置到剪贴板,然后Ctrl+V粘贴。

private static void sendMessage(String message) throws AWTException {
    // 将要发送的消息设置到剪贴板
    Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
    Robot robot = new Robot();
    StringSelection text = new StringSelection(message);
    clip.setContents(text, null);
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.delay(500);
    // 回车发送
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.delay(500);
}

第五步:关闭窗口

使用和打开窗口一样的快捷键Ctrl+Alt+w,关闭聊天窗口。

private static void closeWechat(Robot robot) {
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_ALT);
    robot.keyPress(KeyEvent.VK_W);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_ALT);
}

功能测试

以上功能开发完毕,我们可以来做一个简单的功能测试,看看好不好使。

直接使用一个main方法来模拟,

/**
 * @author 小黑说Java
 * @ClassName WechatApp
 * @Description
 * @date 2022/1/17
 **/
public class WechatApp {

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            WechatRobot.sendMessage("隔壁二狗", "新年快乐呀,二狗!");
        }
    }
}

WechatRobot类中的sendMessage()是一个静态方法,包含发消息的5个步骤。因为在这个过程中是直接模拟系统操作,使用剪贴板,所以该功能并不支持并发处理,我给该方法添加了synchronized标识。

@Slf4j
public class WechatRobot {

    public static synchronized void sendMessage(String user, String message) {
        try {
            Robot robot = new Robot();

            openWechat(robot);

            findFriend(robot, user);

            sendMessage(message);

            closeWechat(robot);
        } catch (AWTException e) {
            log.error("发消息异常");
        }
    }
}

看看效果:

好使!!!

这个功能还是一个很小很小的雏形,后续我们可以继续往上添加功能,比如增加好友昵称的配置化,发送消息的配置化,发送消息的时间添加定时等等,如果你有更好的点子也可以往上添加,比如七夕给女朋友定时发个甜言蜜语之类的,如果你有对象的话。(狗头)

最后

这个小功能用到的技术算不上厉害,权当是为过年添加一点小氛围吧,给枯燥的CRUD增添一点小乐趣,如果你觉得有点意思呢,不妨为我点个赞,让我也开心开心。嘻嘻。

我是小黑,一名在互联网“苟且”的程序员

流水不争先,贵在滔滔不绝