python3写的腾讯漫画下载器
博客专区 > Feng_Yu 的博客 > 博客详情
python3写的腾讯漫画下载器
Feng_Yu 发表于4年前
python3写的腾讯漫画下载器
  • 发表于 4年前
  • 阅读 3741
  • 收藏 19
  • 点赞 1
  • 评论 28

移动开发云端新模式探索实践 >>>   

摘要: 练手之作而已

代码很稀烂,开坑后一个月的时间,断断续续总算是写完了,主体功能完成,顺便PYQT5写了个GUI,并用cx_freeze打包,可以在windows下用。

项目托管在github: https://github.com/abcfy2/getComic

git@osc镜像仓库: http://git.oschina.net/abcfy2/getComic

预览效果

放几张预览图,支持不连续的章节选择下载。

windows下的效果:

在此输入图片描述

在此输入图片描述

deepin下效果:

在此输入图片描述

算法描述

腾讯的漫画从PC版访问时看到的是flash,但是移动版的页面却是图片,用ipad的UA请求ac.qq.com可以发现跳转为m.ac.qq.com,从这里入手就可以下载jpg的图片了。

页面的图片是用js生成的,用文本编辑器手工换行就可以很明确的看到js获取图片URL的算法,用python实现即可。

对于http://ac.qq.com/bleach, http://ac.qq.com/cf等这样的地址,用ipad的UA请求后可以直接跳转为m.ac.qq.com的地址,这个地址会带有id参数,就可以获取到图片了。

标签: python3 pyqt 腾讯
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 150
博文 38
码字总数 45477
评论 (28)
真座山雕
pyqt这个界面怎么用啊,python新人飘过
子弹兄
我也该学学python了
Feng_Yu

引用来自“maxue”的评论

pyqt这个界面怎么用啊,python新人飘过
找些资料学就行了,pyqt官方也有很多范例
kazelove
没有实体软件来试一下呀
kazelove
我看错了,原来里面有下载来试用,嗯~!文件好多,还要试一下原理
kazelove
实际用了一下,下了一话不到就出现"远程主机强迫关闭了一个现有的连接"可能是下载得太快,被关闭了连接之后再试也只会下几张就下不了
Feng_Yu

引用来自“kazelove”的评论

实际用了一下,下了一话不到就出现"远程主机强迫关闭了一个现有的连接"可能是下载得太快,被关闭了连接之后再试也只会下几张就下不了
腾讯服务器应该是做了流量控制,我当初测试的时候试过并发下载,要不了一会就会被服务端ban掉。所以后来全改成单线程下载了,一张图片一张图片的下载,腾讯的服务器质量不错,这样速度也不会很慢。就一直这样用了。我刚刚才测试了一下,在我这边没有出现过你的情况,疑似是你那边网络出现了什么问题。按理说一张一张下载不太可能被服务器ban掉
Feng_Yu

引用来自“kazelove”的评论

实际用了一下,下了一话不到就出现"远程主机强迫关闭了一个现有的连接"可能是下载得太快,被关闭了连接之后再试也只会下几张就下不了
下载了几画,的确有这个问题。我的这个脚本应该是已经被腾讯看到了,改了好几次,基本已经不能像以前那么奔放了。刚写出来的时候是可以爬到收费漫画的,然后去年12月底腾讯网站就改版了一次,请求头必须带上refer,详见这个issue: https://github.com/abcfy2/getComic/issues/3 。当时修复了这个issue,结果不到一个月,腾讯再次改版,彻底无法下载到收费漫画了(以我目前的能力暂时没什么好办法在不登录的情况下下载)。你不说我都没注意,我今天才发现这个问题,看来腾讯又有黑科技了,可能有办法查到这个非浏览器请求。看来我得想一些更好的办法,更好的模拟浏览器请求了。
Feng_Yu

引用来自“kazelove”的评论

实际用了一下,下了一话不到就出现"远程主机强迫关闭了一个现有的连接"可能是下载得太快,被关闭了连接之后再试也只会下几张就下不了
这次的问题暂时不清楚腾讯通过什么机制来判定非浏览器请求的(有无js/css请求,请求图片的频率,还是其他算法?)所以我暂时没什么好办法修复这个问题,只能苦逼的反复点击下载了,遇到同名文件会跳过,使用这种简单的算法实现续传。
Feng_Yu

引用来自“kazelove”的评论

