自己的 QQ 与目标 QQ 是好友关系。
Golang 能够抓取的相册一定是对方允许访问的相册,超越权限的事情是无法做到的。
方案依旧可用
上一个老办法是 Python 版本,是一个整体解决方案。
Python 负责登录 Qzone,Python负责获取照片 URI, Python负责启动多线程下载照片。
在步骤Python登录Qzone中,因为腾讯产品政策的变更,导致Python第三方库 qqlib 无法成功登录Qzone,所以解决方案失效了。
在这次的办法中,将这三个步骤拆分,每个步骤交给最擅长的工具去完成。
文件放在 /goqzone
目录。
第一步骤,使用Chrome(或其他浏览器,需要自己去适配)登录 Qzone,此时浏览器记录了Qzone登录需要的 Cookies
第二步骤,使用Go语言编写的程序,借助上一步骤 Chrome 的Cookies,
获取所有相册(也可以自行修改程序增加过滤需求)中所有照片的 URI ,组装为 aria2 格式。
第三步骤,使用 aria2 下载照片,下载使用的配置文件是上一步骤的。
有工具 http://aria2c.com/ 查看下载进度和实时下载速度。
使用Chrome登录Qzone就是我们的常规使用方式。
如果你使用的是其他浏览器,那么你需要自己适配程序代码中读取浏览器 Cookies 部分。
获取照片程序编译命令
直接运行
go build -v
运行命令为
./main -self <你的QQ> -target <目标QQ>
运行时需要读取 Chrome Cookies 文件,需要一定权限。在MacOS 表现为弹窗需要输入笔记本密码。
获取照片程序运行后,生成两个给Aria2
使用的文件
$ tree
.
├── aria2.conf
├── qzone.aria2.session
同时也会给出你要继续运行的命令,直接拷贝运行即可,比如
aria2c --conf-path=/xxx/git_src/qzone_photo/goqzone/src/aria2.conf
获取照片URI可能遇到以下错误:
got err= 对不起,您尚未登录或者登录超时。”,说明你的浏览器Cookies登录过期了。
需要刷新在浏览器中的登录,然后重新运行程序获取照片。
各平台(Windows, Linux, MacOS) 的Chrome Cookies 路径可能不相同,还缺乏适配工作。
目前支持 MacOS Chrome。
aria2 是下载工具中的佼佼者,我们这次也要借助这个工具完成照片的下载。
在实现中,我曾借助 Golang 中便利的并发便利条件,使用 Golang 原生HTTP下载照片,下载效果很不理想。
难以应付死链,下载慢。
aria2 支持我们照片下载中最需要的断点续传需求,同时还支持同一个文件的并发下载。
下载是一个耗时任务,我们可能因为网速不理想下载慢,或者需要断网一段时间后重新恢复下载,因此 aria2 是我们的理想工具。
我曾试图寻找一个 libarai2 的 Golang 绑定(bindings),来解决多步骤间的衔接问题,但是不理想。
目前的解决方案还是人工手动启动 arai2 下载,人工来辨识下载任务的完成来终结 aria2 的运行。
下载中避免不了死链,有的照片URI就是无法下载了,通过浏览器访问该地址都是超时的,
你可以在 qzone.aria2.session
文件中搜索URI,找到该照片的原图URI和正常图片URI,来做进一步处理。
下载文件命名格式为 <相册名字>_<照片名字>_<照片在相册中的索引>.png
。
aria2.conf
文件中 load-cookies=
这一行是使用的浏览器 Cookies 路径,与上面使用的方式一致。
考虑到 Aria2 下载耗时久,如果遇到 Cookies 失效,可以自己重新在 Chrome 中登录一次,然后重新运行下载,
即可断点续传,或者更高级的,更换了 Cookies 读取路径也是可以的。
-
向脚本填写自己的 QQ 账号,填写 1 个或 多个他人 QQ 号码,批量下载对方所有相册。
-
运行脚本所需的模块都在脚本头部注明。
-
此脚本学习了保存在 GitHub 中多个作者的相册获取方法,成功用此脚本成功获取到指定人的所有相册原图。
-
这种 hack 的方式获取 Qzone 文件是存在有效期的。
-
update 2018.01.07 失效
失败位置 qqlib 登陆失败,返回错误 "提交参数错误,请检查"
qqlib 相关 issue gera2ld/qqlib#23
猜测原因是 API 有所调整,相关新闻 永别了塞班,已无法登录QQ和微信
-
update 2017.05.09 有效
-
update 2017.05.01 有效
-
update 2017.02.20 有效
-
-
如果遇到无效的,可能是 Qzone API 发生变化,则需要更改代码重新测试。