Skip to content

Commit

Permalink
修复重定向错误,支持运行时传入漫画名称,更新文档
Browse files Browse the repository at this point in the history
  • Loading branch information
jiayaoO3O committed Mar 27, 2021
1 parent cec1b58 commit c02b05b
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 27 deletions.
28 changes: 15 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ java这门语言能让小项目变成中项目, 中项目变成大项目 🤡

## 更新记录

- 2021/3/27 14:04 v3.0.0 放弃springboot框架, 换成使用响应式框架quarkus, 感觉应该是更快了的.
- **2021/2/25 15:16 v2.0.0重大更新, 支持直接使用Github Action自动爬取漫画, 不需要本地部署, 直接输入漫画url然后等待Github Action爬取完成然后下载压缩包即可.**
- 2021/2/18 22:15 v1.2.0支持下载整本只有一章的无章节漫画
- 2021/2/18 16:35 添加下载单独某个章节的功能.
Expand Down Expand Up @@ -61,36 +62,34 @@ Github Action是微软收购github之后推出的CI/CD工具, 你可以理解为

## 本地打包

1. 安装jdk15.
1. 安装jdk16.

2. 安装maven.

3. 下载源代码并且修改**application.properties**文件中的以下4个配置 :
3. 下载源代码并且修改**application.properties**文件中的以下3个配置 :

- comic.download.path : 下载到本地的目录
- comic.proxy.host : 科学上网的ip
- comic.proxy.port : 科学上网的端口
- comic.download.cookie : 浏览器访问禁漫天堂时的cookie, 可为空

```properties

```properties
comic.download.path=C:\\Users\\jiayao\\Pictures
comic.proxy.host=127.0.0.1
comic.proxy.port=10808
comic.download.cookie=__cfduid=d143120c4820765e39f93c708adb046db1613394311; AVS=lst54bj7248ch7r16rp8fo7800; shunt=1; _gid=GA1.2.1192332230.1613394323; cover=1; ipcountry=HK; ipm5=c759e3424d3ed099c2a82ef7f5222a99; _ga_YYJWNTTJEN=GS1.1.1613463242.7.1.1613464015.58; _ga=GA1.2.1275815841.1613394321; _gali=wrapper
```
4.执行`mvn clean install` 得到最后的jar包
4.执行`mvn clean package` 得到最后的jar包

如果直接下载我提供的jar包, 解压后修改上面四个配置再压缩成jar包
如果直接下载我提供的jar包, 请在jar包所在的目录**新建一个config文件夹**, 在里面新建一个**application.properties**文件, 然后粘贴并且修改上述三个参数

## 运行程序

程序现在支持两种运行模式, 作为单次运行的前台模式, 和作为持续运行服务的后台模式

### 前台模式

前台模式是指程序完成下载任务之后会自动关闭, 通过读取**downloadPath.json**文件内的链接来进行下载, 每一次下载都要运行一次程序.
前台模式是指程序完成下载任务之后会自动关闭, 通过读取**downloadPath.json**文件内的链接或者启动时传入参数来进行下载, 每一次下载都要运行一次程序.

进入`/src/main/resources/downloadPath.json`目录, 按照json格式填入漫画链接, 如果要下载一本, 那格式为 :
如果有条件手动打包程序, 则进入`/src/main/resources/downloadPath.json`目录, 按照json格式填入漫画链接, 如果要下载一本, 那格式为 :

```json
[
Expand All @@ -109,13 +108,15 @@ Github Action是微软收购github之后推出的CI/CD工具, 你可以理解为

前台模式与后台模式都支持下载整本漫画或者单独某个章节.

添加数据之后, 打包, 然后在确保已经有jdk 15之后, 命令行中进入jar包所在的目录, 执行`java -jar ./*.jar`即可按照前台模式运行程序 , 当下载完成之后, 程序会自动退出.
添加数据之后, 打包, 然后在确保已经有jdk 16之后, 命令行中进入jar包所在的目录, 执行`java -jar ./*.jar`即可按照前台模式运行程序,程序会自动下载json文件中的所有漫画 , 当下载完成之后, 程序会自动退出.

如果没有条件打包程序, 但是有条件运行程序, 例如只装了jdk16但是没有装maven等, 那就直接下载我提供的jar包, 然后命令行进入jar所在的目录, 执行`java -jar ./*.jar 漫画路径1 漫画路径2`,例如 `java -jar ./*.jar https://18comic.vip/album/180459` , 这时候这本漫画就会被下载, 多本漫画请用空格隔开.

### 后台模式

后台模式是指程序将会作为一个服务持续运行, 通过等待接口请求来下载漫画, 每一次请求接口就会进行一次下载, 程序完成下载后不会自动关闭.

程序打包, 然后在确保已经有jdk 15之后, 命令行中进入jar包所在的目录, 执行`java -jar ./*.jar -s`(注意-s参数)即可按照后台模式运行程序 , 当下载完成之后, 程序会继续等待服务.
程序打包或者下载我提供的jar包, 然后在确保已经有jdk 16之后, 命令行中进入jar包所在的目录, 执行`java -jar ./*.jar -s`(注意-s参数)即可按照后台模式运行程序 , 当下载完成之后, 程序会继续等待服务.

运行程序之后打开浏览器, 在地址栏输入 :

Expand All @@ -137,6 +138,7 @@ http://localhost:7788/finder/download?homePage=https://18comic.vip/photo/211115

## 项目特点

- 使用quarkus框架
- 支持github actions
- 没有用到爬虫库, 纯用hutool对html页面进行切分.
- 多线程异步爬虫.
Expand All @@ -147,4 +149,4 @@ http://localhost:7788/finder/download?homePage=https://18comic.vip/photo/211115
- [x] 支持github action
- [x] 支持单独下载某个章节而不是每一次都下载完整的一本漫画.
- [x] 支持下载整本只有一章的无章节漫画.
- [ ] 通过指定外部配置文件来覆盖内部配置文件, 对于直接下载jar包的用户不需要先解压修改配置文件后再压缩回去.
- [x] 通过指定外部配置文件来覆盖内部配置文件, 对于直接下载jar包的用户不需要先解压修改配置文件后再压缩回去.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>vip.comic18.finder</groupId>
<artifactId>finder</artifactId>
<version>1.0.0-SNAPSHOT</version>
<version>3.0.0</version>
<properties>
<compiler-plugin.version>3.8.1</compiler-plugin.version>
<maven.compiler.parameters>true</maven.compiler.parameters>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,6 @@ public Uni<String> download(@QueryParam("homePage") String homePage) {
return Uni.createFrom().item(StrUtil.format("homePage参数:[{}]并非http或https链接", homePage));
}
comicService.getComicInfo(homePage).subscribe().with(body -> comicService.consume(homePage, body));
return Uni.createFrom().item("下载完成");
return Uni.createFrom().item(StrUtil.format("已经添加任务:[{}]", homePage));
}
}
8 changes: 6 additions & 2 deletions src/main/java/vip/comic18/finder/runner/ComicRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.lang.Filter;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import vip.comic18.finder.service.ComicService;
import io.quarkus.runtime.Quarkus;
import io.quarkus.runtime.QuarkusApplication;
import io.quarkus.runtime.annotations.QuarkusMain;
import org.jboss.logging.Logger;
import vip.comic18.finder.service.ComicService;