实际用了一下,下了一话不到就出现"远程主机强迫关闭了一个现有的连接"可能是下载得太快,被关闭了连接之后再试也只会下几张就下不了
好吧,发现我自己傻掉了,我干嘛要费心研究服务端的deny机制。简单粗暴,下载失败只要重试就行了……目前修改了下代码,改用新的机制,遇到异常就等待2s后重试,先这么解决吧。cx_freeze打包还得等等,可以先下载源码运行。本次递交详情: https://github.com/abcfy2/getComic/commit/5b72ba4753854b038e054a13fee18d5777091170
fashu
http://m.ac.qq.com/View/mGetPicHash?id=505430&cid=801,这个地址我爬了以后返回的是空数据,请问你是怎么访问得到数据的?
Feng_Yu

引用来自“fashu”的评论

http://m.ac.qq.com/View/mGetPicHash?id=505430&cid=801,这个地址我爬了以后返回的是空数据,请问你是怎么访问得到数据的?
用浏览器打开这个漫画页,然后看浏览器的请求头信息。印象中是需要带上refer头的,否则就是空的。最早的时候这个地址直接可以打开,甚至可以爬取到收费漫画,后来腾讯就一改再改,现在收费漫画基本已经无法通过这样的方式下载了。另外就是,PC页面也改版了,不再是flash了,而是页面上直接写了一串加密过的base64,暂时没细读js,没仔细研究这段base64反解码之后怎么解密。
fashu

引用来自“fashu”的评论

http://m.ac.qq.com/View/mGetPicHash?id=505430&cid=801,这个地址我爬了以后返回的是空数据,请问你是怎么访问得到数据的?

引用来自“Feng_Yu”的评论

用浏览器打开这个漫画页,然后看浏览器的请求头信息。印象中是需要带上refer头的,否则就是空的。最早的时候这个地址直接可以打开,甚至可以爬取到收费漫画,后来腾讯就一改再改,现在收费漫画基本已经无法通过这样的方式下载了。另外就是,PC页面也改版了,不再是flash了,而是页面上直接写了一串加密过的base64,暂时没细读js,没仔细研究这段base64反解码之后怎么解密。
我带了,Referer:http://m.ac.qq.com/Comic/view/id/505430/cid/801/pid/18449,要不你帮我访问试试,我这试了好久还是不行啊,读出来的一直都是空白,没有任何数据!
Feng_Yu

引用来自“fashu”的评论

http://m.ac.qq.com/View/mGetPicHash?id=505430&cid=801,这个地址我爬了以后返回的是空数据,请问你是怎么访问得到数据的?

引用来自“Feng_Yu”的评论

用浏览器打开这个漫画页,然后看浏览器的请求头信息。印象中是需要带上refer头的,否则就是空的。最早的时候这个地址直接可以打开,甚至可以爬取到收费漫画,后来腾讯就一改再改,现在收费漫画基本已经无法通过这样的方式下载了。另外就是,PC页面也改版了,不再是flash了,而是页面上直接写了一串加密过的base64,暂时没细读js,没仔细研究这段base64反解码之后怎么解密。

引用来自“fashu”的评论

我带了,Referer:http://m.ac.qq.com/Comic/view/id/505430/cid/801/pid/18449,要不你帮我访问试试,我这试了好久还是不行啊,读出来的一直都是空白,没有任何数据!
哦,我知道怎么回事了。我看了下我的代码以及我的递交记录。腾讯第一次改版的时候是需要在cookie中带上ac_refer=这个参数的,当时是自己在chrome开发者工具中一个个关闭cookie参数中测试出来的,详见这个issue: https://github.com/abcfy2/getComic/issues/3。然后我修改代码没多久,腾讯再次改版,这次需要同时加上Refer头才可以。但是访问相关的页面之后,网站会返回Set-Cookie让浏览器的cookie中带上ac_refer,我的代码使用了request.session,会hold住cookie,所以我的代码只加了Refer头。最后,用curl测试的命令: $ curl -v -H 'Referer: http://m.ac.qq.com/Comic/view/id/505430/cid/801/pid/18449' -H 'Cookie: ac_refer=http://m.ac.qq.com/Comic/view/id/505430/cid/80 1/pid/18449' 'http://m.ac.qq.com/View/mGetPicHash?id=505430&cid=801' 搞定
Feng_Yu
curl -v -b cookies.txt -c cookies.txt -H 'Referer: http://m.ac.qq.com/Comic/view/id/505430/cid/801/pid/18449' 'http://m.ac.qq.com/View/mGetPicHash?
id=505430&cid=801' 请求两次,你就会发现返回json了,第一次请求的时候服务端响应头已经有Set-Cookie: ac_refer=http%3A%2F%2Fm.ac.qq.com%2FComic%2Fview%2Fid%2F505430%2Fcid%2F801%2Fpid%2F18449; 这个我记得我当时改这段代码的时候是没有的,不知道什么时候加上了。打开cookies.txt,也可以看到加入了这个cookie
fashu

