一. 关于EhViewer

EhViewer是一款Android平台的E-Hentai非官方应用,提供了在移动端舒适浏览E站的解决方案,界面简洁,功能强大。
EhViewer由Hippo在GitHub上开发并维护(向开拓者致以诚挚敬意),其公开发布的最后一个版本为1.7.3,这也是最广为人知的一个版本。

二. 关于无法显示评论的Bug

自2020年10月起,EhViewer 1.7.3出现了无法显示画廊下的评论的问题。
一时间流言四起,笔者甚至见过有人传播“是港独台独们与小粉红们成天吵架导致E-Hentai主动关闭评论功能”这种令人啼笑皆非的极度不靠谱的谣言。

当然,这个说法是完全站不住脚的 —— 因为原生的网页版E站仍然可以正常浏览并发表评论,所以问题只可能出在APP上面;又因为EhViewer 1.7.3版本已经很长时间没有变化,且之前一直能够正常工作,所以极有可能是E站修改了评论区的某些细节,导致APP无法顺利获取评论

虽然原作者Hippo迟迟没有公开更新(只是在自己的Telegram频道里发布了新版本),但一些爱好者已经根据其源码,自行完善并发布了新的发行版本的EhViewer,解决了此Bug。但遗憾的是,他们并没有详细解释背后的原理。

出于好奇,笔者对此进行了探究,并大概理清了这一Bug的来龙去脉。

三. Bug成因的探索与解决

笔者最初的猜测是:会不会是E站修改了评论区的某些页面元素的标签及命名,导致APP没法正确解析呢?
借着自己的半吊子Java基础,找到了EhViewer负责解析评论区内容的相关代码(下图为GalleryDetailParser.java中的部分内容)。
1.png
2.png

但是,在与E站的页面代码进行比对后,发现并没有什么出入。
3.png

借助UltraEdit的文件比对功能,也发现其它作者(下图以xiaojieonly的代码为例)并没有对这部分代码进行修改。
4change.png
这表明,Bug的源头并不在这段代码上。

但是,通过文件比对,却发现原版EhViewer与新版EhViewer在创建WEB_COMMENT_DATE_FORMAT变量时有所不同 —— 在new出一个SimpleDateFormat对象时,去掉了z这个参数。而这一变量也确实有被后面的代码多次调用,这暗示着问题的关键正在于此。
5.png

分析其余开发者Fork的EhViewer也可以发现,他们同样对原始代码做出了这一修改(下图以NekoInverter发行版本代码为例)
NekoInverter代码.png

虽然听起来颇具戏剧性,但正是这小小的一个字母造成了无法显示评论的Bug。

查阅相关资料可知,SimpleDateFormat可以生成一段标准化的时间信息,其中的参数z代表声明时区。
观察E-Hentai现在的评论区可知,时间位置的确没有UTC标识。
EhCommentNow.png
观察E-Hentai曾经的评论区可知,时间位置的确有UTC标识。(下图是笔者在2020年7月的随手截图,没想到竟然在这里派上了用场)
EhCommentPast.png

由此确定,正是因为E站调整了评论区的时间格式,导致EhViewer 1.7.3无法正常处理数据,最终无法显示画廊评论。

至于解决方法,更新EhViewer即可。

Hippo开发的原生EhViewer的最新版本号为1.7.7(但此版本目前无法直连E站),可以到他的Telegram频道里获取。

由爱好者们开发的,且更新较为稳定的的则是NekoInverter版(特征是乳白色的应用图标,笔者个人更推荐使用此发行版本)和xiaojieonly版(疑似存在代码抄袭争议)。
NekoInverter的项目地址为https://gitlab.com/NekoInverter/EhViewer
xiaojieonly的项目地址为https://github.com/xiaojieonly/Ehviewer_CN_SXJ

两位作者各自的发行版本均已解决评论区Bug,并各自为EhViewer添加了一些特色功能,且都能实现对E站的直连,感兴趣的读者可以自行查阅并安装。

四. 后记

尽管笔者啰里啰嗦地写了这么一大堆,但现在看来,这实在是一个小得不能再小、简单得不能再简单的问题,恐怕这也正是开发者们没有多费口舌的原因之所在。

不过另一方面,尽管笔者在这篇文章的写作上并没有消耗太长时间,但在探究这个问题时,的确是投入了不少精力。光是去认识EhViewer的各个模块,理解其功能与运作就颇费心思,尤其是对于笔者这样的只学过一学期Java公选课的编程苦手。

不过,去探索未知的新鲜事物,这个过程本身又是极具趣味的。当最后发现问题的谜底时,心中真的感到非常愉悦畅快。在探索的路上,笔者还发现了一些其它有趣的事情。比方说,EhViewer的收藏功能其实是调用了E-Hentai本身的Favorite功能;原生EhViewer内置的hosts颇为老旧,而且没有对exhentai.org的解析(这一认识在ExHentai受到DNS污染时起到了重要作用)……

祝笔者自己在未来的科研工作中也能够保留这份纯粹的探索的热情并有所收获。XD

感谢群友@1492 向笔者无私提供的答疑、指导与启发。

已有 8 条评论

  1. pluvet

    厉害,喜爱探索的人都有成为大佬的潜质

    1. 诶诶,你已经回家了吗!

      1. pluvet

        你怎么知道的

  2. pluvet

    大侦探(

    1. 羡慕了呀,我估计要在北京留到二月份。

  3. 啊,Java啊,上学期的实验课正好在解析时间上吃了亏,还就是这个z整的。看起来人类在标准化上还是没能准确无误的达成一致,使得解析时间的时候除了要考虑数值,还得考虑时区。自从Java8加入了LocalDateTime这些不包含时区的DateTime,日子才算好过一些。。。

  4. Sdawn

    ...太巧了,前辈截图的评论中正好有一张是我的留言。
    另看着我小学时候起的用户名真的有种羞耻感啊

    1. 呼姆呼姆,还真是巧呀。

添加新评论