增加第二个数据库用于存放缓存相关数据;移除部分残留代码;规范化Request方法,更新UA;优化部分代码;

This commit is contained in:
chuzhongzai 2023-12-23 01:10:23 +08:00
parent e1afc3a6c5
commit 9df2b7994b
36 changed files with 148 additions and 241 deletions

View File

@ -7,15 +7,15 @@ import com.pengrad.telegrambot.model.Chat;
import com.pengrad.telegrambot.model.Message;
import com.pengrad.telegrambot.model.MessageEntity;
import com.pengrad.telegrambot.response.SendResponse;
import com.sun.tools.javac.Main;
import com.zaxxer.hikari.HikariConfig;
import org.springframework.aot.hint.annotation.RegisterReflectionForBinding;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.pengrad.telegrambot.model.User;
@Configuration
@RegisterReflectionForBinding(classes = {CRC32Cache.class, CustomConfiguration.class,
GalleryForQuery.class, Gallery.class, GalleryTask.class, MaskDomain.class,
@RegisterReflectionForBinding(classes = {CustomConfiguration.class,
GalleryForQuery.class, Gallery.class, GalleryTask.class, HikariConfig.class,
PageNameCache.class, ShareFile.class, Tag.class, TagMark.class, User.class,
SendResponse.class, Message.class, com.pengrad.telegrambot.model.User.class,
Chat.class, MessageEntity.class,

View File

@ -1,11 +1,8 @@
package com.lion.lionwebsite.Configuration;
import com.lion.lionwebsite.Domain.MaskDomain;
import com.lion.lionwebsite.Interceptor.HumanInterceptor;
import com.lion.lionwebsite.Interceptor.PersonalInterceptor;
import com.lion.lionwebsite.Interceptor.TaskHandlerInterceptor;
import com.lion.lionwebsite.Util.CustomUtil;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
@ -36,14 +33,4 @@ public class InterceptorConfiguration implements WebMvcConfigurer {
public HandlerInterceptor getHumanInterceptor(){
return new HumanInterceptor();
}
@Bean
public CustomUtil getParameterUtil(){
CustomUtil customUtil = new CustomUtil();
MaskDomain[] maskDomains = new MaskDomain[2];
maskDomains[0] = new MaskDomain("exhentai.org", "element-plus.org");
maskDomains[1] = new MaskDomain("e-hentai.org", "element.org");
customUtil.setMaskDomains(maskDomains);
return customUtil;
}
}

View File

@ -0,0 +1,51 @@
package com.lion.lionwebsite.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class SqlConfiguration {
@Bean(name = "datasource-main")
@ConfigurationProperties(prefix = "spring.datasource-main")
public DataSource dataSourceMain() {
return DataSourceBuilder.create().build();
}
@Bean(name = "datasource-cache")
@ConfigurationProperties(prefix = "spring.datasource-cache")
public DataSource dataSourceCache() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory-main")
public SqlSessionFactory sqlSessionFactoryMain(@Qualifier("datasource-main") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
return sessionFactoryBean.getObject();
}
@Bean(name = "sqlSessionFactory-cache")
public SqlSessionFactory sqlSessionFactoryCache(@Qualifier("datasource-cache") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
return sessionFactoryBean.getObject();
}
@Bean(name = "sqlSessionTemplate-main")
public SqlSessionTemplate sqlSessionTemplateMain(@Qualifier("sqlSessionFactory-main") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "sqlSessionTemplate-cache")
public SqlSessionTemplate sqlSessionTemplateCache(@Qualifier("sqlSessionFactory-cache") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

View File

@ -3,15 +3,12 @@ package com.lion.lionwebsite.Controller;
import com.lion.lionwebsite.Service.CollectService;
import com.lion.lionwebsite.Service.GalleryManageService;
import com.lion.lionwebsite.Service.UserServiceImpl;
import com.lion.lionwebsite.Util.CustomUtil;
import com.lion.lionwebsite.Util.Response;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@ -22,14 +19,11 @@ public class GalleryManageController {
CollectService collectService;
CustomUtil customUtil;
UserServiceImpl userService;
public GalleryManageController(GalleryManageService galleryManageService, CollectService collectService, CustomUtil customUtil, UserServiceImpl userService) {
public GalleryManageController(GalleryManageService galleryManageService, CollectService collectService, UserServiceImpl userService) {
this.galleryManageService = galleryManageService;
this.collectService = collectService;
this.customUtil = customUtil;
this.userService = userService;
}
@ -73,7 +67,7 @@ public class GalleryManageController {
return galleryManageService.selectGalleryByDownloader(AuthCode);
}
default -> {
return Response._default();
return Response._failure("参数错误");
}
}
}

View File

@ -1,26 +0,0 @@
package com.lion.lionwebsite.Dao;
import com.lion.lionwebsite.Domain.CRC32Cache;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface CRC32CacheMapper {
@Insert("insert into CRC32Cache (path, lastModifyTime, crc32) values (#{path}, #{lastModifyTime}, #{crc32})")
void insertCache(CRC32Cache crc32Cache);
@Select("select * from CRC32Cache where path=#{path}")
CRC32Cache selectCache(String path);
@Select("select * from CRC32Cache where path like '%' || #{name} || '%'")
CRC32Cache selectCacheByName(String name);
// @Update("update CRC32Cache set lastModifyTime=#{lastModifyTime}, crc32=#{crc32} where path=#{path}")
// void updateCache(CRC32Cache crc32Cache);
@Delete("delete from CRC32Cache where path=#{path}")
void deleteCacheByPath(String path);
}

View File

@ -1,4 +1,4 @@
package com.lion.lionwebsite.Dao;
package com.lion.lionwebsite.Dao.cache;
import com.lion.lionwebsite.Domain.PageNameCache;
import org.apache.ibatis.annotations.*;
@ -17,6 +17,6 @@ public interface PageNameCacheMapper {
@Delete("delete from pageName where gid=#{gid}")
void deletePageNameByGid(int gid);
@Delete("delete from pageName where gid=#{gid} and page=#{page}")
void deletePageName(PageNameCache pageNameCache);
// @Delete("delete from pageName where gid=#{gid} and page=#{page}")
// void deletePageName(PageNameCache pageNameCache);
}

View File

@ -1,4 +1,4 @@
package com.lion.lionwebsite.Dao;
package com.lion.lionwebsite.Dao.normal;
import org.apache.ibatis.annotations.*;

View File

@ -1,4 +1,4 @@
package com.lion.lionwebsite.Dao;
package com.lion.lionwebsite.Dao.normal;
import com.lion.lionwebsite.Domain.CustomConfiguration;
import org.apache.ibatis.annotations.Mapper;

View File

@ -1,4 +1,4 @@
package com.lion.lionwebsite.Dao;
package com.lion.lionwebsite.Dao.normal;
import com.lion.lionwebsite.Domain.Gallery;
import org.apache.ibatis.annotations.*;

View File

@ -1,4 +1,4 @@
package com.lion.lionwebsite.Dao;
package com.lion.lionwebsite.Dao.normal;
import com.lion.lionwebsite.Domain.ShareFile;
import org.apache.ibatis.annotations.*;

View File

@ -1,4 +1,4 @@
package com.lion.lionwebsite.Dao;
package com.lion.lionwebsite.Dao.normal;
import com.lion.lionwebsite.Domain.SubBind;
import com.lion.lionwebsite.Domain.SubUpdateRecord;

View File

@ -1,4 +1,4 @@
package com.lion.lionwebsite.Dao;
package com.lion.lionwebsite.Dao.normal;
import com.lion.lionwebsite.Domain.Tag;
import com.lion.lionwebsite.Domain.TagMark;

View File

@ -1,4 +1,4 @@
package com.lion.lionwebsite.Dao;
package com.lion.lionwebsite.Dao.normal;
import com.lion.lionwebsite.Domain.User;
import org.apache.ibatis.annotations.*;

View File

@ -1,14 +0,0 @@
package com.lion.lionwebsite.Domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CRC32Cache {
String path;
long lastModifyTime;
String crc32;
}

View File

@ -1,11 +0,0 @@
package com.lion.lionwebsite.Domain;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class MaskDomain {
String raw;
String mask;
}

View File

@ -1,6 +1,6 @@
package com.lion.lionwebsite.Filter;
import com.lion.lionwebsite.Dao.UserMapper;
import com.lion.lionwebsite.Dao.normal.UserMapper;
import com.lion.lionwebsite.Util.CustomUtil;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;

View File

@ -1,9 +1,10 @@
package com.lion.lionwebsite.Interceptor;
import com.lion.lionwebsite.Dao.UserMapper;
import com.lion.lionwebsite.Dao.normal.UserMapper;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@ -14,7 +15,7 @@ public class TaskHandlerInterceptor implements HandlerInterceptor {
@Resource
UserMapper userMapper;
String[] AuthCodes = null;
String[] AuthCodes;
public TaskHandlerInterceptor(UserMapper userMapper) {
this.userMapper = userMapper;
@ -22,7 +23,7 @@ public class TaskHandlerInterceptor implements HandlerInterceptor {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
public boolean preHandle(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler){
String auth = request.getParameter("AuthCode");
if(auth != null)

View File

@ -1,6 +1,8 @@
package com.lion.lionwebsite;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.annotation.MapperScans;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ -9,6 +11,10 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
@ServletComponentScan(value = "com.lion.lionwebsite.Filter")
@MapperScans({
@MapperScan(basePackages = "com.lion.lionwebsite.Dao.normal", sqlSessionTemplateRef = "sqlSessionTemplate-main", sqlSessionFactoryRef = "sqlSessionFactory-main"),
@MapperScan(basePackages = "com.lion.lionwebsite.Dao.cache", sqlSessionTemplateRef = "sqlSessionTemplate-cache", sqlSessionFactoryRef = "sqlSessionFactory-cache")
})
public class LionWebsiteApplication {
public static void main(String[] args) {

View File

@ -1,6 +1,6 @@
package com.lion.lionwebsite.Service;
import com.lion.lionwebsite.Dao.CollectMapper;
import com.lion.lionwebsite.Dao.normal.CollectMapper;
import com.lion.lionwebsite.Util.Response;
import lombok.Data;
import org.springframework.stereotype.Service;

View File

@ -2,7 +2,8 @@ package com.lion.lionwebsite.Service;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RandomUtil;
import com.lion.lionwebsite.Dao.*;
import com.lion.lionwebsite.Dao.cache.PageNameCacheMapper;
import com.lion.lionwebsite.Dao.normal.*;
import com.lion.lionwebsite.Domain.*;
import com.lion.lionwebsite.Exception.ResolutionNotMatchException;
import com.lion.lionwebsite.Error.ErrorCode;

View File

@ -1,8 +1,8 @@
package com.lion.lionwebsite.Service;
import com.lion.lionwebsite.Dao.CustomConfigurationMapper;
import com.lion.lionwebsite.Dao.GalleryMapper;
import com.lion.lionwebsite.Dao.ShareFileMapper;
import com.lion.lionwebsite.Dao.normal.CustomConfigurationMapper;
import com.lion.lionwebsite.Dao.normal.GalleryMapper;
import com.lion.lionwebsite.Dao.normal.ShareFileMapper;
import com.lion.lionwebsite.Domain.CustomConfiguration;
import com.lion.lionwebsite.Domain.ShareFile;
import com.lion.lionwebsite.Util.CustomUtil;
@ -29,8 +29,6 @@ import static java.nio.file.FileVisitResult.CONTINUE;
@Service
@Data
public class LocalServiceImpl{
String fires = "https://api.dler.io/sub?target=clash&new_name=true&url=https%3A%2F%2Ffast.losadhwselfff2332dasd.xyz%2Flink%2Fz0pfwyTvC5naXkbb%3Fclash%3D1&insert=false&config=https%3A%2F%2Fraw.githubusercontent.com%2FACL4SSR%2FACL4SSR%2Fmaster%2FClash%2Fconfig%2FACL4SSR_Online.ini";
String DouNaiClash = "https://aaaa.gay/link/X7zEqkIx5gtIGugO?client=clashmeta";
String DouNaiV2ray = "https://aaaa.gay/link/X7zEqkIx5gtIGugO?client=v2";
@ -81,8 +79,6 @@ public class LocalServiceImpl{
return false;
}
File mixin = new File("sub/sub.txt");
File firesFile = new File("sub/fires.txt");
File DouNaiClashFile = new File("sub/DouNaiClash.txt");
File DouNaiV2rayFile = new File("sub/DouNaiV2ray.txt");
File directory = new File("sub");
@ -90,31 +86,17 @@ public class LocalServiceImpl{
if(!directory.isDirectory())
Files.createDirectory(Paths.get("sub"));
List<String> fires_profile = null;
List<String> DouNaiClash_profile = null;
OutputStream outputStream;
//下载薯条订阅
try(FileWriter writer = new FileWriter(firesFile)) {
fires_profile = Get(fires);
for (String i : fires_profile)
writer.write(i + "\n");
System.out.println("load fires complete");
}catch (IOException e) {
e.printStackTrace();
System.out.println("load fires failure");
}
List<String> DouNaiClash_profile;
//下载豆奶v2ray订阅
try(FileWriter writer = new FileWriter(DouNaiV2rayFile)) {
String DouNaiV2rayRaw = Get(DouNaiV2ray).get(0);
String DouNaiV2rayRaw = Get(DouNaiV2ray).getFirst();
String[] v2rayPlain = new String(Base64.getDecoder().decode(DouNaiV2rayRaw)).split("\n");
StringBuilder stringBuilder = new StringBuilder();
//过滤高倍率节点
for(String node: v2rayPlain){
String name = URLDecoder.decode(node.split("#")[1], StandardCharsets.UTF_8);
if(name.startsWith("") && name.contains("流量")){
if(name.startsWith("") && name.contains("流量")){
float ratio = Float.parseFloat(name.substring(name.indexOf("(") + 1, name.indexOf(")")).replace("倍流量", ""));
if(ratio <= 1)
stringBuilder.append(node).append("\n");
@ -163,44 +145,6 @@ public class LocalServiceImpl{
System.out.println("load DouNai clash failure");
}
//处理合并
assert DouNaiClash_profile != null;
int side_start = DouNaiClash_profile.indexOf("proxies:");
int side_end = DouNaiClash_profile.indexOf("proxy-groups:");
List<String> side_proxy = new ArrayList<>();
List<String> side_name = new ArrayList<>();
for (int i = side_start + 1; i < side_end; i++) {
side_proxy.add(DouNaiClash_profile.get(i));
if (DouNaiClash_profile.get(i).contains("name"))
side_name.add(DouNaiClash_profile.get(i).replace("name:", ""));
}
List<String> final_profile = new ArrayList<>();
assert fires_profile != null;
for (String i : fires_profile) {
if (i.equals("proxy-groups:"))
final_profile.addAll(side_proxy);
final_profile.add(i);
if (i.equals("proxy-groups:")) {
final_profile.add(" -");
final_profile.add(" name: e站流量");
final_profile.add(" type: select");
final_profile.add(" proxies:");
for (String x : side_name)
final_profile.add(" " + x);
}
if (i.equals("rules:"))
final_profile.add(" - DOMAIN-KEYWORD,hentai,e站流量");
}
outputStream = Files.newOutputStream(mixin.toPath());
for(String i: final_profile)
outputStream.write((i + "\n").getBytes(StandardCharsets.UTF_8));
outputStream.close();
configurationMapper.updateConfiguration(CustomConfiguration.LAST_UPDATE_SUB_TIME, dateTimeFormatter.format(LocalDateTime.now()));
return true;
}

View File

@ -3,9 +3,9 @@ package com.lion.lionwebsite.Service;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RandomUtil;
import com.lion.lionwebsite.Dao.CustomConfigurationMapper;
import com.lion.lionwebsite.Dao.ShareFileMapper;
import com.lion.lionwebsite.Dao.UserMapper;
import com.lion.lionwebsite.Dao.normal.CustomConfigurationMapper;
import com.lion.lionwebsite.Dao.normal.ShareFileMapper;
import com.lion.lionwebsite.Dao.normal.UserMapper;
import com.lion.lionwebsite.Domain.CustomConfiguration;
import com.lion.lionwebsite.Domain.ShareFile;
import com.lion.lionwebsite.Interceptor.TaskHandlerInterceptor;
@ -22,7 +22,6 @@ import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

View File

@ -1,9 +1,9 @@
package com.lion.lionwebsite.Service;
import com.lion.lionwebsite.Dao.CustomConfigurationMapper;
import com.lion.lionwebsite.Dao.normal.CustomConfigurationMapper;
import com.lion.lionwebsite.Dao.ShareFileMapper;
import com.lion.lionwebsite.Dao.UserMapper;
import com.lion.lionwebsite.Dao.normal.ShareFileMapper;
import com.lion.lionwebsite.Dao.normal.UserMapper;
import com.lion.lionwebsite.Domain.CustomConfiguration;
import com.lion.lionwebsite.Domain.ShareFile;
import com.lion.lionwebsite.Domain.User;
@ -23,6 +23,8 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Calendar;
@ -129,7 +131,7 @@ public class PublicServiceImpl {
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(imageBytes);
outputStream.close();
}catch (IOException e){
}catch (IOException | URISyntaxException e){
e.printStackTrace();
try {
response.sendError(503);
@ -139,8 +141,8 @@ public class PublicServiceImpl {
}
}
public static byte[] getImageBytesFromUrl(String imageUrl) throws IOException {
URL url = new URL(imageUrl);
public static byte[] getImageBytesFromUrl(String imageUrl) throws IOException, URISyntaxException {
URL url = new URI(imageUrl).toURL();
InputStream inputStream = null;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

View File

@ -121,8 +121,8 @@ public class QueryService {
public String requests(String url, boolean isDirect, HttpServletResponse response, OutputStream local) throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse httpResponse;
HashMap<String, String> headers = new HashMap<>();
HashMap<String, String> headers = new HashMap<>();
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
headers.put("Upgrade-Insecure-Requests", "1");

View File

@ -1,6 +1,6 @@
package com.lion.lionwebsite.Service;
import com.lion.lionwebsite.Dao.GalleryMapper;
import com.lion.lionwebsite.Dao.normal.GalleryMapper;
import com.lion.lionwebsite.Domain.Gallery;
import com.lion.lionwebsite.Domain.GalleryTask;
import com.lion.lionwebsite.Message.*;

View File

@ -1,7 +1,7 @@
package com.lion.lionwebsite.Service;
import cn.hutool.core.util.RandomUtil;
import com.lion.lionwebsite.Dao.SubMapper;
import com.lion.lionwebsite.Dao.normal.SubMapper;
import com.lion.lionwebsite.Domain.SubBind;
import com.lion.lionwebsite.Domain.SubUpdateRecord;
import com.lion.lionwebsite.Util.CustomUtil;

View File

@ -1,12 +1,11 @@
package com.lion.lionwebsite.Service;
import com.lion.lionwebsite.Dao.GalleryMapper;
import com.lion.lionwebsite.Dao.TagMapper;
import com.lion.lionwebsite.Dao.normal.GalleryMapper;
import com.lion.lionwebsite.Dao.normal.TagMapper;
import com.lion.lionwebsite.Domain.Gallery;
import com.lion.lionwebsite.Domain.Tag;
import com.lion.lionwebsite.Util.Response;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.ArrayList;

View File

@ -1,8 +1,8 @@
package com.lion.lionwebsite.Service;
import com.lion.lionwebsite.Dao.CollectMapper;
import com.lion.lionwebsite.Dao.GalleryMapper;
import com.lion.lionwebsite.Dao.UserMapper;
import com.lion.lionwebsite.Dao.normal.CollectMapper;
import com.lion.lionwebsite.Dao.normal.GalleryMapper;
import com.lion.lionwebsite.Dao.normal.UserMapper;
import com.lion.lionwebsite.Domain.User;
import com.lion.lionwebsite.Interceptor.TaskHandlerInterceptor;
import com.lion.lionwebsite.Util.CustomUtil;

View File

@ -1,14 +1,11 @@
package com.lion.lionwebsite.Util;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lion.lionwebsite.Domain.MaskDomain;
import jakarta.servlet.http.HttpServletResponse;
import lombok.Data;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.ServerSocket;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.regex.Matcher;
@ -28,8 +25,6 @@ public class CustomUtil {
public static ObjectMapper objectMapper = new ObjectMapper();
private MaskDomain[] maskDomains;
public static String fileSizeToString(long fileSize){
if (fileSize < ONE_KB) {
return fileSize + "B";

View File

@ -2,12 +2,12 @@ package com.lion.lionwebsite.Util;
import com.lion.lionwebsite.Domain.Gallery;
import com.lion.lionwebsite.Exception.ResolutionNotMatchException;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;
@ -19,11 +19,8 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
@Slf4j
public class GalleryUtil {
static String EX_HENTAI = "https://exhentai.org";
static String E_HENTAI = "https://e-hentai.org";
public class GalleryUtil {
static String POST = "post";
static String GET = "get";
@ -59,7 +56,7 @@ public class GalleryUtil {
gallery.setProceeding(0);
//访问本子页面
String galleryPage = requests(url, null, GET, null);
String galleryPage = requests(url, GET, null, null);
Document galleryDoc = Jsoup.parse(galleryPage);
//收集本子基本信息
@ -69,10 +66,6 @@ public class GalleryUtil {
gallery.setFileSize(CustomUtil.stringToFileSize(galleryDoc.select("#gdd > table > tbody > tr:nth-child(5) > td.gdt2").text().replace(" ", "")));
gallery.setDisplayFileSize(CustomUtil.fileSizeToString(gallery.getFileSize()));
String thumb_link = galleryDoc.select("#gd1 > div").get(0).attr("style");
thumb_link = thumb_link.substring(thumb_link.indexOf("url(") + 4, thumb_link.lastIndexOf(")")).replace("https://s.exhentai.org/t", "");
gallery.setThumb_link(thumb_link);
//查找下载页面链接并初始化参数
String download_link = galleryDoc.select("#gd5 > p:nth-child(2) > a").attr("onclick").split("'")[1];
HashMap<String, String> extraProperties = new HashMap<>();
@ -81,7 +74,7 @@ public class GalleryUtil {
//访问下载页面获取分辨率
String downloadPage = requests(download_link, extraProperties, GET, null);
String downloadPage = requests(download_link, GET, extraProperties, null);
Document downloadDoc = Jsoup.parse(downloadPage);
Elements resolutions = downloadDoc.select("#db > div > table > tbody > tr > td");
download_link = downloadDoc.select("#hathdl_form").attr("action");
@ -126,9 +119,11 @@ public class GalleryUtil {
gallery.setResolution(targetResolution);
gallery.setFileSize(CustomUtil.stringToFileSize(availableResolution.get(targetResolution).replace(" ", "")));
gallery.setDisplayFileSize(CustomUtil.fileSizeToString(gallery.getFileSize()));
//提交下载请求
downloadPage = requests(download_link, extraProperties, POST, targetResolution);
HashMap<String, String> body = new HashMap<>();
body.put("hathdl_xres", targetResolution.replace("x", "").replace("Original", "org"));
downloadPage = requests(download_link, POST, extraProperties, body);
downloadDoc = Jsoup.parse(downloadPage);
//判断下载请求是否提交成功
@ -144,7 +139,7 @@ public class GalleryUtil {
public static String queryUpdateLink(String link) throws IOException{
String page = requests(link, null, GET, null);
String page = requests(link, GET, null, null);
Document document = Jsoup.parse(page);
Elements select = document.select("#gnd");
@ -166,40 +161,29 @@ public class GalleryUtil {
if(url.length() < 40)
return null;
if(!url.contains("/g/") || !url.contains("hentai"))
if(!url.contains("/g/") || !url.contains("exhentai"))
return null;
else if (url.contains(EX_HENTAI))
return EX_HENTAI;
else if (url.contains(E_HENTAI))
return E_HENTAI;
else{
System.out.println(url);
return null;
}
return "";
}
/**
* 自用request
* @param url 链接
* @param extraProperties 额外参数
* @param headers 额外参数
* @param method 请求方法
* @param targetResolution 目标分辨率
* @return 请求页面
* @throws IOException 可能会抛出IO错误
*/
public static String requests(String url, HashMap<String, String> extraProperties, String method, String targetResolution) throws IOException {
public static String requests(String url, String method, HashMap<String, String> headers, HashMap<String, String> body) throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse httpResponse;
HashMap<String, String> headers = new HashMap<>();
if(headers == null)
headers = new HashMap<>();
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36");
headers.put("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");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
headers.put("Upgrade-Insecure-Requests", "1");
if(url.contains("exhentai"))
headers.put("Cookie", "ipb_member_id=5774855; ipb_pass_hash=4b061c3abe25289568b5a8e0123fb3b9; igneous=cea2e08fb; sk=oye107wk02gtomb56x65dmv4qzbn; nw=1");
if(extraProperties != null)
headers.putAll(extraProperties);
headers.put("Cookie", "ipb_member_id=5774855; ipb_pass_hash=4b061c3abe25289568b5a8e0123fb3b9; igneous=cea2e08fb; sk=oye107wk02gtomb56x65dmv4qzbn; nw=1");
if(method.equals(GET)){
HttpGet httpGet = new HttpGet(url);
@ -214,11 +198,12 @@ public class GalleryUtil {
httpPost.addHeader(header.getKey(), header.getValue());
}
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
multipartEntityBuilder.addTextBody("hathdl_xres",
targetResolution.replace("x", "").replace("Original", "org"));
httpPost.setEntity(multipartEntityBuilder.build());
if(body != null) {
EntityBuilder entityBuilder = EntityBuilder.create();
entityBuilder.setContentType(ContentType.APPLICATION_JSON);
entityBuilder.setText(CustomUtil.objectMapper.writeValueAsString(body));
httpPost.setEntity(entityBuilder.build());
}
httpResponse = httpClient.execute(httpPost);
}
HttpEntity responseEntity = httpResponse.getEntity();

View File

@ -50,9 +50,10 @@ public class Response {
setResult("failure");
}
public void failure(String result){
public Response failure(String result){
failure();
setData(result);
return this;
}
public String getResult(){
@ -82,13 +83,6 @@ public class Response {
return response.toJSONString();
}
public static String _default(){
Response response = Response.generateResponse();
response.failure("参数错误");
return response.toJSONString();
}
public String toJSONString(){
return result.toString();
}

Binary file not shown.

View File

@ -6,9 +6,12 @@ server:
enabled: true
spring:
datasource:
datasource-main:
driver-class-name: org.sqlite.JDBC
url: jdbc:sqlite:/root/LionWebsite/LionWebsite.db
jdbc-url: jdbc:sqlite:/root/LionWebsite/LionWebsite.db
datasource-cache:
driver-class-name: org.sqlite.JDBC
jdbc-url: jdbc:sqlite:/root/LionWebsite/cache.db
mvc:
view:
prefix: /resources/templates/
@ -21,8 +24,6 @@ spring:
max-request-size: 10000MB
enabled: true
mybatis:
type-aliases-package: com.lion.lionwebsite.Dao
personal-service:
StoragePath: /storage/
@ -35,7 +36,6 @@ remote-service:
ip: 5.255.110.45
local-service:
fires: https://api.dler.io/sub?target=clash&new_name=true&url=https%3A%2F%2Ffast.losadhwselfff2332dasd.xyz%2Flink%2Fz0pfwyTvC5naXkbb%3Fclash%3D1&insert=false&config=https%3A%2F%2Fraw.githubusercontent.com%2FACL4SSR%2FACL4SSR%2Fmaster%2FClash%2Fconfig%2FACL4SSR_Online.ini
DouNaiClash: https://aaaa.gay/link/X7zEqkIx5gtIGugO?client=clashmeta
DouNaiV2ray: https://aaaa.gay/link/X7zEqkIx5gtIGugO?client=v2

BIN
src/main/resources/cache.db Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long