当前位置:   article > 正文

基于JAVA实现机器人自动向微信发送消息,并通过SpringBoot整合RabbitMQ实现自动消费,推送消息_微信群自动发消息机器人

微信群自动发消息机器人

一,背景知识


要实现给微信好友/微信群聊 定时发送消息

二.实现控制屏幕按键 原理


1,实现给微信好友发送消息的原理就是利用微信的快捷按键,Robot类就可以很好的控制按键。

Java中Robot类位于java.awt.Robot,该类用于为测试自动化,自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件,Robot类的主要目的是便于Java平台实现自动测试。

Robot可以模拟鼠标和键盘的输入,可以把他看作Java版的按键精灵

三.代码编写

重点提示:使用robot模拟按下像Ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放,一定要释放,一定要释放

  1.         //释放Ctrl按键,
  2.         robot.keyRelease(KeyEvent.VK_CONTROL);
  3.        //释放Alt按键,
  4.         robot.keyRelease(KeyEvent.VK_ALT);

下面先开始一个简单模拟操作: 

1.先建立一个 WxMsgUtils工具类

可以直接在工具类中运行main方法进行手动触发操作

  1. import java.awt.*;
  2. import java.awt.datatransfer.Clipboard;
  3. import java.awt.datatransfer.StringSelection;
  4. import java.awt.datatransfer.Transferable;
  5. import java.awt.event.KeyEvent;
  6. import java.util.Scanner;
  7. public class WxMsgUtils {
  8. public static void main(String[] args) {
  9. try {
  10. Scanner in=new Scanner(System.in);
  11. System.out.println("请输入要发送的群名称或用户昵称:(如需退出请输入:退出)");
  12. String qunname = "";
  13. while (true){
  14. String selectNUm = in.nextLine();//要求输入整数
  15. System.out.println("-------------------");
  16. if(selectNUm.equals("退出")){
  17. in.close();
  18. return;
  19. }else {
  20. if("".equals(qunname)){
  21. qunname = selectNUm;
  22. System.out.println("消息接收方:"+selectNUm);
  23. System.out.println("请输入要发送的内容:(如需退出请输入:退出)");
  24. } else {
  25. System.out.println("发送内容:"+selectNUm+"(如需退出请输入:退出)");
  26. searchMyFriendAndSend(qunname,selectNUm);
  27. }
  28. }
  29. System.out.println("--------------------");
  30. }
  31. }catch (Exception e){
  32. e.printStackTrace();
  33. }
  34. }
  35. public static void searchMyFriendAndSend(String friendNickName, String text) throws InterruptedException {
  36. // 创建Robot对象
  37. Robot robot = getRobot();
  38. //打开微信 Ctrl+Alt+W
  39. assert robot != null;
  40. robot.keyPress(KeyEvent.VK_CONTROL);
  41. robot.keyPress(KeyEvent.VK_ALT);
  42. robot.keyPress(KeyEvent.VK_W);
  43. //释放Ctrl按键,像Ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放
  44. robot.keyRelease(KeyEvent.VK_CONTROL);
  45. robot.keyRelease(KeyEvent.VK_ALT);
  46. // 该延迟不能少,否则无法搜索
  47. robot.delay(1000);
  48. // Ctrl + F 搜索指定好友
  49. robot.keyPress(KeyEvent.VK_CONTROL);
  50. robot.keyPress(KeyEvent.VK_F);
  51. robot.keyRelease(KeyEvent.VK_CONTROL);
  52. // 将好友昵称发送到剪切板
  53. Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
  54. Transferable tText = new StringSelection(friendNickName);
  55. clip.setContents(tText, null);
  56. // 以下两行按下了ctrl+v,完成粘贴功能
  57. robot.keyPress(KeyEvent.VK_CONTROL);
  58. robot.keyPress(KeyEvent.VK_V);
  59. robot.keyRelease(KeyEvent.VK_CONTROL);
  60. robot.delay(1000);
  61. robot.keyPress(KeyEvent.VK_ENTER);
  62. robot.delay(1000);
  63. // 发送消息
  64. sendMsg(robot,text);
  65. }
  66. private static void sendMsg(Robot robot,String text) throws InterruptedException {
  67. sendOneMsg(robot,text);
  68. Thread.sleep(1000);
  69. //关闭微信 Ctrl+Alt+W
  70. assert robot != null;
  71. robot.keyPress(KeyEvent.VK_CONTROL);
  72. robot.keyPress(KeyEvent.VK_ALT);
  73. robot.keyPress(KeyEvent.VK_W);
  74. // 释放按键
  75. robot.keyRelease(KeyEvent.VK_CONTROL);
  76. robot.keyRelease(KeyEvent.VK_ALT);
  77. }
  78. private static void sendOneMsg(Robot robot,String msg) {
  79. // 创建Robot对象
  80. Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
  81. // 将字符串复制到剪切板
  82. Transferable tText = new StringSelection(msg);
  83. clip.setContents(tText, null);
  84. // 以下两行按下了ctrl+v,完成粘贴功能
  85. robot.keyPress(KeyEvent.VK_CONTROL);
  86. robot.keyPress(KeyEvent.VK_V);
  87. robot.keyRelease(KeyEvent.VK_CONTROL);
  88. // 回车发送
  89. robot.keyPress(KeyEvent.VK_ENTER);
  90. robot.delay(1000);
  91. }
  92. private static Robot getRobot(){
  93. // 创建Robot对象
  94. Robot robot = null;
  95. try {
  96. robot = new Robot();
  97. robot.delay(1000);
  98. } catch (AWTException e) {
  99. e.printStackTrace();
  100. }
  101. return robot;
  102. }
  103. }

