爱发电podcast下载
前排提醒:本工具仅能下载已赞助的节目
爱发电大家应该都知道,中国版的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
,一是为了避免可能存在的反爬策略(我估计是没用的),二是避免给服务器带来太大的压力,不当家不知柴米贵,以前写爬虫的时候各种多线程,效率拉满,现在是不好意思这么干了,反正也不是很需要下得这么快。