diff --git a/pom.xml b/pom.xml
index e062332..32cf79c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,18 +10,23 @@
com.yutou
tools
- 1.0.9.5
+ 1.0.10
tools
Demo project for Spring Boot
1.8
+ 1.4.10
jaudiotagger-repository
https://dl.bintray.com/ijabz/maven
+
+ jcenter
+ https://jcenter.bintray.com/
+
@@ -101,14 +106,48 @@
ealvatag
0.4.3
+
+ net.mamoe
+ mirai-core-qqandroid
+ 1.3.2
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+ ${kotlin.version}
+
+ ${project.basedir}/src/main/java
+ ${project.basedir}/src/test/java
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+
+
+
+ compile
+
+ compile
+
+
+
+
+ test-compile
+
+ test-compile
+
+
+
+
org.springframework.boot
spring-boot-maven-plugin
+
diff --git a/src/main/java/com/yutou/tools/ToolsApplication.java b/src/main/java/com/yutou/tools/ToolsApplication.java
index 3f904c7..e6b1434 100644
--- a/src/main/java/com/yutou/tools/ToolsApplication.java
+++ b/src/main/java/com/yutou/tools/ToolsApplication.java
@@ -3,27 +3,29 @@ package com.yutou.tools;
import com.yutou.tools.home.nas.MusicController;
import com.yutou.tools.utils.APIFilter;
import com.yutou.tools.utils.MusicTools;
+import com.yutou.tools.utils.QQBotManager;
import com.yutou.tools.utils.RedisTools;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+
+import java.io.IOException;
@SpringBootApplication
public class ToolsApplication {
public static void main(String[] args) {
- System.out.println("当前版本号:1.0.9.5");
+ System.out.println("当前版本号:1.0.10");
SpringApplication.run(ToolsApplication.class, args);
RedisTools.initRedisPoolSub();
- if(APIFilter.isDebug) {
- MusicController.defaultMusicPath="C:\\Users\\admin\\Music\\";
+ if (APIFilter.isDebug) {
+ MusicController.defaultMusicPath = "C:\\Users\\admin\\Music\\";
MusicTools.getInstance().setMusicPath("C:\\Users\\admin\\Music\\");
- }
- else{
- MusicController.defaultMusicPath="/media/yutou/4t/public/音乐";
+ } else {
+ MusicController.defaultMusicPath = "/media/yutou/4t/public/音乐";
MusicTools.getInstance().setMusicPath("/media/yutou/4t/public/音乐");
}
-
-
+ QQBotManager.getInstance();
}
}
diff --git a/src/main/java/com/yutou/tools/home/nas/QQBot.java b/src/main/java/com/yutou/tools/home/nas/QQBot.java
index 7f23cc1..3d5fcf3 100644
--- a/src/main/java/com/yutou/tools/home/nas/QQBot.java
+++ b/src/main/java/com/yutou/tools/home/nas/QQBot.java
@@ -3,10 +3,15 @@ package com.yutou.tools.home.nas;
import com.alibaba.fastjson.JSONObject;
import com.yutou.tools.interfaces.DownloadInterface;
import com.yutou.tools.utils.OSSTools;
+import com.yutou.tools.utils.QQBotManager;
import com.yutou.tools.utils.RedisTools;
+import com.yutou.tools.utils.Tools;
import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
import redis.clients.jedis.Jedis;
import java.io.File;
@@ -14,16 +19,38 @@ import java.util.Base64;
import java.util.UUID;
@Controller
-@RequestMapping("/localhome/bot")
+@RequestMapping("/qq/bot")
public class QQBot {
-
+ @RequestMapping("test.do")
+ @ResponseBody
+ public String test(){
+ return "123";
+ }
@RequestMapping("send.do")
@ResponseBody
- public String send(String msg){
+ public String send(String msg,String imgUrl){
JSONObject json=new JSONObject();
try {
- boolean ret= RedisTools.set(1,"msg_"+System.currentTimeMillis(),msg);
+ String ret;
+ if(StringUtils.isEmpty(imgUrl)){
+ ret= QQBotManager.getInstance().sendMessage(msg);
+ }else{
+ Tools.download(imgUrl, new DownloadInterface() {
+ @Override
+ public void onDownload(String file) {
+ super.onDownload(file);
+ QQBotManager.getInstance().sendMessage(new File(file),msg);
+ }
+
+ @Override
+ public void onError(Exception e) {
+ super.onError(e);
+ QQBotManager.getInstance().sendMessage(imgUrl+"\n"+msg);
+ }
+ });
+ ret="图片下载中";
+ }
json.put("code",0);
json.put("msg",ret);
}catch (Exception e){
@@ -33,51 +60,25 @@ public class QQBot {
}
return json.toJSONString();
}
- @RequestMapping("msg.do")
+ @RequestMapping("sendAndImg.do")
@ResponseBody
- public String botMsg(String msg,String type){
- System.out.println(type);
- if(type.trim().equals("download")){
- JSONObject json=JSONObject.parseObject(new String(Base64.getDecoder().decode(msg)));
- String url=json.getString("url");
- if(url.endsWith(".apk")){
- String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
- Jedis redisTools = RedisTools.getRedis();
- redisTools.select(1);
- redisTools.setex("downloadApk_" + uuid, RedisTools.TOKEN_TIMEOUT_DEFAULT, msg);
- redisTools.close();
- String packageName=null;
- String version=null;
- packageName=RedisTools.get("csj_packageName",1);
- version=RedisTools.get("csj_version",1);
- if(packageName==null){
- packageName="穿山甲包名";
- }
- if(version==null){
- version="穿山甲版本号";
- }
- RedisTools.set(1, "msg_" + System.currentTimeMillis(), "检测到上传apk,请选择处理方式:" +
- "\n1)生成穿山甲资源包 回复 #csj#"+packageName+"#"+version+"#downloadApk_" + uuid + "" +
- "\n2)不处理 (360s后自动取消)" +
- "\n输入 *set csj_packageName XXX 可设置默认包名" +
- "\n输入 *set csj_version XXX 可设置默认版本号");
- }
+ public String botMsg(String msg,@RequestParam("file") MultipartFile file){
+ JSONObject json=new JSONObject();
+ if(file==null){
+ json.put("code",-1);
+ json.put("msg","图片为空");
+ return json.toJSONString();
}
- return "OK~";
- }
- @RequestMapping("csj/assets.do")
- @ResponseBody
- public String csjAssets(String data,String packagename,String version){
- new Thread(new Runnable() {
- @Override
- public void run() {
- String msg = RedisTools.get(data, 1);
- JSONObject json=JSONObject.parseObject(new String(Base64.getDecoder().decode(msg)));
- json.put("package",packagename);
- json.put("version",version);
- BotTools.download(json);
- }
- }).start();
- return "ok";
+ String ret;
+ try {
+ String path = Tools.createFile("qq_image",file, file.getName());
+ ret=QQBotManager.getInstance().sendMessage(new File(path),msg);
+ } catch (Exception e) {
+ e.printStackTrace();
+ ret=e.getLocalizedMessage();
+ }
+ json.put("code",0);
+ json.put("msg",ret);
+ return json.toJSONString();
}
}
diff --git a/src/main/java/com/yutou/tools/utils/APIFilter.java b/src/main/java/com/yutou/tools/utils/APIFilter.java
index 6f0f2cc..bb8ff8d 100644
--- a/src/main/java/com/yutou/tools/utils/APIFilter.java
+++ b/src/main/java/com/yutou/tools/utils/APIFilter.java
@@ -31,10 +31,10 @@ public class APIFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- /* if(isDebug){
+ if(isDebug){
filterChain.doFilter(servletRequest, servletResponse);
return;
- }*/
+ }
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String token = request.getParameter("token");
diff --git a/src/main/java/com/yutou/tools/utils/ConfigTools.java b/src/main/java/com/yutou/tools/utils/ConfigTools.java
index 81910ba..78b9e68 100644
--- a/src/main/java/com/yutou/tools/utils/ConfigTools.java
+++ b/src/main/java/com/yutou/tools/utils/ConfigTools.java
@@ -28,6 +28,7 @@ public class ConfigTools {
}
public static Object load(String type,String key){
File file=new File(type);
+ System.out.println(type+"配置文件地址:"+file.getAbsolutePath());
String src=readFile(file);
if(src!=null){
JSONObject json=JSONObject.parseObject(src);
@@ -37,7 +38,7 @@ public class ConfigTools {
}
return json.getOrDefault(key, "");
}
- return null;
+ return "";
}
public static boolean save(String type,String key,Object data){
File file=new File(type);
diff --git a/src/main/java/com/yutou/tools/utils/MusicTools.java b/src/main/java/com/yutou/tools/utils/MusicTools.java
index c540886..4fd7679 100644
--- a/src/main/java/com/yutou/tools/utils/MusicTools.java
+++ b/src/main/java/com/yutou/tools/utils/MusicTools.java
@@ -19,7 +19,7 @@ public class MusicTools {
public static final int FIND_ARTIST = 2;
private static MusicTools tools;
- private String musicPath = "C:\\Users\\admin\\Music";
+ private String musicPath = "/media/yutou/4t/public/音乐";
private final List musicList = new ArrayList<>();
private HashMap> musicMap = new HashMap>();
private boolean isScan = false;
@@ -51,6 +51,7 @@ public class MusicTools {
}
System.out.println("执行扫描");
musicList.clear();
+ musicMap.clear();
new Thread(() -> {
isScan = true;
scan(new File(musicPath));
diff --git a/src/main/java/com/yutou/tools/utils/QQBotManager.java b/src/main/java/com/yutou/tools/utils/QQBotManager.java
new file mode 100644
index 0000000..65f0186
--- /dev/null
+++ b/src/main/java/com/yutou/tools/utils/QQBotManager.java
@@ -0,0 +1,125 @@
+package com.yutou.tools.utils;
+
+import kotlin.coroutines.CoroutineContext;
+import net.mamoe.mirai.Bot;
+import net.mamoe.mirai.BotFactoryJvm;
+import net.mamoe.mirai.contact.Contact;
+import net.mamoe.mirai.event.EventHandler;
+import net.mamoe.mirai.event.Events;
+import net.mamoe.mirai.event.ListeningStatus;
+import net.mamoe.mirai.event.SimpleListenerHost;
+import net.mamoe.mirai.message.GroupMessageEvent;
+import net.mamoe.mirai.message.MessageReceipt;
+import net.mamoe.mirai.message.data.Image;
+import net.mamoe.mirai.message.data.MessageChain;
+import net.mamoe.mirai.message.data.MessageUtils;
+import net.mamoe.mirai.utils.BotConfiguration;
+import net.mamoe.mirai.utils.MiraiLogger;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+
+public class QQBotManager {
+ private static QQBotManager botManager = null;
+ private Bot bot;
+ private static final long qqGroup = 891655174L;
+ private boolean isLogin=false;
+
+ private QQBotManager() {
+ Object isRun = ConfigTools.load(ConfigTools.CONFIG, "qq_bot");
+ if (isRun != null && (boolean) isRun) {
+ init();
+ isLogin=true;
+ }
+ }
+
+ private void init() {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ long qq=2476945931L;
+ String password="zhang34864394";
+ if(true) {
+ qq = 3620756944L;
+ password = "UAs6YBYMyxJU";
+ }
+
+ bot = BotFactoryJvm.newBot(qq, password, new BotConfiguration() {
+ {
+ fileBasedDeviceInfo("qq_bot_devices_info.json");
+ }
+ });
+ Events.registerEvents(bot, new MessageListener());
+ bot.login();
+ bot.join();
+ }
+ }).start();
+
+ }
+
+ public static QQBotManager getInstance() {
+ if (botManager == null) {
+ botManager = new QQBotManager();
+ }
+ return botManager;
+ }
+ public boolean isLogin(){
+ return isLogin;
+ }
+ private String getNotLoginQQ(){
+ return "没有登录QQ";
+ }
+ public String sendMessage(String text) {
+ if (bot != null) {
+ MessageReceipt receipt= bot.getGroup(qqGroup).sendMessage(text);
+ return receipt.toString();
+ }
+ return getNotLoginQQ();
+ }
+
+ public String sendMessage(File imageFile, String text) {
+ if (bot != null) {
+ Image image = bot.getGroup(qqGroup).uploadImage(imageFile);
+ MessageChain chain = MessageUtils.newImage(image.getImageId()).plus(text);
+ MessageReceipt receipt=bot.getGroup(qqGroup).sendMessage(chain);
+ return receipt.toString();
+ }
+ return getNotLoginQQ();
+ }
+
+ public static void main(String[] args) {
+ getInstance();
+ }
+
+ private static class MessageListener extends SimpleListenerHost {
+ @Override
+ public void handleException(@NotNull CoroutineContext context, @NotNull Throwable exception) {
+ super.handleException(context, exception);
+ System.out.println("error: "+exception.getLocalizedMessage());
+ }
+
+ @EventHandler
+ public ListeningStatus onGroupMessage(GroupMessageEvent event) {
+ if(event.getGroup().getId()==qqGroup){
+ String msg=event.getMessage().contentToString();
+ msg=msg.replace("!","!");
+ switch (msg){
+ case "!开机":
+ RedisTools.Consumer.system("openPC",null);
+ break;
+ case "!更新IP":
+ RedisTools.Consumer.system("updateIP",null);
+ break;
+ case "!ip":
+ RedisTools.Consumer.bot("getip");
+ break;
+ default:
+ if(msg.startsWith("!cmd")){
+ RedisTools.Consumer.system("cmd",msg.replace("!cmd",""));
+ }
+ }
+ }
+ return ListeningStatus.LISTENING;
+ }
+ }
+}
diff --git a/src/main/java/com/yutou/tools/utils/RedisTools.java b/src/main/java/com/yutou/tools/utils/RedisTools.java
index 7355750..4601c7c 100644
--- a/src/main/java/com/yutou/tools/utils/RedisTools.java
+++ b/src/main/java/com/yutou/tools/utils/RedisTools.java
@@ -204,7 +204,7 @@ public class RedisTools {
}
- private static class Consumer extends JedisPubSub {
+ protected static class Consumer extends JedisPubSub {
@Override
public void onPMessage(String pattern, String channel, String message) {
super.onPMessage(pattern, channel, message);
@@ -238,7 +238,7 @@ public class RedisTools {
System.out.println("onMessage: channel=" + channel + " msg=" + message);
}
- private void system(String type, String value) {
+ public static void system(String type, String value) {
try {
String exec = null;
switch (type) {
@@ -265,23 +265,24 @@ public class RedisTools {
- private void bot(String value) {
+ public static void bot(String value) {
switch (value) {
case "getip":
JSONObject json = JSONObject.parseObject(Tools.get("https://api.asilu.com/ip/"));
String ip = json.getString("ip");
- RedisTools.set(1, "msg_" + System.currentTimeMillis(), "服务器IP:\n" + ip);
+ QQBotManager.getInstance().sendMessage("服务器IP:\n" + ip);
break;
}
}
}
public static void processOut(InputStream inputStream) {
- String tmp, str = "null";
+ String tmp;
+ StringBuilder str = new StringBuilder("null");
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
while ((tmp = reader.readLine()) != null) {
- str += tmp + "\n";
+ str.append(tmp).append("\n");
}
reader.close();
inputStream.close();
@@ -289,7 +290,7 @@ public class RedisTools {
e.printStackTrace();
}
System.out.println("cmd > " + str);
- RedisTools.set(1, "msg_" + System.currentTimeMillis(), str);
+ QQBotManager.getInstance().sendMessage(str.toString());
System.out.println("线程结束");
}
public static void main(String[] args) {
diff --git a/src/main/java/com/yutou/tools/utils/Tools.java b/src/main/java/com/yutou/tools/utils/Tools.java
index 74353cd..6a5e648 100644
--- a/src/main/java/com/yutou/tools/utils/Tools.java
+++ b/src/main/java/com/yutou/tools/utils/Tools.java
@@ -7,6 +7,7 @@ import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
+import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
@@ -92,13 +93,62 @@ public class Tools {
int i = inputStream.read();
inputStream.close();
connection.disconnect();
- if (UpdateIp.nas_ip != null) {
- String url="http://" + UpdateIp.nas_ip + ":8000/localhome/bot/send.do?msg=" + URLEncoder.encode((title + "\n" + msg), "UTF-8") + "&token=zIrsh9TUZP2lfRW753PannG49E7VJvor";
+ if (ConfigTools.load(ConfigTools.CONFIG, "model").equals("nas")) {
+ String img = null;
+ msg = msg.replace("
", "\n");
+ if (msg.contains("![logo]")) {
+ try {
+ img = msg.split("!\\[logo\\]\\(")[1].split("\\)")[0];
+ msg = msg.replace("", "");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ if (img == null) {
+ QQBotManager.getInstance().sendMessage(title + "\n" + msg);
+ } else {
+ String finalMsg = msg;
+ String finalImg = img;
+ if (QQBotManager.getInstance().isLogin()) {
+ download(img, new DownloadInterface() {
+ @Override
+ public void onDownload(String file) {
+ super.onDownload(file);
+ QQBotManager.getInstance().sendMessage(new File(file), title + "\n" + finalMsg);
+ }
+
+ @Override
+ public void onError(Exception e) {
+ super.onError(e);
+ QQBotManager.getInstance().sendMessage(title + "\n" + finalMsg + "\n" + finalImg);
+ }
+ });
+ }
+ }
+ } else if (!StringUtils.isEmpty(UpdateIp.nas_ip)) {
+ String img = null;
+ msg = msg.replace("
", "\n");
+ if (msg.contains("![logo]")) {
+ try {
+ img = msg.split("!\\[logo\\]\\(")[1].split("\\)")[0];
+ msg = msg.replace("", "");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ String url;
+ if (img == null) {
+ url = "http://" + UpdateIp.nas_ip + ":8000/qq/bot/send.do?msg=" + URLEncoder.encode((title + "\n" + msg), "UTF-8") + "&token=zIrsh9TUZP2lfRW753PannG49E7VJvor";
+ } else {
+ url = "http://" + UpdateIp.nas_ip + ":8000/qq/bot/send.do?msg=" + URLEncoder.encode((title + "\n" + msg), "UTF-8")
+ + "&imgUrl=" + img
+ + "&token=zIrsh9TUZP2lfRW753PannG49E7VJvor";
+ }
System.out.println(url);
connection = (HttpURLConnection) new URL(url).openConnection();
connection.connect();
- inputStream=connection.getInputStream();
- i=inputStream.read();
+ inputStream = connection.getInputStream();
+ i = inputStream.read();
inputStream.close();
connection.disconnect();
}
@@ -191,7 +241,7 @@ public class Tools {
public static String get(String url) {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
- connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36");
+ connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36");
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder str = new StringBuilder();
String tmp;
@@ -239,19 +289,19 @@ public class Tools {
public static void download(String url, DownloadInterface downloadInterface) {
try {
- HttpURLConnection connection= (HttpURLConnection) new URL(url).openConnection();
+ HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.disconnect();
new File("tmp").mkdirs();
- File file=new File("tmp"+File.separator+url.trim().split("/")[url.trim().split("/").length-1]);
- if(file.exists()){
+ File file = new File("tmp" + File.separator + url.trim().split("/")[url.trim().split("/").length - 1]);
+ if (file.exists()) {
file.delete();
}
- FileOutputStream outputStream=new FileOutputStream(file);
- InputStream inputStream=connection.getInputStream();
- byte[] bytes=new byte[4096];
+ FileOutputStream outputStream = new FileOutputStream(file);
+ InputStream inputStream = connection.getInputStream();
+ byte[] bytes = new byte[4096];
int len;
- while ((len=inputStream.read(bytes))!=-1){
- outputStream.write(bytes,0,len);
+ while ((len = inputStream.read(bytes)) != -1) {
+ outputStream.write(bytes, 0, len);
outputStream.flush();
}
outputStream.close();
@@ -265,16 +315,17 @@ public class Tools {
/**
* 构造给前端的文件
+ *
* @param file 文件路径
* @return 前端获取的文件
*/
- public static ResponseEntity getFile(File file){
+ public static ResponseEntity getFile(File file) {
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
try {
- headers.add("Content-Disposition", "attachment; filename=" +URLEncoder.encode(file.getName(),"UTF-8"));
+ headers.add("Content-Disposition", "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
} catch (UnsupportedEncodingException e) {
- headers.add("Content-Disposition", "attachment; filename=" +file.getName());
+ headers.add("Content-Disposition", "attachment; filename=" + file.getName());
}
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");