Compare commits

..

9 Commits

Author SHA1 Message Date
a07e9f2a33 新增了日志控制 2024-07-22 10:56:04 +08:00
af963f0af8 调整下载 2024-06-15 06:10:42 +08:00
88527c5716 替换为Okhttp调用网络
修复BT订阅下载失败的问题
2024-06-15 04:16:57 +08:00
dcb56e8873 替换rss解析器为xml解析 2024-06-09 13:37:29 +08:00
a366e15765 调整BT下载 2024-06-09 12:16:20 +08:00
25bee81d05 调整BT下载 2024-06-09 11:36:41 +08:00
16c0f9816d 恢复阿里云oss备份重要文件 2023-07-20 14:51:27 +08:00
c1468cf094 Merge remote-tracking branch 'origin/master' 2023-06-21 14:05:47 +08:00
558ad1bdaf 移除bt rss转json失败后的通知 2023-06-21 14:05:33 +08:00
25 changed files with 924 additions and 61 deletions

20
pom.xml
View File

@@ -137,7 +137,23 @@
<artifactId>snail</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.retrofit2/retrofit -->
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
<build>
@@ -186,8 +202,8 @@
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<source>9</source>
<target>9</target>
<compilerArguments>
<extdirs>${basedir}/libs</extdirs>
</compilerArguments>

View File

