文章目录

  • 需求来源
  • 功能介绍
  • 代码如下
  • 配置信息
    • 配置文件分析
  • 使用方式
  • `注:`

需求来源

当我们再日常工作中,需要每日定时的发送群消息,时间太早的话不想起来,想着可以用java显示定时发送消息的任务.在睡梦中让程序帮我们定时发送消息

功能介绍

定时生日祝福、每日早安、晚安问候

  1. 检测微信是否再后台运行
  2. 指定每天多个时间段发送可配置的消息
  3. 发送图片
  4. 每个时间段给多个人发送多个消息
  5. 设置间隔时间(如:两天发一次,一天发一次,每秒发一次)

代码如下

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:内容换行

使用方式

  1. 复制上述代码内容为一个名为TimerTask.java文件
  2. 修改文件中,当前环境配置文件指定地址或者可以使用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文件,完成可配置的微信定时发送消息任务相关推荐

  1. 一个java文件中多个类

    一个.java文件中可以有很多类.不过注意以下几点: 1.public 权限的类只能有一个(也可以一个都没有,但最多只有1个) 2.这个.java文件的文件名必须是public类的类名(一般的情况下, ...

  2. java虚拟机编译文件,理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么...

    理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么 最近在看<深入理解Java虚拟机>弄明白了很多java的底层知识,决定分几部分总结下,从.java文件编译,到 ...

  3. 一个java类可以有_一个.java文件中可以有几个同级类?

    1.在一个.java文件中可以有多个同级类(和public一样的位置,注意不是内部类).其修饰符只可以public/abstract/final/和无修饰符,不能是其他的protected/priva ...

  4. 一个java文件里面可以写多少个class

    一个java文件里面可以有多个类,但是public修饰的类只能有一个. public类的名称必须完全与含有该编译单元的文件名相同,包含大小写.如果不匹配,同样将得到编译错误. 一个java文件里里面可 ...

  5. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  6. 使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行

    标题使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行 1.在电脑桌面使用快捷键win+r打开 2.打开cmd命令界面之后使用md d ...

  7. 服务器怎么把信息发送给用户,java中怎么用tcp/ip将服务器的消息发送给多个用户...

    java中怎么用tcp/ip将服务器的消息发送给多个用户 关注:253  答案:2  mip版 解决时间 2021-01-31 01:26 提问者╬═掵中注定 2021-01-30 20:03 jav ...

  8. 另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...

    在我的Android应用程序,我想有一类处理所有"写入/读取到文本文件"的行动.所以,我根本就调用我的readUserFile.java文件我想的方法.但我的方法将不会在该文件中工 ...

  9. 如何运行一个Java文件?

    以下操作是按在Windows系统运行的,不能在Linux环境执行,Linux环境必须运行完整的web项目,xx.jar的方式运行. 首次学习java,安装好jdk环境后,兴奋的你,肯定想写一个Hell ...

  10. java 输出定位代码行_指定一个.java文件,输出其代码行数

    CountList2.java//用来统计java代码行数 import java.io.BufferedReader; import java.io.File; import java.io.Fil ...

最新文章

  1. CSS基础篇--css reset重置样式有那么重要吗?
  2. 繁星屠龙软件下载_历时72小时,测试5个软件,写出的数理化教学软件推荐……(下)...
  3. EL表达式中fn函数(转载)
  4. RabbitMQ 安装操作
  5. AtCoder Grand Contest 010 D - Decrementing
  6. idea中中文字体设置
  7. 阿里云视频点播VoD
  8. Linux下的编曲软件,在Linux下可用Wine运行编曲软件FL Studio,也可用LMMS替代
  9. 微信公众号不限次数发送消息
  10. 做图片用的计算机配置文件,电脑如何显示照片色域为DCI-P3标准的拍摄照片
  11. 做phodal的御用编辑,其实我是拒绝的
  12. 硬盘安装linux系统步骤分区,Linux系统“分区”方法再谈安装!(一)
  13. 编译小米2s CyanogenMod 版本遇到的几个问题
  14. Chrome浏览器账号无法登陆
  15. C++:学生管理系统
  16. php 7.0 nts 安装,Windows phpstudy 7.0.12 nts 安装redis
  17. win10本地存储C盘空间大小与实际不符
  18. 车载注册蓝牙服务器,蓝牙配对码配备方法、系统、终端、服务器及车载设备专利_专利查询 - 天眼查...
  19. Asp.net Web Api开发 性能:使用Jil提升Json序列化性能
  20. selenium实现zhilian招聘的爬取

热门文章

  1. marvel 1548 phy芯片调式
  2. SM2 SM3 SM4 国密版本,基于bouncycastle 实现
  3. c# 基于BouncyCastle.Crypto的国密sm2,sm4封装,与java版本兼容
  4. i春秋-CTF-web文件上传
  5. QT5鼠标触摸屏键盘支持
  6. 支付宝小程序悬浮按钮
  7. Debian 9 Stretch国内常用镜像源 Jason-张百万
  8. php过滤微信表情符号
  9. poi批量导入导出Excel(三、通过模板导出Excel并能实现导入多个sheet表)
  10. excel表格打印每页都有表头_Excel打印表格不再手忙脚乱