mirror of
https://github.com/LamGC/ContentGrabbingJi.git
synced 2025-07-02 21:37:26 +00:00
Compare commits
21 Commits
v2.5.2-202
...
v2.5.2-202
Author | SHA1 | Date | |
---|---|---|---|
4ccf2fafbc | |||
f1e58d72ac | |||
9242a1d474 | |||
065d21c4e4 | |||
5eab94c429 | |||
2dd62bb6c8 | |||
21613fe3c0 | |||
ca56b2c9ba | |||
e0f773639f | |||
75aa78a3d7 | |||
18a8ad95a1 | |||
438d0a95d3 | |||
6789b5b7c5 | |||
ad289f952f | |||
3ae0e4cd8d | |||
5550c7aef1 | |||
d4d3432c76 | |||
d1aeda012e | |||
683a38bc17 | |||
188309509b | |||
3915712337 |
@ -1,24 +0,0 @@
|
|||||||
搜索标签信息:https://www.pixiv.net/ajax/search/tags/标签名
|
|
||||||
|
|
||||||
搜索接口:
|
|
||||||
https://www.pixiv.net/ajax/search/{Type}/搜索内容
|
|
||||||
Type = illustrations(插画) / top(顶部?) / manga(漫画) / novels(小说)
|
|
||||||
|
|
||||||
word=搜索内容 [参数可能不是必须的]
|
|
||||||
s_mode=s_tag(标签-部分一致) / s_tag_full(标签-完全一致) / s_tc(标题、说明文字)
|
|
||||||
type= all(插画、漫画、动图_动态插图) / illust_and_ugoira(插画、动图) / illust(插画) / manga(漫画) / ugoira(动图)
|
|
||||||
p=页数 [超出页数的情况下将获取不到数据(即"body.illust.data"是空数组)]
|
|
||||||
order=date(按旧排序) / date_d(按新排序) / Unknown(按热门度排序, 需要会员)
|
|
||||||
mode= all(全部) / safe(全年龄) / r18(咳咳)
|
|
||||||
|
|
||||||
可选参数:
|
|
||||||
wlt=最小宽度像素
|
|
||||||
wgt=最高宽度像素
|
|
||||||
hlt=最小高度像素
|
|
||||||
hgt=最高高度像素
|
|
||||||
ratio=0.5(横图) / -0.5(纵图) / 0(正方形) [可能不能改变参数, 三个值是固定的]
|
|
||||||
tool=使用工具, 不是很重要晚些再加
|
|
||||||
scd=开始时间(yyyy-MM-dd)
|
|
||||||
ecd=结束时间(yyyy-MM-dd)
|
|
||||||
|
|
||||||
最小收藏数 = 收藏数限定参数为会员功能, 无法获取
|
|
9
pom.xml
9
pom.xml
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>net.lamgc</groupId>
|
<groupId>net.lamgc</groupId>
|
||||||
<artifactId>ContentGrabbingJi</artifactId>
|
<artifactId>ContentGrabbingJi</artifactId>
|
||||||
<version>2.5.2-20200606.1-SNAPSHOT</version>
|
<version>2.5.2-20200610.1-SNAPSHOT</version>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
@ -19,7 +19,7 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
|
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
|
||||||
<mirai.CoreVersion>1.0-RC2-1</mirai.CoreVersion>
|
<mirai.CoreVersion>1.0.2</mirai.CoreVersion>
|
||||||
<mirai.JaptVersion>1.1.1</mirai.JaptVersion>
|
<mirai.JaptVersion>1.1.1</mirai.JaptVersion>
|
||||||
<kotlin.version>1.3.71</kotlin.version>
|
<kotlin.version>1.3.71</kotlin.version>
|
||||||
<ktor.version>1.3.2</ktor.version>
|
<ktor.version>1.3.2</ktor.version>
|
||||||
@ -179,6 +179,11 @@
|
|||||||
<artifactId>gifencoder</artifactId>
|
<artifactId>gifencoder</artifactId>
|
||||||
<version>0.10.1</version>
|
<version>0.10.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jline</groupId>
|
||||||
|
<artifactId>jline</artifactId>
|
||||||
|
<version>3.15.0</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -93,7 +93,7 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Command
|
@Command
|
||||||
public static void consoleMode() {
|
public static void consoleMode() throws IOException {
|
||||||
ConsoleMain.start();
|
ConsoleMain.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,6 +271,7 @@ public class BotAdminCommandProcess {
|
|||||||
|
|
||||||
AutoSender sender = new RandomRankingArtworksSender(
|
AutoSender sender = new RandomRankingArtworksSender(
|
||||||
MessageSenderBuilder.getMessageSender(MessageSource.Group, id),
|
MessageSenderBuilder.getMessageSender(MessageSource.Group, id),
|
||||||
|
id,
|
||||||
rankingStart,
|
rankingStart,
|
||||||
rankingEnd,
|
rankingEnd,
|
||||||
rankingMode, rankingContentType,
|
rankingMode, rankingContentType,
|
||||||
|
@ -14,8 +14,6 @@ import net.lamgc.cgj.pixiv.PixivDownload;
|
|||||||
import net.lamgc.cgj.pixiv.PixivDownload.PageQuality;
|
import net.lamgc.cgj.pixiv.PixivDownload.PageQuality;
|
||||||
import net.lamgc.cgj.pixiv.PixivSearchBuilder;
|
import net.lamgc.cgj.pixiv.PixivSearchBuilder;
|
||||||
import net.lamgc.cgj.pixiv.PixivURL;
|
import net.lamgc.cgj.pixiv.PixivURL;
|
||||||
import net.lamgc.cgj.pixiv.PixivURL.RankingContentType;
|
|
||||||
import net.lamgc.cgj.pixiv.PixivURL.RankingMode;
|
|
||||||
import net.lamgc.utils.base.runner.Argument;
|
import net.lamgc.utils.base.runner.Argument;
|
||||||
import net.lamgc.utils.base.runner.Command;
|
import net.lamgc.utils.base.runner.Command;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -257,13 +255,34 @@ public class BotCommandProcess {
|
|||||||
* 随机获取一副作品
|
* 随机获取一副作品
|
||||||
*/
|
*/
|
||||||
@Command(commandName = "random")
|
@Command(commandName = "random")
|
||||||
public static String randomImage() {
|
public static String randomImage(
|
||||||
|
@Argument(name = "$fromGroup") long fromGroup,
|
||||||
|
@Argument(force = false, name = "mode", defaultValue = "DAILY") String contentMode,
|
||||||
|
@Argument(force = false, name = "type", defaultValue = "ILLUST") String contentType) {
|
||||||
|
PixivURL.RankingMode mode;
|
||||||
|
try {
|
||||||
|
String rankingModeValue = contentMode.toUpperCase();
|
||||||
|
mode = PixivURL.RankingMode.valueOf(rankingModeValue.startsWith("MODE_") ?
|
||||||
|
rankingModeValue : "MODE_" + rankingModeValue);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
log.warn("无效的RankingMode值: {}", contentMode);
|
||||||
|
return "参数无效, 请查看帮助信息";
|
||||||
|
}
|
||||||
|
|
||||||
|
PixivURL.RankingContentType type;
|
||||||
|
try {
|
||||||
|
String contentTypeValue = contentType.toUpperCase();
|
||||||
|
type = PixivURL.RankingContentType.valueOf(
|
||||||
|
contentTypeValue.startsWith("TYPE_") ? contentTypeValue : "TYPE_" + contentTypeValue);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
log.warn("无效的RankingContentType值: {}", contentType);
|
||||||
|
return "参数无效, 请查看帮助信息";
|
||||||
|
}
|
||||||
|
|
||||||
BufferMessageEvent event = new BufferMessageEvent();
|
BufferMessageEvent event = new BufferMessageEvent();
|
||||||
RandomRankingArtworksSender artworksSender =
|
RandomRankingArtworksSender artworksSender =
|
||||||
new RandomRankingArtworksSender(event, 1, 200,
|
new RandomRankingArtworksSender(event, fromGroup, 1, 200, mode, type,
|
||||||
RankingMode.MODE_MALE,
|
PageQuality.ORIGINAL);
|
||||||
RankingContentType.TYPE_ALL,
|
|
||||||
PageQuality.ORIGINAL);
|
|
||||||
artworksSender.send();
|
artworksSender.send();
|
||||||
return event.getBufferMessage();
|
return event.getBufferMessage();
|
||||||
}
|
}
|
||||||
@ -289,7 +308,7 @@ public class BotCommandProcess {
|
|||||||
@Argument(name = "area", force = false) String area,
|
@Argument(name = "area", force = false) String area,
|
||||||
@Argument(name = "in", force = false) String includeKeywords,
|
@Argument(name = "in", force = false) String includeKeywords,
|
||||||
@Argument(name = "ex", force = false) String excludeKeywords,
|
@Argument(name = "ex", force = false) String excludeKeywords,
|
||||||
@Argument(name = "contentOption", force = false) String contentOption,
|
@Argument(name = "option", force = false) String contentOption,
|
||||||
@Argument(name = "page", force = false, defaultValue = "1") int pagesIndex
|
@Argument(name = "page", force = false, defaultValue = "1") int pagesIndex
|
||||||
) throws IOException {
|
) throws IOException {
|
||||||
log.info("正在执行搜索...");
|
log.info("正在执行搜索...");
|
||||||
@ -458,6 +477,16 @@ public class BotCommandProcess {
|
|||||||
log.warn("缓存删除完成.");
|
log.warn("缓存删除完成.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Command(commandName = "image")
|
||||||
|
public static String getImageById(
|
||||||
|
@Argument(name = "$fromGroup") long fromGroup,
|
||||||
|
@Argument(name = "id") int illustId,
|
||||||
|
@Argument(name = "quality", force = false) PixivDownload.PageQuality quality,
|
||||||
|
@Argument(name = "page", force = false, defaultValue = "1") int pageIndex
|
||||||
|
) {
|
||||||
|
return CacheStoreCentral.getImageById(fromGroup, illustId, quality, pageIndex);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 举报某一作品
|
* 举报某一作品
|
||||||
* @param fromGroup 来源群(系统提供)
|
* @param fromGroup 来源群(系统提供)
|
||||||
|
@ -19,6 +19,7 @@ import java.util.Random;
|
|||||||
public class RandomRankingArtworksSender extends AutoSender {
|
public class RandomRankingArtworksSender extends AutoSender {
|
||||||
|
|
||||||
private final Logger log;
|
private final Logger log;
|
||||||
|
private final long groupId;
|
||||||
private final int rankingStart;
|
private final int rankingStart;
|
||||||
private final int rankingStop;
|
private final int rankingStop;
|
||||||
private final PixivURL.RankingMode mode;
|
private final PixivURL.RankingMode mode;
|
||||||
@ -35,8 +36,37 @@ public class RandomRankingArtworksSender extends AutoSender {
|
|||||||
* @param quality 图片质量, 详见{@link PixivDownload.PageQuality}
|
* @param quality 图片质量, 详见{@link PixivDownload.PageQuality}
|
||||||
* @throws IndexOutOfBoundsException 当 rankingStart > rankingStop时抛出
|
* @throws IndexOutOfBoundsException 当 rankingStart > rankingStop时抛出
|
||||||
*/
|
*/
|
||||||
public RandomRankingArtworksSender(MessageSender messageSender, int rankingStart, int rankingStop, PixivURL.RankingMode mode, PixivURL.RankingContentType contentType, PixivDownload.PageQuality quality) {
|
public RandomRankingArtworksSender(
|
||||||
|
MessageSender messageSender,
|
||||||
|
int rankingStart,
|
||||||
|
int rankingStop,
|
||||||
|
PixivURL.RankingMode mode,
|
||||||
|
PixivURL.RankingContentType contentType,
|
||||||
|
PixivDownload.PageQuality quality) {
|
||||||
|
this(messageSender, 0, rankingStart, rankingStop, mode, contentType, quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造一个推荐作品发送器
|
||||||
|
* @param messageSender 消息发送器
|
||||||
|
* @param groupId 群组Id, 如果发送目标为群组, 则可设置群组Id, 以使用群组配置.
|
||||||
|
* @param rankingStart 排行榜开始范围(从1开始, 名次),如传入0或负数则为默认值,默认为1
|
||||||
|
* @param rankingStop 排名榜结束范围(包括该名次),如传入0或负数则为默认值,默认为150
|
||||||
|
* @param mode 排行榜模式
|
||||||
|
* @param contentType 排行榜内容类型
|
||||||
|
* @param quality 图片质量, 详见{@link PixivDownload.PageQuality}
|
||||||
|
* @throws IndexOutOfBoundsException 当 rankingStart > rankingStop时抛出
|
||||||
|
*/
|
||||||
|
public RandomRankingArtworksSender(
|
||||||
|
MessageSender messageSender,
|
||||||
|
long groupId,
|
||||||
|
int rankingStart,
|
||||||
|
int rankingStop,
|
||||||
|
PixivURL.RankingMode mode,
|
||||||
|
PixivURL.RankingContentType contentType,
|
||||||
|
PixivDownload.PageQuality quality) {
|
||||||
super(messageSender);
|
super(messageSender);
|
||||||
|
this.groupId = groupId;
|
||||||
this.mode = mode;
|
this.mode = mode;
|
||||||
this.contentType = contentType;
|
this.contentType = contentType;
|
||||||
log = LoggerFactory.getLogger(this.toString());
|
log = LoggerFactory.getLogger(this.toString());
|
||||||
@ -78,7 +108,7 @@ public class RandomRankingArtworksSender extends AutoSender {
|
|||||||
JsonObject rankingInfo = rankingList.get(0);
|
JsonObject rankingInfo = rankingList.get(0);
|
||||||
int illustId = rankingInfo.get("illust_id").getAsInt();
|
int illustId = rankingInfo.get("illust_id").getAsInt();
|
||||||
if(BotCommandProcess.isNoSafe(illustId,
|
if(BotCommandProcess.isNoSafe(illustId,
|
||||||
SettingProperties.getProperties(SettingProperties.GLOBAL), false)) {
|
SettingProperties.getProperties(groupId), false)) {
|
||||||
log.warn("作品为r18作品, 取消本次发送.");
|
log.warn("作品为r18作品, 取消本次发送.");
|
||||||
return;
|
return;
|
||||||
} else if(BotCommandProcess.isReported(illustId)) {
|
} else if(BotCommandProcess.isReported(illustId)) {
|
||||||
|
@ -8,7 +8,9 @@ import org.apache.http.HttpHost;
|
|||||||
import org.apache.http.client.CookieStore;
|
import org.apache.http.client.CookieStore;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import redis.clients.jedis.Jedis;
|
||||||
import redis.clients.jedis.JedisPool;
|
import redis.clients.jedis.JedisPool;
|
||||||
|
import redis.clients.jedis.exceptions.JedisConnectionException;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -56,6 +58,12 @@ public final class BotGlobal {
|
|||||||
this.redisServer = new JedisPool(
|
this.redisServer = new JedisPool(
|
||||||
getRedisUri().getHost(),
|
getRedisUri().getHost(),
|
||||||
getRedisUri().getPort() == -1 ? 6379 : getRedisUri().getPort());
|
getRedisUri().getPort() == -1 ? 6379 : getRedisUri().getPort());
|
||||||
|
try (Jedis jedis = this.redisServer.getResource()) {
|
||||||
|
log.warn("Redis连接状态(Ping): {}", jedis.ping().equalsIgnoreCase("pong"));
|
||||||
|
} catch(JedisConnectionException e) {
|
||||||
|
log.warn("Redis连接失败, 将会影响到后续功能运行.", e);
|
||||||
|
}
|
||||||
|
|
||||||
String dataStoreDirPath = System.getProperty("cgj.botDataDir");
|
String dataStoreDirPath = System.getProperty("cgj.botDataDir");
|
||||||
this.dataStoreDir = new File((!dataStoreDirPath.endsWith("/") || !dataStoreDirPath.endsWith("\\")) ?
|
this.dataStoreDir = new File((!dataStoreDirPath.endsWith("/") || !dataStoreDirPath.endsWith("\\")) ?
|
||||||
dataStoreDirPath + System.getProperty("file.separator") : dataStoreDirPath);
|
dataStoreDirPath + System.getProperty("file.separator") : dataStoreDirPath);
|
||||||
@ -95,13 +103,6 @@ public final class BotGlobal {
|
|||||||
return proxy;
|
return proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CookieStore getCookieStore() {
|
|
||||||
if(pixivDownload == null) {
|
|
||||||
throw new IllegalStateException("CookieStore needs to be set before PixivDownload can be obtained");
|
|
||||||
}
|
|
||||||
return cookieStore;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCookieStore(CookieStore cookieStore) {
|
public void setCookieStore(CookieStore cookieStore) {
|
||||||
if(this.cookieStore != null) {
|
if(this.cookieStore != null) {
|
||||||
throw new IllegalStateException("CookieStore set");
|
throw new IllegalStateException("CookieStore set");
|
||||||
|
@ -12,8 +12,6 @@ import net.lamgc.cgj.pixiv.PixivDownload;
|
|||||||
import net.lamgc.cgj.pixiv.PixivSearchBuilder;
|
import net.lamgc.cgj.pixiv.PixivSearchBuilder;
|
||||||
import net.lamgc.cgj.pixiv.PixivURL;
|
import net.lamgc.cgj.pixiv.PixivURL;
|
||||||
import net.lamgc.cgj.util.URLs;
|
import net.lamgc.cgj.util.URLs;
|
||||||
import net.lamgc.utils.base.runner.Argument;
|
|
||||||
import net.lamgc.utils.base.runner.Command;
|
|
||||||
import net.lamgc.utils.encrypt.MessageDigestUtils;
|
import net.lamgc.utils.encrypt.MessageDigestUtils;
|
||||||
import net.lz1998.cq.utils.CQCode;
|
import net.lz1998.cq.utils.CQCode;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
@ -98,13 +96,12 @@ public final class CacheStoreCentral {
|
|||||||
* @param pageIndex 指定页面索引, 从1开始
|
* @param pageIndex 指定页面索引, 从1开始
|
||||||
* @return 如果成功, 返回BotCode, 否则返回错误信息.
|
* @return 如果成功, 返回BotCode, 否则返回错误信息.
|
||||||
*/
|
*/
|
||||||
@Command(commandName = "image")
|
public static String getImageById(long fromGroup, int illustId, PixivDownload.PageQuality quality, int pageIndex) {
|
||||||
public static String getImageById(
|
|
||||||
@Argument(name = "$fromGroup") long fromGroup,
|
|
||||||
@Argument(name = "id") int illustId,
|
|
||||||
@Argument(name = "quality", force = false) PixivDownload.PageQuality quality,
|
|
||||||
@Argument(name = "page", force = false, defaultValue = "1") int pageIndex) {
|
|
||||||
log.debug("IllustId: {}, Quality: {}, PageIndex: {}", illustId, quality.name(), pageIndex);
|
log.debug("IllustId: {}, Quality: {}, PageIndex: {}", illustId, quality.name(), pageIndex);
|
||||||
|
if(pageIndex <= 0) {
|
||||||
|
log.warn("指定的页数不能小于或等于0: {}", pageIndex);
|
||||||
|
return "指定的页数不能小于或等于0!";
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (BotCommandProcess.isNoSafe(illustId, SettingProperties.getProperties(fromGroup), false)) {
|
if (BotCommandProcess.isNoSafe(illustId, SettingProperties.getProperties(fromGroup), false)) {
|
||||||
@ -135,7 +132,7 @@ public final class CacheStoreCentral {
|
|||||||
log.debug(logBuilder.toString());
|
log.debug(logBuilder.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pagesList.size() < pageIndex || pageIndex <= 0) {
|
if (pagesList.size() < pageIndex) {
|
||||||
log.warn("指定的页数超出了总页数({} / {})", pageIndex, pagesList.size());
|
log.warn("指定的页数超出了总页数({} / {})", pageIndex, pagesList.size());
|
||||||
return "指定的页数超出了范围(总共 " + pagesList.size() + " 页)";
|
return "指定的页数超出了范围(总共 " + pagesList.size() + " 页)";
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ public class HotDataCacheStore<T> implements CacheStore<T>, Cleanable {
|
|||||||
AutoCleanTimer.add(this);
|
AutoCleanTimer.add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
log.debug("HotDataCacheStore初始化完成. " +
|
log.trace("HotDataCacheStore初始化完成. " +
|
||||||
"(Parent: {}, Current: {}, expireTime: {}, expireFloatRange: {}, autoClean: {})",
|
"(Parent: {}, Current: {}, expireTime: {}, expireFloatRange: {}, autoClean: {})",
|
||||||
parent, current, expireTime, expireFloatRange, autoClean);
|
parent, current, expireTime, expireFloatRange, autoClean);
|
||||||
}
|
}
|
||||||
@ -58,24 +58,24 @@ public class HotDataCacheStore<T> implements CacheStore<T>, Cleanable {
|
|||||||
@Override
|
@Override
|
||||||
public T getCache(String key) {
|
public T getCache(String key) {
|
||||||
if(!exists(key)) {
|
if(!exists(key)) {
|
||||||
log.debug("查询缓存键名不存在, 直接返回null.");
|
log.trace("查询缓存键名不存在, 直接返回null.");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
T result = current.getCache(key);
|
T result = current.getCache(key);
|
||||||
if(Objects.isNull(result)) {
|
if(Objects.isNull(result)) {
|
||||||
log.debug("Current缓存库未命中, 查询Parent缓存库");
|
log.trace("Current缓存库未命中, 查询Parent缓存库");
|
||||||
T parentResult = parent.getCache(key);
|
T parentResult = parent.getCache(key);
|
||||||
if(Objects.isNull(parentResult)) {
|
if(Objects.isNull(parentResult)) {
|
||||||
log.debug("Parent缓存库未命中, 缓存不存在");
|
log.trace("Parent缓存库未命中, 缓存不存在");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
log.debug("Parent缓存命中, 正在更新Current缓存库...");
|
log.trace("Parent缓存命中, 正在更新Current缓存库...");
|
||||||
current.update(key, parentResult,
|
current.update(key, parentResult,
|
||||||
expireTime + (expireFloatRange <= 0 ? 0 : random.nextInt(expireFloatRange)));
|
expireTime + (expireFloatRange <= 0 ? 0 : random.nextInt(expireFloatRange)));
|
||||||
log.debug("Current缓存库更新完成.");
|
log.trace("Current缓存库更新完成.");
|
||||||
result = parentResult;
|
result = parentResult;
|
||||||
} else {
|
} else {
|
||||||
log.debug("Current缓存库缓存命中.");
|
log.trace("Current缓存库缓存命中.");
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -64,14 +64,13 @@ public class BotEventHandler implements EventHandler {
|
|||||||
*/
|
*/
|
||||||
public synchronized static void initial() {
|
public synchronized static void initial() {
|
||||||
if(initialled) {
|
if(initialled) {
|
||||||
Logger logger = LoggerFactory.getLogger("BotEventHandler@<init>");
|
log.warn("BotEventHandler已经执行过初始化方法, 可能存在多次执行的问题, 堆栈信息: \n {}",
|
||||||
logger.warn("BotEventHandler已经执行过初始化方法, 可能存在多次执行的问题, 堆栈信息: \n {}",
|
|
||||||
Throwables.getStackTraceAsString(new Exception()));
|
Throwables.getStackTraceAsString(new Exception()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
executor.setEventUncaughtExceptionHandler(new EventUncaughtExceptionHandler() {
|
executor.setEventUncaughtExceptionHandler(new EventUncaughtExceptionHandler() {
|
||||||
private final Logger log = LoggerFactory.getLogger("EventUncaughtExceptionHandler");
|
private final Logger log = LoggerFactory.getLogger(this.getClass());
|
||||||
@Override
|
@Override
|
||||||
public void exceptionHandler(Thread executeThread, EventHandler handler, Method handlerMethod, EventObject event, Throwable cause) {
|
public void exceptionHandler(Thread executeThread, EventHandler handler, Method handlerMethod, EventObject event, Throwable cause) {
|
||||||
log.error("发生未捕获异常:\nThread:{}, EventHandler: {}, HandlerMethod: {}, EventObject: {}\n{}",
|
log.error("发生未捕获异常:\nThread:{}, EventHandler: {}, HandlerMethod: {}, EventObject: {}\n{}",
|
||||||
@ -88,7 +87,7 @@ public class BotEventHandler implements EventHandler {
|
|||||||
shutdownThread.setName("Thread-EventHandlerShutdown");
|
shutdownThread.setName("Thread-EventHandlerShutdown");
|
||||||
Runtime.getRuntime().addShutdownHook(shutdownThread);
|
Runtime.getRuntime().addShutdownHook(shutdownThread);
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
LoggerFactory.getLogger("BotEventHandler@Static").error("添加Handler时发生异常", e);
|
log.error("添加Handler时发生异常", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -120,20 +119,38 @@ public class BotEventHandler implements EventHandler {
|
|||||||
*/
|
*/
|
||||||
@NotAccepted
|
@NotAccepted
|
||||||
public static void executeMessageEvent(MessageEvent event) {
|
public static void executeMessageEvent(MessageEvent event) {
|
||||||
|
try {
|
||||||
|
executeMessageEvent(event, false);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
log.error("执行时发生异常", e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 投递消息事件
|
||||||
|
* @param event 事件对象
|
||||||
|
*/
|
||||||
|
@NotAccepted
|
||||||
|
public static void executeMessageEvent(MessageEvent event, boolean sync) throws InterruptedException {
|
||||||
String debuggerName = SettingProperties.getProperty(0, "debug.debugger");
|
String debuggerName = SettingProperties.getProperty(0, "debug.debugger");
|
||||||
if(!event.getMessage().startsWith(ADMIN_COMMAND_PREFIX) &&
|
if(!event.getMessage().startsWith(ADMIN_COMMAND_PREFIX) &&
|
||||||
!Strings.isNullOrEmpty(debuggerName)) {
|
!Strings.isNullOrEmpty(debuggerName)) {
|
||||||
try {
|
try {
|
||||||
MessageEventExecutionDebugger debugger = MessageEventExecutionDebugger.valueOf(debuggerName.toUpperCase());
|
MessageEventExecutionDebugger debugger = MessageEventExecutionDebugger.valueOf(debuggerName.toUpperCase());
|
||||||
debugger.debugger.accept(executor, event, SettingProperties.getProperties(SettingProperties.GLOBAL),
|
debugger.debugger.accept(executor, event, SettingProperties.getProperties(SettingProperties.GLOBAL),
|
||||||
MessageEventExecutionDebugger.getDebuggerLogger(debugger));
|
MessageEventExecutionDebugger.getDebuggerLogger(debugger));
|
||||||
} catch(IllegalArgumentException e) {
|
} catch(IllegalArgumentException e) {
|
||||||
log.warn("未找到指定调试器: '{}'", debuggerName);
|
log.warn("未找到指定调试器: '{}'", debuggerName);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("事件调试处理时发生异常", e);
|
log.error("事件调试处理时发生异常", e);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
BotEventHandler.executor.executor(event);
|
if(sync) {
|
||||||
|
BotEventHandler.executor.executorSync(event);
|
||||||
|
} else {
|
||||||
|
BotEventHandler.executor.executor(event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,23 +2,36 @@ package net.lamgc.cgj.bot.framework.cli;
|
|||||||
|
|
||||||
import net.lamgc.cgj.bot.boot.ApplicationBoot;
|
import net.lamgc.cgj.bot.boot.ApplicationBoot;
|
||||||
import net.lamgc.cgj.bot.event.BotEventHandler;
|
import net.lamgc.cgj.bot.event.BotEventHandler;
|
||||||
|
import net.lamgc.cgj.bot.framework.cli.message.ConsoleMessageEvent;
|
||||||
|
import net.lamgc.cgj.bot.framework.cli.message.ConsoleMessageSenderFactory;
|
||||||
import net.lamgc.cgj.bot.message.MessageSenderBuilder;
|
import net.lamgc.cgj.bot.message.MessageSenderBuilder;
|
||||||
|
import org.jline.reader.LineReader;
|
||||||
|
import org.jline.reader.LineReaderBuilder;
|
||||||
|
import org.jline.reader.impl.history.DefaultHistory;
|
||||||
|
import org.jline.terminal.TerminalBuilder;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.Scanner;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class ConsoleMain {
|
public class ConsoleMain {
|
||||||
|
|
||||||
public static void start() {
|
private final static Logger log = LoggerFactory.getLogger(ConsoleMain.class);
|
||||||
|
|
||||||
|
public static void start() throws IOException {
|
||||||
MessageSenderBuilder.setCurrentMessageSenderFactory(new ConsoleMessageSenderFactory());
|
MessageSenderBuilder.setCurrentMessageSenderFactory(new ConsoleMessageSenderFactory());
|
||||||
ApplicationBoot.initialBot();
|
ApplicationBoot.initialBot();
|
||||||
Scanner scanner = new Scanner(System.in);
|
LineReader lineReader = LineReaderBuilder.builder()
|
||||||
System.out.print("会话QQ:");
|
.appName("CGJ")
|
||||||
long qqId = scanner.nextLong();
|
.history(new DefaultHistory())
|
||||||
System.out.print("会话群组号:");
|
.terminal(TerminalBuilder.terminal())
|
||||||
long groupId = scanner.nextLong();
|
.build();
|
||||||
|
|
||||||
|
long qqId = Long.parseLong(lineReader.readLine("会话QQ: "));
|
||||||
|
long groupId = Long.parseLong(lineReader.readLine("会话群组号:"));
|
||||||
boolean isGroup = false;
|
boolean isGroup = false;
|
||||||
do {
|
do {
|
||||||
String input = scanner.nextLine();
|
String input = lineReader.readLine("App " + qqId + (isGroup ? "@" + groupId : "$private") + " >");
|
||||||
if(input.equalsIgnoreCase("#exit")) {
|
if(input.equalsIgnoreCase("#exit")) {
|
||||||
System.out.println("退出应用...");
|
System.out.println("退出应用...");
|
||||||
break;
|
break;
|
||||||
@ -27,7 +40,11 @@ public class ConsoleMain {
|
|||||||
System.out.println("System: 群模式状态已变更: " + isGroup);
|
System.out.println("System: 群模式状态已变更: " + isGroup);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
BotEventHandler.executeMessageEvent(new ConsoleMessageEvent(isGroup ? groupId : 0, qqId, input));
|
try {
|
||||||
|
BotEventHandler.executeMessageEvent(new ConsoleMessageEvent(isGroup ? groupId : 0, qqId, input), true);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
log.error("执行时发生中断", e);
|
||||||
|
}
|
||||||
} while(true);
|
} while(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package net.lamgc.cgj.bot.framework.cli;
|
package net.lamgc.cgj.bot.framework.cli.message;
|
||||||
|
|
||||||
import net.lamgc.cgj.bot.event.MessageEvent;
|
import net.lamgc.cgj.bot.event.MessageEvent;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package net.lamgc.cgj.bot.framework.cli;
|
package net.lamgc.cgj.bot.framework.cli.message;
|
||||||
|
|
||||||
import net.lamgc.cgj.bot.message.MessageSender;
|
import net.lamgc.cgj.bot.message.MessageSender;
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package net.lamgc.cgj.bot.framework.cli;
|
package net.lamgc.cgj.bot.framework.cli.message;
|
||||||
|
|
||||||
import net.lamgc.cgj.bot.message.MessageSender;
|
import net.lamgc.cgj.bot.message.MessageSender;
|
||||||
import net.lamgc.cgj.bot.message.MessageSenderFactory;
|
import net.lamgc.cgj.bot.message.MessageSenderFactory;
|
@ -4,15 +4,19 @@ import net.lamgc.cgj.bot.boot.ApplicationBoot;
|
|||||||
import net.lamgc.cgj.bot.boot.BotGlobal;
|
import net.lamgc.cgj.bot.boot.BotGlobal;
|
||||||
import net.lamgc.cgj.bot.event.BotEventHandler;
|
import net.lamgc.cgj.bot.event.BotEventHandler;
|
||||||
import net.lamgc.cgj.bot.framework.mirai.message.MiraiMessageEvent;
|
import net.lamgc.cgj.bot.framework.mirai.message.MiraiMessageEvent;
|
||||||
import net.lamgc.cgj.bot.message.MessageSenderBuilder;
|
|
||||||
import net.lamgc.cgj.bot.framework.mirai.message.MiraiMessageSenderFactory;
|
import net.lamgc.cgj.bot.framework.mirai.message.MiraiMessageSenderFactory;
|
||||||
|
import net.lamgc.cgj.bot.message.MessageSenderBuilder;
|
||||||
import net.mamoe.mirai.Bot;
|
import net.mamoe.mirai.Bot;
|
||||||
import net.mamoe.mirai.BotFactoryJvm;
|
import net.mamoe.mirai.BotFactoryJvm;
|
||||||
import net.mamoe.mirai.event.events.BotMuteEvent;
|
import net.mamoe.mirai.event.events.BotMuteEvent;
|
||||||
import net.mamoe.mirai.event.events.BotUnmuteEvent;
|
import net.mamoe.mirai.event.events.BotUnmuteEvent;
|
||||||
import net.mamoe.mirai.japt.Events;
|
import net.mamoe.mirai.japt.Events;
|
||||||
import net.mamoe.mirai.message.*;
|
import net.mamoe.mirai.message.FriendMessageEvent;
|
||||||
|
import net.mamoe.mirai.message.GroupMessageEvent;
|
||||||
|
import net.mamoe.mirai.message.MessageEvent;
|
||||||
|
import net.mamoe.mirai.message.TempMessageEvent;
|
||||||
import net.mamoe.mirai.utils.BotConfiguration;
|
import net.mamoe.mirai.utils.BotConfiguration;
|
||||||
|
import net.mamoe.mirai.utils.Utils;
|
||||||
import org.apache.commons.net.util.Base64;
|
import org.apache.commons.net.util.Base64;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -45,6 +49,7 @@ public class MiraiMain implements Closeable {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Utils.setDefaultLogger(MiraiToSlf4jLoggerAdapter::new);
|
||||||
BotConfiguration configuration = new BotConfiguration();
|
BotConfiguration configuration = new BotConfiguration();
|
||||||
configuration.setProtocol(BotConfiguration.MiraiProtocol.ANDROID_PAD);
|
configuration.setProtocol(BotConfiguration.MiraiProtocol.ANDROID_PAD);
|
||||||
bot = BotFactoryJvm.newBot(Long.parseLong(botProperties.getProperty("bot.qq", "0")), Base64.decodeBase64(botProperties.getProperty("bot.password", "")), configuration);
|
bot = BotFactoryJvm.newBot(Long.parseLong(botProperties.getProperty("bot.qq", "0")), Base64.decodeBase64(botProperties.getProperty("bot.password", "")), configuration);
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
package net.lamgc.cgj.bot.framework.mirai;
|
||||||
|
|
||||||
|
import net.mamoe.mirai.utils.MiraiLogger;
|
||||||
|
import net.mamoe.mirai.utils.MiraiLoggerPlatformBase;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.slf4j.Marker;
|
||||||
|
import org.slf4j.MarkerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MiraiLoggerToSlf4jLogger适配器
|
||||||
|
* <p>该Logger通过Slf4j的Marker进行标识, loggerName为{@code mirai.[identity]}</p>
|
||||||
|
* <p>由于适配器适配方式的原因, 日志输出的调用信息将不可用(调用指向了适配器内的方法);</p>
|
||||||
|
*/
|
||||||
|
public class MiraiToSlf4jLoggerAdapter extends MiraiLoggerPlatformBase {
|
||||||
|
|
||||||
|
private final static Marker marker = MarkerFactory.getMarker("mirai");
|
||||||
|
|
||||||
|
private final Logger logger;
|
||||||
|
|
||||||
|
private final String identity;
|
||||||
|
|
||||||
|
public MiraiToSlf4jLoggerAdapter(String identity) {
|
||||||
|
this.identity = identity;
|
||||||
|
this.logger = LoggerFactory.getLogger("mirai." + identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void debug0(@Nullable String s) {
|
||||||
|
logger.debug(marker, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void debug0(@Nullable String s, @Nullable Throwable throwable) {
|
||||||
|
logger.debug(marker, s, throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void error0(@Nullable String s) {
|
||||||
|
logger.error(marker, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void error0(@Nullable String s, @Nullable Throwable throwable) {
|
||||||
|
logger.error(marker, s, throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void info0(@Nullable String s) {
|
||||||
|
logger.info(marker, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void info0(@Nullable String s, @Nullable Throwable throwable) {
|
||||||
|
logger.info(marker, s, throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void verbose0(@Nullable String s) {
|
||||||
|
logger.trace(marker, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void verbose0(@Nullable String s, @Nullable Throwable throwable) {
|
||||||
|
logger.trace(marker, s, throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void warning0(@Nullable String s) {
|
||||||
|
logger.warn(marker, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void warning0(@Nullable String s, @Nullable Throwable throwable) {
|
||||||
|
logger.warn(marker, s, throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String getIdentity() {
|
||||||
|
if(identity == null) {
|
||||||
|
MiraiLogger followerLogger = getFollower();
|
||||||
|
return followerLogger == null ? null : followerLogger.getIdentity();
|
||||||
|
} else {
|
||||||
|
return identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -134,6 +134,7 @@ public class MiraiMessageSender implements MessageSender {
|
|||||||
* @param code 图片BotCode
|
* @param code 图片BotCode
|
||||||
* @return Image对象
|
* @return Image对象
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
|
||||||
public Image uploadImage(BotCode code) {
|
public Image uploadImage(BotCode code) {
|
||||||
log.debug("传入BotCode信息:\n{}", code);
|
log.debug("传入BotCode信息:\n{}", code);
|
||||||
String absolutePath = code.getParameter("absolutePath");
|
String absolutePath = code.getParameter("absolutePath");
|
||||||
|
@ -82,7 +82,33 @@ public final class PixivUgoiraBuilder {
|
|||||||
log.debug("IllustId: {}, UgoiraMeta: {}", this.illustId, this.ugoiraMeta);
|
log.debug("IllustId: {}, UgoiraMeta: {}", this.illustId, this.ugoiraMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取动图元数据
|
||||||
|
* @return 动图元数据, 返回的对象不影响Builder中的meta对象
|
||||||
|
*/
|
||||||
|
public JsonObject getUgoiraMeta() {
|
||||||
|
return this.ugoiraMeta.deepCopy();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建动图
|
||||||
|
* @param original 是否为原图画质
|
||||||
|
* @return 返回动图数据输入流
|
||||||
|
* @throws IOException 当获取数据发生异常时抛出
|
||||||
|
*/
|
||||||
public InputStream buildUgoira(boolean original) throws IOException {
|
public InputStream buildUgoira(boolean original) throws IOException {
|
||||||
|
ByteArrayOutputStream bufferOutput = new ByteArrayOutputStream();
|
||||||
|
buildUgoira(bufferOutput, original);
|
||||||
|
return new ByteArrayInputStream(bufferOutput.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建动图
|
||||||
|
* @param outputStream 动图输出流
|
||||||
|
* @param original 是否为原图画质
|
||||||
|
* @throws IOException 当获取数据发生异常时抛出
|
||||||
|
*/
|
||||||
|
public void buildUgoira(OutputStream outputStream, boolean original) throws IOException {
|
||||||
getUgoiraImageSize();
|
getUgoiraImageSize();
|
||||||
log.debug("动图尺寸信息: Height: {}, Width: {}", height, width);
|
log.debug("动图尺寸信息: Height: {}, Width: {}", height, width);
|
||||||
|
|
||||||
@ -95,7 +121,6 @@ public final class PixivUgoiraBuilder {
|
|||||||
HttpResponse response = httpClient.execute(request);
|
HttpResponse response = httpClient.execute(request);
|
||||||
log.trace("请求已发送, 正在处理响应...");
|
log.trace("请求已发送, 正在处理响应...");
|
||||||
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(response.getEntity().getContent(), 64 * 1024));
|
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(response.getEntity().getContent(), 64 * 1024));
|
||||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
|
||||||
ZipEntry entry;
|
ZipEntry entry;
|
||||||
ByteArrayOutputStream cacheOutputStream = new ByteArrayOutputStream(512);
|
ByteArrayOutputStream cacheOutputStream = new ByteArrayOutputStream(512);
|
||||||
HashMap<String, InputStream> frameMap = new HashMap<>(frames.size());
|
HashMap<String, InputStream> frameMap = new HashMap<>(frames.size());
|
||||||
@ -140,7 +165,6 @@ public final class PixivUgoiraBuilder {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
encoder.finishEncoding();
|
encoder.finishEncoding();
|
||||||
return new ByteArrayInputStream(outputStream.toByteArray());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3,26 +3,39 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<property name="logStorePath">./logs</property>
|
<property name="logStorePath">./logs</property>
|
||||||
<property name="charset">UTF-8</property>
|
<property name="charset">UTF-8</property>
|
||||||
<property name="pattern">[%-d{HH:mm:ss.SSS} %5level][%logger.%method():%-3L][%thread]: %msg%n</property>
|
<property name="standard_pattern">[%-d{HH:mm:ss.SSS} %5level][%logger.%method():%-3L][%thread]: %msg%n</property>
|
||||||
|
<property name="mirai_pattern">[%-d{HH:mm:ss.SSS} %5level][%logger]: %msg%n</property>
|
||||||
<property name="logsDir">${sys:cgj.logsPath:-logs}</property>
|
<property name="logsDir">${sys:cgj.logsPath:-logs}</property>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<Appenders>
|
<Appenders>
|
||||||
<Console name="CONSOLE_STDOUT" target="SYSTEM_OUT">
|
<Console name="STANDARD_STDOUT" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${pattern}" charset="${charset}"/>
|
<PatternLayout charset="${charset}">
|
||||||
|
<MarkerPatternSelector defaultPattern="${standard_pattern}">
|
||||||
|
<PatternMatch key="mirai" pattern="${mirai_pattern}" />
|
||||||
|
</MarkerPatternSelector>
|
||||||
|
</PatternLayout>
|
||||||
<Filters>
|
<Filters>
|
||||||
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/>
|
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/>
|
||||||
</Filters>
|
</Filters>
|
||||||
</Console>
|
</Console>
|
||||||
<Console name="CONSOLE_STDERR" target="SYSTEM_ERR">
|
<Console name="STANDARD_STDERR" target="SYSTEM_ERR">
|
||||||
<PatternLayout pattern="${pattern}" charset="${charset}"/>
|
<PatternLayout charset="${charset}">
|
||||||
|
<MarkerPatternSelector defaultPattern="${standard_pattern}">
|
||||||
|
<PatternMatch key="mirai" pattern="${mirai_pattern}" />
|
||||||
|
</MarkerPatternSelector>
|
||||||
|
</PatternLayout>
|
||||||
<Filters>
|
<Filters>
|
||||||
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</Filters>
|
</Filters>
|
||||||
</Console>
|
</Console>
|
||||||
|
|
||||||
<RollingFile name="rollingFile" fileName="${logsDir}/latest.log" filePattern="${logsDir}/running.%-d{yyyy-MM-dd_HH-mm-ss}.log.gz">
|
<RollingFile name="rollingFile" fileName="${logsDir}/latest.log" filePattern="${logsDir}/running.%-d{yyyy-MM-dd_HH-mm-ss}.log.gz">
|
||||||
<PatternLayout pattern="${pattern}" charset="${charset}"/>
|
<PatternLayout charset="${charset}">
|
||||||
|
<MarkerPatternSelector defaultPattern="${standard_pattern}">
|
||||||
|
<PatternMatch key="mirai" pattern="${mirai_pattern}" />
|
||||||
|
</MarkerPatternSelector>
|
||||||
|
</PatternLayout>
|
||||||
<Policies>
|
<Policies>
|
||||||
<OnStartupTriggeringPolicy />
|
<OnStartupTriggeringPolicy />
|
||||||
</Policies>
|
</Policies>
|
||||||
@ -32,8 +45,8 @@
|
|||||||
<Loggers>
|
<Loggers>
|
||||||
<Logger level="INFO" name="org.apache.http"/>
|
<Logger level="INFO" name="org.apache.http"/>
|
||||||
<Root level="TRACE">
|
<Root level="TRACE">
|
||||||
<AppenderRef ref="CONSOLE_STDOUT"/>
|
<AppenderRef ref="STANDARD_STDOUT"/>
|
||||||
<AppenderRef ref="CONSOLE_STDERR"/>
|
<AppenderRef ref="STANDARD_STDERR"/>
|
||||||
<AppenderRef ref="rollingFile"/>
|
<AppenderRef ref="rollingFile"/>
|
||||||
</Root>
|
</Root>
|
||||||
</Loggers>
|
</Loggers>
|
||||||
|
@ -1,28 +1,44 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<configuration status="WARN">
|
<configuration status="WARN">
|
||||||
|
<!--
|
||||||
|
测试版跟发布版在日志配置文件上的区别仅仅只有'Loggers'的不同, 'properties'和'Appenders'是一致的.
|
||||||
|
-->
|
||||||
<properties>
|
<properties>
|
||||||
<property name="logStorePath">./logs</property>
|
<property name="logStorePath">./logs</property>
|
||||||
<property name="charset">UTF-8</property>
|
<property name="charset">UTF-8</property>
|
||||||
<property name="pattern">[%-d{HH:mm:ss.SSS} %5level][%logger.%method():%-3L][%thread]: %msg%n</property>
|
<property name="standard_pattern">[%-d{HH:mm:ss.SSS} %5level][%logger.%method():%-3L][%thread]: %msg%n</property>
|
||||||
|
<property name="mirai_pattern">[%-d{HH:mm:ss.SSS} %5level][%logger]: %msg%n</property>
|
||||||
<property name="logsDir">${sys:cgj.logsPath:-logs}</property>
|
<property name="logsDir">${sys:cgj.logsPath:-logs}</property>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<Appenders>
|
<Appenders>
|
||||||
<Console name="CONSOLE_STDOUT" target="SYSTEM_OUT">
|
<Console name="STANDARD_STDOUT" target="SYSTEM_OUT">
|
||||||
<PatternLayout pattern="${pattern}" charset="${charset}"/>
|
<PatternLayout charset="${charset}">
|
||||||
|
<MarkerPatternSelector defaultPattern="${standard_pattern}">
|
||||||
|
<PatternMatch key="mirai" pattern="${mirai_pattern}" />
|
||||||
|
</MarkerPatternSelector>
|
||||||
|
</PatternLayout>
|
||||||
<Filters>
|
<Filters>
|
||||||
<LevelRangeFilter minLevel="INFO" maxLevel="INFO" />
|
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/>
|
||||||
</Filters>
|
</Filters>
|
||||||
</Console>
|
</Console>
|
||||||
<Console name="CONSOLE_STDERR" target="SYSTEM_ERR">
|
<Console name="STANDARD_STDERR" target="SYSTEM_ERR">
|
||||||
<PatternLayout pattern="${pattern}" charset="${charset}"/>
|
<PatternLayout charset="${charset}">
|
||||||
|
<MarkerPatternSelector defaultPattern="${standard_pattern}">
|
||||||
|
<PatternMatch key="mirai" pattern="${mirai_pattern}" />
|
||||||
|
</MarkerPatternSelector>
|
||||||
|
</PatternLayout>
|
||||||
<Filters>
|
<Filters>
|
||||||
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
</Filters>
|
</Filters>
|
||||||
</Console>
|
</Console>
|
||||||
|
|
||||||
<RollingFile name="rollingFile" fileName="${logsDir}/latest.log" filePattern="${logsDir}/running.%-d{yyyy-MM-dd_HH-mm-ss}.log.gz">
|
<RollingFile name="rollingFile" fileName="${logsDir}/latest.log" filePattern="${logsDir}/running.%-d{yyyy-MM-dd_HH-mm-ss}.log.gz">
|
||||||
<PatternLayout pattern="${pattern}" charset="${charset}"/>
|
<PatternLayout charset="${charset}">
|
||||||
|
<MarkerPatternSelector defaultPattern="${standard_pattern}">
|
||||||
|
<PatternMatch key="mirai" pattern="${mirai_pattern}" />
|
||||||
|
</MarkerPatternSelector>
|
||||||
|
</PatternLayout>
|
||||||
<Policies>
|
<Policies>
|
||||||
<OnStartupTriggeringPolicy />
|
<OnStartupTriggeringPolicy />
|
||||||
</Policies>
|
</Policies>
|
||||||
@ -30,10 +46,19 @@
|
|||||||
</Appenders>
|
</Appenders>
|
||||||
|
|
||||||
<Loggers>
|
<Loggers>
|
||||||
<Logger level="INFO" name="org.apache.http"/>
|
<Logger level="INFO" name="org.apache.http">
|
||||||
|
<AppenderRef ref="STANDARD_STDOUT"/>
|
||||||
|
<AppenderRef ref="STANDARD_STDERR"/>
|
||||||
|
</Logger>
|
||||||
|
<Logger level="INFO" name="mirai">
|
||||||
|
<AppenderRef ref="STANDARD_STDOUT"/>
|
||||||
|
<AppenderRef ref="STANDARD_STDERR"/>
|
||||||
|
</Logger>
|
||||||
|
<Logger level="INFO" name="net.lamgc.cgj">
|
||||||
|
<AppenderRef ref="STANDARD_STDOUT"/>
|
||||||
|
<AppenderRef ref="STANDARD_STDERR"/>
|
||||||
|
</Logger>
|
||||||
<Root level="TRACE">
|
<Root level="TRACE">
|
||||||
<AppenderRef ref="CONSOLE_STDOUT"/>
|
|
||||||
<AppenderRef ref="CONSOLE_STDERR"/>
|
|
||||||
<AppenderRef ref="rollingFile"/>
|
<AppenderRef ref="rollingFile"/>
|
||||||
</Root>
|
</Root>
|
||||||
</Loggers>
|
</Loggers>
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
package net.lamgc.cgj.pixiv;
|
package net.lamgc.cgj.pixiv;
|
||||||
|
|
||||||
import org.apache.http.HttpHost;
|
import org.apache.http.HttpHost;
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
import org.apache.http.impl.client.HttpClientBuilder;
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
import org.bouncycastle.util.io.Streams;
|
import org.bouncycastle.util.io.Streams;
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -18,8 +19,9 @@ public class PixivUgoiraBuilderTest {
|
|||||||
@Test
|
@Test
|
||||||
public void buildTest() throws IOException {
|
public void buildTest() throws IOException {
|
||||||
File outputFile = new File("./output2.gif");
|
File outputFile = new File("./output2.gif");
|
||||||
CloseableHttpClient httpClient = HttpClientBuilder.create().setProxy(new HttpHost("127.0.0.1", 1001)).build();
|
HttpClient httpClient = HttpClientBuilder.create().setProxy(new HttpHost("127.0.0.1", 1080)).build();
|
||||||
PixivUgoiraBuilder builder = new PixivUgoiraBuilder(httpClient, 80766493);
|
PixivUgoiraBuilder builder = new PixivUgoiraBuilder(httpClient, 81163967);
|
||||||
|
LoggerFactory.getLogger(PixivUgoiraBuilderTest.class).info("UgoiraMeta: {}", builder.getUgoiraMeta());
|
||||||
InputStream inputStream = builder.buildUgoira(true);
|
InputStream inputStream = builder.buildUgoira(true);
|
||||||
Files.write(outputFile.toPath(), Streams.readAll(inputStream));
|
Files.write(outputFile.toPath(), Streams.readAll(inputStream));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user