import javax.inject.Inject;
import java.util.Arrays;
import java.util.List;

/**
Expand All @@ -24,7 +27,7 @@ public class ComicRunner implements QuarkusApplication {
@Inject
ComicService comicService;

private final List<String> comicHomePages = JSONUtil.toList(new ClassPathResource("downloadPath.json").readUtf8Str(), String.class);
private List<String> comicHomePages = JSONUtil.toList(new ClassPathResource("downloadPath.json").readUtf8Str(), String.class);

@Override
public int run(String... args) {
Expand All @@ -34,6 +37,7 @@ public int run(String... args) {
Quarkus.waitForExit();
}
log.info("前台模式");
comicHomePages.addAll(Arrays.stream(ArrayUtil.filter(args, (Filter<String>) arg -> StrUtil.contains(arg, "http"))).toList());
if(CollUtil.isEmpty(comicHomePages)) {
log.info("下载列表为空,终止任务");
return 0;
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/vip/comic18/finder/service/ComicService.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void consume(String comicHomePage, String body) {
vertx.fileSystem().mkdirs(dirPath).onFailure().invoke(e -> log.error(StrUtil.format("downloadComic->创建文件夹失败:[{}]", e.getLocalizedMessage()), e)).subscribe().with(mkdirSucceed -> {
if(chapterEntity.getUpdatedAt().after(DateUtil.parse("2020-10-27"))) {
log.info(StrUtil.format("downloadComic->该章节:[{}]图片:[{}]需要进行反反爬虫处理", chapterEntity.getName(), photo.getName()));
var bufferUni = taskService.post(photo.getUrl()).onItem().transform(HttpResponse::body);
var bufferUni = taskService.get(photo.getUrl()).onItem().transform(HttpResponse::body);
var tempFile = taskService.getTempFile(bufferUni);
taskService.process(photoPath, tempFile);
} else {
Expand All @@ -67,7 +67,7 @@ public void consume(String comicHomePage, String body) {

public Uni<String> getComicInfo(String comicHomePage) {
comicHomePage = StrUtil.contains(comicHomePage, "photo") ? StrUtil.replace(comicHomePage, "photo", "album") : comicHomePage;
var homePageUni = taskService.post(comicHomePage);
var homePageUni = taskService.get(comicHomePage);
return homePageUni.onItem().transform(HttpResponse::bodyAsString);
}

Expand Down
10 changes: 5 additions & 5 deletions src/main/java/vip/comic18/finder/service/TaskService.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public Multi<ChapterEntity> getChapterInfo(String body, String comicHomePage) {
if(StrUtil.subBetween(body, "<ul class=\"btn-toolbar", "</ul>") == null) {
//说明该漫画是单章漫画,没有区分章节,例如王者荣耀图鉴类型的https://18comic.vip/album/203961
String url = StrUtil.subBetween(StrUtil.subBetween(body, ">收藏<", ">開始閱讀<"), "href=\"", "/\"");
String name = StrUtil.trim(StrUtil.replaceChars(StrUtil.subBetween(body, "<div itemprop=\"name\" class=\"pull-left\">\n", "\n</div>"), new char[]{'/', '\\'}, StrUtil.DASHED));
String name = StrUtil.trim(StrUtil.replaceChars(StrUtil.subBetween(body, "<h1>", "</h1>"), new char[]{'/', '\\'}, StrUtil.DASHED));
log.info(StrUtil.format("章节名称为:[{]]", name));
DateTime updatedAt = DateUtil.parse(StrUtil.subBetween(StrUtil.subBetween(body, "itemprop=\"datePublished\"", "上架日期"), "content=\"", "\""));
ChapterEntity chapterEntity = new ChapterEntity();
Expand Down Expand Up @@ -81,7 +81,7 @@ public Multi<ChapterEntity> getChapterInfo(String body, String comicHomePage) {
}

public Multi<PhotoEntity> getPhotoInfo(ChapterEntity chapterEntity) {
return this.post(chapterEntity.getUrl()).onItem().transformToMulti(response -> {
return this.get(chapterEntity.getUrl()).onItem().transformToMulti(response -> {
List<PhotoEntity> photoEntities = new ArrayList<>();
String body = response.bodyAsString();
body = StrUtil.subBetween(body, "<div class=\"row thumb-overlay-albums\" style=\"\">", "<div class=\"tab-content");
Expand Down Expand Up @@ -143,14 +143,14 @@ public BufferedImage reverseImage(@NotNull BufferedImage bufferedImage) {
}

public void getAndSaveImage(String url, String photoPath) {
this.post(url).subscribe().with(response -> {
this.get(url).subscribe().with(response -> {
log.info(StrUtil.format("getAndSaveImage->成功下载图片:[{}]", url));
this.write(photoPath, response.body()).subscribe().with(succeed -> log.info(StrUtil.format("getAndSaveImage->保存文件成功:[{}]", photoPath)));
});
}

public Uni<HttpResponse<Buffer>> post(String url) {
return webClient.postAbs(url).port(443).followRedirects(true).send().onFailure().retry().withBackOff(Duration.ofSeconds(1L), Duration.ofSeconds(3L)).atMost(10).onFailure().invoke(e -> log.error(StrUtil.format("网络请求:[{}]失败:[{}]", url, e.getLocalizedMessage()), e));
public Uni<HttpResponse<Buffer>> get(String url) {
return webClient.getAbs(url).port(443).followRedirects(true).send().onFailure().retry().withBackOff(Duration.ofSeconds(1L), Duration.ofSeconds(3L)).atMost(10).onFailure().invoke(e -> log.error(StrUtil.format("网络请求:[{}]失败:[{}]", url, e.getLocalizedMessage()), e));
}

public Uni<Void> write(String path, Buffer buffer) {
Expand Down
4 changes: 1 addition & 3 deletions src/main/resources/downloadPath.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
[
"https://18comic.vip/album/180459",
"https://18comic.vip/album/182168",
"https://18comic.vip/album/180281"

]

0 comments on commit c02b05b

Please sign in to comment.