@@ -2,15 +2,17 @@ package com.yutou.nas.Controllers;
import com.alibaba.fastjson2.JSONObject;
import com.yutou.nas.Services.IBangumiService;
import com.yutou.nas.utils.AnimRssManager;
import com.yutou.nas.utils.BTDownloadManager;
import com.yutou.nas.utils.DmhyRssDownloadManager;
import com.yutou.nas.utils.Log;
import com.yutou.nas.utils.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;
@Controller
public class BTDownloadController {
@@ -19,23 +21,59 @@ public class BTDownloadController {
@ResponseBody
@RequestMapping("/bt/down.do")
public String bt(){
public String bt() {
DmhyRssDownloadManager.getInstance().start();
AnimRssManager.scan();
return "ok";
}
@ResponseBody
@RequestMapping("/bt/done.do")
public String done(String path,String filename,String hash1,String hash2,String tid){
Log.i("BTDownloadController.done","path = " + path + ", filename = " + filename + ", hash1 = " + hash1 + ", hash2 = " + hash2 + ", tid = " + tid);
BTDownloadManager.done(path, filename, hash1, hash2, tid);
public String done(String path, String filename, String hash1, String hash2, String tid) {
//BTDownloadManager.done(path, filename, hash1, hash2, tid);
try {
String exec = ConfigTools.load(ConfigTools.CONFIG, "tiny.exec", String.class);
Process process = Runtime.getRuntime().exec(new String[]{"sh"
, "-c"
, exec});
process.waitFor(120, TimeUnit.SECONDS);
} catch (Exception e) {
Log.e("下崽器", e);
}
return "ok";
}
@ResponseBody
@RequestMapping("/bt/download.do")
public String download(int id,boolean isDownloadNext,String url){
Log.i("跳过下载","手动下载 id = " + id + ", isDownloadNext = " + isDownloadNext + ", url = " + url);
bangumiService.download(id,isDownloadNext,url);
public String download(int id, boolean isDownloadNext, String url) {
Log.i("跳过下载", "手动下载 id = " + id + ", isDownloadNext = " + isDownloadNext + ", url = " + url);
bangumiService.download(id, isDownloadNext, url);
return "1";
}
@ResponseBody
@RequestMapping("/qq/bt/download.do")
public String download(HttpServletRequest request) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
String title = null;
String url = null;
try {
BufferedInputStream stream = new BufferedInputStream(request.getInputStream());
byte[] bytes = new byte[1024];
int len = 0, size;
while ((len = stream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
outputStream.flush();
}
String str = outputStream.toString();
JSONObject json = JSONObject.parseObject(str);
title = json.getString("title");
url = json.getString("url");
} catch (Exception e) {
e.printStackTrace();
}
Log.i("QQ下载", "手动下载 title = " + title + ", url = " + url);
return "" + BTDownloadManager.download(title, url);
}
}

View File

@@ -1,6 +1,7 @@
package com.yutou.nas;
import com.yutou.nas.Datas.AppData;
import com.yutou.nas.okhttp.HttpLoggingInterceptor;
import com.yutou.nas.utils.DmhyRssDownloadManager;
import com.yutou.nas.utils.ConfigTools;
import com.yutou.nas.utils.QQBotManager;
@@ -12,13 +13,16 @@ import org.springframework.context.annotation.Import;
@Import(DmhyRssDownloadManager.class)
@SpringBootApplication
public class NasApplication {
public static final String version = "1.2.17.7.1";
public static final String version = "1.4.3";
public static void main(String[] args) {
SpringApplication.run(NasApplication.class, args);
AppData.defaultMusicPath = (String) ConfigTools.load(ConfigTools.CONFIG, "musicDir");
RedisTools.initRedisPoolSub();
QQBotManager.getInstance().sendMessage("NasManager已上线:"+version);
QQBotManager.getInstance().sendMessage("NasManager已上线:" + version);
if (ConfigTools.load(ConfigTools.CONFIG, "okhttp.log", boolean.class)) {
HttpLoggingInterceptor.setLog(true);
}
}
}

View File

@@ -0,0 +1,6 @@
package com.yutou.nas.okhttp;
import java.io.Serializable;
public class BaseBean implements Serializable {
}

View File

@@ -0,0 +1,25 @@
package com.yutou.nas.okhttp;
import okhttp3.HttpUrl;
import okhttp3.Request;
import java.util.HashMap;
public class GetRequestParams implements IRequestParam {
/**
* 构建Request
*
* @param request
* @return
*/
@Override
public Request getRequest(HashMap<String, String> map, Request request) {
//添加公共参数
HttpUrl.Builder builder = request.url().newBuilder();
for (String key : map.keySet()) {
builder.addQueryParameter(key, String.valueOf(map.get(key)));
}
return request.newBuilder().url(builder.build()).build();
}
}

View File

@@ -0,0 +1,14 @@
package com.yutou.nas.okhttp;
import lombok.Data;
@Data
public class HttpBody<T> {
private String msg;
private String status;
private int code;
private int retcode;
private T data;
private String src;
}

View File

@@ -0,0 +1,33 @@
package com.yutou.nas.okhttp;
import okhttp3.Headers;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public abstract class HttpCallback<T> implements Callback<HttpBody<T>> {
public abstract void onResponse(Headers headers,int code, String status, T response, String rawResponse);
public abstract void onFailure(Throwable throwable);
@Override
public void onResponse(Call<HttpBody<T>> call, Response<HttpBody<T>> response) {
if (response.body() != null) {
onResponse(
response.headers(),
response.body().getRetcode(),
response.body().getStatus(),
response.body().getData(),
response.body().getSrc()
);
} else {
onFailure(new NullPointerException("response body is null"));
}
}
@Override
public void onFailure(Call<HttpBody<T>> call, Throwable throwable) {
onFailure(throwable);
}
}

View File

@@ -0,0 +1,209 @@
package com.yutou.nas.okhttp;
import com.yutou.nas.utils.Log;
import okhttp3.*;
import okhttp3.internal.http.HttpHeaders;
import okio.Buffer;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
public class HttpLoggingInterceptor implements Interceptor {
private static final String TAG = "HttpLogging";
private static final Charset UTF8 = Charset.forName("UTF-8");
private volatile Level printLevel = Level.NONE;
private java.util.logging.Level colorLevel;
private Logger logger;
private static boolean prLog;
public static void setLog(boolean log) {
prLog = log;
}
public enum Level {
NONE, //不打印log
BASIC, //只打印 请求首行 和 响应首行
HEADERS, //打印请求和响应的所有 Header
BODY //所有数据全部打印
}
public HttpLoggingInterceptor(String tag) {
logger = Logger.getLogger(tag);
colorLevel = java.util.logging.Level.INFO;
}
public void setPrintLevel(Level level) {
if (printLevel == null)
throw new NullPointerException("printLevel == null. Use Level.NONE instead.");
printLevel = level;
}
public void setColorLevel(java.util.logging.Level level) {
colorLevel = level;
}
private void log(String message) {
//logger.log(colorLevel, message);
if (prLog) {
Log.i(TAG, message);
}
//Log.e(TAG,message);
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (request.body() != null && request.body().contentLength() == 0) {
request = chain.call().request();
}
if (printLevel == Level.NONE) {
return chain.proceed(request);
}
//请求日志拦截
logForRequest(request, chain.connection());
//执行请求,计算请求时间
long startNs = System.nanoTime();
Response response;
try {
response = chain.proceed(request);
} catch (Exception e) {
log("<-- HTTP FAILED: " + e);
throw e;
}
long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
//响应日志拦截
return logForResponse(response, tookMs);
}
private void logForRequest(Request request, Connection connection) throws IOException {
boolean logBody = (printLevel == Level.BODY);
boolean logHeaders = (printLevel == Level.BODY || printLevel == Level.HEADERS);
RequestBody requestBody = request.body();
boolean hasRequestBody = requestBody != null;
Protocol protocol = connection != null ? connection.protocol() : Protocol.HTTP_1_1;
try {
String requestStartMessage = "--> " + request.method() + ' ' + request.url() + ' ' + protocol;
log(requestStartMessage);
if (logHeaders) {
if (hasRequestBody) {
// Request body headers are only present when installed as a network interceptor. Force
// them to be included (when available) so there values are known.
if (requestBody.contentType() != null) {
log("\tContent-Type: " + requestBody.contentType());
}
if (requestBody.contentLength() != -1) {
log("\tContent-Length: " + requestBody.contentLength());
}
}
Headers headers = request.headers();
for (int i = 0, count = headers.size(); i < count; i++) {
String name = headers.name(i);
// Skip headers from the request body as they are explicitly logged above.
if (!"Content-Type".equalsIgnoreCase(name) && !"Content-Length".equalsIgnoreCase(name)) {
log("\t" + name + ": " + headers.value(i));
}
}
log(" ");
if (logBody && hasRequestBody) {
if (isPlaintext(requestBody.contentType())) {
bodyToString(request);
} else {
log("\tbody: maybe [binary body], omitted!");
}
}
}
} catch (Exception e) {
logger.log(java.util.logging.Level.WARNING, e.getMessage(), e);
} finally {
log("--> END " + request.method());
}
}
private Response logForResponse(Response response, long tookMs) {
Response.Builder builder = response.newBuilder();
Response clone = builder.build();
ResponseBody responseBody = clone.body();
boolean logBody = (printLevel == Level.BODY);
boolean logHeaders = (printLevel == Level.BODY || printLevel == Level.HEADERS);
try {
log("<-- " + clone.code() + ' ' + clone.message() + ' ' + clone.request().url() + " (" + tookMs + "ms");
if (logHeaders) {
Headers headers = clone.headers();
for (int i = 0, count = headers.size(); i < count; i++) {
log("\t" + headers.name(i) + ": " + headers.value(i));
}
log(" ");
if (logBody && HttpHeaders.hasBody(clone)) {
if (responseBody == null) return response;
if (isPlaintext(responseBody.contentType())) {
byte[] bytes = responseBody.byteStream().readAllBytes();
MediaType contentType = responseBody.contentType();
String body = new String(bytes, getCharset(contentType));
log("\tbody:" + body);
responseBody = ResponseBody.create(responseBody.contentType(), bytes);
return response.newBuilder().body(responseBody).build();
} else {
log("\tbody: maybe [binary body], omitted!");
}
}
}
} catch (Exception e) {
logger.log(java.util.logging.Level.WARNING, e.getMessage(), e);
} finally {
log("<-- END HTTP");
}
return response;
}
private static Charset getCharset(MediaType contentType) {
Charset charset = contentType != null ? contentType.charset(UTF8) : UTF8;
if (charset == null) charset = UTF8;
return charset;
}
/**
* Returns true if the body in question probably contains human readable text. Uses a small sample
* of code points to detect unicode control characters commonly used in binary file signatures.
*/
private static boolean isPlaintext(MediaType mediaType) {
if (mediaType == null) return false;
if (mediaType.type() != null && mediaType.type().equals("text")) {
return true;
}
String subtype = mediaType.subtype();
if (subtype != null) {
subtype = subtype.toLowerCase();
if (subtype.contains("x-www-form-urlencoded") || subtype.contains("json") || subtype.contains("xml") || subtype.contains("html")) //
return true;
}
return false;
}
private void bodyToString(Request request) {
try {
Request copy = request.newBuilder().build();
RequestBody body = copy.body();
if (body == null) return;
Buffer buffer = new Buffer();
body.writeTo(buffer);
Charset charset = getCharset(body.contentType());
log("\tbody:" + buffer.readString(charset));
} catch (Exception e) {
logger.log(java.util.logging.Level.WARNING, e.getMessage(), e);
}
}
}

View File

@@ -0,0 +1,9 @@
package com.yutou.nas.okhttp;
import okhttp3.Request;
import java.util.HashMap;
public interface IRequestParam {
Request getRequest(HashMap<String,String> map, Request request);
}

View File

@@ -0,0 +1,31 @@
package com.yutou.nas.okhttp;
import okhttp3.Request;
import java.util.HashMap;
public class ParamsContext {
private IRequestParam iRequestParam;
private Request request;
private HashMap<String,String> map;
public ParamsContext(HashMap<String,String> map,Request request) {
if(map==null){
map=new HashMap<>();
}
this.map=map;
this.request = request;
}
public Request getInRequest() {
switch (request.method()) {
case "GET":
iRequestParam = new GetRequestParams();
break;
case "POST":
iRequestParam = new PostRequestParams();
break;
}
return iRequestParam.getRequest(map,request);
}
}

View File

@@ -0,0 +1,69 @@
package com.yutou.nas.okhttp;
import com.alibaba.fastjson2.JSONObject;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class PostRequestParams implements IRequestParam {
@Override
public Request getRequest(HashMap<String, String> map, Request request) {
if (request.body() instanceof FormBody) {
FormBody.Builder bodyBuilder = new FormBody.Builder();
FormBody formBody = (FormBody) request.body();
for (int i = 0; i < formBody.size(); i++) {
bodyBuilder.addEncoded(formBody.encodedName(i), formBody.encodedValue(i));
}
for (String key : map.keySet()) {
bodyBuilder.addEncoded(key, String.valueOf(map.get(key)));
}
formBody = bodyBuilder.build();
request = request.newBuilder().post(formBody).build();
} else if (request.body() != null) {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),toUrlParams(map));
request = request.newBuilder().post(request.body())
.post(requestBody).build();
}
return request;
}
public static String toUrlParams(JSONObject json) {
StringBuilder string = new StringBuilder();
Set<String> keys = json.keySet();
for (String key : keys) {
try {
string.append("&").append(key).append("=").append(URLEncoder.encode(json.getString(key), "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
try {
string.append("&").append(URLEncoder.encode(key,"UTF-8")).append("=");
// string += "&" + key + "=";
} catch (Exception e1) {
string.append("&").append(key).append("=");
}
}
}
string = new StringBuilder(string.substring(1, string.length()).replaceAll(" ", ""));
return string.toString();
}
public static String toUrlParams(Map<String, String> map) {
if(map.isEmpty()){
return "";
}
StringBuilder builder = new StringBuilder();
for (String key : map.keySet()) {
builder.append(key).append("=").append(map.get(key)).append("&");
}
return builder.substring(0, builder.length() - 1);
}
}

View File

@@ -0,0 +1,101 @@
package com.yutou.nas.okhttp.api;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.bind.DateTypeAdapter;
import com.yutou.nas.okhttp.HttpLoggingInterceptor;
import com.yutou.nas.okhttp.ParamsContext;
import com.yutou.nas.okhttp.converter.JsonCallAdapter;
import com.yutou.nas.okhttp.converter.JsonConverterFactory;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.CallAdapter;
import retrofit2.Converter;
import retrofit2.Retrofit;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
public class BaseApi {
private String URL;
private HashMap<String, String> params;
public BaseApi(String URL) {
this.URL = URL;
}
public BaseApi setURL(String URL) {
this.URL = URL;
return this;
}
public BaseApi setParams(HashMap<String, String> params) {
this.params = params;
return this;
}
/**
* 创建一个接口方法
*
* @param okHttpClient okhttp客户端
* @param converterFactory 处理工厂类
* @param callAdapterFactory 请求适配器工厂
* @param baseUrl 基础地质
* @param service 接口
* @param <T> 接口泛型
* @return 接口
*/
public <T> T create(OkHttpClient okHttpClient, Converter.Factory converterFactory, CallAdapter.Factory callAdapterFactory, String baseUrl, Class<T> service) {
Retrofit.Builder builder = new Retrofit.Builder()
//基础url
.baseUrl(baseUrl)
//客户端OKHttp
.client(okHttpClient);
//添加转换工厂
if (null != converterFactory) {
builder.addConverterFactory(converterFactory);
}
//添加请求工厂
if (null != callAdapterFactory) {
builder.addCallAdapterFactory(callAdapterFactory);
}
//创建retrofit对象
Retrofit retrofit = builder.build();
//返回创建的api
return retrofit.create(service);
}
public <T> T createApi(Class<T> apiClass) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateTypeAdapter())
.create();
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("http");
loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient()
.newBuilder()
.addInterceptor(initQuery())
.addInterceptor(loggingInterceptor);
return create(builder.build(),
JsonConverterFactory.create(gson),
JsonCallAdapter.create(),
URL,
apiClass);
}
public Interceptor initQuery() {
Interceptor addQueryParameterInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//配置公共参数
request = new ParamsContext(params,request).getInRequest();
return chain.proceed(request);
}
};
return addQueryParameterInterceptor;
}
}

