java实现微信信息定时发送

java实现微信信息定时发送

今天遇到一个问题,需要在凌晨0点发送信息,但是怕之前想好的信息遗忘,因此希望编写一个java程序来实现程序按时发送

分析可得,整个程序可以分为三个问题:

  • java调用微信发送信息
  • 创建一个信息池,来存储要发送的信息
  • 设置时间,发送信息

java调用微信给特定对象发送信息

参考blog:

(188条消息) Java实现微信每天定时发送消息,指定好友 – 柚子真好吃_我是小金毛的博客-CSDN博客_java微信给指定好友发消息

(188条消息) 使用Java实现发送微信消息(附源码)_此程序在手再也不怕对象跟你闹了_Willing卡卡的博客-CSDN博客_java发送微信消息

分析blog的 robot类很重要

(188条消息) Java Robot类使用指南_Javee-Y的博客-CSDN博客_robot类

因此 ,java调用电脑上的程序是通过robot对象来实现的。

robot类略解

(188条消息) Java中Robot类详解_MardenSSS的博客-CSDN博客_robot类

具体思路

通过java的robot( )类来模拟人的操作

  • 使用java的robot( )类来模拟人的操作
  • 使用win的快捷键来操作微信
  • 使用robot来执行win的快捷键来实现对微信的操作

打开微信

程序前提:需要首先登录微信

win快捷键

alt + ctrl +w

java代码

1
2
3
4
5
6
robot = new Robot();
//用robot模拟 alt+win+w 直接调用微信
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_W);

延迟操作

java操作微信没有延迟,但是微信的打开和操作有延迟,为了避免发生冲突,需要在每次完成玩一个程序后执行一个延迟操作

1
robot.delay(1000);

单位为毫秒

按键释放操作

必须释放按压,按压操作并不会随着程序的结束而结束

1
2
3
4
5
//释放Ctrl按键,像Ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_W);

不释放的话 会影响程序之后的电脑操作

搜索好友

快捷键

Ctrl +F

java代码

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

进去

enter

实现输入

1
2
3
4
5
//按下输入 enter
robot.keyPress(KeyEvent.VK_ENTER);
//释放
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(1000);

信息输入

类似搜索程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

String msg = "该信息为测试程序,不用回复";
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.keyRelease(KeyEvent.VK_V);


robot.delay(1000);

//按下输入 enter
robot.keyPress(KeyEvent.VK_ENTER);
//释放
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(1000);

完整的操作程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.KeyEvent;

public class test {

public static void main(String[] args) {
System.out.println("程序开始执行");
Robot robot = null;
try {
//创建robot对象
robot = new Robot();
//用robot模拟 alt+win+w 直接调用微信
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.keyRelease(KeyEvent.VK_W);

//执行一个延迟
robot.delay(1000);

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



//将信息放到粘贴板上 并且发送
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection("聂八一");
clip.setContents(tText, null);

// 以下两行按下了ctrl+v,完成粘贴功能
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);

//释放
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_V);


robot.delay(1000);

//按下输入 enter
robot.keyPress(KeyEvent.VK_ENTER);
//释放
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(1000);


//可以输入信息了
//按照先放到剪切板 后赋值 后enter实现输入

String msg = "该信息为测试程序,不用回复";
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.keyRelease(KeyEvent.VK_V);


robot.delay(1000);

//按下输入 enter
robot.keyPress(KeyEvent.VK_ENTER);
//释放
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(1000);





} catch (AWTException e) {
throw new RuntimeException(e);
}
System.out.println("程序执行结束");
}
}

总结:无论是昵称还是取得称号都是可以的

定时技术

分析可得逻辑

  • 先设置一个预定的对象
  • 通过java里的system对象来获得系统时间(当时的时间)

获得当前时间方法

1
2
3
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String time = df.format(System.currentTimeMillis());
System.out.println("现在时间是:" + time);

java设置时间格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//设置时间
int year = 2022;
int month = 11;
String day = "06";
int hour = 20;
int min = 40;
String today = year+"-"+month+"-"+day+" "+hour+":"+min;
System.out.println("目标时间:"+today);
while (true){
time = df.format(System.currentTimeMillis());
time2 = df1.format(System.currentTimeMillis());
//沉睡疫苗
try {
sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(time2);
if (time.equals(today)){
System.out.println("到时候了");
break;
}
}

TimeUtil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.dwx.utils;

import java.text.SimpleDateFormat;

public class TimeUtil {

//当前时间
private String timeNow = null;
//目标时间
private String targetTime = null;

//设置目标时间
public String setTargetTime(String year, String month, String day, String hour, String min) {
targetTime = year + "-" + month + "-" + day + " " + hour + ":" + min;
System.out.println("目标时间为:" + targetTime);
return targetTime;
}

//获得时钟 直到秒
public String getClockToSecond() {
long l = System.currentTimeMillis();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = df.format(l);
System.out.println(time);
return time;
}

//获得时钟 直到分钟
public String getClockToMin() {
long l = System.currentTimeMillis();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
timeNow = df.format(l);
System.out.println(timeNow);
return timeNow;
}
}

两个程序执行结束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.dwx.main;

import com.dwx.utils.RobotUtil;
import com.dwx.utils.TimeUtil;

import static java.lang.Thread.sleep;

public class demo01 {
public static void main(String[] args) {
RobotUtil robotUtil = new RobotUtil();
String msg1 = robotUtil.getFriendWin("文件传输助手");
System.out.println(msg1);
String s = robotUtil.sendMsg("定时发送数据程序测试");
System.out.println(s);

//设置时间
TimeUtil timeUtil = new TimeUtil();
String t1 = timeUtil.setTargetTime("2022", "11", "06", "21", "13");
while (true){
//沉睡一秒
try {
sleep(1000);
} catch (InterruptedException e) {
System.out.println("sleep出错:"+e);
}
timeUtil.getClockToSecond();
String t2 = timeUtil.getClockToMin();
if (t1.equals(t2)){
//时间正确 执行信息发送
robotUtil.getFriendWin("文件传输助手");
robotUtil.sendMsg("时间到 执行程序");
break;
}
}


}
}

程序前提:

  • 微信登录
  • 微信窗口隐藏

信息池

  • 用String[ ]即可
  • 或者使用txt文件也行

使用String[ ]做信息池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String[] msg = new String[]{
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
};

实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.dwx.main;

import com.dwx.utils.RobotUtil;
import com.dwx.utils.TimeUtil;

import static java.lang.Thread.sleep;

public class demo01 {
public static void main(String[] args) {
RobotUtil robotUtil = new RobotUtil();
//设置时间
TimeUtil timeUtil = new TimeUtil();
String t1 = timeUtil.setTargetTime("2022", "11", "06", "21", "35");
while (true){
//沉睡一秒
try {
sleep(1000);
} catch (InterruptedException e) {
System.out.println("sleep出错:"+e);
}
timeUtil.getClockToSecond();
String t2 = timeUtil.getClockToMin();
if (t1.equals(t2)){
//时间正确 执行信息发送
break;
}
}

//信息池
String[] msg = new String[]{
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
};
robotUtil.getFriendWin("文件传输助手");
int i = 1;
for (String s : msg) {
robotUtil.sendMsg(s+i++);
}



}
}

结果

xjYK4s.png

使用txt文件当做信息池

原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void main(String[] args) {
//文件读写
String fileUrl = "E:\\java\\wechatTest\\src\\main\\resources\\msg.txt";
File file = new File(fileUrl);
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader(file));

String s = bufferedReader.readLine();
while (null != s){
System.out.println(s);
s = bufferedReader.readLine();
}

} catch (FileNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}

}

实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.dwx.main;

import com.dwx.utils.FileUtil;
import com.dwx.utils.RobotUtil;
import com.dwx.utils.TimeUtil;

import java.util.List;

import static java.lang.Thread.sleep;

public class demo01 {
public static void main(String[] args) {
RobotUtil robotUtil = new RobotUtil();
//设置时间
TimeUtil timeUtil = new TimeUtil();
String t1 = timeUtil.setTargetTime("2022", "11", "06", "21", "57");
while (true){
//沉睡一秒
try {
sleep(1000);
} catch (InterruptedException e) {
System.out.println("sleep出错:"+e);
}
timeUtil.getClockToSecond();
String t2 = timeUtil.getClockToMin();
if (t1.equals(t2)){
//时间正确 执行信息发送
break;
}
}

//信息池
FileUtil fileUtil = new FileUtil();
List<String> msgByFile = fileUtil.getMsgByFile();

robotUtil.getFriendWin("文件传输助手");

for (String s : msgByFile) {
robotUtil.sendMsg(s);
}


}
}

效果

xjYQCn.png

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2023 dwx
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信