情人节福利,用JAVA做个QQ机器人,帮我提醒女神按时喝水和陪她聊天~(开源)

简介: 情人节福利,用JAVA做个QQ机器人,帮我提醒女神按时喝水和陪她聊天~(开源)

微信机器人会有几率封号,暂时不开教程


1、前言



正常人每天平均耗水量为2000-2500毫升,体内物质氧化可生水300毫升,故每日应补充水分2200毫升,包括饮食中的含水量。夏天每日补充水分在3000毫升左右,才能满足人体需要。


如果有个机器人能按时提醒我们喝水,那该多好啊~~


2、创建一个springboot项目



(这个步骤是为小白提供,大佬们直接跳到第三步)


2.1. 新建项目


image.png


2.2. 选择springboot项目


image.png


image.png


image.png


2.3. 创建完成的项目结构如下


image.png


3、引入simple-robot机器人依赖



3.1. 在pom.xml文件引入simple-robot依赖


<properties>
    <java.version>1.8</java.version>
    <simbot.version>2.0.3</simbot.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>love.forte.simple-robot</groupId>
            <artifactId>parent</artifactId>
            <version>${simbot.version}</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>


<!--java机器人框架-->
<dependency>
    <groupId>love.forte.simple-robot</groupId>
    <artifactId>component-mirai-spring-boot-starter</artifactId>
</dependency>


image.png


3.2. 配置application.yml文件,使用ANDROID_PAD协议可以保持手机QQ和机器人同时在线


simbot:
  core:
    # 机器人的QQ账号与密码(帐号:密码)
    bots: 6013505:yinfeng
  component:
    mirai:
      # mirai心跳周期. 过长会导致被服务器断开连接. 单位毫秒。
      heartbeat-period-millis: 30000
      # 每次心跳时等待结果的时间.一旦心跳超时, 整个网络服务将会重启 (将消耗约 1s). 除正在进行的任务 (如图片上传) 会被中断外, 事件和插件均不受影响.
      heartbeat-timeout-millis: 5000
      # 心跳失败后的第一次重连前的等待时间.
      first-reconnect-delay-millis: 5000
      # 重连失败后, 继续尝试的每次等待时间
      reconnect-period-millis: 5000
      # 最多尝试多少次重连
      reconnection-retry-times: 2147483647
      # 使用协议类型。注,此值为枚举类 net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol 的元素值,
      # 可选值为:ANDROID_PHONE、ANDROID_PAD、ANDROID_WATCH
      protocol: ANDROID_PAD
      # 是否关闭mirai的bot logger
      no-bot-log: true
      # 关闭mirai网络日志
      no-network-log: true
      # mirai bot log切换使用simbot的log
      use-simbot-bot-log: true
      # mirai 网络log 切换使用simbot的log
      use-simbot-network-log: true
      # mirai配置自定义deviceInfoSeed的时候使用的随机种子。默认为1.
      device-info-seed: 1
      # mirai图片缓存策略,为枚举 love.forte.simbot.component.mirai.configuration.MiraiCacheType 的元素值,
      # 可选为 FILE、 MEMORY
      cache-type: MEMORY
      # 如果配置项 simbot.mirai.cacheType 的值为 FILE,此处为缓存文件的保存目录。为空时默认为系统临时文件夹。
      cache-directory:
      # 登录验证码处理器,当登录需要输入验证码的时候可能会用到。
      login-solver-type: DEFAULT
      # 如果不为空,此处代表指定一个 deviceInfo 的 json文件路径。
      dispatcher:
        # mirai组件中,对事件进行调度的线程池参数:最大线程数。
        core-pool-size: 8
        # mirai组件中,对事件进行调度的线程池参数:最大线程数。
        maximum-pool-size: 8
        # mirai组件中,对事件进行调度的线程池参数:线程存活时间(毫秒)
        keep-alive-time: 1000


image.png


3.3 在springboot启动类加上@EnableSimbot注解


/**
* @author yinfeng
* @description 启动类
* @since 2021/12/22 22:50
*/
@EnableSimbot
@EnableScheduling
@SpringBootApplication
@Slf4j
public class RobotApplication {
   public static void main(String[] args) {
       SpringApplication.run(RobotApplication.class, args);
       log.info("机器人启动成功~~~~");
   }
}


3.4 simple-robot机器人官方文档