View File

@@ -0,0 +1,14 @@
package com.yutou.nas.okhttp.api;
import com.yutou.nas.okhttp.BaseBean;
import com.yutou.nas.okhttp.HttpBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface ToolsNetApi {
@FormUrlEncoded
@POST("/api/v2/torrents/add")
Call<HttpBody<BaseBean>> postDownloadBt(@Field("urls")String urls, @Field("savepath")String savePath);
}

View File

@@ -0,0 +1,17 @@
package com.yutou.nas.okhttp.api;
import com.yutou.nas.utils.ConfigTools;
public class ToolsNetManager extends BaseApi {
public ToolsNetManager(String URL) {
super(URL);
}
public static ToolsNetManager createQbit() {
return new ToolsNetManager(ConfigTools.load(ConfigTools.CONFIG, "Qbittorrent.Url", String.class));
}
public ToolsNetApi getToolsNetApi() {
return createApi(ToolsNetApi.class);
}
}

View File

@@ -0,0 +1,19 @@
package com.yutou.nas.okhttp.converter;
import org.jetbrains.annotations.Nullable;
import retrofit2.CallAdapter;
import retrofit2.Retrofit;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
public class JsonCallAdapter extends CallAdapter.Factory{
public static JsonCallAdapter create(){
return new JsonCallAdapter();
}
@Nullable
@Override
public CallAdapter<?, ?> get(Type type, Annotation[] annotations, Retrofit retrofit) {
return null;
}
}

