package com.yutou.bilibili.QQBot; import com.alibaba.fastjson.JSONObject; import com.yutou.bilibili.BiliBili.Controllers.RealTimeDataController; import com.yutou.bilibili.BiliBili.Live; import com.yutou.bilibili.BiliBili.LiveUtils; import com.yutou.bilibili.BiliBili.Tools.SaveLive; import com.yutou.bilibili.BilibiliApplication; import com.yutou.bilibili.Tools.*; import com.yutou.bilibili.interfaces.DownloadInterface; import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo; import net.mamoe.mirai.Bot; import net.mamoe.mirai.BotFactory; import net.mamoe.mirai.event.GlobalEventChannel; import net.mamoe.mirai.event.events.GroupMessageEvent; import net.mamoe.mirai.message.data.Image; import net.mamoe.mirai.message.data.MessageChainBuilder; import net.mamoe.mirai.utils.BotConfiguration; import net.mamoe.mirai.utils.ExternalResource; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import javax.annotation.Resource; import java.io.File; import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; public class QQBotManager implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (QQBotManager.applicationContext == null) QQBotManager.applicationContext = applicationContext; } private T getBean(Class tClass) { return applicationContext.getBean(tClass); } private static class QQCommands { private final static String QQ_HELP = "!help"; private final static String QQ_SYSTEM_LOG = "!log"; private final static String QQ_SYSTEM_STOP = "!stopliveservice"; private final static String QQ_GET_IP = "!ip"; private final static String QQ_GET_VERSION = "!version"; private final static String QQ_LIVE_LIST = "!列表"; private final static String QQ_LIVE_SAVE = "!录播列表"; private final static String QQ_LIVE_TO_DAY_DATE = "!今日数据"; private final static String QQ_LIVE_DATE = "!数据"; private final static String QQ_LIVE_USE_SAVE = "!启动录播"; } private static QQBotManager botManager = null; private Bot bot; private static long qqGroup; private boolean isLogin = false; private static boolean isInit = false; @Resource RealTimeDataController realTimeDataController; private QQBotManager() { qqGroup = Long.parseLong((String) ConfigTools.load(ConfigTools.CONFIG, "qq_group")); } public void stop(){ if(bot!=null){ bot.close(); bot=null; } } public void init() { if (!((boolean) ConfigTools.load(ConfigTools.CONFIG, "qq_bot"))) { return; } new Thread(new Runnable() { @Override public void run() { long qq = Long.parseLong((String) ConfigTools.load(ConfigTools.CONFIG, "qq_number")); String password = (String) ConfigTools.load(ConfigTools.CONFIG, "qq_password"); bot = BotFactory.INSTANCE.newBot(qq, password, new BotConfiguration() { { setProtocol(MiraiProtocol.ANDROID_PAD); fileBasedDeviceInfo("qq_bot_devices_info.json"); if (!((boolean) ConfigTools.load(ConfigTools.CONFIG, "qq_debug"))) { noBotLog(); noNetworkLog(); } } }); //Events.registerEvents(bot, new MessageListener()); GlobalEventChannel.INSTANCE.subscribeAlways(GroupMessageEvent.class, new MessageListener()); Log.i("准备登陆"); bot.login(); Log.i("登陆成功"); isLogin = true; isInit = true; new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { com.yutou.bilibili.Tools.Log.e(e); } String str = sendMessage("姬妻酱上线拉~"); Log.i(str); } }).start(); bot.join(); } }).start(); } public static QQBotManager getInstance() { if (botManager == null && !isInit) { botManager = new QQBotManager(); } return botManager; } public boolean isLogin() { return isLogin; } private Image getImage(File file) { if (bot != null) { return Objects.requireNonNull(bot.getGroup(qqGroup)).uploadImage(ExternalResource.create(file)); } return null; } private String getNotLoginQQ() { return "没有登录QQ"; } public String sendMessage(String text) { if (bot != null) { try { return Objects.requireNonNull(bot.getGroup(qqGroup)).sendMessage(text).toString(); } catch (Exception e) { com.yutou.bilibili.Tools.Log.e(e); } } return getNotLoginQQ(); } public String sendMessage(Long group, String text) { if (bot != null) { try { return Objects.requireNonNull(bot.getGroup(group)).sendMessage(text).toString(); } catch (Exception e) { com.yutou.bilibili.Tools.Log.e(e); } } return getNotLoginQQ(); } public void sendMessage(Long group, MessageChainBuilder builder) { if (bot != null) { Objects.requireNonNull(bot.getGroup(group)).sendMessage(builder.asMessageChain()); } } public String sendMessage(File imageFile, String text) { try { if (bot != null) { Image image = getImage(imageFile); MessageChainBuilder builder = new MessageChainBuilder(); if (image != null) { builder.append(image); } builder.append(text); return Objects.requireNonNull(bot.getGroup(qqGroup)).sendMessage(builder.asMessageChain()).toString(); } } catch (Exception e) { com.yutou.bilibili.Tools.Log.e(e); } return getNotLoginQQ(); } public String sendMessage(List imgs, String text) { if (bot != null) { MessageChainBuilder builder = new MessageChainBuilder(); for (File img : imgs) { builder.append(Objects.requireNonNull(getImage(img))); } builder.append(text); return Objects.requireNonNull(bot.getGroup(qqGroup)).sendMessage(builder.asMessageChain()).toString(); } return getNotLoginQQ(); } private static List getImages(String str) { List list = new ArrayList<>(); String regex = ""; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); while (matcher.find()) { list.add(matcher.group().replace("", "") .trim()); } return list; } public static void main(String[] args) { getInstance(); } private static class MessageListener implements Consumer { @Override public void accept(GroupMessageEvent event) { String msg = event.getMessage().contentToString(); if (qqGroup == event.getGroup().getId()) { myGroup(msg); } } private void myGroup(String msg) { msg = msg.replace("!", "!").toLowerCase(); msg=msg.trim(); StringBuilder builder = new StringBuilder(); JSONObject json; String[] cmd = new String[0]; int _roomId = 0; switch (msg) { case QQCommands.QQ_GET_IP: json = JSONObject.parseObject(HttpTools.get("https://api.asilu.com/ip/")); String ip = json.getString("ip"); getInstance().sendMessage("服务器IP:" + ip); break; case QQCommands.QQ_GET_VERSION: sendVersion(); break; case QQCommands.QQ_SYSTEM_STOP: getInstance().sendMessage("正在停止服务"); System.out.println("结束进程"); System.exit(0); break; case QQCommands.QQ_LIVE_LIST: builder.append("当前正在记录数据的直播间:"); builder.append("\n"); for (Live live : Live.lives) { JSONObject liveJson = LiveUtils.LiveInfoManager.getInstance().getInfo(live.getInfo().getRoomid()); if (LiveUtils.isLivePlayer(live.getInfo().getRoomid())) { builder.append("【直播中】"); } builder .append("名字:").append(live.geData().getName()).append(" ") .append(" roomId:").append(live.geData().getRoomid()).append(" "); if (liveJson != null) { builder.append("标题:").append(liveJson.getJSONObject("data").getJSONObject("room_info").getString("title")).append("\n"); } else { builder.append("\n"); } } getInstance().sendMessage(builder.toString()); break; case QQCommands.QQ_LIVE_SAVE: builder.append("当前正在录制的直播间:"); builder.append("\n"); for (String roomId : SaveLive.getInstance().getLiveList()) { BilibiliUpInfo data = new BilibiliUpInfo(); data.setRoomid(Integer.parseInt(roomId)); Live live = LiveUtils.liveContains(data); if (live != null) { File file = SaveLive.getInstance().getLiveFile(Integer.parseInt(roomId)); builder .append("名字:").append(live.geData().getName()).append(" ") .append("文件大小(字节):").append(file.length()).append(" ") .append("roomId:").append(live.geData().getRoomid()).append("\n"); } } getInstance().sendMessage(builder.toString()); break; case QQCommands.QQ_HELP: for (Field field : QQCommands.class.getDeclaredFields()) { try { field.setAccessible(true); builder.append(field.get(null)).append("\n"); } catch (IllegalAccessException e) { com.yutou.bilibili.Tools.Log.e(e); } } getInstance().sendMessage(builder.toString()); break; default: if (msg.startsWith(QQCommands.QQ_LIVE_TO_DAY_DATE)) { try { cmd = msg.split(" "); _roomId = Integer.parseInt(cmd[1]); QQBotManager.getInstance().sendMessage("请稍等,正在查询..."); sendGiftData(_roomId, null, null); } catch (Exception e) { getInstance().sendMessage("参数错误。\n使用方式: " + QQCommands.QQ_LIVE_TO_DAY_DATE + "+空格+roomId"); } } else if (msg.startsWith(QQCommands.QQ_LIVE_DATE)) { try { cmd = msg.split(" "); _roomId = Integer.parseInt(cmd[1]); Date startTime = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").parse(cmd[2]); Date endTime = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").parse(cmd[3]); QQBotManager.getInstance().sendMessage("请稍等,正在查询..."); sendGiftData(_roomId, startTime, endTime); } catch (Exception e) { getInstance().sendMessage("参数错误。" + "\n使用方式: " + QQCommands.QQ_LIVE_DATE + "+空格+roomId+起始时间+空格+结束时间" + "\n时间格式:年-月-日_时:分:秒 例:2021-4-1_12:00:00" + "\n时分秒不可省略"); } } else if (msg.startsWith(QQCommands.QQ_LIVE_USE_SAVE)) { try { cmd = msg.split(" "); _roomId = Integer.parseInt(cmd[1]); if (SaveLive.getInstance().checkLive(_roomId)) { SaveLive.getInstance().stop(_roomId); } SaveLive.getInstance().startLive(_roomId); getInstance().sendMessage("已启动" + _roomId + "的录播"); } catch (Exception e) { getInstance().sendMessage("参数错误。\n使用方式: " + QQCommands.QQ_LIVE_USE_SAVE + "+空格+roomId"); } } else if (msg.startsWith(QQCommands.QQ_SYSTEM_LOG)) { try { cmd = msg.split(" "); switch (cmd[1]){ case "true": RedisTools.set(1,"live-log","true"); getInstance().sendMessage("日志设为 true"); break; case "false": RedisTools.set(1,"live-log","false"); getInstance().sendMessage("日志设为 false"); break; default: getInstance().sendMessage("设置错误,"+QQCommands.QQ_SYSTEM_LOG +" true|false"); } } catch (Exception e) { e.printStackTrace(); } }else { System.out.println("未知指令:"+msg); } } } public void sendGiftData(int roomId, Date startTime, Date endTime) { StringBuilder builder = new StringBuilder(); if (startTime == null) { startTime = AppTools.getToDayStartTime(); } if (endTime == null) { endTime = AppTools.getToDayNowTime(); } if (getInstance().realTimeDataController == null) getInstance().realTimeDataController = getInstance().getBean(RealTimeDataController.class); JSONObject json = getInstance().realTimeDataController.queryToDayLiveData(roomId, startTime, endTime); System.out.println(json); builder.append("当前人气:").append(json.getJSONObject("data").getInteger("popular")).append("\n"); builder.append("普通观众入场:").append(json.getJSONObject("data").getInteger("userLength")).append("\n"); builder.append("舰长入场:").append(json.getJSONObject("data").getInteger("vipLength")).append("\n"); int price = 0; for (Object o : json.getJSONObject("data").getJSONArray("price")) { price += ((JSONObject) o).getInteger("price"); } builder.append("金瓜子:").append(price).append(" 抽成后:").append((price / 2) / 1000).append("¥").append("\n"); builder.append("礼物收益情况:").append("\n"); for (Object o : json.getJSONObject("data").getJSONArray("gift")) { builder.append(((JSONObject) o).getString("giftName")).append(":").append(((JSONObject) o).getInteger("size")).append("\n"); } getInstance().sendMessage(builder.toString()); } private List files; private int index = 0; private void sendImagesMsg(List imgs, String text) { files = new ArrayList<>(); index = 0; if (imgs.size() == 0) { getInstance().sendMessage(text); return; } for (String img : imgs) { Tools.download(img, new DownloadInterface() { @Override public void onDownload(File file) { super.onDownload(file); files.add(file); send(imgs.size(), text); } @Override public void onError(Exception e) { super.onError(e); index++; send(imgs.size(), text); } }); } } private void send(int size, String text) { if ((files.size() + index) == size) { String str = getInstance().sendMessage(files, text); Log.i("str = " + str); } } private void sendVersion() { String msg = "软件版本:" + BilibiliApplication.version; QQBotManager.getInstance().sendMessage(msg); } } }