漫画追踪器Tracker
1. 动机
关注漫画的人肯定会发现漫画的更新时间差异非常大:有的一个星期更新一集,有的一个月更新一集,有的一季度更新一集。如果关注的是日本漫画,并且不会日文,那么更新后的漫画还要等待汉化组翻译成中文才能看。这一等,少则几小时,多则几个星期。
等得多了,就会产生这样一种想法:如果漫画更新后能通知我就好了。有的漫画网站抓住了这种想法,增加了关注的漫画更新后就发邮件通知的功能。但是,对于不经常查看邮箱的人来说,这种功能并没有多大帮助。于是,就有了进一步的想法:如果关注的漫画更新后,就立刻下载到我的电脑上,并且弹出提示框就好了。
根据这个想法形成的工具正是tracker。因而它的核心功能就是追踪漫画——当关注的漫画更新时,立即下载到指定文件夹,并弹出对话框提示。
2. 关键功能实现
实现tracker的追踪功能的难点在于漫画更新的判定,而下载功能的难点则是搞定漫画网站的防盗链/防盗图。以下以99漫画网(http://www.99comic.com)为例说明这两个功能是如何实现的。
2.1 判定漫画更新
在99漫画网中,打开《火影忍者》可以得到如下页面:
从上图可以得到一个猜测,漫画集数都放在同一个div中(观察该页面的源代码可以证明这个猜测是正确的)。既然如此,当漫画更新了,新一集的名称必然也是放在这个div中。根据这个特性,可以得到如下想法:记录div的当前集数,并每隔一定时间访问该页面,如果发现div中集数增加了,就说明漫画更新了。
此外,如果仔细观察页面,会发现有一个漫画更新时间(即图中红圈圈出部分)。既然是漫画更新时间,那么当漫画更新了,这个时间也应该更新。换句话说,只要记录更新时间,并每隔一定时间判定更新时间是否改变,就能判断漫画是否更新。
利用更新时间来判定是否更新在省功夫的同时,也意味着会缺失更多的信息——不清楚更新的是什么。此外,也不能确保漫画更新的同时,更新的时间会马上改变。基于以上考虑,最后实现时采用的想法是第一个想法,记录div中的漫画集数。
以下是该想法实现的流程图:
2.2 下载功能
通常来说,如果知道一张图片的URL地址,下载这张图片是相当简单的。但是99漫画网出于防盗链/防盗图的考虑,将URL地址隐藏了。所以难点就变成了找到图片的URL地址。为了更好地分析图片的URL地址是如何隐藏的,我使用了Paros来截取http请求以及回应。以下开始分析。
点击火影忍者570集(http://www.99comic.com/manhua/99168/list_90873.htm?s=9 ),在Paros中查找是哪一个请求得到图片的。
在显示该漫画图片的网页的源代码中(图3-5用红色方框所圈出的那部分),可以找到图3-3请求的URL的一部分。但是前面那部分URL却没办法在源代码中找到。也就是说,存放图片服务器的URL被该漫画网站用其它方法隐藏了。
检查打开漫画图片所在网页时收到的全部回应后,在一个脚本的回应中找到了服务器的URL(图3-6用红圈圈出部分)。这个脚本请求的服务器URL是漫画网站的名称,而相对URL则可以在漫画图片所在网页的源代码中找到(图3-5用红圈圈出部分)。
找到了隐藏服务器的URL,还有相对URL,分析是不是能结束了。不能!因为现在有一个疑点——在脚本的回应中(图3-6),列出了很多服务器的URL。这意味着不同漫画或者不同时候会使用不同的服务器。所以还要分析整个脚本,找到是如何选择服务器的。不过,分析脚本的过程比较复杂,这里就直接给出分析结果:选择哪一个服务器与漫画所在页面的URL有关系。
总结以上过程,可以得到这样的获取方法:先请求漫画图片所在网页的URL,在回应中提取图片的相对URL,脚本的相对URL。然后利用漫画网站名称和脚本的相对URL,构造出完整的脚本URL,并请求该脚本。利用逆解析函数分析脚本回应,得出图片的服务器URL。最后,将图片的服务器URL与相对URL结合起来,并进行请求,就能得到图片了。
3. 使用Tracker的追踪功能
第一步,首先在搜索漫画栏写上自己要追踪的漫画名称,然后按下回车键或者搜索按钮。如果搜索结果没有发现自己想要的漫画,可尝试更换来源网站
第二步,单击想要追踪的漫画。PS:这时会出现漫画的简介与当前的集数。
第三步,点击追踪漫画的按钮,这时会弹出如下图所示的一个对话框。
第四步,选择一个保存用的文件夹。当漫画更新时,就会将最新那集下载到这个文件夹中。
第五步:想要追踪时,就开着这个软件。当漫画更新,会有以下提示:
PS:你可能会说577不是已经出了吗?这是BUG吗?不是,这是我为了演示,修改配置文件造成的
4. 下载
a. Tracker V1.1: http://115.com/file/c2k6ztfr#
b. JVM:http://java.com/en/download/inc/windows_upgrade_ie.jsp
PS:当无法打开Tracker时,才下载JVM