Coder Social home page Coder Social logo

joeanamier / tiktokdownloader Goto Github PK

View Code? Open in Web Editor NEW
5.6K 35.0 896.0 17.54 MB

完全免费开源,基于 Requests 模块实现:TikTok 主页/视频/图集/原声;抖音主页/视频/图集/收藏/直播/原声/合集/评论/账号/搜索/热榜数据采集工具

Home Page: https://github.com/JoeanAmier/TikTokDownloader/wiki/Documentation

License: GNU General Public License v3.0

Python 56.39% CSS 13.71% JavaScript 13.99% SCSS 11.28% HTML 4.63%
douyin python requests tiktok css html javascript flask api csv

tiktokdownloader's Introduction

TikTokDownloader

TikTokDownloader

GitHub GitHub forks GitHub Repo stars GitHub code size in bytes
GitHub release (with filter) GitHub all releases

🔥 TikTok 主页/视频/图集/原声;抖音主页/视频/图集/收藏/直播/原声/合集/评论/账号/搜索/热榜数据采集工具:完全开源,基于 Requests 模块实现的免费工具;批量下载抖音账号发布、喜欢、收藏作品;批量下载 TikTok 账号主页作品;下载抖音链接或 TikTok 链接作品;获取抖音直播推流地址;下载抖音直播视频;采集抖音作品评论数据;批量下载抖音合集作品;采集抖音账号详细数据;采集抖音用户 / 作品 / 直播搜索结果;采集抖音热榜数据。

⭐ Windows 10 及以上用户可前往 Releases 下载已编译的 exe 程序,开箱即用!


📝 项目功能(Function)

  • ✅ 下载抖音无水印视频/图集
  • ✅ 下载 TikTok 无水印视频/图集
  • ✅ 批量下载抖音账号发布/喜欢/收藏作品
  • ✅ 批量下载 TikTok 账号发布/喜欢作品
  • ✅ 采集抖音 / TikTok 详细数据
  • ✅ 批量下载链接作品
  • ✅ 多账号批量下载作品
  • ✅ 自动跳过已下载的文件
  • ✅ 持久化保存采集数据
  • ✅ 下载动态/静态封面图
  • ✅ 获取抖音直播推流地址
  • ✅ 调用 ffmpeg 下载直播
  • ✅ Web UI 交互界面
  • ✅ 采集抖音作品评论数据
  • ✅ 批量下载抖音合集作品
  • ✅ 记录点赞收藏等统计数据
  • ✅ 筛选作品发布时间
  • ✅ 支持账号作品增量下载
  • ✅ 支持使用代理采集数据
  • ✅ 支持局域网远程访问
  • ✅ 采集抖音账号详细数据
  • ✅ 作品统计数据更新
  • ✅ 自动更新账号昵称
  • ✅ 部署至私有服务器
  • ✅ 部署至公开服务器
  • ✅ 采集抖音搜索数据
  • ✅ 采集抖音热榜数据
  • ✅ 记录已下载作品 ID
  • ✅ 扫码登陆获取 Cookie
  • ✅ 从浏览器获取 Cookie
  • ✅ 支持 Web API 调用
  • ✅ 支持多线程下载作品
  • ✅ 文件完整性处理机制
  • ✅ 自定义规则筛选作品

💻 程序界面(Screenshot)

终端交互模式:

终端模式截图


终端模式截图

Web UI 交互模式:

WebUI模式截图


WebUI模式截图


WebUI模式截图

Web API 接口模式:

WebAPI模式截图

📽 运行演示(Example)

批量下载账号发布作品

🎥 点击图片观看演示视频,建议通过配置文件管理账号,更多介绍请查阅 文档

演示视频

📈 项目状态(Status)

  • 🟢 经过测试,Releases 发布的源码已经验证所有功能正常可用
  • 🟡 TikTokDownloader 开发计划及进度可前往 Projects 查阅
  • 🔴 请注意,最新源码可能存在一些不稳定的 Bug
  • 🔴 如果在使用过程中发现程序 Bug,请及时告知作者修复
  • 🔴 某些情况下会下载到错误的 TikTok 作品,未修复
  • 🔴 夜晚无法下载高分辨率视频,疑似抖音服务端限制
  • 🔴 TikTok 平台作品下载功能失效,已修复

📋 项目说明(Instructions)

快速入门

  1. 下载 EXE 程序 或者 配置运行环境
      下载程序运行
    1. 下载 Releases 发布的 EXE 程序压缩包或安装包
    2. 解压或安装后打开程序文件夹,双击运行 main.exe
      通过源码运行
    1. 安装不低于 3.12 版本的 Python 解释器
    2. 下载最新的源码或 Releases 发布的源码至本地
    3. 运行 python -m venv venv 命令创建虚拟环境(可选)
    4. 运行 .\venv\Scripts\activate.ps1 或者 venv\Scripts\activate 命令激活虚拟环境(可选)
    5. 运行 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt 命令安装程序所需模块
    6. 运行 python .\main.py 或者 python main.py 命令启动 TikTokDownloader
  2. 阅读 TikTokDownloader 的免责声明,根据提示输入内容
  3. 将 Cookie 信息写入配置文件
      手动复制粘贴 Cookie(推荐)
    1. 参考 Cookie 提取教程,复制所需 Cookie 至剪贴板
    2. 选择 复制粘贴写入 Cookie 选项,按照提示将 Cookie 写入配置文件
      从浏览器获取 Cookie(推荐)
    1. 选择 从浏览器获取 Cookie 选项,按照提示选择浏览器类型
      扫码登录获取 Cookie(不推荐)
    1. 选择 扫码登录获取 Cookie 选项,程序会显示登录二维码图片,并使用默认应用打开图片
    2. 使用抖音 APP 扫描二维码并登录账号
    3. 按照提示操作,将 Cookie 写入配置文件
  4. 返回程序界面,依次选择 终端交互模式 -> 批量下载链接作品(通用) -> 手动输入待采集的作品链接
  5. 输入抖音或 TikTok 作品链接即可下载作品文件
  6. 更多详细说明请查看 项目文档

