关于 H-Downloader
H-Downloader是我于2020年2月写的本子下载器(一年半过去了),整理代码时修了点bug并开源。其可以下载如下网站的本子:
e-hentai.org
ja.erocool.com
当时虽然也是拿IDEA整的,但是很多地方都有带改进。比方说:依赖是下载的jar手动引用的,以及种种,以至于今天,哦不对,是昨天(笑),打开项目的时候都是红叉。下面是这次做的改进:
使用maven来管理依赖
erocool用了Cloudflare做cdn,所以对于并发比较敏感。在H_Downloader.java当中有一个MAX_CONCURRENT_THREAD的常量可以配置下载的并发线程数
测试
但是在测试的过程当中仍然发现了问题,比如:
未处理e-hentai超过40页,即要翻页(有多个简介页)的情况,看心情写。
国内erocool的主站被墙,cdn可能没有被墙。在analyze和download之间记得开关代理。
主要讲讲我的启动方案吧,感觉这个是很头大的一件事,因为我的Shadowsocks不是全局的,而是开了一个本地的代理服务器,而我也懒得在项目中增加proxy_server的设置了。基于以上种种,我首先尝试使用Windows的proxychains跑,但是出了一些奇怪的问题:
经过一番搜索后无果,包括尝试过加上-Djava.net.preferIPv4Stack=true或者写System.setProperty("proxyHost", "localhost")等操作,也将proxychains的host修改为[::1], 127.0.0.1, localhost过。
于是乎我决定在在WSL中跑GUI(这一定是一个危险的决定), 并且还要用proxychains(这听起来更加危险了)
过程
安装jdk
首先安装java环境。由于Windows上一不小心拿了jdk 16进行编译(最主要是不想装其他环境了),所以我们就勉为其难地在Ubuntu上也装一个吧:
# 添加PPA
sudo add-apt-repository ppa:linuxuprising/java
sudo apt update
# 安装jdk
sudo apt install oracle-java16-installer
如果要卸载:
sudo add-apt-repository --remove ppa:linuxuprising/java
sudo apt-get remove oracle-java16-installer
然后我们测试一下:
$ javac --version
javac 16.0.2
看来确实有成功装上。jdk一般装在这里:
/usr/lib/jvm/
配置IDEA启动
然后就是要求输入jdk的version和path,根据上面说的来就行了。
尝试启动【前提:配置好X Server,之前的文章有写】
先在Windows上Build一下,然后Run。我们非常惊喜地发现,报错了:
/usr/lib/jvm/java-16-oracle/bin/java -Dfile.encoding=UTF-8 -classpath /mnt/c/Users/JeffersonQin/Desktop/H-Downloader/target/classes:/mnt/c/Users/JeffersonQin/.m2/repository/org/jsoup/jsoup/1.14.1/jsoup-1.14.1.jar:/mnt/c/Users/JeffersonQin/.m2/repository/com/itextpdf/itextpdf/5.5.13.2/itextpdf-5.5.13.2.jar edu.sfls.Jeff.JavaDev.HDownloader.App.Main
Exception in thread "main" java.awt.HeadlessException:
No X11 DISPLAY variable was set,
but this program performed an operation which requires it.
at java.desktop/java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:165)
at java.desktop/java.awt.Window.
at java.desktop/java.awt.Frame.
at java.desktop/javax.swing.JFrame.
at edu.sfls.Jeff.JavaDev.HDownloader.Interface.H_Downloader.
at edu.sfls.Jeff.JavaDev.HDownloader.App.Main.main(Main.java:9)
Process finished with exit code 1
它说No X11 DISPLAY variable was set,这显然和事实不符。没有关系,经过万能的stackoverflow搜索,我们只需要在启动GUI前加入这行代码:
System.setProperty("java.awt.headless", "false");
再次启动,发现还是不行:
看到这个报错,候我们又会感到非常困惑:我们的$DISPLAY变量明明不是:0 (注意:这里不行是因为WSL2必须要局域网地址),但这里却显示是:0,肯定启动不了。
经过一番尝试,设置了/etc/profile, ~/.profile, ~/.bashrc等多个配置文件,还是不行,于是我放弃了这条道路,转而直接进行暴力美学:使用命令行要个屁的IDE。由于每次执行的时候IDEA都会直接显示出运行命令,这无疑方便了很多。就像这样:
/usr/lib/jvm/java-16-oracle/bin/java -Dfile.encoding=UTF-8 -classpath /mnt/c/Users/JeffersonQin/Desktop/H-Downloader/target/classes:/mnt/c/Users/JeffersonQin/.m2/repository/org/jsoup/jsoup/1.14.1/jsoup-1.14.1.jar:/mnt/c/Users/JeffersonQin/.m2/repository/com/itextpdf/itextpdf/5.5.13.2/itextpdf-5.5.13.2.jar edu.sfls.Jeff.JavaDev.HDownloader.App.Main
好耶,成功跑起来了:
但是我清楚地意识到,现在屁都干不了,因为没开梯子。我尝试前缀加个proxychains后点了analyze,他很争气地出了结果,但是,中文日文是乱码。
解决中文日文乱码问题
安装字体:
sudo apt-get install fonts-wqy-microhei fonts-wqy-zenhei xfonts-wqy
安装完显示便正常了。
尝试下载
经过不懈地努力测试,我得出了「国内erocool的主站被墙,cdn可能没有被墙。在analyze和download之间记得开关代理。」的结论。
方法:我们只需要在下图两个红框框出来的地方反复横跳即可。
结果图
总结与展望
搞了这么多,真的不由得感慨,当初的自己竟然有胆量写GUI?我当初竟然能想出int[1]这样的数组当作指针在Java里传参???我当初竟然能在OS X下面开全局梯子一个错没遇到????现在想想,满满的都是回忆。当初还以这个作为工具,写了扩展接口,当成是erocool爬虫的可视化下载界面。那个设计当初竟然只花了五分钟写完,让人不由得看开静态语言和IDE的伟大。现在都磨练到可以手写python无提示了。
Reference
https://www.lainme.com/doku.php/blog/2018/07/如何优雅的在windows_10上装x