2.导入springBoot 和RabbitMQ需要的包

已经有该环境的不需要管

  1. <!--rabbitmq-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-amqp</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-test</artifactId>
  13. <scope>test</scope>
  14. </dependency>
  15. <!-- spring cache -->
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-cache</artifactId>
  19. </dependency>
  20. <!-- aop依赖 -->
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-aop</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-actuator</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter</artifactId>
  36. </dependency>

3.修改项目启动类

不修改运行的时候 会报错:java.awt.AWTException: headless environment

  1. public static void main(String[] args) {
  2. SpringApplicationBuilder builder = new SpringApplicationBuilder(启动类名.class);
  3. builder.headless(false).run(args);
  4. }

4.整合RabbitMQ

1.建立DirectConsumer类 用做mq消息接收
  1. import com.rabbitmq.client.Channel;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.amqp.core.ExchangeTypes;
  5. import org.springframework.amqp.core.Message;
  6. import org.springframework.amqp.rabbit.annotation.*;
  7. import org.springframework.stereotype.Component;
  8. import java.io.IOException;
  9. /**
  10. * 消费者,用于消费队列信息
  11. */
  12. @Component
  13. @RabbitListener(queues = "TestDirectQueue")//监听的队列名称 TestDirectQueue
  14. public class DirectConsumer {
  15. Logger logger = LoggerFactory.getLogger(this.getClass());
  16. /**
  17. * @ClassName mq接收消息 STORE_ORDER_MSG:这是我自己编写的 你们自己换成你们的队列名就好
  18. * @Description
  19. * @author qying
  20. * @date 2023/4/9 12:59
  21. */
  22. @RabbitListener(bindings = @QueueBinding(
  23. value = @Queue(value = "STORE_ORDER_MSG",autoDelete = "false"),
  24. exchange = @Exchange(value = "AMQP_STORE_ORDER_MSG", type = ExchangeTypes.DIRECT)
  25. ))
  26. public void orderQueueWork(String rabbitmqMsg, Message message, Channel channel) throws IOException {
  27. String msg = new String(message.getBody());
  28. try {
  29. logger.info("MQ接收到数据:"+msg);
  30. // 为了方便演示 采用字符拼接的方式传递的数据格式如下:群名/用户昵称::要发送的内容
  31. String[] split = msg.split("::");
  32. WxMsgUtils.searchMyFriendAndSend(split[0],split[1]);
  33. logger.info("MQ消息处理成功"+message.getMessageProperties().getDeliveryTag(), msg);
  34. channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
  35. }catch (Exception e){
  36. Boolean redelivered = message.getMessageProperties().getRedelivered();
  37. try {
  38. if (redelivered) {
  39. channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); // 拒绝消息
  40. logger.error("MQ消息重新处理失败,删除消息", msg);
  41. }
  42. if (!redelivered) {
  43. // 消息重新放回队列
  44. channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
  45. logger.error("MQ消息处理失败放回队列", msg);
  46. }
  47. } catch (IOException e1) {
  48. e1.printStackTrace();
  49. }
  50. e.printStackTrace();
  51. }
  52. }
  53. }
2.application.yml文件新增 RabbitMQ配置信息

  1. spring:
  2. #配置rabbitMq 服务器
  3. rabbitmq:
  4. host: 127.0.0.1
  5. port: 5672
  6. username: root
  7. password: 1234qwer

四.整合完毕 直接运行项目 然后在Mq推送消息即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/563618
推荐阅读
相关标签
  

闽ICP备14008679号