开源仓库
https://gitee.com/erma0/douyin
介绍
Python
取数据 + Vue
写界面 + Aria2
下载
依据抖音各种链接或各种id,通过网页接口采集视频作品,并下载作品到本地。
反对用户主页链接或sec_uid/话题挑战和音乐原声链接或ID。
反对下载喜爱列表(需喜爱列表可见)
局部用户可下载喜爱列表(需喜爱列表可见),局部用户不可下载(即便喜爱列表可见也不行),目前不晓得起因哈,猜想跟账号无关,不晓得是设置问题还是账号注册日期问题(和sec_uid带不带下划线无关),测试账号后果见user.txt
。
测试环境:Python3.7
+pip最新
+Win10_x64
依赖装置失败自行百度或更换Python及pip版本解决;UI启动报错猜想是pywebview库调用的浏览器不兼容Vue;
应用
0x00 装置依赖
在程序目录关上命令行,输出
pip install -r requirements.txt
0x01 应用UI界面
双击关上启动.bat
,或者在程序目录关上命令行,输出
python ui.py
0x02 间接批改douyin.py
中相干参数应用
齐全不懂Python的敌人用命令行
或操作界面
。
有根底的可查看源码应用,或查看当前页源码,因为之前写的正文内容被正文掉了
<!--
实例化工作对象,可指定采集类型及采集作品数量,默认为用户作品、不限数量全副采集
task = Task() # 用户作品# task = Task(type='like', limit=10) # 用户喜爱(不可用)# task = Task(type='music', limit=10) # 音乐原声# task = Task(type='challenge', limit=10) # 话题挑战
下载
单个下载
target = "要下载的链接或ID"task.download(target)
批量下载
target = 'user.txt' # 文件门路task.download_batch(target)
-->
0x03 从命令行应用
exec.py
间接运行可查看命令列表,或应用
-h
参数查看帮忙python exec.pypython exec.py -hpython exec.py download -hpython exec.py download_batch -h
应用函数名调用程序
--type 指定下载类型,默认值:--type=user--limit 指定采集数量,默认值:--limit=0(不限度)
例如采集某用户全副作品:
python exec.py download https://v.douyin.com/xxxx/python exec.py download 用户的secuid
例如采集某用户喜爱的前10个作品:
python exec.py download MS4wLjABAAAAl7TJWjJJrnu11IlllB6Mi5V9VbAsQo1N987guPjctc8 --type=like --limit=10python exec.py download 用户的secuid
例如采集某音乐原声前10个作品:
python exec.py download https://v.douyin.com/xxxx/ --type=music --limit=10python exec.py download 音乐ID --type=music --limit=10
TODO
- [x] 采集用户作品
- [x] 调用Aria2下载
- [x] 话题/原声作品采集
- [x] 喜爱作品采集
- [x] 导入文件批量采集
- [x] 命令行调用
- [x] 用webview写界面
- [x]
打包exe不打包了,间接装个Python环境更简略
知识点
抖音相干
- 网页接口复原了,一次申请即可取回数据
- UID简直没用了,拼不成主页链接了,所有接口都是sec_uid
- signature可固定了,不必再扣JS了
- 作品中间接蕴含无水印视频地址了,不须要挪动端UA也可跳转
- 话题/音乐作品数目
- 2021.04.02 喜爱列表也有数据了
Aria2相干
- aria2p库应用体验还不错
- 大部分Aria2下载都是通过rpc接口实现的,这个也一样
- 须要本人下载
Aria2c.exe
来开启服务,所以要用代码实现主动启动服务 若文件已存在则跳过下载的办法:
--auto-file-renaming=false
可行,但控制台应用会报错,尽管报错不影响-c
可行,且控制台不报错
- 增加下载工作时通过指定
options = {'out': filename}
指定文件名,即-d
- Aria2会依据指定门路及指定文件名主动创立下载目录
- Aria2指定门路及文件名中不能传入非法字符串(*|等),所以写了
Download.title2path
静态方法 - 监听事件要手动进行,不进行会阻塞过程,导致程序无奈敞开
- 未发现实时获取工作进度及下载速度的函数,本人写了循环监听回调办法
Python相干
- 通过
os.popen
或subprocess.Popen
实现子过程关上程序,无界面,不阻塞 - 继承父类后重写init时,通过super().__init__()调用父类构造方法
- 继承父类后重写办法时,不能重写公有办法,不能读取公有成员
- 参数指定类型提醒挺好用,不便调用参数的函数时主动补全
- 可通过
if 'PROGRAMFILES(X86)' in os.environ
简略判断零碎是否为64位 - Pylance的主动导入依赖性能很好用,就是感觉时灵时不灵,从新开关后又能够用
- vscode默认启动门路是以后我的项目门路,在
launch.json
中加一句"cwd": "${fileDirname}",
即可,不过主动补全pylance就无奈辨认绝对目录了 - 用pipreqs一键生成以后我的项目依赖:cmd切换到我的项目门路,
pipreqs ./ --encoding=utf-8 --force
命令行模块fire相干
- 最简略的办法就是间接一个fire.Fire(),裸露全副函数
- 如果用类或对象裸露,类参数须要独自指定
- 组合命令须要用不同的类,裸露的类中引入需用组合命令的类,然而在这个批量下载的场景下感觉比拟繁琐,所以间接加了个参数,分两个函数来调用
UI模块pywebview相干
- 能够把一个类的实例裸露给页面js_api,通过
pywebview.api.func().then(() => {})
调用Python函数 - 也能够把Flask等服务实例裸露给页面js_api(无需url参数),在外部实现index.html
- Python中通过
window.evaluate_js('JS代码')
调用JS办法 - 在UI中,类的初始化无奈传参,所以须要从新定义init
- 在UI中,须要公开的类实例办法不能以下划线
_
结尾 - 创立UI时设置的窗口宽高,如同和网页中大小不一样,值须要比网页中大一些