View File

@@ -0,0 +1,40 @@
package com.yutou.nas.okhttp.converter;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import org.jetbrains.annotations.Nullable;
import retrofit2.Converter;
import retrofit2.Retrofit;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
public class JsonConverterFactory extends Converter.Factory {
Gson gson;
public static JsonConverterFactory create(Gson gson) {
return new JsonConverterFactory(gson);
}
private JsonConverterFactory(Gson gson) {
this.gson = gson;
}
@Nullable
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
// return super.requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit);
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new JsonRequestBodyConverter<>(gson,adapter);
}
@Nullable
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
// return super.responseBodyConverter(type, annotations, retrofit);
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new JsonResponseBodyConverter<>(gson,adapter,type);
}
}

View File

@@ -0,0 +1,36 @@
package com.yutou.nas.okhttp.converter;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonWriter;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okio.Buffer;
import org.jetbrains.annotations.Nullable;
import retrofit2.Converter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
public class JsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
Gson gson;
TypeAdapter<T> adapter;
public JsonRequestBodyConverter(Gson gson, TypeAdapter<T> adapter) {
this.gson=gson;
this.adapter=adapter;
}
@Nullable
@Override
public RequestBody convert(T value) throws IOException {
Buffer buffer = new Buffer();
Writer writer = new OutputStreamWriter(buffer.outputStream(), StandardCharsets.UTF_8);
JsonWriter jsonWriter = gson.newJsonWriter(writer);
adapter.write(jsonWriter, value);
jsonWriter.close();
byte[] bytes = buffer.readByteArray();
return RequestBody.create(MediaType.parse("application/json; charset=UTF-8"),bytes );
}
}