https://www.yuque.com/simpler-robot/simpler-robot-doc/gbqsz5


4、编写定时任务



4.1. 创建一个DrinkNotify.java类


/**
 * @author yinfeng
 * @description 定时喝水提醒
 * @since 2021/12/22 23:32
 */
@Component
@Slf4j
public class DrinkNotify {
    @Resource
    private BotManager botManager;
    @Value("${bello.qq}")
    private Set<String> qqSet;
    /**
     * 喝水语录
     */
    static List<String> content;
    /**
     * 喝水图片
     */
    static List<String> images;
    static {
        content = new ArrayList<>();
        images = new ArrayList<>();
        log.info("开始加载喝水语录~~~");
        // 喝水语录
        content.add("俗话说\"女人是水造的\",所以身为女生就要时刻喝水,这样就可以保持充足的水分,皮肤、头发就会更有光泽~");
        content.add("喝多点水还可以保持身材哦,因为水促进了我们身体的循环~");
        content.add("该喝水了哟,喝多点水整体上也会容光焕发~");
        content.add("该喝水了哟,要多爱护自己,多喝水、多吃新鲜水果蔬菜、尽量保证充足睡眠。加油!");
        content.add("多喝水很简单的话,多喝水对身体好!只有心中挂念着你们的人才会说你的家人也老说的话:你要多喝水呀!!~");
        content.add("天气寒冷干燥。多喝水,注意保暖。少抽烟喝酒吃辣。多想念我~");
        log.info("开始加载喝水图片~~~");
        // 喝水图片
        images.add("https://gitee.com/yinfeng-code/study-image/raw/master/image/20211224221637.jpeg");
        images.add("https://gitee.com/yinfeng-code/study-image/raw/master/image/20211224221739.jpeg");
        images.add("https://gitee.com/yinfeng-code/study-image/raw/master/image/20211224221758.jpeg");
        images.add("https://gitee.com/yinfeng-code/study-image/raw/master/image/20211224221815.jpeg");
        images.add("https://gitee.com/yinfeng-code/study-image/raw/master/image/20211224221834.jpeg");
        images.add("https://gitee.com/yinfeng-code/study-image/raw/master/image/20211224221913.jpeg");
        images.add("https://gitee.com/yinfeng-code/study-image/raw/master/image/20211224221925.jpeg");
    }
    /**
     * 每一分钟提醒一次: 0 0/1 * * * ?
     * 每一小时提醒一次: 0 0 0/1 * * ?
     */
    @Scheduled(cron = "0 0 0/1 * * ?")
    public void handler() {
        Calendar calendar = Calendar.getInstance();
        // 获取当前小时
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        // 只在早上9点到晚上8点发送消息提醒
        if (hour < 9 || hour > 20) {
            return;
        }
        qqSet.forEach(qq -> {
            try {
                final String msg = content.get(new Random().nextInt(content.size()));
                final String img = String.format("[CAT:image,url=%s,flash=false]", images.get(new Random().nextInt(content.size())));
                // 发送随机喝水语录
                botManager.getDefaultBot().getSender().SENDER.sendPrivateMsg(qq, msg);
                // 发送随机喝水图片
                botManager.getDefaultBot().getSender().SENDER.sendPrivateMsg(qq, img);
                log.info("正在发送喝水提醒,当前qq={}, 语录={}, img={}", qq, msg, img);
            } catch (Exception e) {
                log.error("发送喝水提醒异常, qq={}", qq, e);
            }
        });
    }
}


4.2. 在yml文件中配置女神们的QQ号


#配置女神们的QQ号,多个QQ用逗号分割
bello:
 qq: 1332483344,52000012


image.png


5、加入智能聊天功能



5.1. 这里主要使用青云客的api进行聊天,官网


http://api.qingyunke.com/


5.2. 封装http工具类


/**
 * @author yinfeng
 * @description http工具类
 * @since 2021/12/23 23:21
 */
public class HttpUtil {
    /**
     * 向指定URL发送GET方法的请求
     *
     * @param url   发送请求的URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return URL 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param) {
        StringBuilder result = new StringBuilder();
        BufferedReader in = null;
        try {
            String urlNameString = url;
            if (!StringUtils.isEmpty(param)) {
                urlNameString += "?" + param;
            }
            URL realUrl = new URL(urlNameString);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1");
            // 建立实际的连接
            connection.connect();
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result.toString();
    }
}


5.3. 创建消息监听类,支持私聊消息和群消息的智能聊天


/**
 * @author yinfeng
 * @description 机器人监听
 * @since 2021/11/6 20:51
 */
@Component
@Slf4j
public class MessageListener {
    static final String URL = "http://api.qingyunke.com/api.php";
    /**
     * 监听私聊消息
     */
    @OnPrivate
    public void privateMsg(PrivateMsg privateMsg, MsgSender sender) {
        sendMsg(privateMsg, sender, false);
    }
    /**
     * 监听群消息
     */
    @OnGroup
    public ReplyAble groupMsg(GroupMsg groupMsg, MsgSender sender) {
        // 默认关闭群聊模式,需要的话把注释去掉
        // return sendMsg(groupMsg, sender, true);
        return null;
    }
    /**
     * 通过青客云封装智能聊天
     *
     * @param commonMsg commonMsg
     * @param sender    sender
     */
    private ReplyAble sendMsg(MessageGet commonMsg, MsgSender sender, boolean group) {
        log.info("智能聊天中~~~,接收消息:qq={}, msg={}", commonMsg.getAccountInfo().getAccountCode(),
                commonMsg.getMsgContent().getMsg());
        // MsgSender中存在三大送信器,以及非常多的重载方法。
        // 通过get请求调用聊天接口
        final String result = HttpUtil.sendGet(URL,
                "key=free&appid=0&msg=".concat(commonMsg.getMsgContent().getMsg()));
        if (!StringUtils.isEmpty(result)) {
            final JSONObject json = JSONObject.parseObject(result);
            if (json.getInteger("result") == 0 && !StringUtils.isEmpty(json.getString("content"))) {
                final String msg = json.getString("content").replace("{br}", "\n");
                log.info("智能聊天中~~~,发送消息:qq={}, msg={}", commonMsg.getAccountInfo().getAccountCode(), msg);
                //发送群消息
                if (group) {
                    // 参数1:回复的消息 参数2:是否at当事人
                    return Reply.reply(msg, true);
                }
                //发送私聊消息
                sender.SENDER.sendPrivateMsg(commonMsg, msg);
            }
        }
        return null;
    }
}


6、测试一下



6.1. 启动项目


image.png


6.2. 喝水提醒测试


image.png


可以看到两个qq都收到了提醒消息后台日志也是没问题的


image.png


6.3. 智能聊天测试


image.png


可以看到聊天功能也是正常的后台日志也是正常的


image.png


7、源码地址



暂时无法监听单项好友的消息,老铁们自己下载源码来玩吧


// 源码地址,下载运行即可
// 也可打成jar包放在服务器一直运行
https://gitee.com/yinfeng-code/java-robot.git


肝文不易,老铁们三连一波支持下吧,谢谢大家了~


下了源码的老铁麻烦点个star哈


8、常见问题处理



8.1. 密码错误异常


Error(title=登录失败, message=帐号或密码错误,请重新输入。, errorInfo=)


异常截图如下


image.png


解决方案在application.yml中配置自己的qq账号和密码


image.png


8.2. 滑块验证异常


UnsupportedSliderCaptchaException: Mirai 无法完成滑块验证. 使用协议 ANDROID_PHONE 强制要求滑块验证, 请更换协议后重试. 另请参阅


异常截图如下


image.png


解决方案:在application.yml中更换协议为PAD协议或者watch协议试试


image.png


如果还不行的话可以参考机器人框架官网文档滑块登录异常


  1.尝试进行滑块验证


  2.尝试切换账号


  3.开启或者关闭设备锁,各种情况都试试


  4.换一个网络环境,例如切换为热点


  5.用电脑或者手机多挂挂你要用的账号,并养养号后再尝试