⭐ 推荐使用 Windows 终端(Windows 11 自带默认终端)


关于 Cookie

点击查看 Cookie 获取教程

程序功能 是否需要登录
下载账号发布作品 ⭕建议登录
下载账号喜欢作品 ⭕建议登录
下载链接作品 ⭕建议登录
获取直播推流地址 ❌无需登录
下载直播视频 ❌无需登录
获取作品评论数据 ⭕建议登录
下载合集作品 ⭕建议登录
获取账号数据 ⭕建议登录
采集搜索结果 ⭕建议登录
采集热榜数据 ❌无需登录
下载账号收藏作品 ✔️需要登录
  • Cookie 仅需在失效后重新写入配置文件,并非每次运行程序都要写入配置文件!

  • Cookie 会影响下载的视频文件分辨率,如果无法下载 1080P 视频文件,请尝试更新 Cookie!

  • 程序获取数据失败时,可以尝试更新 Cookie 或者使用已登录的 Cookie!


其他说明

  • 项目部分功能默认禁用,如需启用功能,请通过源码运行项目,并将相应代码取消注释
  • 程序提示用户输入时,直接回车代表返回上级菜单,输入 Qq 代表结束运行
  • 由于获取账号喜欢作品和收藏作品数据仅返回喜欢 / 收藏作品的发布日期,不返回操作日期,因此程序需要获取全部喜欢 / 收藏作品数据再进行日期筛选;如果作品数量较多,可能会花费较长的时间;可通过 max_pages 参数控制请求次数
  • 获取私密账号的发布作品数据需要登录后的 Cookie,且登录的账号需要关注该私密账号
  • 批量下载账号作品或合集作品时,如果对应的昵称或标识发生变化,程序会自动更新已下载作品文件名称中的昵称和标识
  • 程序下载文件时会先将文件下载至临时文件夹,下载完成后再移动至储存文件夹;程序运行结束时会清空临时文件夹
  • 批量下载收藏作品模式 目前仅支持下载当前已登录 Cookie 对应账号的收藏作品,暂不支持多账号
  • 如果想要程序使用代理,必须在 settings.json 设置 proxies 参数,否则程序不会使用代理
  • 退出程序时,请以正常方式结束运行或者按下 Ctrl + C 结束运行,不要直接点击终端窗口的关闭按钮结束运行,否则会导致数据丢失
  • 如果您的计算机没有合适的程序编辑 JSON 文件,建议使用 JSON 在线工具 编辑配置文件内容
  • 当程序请求用户输入内容或链接时,请注意避免输入的内容或链接包含换行符,这可能会导致预期之外的问题

程序更新

免安装程序

方案一: 下载并解压文件,将旧版本的 cache 文件夹和 settings.json 文件复制到 _internal 文件夹。

方案二: 下载并解压文件,复制全部文件,直接覆盖旧版本文件。

安装程序

直接使用安装程序覆盖安装。

⚠️ 免责声明(Disclaimers)

  • 使用者对本项目的使用由使用者自行决定,并自行承担风险。作者对使用者使用本项目所产生的任何损失、责任、或风险概不负责。
  • 本项目的作者提供的代码和功能是基于现有知识和技术的开发成果。作者尽力确保代码的正确性和安全性,但不保证代码完全没有错误或缺陷。
  • 使用者在使用本项目时必须严格遵守 GNU General Public License v3.0 的要求,并在适当的地方注明使用了 GNU General Public License v3.0 的代码。
  • 使用者在任何情况下均不得将本项目的作者、贡献者或其他相关方与使用者的使用行为联系起来,或要求其对使用者使用本项目所产生的任何损失或损害负责。
  • 使用者在使用本项目的代码和功能时,必须自行研究相关法律法规,并确保其使用行为合法合规。任何因违反法律法规而导致的法律责任和风险,均由使用者自行承担。
  • 本项目的作者不会提供 TikTokDownloader 项目的付费版本,也不会提供与 TikTokDownloader 项目相关的任何商业服务。
  • 基于本项目进行的任何二次开发、修改或编译的程序与原创作者无关,原创作者不承担与二次开发行为或其结果相关的任何责任,使用者应自行对因二次开发可能带来的各种情况负全部责任。
