惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
N
News and Events Feed by Topic
P
Privacy International News Feed
The Hacker News
The Hacker News
Schneier on Security
Schneier on Security
C
Cybersecurity and Infrastructure Security Agency CISA
Security Latest
Security Latest
L
LINUX DO - 最新话题
阮一峰的网络日志
阮一峰的网络日志
Cisco Talos Blog
Cisco Talos Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
博客园 - 【当耐特】
博客园 - Franky
P
Privacy & Cybersecurity Law Blog
Attack and Defense Labs
Attack and Defense Labs
云风的 BLOG
云风的 BLOG
月光博客
月光博客
D
Docker
Webroot Blog
Webroot Blog
The GitHub Blog
The GitHub Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
W
WeLiveSecurity
S
Security Affairs
Martin Fowler
Martin Fowler
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Security Archives - TechRepublic
Security Archives - TechRepublic
Microsoft Azure Blog
Microsoft Azure Blog
C
CERT Recently Published Vulnerability Notes
B
Blog
L
Lohrmann on Cybersecurity
T
Threatpost
量子位
S
Schneier on Security
V
Visual Studio Blog
S
Securelist
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
aimingoo的专栏
aimingoo的专栏
The Register - Security
The Register - Security
I
Intezer
Stack Overflow Blog
Stack Overflow Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 聂微东
小众软件
小众软件
罗磊的独立博客
雷峰网
雷峰网
Recorded Future
Recorded Future

博客园 - AnewR

话说最近更新的好快 无题 从三月到四月 无题 cmangarobot 懒人的漫画下载工具[0.1] 懒人的漫画下载工具[基本能用版] 我要工作了 daily 9.29 八月 七月 ZOJ 200 超 我也酷他一把——EMACS + GDB 小试牛刀 自动登录DISCUZ,发帖的代码(部分) 最近一直在自己写的ChuanDaily上写东西 hello,idle 庆幸:软设考过了 关于那个快速启动的控制台小程序 无聊的练习编程
zxmh.net 的漫画下载
AnewR · 2008-02-10 · via 博客园 - AnewR

关于那个批量下载漫画的工具,最近还在继续完善,这些天有些进展,又有些失望。
最大的打击就是在网上找到了一个已经写的很好的同类工具了,叫MangaDowner(http://www.tortinita.org/),已经更新到5.2了,看来作者还是很努力的。
早知道有这个工具的话,我才不去自己写呢,试用了一下发现很好用。他的思路大概和我的差不多,都是先取得章节URL,然后获得/计算出图片URL列表。而且那位叫tortinita的仁兄多写了一个导出功能,这样就可以用成熟的下载工具来下载图片了。在此之前我一直还在为断线重传和多线程下载的不稳定而烦恼,想不到windows下面也有这么好的办法——虽然没有shell中的wget可以调用,但是flashget和迅雷都是可以导入下载列表的。不过这样也有一点不好,漫画每一话的目录需要自己建立(引用也需要自己填写),稍微麻烦了一点(这也暴露了windows下面工具结合不够好的弱点),我打算写一个调用wget下载的功能,这样,处理起来安逸些。
于是,偷懒的解决了大问题。^_^
这个MangaDowner似乎不提供源码,所以用的人也没办法自己添加可用网站。

逛了一下作者的blog,然后发现,对于www.zxmh.net这个网站的漫画,MangaDowner只能获取列表,而不能把图片地址正确的得到。而这个网站正是我最先想要处理的,由于当时没搞明白他是怎么做的,就拿了个别的HTML处理图片的网站来开刀。

断断续续看了好些时候,吃过晚饭后终于把问题初步解决了。下面是我对www.zxmh.net的分析过程。
首先打开html源码一看……哇,好干净,就几个table,外加些许js链接。
那些链接指向的js,都无法直接访问,没关系,ff中有缓存呐,访问过页面后,再打开一个标签填上地址,这样就能看到js的内容了。但是有好多个js,而javascripts是我第二讨厌的东西(第一是他叔叔java),看起来真是痛苦。更可气的是这个站点把好好的js切的四分五裂,中间还有个硕大无比的unicodetoansi表。
稍微动点鼠标获得了一张图片的地址,可是无法访问,用flashget试了一下居然不能下载,写了段python添加referer也没用(本来flashge就有这功能的),该死,难道用了什么YD的手段。我也算是做过一些web程序了,看到返回的值不是404,而是IIS的错误警告,很明显有防盗链的作用,这种站点不会用太高级的东西吧,于是又试了N个不同的referer,无用,甚至连那些js都无法获取。
无奈中看到url中有个带?p=xx的尾巴,该不会用了点server端脚本吧,检查了一下站点cookies,好家伙,一大把cookies。找了半天没发现这些东西中有什么玄机。ie的cookies也看了,没啥区别。
中途还陪爸妈玩了几小时牌,用一种很长条的牌玩的,我们这儿叫“乱错”。
然后把ff缓存中得到的js代码提了出来,凑了个html页面,倒是真的能从那些datas[n]="xxxx"中找出hostname和path来。可是就是无法访问,狗日的怎么搞的啊,再看了遍js代码,的确没什么高级玩意儿,就一个很弱的解码,然后操作了一下dom,最有技术含量的地方就是预处理了下一页的图片。
唉,只有抓包了,下了一个ethereal,抓了一下,包虽然不是很多,可是我这个版本的ethereal有个bug,不能导出txt文件(由此建议各位不要因为sourceforge速度不快就在什么xx软件园下东西),可把我给找坏了。在一大群qihoo,baidu和擦边球的漫画网站广告中找到了那几个js和图片的包,一看header,气得要吐血。龟儿子引用页面就是每一话的url,而我由于粗心把带?p=xx的填了进去而不能下(后来又随便试了几个更差得远的)。
好啦好啦,这下没问题了。(白费两小时啊)
然后把那段解码的js几乎是照着搬过来用python涂了一下,测试通过。为了偷懒还把unicode编码转换那部分省略了,反正我看这网站也没什么汉字URL。
如果明天后天没有同学会的话,就把这个网站的下载写好。

贴一下我的编码代码:

# -*- coding: cp936 -*-
datas = ['']*200
datas[
1= 'L94c3kvMDcDAx.';
# 省略N多
datas[192= '..YzgwNi9..DcvMTkxmpw==';
# 图片地址(实际上为图片服务器hostname)
pic_path = 'aHR.xOC4yND..0Oj.';
# 处理过程
message = '在线漫画www.zxmh.net';
keyStr 
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
def decode64(input):
    output 
= ''
    chr1, chr2, chr3 
= '','',''
    enc1, enc2, enc3, enc4 
= '','','',''
    i 
= 0
    
while i < len(input):
        enc1 
= keyStr.index(input[i])
        i 
+= 1
        enc2 
= keyStr.index(input[i])
        i 
+= 1
        enc3 
= keyStr.index(input[i])
        i 
+= 1
        enc4 
= keyStr.index(input[i])
        i 
+= 1
        chr1 
= (enc1 << 2| (enc2 >> 4)
        chr2 
= ((enc2 & 15<< 4| (enc3 >> 2)
        chr3 
= ((enc3 & 3<< 6| enc4
        output 
+= chr(chr1)
        
if enc3 != 64:
            output 
+= chr(chr2)
        
if enc4 != 64:
            output 
+= chr(chr3)
        chr1, chr2, chr3 
= '','',''
        enc1, enc2, enc3, enc4 
= '','','',''
    
return output
hostname 
= decode64(pic_path)
for i in range(1,len(datas)):
    
print hostname + decode64(datas[i])