  6.以上方法都不一定成功,或者说,大概率不会成功。但是目前来看,一段时间过后基本上就会变正常。这段时间可能是几天,运气好可能是几个小时。


8.3 下载项目后idea导入异常


image.png


解决方案:升级你的IDEA到 2021 或以上版本。具体参考IDEA导包异常报错


8.4 机器人其他问题解决方案参考


目录
相关文章
|
14天前
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模版),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、事件绑定与动态交互等功能,广泛适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业加速数字化转型。
|
19天前
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模版),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、事件绑定与动态交互等功能,广泛适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业加速数字化转型。
完全开源!国内首个完全开源JAVA企业级低代码平台
|
5月前
|
存储 Java 程序员
那些年,我们一起追过的Java数据类型“女神”们
【6月更文挑战第13天】Java数据类型的五位“女神”——整数int、浮点double、字符char、布尔boolean及数组[],各具特色,陪伴程序员度过编程时光。int快捷高效,double处理精确计算,char展示文本魅力,boolean明辨真假,数组存储多元素。她们在编程世界中扮演重要角色,共同构建多彩的代码世界。
26 3
|
5月前
|
传感器 人工智能 算法
适应多形态多任务,最强开源机器人学习系统八爪鱼诞生
【6月更文挑战第6天】【八爪鱼开源机器人学习系统】由加州大学伯克利分校等机构研发,适用于多形态多任务,已在arXiv上发表。系统基于transformer,预训练于800k机器人轨迹数据集,能快速适应新环境,支持单臂、双机械臂等。特点是多形态适应、多任务处理、快速微调及开源可复现。实验显示其在9个平台有效,但仍需改进传感器处理和语言指令理解。论文链接:https://arxiv.org/pdf/2405.12213
96 1
|
6月前
|
Java 程序员 图形学
程序员教你用代码制作飞翔的小鸟--Java小游戏,正好拿去和给女神一起玩
《飞扬的小鸟》Java实现摘要:使用IntelliJ IDEA和JDK 16开发,包含小鸟类`Bird`,处理小鸟的位置、速度和碰撞检测。代码示例展示小鸟图像的加载、绘制与旋转。同时有`Music`类用于循环播放背景音乐。游戏运行时检查小鸟是否撞到地面、柱子或星星,并实现翅膀煽动效果。简单易懂,可直接复制使用。
129 0
|
4月前
|
机器学习/深度学习 算法 机器人
相隔3000英里,用苹果头显遥控机器人!UCSD、MIT华人团队开源TeleVision
【7月更文挑战第19天】UCSD和MIT华人团队开发的TeleVision技术实现了远程操控机器人。借助AR/VR,操作者通过头显设备获得实时的机器人视角,并通过手势控制执行任务。系统支持多人协作,已在远距离实验中成功导航复杂环境。不过,高带宽需求和交互学习曲线是挑战。[论文链接](https://robot-tv.github.io/resources/television.pdf)**
75 14
|
3月前
|
机器学习/深度学习 存储 缓存
Java本地高性能缓存实践问题之阿里云机器学习团队开源社区的问题如何解决
Java本地高性能缓存实践问题之阿里云机器学习团队开源社区的问题如何解决
|
4月前
|
机器学习/深度学习 监控 安全
相隔3000英里,用苹果头显遥控机器人!UCSD、MIT华人团队开源TeleVision
【7月更文挑战第20天】加州大学圣地亚哥分校(UCSD)与麻省理工学院(MIT)的华人团队开发出TeleVision系统,结合Apple AR/VR头显,实现超远程沉浸式机器人控制。💡该系统克服视频流延迟,精准手势识别难题,让操作者仿佛亲临现场指挥机器人行动。目前处于研究阶段,已展示基本任务执行能力。更多信息查阅[论文](https://robot-tv.github.io/resources/television.pdf)。🌐 --- **🏷️远程控制** **🏷️虚拟现实** **🏷️机器人技术** **🏷️华人科研** **🏷️科技创新**
49 4
|
4月前
|
人工智能 移动开发 Java
Java智能之Spring AI:5分钟打造智能聊天模型的利器
尽管Python最近成为了编程语言的首选,但是Java在人工智能领域的地位同样不可撼动,得益于强大的Spring框架。随着人工智能技术的快速发展,我们正处于一个创新不断涌现的时代。从智能语音助手到复杂的自然语言处理系统,人工智能已经成为了现代生活和工作中不可或缺的一部分。在这样的背景下,Spring AI 项目迎来了发展的机遇。尽管该项目汲取了Python项目如LangChain和LlamaIndex的灵感,但Spring AI并不是简单的移植。该项目的初衷在于推进生成式人工智能应用程序的发展,使其不再局限于Python开发者。
155 2
|
4月前
|
机器人
Telegram统计机器人源码/TG记账群发机器源码人/TG自动记账全开源版本
Telegram统计机器人源码/TG记账群发机器源码人/TG自动记账全开源版本
254 0

热门文章

最新文章