在使用本项目的代码和功能之前,请您认真考虑并接受以上免责声明。如果您对上述声明有任何疑问或不同意,请不要使用本项目的代码和功能。如果您使用了本项目的代码和功能,则视为您已完全理解并接受上述免责声明,并自愿承担使用本项目的一切风险和后果。

✉️ 联系作者(Contact)

  • 微信: Downloader_Tools
  • 微信公众号: Downloader Tools
  • QQ 群聊(使用交流): 扫码加入群聊

作者的其他开源项目:

♥️ 支持项目(Support)

如果 TikTokDownloader 对您有帮助,请考虑为它点个 Star ⭐,感谢您的支持!

微信(WeChat) 支付宝(Alipay)
微信赞助二维码 支付宝赞助二维码

如果您愿意,可以考虑提供资助为 TikTokDownloader 提供额外的支持!

💡 项目参考(Refer)

tiktokdownloader's People

Contributors

joeanamier avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tiktokdownloader's Issues

报错反馈

感谢开源!项目配置好之后能够启动,但在收集完账号中的视频信息之后报出了字典错误,跟现在open的那个issue差不多,如下:
File "F:\XXX\XXX\TikTokDownloader-2.0\TikTokDownloader-2.0\src\DataDownloader.py", line 281, in get_info
music_name = f'{item["music"]["author"]}-{item["music"]["title"]}'
KeyError: 'music'

账号链接是“https://www.douyin.com/user/MS4wLjABAAAA0hKPSklbRqN0zl1Iyb3g93Tgvxh2QuBPQ5-x1KFFruQ”

报错的日志如下:
2023-06-29 17.02.14.log

运行main.py报错

F:\TikTokDownloader-3.2>py main.py
Traceback (most recent call last):
File "main.py", line 1, in
from flask import Flask
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\flask_init_.py", line 19, in
from jinja2 import Markup, escape
ImportError: cannot import name 'Markup' from 'jinja2' (C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\jinja2_init_.py)

博主的作品数量不对

博主的内容全都是视频,没有图文。
地址是

https://www.douyin.com/user/MS4wLjABAAAAvc-D-qB6X9O41NM3duVF1oAfG54Ear9_dFv385XuTy1F2-IhHlOlY2T1oOIZKlFy

image

后台显示

image

结果也是只下载了23个。
image

KeyError: 55

File "D:\PycharmProjects\TikTokDownloader\src\DataDownloader.py", line 469, in run
self.get_info(video, "Video")
File "D:\PycharmProjects\TikTokDownloader\src\DataDownloader.py", line 271, in get_info
type_ = {68: "Image", 0: "Video"}[item["aweme_type"]]
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
KeyError: 55

视频分辨率低和同分辨率下码流异常

博主

image

地址

https://www.douyin.com/user/MS4wLjABAAAAJ6Lr2yJ-SAFg7GjMu7E2nHZd1nhGhzsygP7_uqQXlI0

下面截图的视频ID为7214153200159558973

image

左边是 本项目下载的
右边是 TikTokDownload下载的,下同

由于分辨率低了一些,所以文件体积也小一些。


然后下面的视频ID为7198388067944631610

在相同分辨率下文件体积不一样,

image

检查发现是码流小了。

image


还有一个是会下载到0K的文件,视频是可以正常播放的,地址https://www.douyin.com/video/7020014643720539429

image

console中没有报错。


分辨率低的问题,不是个例,一百多视频超过一半。

image

大概下载三四个博主会出现一个0k问题。

关于抖音搜索结果采集功能的说明

输入格式

格式:关键词 类型 页数 排序规则 时间筛选

  • 类型:综合搜索 视频搜索 用户搜索
  • 排序规则:综合排序 最新发布 最多点赞
  • 时间筛选:0:不限;1:一天内;7:一周内;182:半年内

参数之间使用空格分隔,类型排序规则 支持输入中文或者对应索引,页数时间筛选 仅支持输入整数。

程序采集的抖音搜索结果会储存至文件,不支持直接下载搜索结果作品;必须设置 save 参数,否则程序不会储存任何数据。

输入示例

输入:猫咪

含义: 关键词:猫咪;类型:综合搜索;页数:1;排序规则:综合排序;时间筛选:不限


输入:猫咪 1 2 1 等效于 猫咪 视频搜索 2 最新发布

含义: 关键词:猫咪;类型:视频搜索;页数:2;排序规则:最新发布;时间筛选:不限


输入:猫咪 0 10 0 7 等效于 猫咪 综合搜索 10 综合排序 7

含义: 关键词:猫咪;类型:综合搜索;页数:10;排序规则:综合排序;时间筛选:一周内


输入:猫咪 1 5 2 182 等效于 猫咪 视频搜索 5 最多点赞 182

含义: 关键词:猫咪;类型:视频搜索;页数:5;排序规则:最多点赞;时间筛选:半年内


输入:猫咪 2 2 等效于 猫咪 用户搜索 2

含义: 关键词:猫咪;类型:用户搜索;页数:2

【BUG】接口失效

2023-07-01 11:34:34[ERROR]: 数据接口返回内容异常!疑似接口失效
2023-07-01 11:34:37[ERROR]: 数据接口返回内容异常!疑似接口失效
2023-07-01 11:34:40[ERROR]: 数据接口返回内容异常!疑似接口失效
2023-07-01 11:34:50[ERROR]: 数据接口返回内容异常!疑似接口失效
2023-07-01 11:34:55[ERROR]: 数据接口返回内容异常!疑似接口失效

