距离2022年春节还有半个月时间了,按照习俗,我们都会在过年的时候去拜年。拜年是中国民间的传统习俗,是人们辞旧迎新、相互表达美好祝愿的一种方式。古时“拜年”一词原有的含义是为长者拜贺新年,包括向长者叩头施礼、祝贺新年如意、问候生活安好等内容。遇有同辈亲友,也要施礼道贺。随着时代的发展,拜年的习俗亦不断增添新的内容和形式。除了沿袭以往的拜年方式外,又兴起了电话拜年、短信拜年、网络拜年等。而我们年轻人通常都会通过微信给亲朋好友发送节日的问候,表达心意。
废话说了一箩筐,今天的正菜是什么呢?
小黑今天带大家用Java代码来实现一个自动发微信,拜年的功能,怎么样?敢不敢兴趣?要不先给我点个赞?
哈哈,好了,开搞。
功能分析
先来分析分析,要通过Java程序自动发微信,你觉得应该如何实现?
一开始,我想的是可能要调用微信的官方API接口,传入要发送的消息,和接收消息人的用户ID,可能在这个过程中再加入一些官方的鉴权之类的一些操作等等,但是我在官方找了一大圈,结果就是。。。。没找着。
难道说微信为了用户信息安全的考虑?或者为了用户体验没提供这样的接口?
这个方法不行,那咱也不能放弃呀,咱们再想想其他办法,你别说,还真让我想到了。
放心,这个方法绝对安全,不会涉及到信息泄露,也不会有第三方代理登录你的微信,更不会转走你微信上的money。
官方没有接口,那我们就模拟自己发微信的整个过程,来实现一个自动化。注意,该功能只能在PC端使用。
首先,我们要打开微信;
然后,找到要发消息的人;
接着,输入要发送的消息;
回车,消息发送完毕。
就是这么简单的一套流程,我们只需要通过程序能够自动化模拟出来这个过程就OK了。
功能实现
这里先要给大家介绍一个类Robot,我后面的代码内容都是基于这个类开发的。
按照官方文档的描述,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增添一点小乐趣,如果你觉得有点意思呢,不妨为我点个赞,让我也开心开心。嘻嘻。