新增文件下载监控,当有新ip下载文件时推送消息

This commit is contained in:
chuzhongzai 2024-08-20 17:06:37 +08:00
parent fa0c2d43bd
commit 40b52013b7
5 changed files with 64 additions and 9 deletions

12
pom.xml
View File

@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
<version>3.3.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lion</groupId>
@ -31,6 +31,12 @@
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
@ -72,7 +78,7 @@
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.25.0</version>
<version>1.26.1</version>
</dependency>
<dependency>
@ -103,7 +109,7 @@
<buildArgs>
<arg>--gc=G1</arg>
<arg>-H:+ReportExceptionStackTraces</arg>
<arg>--initialize-at-build-time=org.apache.commons.logging.LogFactory,org.apache.commons.logging.LogFactoryService</arg>
<arg>--initialize-at-build-time=org.apache.commons.logging.LogFactory,org.apache.commons.logging.LogFactoryService,org.sqlite.util.ProcessRunner</arg>
</buildArgs>
<metadataRepository>
<enabled>true</enabled>

View File

@ -38,6 +38,7 @@ import org.springframework.beans.factory.aot.BeanRegistrationExcludeFilter;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;
import org.springframework.beans.factory.support.RegisteredBean;
import org.springframework.beans.factory.support.RootBeanDefinition;
@ -201,8 +202,7 @@ public class MyBatisNativeConfiguration {
} else {
result = (Class<?>) src;
}
} else if (src instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) src;
} else if (src instanceof ParameterizedType parameterizedType) {
int index = (parameterizedType.getRawType() instanceof Class
&& Map.class.isAssignableFrom((Class<?>) parameterizedType.getRawType())
&& parameterizedType.getActualTypeArguments().length > 1) ? 1 : 0;
@ -246,8 +246,10 @@ public class MyBatisNativeConfiguration {
Class<?> mapperInterface = getMapperInterface(beanDefinition);
if (mapperInterface != null) {
// Exposes a generic type information to context for prevent early initializing
beanDefinition
.setTargetType(ResolvableType.forClassWithGenerics(beanDefinition.getBeanClass(), mapperInterface));
ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
constructorArgumentValues.addGenericArgumentValue(mapperInterface);
beanDefinition.setConstructorArgumentValues(constructorArgumentValues);
beanDefinition.setTargetType(ResolvableType.forClassWithGenerics(beanDefinition.getBeanClass(), mapperInterface));
}
}
}

View File

@ -40,6 +40,9 @@ public interface ShareFileMapper {
@Select("select * from share_file where sharer=#{userid}")
ShareFile[] selectAllShareFileByUserid(int userid);
@Select("select count(*) from share_file_download_record where share_code=#{shareCode} and ip=#{ip}")
int isDownloadBefore(@Param("shareCode") String shareCode, @Param("ip") String ip);
@Update("update share_file set expire_time=#{expireTime}, available_count=#{availableCount}, total_count=#{totalCount} " +
"where share_code = #{shareCode}")
void updateShareFile(ShareFile shareFile);

View File

@ -1028,7 +1028,7 @@ public class FileService {
try(TarArchiveInputStream tarInput = new TarArchiveInputStream(new BufferedInputStream(new FileInputStream(storagePath + task.getRelativePath() + task.getSourcePath()))))
{
TarArchiveEntry entry;
while ((entry = tarInput.getNextTarEntry()) != null) {
while ((entry = tarInput.getNextEntry()) != null) {
if (entry.isDirectory()) {
// 如果是目录创建相应的目录结构
File dir = new File(storagePath + task.getRelativePath() + task.getTargetPath(), entry.getName());
@ -1135,13 +1135,20 @@ public class FileService {
}
//判断文件是否存在
if(!new File(shareFile.getFilePath()).isFile()){
File file = new File(shareFile.getFilePath());
if(!file.isFile()){
try {
httpResponse.sendError(404, "File is not exist");
return;
} catch (IOException e) {throw new RuntimeException(e);}
}
//如果该文件被新ip下载通知进行tg推送
if(shareFileMapper.isDownloadBefore(shareCode, ip) == 0){
String message = "文件:" + file.getName() + "\n被新ip:" + ip + "下载\n归属地:" + CustomUtil.getLocationByIp(ip);
CustomUtil.notifyMe(message);
}
//ipAndShareCode为下载ip+shareCode如果包含的话则说明这个ip不是第一次下载这个文件了
if(ipAndShareCode.containsKey(ip+shareCode)) {
long before = ipAndShareCode.get(ip+shareCode);

View File

@ -9,11 +9,19 @@ import com.lion.sns.message.PairMessage;
import com.lion.sns.pojo.Site;
import com.lion.sns.pojo.User;
import lombok.Data;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;
import org.springframework.util.DigestUtils;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
@ -222,4 +230,33 @@ public class CustomUtil {
return size.get();
}
public static void notifyMe(String message){
try (HttpClient httpClient = HttpClient.newHttpClient()) {
HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("https://personal.lionwebsite.xyz/message2me?AuthCode=alone&message=" + URLEncoder.encode(message, Charset.defaultCharset()))).POST(HttpRequest.BodyPublishers.noBody()).build();
httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
} catch (IOException | InterruptedException e) {
System.out.println("发送消息:" + message + " 失败");
throw new RuntimeException(e);
}
}
public static String getLocationByIp(String ip){
String location;
try (HttpClient httpClient = HttpClient.newHttpClient()){
HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("https://www.ip138.com/iplookup.php?ip=" + ip))
.headers("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8").GET().build();
String page = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()).body();
Elements tds = Jsoup.parse(page).select("body > div > div.container > div.content > div > div:nth-child(2) > div.group-left > div > div.bd > div.table-outer > div.table-box > table > tbody > tr > td");
if(tds.size() > 3)
location = tds.get(1).text().replace("中国", "") + " " + tds.get(3).text().trim();
else
location = tds.get(1).text();
}catch (Exception e){
System.out.println("获取ip地址信息失败: " + e.getMessage());
location = "unknown";
}
return location;
}
}