View File

@@ -0,0 +1,42 @@
package com.yutou.nas.okhttp.converter;
import com.alibaba.fastjson2.JSONObject;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.yutou.nas.okhttp.HttpBody;
import okhttp3.ResponseBody;
import org.jetbrains.annotations.Nullable;
import retrofit2.Converter;
import java.io.IOException;
import java.lang.reflect.Type;
public class JsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
Gson gson;
TypeAdapter<?> adapter;
Type type;
public JsonResponseBodyConverter(Gson gson, TypeAdapter<?> adapter, Type type) {
this.gson = gson;
this.adapter = adapter;
this.type = type;
}
@Nullable
@Override
public T convert(ResponseBody responseBody) throws IOException {
String string = new String(responseBody.bytes());
responseBody.close();
HttpBody<T> body;
try {
body = JSONObject.parseObject(string, type);
body.setSrc(string);
return (T) body;
} catch (Exception e) {
body = new HttpBody();
body.setSrc(string);
}
return (T) body;
}
}

View File

@@ -60,7 +60,7 @@ public class ApplicationInit implements ApplicationRunner {
//musicTools.scanMusic();
break;
case "01:00":
//DepotManager.scan();
DepotManager.scan();
break;
}

File diff suppressed because one or more lines are too long

View File

@@ -62,7 +62,7 @@ public class DmhyRssDownloadManager implements ApplicationContextAware {
}
BTDownloadManager.download(item.getTitle(), json);
} else {
QQBotManager.getInstance().sendMessage(item.getTitle() + "\n下载失败\n" + getDmhyUrl(item));
//QQBotManager.getInstance().sendMessage(item.getTitle() + "\n下载失败\n" + getDmhyUrl(item));
Log.i(item.getTitle() + "\n下载失败");
}
}

