正常人每天平均耗水量为2000-2500毫升,体内物质氧化可生水300毫升,故每日应补充水分2200毫升,包括饮食中的含水量。夏天每日补充水分在3000毫升左右,才能满足人体需要。
如果有个机器人能按时提醒我们喝水,那该多好啊~~
(这个步骤是为小白提供,大佬们直接跳到第三步)
1.8 2.0.3 love.forte.simple-robot parent ${simbot.version} import pom
love.forte.simple-robot component-mirai-spring-boot-starter
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
/** * @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("机器人启动成功~~~~"); } }
https://www.yuque.com/simpler-robot/simpler-robot-doc/gbqsz5
/** * @author yinfeng * @description 定时喝水提醒 * @since 2021/12/22 23:32 */ @Component @Slf4j public class DrinkNotify { @Resource private BotManager botManager; @Value("${bello.qq}") private SetqqSet; /** * 喝水语录 */ static List content; /** * 喝水图片 */ static List 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); } }); } }
#配置女神们的QQ号,多个QQ用逗号分割 bello: qq: 1332483344,52000012
http://api.qingyunke.com/
/** * @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(); } }
/** * @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; } }
可以看到两个qq都收到了提醒消息 , 后台日志 也是没问题的
可以看到聊天功能也是正常的 , 后台日志 也是正常的
// 源码地址,下载运行即可 // 也可打成jar包放在服务器一直运行 // 老铁们可以加6013505进行智能聊天测试哈 https://gitee.com/yinfeng-code/java-robot.git
肝文不易,老铁们 三连一波 支持下吧,谢谢大家了~
Error(title=登录失败, message=帐号或密码错误,请重新输入。, errorInfo=)
异常截图如下
解决方案:在application.yml中配置自己的qq账号和密码
UnsupportedSliderCaptchaException: Mirai 无法完成滑块验证. 使用协议 ANDROID_PHONE 强制要求滑块验证, 请更换协议后重试. 另请参阅
异常截图如下
解决方案:在application.yml中更换协议为PAD协议或者watch协议试试
如果还不行的话可以参考机器人框架官网文档 滑块登录异常
解决方案:升级你的IDEA到 2021 或以上版本。具体参考 IDEA导包异常报错