一,背景知识
要实现给微信好友定时发送消息,需要分为两部分:
1.实现控制屏幕按键
1,实现给微信好友发送消息的原理就是利用微信的快捷按键,Robot类就可以很好的控制按键。
Java中Robot类位于java.awt.Robot,该类用于为测试自动化,自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件,Robot类的主要目的是便于Java平台实现自动测试。
Robot可以模拟鼠标和键盘的输入,可以把他看作Java版的按键精灵。
2,要实现给微信好友发送消息,那就需要把消息复制到剪切板上,再粘贴到对话框,这里就需要用到Toolkit
来将消息复制到剪贴板,使用Toolkit也可以获得本机系统的屏幕的参数。具体代码为:
//获取系统粘贴板
//Toolkit类:Abstract Window Toolkit的所有实际实现的抽象超类。 Toolkit类的子类用于将各种组件绑定到特定的本机Toolkit实现。
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 将字符串复制到剪切板
Transferable tText = new StringSelection(msg);
clip.setContents(tText, null);
2.实现定时定点发送消息
定时定点发送消息可以借助Java中的Timer类来实现
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Test {
public static void main(String[] args) {
//timer1();
timer2();
//timer3();
//timer4();
}
// 第一种方法:设定指定任务task在指定时间time执行 schedule(TimerTask task, Date time)
public static void timer1() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
}
}, 2000);// 设定指定的时间time,此处为2000毫秒
}
// 第二种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行
// schedule(TimerTask task, long delay, long period)
public static void timer2() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
}
}, 1000, 1000);
}
// 第三种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。
// scheduleAtFixedRate(TimerTask task, long delay, long period)
public static void timer3() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
}
}, 1000, 2000);
}
// 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行.
// Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
public static void timer4() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时
calendar.set(Calendar.MINUTE, 0); // 控制分
calendar.set(Calendar.SECOND, 0); // 控制秒
Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
}
}, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行
}
}
上述代码提供了四种方式来实习定时任务,本文采用的是第四种方式!
3.微信的相关快捷按键
扩展:
按键 | 功能 |
---|---|
ALT+F4 | 关闭微信窗口 |
Ctrl+Alt+W | 打开微信窗口 |
Ctrl+F | 微信中搜索好友 |
Enter | 发送消息 |
二,具体实现步骤
定时给微信好友发送消息:
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.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Super_T5 {
public static void main(String[] args) {
timer4();
}
public static void timer4() {
Calendar calendar = Calendar.getInstance();
/* calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时文件传输助手
calendar.set(Calendar.MINUTE, 0); // 控制分
calendar.set(Calendar.SECOND, 0); // 控制秒*/
Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------提醒日常签到--------");
String friendNickName = "日常签到";
try {
searchMyFriendAndSend(friendNickName);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, time, 1000*60);// 这里设定将延时每天固定执行
}
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(1000);
// 发送消息
sendMsg();
//关闭微信对话窗口
robot.delay(2000);
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_F4);
robot.keyRelease(KeyEvent.VK_ALT);
}
private static void sendMsg() throws InterruptedException {
String[] mottoes = {
"xdm,记得每天签到",
};
for (String motto : mottoes) {
sendOneMsg(motto);
}
Thread.sleep(2000);
sendOneMsg("学院要登记的哦!");
}
private static void sendOneMsg(String msg) {
// 创建Robot对象
Robot robot = getRobot();
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
// 将字符串复制到剪切板
Transferable tText = new StringSelection(msg);
clip.setContents(tText, null);
// 以下两行按下了ctrl+v,完成粘贴功能
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
// 回车发送
robot.keyPress(KeyEvent.VK_ENTER);
robot.delay(1000);
}
private static Robot getRobot(){
// 创建Robot对象
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
return robot;
}
}
以上就是实现的完整代码,需要注意的地方在代码中都有注释!!!
三,应用场景
应用场景可以说是颇为广泛,比如说:
-
给女盆友早安晚安!ps:前提是要有女朋友哦!
-
每天需要重复完成的微信工作,签到、打卡等
-
再比如说,微信疯狂骚扰朋友、网络互骂等!ps:这个可不提倡哈!