From 6a0acdc779e45f32230b88096f3ab43e0b03418a Mon Sep 17 00:00:00 2001
From: Yutousama <583819556@qq.com>
Date: Wed, 3 Jun 2020 00:01:11 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EOSS=E4=B8=8A=E4=BC=A0=20?=
=?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=A4=84=E7=90=86apk=E6=89=93=E5=8C=85?=
=?UTF-8?q?=E7=A9=BF=E5=B1=B1=E7=94=B2=E5=8A=9F=E8=83=BD=EF=BC=88=E5=B7=A5?=
=?UTF-8?q?=E4=BD=9C=E9=9C=80=E8=A6=81=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 6 +-
.../com/yutou/tools/home/nas/BotTools.java | 123 ++++++++++++++++++
.../java/com/yutou/tools/home/nas/QQBot.java | 24 ++++
.../tools/interfaces/DownloadInterface.java | 6 +
.../java/com/yutou/tools/utils/OSSTools.java | 47 +++++++
.../com/yutou/tools/utils/RedisTools.java | 4 +-
.../java/com/yutou/tools/utils/Tools.java | 32 ++++-
7 files changed, 235 insertions(+), 7 deletions(-)
create mode 100644 src/main/java/com/yutou/tools/home/nas/BotTools.java
create mode 100644 src/main/java/com/yutou/tools/interfaces/DownloadInterface.java
create mode 100644 src/main/java/com/yutou/tools/utils/OSSTools.java
diff --git a/pom.xml b/pom.xml
index f254abd..421f4e1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -81,7 +81,11 @@
jsch
0.1.55
-
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.8.0
+
diff --git a/src/main/java/com/yutou/tools/home/nas/BotTools.java b/src/main/java/com/yutou/tools/home/nas/BotTools.java
new file mode 100644
index 0000000..e93abbe
--- /dev/null
+++ b/src/main/java/com/yutou/tools/home/nas/BotTools.java
@@ -0,0 +1,123 @@
+package com.yutou.tools.home.nas;
+
+import com.alibaba.fastjson.JSONObject;
+import com.qy.Interfaces.SmaliApkToolsPath;
+import com.qy.utils.CsjTools;
+import com.yutou.tools.interfaces.DownloadInterface;
+import com.yutou.tools.utils.OSSTools;
+import com.yutou.tools.utils.RedisTools;
+import com.yutou.tools.utils.Tools;
+import redis.clients.jedis.Jedis;
+
+import java.io.File;
+import java.util.*;
+
+public class BotTools {
+ protected static String download(String msg) {
+ String _json = new String(Base64.getDecoder().decode(msg));
+ JSONObject json = JSONObject.parseObject(_json);
+ String url = json.getString("url");
+ Tools.download(url, new DownloadInterface() {
+ @Override
+ public void onDownload(String file) {
+ super.onDownload(file);
+ if (file.endsWith(".apk")) {
+ String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
+ Jedis redisTools = RedisTools.getRedis();
+ redisTools.select(1);
+ redisTools.setex("downloadApk_" + uuid, RedisTools.TOKEN_TIMEOUT_DEFAULT, file);
+ redisTools.close();
+ RedisTools.set(1, "msg_" + System.currentTimeMillis(), "检测到上传apk,请选择处理方式:" +
+ "\n1)生成穿山甲资源包 (回复 #csj#穿山甲包名#穿山甲版本号#downloadApk_" + uuid + ")" +
+ "\n2)不处理 (360s后自动取消)" +
+ "\n$downloadApk_" + uuid);
+ }
+ }
+
+ @Override
+ public void onError(Exception e) {
+ super.onError(e);
+
+ }
+ });
+ return "ok";
+ }
+
+ private static List list = new ArrayList<>();
+ private static boolean isRun = false;
+
+ static void csjAssets(String data, String packagename,String version) {
+ String path = RedisTools.get(data,1);
+ File file = new File(path);
+ JSONObject json = new JSONObject();
+ json.put("file", file);
+ json.put("version", version);
+ json.put("packagename", packagename);
+ list.add(json);
+ if (isRun) {
+ RedisTools.set(1, "msg_" + System.currentTimeMillis(), file + "\n已加入到队列");
+ return;
+ }
+ csj();
+
+ }
+
+ private static void csj() {
+ if (list.size() > 0) {
+ List tmp = new ArrayList<>(list);
+ list.clear();
+ for (JSONObject jsonObject : tmp) {
+ isRun=true;
+ new CsjTools(jsonObject.getString("file")
+ , new File("csj" + File.separator + "demo.apk").getAbsolutePath()
+ , jsonObject.getString("packagename")
+ , jsonObject.getString("version")
+ , new SmaliApkToolsPath() {
+ @Override
+ public void smaliPath(String s) {
+ OSSTools.uploadFile(new File(s), new DownloadInterface() {
+ String path;
+ @Override
+ public void onDownload(String file) {
+ super.onDownload(file);
+ File apk=new File(s);
+ RedisTools.set(1,"msg_"+System.currentTimeMillis(),apk.getName()
+ +"已处理完成,下载地址" +
+ "\n"+file +
+ "\n请在十分钟内下载,超时将自动删除");
+ path = file.replace("https://yutou-oss-test.oss-cn-hangzhou.aliyuncs.com/", "");
+ isRun=false;
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(10 * 60 * 1000);
+ OSSTools.delete(path);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }).start();
+ }
+ });
+ }
+ });
+ }
+ }
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(100);
+ if (list.size() > 0) {
+ csj();
+ }
+
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }).start();
+
+ }
+}
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 5567a98..1216971 100644
--- a/src/main/java/com/yutou/tools/home/nas/QQBot.java
+++ b/src/main/java/com/yutou/tools/home/nas/QQBot.java
@@ -6,6 +6,8 @@ import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
+import java.io.File;
+
@Controller
@RequestMapping("/localhome/bot")
public class QQBot {
@@ -26,4 +28,26 @@ public class QQBot {
}
return json.toJSONString();
}
+ @RequestMapping("msg.do")
+ @ResponseBody
+ public String botMsg(String msg,String type){
+ System.out.println(type);
+ if(type.trim().equals("download")){
+ BotTools.download(msg);
+ }
+ return "OK~";
+ }
+ @RequestMapping("csj/assets.do")
+ @ResponseBody
+ public String csjAssets(String data,String packagename,String version){
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ BotTools.csjAssets(data, packagename, version);
+ }
+ }).start();
+
+
+ return "ok";
+ }
}
diff --git a/src/main/java/com/yutou/tools/interfaces/DownloadInterface.java b/src/main/java/com/yutou/tools/interfaces/DownloadInterface.java
new file mode 100644
index 0000000..88be92a
--- /dev/null
+++ b/src/main/java/com/yutou/tools/interfaces/DownloadInterface.java
@@ -0,0 +1,6 @@
+package com.yutou.tools.interfaces;
+
+public abstract class DownloadInterface {
+ public void onDownload(String file){};
+ public void onError(Exception e){};
+}
diff --git a/src/main/java/com/yutou/tools/utils/OSSTools.java b/src/main/java/com/yutou/tools/utils/OSSTools.java
new file mode 100644
index 0000000..3e2d647
--- /dev/null
+++ b/src/main/java/com/yutou/tools/utils/OSSTools.java
@@ -0,0 +1,47 @@
+package com.yutou.tools.utils;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.yutou.tools.interfaces.DownloadInterface;
+
+import java.io.*;
+
+public class OSSTools {
+ // Endpoint以杭州为例,其它Region请按实际情况填写。
+ private static String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
+ // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
+ private static String accessKeyId = "LTAI4G7J5pWbZeYdhFvGb4Dj";
+ private static String accessKeySecret = "GyXRDaOkER2qArGu4A2Tiym6ajuQPd";
+ private static String bucketName = "yutou-oss-test";
+ public static void uploadFile(File file, DownloadInterface downloadInterface) {
+// 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
+ String objectName = "bot/download/"+System.currentTimeMillis()+"/"+file.getName();
+// 创建OSSClient实例。
+ OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+// 上传内容到指定的存储空间(bucketName)并保存为指定的文件名称(objectName)。
+ try {
+ InputStream inputStream=new FileInputStream(file);
+ ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
+ byte[] bytes=new byte[4096];
+ int len;
+ while ((len=inputStream.read(bytes))!=-1){
+ outputStream.write(bytes,0,len);
+ outputStream.flush();
+ }
+ ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(outputStream.toByteArray()));
+ outputStream.close();
+ inputStream.close();
+ downloadInterface.onDownload("https://yutou-oss-test.oss-cn-hangzhou.aliyuncs.com/"+objectName);
+ } catch (Exception e) {
+ e.printStackTrace();
+ downloadInterface.onError(e);
+ }
+// 关闭OSSClient。
+ ossClient.shutdown();
+ }
+ public static void delete(String path){
+ OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+ ossClient.deleteObject(bucketName, path);
+ ossClient.shutdown();
+ }
+}
diff --git a/src/main/java/com/yutou/tools/utils/RedisTools.java b/src/main/java/com/yutou/tools/utils/RedisTools.java
index ffcb739..5ee5dc3 100644
--- a/src/main/java/com/yutou/tools/utils/RedisTools.java
+++ b/src/main/java/com/yutou/tools/utils/RedisTools.java
@@ -10,7 +10,7 @@ import redis.clients.jedis.Jedis;
public class RedisTools {
private static String host;
private static int port;
- private static int TOKEN_TIMEOUT_DEFAULT=360;
+ public static int TOKEN_TIMEOUT_DEFAULT=360;
private RedisTools() {
@@ -21,7 +21,7 @@ public class RedisTools {
//Properties properties = PropertyUtil.loadProperties("jedis.properties");
//host = properties.getProperty("redis.host");
//port = Integer.valueOf(properties.getProperty("redis.port"));
- host="127.0.0.1";
+ host="192.168.31.88";
port=6379;
}
public static boolean set(int dbIndex,String key,String value){
diff --git a/src/main/java/com/yutou/tools/utils/Tools.java b/src/main/java/com/yutou/tools/utils/Tools.java
index 322ace4..9c8803d 100644
--- a/src/main/java/com/yutou/tools/utils/Tools.java
+++ b/src/main/java/com/yutou/tools/utils/Tools.java
@@ -1,6 +1,7 @@
package com.yutou.tools.utils;
import com.alibaba.fastjson.JSONArray;
+import com.yutou.tools.interfaces.DownloadInterface;
import com.yutou.tools.nas.UpdateIp;
import org.springframework.web.multipart.MultipartFile;
@@ -8,10 +9,7 @@ import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.InputStream;
-import java.io.InputStreamReader;
+import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
@@ -231,4 +229,30 @@ public class Tools {
System.out.println("上传文件保存路径:" + saveFile.getAbsolutePath());
return path + fileName;
}
+
+ public static void download(String url, DownloadInterface downloadInterface) {
+ try {
+ 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.delete();
+ }
+ 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);
+ outputStream.flush();
+ }
+ outputStream.close();
+ inputStream.close();
+ downloadInterface.onDownload(file.getAbsolutePath());
+ } catch (IOException e) {
+ e.printStackTrace();
+ downloadInterface.onError(e);
+ }
+ }
}