View File

@@ -4,10 +4,8 @@ import com.alibaba.fastjson2.JSONObject;
import com.yutou.nas.interfaces.DownloadInterface;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Set;
@@ -16,7 +14,11 @@ public class HttpTools {
private static final int HttpRequestIndex = 3;
public static String get(String url) {
return https_get(url, null);
return https_get(url, false, null);
}
public static String https_get(String url, Map<String, String> header) {
return https_get(url, false, header);
}
public static String post(final String url, final byte[] body) {
@@ -27,16 +29,26 @@ public class HttpTools {
return new HttpTools().http_syncDownload(url, saveName);
}
public static String https_get(String url, Map<String, String> header) {
public static String https_get(String url, boolean isProxy, Map<String, String> header) {
try {
URLConnection connection;
connection = new URL(url).openConnection();
Proxy proxy = null;
if (isProxy) {
proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ConfigTools.load(ConfigTools.CONFIG,"proxy.address",String.class),
ConfigTools.load(ConfigTools.CONFIG,"proxy.port",Integer.class)));
}
if (proxy == null) {
connection = new URL(url).openConnection();
} else {
connection = new URL(url).openConnection(proxy);
}
connection.setRequestProperty("User-Agent", getUa());
if (header != null) {
for (String key : header.keySet()) {
connection.addRequestProperty(key, header.get(key));
}
}
connection.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder str = new StringBuilder();
@@ -64,8 +76,8 @@ public class HttpTools {
connection.addRequestProperty(key, headers.get(key));
}
}
if(body==null){
body="".getBytes();
if (body == null) {
body = "".getBytes();
}
connection.setDoOutput(true);
connection.setDoInput(true);
@@ -74,7 +86,7 @@ public class HttpTools {
connection.setReadTimeout(10 * 1000);
//connection.addRequestProperty("Connection", "keep-alive");
//connection.addRequestProperty("User-Agent", getExtUa());
//connection.addRequestProperty("content-type", "application/json");
connection.addRequestProperty("content-type", "application/json");
connection.addRequestProperty("charset", "UTF-8");
OutputStream outputStream = connection.getOutputStream();
//System.out.println(new String(body));
@@ -101,6 +113,59 @@ public class HttpTools {
}
}
public static String http_post_form(String url, byte[] body, int index, Map<String, String> headers) {
String tmp;
StringBuilder str = new StringBuilder();
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("POST");
if (headers != null) {
for (String key : headers.keySet()) {
connection.addRequestProperty(key, headers.get(key));
}
}
if (body == null) {
body = "".getBytes();
}
Log.i("Http","url = "+url+" body = "+new String(body));
connection.setDoOutput(true);
connection.setDoInput(true);
connection.addRequestProperty("User-Agent", getUa());
connection.setConnectTimeout(5 * 1000);
connection.setReadTimeout(10 * 1000);
connection.setRequestProperty("Content-Type", "multipart/form-data;");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
//connection.addRequestProperty("Connection", "keep-alive");
//connection.addRequestProperty("User-Agent", getExtUa());
//connection.addRequestProperty("content-type", "application/json");
OutputStream outputStream = connection.getOutputStream();
//System.out.println(new String(body));
outputStream.write(body);
outputStream.flush();
outputStream.close();
connection.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while ((tmp = reader.readLine()) != null) {
str.append(tmp);
}
String finalStr = str.toString();
Log.i("Http","code = "+connection.getResponseCode()+" url = "+url+" body = "+new String(body));
connection.disconnect();
reader.close();
return finalStr;
} catch (Exception e) {
e.printStackTrace();
if (index < HttpRequestIndex) {
return http_post_form(url, body, index + 1, headers);
} else {
e.printStackTrace();
return null;
}
}
}
public static String getUa() {
return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36";
}
@@ -134,11 +199,12 @@ public class HttpTools {
JSONObject json = new JSONObject();
json.put("pid", "102");
json.put("gid", "100584");
json.put("gameKey", "0gha58u1c9FjZkeAsEmYIzTvp");
json.put("access_token", "659c-S1gV0DwMXdYjPDlSrSLNYOvA8qUoCSvmdFEHvZugKgNX4Z2BCwF18A7W2gRdG7WiWfKsbZgF6YssZHhaozksI9RBn2QQFTXzmAHtbMd4ginEEtwdKmPCM4JbJGg1ollqoNE0PcGENpa4F3e7EdSOa_JFyE6XyUQN1iurJU3F8MZfLlTIcTR9USYoHX15vsAkCht_0mrapZblkeY1_8HFrmK8rlenbZLxccy7PrMz5eZ9uPPDJL5OYiEahyrtLENB8SVmlGofJfQw8wUjN8_XVZSfLMujdwz24");
String url = "http://192.168.1.156:9020/Faxing/reg?" +
"&tpyeCode=dimai" +
"&regParamJson=" + json.toJSONString();
json.put("message", "0gha58u1c9FjZkeAsEmYIzTvp");
// json.put("access_token", "659c-S1gV0DwMXdYjPDlSrSLNYOvA8qUoCSvmdFEHvZugKgNX4Z2BCwF18A7W2gRdG7WiWfKsbZgF6YssZHhaozksI9RBn2QQFTXzmAHtbMd4ginEEtwdKmPCM4JbJGg1ollqoNE0PcGENpa4F3e7EdSOa_JFyE6XyUQN1iurJU3F8MZfLlTIcTR9USYoHX15vsAkCht_0mrapZblkeY1_8HFrmK8rlenbZLxccy7PrMz5eZ9uPPDJL5OYiEahyrtLENB8SVmlGofJfQw8wUjN8_XVZSfLMujdwz24");
String url = "http://127.0.0.1:8002/qq/send.do";
String data = "data=abc&codd=1";
data = json.toString();
http_post(url, data.getBytes(StandardCharsets.UTF_8), 0, null);
/* ExecutorService service= Executors.newCachedThreadPool();
for (int i = 0; i < 3000; i++) {
service.submit(new Runnable() {

View File

@@ -35,7 +35,7 @@ public class QQBotManager {
json.put("message",text);
Map<String, String> header = new HashMap<>();
header.put("content-type", "application/json");
return HttpTools.http_post("http://"+ConfigTools.load(ConfigTools.CONFIG,"nas_ip",String.class)+":802/qq/send.do", json.toString().getBytes(StandardCharsets.UTF_8), 1, header);
return HttpTools.http_post("http://"+ConfigTools.load(ConfigTools.CONFIG,"nas_ip",String.class)+"/qq/send.do", json.toString().getBytes(StandardCharsets.UTF_8), 1, header);
}
public String sendMessage(long qq,String text) {
@@ -44,7 +44,7 @@ public class QQBotManager {
json.put("message",text);
Map<String, String> header = new HashMap<>();
header.put("content-type", "application/json");
return HttpTools.http_post("http://"+ConfigTools.load(ConfigTools.CONFIG,"nas_ip",String.class)+":802/qq/send.do", json.toString().getBytes(StandardCharsets.UTF_8), 1, header);
return HttpTools.http_post("http://"+ConfigTools.load(ConfigTools.CONFIG,"nas_ip",String.class)+"/qq/send.do", json.toString().getBytes(StandardCharsets.UTF_8), 1, header);
}
public String sendMessage(String imageUrl, String message) {
@@ -57,7 +57,7 @@ public class QQBotManager {
json.put("image", imageUrl);
Map<String, String> header = new HashMap<>();
header.put("content-type", "application/json");
return HttpTools.http_post("http://"+ConfigTools.load(ConfigTools.CONFIG,"nas_ip",String.class)+":802/qq/send.do", json.toString().getBytes(StandardCharsets.UTF_8), 1, header);
return HttpTools.http_post("http://"+ConfigTools.load(ConfigTools.CONFIG,"nas_ip",String.class)+"/qq/send.do", json.toString().getBytes(StandardCharsets.UTF_8), 1, header);
}

View File

@@ -263,9 +263,9 @@ public class RedisTools {
new Thread(new Runnable() {
@Override
public void run() {
Jedis jedis = getPoolRedis();
if (jedis != null)
jedis.psubscribe(new Consumer(), "*");
// Jedis jedis = getPoolRedis();
// if (jedis != null)
// jedis.psubscribe(new Consumer(), "*");
}
}).start();

View File

@@ -1,23 +1,79 @@
package com.yutou.nas.utils;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.jcraft.jsch.jce.ARCFOUR;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
public class RssXMLtoJson {
public static JSONObject toJSON(String xmlUrl){
String url = "https://api.rss2json.com/v1/api.json?rss_url=%s&api_key=wtfm5pebya13pnl8rtu51wfgfpte0mb9sap1foll&count=500";
public static JSONObject toJSON(String xmlUrl) {
String xml = HttpTools.https_get(xmlUrl, true, null);
SAXReader reader = new SAXReader();
JSONObject json = new JSONObject();
try {
String ret = HttpTools.get(String.format(url, URLEncoder.encode(xmlUrl, "UTF-8")));
if(ret!=null){
return JSON.parseObject(ret, JSONObject.class);
json.put("status", "ok");
JSONArray array = new JSONArray();
BufferedReader br = new BufferedReader(new StringReader(xml));
Document document = reader.read(br);
Element rootElement = document.getRootElement();
List<Element> elements = rootElement.element("channel").elements("item");
for (Element element : elements) {
JSONObject item = new JSONObject();
JSONObject enclosure = new JSONObject();
String title = element.element("title").content().get(0).getText();
String magnet = element.element("enclosure").attribute("url").getValue();
String time = element.element("pubDate").content().get(0).getText();
enclosure.put("link", magnet);
item.put("title", title);
item.put("enclosure", enclosure);
item.put("time", time);
array.add(item);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
json.put("items", array);
} catch (Exception e) {
json.put("status", e.getMessage());
}
return json;
}
public static void main(String[] args) {
String xmlUrl = "https://share.dmhy.org/topics/rss/rss.xml?keyword=%E5%96%B5%E8%90%8C%E5%A5%B6%E8%8C%B6%E5%B1%8B%20%E8%8D%AF%E5%B1%8B%E5%B0%91%E5%A5%B3%E7%9A%84%E5%91%A2%E5%96%83%20%E7%AE%80%E6%97%A5";
String xml = HttpTools.https_get(xmlUrl, true, null);
SAXReader reader = new SAXReader();
JSONObject json = new JSONObject();
try {
json.put("status", "ok");
JSONArray array = new JSONArray();
BufferedReader br = new BufferedReader(new StringReader(xml));
Document document = reader.read(br);
Element rootElement = document.getRootElement();
List<Element> elements = rootElement.element("channel").elements("item");
for (Element element : elements) {
JSONObject item = new JSONObject();
JSONObject enclosure = new JSONObject();
String title = element.element("title").content().get(0).getText();
String magnet = element.element("enclosure").attribute("url").getValue();
String time = element.element("pubDate").content().get(0).getText();
enclosure.put("link", magnet);
item.put("title", title);
item.put("enclosure", enclosure);
item.put("time", time);
array.add(item);
}
json.put("items", array);
System.out.println(rootElement);
} catch (Exception e) {
json.put("status", e.getMessage());
}
return null;
}
}