引用来自“Feng_Yu”的评论

curl -v -b cookies.txt -c cookies.txt -H 'Referer: http://m.ac.qq.com/Comic/view/id/505430/cid/801/pid/18449' 'http://m.ac.qq.com/View/mGetPicHash?
id=505430&cid=801' 请求两次,你就会发现返回json了,第一次请求的时候服务端响应头已经有Set-Cookie: ac_refer=http%3A%2F%2Fm.ac.qq.com%2FComic%2Fview%2Fid%2F505430%2Fcid%2F801%2Fpid%2F18449; 这个我记得我当时改这段代码的时候是没有的,不知道什么时候加上了。打开cookies.txt,也可以看到加入了这个cookie
恩恩,那就是我没有加上Cookies了,我再试试,不会再来请教,谢谢啦
Feng_Yu

引用来自“Feng_Yu”的评论

curl -v -b cookies.txt -c cookies.txt -H 'Referer: http://m.ac.qq.com/Comic/view/id/505430/cid/801/pid/18449' 'http://m.ac.qq.com/View/mGetPicHash?
id=505430&cid=801' 请求两次,你就会发现返回json了,第一次请求的时候服务端响应头已经有Set-Cookie: ac_refer=http%3A%2F%2Fm.ac.qq.com%2FComic%2Fview%2Fid%2F505430%2Fcid%2F801%2Fpid%2F18449; 这个我记得我当时改这段代码的时候是没有的,不知道什么时候加上了。打开cookies.txt,也可以看到加入了这个cookie

引用来自“fashu”的评论

恩恩,那就是我没有加上Cookies了,我再试试,不会再来请教,谢谢啦
cookie的ac_refer这个参数为空都是可以的。所以你只需要设置一下header,加上{'Cookie': 'ac_refer='}就可以了
fashu

引用来自“Feng_Yu”的评论

curl -v -b cookies.txt -c cookies.txt -H 'Referer: http://m.ac.qq.com/Comic/view/id/505430/cid/801/pid/18449' 'http://m.ac.qq.com/View/mGetPicHash?
id=505430&cid=801' 请求两次,你就会发现返回json了,第一次请求的时候服务端响应头已经有Set-Cookie: ac_refer=http%3A%2F%2Fm.ac.qq.com%2FComic%2Fview%2Fid%2F505430%2Fcid%2F801%2Fpid%2F18449; 这个我记得我当时改这段代码的时候是没有的,不知道什么时候加上了。打开cookies.txt,也可以看到加入了这个cookie

引用来自“fashu”的评论

恩恩,那就是我没有加上Cookies了,我再试试,不会再来请教,谢谢啦

引用来自“Feng_Yu”的评论

cookie的ac_refer这个参数为空都是可以的。所以你只需要设置一下header,加上{'Cookie': 'ac_refer='}就可以了
恩恩,cookies里面必须要有ac_refer而且不能为空,我现在实验的要是为空的话是得不到数据的
Feng_Yu

引用来自“Feng_Yu”的评论

curl -v -b cookies.txt -c cookies.txt -H 'Referer: http://m.ac.qq.com/Comic/view/id/505430/cid/801/pid/18449' 'http://m.ac.qq.com/View/mGetPicHash?
id=505430&cid=801' 请求两次,你就会发现返回json了,第一次请求的时候服务端响应头已经有Set-Cookie: ac_refer=http%3A%2F%2Fm.ac.qq.com%2FComic%2Fview%2Fid%2F505430%2Fcid%2F801%2Fpid%2F18449; 这个我记得我当时改这段代码的时候是没有的,不知道什么时候加上了。打开cookies.txt,也可以看到加入了这个cookie

引用来自“fashu”的评论

恩恩,那就是我没有加上Cookies了,我再试试,不会再来请教,谢谢啦

引用来自“Feng_Yu”的评论

cookie的ac_refer这个参数为空都是可以的。所以你只需要设置一下header,加上{'Cookie': 'ac_refer='}就可以了

引用来自“fashu”的评论

恩恩,cookies里面必须要有ac_refer而且不能为空,我现在实验的要是为空的话是得不到数据的
请求这个json页面,如果是收费漫画的话只能返回第一张预览图片了。最早是可以返回整个漫画章节的,当时腾讯只在前端页面做了认证,api却没有认证,现在不行了。我以为PC端页面会不一样,刚才看了一下,收费章节的base64串明显短,在开发者工具调试js运行结果也看到解密出来的也只有一张图。如果你有什么好办法在不登录的情况下能拿到收费章节的列表,也欢迎分享。
法人代表
好像python3 TX comic这个失效了,不知道还有救没
×
Feng_Yu
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: