前排提醒:本工具仅能下载已赞助的节目,白嫖就别想了

爱发电大家应该都知道,中国版的Patreon,我在上面订阅了一个播客节目,但是爱发电官方app实在是不行,有时候在后台放着放着就莫名其妙自己切走了,万幸它有下载功能,所以我一直是下载下来然后用其他软件播放,但是这样做有几个问题

  • 下载下来的文件是存储在私有目录下的,一般的播放器是读取不了的

  • 下载下来的文件名是一串十六进制数字,也不自带元数据,相当不方便

于是重操旧业,拿python把文件全爬下来顺便把元数据也写进去。

原理

获取数据

直接F12看请求就能找到这个请求:

https://afdian.net/api/user/get-album-post?album_id=c6ae1166a9f511eab22c52540025c377&lastRank=49&rankOrder=desc&rankField=rank

album_id就是节目id,rankOrder是排序方式,有升序(asc)和降序(desc) , lastRank我没太搞懂,不过升序时可以看作offset,rankField也不知道是什么,似乎没什么用,就不管了。

然后会返回一个json, 里面有十组数据,具体有标题、节目封面url、音频url等,一个请求获取所有信息,非常舒服。

一开始看开发者工具里的请求,里面音频的url都带着ts=xx&us=xxx&sign=xxxx之类的参数,看着十分骇人,还以为要去翻js了,后来才发现这个url貌似是直接通过api获取的,而不是本地算的。

写入元数据

我用的模块是eyed3,程序初版写完以后在使用过程中发现了一个奇怪的问题:中间有几十期节目是没有元数据的,研究了一下是因为eyed3对于不支持的文件格式会直接返回None,所以元数据写不进去,用file看了一下文件类型:

# 不支持的文件
$ file failed.mp3
failed.mp3: ISO Media, MP4 Base Media v1 [ISO 14496-12:2003]
# 支持
$ file ok.mp3
ok.mp3: Audio file with ID3 version 2.4.0, contains: MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, Stereo

我对音频编码也不甚了解,想了想直接上ffmpeg:

$ ffmpeg -i failed.mp3 ok.mp3

就ok了。

又发现虽然在dolphin里预览的封面是没问题的,但是用Elisa打开之后所有文件的封面都变成一样的了,然后传到手机上也是这样的,研究一番之后发现如果专辑名相同的话就会用同一张封面,这逻辑也是挺迷的,我都写文件里了你还上赶着用其它的封面。

使用

首先需要从cookies里获取auth_token,方法有很多,就不赘述了。

$ git clone git@github.com:senventise/afdian_podcast_down.git
$ cd afdian_podcast_down
$ auth_token="YOUR_TOKEN" python main.py

顺带提一嘴,脚本里加了一些sleep,一是为了避免可能存在的反爬策略(我估计是没用的),二是避免给服务器带来太大的压力,不当家不知柴米贵,以前写爬虫的时候各种多线程,效率拉满,现在是不好意思这么干了,反正也不是很需要下得这么快。