(微信定时发送消息)一个java文件,完成可配置的微信定时发送消息任务
文章目录
- 需求来源
- 功能介绍
- 代码如下
- 配置信息
- 配置文件分析
- 使用方式
- `注:`
需求来源
当我们再日常工作中,需要每日定时的发送群消息,时间太早的话不想起来,想着可以用java显示定时发送消息的任务.在睡梦中让程序帮我们定时发送消息
功能介绍
定时生日祝福、每日早安、晚安问候
- 检测微信是否再后台运行
- 指定每天多个时间段发送可配置的消息
- 发送图片
- 每个时间段给多个人发送多个消息
- 设置间隔时间(如:两天发一次,一天发一次,每秒发一次)
代码如下
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.KeyEvent;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.List;
import java.util.*;/*** @Author: xu* @Description: 开启定时任务,指定时间,间隔给微信好友发送文本或图片* @Date: 2021/12/20 20:28*/
public class TimerTask {// 设置定时任务区间,每隔一天发一次private static final Long SECTION = (long) (24 * 60 * 60 * 1000);public static void main(String[] args) throws Exception {System.out.println("任务执行时间,请保证微信在登录状态并为最小化...");int weChat = queryProcessCount("WeChat");if (weChat<=0){System.err.println("请登陆微信后再尝试运行");return;}int year = LocalDateTime.now().getYear();int month = LocalDateTime.now().getMonthValue();int day = LocalDateTime.now().getDayOfMonth(); //任务默认从今天开始List<String> resource = getResouce();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 遍历某个时间段需要做的事情for (String todo : resource) {String[] item = todo.split(" ");String formatData = year+"-"+month+"-"+day+" "+item[0]+":00";Date firstData = simpleDateFormat.parse(formatData);List<Map<String,String>> sendData = new ArrayList<>();String[] sends = todo.split(";");int i = 0;for (String send : sends) {Map<String,String> map = new HashMap<>();List<String> strings = Arrays.asList(send.split(" "));if (i==0){map.put("receive",strings.get(1));map.put("content",strings.get(2));}else {map.put("receive",strings.get(0));map.put("content",strings.get(1));}sendData.add(map);i++;}createTask(firstData,sendData);}}private static int queryProcessCount(String processName) throws IOException {int count = 0;Runtime runtime = Runtime.getRuntime();List<String> tasklist = new ArrayList<>();Process process = runtime.exec("tasklist");BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));String s;while ((s = br.readLine()) != null) {if ("".equals(s)) {continue;}tasklist.add(s);}for (String taskName : tasklist) {if (taskName.contains(processName)){count++;}}return count;}private static void createTask(Date firstData,List<Map<String,String>> sendData){if (firstData.getTime()-System.currentTimeMillis()<0){// 让错过的时间延后配置的间隔时间执行firstData = new Date(firstData.getTime()+SECTION);}new Timer().scheduleAtFixedRate(new java.util.TimerTask() {@Overridepublic synchronized void run() {try {openWeChat();for (Map<String, String> sendDatum : sendData) {sendMsg(sendDatum.get("receive"),sendDatum.get("content"));Thread.sleep(500);}closeWeChat();} catch (Exception e) {e.printStackTrace();}}},firstData.getTime() - System.currentTimeMillis(),SECTION);}public static void setSysClipboardFile(String imageUrl) throws IOException {Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();if (imageUrl.contains("\\")){imageUrl = imageUrl.replace("\\","/");}imageUrl = imageUrl.replace("img(","");imageUrl = imageUrl.substring(0, imageUrl.length() - 1);Image image = ImageIO.read(new File(imageUrl));Transferable trans = new Transferable() {@Overridepublic Object getTransferData(DataFlavor flavor)throws UnsupportedFlavorException {if (isDataFlavorSupported(flavor)) {return image;}throw new UnsupportedFlavorException(flavor);}@Overridepublic DataFlavor[] getTransferDataFlavors() {return new DataFlavor[] { DataFlavor.imageFlavor };}@Overridepublic boolean isDataFlavorSupported(DataFlavor flavor) {return DataFlavor.imageFlavor.equals(flavor);}};clip.setContents(trans, null);}public static void setSysClipboardText(String writeMe) {Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();Transferable tText = new StringSelection(writeMe);clip.setContents(tText, null);}private static void openWeChat() throws AWTException {Robot robot = RobotManager.getInstance();
// robot.keyPress(KeyEvent.VK_WINDOWS);
// robot.keyPress(KeyEvent.VK_D);
// robot.keyRelease(KeyEvent.VK_WINDOWS);
// robot.keyRelease(KeyEvent.VK_D);
// 先使用win+D快捷键保证微信为最小化状态,再使用微信默认快捷键打开微信nihao2robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_ALT);robot.keyPress(KeyEvent.VK_W);robot.keyRelease(KeyEvent.VK_CONTROL);robot.keyRelease(KeyEvent.VK_ALT);robot.keyRelease(KeyEvent.VK_W);robot.delay(100);}/*** 发送消息* @param receive 接收消息者* @param msg 消息内容*/private static void sendMsg(String receive,String msg) throws Exception {Robot robot = RobotManager.getInstance();robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_F);robot.keyRelease(KeyEvent.VK_CONTROL);robot.keyRelease(KeyEvent.VK_F);inputEnter(receive);inputEnter(msg);}private static void closeWeChat() throws AWTException {Robot robot = RobotManager.getInstance();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);robot.keyRelease(KeyEvent.VK_W);}private static void inputEnter(String msg) throws Exception {Robot robot = RobotManager.getInstance();if (msg.contains("img(")){setSysClipboardFile(msg);}else {msg = msg.replace("\\n","\n");setSysClipboardText(msg);}robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_V);robot.keyRelease(KeyEvent.VK_CONTROL);robot.keyRelease(KeyEvent.VK_V);robot.delay(1000);robot.keyPress(KeyEvent.VK_ENTER);robot.keyRelease(KeyEvent.VK_ENTER);robot.delay(500);}public static class RobotManager{private static Robot robot;public static Robot getInstance() throws AWTException {if (robot==null){robot = new Robot();}return robot;}}public static List<String> getResouce() throws Exception {StringBuilder result = new StringBuilder();//读取桌面Txt文件,桌面路径与文件名根据需要修改FileReader reader = new FileReader("C:\\Users\\xjt\\Desktop\\sendmag.txt", StandardCharsets.UTF_8);BufferedReader br = new BufferedReader(reader);String temp;while((temp = br.readLine())!=null){//使用readLine方法,一次读一行result.append(temp);}br.close();reader.close();return Arrays.asList(result.toString().split("\\*"));}
}
配置信息
需要用到的桌面文本文件配置信息内容
11:14 接收者名称 发送内容;xjt(接收者名称) img(C:\Users\Hasee\Desktop\checkcode.jpg);文件传输助手 内容*
11:15 xjt nihao2*
11:16 xjt nihao3
配置文件分析
配置符号由代码中定义。可根据需要进行修改优化
*
:当前时间运行任务结束符,最后一个任务不需要结束符
;
:每个任务的间隔符
空格
:时间与接受者名称与内容的分隔符
img()
:当内容为图片时指定的图片本地绝对地址
\n
:内容换行
使用方式
- 复制上述代码内容为一个名为
TimerTask.java
文件 - 修改文件中,当前环境配置文件指定地址
或者可以使用java变量来保存配置信息,便可以直接读取java变量配置
执行编译运行命令
编译
javac -encoding UTF-8 TimerTask.java
开始运行
java TimerTask
或者直接在ide开发工具中运行
注:
在jdk11版本之前getResouce静态方法中有一个api是不支持的。可以将getResouce静态方法替换如下。
public static List<String> getResouce() throws Exception {StringBuilder result = new StringBuilder();FileInputStream fis = new FileInputStream("C:\\Users\\25842\\Desktop\\sendmsg.txt");BufferedReader br = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8));String line;while ((line = br.readLine()) != null) {result.append(line);}fis.close();return Arrays.asList(result.toString().split("\\*"));}
(微信定时发送消息)一个java文件,完成可配置的微信定时发送消息任务相关推荐
- 一个java文件中多个类
一个.java文件中可以有很多类.不过注意以下几点: 1.public 权限的类只能有一个(也可以一个都没有,但最多只有1个) 2.这个.java文件的文件名必须是public类的类名(一般的情况下, ...
- java虚拟机编译文件,理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么...
理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么 最近在看<深入理解Java虚拟机>弄明白了很多java的底层知识,决定分几部分总结下,从.java文件编译,到 ...
- 一个java类可以有_一个.java文件中可以有几个同级类?
1.在一个.java文件中可以有多个同级类(和public一样的位置,注意不是内部类).其修饰符只可以public/abstract/final/和无修饰符,不能是其他的protected/priva ...
- 一个java文件里面可以写多少个class
一个java文件里面可以有多个类,但是public修饰的类只能有一个. public类的名称必须完全与含有该编译单元的文件名相同,包含大小写.如果不匹配,同样将得到编译错误. 一个java文件里里面可 ...
- Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法
public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...
- 使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行
标题使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行 1.在电脑桌面使用快捷键win+r打开 2.打开cmd命令界面之后使用md d ...
- 服务器怎么把信息发送给用户,java中怎么用tcp/ip将服务器的消息发送给多个用户...
java中怎么用tcp/ip将服务器的消息发送给多个用户 关注:253 答案:2 mip版 解决时间 2021-01-31 01:26 提问者╬═掵中注定 2021-01-30 20:03 jav ...
- 另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...
在我的Android应用程序,我想有一类处理所有"写入/读取到文本文件"的行动.所以,我根本就调用我的readUserFile.java文件我想的方法.但我的方法将不会在该文件中工 ...
- 如何运行一个Java文件?
以下操作是按在Windows系统运行的,不能在Linux环境执行,Linux环境必须运行完整的web项目,xx.jar的方式运行. 首次学习java,安装好jdk环境后,兴奋的你,肯定想写一个Hell ...
- java 输出定位代码行_指定一个.java文件,输出其代码行数
CountList2.java//用来统计java代码行数 import java.io.BufferedReader; import java.io.File; import java.io.Fil ...
最新文章
- CSS基础篇--css reset重置样式有那么重要吗?
- 繁星屠龙软件下载_历时72小时,测试5个软件,写出的数理化教学软件推荐……(下)...
- EL表达式中fn函数(转载)
- RabbitMQ 安装操作
- AtCoder Grand Contest 010 D - Decrementing
- idea中中文字体设置
- 阿里云视频点播VoD
- Linux下的编曲软件,在Linux下可用Wine运行编曲软件FL Studio,也可用LMMS替代
- 微信公众号不限次数发送消息
- 做图片用的计算机配置文件,电脑如何显示照片色域为DCI-P3标准的拍摄照片
- 做phodal的御用编辑,其实我是拒绝的
- 硬盘安装linux系统步骤分区,Linux系统“分区”方法再谈安装!(一)
- 编译小米2s CyanogenMod 版本遇到的几个问题
- Chrome浏览器账号无法登陆
- C++:学生管理系统
- php 7.0 nts 安装,Windows phpstudy 7.0.12 nts 安装redis
- win10本地存储C盘空间大小与实际不符
- 车载注册蓝牙服务器,蓝牙配对码配备方法、系统、终端、服务器及车载设备专利_专利查询 - 天眼查...
- Asp.net Web Api开发 性能:使用Jil提升Json序列化性能
- selenium实现zhilian招聘的爬取