关于账号标识和昵称修改的说明

标识设置规则

  • name 参数中没有使用 nickname 时,mark 设置没有限制。
  • name 参数中使用了 nickname 时,marknickname 不能设置为包含关系的字符串。

示例:

  • ✔️ nickname:ABC,mark:DEF
  • ✔️ nickname:ABC,mark:BCD
  • nickname:ABC,mark:AB
  • nickname:BC,mark:ABC

账号标识说明

  • 账号标识 mark 参数相当于账号备注,便于用户识别账号作品文件夹,避免账号昵称修改导致无法识别已下载作品问题。

  • 批量下载账号作品 模式下,如果设置了 mark 参数,下载的作品将会保存至 UID123456789_mark参数UID123456789_mark参数_喜欢页 文件夹内。

  • 批量下载账号作品 模式下,如果 mark 参数设置为空字符串,程序将会使用账号昵称作为账号标识,下载的作品将会保存至 UID123456789_账号昵称UID123456789_账号昵称_喜欢页 文件夹内。

合集标识说明

与账号标识作用一致。

如何修改标识

修改账号标识: 修改 accountsmark 参数,再次运行 批量下载账号作品 模式,程序会自动应用新的账号标识。

修改合集标识: 修改 mixmark 参数,再次运行 批量下载合集作品 模式,程序会自动应用新的账号标识;或者手动输入合集链接,根据程序提示进行设置。

账户昵称修改

批量下载账号作品批量下载合集作品 模式下,程序会判断账号昵称是否有修改,如果有修改,程序会自动识别已下载作品文件名称中的账户昵称,并修改至最新账户昵称。

FileCache.json

缓存文件,用于记录账号/合集标识和账号昵称,当账号/合集标识或账号昵称发生变化时,程序会读取文件内容,并对相应的文件夹和文件进行重命名更新处理,如果该文件不存在或者删除该文件,程序首次运行不会判断账号/合集标识和账号昵称是否发生变化,程序运行结束后会生成新的缓存文件,之后程序才能监控账号/合集标识和账号昵称变化。

缓存文件仅供程序读取和写入,不建议手动编辑文件内容。

关于异常反馈和优化建议

异常反馈

建议仔细阅读 README.mdDocumentation 了解项目使用方法和功能介绍,如果遇到无法解决的问题,可以创建 issue 寻求解决方案,或者 加入群聊 进行问题反馈。

建议在 issue 中提交以下信息:

  • 发生异常时程序的运行模式
  • 发生异常时所用的链接
  • 程序运行日志文件或部分日志内容
  • 发生问题时的错误代码
  • 程序源码的版本号
  • Python 版本号
  • 其他必要说明

优化建议

可以创建 issue 描述你认为较为实用的建议或优化方案,或者 加入群聊 进行讨论交流。

作者会优先考虑需求量大或者实用性高的优化建议!

提示:网络异常: [SSL: DECRYPTION_FAILED_

大佬,您好,我在使用中遇到了以下问题。网络异常: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption failed or bad record mac (_ssl.c:2578)
image
请问怎么解决呢

关于服务器部署模式二次开发的说明

API 文档

请求URL:/solo/

请求类型:POST

请求格式:JSON

请求内容:

{
  "url": "抖音作品链接或 TikTok 作品链接"
}

后端会自动处理 url 参数中的作品链接,可以不在前端对 url 参数进行额外处理。

支持链接:

  • https://v.douyin.com/分享码/
  • https://vm.tiktok.com/分享码/
  • https://www.douyin.com/note/作品ID
  • https://www.douyin.com/video/作品ID
  • https://www.douyin.com/user/账号ID?modal_id=作品ID
  • https://www.tiktok.com/@账号昵称/video/作品ID

响应格式:JSON

响应内容:

{
  "text": "解析结果提示, 字符串",
  "author": "作者昵称, 字符串; 失败时返回 null",
  "describe": "作品描述, 字符串; 失败时返回 null",
  "download": "作品下载地址, 视频返回字符串, 图集返回由下载地址成的数组; 失败时返回 false",
  "music": "原声下载地址, 字符串, 失败时返回 false",
  "origin": "静态封面图地址, 字符串; 失败时返回 false",
  "dynamic": "动态封面图地址, 字符串; 失败时返回 false",
  "preview": "作品预览图地址, 字符串, 视频返回静态封面图, 图集返回首张图片; 失败时返回空白预览图地址"
}

where is my mistake?

did i do something wrong? please correct me because I don't understand much about coding

image_924
image_926

关于配置文件的说明

📄 配置文件示例

{
  "accounts": [
    [
      "账号标注1",
      "账号主页链接, 支持长链接与短链接",
      "post",
      "2023/7/1",
      ""
    ],
    [
      "账号标注2",
      "账号主页链接, 支持长链接与短链接",
      "favorite",
      "",
      "2023/8/1"
    ]
  ],
  "mix": [
    [
      "合集标识1",
      "https://www.douyin.com/collection/123, 支持合集链接与作品链接"
    ],
    [
      "合集标识2",
      "https://www.douyin.com/video/123, 支持长链接与短链接"
    ]
  ],
  "root": "./",
  "folder": "Download",
  "name": "create_time nickname id desc",
  "time": "%Y-%m-%d %H.%M.%S",
  "split": "-",
  "music": [
    false,
    true
  ],
  "save": "sql",
  "cookie": [
    {
      "passport_csrf_token": "111",
      "passport_csrf_token_default": "111",
      "odin_tt": "111"
    },
    {
      "passport_csrf_token": "222",
      "passport_csrf_token_default": "222",
      "odin_tt": "222"
    }
  ],
  "dynamic": [
    false,
    true
  ],
  "original": [
    false,
    false
  ],
  "proxies": [
    "",
    "http://127.0.0.1:9999"
  ],
  "log": false,
  "download": [
    true,
    false
  ],
  "chunk": 1048576,
  "retry": 20
}

单进程终端模式、Web UI 模式:musiccookiedynamicoriginalproxiesdownload 参数仅第一个值生效,下载多个账号的作品均使用false(不下载音乐), cookie-1, false(不下载动态封面图), false(不下载静态封面图), ""(不使用代理), true(下载文件) 参数

多进程终端模式(未完成):accountsmusiccookiedynamicoriginalproxiesdownload 的元素个数必须相同,下载账号1 的作品使用false(不下载音乐), cookie-1, false(不下载动态封面图), false(不下载静态封面图), ""(不使用代理), true(下载文件) 参数,下载账号2 的作品使用true(下载音乐), cookie-2, true(下载动态封面图), false(不下载静态封面图), http://127.0.0.1:9999(使用代理), false(不下载文件) 参数,每个账号按照索引对应的参数单独生效

服务器部署模式:cookieproxies参数仅第一个值生效,retry 参数生效,其余参数均不生效,但仍需正确编辑配置文件

其余参数为全局参数

🏷 部分参数详解

{
  "root": "C:\\TikTokDownloader",
  "folder": "SOLO"
}

代表程序会将下载的文件和记录的数据储存至 C:\TikTokDownloader 文件夹内,单独下载的作品文件会储存至 C:\TikTokDownloader\SOLO 文件夹内。

{
  "name": "create_time uid id",
  "split": "#"
}

代表作品文件名称格式为: 发布时间#作者UID#作品ID

修改命名格式会导致已下载的文件无法正常识别,建议慎重设置,避免后续修改。

{
  "time": "%Y-%m-%d"
}

代表发布时间格式为: XXXX年-XX月-XX日,详细设置规则可以查看文档

{
  "save": "xlsx"
}

代表使用 XLSX 格式储存程序采集数据;采集作品评论数据批量采集账号数据采集搜索结果数据 必须设置 save 参数,否则程序不会保存任何数据至文件。

{
  "chunk": 1048576
}

代表下载文件时每次从服务器接收 1048576 字节 (1 MB)大小的数据块。

  • 影响下载速度:较大的 chunk 会增加每次下载的数据量,从而提高下载速度。相反,较小的 chunk 会降低每次下载的数据量,可能导致下载速度稍慢。
  • 影响内存占用:较大的 chunk 会一次性加载更多的数据到内存中,可能导致内存占用增加。相反,较小的 chunk 会减少每次加载的数据量,从而降低内存占用。

关于单次输入多个链接的说明

单次输入多个链接

单独下载链接作品获取直播推流地址采集作品评论数据批量下载合集作品批量采集账号数据3.1 版本起开始支持单次输入多个链接,实现批量下载 / 提取功能;单次输入多个链接时,链接类型需要保持一致,不支持短链接与长链接混合输入。

输入示例

实际输入时不需要刻意添加分隔符,此处示例使用空格分隔仅仅便于观察区分链接。
提取账号数据模式 输入多个长链接时,需要使用空格分隔,其余模式不需要分隔字符。
无需对复制的链接进行处理,程序会自动提取输入文本中的有效链接。

  • 支持:https://v.douyin.com/abc/ https://v.douyin.com/abc/
  • 支持:https://www.douyin.com/video/123456789 https://www.douyin.com/note/123456789
  • 支持:https://www.douyin.com/collection/123456789 https://www.douyin.com/collection/123456789
  • 支持:https://www.douyin.com/user/ABC?modal_id=123456789 https://www.douyin.com/note/123456789
  • 不支持:https://v.douyin.com/abc/ https://www.douyin.com/video/123456789
  • 不支持:https://www.douyin.com/collection/123456789 https://www.douyin.com/video/123456789
  • 不支持:https://www.douyin.com/video/123456789 https://www.tiktok.com/@ABC/video/123456789

Connection broken: IncompleteRead

File "D:\PycharmProjects\TikTokDownloader\src\DataAcquirer.py", line 64, in execute
if result := function(self, *args, **kwargs):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\TikTokDownloader\src\DataDownloader.py", line 369, in request_file
if response.content == b"":
^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\TikTokDownloader\venv\Lib\site-packages\requests\models.py", line 899, in content
self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b""
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\TikTokDownloader\venv\Lib\site-packages\requests\models.py", line 818, in generate
raise ChunkedEncodingError(e)
requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(3668523 bytes read, 612217 more expected)', IncompleteRead(3668523 bytes read, 612217 more expected))

Windows EXE 可执行文件

发布 Windows EXE 可执行文件,开箱即用!


编译版本:4.1 beta
编译日期:2023/8/26
系统要求:Windows 10,Windows 11
编译文件:TikTokDownloader_V4.1_Beta_EXE.zip


下载压缩包并解压,双击打开 TikTokDownloader_V4.1_Beta\main.exe 即可使用。

未来将会随版本更新在 Releases 发布!

提示警告:该模式正在开发中,功能可能无法正常使用!

你好,Web API 接口模式报405,请求dy接口貌似必需携带s_v_web_id吧,没有s_v_web_id获取不到数据。每请求几次会触发点选验证,建议加个验证模块,ddddocr不错就是识别成功效率不高。滑块验证过了,到旋转验证,再到中文点选,然后是物体点选, 估计更变态的防御风控机制还在后面

fastapi调用的模式

非常感谢您开发这么方便的工具。我想提出一些建议,希望能够增加更多功能。

首先,我建议您考虑一个在本地运行Fastapi的模式,而不需要修改原始码。这样使用者可以通过API来调用您的工具。

另外,我还希望您能够提供一个API,让使用者可以输入抖音号,然后返回相关的视频列表和发布日期等参数。这将使使用者更方便地获取他们需要的信息。

同样地,如果您能够提供另一个API,让使用者输入抖音号并返回最新的视频列表和发布日期等参数,那将是非常有用的功能。

非常感谢您的时间,希望这些建议能对您有所帮助。我期待能够看到这些新功能的实现。

谢谢您!

基于其他成熟的下载项目提一点建议。

我来对作者指手画脚提建议了,首先感谢JA对我等抖音用户提供的这个项目,试了一下完美运行,很赞!

居然连网络问题都考虑到了,非常nice。

image


首先介绍一下,我是重度YouTube用户,在YouTube下载这块,有一个大名鼎鼎的项目叫youtube-dl

image

还有一个叫yt-dlp的fork
image

参与者众多,用户巨多,程序健壮性……我没有遇到一次bug,Google拿它无可奈何,非常健壮而且强壮!

基于使用yd的经验,借鉴于yd的做法,我想给咱们作者提点建议:


我下载了某个博主的视频,但是并不是所有视频都是我想要收藏的,所以我删除了一部分,并且不想再次下载。
我看到咱们项目里是用文件存在做判断的,也就是还实现不了。
image

希望作者借鉴一下yd,把下载过的视频id存在一个文本里,

image
image
image

可以看到这个文件仅仅1980K,但是已经保存了近10万id,在程序启动的时候读到内存里,以这里的id为唯一标识,判断id已经存在就跳过。

这样,判断是否下载不再依赖于文件夹的文件,而视频文件我想删除就删除,想移走就移走。

我相信这不是我一个人的需求,而是很多人的痛点。


然后,我看到了我下载过的一个视频,我想找到它,看评论或者举报点赞什么的,然后懵逼的发现作者改名了,或者没改名但是她居然有好几千视频,完全找不到是哪个!
所以希望能把作品ID附带在文件名末尾,至少留给我找到它的一条路。

image


我看到作者已经有未完成文件的应对机制了,但有没有试过突然断电?拔掉硬盘?测试也不带这么测的啊!

所以希望加一个临时文件夹,先下载到临时文件夹,下载完成后move到目标文件夹,这样确保目标文件夹里面一定是成功的视频。

就算不为损坏的视频考虑,也有另一个好处:我运行程序是在SSD,存储视频是在机械硬盘(阵列、NAS之类的),SSD跑程序是为了响应快而且不介意它碎片化读写,但是不想要机械硬盘过多的碎片读写,更要命的是我的SSD不够大,下视频随随便便好几个T根本放不下。


yd也是基于python的,以上功能都可以瞄一眼它的代码。

预祝本项目大红大紫!

程序代码修改指引

程序代码修改指引

本指引适合不熟悉 Python 编程语言或者不熟悉本项目的使用者查阅。

修改代码时请注意代码缩进。

调整请求数据间隔

修改 src/DataAcquirer.py21 行代码。

  • 如果想要取消间隔,请将第 21 行代码修改为 pass
  • 如果想要固定间隔,请将第 21 行代码修改为 time.sleep(秒数)
  • 如果想要调整间隔,请将第 21 行代码修改为 time.sleep(randrange(最小间隔秒数×10, 最大间隔秒数×10, 5) * 0.1)

批量下载账号作品-无人值守

修改 src/main_complete.py188~190 行和第 213~215 行代码。

  • 如果想要程序遇到异常时停止获取,请将第 188~189 行和第 213~214 行代码转换为注释(在整行代码前添加 #)
  • 如果想要程序遇到异常时继续获取,请将第 188~189 行和第 213~214 行代码转换为注释,并将第 190215 行代码修改为 continue

好像接口又换了

下载单个视频 最近的这个只尝试一次返回403 item_list失败 我用的作者之前的版本会尝试几次 然后成功
批量下载 返回空json
用习惯这个了了,作者有空改一下吧

关于检测新版本功能的说明

检测新版本

程序从 3.3 版本起支持检测新版本功能,启用检测新版本功能后,运行程序时会向 https://github.com/JoeanAmier/TikTokDownloader/releases/latest 发送请求获取最新 Releases 版本号,并提示是否存在新版本。

如果存在新版本会输出新版本的 URL 地址,不会自动下载更新。

[BUG]运行脚本发现问题

Traceback (most recent call last):
File "D:\Media\TikTokDownloader-2.3\main.py", line 4, in
from src.main_complete import TikTok
File "D:\Media\TikTokDownloader-2.3\src\main_complete.py", line 2, in
from src.DataAcquirer import UserData
File "D:\Media\TikTokDownloader-2.3\src\DataAcquirer.py", line 14, in
from src.Recorder import LoggerManager
File "D:\Media\TikTokDownloader-2.3\src\Recorder.py", line 10, in
from src.StringCleaner import Cleaner
File "D:\Media\TikTokDownloader-2.3\src\StringCleaner.py", line 16
match system:
^
SyntaxError: invalid syntax

关于程序功能的详细说明

基础概念

链接类型:

  • 长链接:使用浏览器打开抖音链接时,地址栏所显示的 URL 地址。
  • 短链接:点击 APP 或网页版的分享按钮得到的 URL 地址,抖音平台以 https://v. 开头,并且前后掺杂中文;TikTok 平台以 https://vm 开头,不掺杂其他字符。

链接输入:

  • 输入 settings.json 时,需要手动去除中文,仅输入 URL 链接。
  • 程序运行输入时,可直接粘贴内容后回车,程序会自动提取 URL 地址。

数据储存:

  • settings.jsonsave 参数可设置数据储存格式类型。
  • 采集作品评论数据批量采集账号数据采集搜索结果数据 模式必须设置 save 参数才可正常使用。
  • 程序所有数据均储存至 root 参数路径下的 Data 文件夹。

终端命令行模式

功能最全面的模式,支持全部功能。

批量下载账号作品

使用 settings.jsonaccounts 参数中的账号主页链接。

支持链接格式:

  • https://v.douyin.com/分享码/
  • https://www.douyin.com/user/账号ID
  • https://www.douyin.com/user/账号ID?modal_id=作品ID

每个账号的作品会下载至 root 参数路径下的账号文件夹,账号文件夹格式为 UID123456789_mark 或者 UID123456789_账号昵称

单独下载链接作品

输入作品链接;目前仅该模式支持 TikTok 平台。

支持链接格式:

  • https://v.douyin.com/分享码/
  • https://vm.tiktok.com/分享码/
  • https://www.douyin.com/note/作品ID
  • https://www.douyin.com/video/作品ID
  • https://www.douyin.com/user/账号ID?modal_id=作品ID
  • https://www.tiktok.com/@账号昵称/video/作品ID

作品会下载至 root 参数和 folder 参数拼接成的文件夹。

获取直播推流地址

输入直播链接,不支持已结束的直播。

支持链接格式:

  • https://live.douyin.com/直播ID

目前不支持直播分享短链接!

下载说明:

  • 单次输入一个直播链接时,程序会询问用户是否下载直播视频,如果使用本程序下载,需要保持程序运行直到直播结束。
  • 单次输入多个直播链接时,程序不会询问用户是否下载视频。
  • 建议复制直播推流地址到其他下载工具进行下载。

采集作品评论数据

输入作品链接。

支持链接格式:

  • https://v.douyin.com/分享码/
  • https://www.douyin.com/note/作品ID
  • https://www.douyin.com/video/作品ID
  • https://www.douyin.com/user/账号ID?modal_id=作品ID

支持采集评论回复、评论表情、评论图片。

批量下载合集作品

  1. 使用 settings.jsonmix 参数中的合集链接或作品链接。
  2. 输入合集链接,或者属于合集的任意一个作品链接。

支持链接格式:

  • https://v.douyin.com/分享码/
  • https://www.douyin.com/note/作品ID
  • https://www.douyin.com/video/作品ID
  • https://www.douyin.com/user/账号ID?modal_id=作品ID
  • https://www.douyin.com/collection/合集ID

每个合集的作品会下载至 root 参数路径下的合集文件夹,合集文件夹格式为 MIX123456789_mark 或者 MIX123456789_合集标题

批量采集账号数据

  1. 使用 settings.jsonaccounts 参数中的账号主页链接。
  2. 输入账号主页链接。

支持链接格式:

  • https://v.douyin.com/分享码/
  • https://www.douyin.com/user/账号ID
  • https://www.douyin.com/user/账号ID?modal_id=作品ID

采集搜索结果数据

格式规则 输入搜索条件。

来自未来的新模式

功能待定,欢迎提出需求和建议。

Web UI 模式

提供浏览器可视化交互界面,支持单独下载链接作品功能和获取直播推流地址功能,支持局域网远程访问,可以部署至私有服务器,不可直接部署至公开服务器。

服务器部署模式

提供浏览器可视化交互界面,支持单独下载链接作品功能,用于部署至公开服务器,为网站访客提供作品下载服务。

为保护访客隐私,服务器部署模式 禁用了日志记录和数据存储功能,不会记录任何作品提取数据。

运行代码报错 TypeError: 'type' object is not subscriptable

Traceback (most recent call last):
File "C:\Users\ThinkPad\Downloads\TikTokDownloader-3.6\main.py", line 12, in
from src.StringCleaner import Colour
File "C:\Users\ThinkPad\Downloads\TikTokDownloader-3.6\src\StringCleaner.py", line 5, in
class Cleaner:
File "C:\Users\ThinkPad\Downloads\TikTokDownloader-3.6\src\StringCleaner.py", line 39, in Cleaner
def set_rule(self, rule: dict[str, str], update=False):
TypeError: 'type' object is not subscriptable

关于Python及第三方模块版本的说明

Python 版本

作者开发使用的是 3.11 最新版本的 Python,使用了部分新语法,对于旧版本的 Python 会产生报错。
如果使用 3.9 及以上版本的 Python,安装运行所需第三方模块之后即可正常使用。
如果使用 3.9 以下版本的 Python,请将 src/StringCleaner.py 文件内容改为以下代码,即可正常使用。

from platform import system
from string import whitespace


class Cleaner:
    def __init__(self):
        """
        替换字符串中包含的非法字符,默认根据系统类型生成对应的非法字符字典,也可以自行设置非法字符字典
        """
        self.rule = self.default_rule()  # 默认非法字符字典

    @staticmethod
    def default_rule():
        """根据系统类型生成默认非法字符字典"""
        if (s := system()) in ("Windows", "Darwin"):
            rule = {
                "/": "",
                "\\": "",
                "|": "",
                "<": "",
                ">": "",
                "\"": "",
                "?": "",
                ":": "",
                "*": "",
                "\x00": "",
            }  # Windows 系统和 Mac 系统
        elif s == "Linux":
            rule = {
                "/": "",
                "\x00": "",
            }  # Linux 系统
        else:
            print("不受支持的操作系统类型,可能无法正常去除非法字符!")
            rule = {}
        cache = {i: "" for i in whitespace[1:]}  # 补充换行符等非法字符
        return {**rule, **cache}

    def set_rule(self, rule: dict[str, str], update=False):
        """
        设置非法字符字典

        :param rule: 替换规则,字典格式,键为非法字符,值为替换后的内容
        :param update: 如果是 True,则与原有规则字典合并,否则替换原有规则字典
        """
        self.rule = {**self.rule, **rule} if update else rule

    def filter(self, text: str) -> str:
        """
        去除非法字符

        :param text: 待处理的字符串
        :return: 替换后的字符串,如果替换后字符串为空,则返回 None
        """
        if not text:
            return text
        for i in self.rule:
            text = text.replace(i, self.rule[i])
        return text or None

第三方模块版本

作者使用的第三方模块版本均为最新版本:Flask 2.3.2, requests 2.31.0, openpyxl 3.1.2, PyExecJS2 1.6.1,可使用以下命令安装。

pip install requests
pip install openpyxl
pip install Flask
pip install PyExecJS2

运行main.py报错

win11系统。之前装的python3.9 报错后安装了3.11,还是保持。日志如下: 文件放C:盘和D:盘都是一样的错误。
C:\envs\TikTokDownloader-4.0\Scripts\python.exe D:\TikTokDownloader\main.py
Traceback (most recent call last):
File "D:\TikTokDownloader\main.py", line 210, in
Master().run()
File "D:\TikTokDownloader\main.py", line 197, in run
self.check_config()
File "D:\TikTokDownloader\main.py", line 68, in check_config
c.mkdir()
File "C:\Python\Python311\Lib\pathlib.py", line 1116, in mkdir
os.mkdir(self, mode)
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'src\config'

TikTok.account_download() missing 1 required positional argument: 'params'

File "D:\PycharmProjects\TikTokDownloader\src\main_complete.py", line 284, in run
self.batch_acquisition()
File "D:\PycharmProjects\TikTokDownloader\src\main_complete.py", line 79, in batch_acquisition
self.account_download(
TypeError: TikTok.account_download() missing 1 required positional argument: 'params'

TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'

执行报错 : 报错的完整日志如下 :
E:\other\amemv-crawler\douyin\TikTokDownloader-4.0\TikTokDownloader-4.0>python main.py
Traceback (most recent call last):
File "E:\other\amemv-crawler\douyin\TikTokDownloader-4.0\TikTokDownloader-4.0\main.py", line 10, in
from src.CookieTool import Cookie
File "E:\other\amemv-crawler\douyin\TikTokDownloader-4.0\TikTokDownloader-4.0\src\CookieTool.py", line 9, in
from src.Parameter import TtWid
File "E:\other\amemv-crawler\douyin\TikTokDownloader-4.0\TikTokDownloader-4.0\src\Parameter.py", line 328, in
class TtWid:
File "E:\other\amemv-crawler\douyin\TikTokDownloader-4.0\TikTokDownloader-4.0\src\Parameter.py", line 332, in TtWid
def get_tt_wid() -> dict | None:
TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'

请问一下,是什么原因呢,下载的是release最新版本

初始化错误

PS G:\1temp\TikTokDownloader> python .\main.py
File "G:\1temp\TikTokDownloader\main.py", line 16
match mode:
^
SyntaxError: invalid syntax

啊,clone到本地后打开main.py 报错。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.