Add Douyin video downloader with auto-cookie feature

This commit is contained in:
2026-03-02 21:42:52 +08:00
commit 0f3dd8f287
50 changed files with 6471 additions and 0 deletions

72
.github/ISSUE_TEMPLATE/--------.md vendored Normal file
View File

@@ -0,0 +1,72 @@
---
name: Bug report
about: 创建详细错误报告帮助解决你遇到的问题
title: "[BUG]"
labels: 故障(bug)
assignees: ''
---
- [ ] 我查看了 [文档](https://johnserf-seed.github.io/f2/quick-start.html) 以及 [已关闭的问题](https://github.com/Johnserf-Seed/f2/issues?q=is%3Aissue+is%3Aclosed) 以寻找可能的解决方案。
- [ ] 我在 [常见的问题与解决办法](https://johnserf-seed.github.io/f2/question-answer/qa.html) 中找不到我的问题。
- [ ] ~~*你的问题是公开的,请注意删除个人敏感内容再上传*~~
- [ ] 不按照模板填写的问题将不会得到优先的处理。
- 如果错误问题是可视化的,请在**屏幕截图**贴截图。如果你是开发者请在**错误重现**提供一个最小的代码示例来演示该问题。
- 相同的问题将会被标记`重复(duplicate)`,如果你的问题被标记为`已确认(confirmed)`则会在后续的推送中修复,请时刻留意。
- 退订邮件提醒请点击邮件的底部`unsubscribe`
**详细描述错误**
简明扼要地描述遇到的错误。
**系统平台**
<details>
<summary>单击展开</summary>
Q:你在哪个平台Win/Linux/Mac上运行你使用的是什么浏览器你使用的是什么终端软件你使用的F2是什么版本
A:
- 操作系统: [e.g. Win10 x64 22H2 19045.4046]
- 浏览器 [e.g. Edge 122.0.2365.52]
- 终端 [e.g. WT 1.18.10301.0]
- F2版本 [e.g. 0.0.1.5]
</details>
**错误重现**
<details>
<summary>单击展开</summary>
Q: 请你复制并粘贴出错时运行的命令和配置文件内容,以及重现该行为的步骤。如果你一次性就提供完整信息,就会节省很多解决问题的时间。
A:
1.
2.
3.
Q: 请添加调试命令`f2 -d DEBUG`重新运行出错的命令并提供日志目录下的日志文件。
A:
Q: 如果是开发者请提供最小的代码示例
A:
```python
```
</details>
**预期行为**
简明扼要地描述期望发生的事情。
**屏幕截图**
请添加截图以帮助解释你的问题。
**日志文件**
请添加调试日志文件以帮助解释你的问题。
**其他**
如有,可以添加有关问题的其他信息。

26
.github/ISSUE_TEMPLATE/-------.md vendored Normal file
View File

@@ -0,0 +1,26 @@
---
name: Feature request
about: 为此项目提出建议
title: "[FEATRUE / REQUEST]"
labels: 需求建议(enhancement)
assignees: ''
---
在提出功能请求之前,请考虑在 https://github.com/Johnserf-Seed/f2/discussions 上发布反馈或在Discord中讨论。
**Q: 你有检查过类似建议的问题吗?**
在所有的问题列表里检查是否有类似的建议。
- [ ]
- [ ]
**Q: 你将如何改进 F2**
请尽可能详细地说明。请提供你希望它如何工作的示例代码或流程。
A:
**Q: 它能为你解决什么问题?**
该功能能解决你的什么问题?我也许可以建议一种现有的解决方法。
A:
**其他**
如有,请添加有关功能请求的任何其他内容或截图。

144
.gitignore vendored Normal file
View File

@@ -0,0 +1,144 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
RE_TikTokDownload.py
TikTokPyPi
upx.exe
GUI.py
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
#filter
/Download/
readconf.py
.vscode
/Server/node_modules/
1.py
test.py
/refactor
*.db

41
API/TikTokTool.txt Normal file
View File

@@ -0,0 +1,41 @@
# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(
ffi=FixedFileInfo(
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
# Set not needed items to zero 0.
filevers=(1, 4, 2, 2),
prodvers=(1, 4, 2, 2),
# Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file.
flags=0x0,
# The operating system for which this file was designed.
# 0x4 - NT and there is no need to change it.
OS=0x40004,
# The general type of file.
# 0x1 - the file is an application.
fileType=0x1,
# The function of the file.
# 0x0 - the function is not defined for this fileType
subtype=0x0,
# Creation date and time stamp.
date=(0, 0)
),
kids=[
StringFileInfo(
[
StringTable(
u'080404b0',
[StringStruct(u'CompanyName', u'JohnserfSeed'),
StringStruct(u'FileDescription', u'抖音视频批量下载'),
StringStruct(u'FileVersion', u'1.5.0.0'),
StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2023 JohnserfSeed. All Rights Reserved'),
StringStruct(u'ProductName', u'抖音视频批量下载'),
StringStruct(u'ProductVersion', u'1.5.0.0')])
]),
VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
]
)

50
API/user_base_info.json Normal file
View File

@@ -0,0 +1,50 @@
{
"status_code": 0,
"next_req_count": 0,
"data": [
{
"uid": "89964046416",
"short_id": "629064951",
"nickname": "蔓越莓烦恼",
"avatar_thumb": {
"uri": "100x100/aweme-avatar/tos-cn-avt-0015_9c8aea4ba21f591774723a3820a07aef",
"url_list": [
"https://p3.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_9c8aea4ba21f591774723a3820a07aef.jpeg?from=3782654143",
"https://p6.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_9c8aea4ba21f591774723a3820a07aef.jpeg?from=3782654143",
"https://p11.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_9c8aea4ba21f591774723a3820a07aef.jpeg?from=3782654143"
]
},
"signature": "风格多变的小🦁️\n🧣yoki小蔓\n🍠同名",
"follow_status": 1,
"enterprise_verify_reason": "",
"verification_type": 0,
"custom_verify": "",
"unique_id": "777_23",
"commerce_user_level": 0,
"with_commerce_entry": false,
"is_block": false,
"sec_uid": "MS4wLjABAAAADgOltsr_SYTX6VurKA1H3n61xlFvYD1y_FrrY1UhI-o",
"webcast_sp_info": {},
"has_e_account_role": false,
"follower_status": 0,
"avatar_small": {
"uri": "168x168/aweme-avatar/tos-cn-avt-0015_9c8aea4ba21f591774723a3820a07aef",
"url_list": [
"https://p6.douyinpic.com/img/aweme-avatar/tos-cn-avt-0015_9c8aea4ba21f591774723a3820a07aef~c5_168x168.webp?from=3782654143",
"https://p26.douyinpic.com/img/aweme-avatar/tos-cn-avt-0015_9c8aea4ba21f591774723a3820a07aef~c5_168x168.webp?from=3782654143",
"https://p3.douyinpic.com/img/aweme-avatar/tos-cn-avt-0015_9c8aea4ba21f591774723a3820a07aef~c5_168x168.webp?from=3782654143",
"https://p6.douyinpic.com/img/aweme-avatar/tos-cn-avt-0015_9c8aea4ba21f591774723a3820a07aef~c5_168x168.jpeg?from=3782654143"
]
},
"gender": 2
}
],
"extra": {
"fatal_item_ids": [],
"logid": "20230720194718A0B55C720A4E710A68EF",
"now": 1689853638000
},
"log_pb": {
"impr_id": "20230720194718A0B55C720A4E710A68EF"
}
}

14
API/user_post_delete.json Normal file
View File

@@ -0,0 +1,14 @@
{
"aweme_detail": null,
"filter_detail": {
"aweme_id": "7223326284024139065",
"detail_msg": "因作品权限或已被删除,无法观看,去看看其他作品吧",
"filter_reason": "status_self_see",
"icon": "https://p3.douyinpic.com/aweme-server-static-resource/reflow_notice_icon1.png~tplv-obj.image",
"notice": "抱歉,作品不见了"
},
"log_pb": {
"impr_id": "20230721183110BAFBC650B1FCD50ACE6F"
},
"status_code": 0
}

679
API/user_post_detail.json Normal file
View File

@@ -0,0 +1,679 @@
{
"aweme_detail": {
"activity_video_type": 0,
"admire_auth": {
"admire_button": 0,
"author_can_admire": 0,
"exit_admire_in_aweme_post": 0,
"is_admire": 0,
"is_click_admire_icon_recently": 0,
"is_fifty_admire_author_stable_fans": 0,
"is_iron_fans_in_aweme_post": 0,
"is_show_admire_button": 0,
"is_show_admire_tab": 0
},
"anchors": null,
"authentication_token": "MS4wLjAAAAAANyRrG5Pc-vuXA0GLydogCwzhiFLi6WTBtXip2GW2PU-iKfl3cohIbiKnusp5yQA33rgzXsD6iJmm7td2cYSH_Ys8s-17ENHTgs_Yyi-ZoFFJPJB-69Nc0G52o0RNJ5eFsUO4I5Qu_eD-blXDU95cE1pPL1j_-KJYSLborn6E5BcIWa0f0KJW-uBmnHBE-pim",
"author": {
"avatar_thumb": {
"height": 720,
"uri": "100x100/aweme-avatar/tos-cn-avt-0015_b4a51067e5d3c41d5d7758f14532ace6",
"url_list": [
"https://p3.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_b4a51067e5d3c41d5d7758f14532ace6.webp?from=116350172",
"https://p11.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_b4a51067e5d3c41d5d7758f14532ace6.webp?from=116350172",
"https://p6.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_b4a51067e5d3c41d5d7758f14532ace6.webp?from=116350172",
"https://p3.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_b4a51067e5d3c41d5d7758f14532ace6.jpeg?from=116350172"
],
"width": 720
},
"cf_list": null,
"close_friend_type": 0,
"contacts_status": 2,
"contrail_list": null,
"cover_url": [
{
"height": 720,
"uri": "c8510002be9a3a61aad2",
"url_list": [
"https://p95-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1691143200&x-signature=qJHxr4ZBto7cySJnUghuqh0g2xs%3D&from=116350172",
"https://p3-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1691143200&x-signature=hL79H8ZL8auuw4fsZznTDVZpY1g%3D&from=116350172",
"https://p5-a-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1691143200&x-signature=eVqrjbTpvzgt32HndkTGEBur9kw%3D&from=116350172"
],
"width": 720
}
],
"create_time": 0,
"custom_verify": "",
"data_label_list": null,
"endorsement_info_list": null,
"enterprise_verify_reason": "",
"familiar_visitor_user": null,
"favoriting_count": 1622,
"follow_status": 0,
"follow_status_err_code": 1,
"follower_count": 0,
"follower_list_secondary_information_struct": null,
"follower_status": 0,
"following_count": 0,
"im_role_ids": null,
"is_ad_fake": false,
"is_ban": false,
"is_blocked_v2": false,
"is_blocking_v2": false,
"is_cf": 0,
"live_high_value": 0,
"max_follower_count": 0,
"nickname": "百里TUFU",
"not_seen_item_id_list": null,
"not_seen_item_id_list_v2": null,
"offline_info_list": null,
"personal_tag_list": null,
"prevent_download": false,
"risk_notice_text": "",
"sec_uid": "MS4wLjABAAAAERbHksh_jtLRYjO8hOx9clHF9tJDBsZmhcL0VoPLItYXWg8H0jwYJd3mJOxiIGsU",
"secret": 0,
"share_info": {
"share_desc": "",
"share_desc_info": "",
"share_qrcode_url": {
"height": 720,
"uri": "2db880004580bf4797e76",
"url_list": [
"https://p26-sign.douyinpic.com/obj/2db880004580bf4797e76?x-expires=1689955200&x-signature=q%2FuR%2FZToVl1%2BYYP4oObAr3p33V4%3D&from=116350172",
"https://p9-sign.douyinpic.com/obj/2db880004580bf4797e76?x-expires=1689955200&x-signature=gT2ojN5OcNq2zCl62z2lEUJkh3g%3D&from=116350172",
"https://p95-sign.douyinpic.com/obj/2db880004580bf4797e76?x-expires=1689955200&x-signature=yx7UFONX9hLb89Le1j4SvzwETJI%3D&from=116350172"
],
"width": 720
},
"share_title": "",
"share_title_myself": "",
"share_title_other": "",
"share_url": "",
"share_weibo_desc": ""
},
"short_id": "2830954084",
"signature": "遇见都是缘分\n🧣&🍠半夜去杀猪x\n🛰JRCM0018888\n日常不定揪🎁@久然文化",
"signature_extra": null,
"special_follow_status": 0,
"special_people_labels": null,
"status": 1,
"text_extra": null,
"total_favorited": 43831234,
"uid": "3689586767443357",
"unique_id": "bailitufu8",
"user_age": -1,
"user_canceled": false,
"user_permissions": null,
"verification_type": 1
},
"author_mask_tag": 0,
"author_user_id": 3689586767443357,
"aweme_control": {
"can_comment": true,
"can_forward": true,
"can_share": true,
"can_show_comment": true
},
"aweme_id": "7071967230287744267",
"aweme_type": 0,
"book_bar": {},
"boost_status": 0,
"challenge_position": null,
"chapter_list": null,
"collect_stat": 0,
"collection_corner_mark": 0,
"comment_gid": 7071967230287744267,
"comment_list": null,
"comment_permission_info": {
"can_comment": true,
"comment_permission_status": 0,
"item_detail_entry": true,
"press_entry": true,
"toast_guide": false
},
"comment_words_recommend": {
"zero_comment": null
},
"commerce_config_data": null,
"common_bar_info": "[]",
"component_info_v2": "{\"desc_lines_limit\":0,\"hide_marquee\":false}",
"cover_labels": null,
"create_scale_type": null,
"create_time": 1646570683,
"desc": "其实早就和你表白过了 在看你的每个眼神里",
"digg_lottie": {
"can_bomb": 0,
"lottie_id": ""
},
"disable_relation_bar": 0,
"dislike_dimension_list": null,
"dislike_dimension_list_v2": null,
"distribute_circle": {
"campus_block_interaction": false,
"distribute_type": 0,
"is_campus": false
},
"duet_aggregate_in_music_tab": false,
"duration": 9611,
"feed_comment_config": {
"input_config_text": "善语结善缘,恶言伤人心"
},
"geofencing": [],
"geofencing_regions": null,
"group_id": "7071967230287744267",
"guide_scene_info": {
"diamond_expose_info_str": "",
"feed_origin_gid_info_str": "",
"guide_scene_type": 0
},
"hybrid_label": null,
"image_album_music_info": {
"begin_time": -1,
"end_time": -1,
"volume": -1
},
"image_comment": {},
"image_crop_ctrl": 0,
"image_infos": null,
"image_list": null,
"images": null,
"img_bitrate": null,
"impression_data": {
"group_id_list_a": [],
"group_id_list_b": [],
"group_id_list_c": [],
"similar_id_list_a": null,
"similar_id_list_b": null
},
"interaction_stickers": null,
"is_ads": false,
"is_collects_selected": 0,
"is_duet_sing": false,
"is_image_beat": false,
"is_life_item": false,
"is_share_post": false,
"is_story": 0,
"is_top": 0,
"item_warn_notification": {
"content": "",
"show": false,
"type": 0
},
"jump_tab_info_list": null,
"label_top_text": null,
"long_video": null,
"media_type": 4,
"music": {
"album": "",
"artist_user_infos": null,
"artists": [],
"audition_duration": 22,
"author": "碑海北",
"author_deleted": false,
"author_position": null,
"author_status": 1,
"avatar_large": {
"height": 720,
"uri": "1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6",
"url_list": [
"https://p3.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p5.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p11.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p3.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.jpeg?from=116350172"
],
"width": 720
},
"avatar_medium": {
"height": 720,
"uri": "720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6",
"url_list": [
"https://p11.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p5.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p3.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p11.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.jpeg?from=116350172"
],
"width": 720
},
"avatar_thumb": {
"height": 720,
"uri": "100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6",
"url_list": [
"https://p26.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p6.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p3.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p26.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.jpeg?from=116350172"
],
"width": 720
},
"binded_challenge_id": 0,
"can_background_play": true,
"collect_stat": 0,
"cover_hd": {
"height": 720,
"uri": "1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6",
"url_list": [
"https://p3.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p5.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p11.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p3.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.jpeg?from=116350172"
],
"width": 720
},
"cover_large": {
"height": 720,
"uri": "1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6",
"url_list": [
"https://p3.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p5.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p11.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p3.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.jpeg?from=116350172"
],
"width": 720
},
"cover_medium": {
"height": 720,
"uri": "720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6",
"url_list": [
"https://p11.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p5.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p3.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p11.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.jpeg?from=116350172"
],
"width": 720
},
"cover_thumb": {
"height": 720,
"uri": "100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6",
"url_list": [
"https://p26.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p6.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p3.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.webp?from=116350172",
"https://p26.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_cfdff2854a9af33f6cbeb44b2f57ebe6.jpeg?from=116350172"
],
"width": 720
},
"dmv_auto_show": false,
"dsp_status": 10,
"duration": 22,
"end_time": 0,
"external_song_info": [],
"extra": "{\"is_subsidy_exp\":false,\"hotsoon_review_time\":-1,\"music_label_id\":null,\"review_unshelve_reason\":0,\"has_edited\":1,\"reviewed\":1,\"image_beats_url\":\"https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/strong_beat/v3/1721154897643527\",\"douyin_beats_info\":{},\"cover_colors\":null,\"extract_item_id\":7049808778732129543,\"is_aed_music\":1,\"dsp_switch\":0,\"activities\":[10006],\"with_aed_model\":1,\"schedule_search_time\":0,\"music_tagging\":{\"Languages\":[\"Chinese\"],\"Moods\":[\"Miss\",\"Sorrow\"],\"Genres\":[\"Chinese Pop\",\"Pop\"],\"Themes\":[\"Autumn\",\"Love\"],\"AEDs\":[\"Male\",\"Vocal\"],\"SingingVersions\":[\"Same Auditory\"],\"Instruments\":null},\"is_red\":0,\"aggregate_exempt_conf\":[],\"beats\":{\"audio_effect_onset\":\"https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/strong_beat/v3/1721154896522248\",\"beats_tracker\":\"https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/strong_beat/v3/1721154897643527\",\"energy_trace\":\"https://sf6-cdn-tos.douyinstatic.com/obj/ies-music/strong_beat/v3/1721154896490510\",\"merged_beats\":\"https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/strong_beat/v3/1721154897675278\"}}",
"id": 7049808807056149285,
"id_str": "7049808807056149285",
"is_audio_url_with_cookie": false,
"is_commerce_music": false,
"is_del_video": false,
"is_matched_metadata": false,
"is_original": false,
"is_original_sound": true,
"is_pgc": false,
"is_restricted": false,
"is_video_self_see": false,
"luna_info": {
"has_copyright": false,
"is_luna_user": false
},
"lyric_short_position": null,
"matched_pgc_sound": {
"author": "五月天",
"cover_medium": {
"height": 720,
"uri": "tos-cn-v-2774c002/6d05de31bee64419adcf53c39ab433d5",
"url_list": [
"https://p11.douyinpic.com/aweme/200x200/tos-cn-v-2774c002/6d05de31bee64419adcf53c39ab433d5.jpeg",
"https://p26.douyinpic.com/aweme/200x200/tos-cn-v-2774c002/6d05de31bee64419adcf53c39ab433d5.jpeg",
"https://p3.douyinpic.com/aweme/200x200/tos-cn-v-2774c002/6d05de31bee64419adcf53c39ab433d5.jpeg"
],
"width": 720
},
"mixed_author": "",
"mixed_title": "",
"title": "突然好想你"
},
"mid": "7049808807056149285",
"music_chart_ranks": null,
"music_collect_count": 0,
"music_cover_atmosphere_color_value": "",
"music_image_beats": {
"music_image_beats_url": {
"height": 720,
"uri": "ies-music/strong_beat/v3/1721154897643527",
"url_list": [
"https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/strong_beat/v3/1721154897643527"
],
"width": 720
}
},
"music_status": 1,
"musician_user_infos": null,
"mute_share": false,
"offline_desc": "",
"owner_handle": "z810807031",
"owner_id": "72609174662",
"owner_nickname": "碑海北",
"pgc_music_type": 2,
"play_url": {
"height": 720,
"uri": "https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/7049808808016759589.mp3",
"url_key": "7049808807056149285",
"url_list": [
"https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/7049808808016759589.mp3",
"https://sf6-cdn-tos.douyinstatic.com/obj/ies-music/7049808808016759589.mp3"
],
"width": 720
},
"position": null,
"prevent_download": false,
"prevent_item_download_status": 0,
"preview_end_time": 0,
"preview_start_time": 0,
"reason_type": 0,
"redirect": false,
"schema_url": "",
"search_impr": {
"entity_id": "7049808807056149285"
},
"sec_uid": "MS4wLjABAAAArB7A1MV09AIHOoj2P42i1n-fC7WW4MCxoMZ6W2hlD_I",
"shoot_duration": 22,
"song": {
"artists": null,
"chorus_v3_infos": null,
"id": 6984445252358637598,
"id_str": "6984445252358637598"
},
"source_platform": 23,
"start_time": 0,
"status": 1,
"strong_beat_url": {
"height": 720,
"uri": "https://sf6-cdn-tos.douyinstatic.com/obj/ies-music/pattern/c9dd478c4ddb9634f49bc58396388af8.json",
"url_list": [
"https://sf6-cdn-tos.douyinstatic.com/obj/ies-music/pattern/c9dd478c4ddb9634f49bc58396388af8.json",
"https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/pattern/c9dd478c4ddb9634f49bc58396388af8.json"
],
"width": 720
},
"tag_list": null,
"title": "碑海北的浪漫bgm",
"unshelve_countries": null,
"user_count": 0,
"video_duration": 22
},
"nickname_position": null,
"origin_comment_ids": null,
"origin_text_extra": [],
"original_images": null,
"packed_clips": null,
"photo_search_entrance": {
"ecom_type": 0
},
"position": null,
"press_panel_info": "[{\"interactive\":[\"2_story\",\"2_friend\"]},{\"feedback\":[\"rr_feedback\",\"dislike\",\"ignore\",\"block\",\"unfollow\",\"sever\",\"dislike_collect\"]},{\"control\":[\"speed\",\"auth\",\"delete\",\"save\",\"collect\",\"reward\",\"bg_play\",\"duet\",\"together\"]}]",
"preview_title": "其实早就和你表白过了 在看你的每个眼神里",
"preview_video_status": 1,
"promotions": [],
"rate": 12,
"ref_tts_id_list": null,
"ref_voice_modify_id_list": null,
"region": "CN",
"relation_labels": null,
"reply_smart_emojis": null,
"search_impr": {
"entity_id": "7071967230287744267",
"entity_type": "GENERAL"
},
"series_paid_info": {
"item_price": 0,
"series_paid_status": 0
},
"share_info": {
"share_desc": "在抖音,记录美好生活",
"share_desc_info": "#在抖音,记录美好生活#其实早就和你表白过了 在看你的每个眼神里",
"share_link_desc": "0.76 hBG:/ 复制打开抖音看看【百里TUFU的作品】其实早就和你表白过了 在看你的每个眼神里 %s",
"share_url": "https://www.iesdouyin.com/share/video/7071967230287744267/?region=CN&mid=7049808807056149285&u_code=-1&did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&titleType=title&share_sign=rIGgopv3C3PqJPWCzqgLdCK.iBOhqGn52yFcsT9.TYA-&share_version=230500&ts=1689935825&from_ssr=1"
},
"share_url": "https://www.iesdouyin.com/share/video/7071967230287744267/?region=CN&mid=7049808807056149285&u_code=-1&did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&titleType=title&share_sign=rIGgopv3C3PqJPWCzqgLdCK.iBOhqGn52yFcsT9.TYA-&share_version=230500&ts=1689935825&from_ssr=1",
"should_open_ad_report": false,
"show_follow_button": {},
"slides_music_beats": null,
"social_tag_list": null,
"standard_bar_info_list": null,
"statistics": {
"admire_count": 0,
"aweme_id": "7071967230287744267",
"collect_count": 3799,
"comment_count": 7343,
"digg_count": 165539,
"play_count": 0,
"share_count": 23537
},
"status": {
"allow_share": true,
"aweme_id": "7071967230287744267",
"in_reviewing": false,
"is_delete": false,
"is_prohibited": false,
"listen_video_status": 2,
"part_see": 0,
"private_status": 0,
"review_result": {
"review_status": 0
}
},
"suggest_words": {
"suggest_words": [
{
"extra_info": "{}",
"hint_text": "气泡框词",
"icon_url": "",
"scene": "search_icon_rec",
"words": [
{
"info": "{\"qrec_for_search\":\"{}\"}",
"word": "蛇姐",
"word_id": "6580341104468563207"
}
]
},
{
"extra_info": "{}",
"hint_text": "大家都在搜:",
"icon_url": "",
"scene": "comment_top_rec",
"words": [
{
"info": "{\"qrec_for_search\":\"{}\"}",
"word": "百里tufu穿泳衣",
"word_id": "7255870910253667638"
}
]
}
]
},
"super_like_status": 0,
"text_extra": [],
"tts_id_list": null,
"uniqid_position": null,
"user_digged": 0,
"user_recommend_status": 0,
"video": {
"big_thumbs": null,
"bit_rate": [
{
"FPS": 30,
"HDR_bit": "",
"HDR_type": "",
"bit_rate": 498449,
"gear_name": "adapt_lowest_720_1",
"is_bytevc1": 1,
"is_h265": 1,
"play_addr": {
"data_size": 598825,
"file_cs": "c:0-9241-3a2a|d:0-299411-e1d8,299412-598824-0fc9|a:v0300fg10000c8iaoerc77u635eat4q0",
"file_hash": "0bbfd6701150a78f9255971284413697",
"height": 1280,
"uri": "v0300fg10000c8iaoerc77u635eat4q0",
"url_key": "v0300fg10000c8iaoerc77u635eat4q0_bytevc1_720p_498449",
"url_list": [
"https://v5-coldi.douyinvod.com/fb233b897397b568a466a9aebe834d76/64ba6dea/video/tos/cn/tos-cn-ve-15-alinc2/765ec3b0e54f4da7ab73889be9103fee/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=486&bt=486&cs=2&ds=3&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=15&rc=OTY0M2U6Nmg8OzM2NThmOUBpMzdkODk6ZmhkOzMzNGkzM0A0MzYvXzE2NTQxLzY2NDQ0YSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://v3-cold3.douyinvod.com/7252d5e0367080dd07125dd3390a1f92/64ba6dea/video/tos/cn/tos-cn-ve-15-alinc2/765ec3b0e54f4da7ab73889be9103fee/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=486&bt=486&cs=2&ds=3&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=15&rc=OTY0M2U6Nmg8OzM2NThmOUBpMzdkODk6ZmhkOzMzNGkzM0A0MzYvXzE2NTQxLzY2NDQ0YSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://api-play-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=0&file_id=767c7592932048798e9347bb20916376&sign=0bbfd6701150a78f9255971284413697&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL",
"https://api-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=1&file_id=767c7592932048798e9347bb20916376&sign=0bbfd6701150a78f9255971284413697&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL"
],
"width": 720
},
"quality_type": 15,
"video_extra": "{\"PktOffsetMap\":\"\"}"
},
{
"FPS": 30,
"HDR_bit": "",
"HDR_type": "",
"bit_rate": 448582,
"gear_name": "adapt_540_1",
"is_bytevc1": 1,
"is_h265": 1,
"play_addr": {
"data_size": 538916,
"file_cs": "c:0-9241-0267|d:0-269457-bb18,269458-538915-29ea|a:v0300fg10000c8iaoerc77u635eat4q0",
"file_hash": "307d4827f5cf050b2a2f38ed5aadcd57",
"height": 1024,
"uri": "v0300fg10000c8iaoerc77u635eat4q0",
"url_key": "v0300fg10000c8iaoerc77u635eat4q0_bytevc1_540p_448582",
"url_list": [
"https://v5-colds.douyinvod.com/28a6b1468b7062629565a3b77b1a09af/64ba6dea/video/tos/cn/tos-cn-ve-15c001-alinc2/bddc8027b0b843148d370243ed831297/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=438&bt=438&cs=2&ds=6&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=11&rc=OztnZzk1Z2Q6OmVpZjg3NUBpMzdkODk6ZmhkOzMzNGkzM0AxM2E0Li4yXzYxMjYtNC81YSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://v3-cold.douyinvod.com/9bf8871d05c84b2429675ed91dde9895/64ba6dea/video/tos/cn/tos-cn-ve-15c001-alinc2/bddc8027b0b843148d370243ed831297/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=438&bt=438&cs=2&ds=6&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=11&rc=OztnZzk1Z2Q6OmVpZjg3NUBpMzdkODk6ZmhkOzMzNGkzM0AxM2E0Li4yXzYxMjYtNC81YSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://api-play-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=0&file_id=8224750c9f5b4797ba5d12167ddd6848&sign=307d4827f5cf050b2a2f38ed5aadcd57&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL",
"https://api-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=1&file_id=8224750c9f5b4797ba5d12167ddd6848&sign=307d4827f5cf050b2a2f38ed5aadcd57&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL"
],
"width": 576
},
"quality_type": 28,
"video_extra": "{\"PktOffsetMap\":\"\"}"
}
],
"bit_rate_audio": null,
"cover": {
"height": 1920,
"uri": "tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304",
"url_list": [
"https://p26-sign.douyinpic.com/tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304~c5_300x400.webp?x-expires=1691143200&x-signature=7o0V2AbVB5QFa12OyQUGJlzWqoI%3D&from=3213915784_large&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p3-sign.douyinpic.com/tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304~c5_300x400.webp?x-expires=1691143200&x-signature=6u3r1ow7cImkzX8ifi4cLU1t53c%3D&from=3213915784_large&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p6-sign.douyinpic.com/tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304~c5_300x400.webp?x-expires=1691143200&x-signature=ivW%2BfxIM6MHfeDnmvQ8XuPJsnZs%3D&from=3213915784_large&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p26-sign.douyinpic.com/tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304~c5_300x400.jpeg?x-expires=1691143200&x-signature=G993HujxbzwCu22sSgJo%2B34EzgE%3D&from=3213915784_large&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092"
],
"width": 1080
},
"cover_original_scale": {
"height": 720,
"uri": "tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304",
"url_list": [
"https://p26-sign.douyinpic.com/tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304~tplv-dy-360p.webp?x-expires=1691143200&x-signature=MC%2Bjtc5Z8SvQRlufZ9m0lFD0fU8%3D&from=3213915784&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=origin_cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p3-sign.douyinpic.com/tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304~tplv-dy-360p.webp?x-expires=1691143200&x-signature=ymMiCyTDsnJuIZTbanOfSA247c4%3D&from=3213915784&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=origin_cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p6-sign.douyinpic.com/tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304~tplv-dy-360p.webp?x-expires=1691143200&x-signature=EtUMFwu6kmGz9Gy4oVDLRBEUrDU%3D&from=3213915784&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=origin_cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p26-sign.douyinpic.com/tos-cn-p-0015/67d4a42fb52b4b4fbbc1ba2b745e1304~tplv-dy-360p.jpeg?x-expires=1691143200&x-signature=WxqKhfIz7cNnN3WNIL9UOinw68M%3D&from=3213915784&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=origin_cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092"
],
"width": 720
},
"duration": 9611,
"dynamic_cover": {
"height": 720,
"uri": "tos-cn-p-0015/15eb938bb2ed458aa976844714ba245b_1646570722",
"url_list": [
"https://p3-sign.douyinpic.com/obj/tos-cn-p-0015/15eb938bb2ed458aa976844714ba245b_1646570722?x-expires=1691143200&x-signature=iPItBkfCWAq4ON3kHHJ4ycjGRpE%3D&from=3213915784_large&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p6-sign.douyinpic.com/obj/tos-cn-p-0015/15eb938bb2ed458aa976844714ba245b_1646570722?x-expires=1691143200&x-signature=o8kcZ933iRpQMK8wv9sC7zWn5lI%3D&from=3213915784_large&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p26-sign.douyinpic.com/obj/tos-cn-p-0015/15eb938bb2ed458aa976844714ba245b_1646570722?x-expires=1691143200&x-signature=mMOHMK3of5%2F25TRXX%2BZbfVB3oh4%3D&from=3213915784_large&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092"
],
"width": 720
},
"height": 1920,
"is_h265": 0,
"is_source_HDR": 0,
"meta": "{\"loudness\":\"-15.5\",\"peak\":\"0.59566\",\"qprf\":\"0.9426440000534058\",\"sr_score\":\"0.000\"}",
"origin_cover": {
"height": 720,
"uri": "tos-cn-p-0015/e66ef5f61b074c189520944e8d1f1b1a_1646570719",
"url_list": [
"https://p6-sign.douyinpic.com/tos-cn-p-0015/e66ef5f61b074c189520944e8d1f1b1a_1646570719~tplv-dy-360p.webp?x-expires=1691143200&x-signature=5Iigv0RKTMVUo5Sm69ZPG2AdRiM%3D&from=3213915784&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=origin_cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p26-sign.douyinpic.com/tos-cn-p-0015/e66ef5f61b074c189520944e8d1f1b1a_1646570719~tplv-dy-360p.webp?x-expires=1691143200&x-signature=fg5wq2cNDLNmTdpQXf2ZLG4XHHw%3D&from=3213915784&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=origin_cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p3-sign.douyinpic.com/tos-cn-p-0015/e66ef5f61b074c189520944e8d1f1b1a_1646570719~tplv-dy-360p.webp?x-expires=1691143200&x-signature=leuu809HLsQ79gSuO3ZKtkQd5a8%3D&from=3213915784&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=origin_cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092",
"https://p6-sign.douyinpic.com/tos-cn-p-0015/e66ef5f61b074c189520944e8d1f1b1a_1646570719~tplv-dy-360p.jpeg?x-expires=1691143200&x-signature=2kCQtNCAX%2FySYoffMlvmN9qFRH4%3D&from=3213915784&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=origin_cover&biz_tag=aweme_video&l=20230721183704115C8631EBB6BF156092"
],
"width": 720
},
"play_addr": {
"data_size": 976507,
"file_cs": "c:0-11579-de64|d:0-488252-0229,488253-976506-b071|a:v0300fg10000c8iaoerc77u635eat4q0",
"file_hash": "4cdff545e40298edf7cee120a9c7c6c0",
"height": 1024,
"uri": "v0300fg10000c8iaoerc77u635eat4q0",
"url_key": "v0300fg10000c8iaoerc77u635eat4q0_h264_540p_822668",
"url_list": [
"https://v11-coldf.douyinvod.com/b455c35a2591845b90973bb72b6db4c9/64ba6dea/video/tos/cn/tos-cn-ve-15-alinc2/87d10056420d499686ecbd9305594bb9/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=803&bt=803&cs=0&ds=6&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=Nmk6Ojo3ZTQzZzQ0OTlnZUBpMzdkODk6ZmhkOzMzNGkzM0AtNTRhLi1fNjUxYDU0NV9hYSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://v3-cold.douyinvod.com/98ce912805e8cccd7f4f160e4e7a509e/64ba6dea/video/tos/cn/tos-cn-ve-15-alinc2/87d10056420d499686ecbd9305594bb9/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=803&bt=803&cs=0&ds=6&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=Nmk6Ojo3ZTQzZzQ0OTlnZUBpMzdkODk6ZmhkOzMzNGkzM0AtNTRhLi1fNjUxYDU0NV9hYSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://api-play-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=0&file_id=dbbd867681c14d8091bb0417d7778f03&sign=4cdff545e40298edf7cee120a9c7c6c0&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL",
"https://api-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=1&file_id=dbbd867681c14d8091bb0417d7778f03&sign=4cdff545e40298edf7cee120a9c7c6c0&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL"
],
"width": 576
},
"play_addr_265": {
"data_size": 538916,
"file_cs": "c:0-9241-0267|d:0-269457-bb18,269458-538915-29ea|a:v0300fg10000c8iaoerc77u635eat4q0",
"file_hash": "307d4827f5cf050b2a2f38ed5aadcd57",
"height": 1024,
"uri": "v0300fg10000c8iaoerc77u635eat4q0",
"url_key": "v0300fg10000c8iaoerc77u635eat4q0_bytevc1_540p_448582",
"url_list": [
"https://v5-colds.douyinvod.com/28a6b1468b7062629565a3b77b1a09af/64ba6dea/video/tos/cn/tos-cn-ve-15c001-alinc2/bddc8027b0b843148d370243ed831297/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=438&bt=438&cs=2&ds=6&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=11&rc=OztnZzk1Z2Q6OmVpZjg3NUBpMzdkODk6ZmhkOzMzNGkzM0AxM2E0Li4yXzYxMjYtNC81YSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://v3-cold.douyinvod.com/9bf8871d05c84b2429675ed91dde9895/64ba6dea/video/tos/cn/tos-cn-ve-15c001-alinc2/bddc8027b0b843148d370243ed831297/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=438&bt=438&cs=2&ds=6&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=11&rc=OztnZzk1Z2Q6OmVpZjg3NUBpMzdkODk6ZmhkOzMzNGkzM0AxM2E0Li4yXzYxMjYtNC81YSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://api-play-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=0&file_id=8224750c9f5b4797ba5d12167ddd6848&sign=307d4827f5cf050b2a2f38ed5aadcd57&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL",
"https://api-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=1&file_id=8224750c9f5b4797ba5d12167ddd6848&sign=307d4827f5cf050b2a2f38ed5aadcd57&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL"
],
"width": 576
},
"play_addr_h264": {
"data_size": 976507,
"file_cs": "c:0-11579-de64|d:0-488252-0229,488253-976506-b071|a:v0300fg10000c8iaoerc77u635eat4q0",
"file_hash": "4cdff545e40298edf7cee120a9c7c6c0",
"height": 1024,
"uri": "v0300fg10000c8iaoerc77u635eat4q0",
"url_key": "v0300fg10000c8iaoerc77u635eat4q0_h264_540p_822668",
"url_list": [
"https://v11-coldf.douyinvod.com/b455c35a2591845b90973bb72b6db4c9/64ba6dea/video/tos/cn/tos-cn-ve-15-alinc2/87d10056420d499686ecbd9305594bb9/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=803&bt=803&cs=0&ds=6&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=Nmk6Ojo3ZTQzZzQ0OTlnZUBpMzdkODk6ZmhkOzMzNGkzM0AtNTRhLi1fNjUxYDU0NV9hYSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://v3-cold.douyinvod.com/98ce912805e8cccd7f4f160e4e7a509e/64ba6dea/video/tos/cn/tos-cn-ve-15-alinc2/87d10056420d499686ecbd9305594bb9/?a=1128&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=803&bt=803&cs=0&ds=6&ft=bvjWJkQQqUWXf_40mo0OW_EklpPiXYhEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=Nmk6Ojo3ZTQzZzQ0OTlnZUBpMzdkODk6ZmhkOzMzNGkzM0AtNTRhLi1fNjUxYDU0NV9hYSNucWIwcjRvbGZgLS1kLTBzcw%3D%3D&l=20230721183704115C8631EBB6BF156092&btag=e00088000&dy_q=1689935825",
"https://api-play-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=0&file_id=dbbd867681c14d8091bb0417d7778f03&sign=4cdff545e40298edf7cee120a9c7c6c0&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL",
"https://api-hl.amemv.com/aweme/v1/play/?video_id=v0300fg10000c8iaoerc77u635eat4q0&line=1&file_id=dbbd867681c14d8091bb0417d7778f03&sign=4cdff545e40298edf7cee120a9c7c6c0&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL"
],
"width": 576
},
"ratio": "540p",
"width": 1080
},
"video_game_data_channel_config": {},
"video_labels": null,
"video_tag": [
{
"level": 1,
"tag_id": 2006,
"tag_name": "颜值"
},
{
"level": 2,
"tag_id": 2006002,
"tag_name": "美女"
},
{
"level": 0,
"tag_id": 0,
"tag_name": ""
}
],
"video_text": [],
"voice_modify_id_list": null,
"yumme_recreason": null
},
"log_pb": {
"impr_id": "20230721183704115C8631EBB6BF156092"
},
"status_code": 0
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,716 @@
{
"status_code": 0,
"min_cursor": 1689909551000,
"max_cursor": 1689909551000,
"has_more": 1,
"aweme_list": [
{
"aweme_id": "7253290037918354691",
"desc": "飞行员跳伞进山寨,哪知道白捡了个寨主当 #电影冰雪狙击2 #冰雪狙击2老戏骨飙戏",
"create_time": 1688788818,
"author": {
"uid": "96719499963",
"ky_only_predict": 0,
"nickname": "燃剪Kevin",
"data_label_list": null,
"user_not_show": 1,
"aweme_hotsoon_auth": 1,
"avatar_thumb": {
"uri": "100x100/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda.jpeg?from=116350172"
],
"width": 720,
"height": 720
},
"cf_list": null,
"is_ban": false,
"show_nearby_active": false,
"follow_status": 0,
"aweme_count": 292,
"following_count": 99,
"follower_count": 2259367,
"favoriting_count": 30283,
"total_favorited": 77462280,
"link_item_list": null,
"hide_search": false,
"constellation": 3,
"not_seen_item_id_list_v2": null,
"offline_info_list": null,
"weibo_verify": "",
"custom_verify": "影视自媒体",
"need_points": null,
"familiar_visitor_user": null,
"special_lock": 1,
"need_recommend": 0,
"is_binded_weibo": false,
"weibo_name": "",
"weibo_schema": "",
"weibo_url": "",
"story_open": false,
"ban_user_functions": [],
"has_facebook_token": false,
"has_twitter_token": false,
"fb_expire_time": 0,
"tw_expire_time": 0,
"has_youtube_token": false,
"youtube_expire_time": 0,
"card_entries": null,
"live_verify": 0,
"not_seen_item_id_list": null,
"white_cover_url": null,
"shield_follow_notice": 0,
"shield_digg_notice": 0,
"shield_comment_notice": 0,
"contrail_list": null,
"text_extra": null,
"endorsement_info_list": null,
"share_info": {
"share_url": "",
"share_weibo_desc": "",
"share_desc": "",
"share_title": "",
"share_qrcode_url": {
"uri": "75be001898e7b6d5a31c",
"url_list": [
"https://p6-pc-sign.douyinpic.com/obj/75be001898e7b6d5a31c?x-expires=1689955200&x-signature=7ED%2BlhVW7DAI1u9zaZTPsZoxbJs%3D&from=116350172",
"https://p9-pc-sign.douyinpic.com/obj/75be001898e7b6d5a31c?x-expires=1689955200&x-signature=7e3%2BvHAbgIi3lrkCXwmJqE9WEc0%3D&from=116350172",
"https://p3-pc-sign.douyinpic.com/obj/75be001898e7b6d5a31c?x-expires=1689955200&x-signature=05z6geg1%2Ftu7SrKLAh52WXlBZ%2Fg%3D&from=116350172"
],
"width": 720,
"height": 720
},
"share_title_myself": "",
"share_title_other": "",
"share_desc_info": ""
},
"aweme_hotsoon_auth_relation": 1,
"user_tags": null,
"homepage_bottom_toast": null,
"enterprise_verify_reason": "",
"user_permissions": null,
"follower_list_secondary_information_struct": null,
"display_info": null,
"account_region": "",
"enable_nearby_visible": true,
"im_role_ids": null,
"live_agreement": 0,
"follower_request_status": 0,
"with_shop_entry": false,
"search_impr": {
"entity_id": "96719499963"
},
"user_not_see": 0,
"has_orders": false,
"prevent_download": false,
"show_image_bubble": false,
"is_blocking_v2": false,
"unique_id_modify_time": 1689935156,
"can_set_geofencing": null,
"ins_id": "",
"google_account": "",
"youtube_channel_id": "",
"youtube_channel_title": "",
"apple_account": 0,
"with_dou_entry": false,
"with_fusion_shop_entry": false,
"is_phone_binded": false,
"accept_private_policy": false,
"twitter_id": "",
"twitter_name": "",
"user_canceled": false,
"has_email": false,
"special_people_labels": null,
"live_agreement_time": 0,
"status": 1,
"create_time": 0,
"avatar_uri": "aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda",
"follower_status": 0,
"neiguang_shield": 0,
"signature_extra": null,
"is_blocked_v2": false,
"reflow_page_gid": 0,
"reflow_page_uid": 0,
"user_rate": 1,
"close_friend_type": 0,
"download_prompt_ts": 0,
"react_setting": 0,
"live_commerce": false,
"cover_url": [
{
"uri": "c8510002be9a3a61aad2",
"url_list": [
"https://p6-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1691143200&x-signature=cP8m4aUIjlcHRoii9OGFPHSZLws%3D&from=116350172",
"https://p3-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1691143200&x-signature=9Nth8pMmx2fD2Ox4171nc9rD4qI%3D&from=116350172",
"https://p9-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1691143200&x-signature=78Kd86oUQQvlENM266gxx%2FZCsak%3D&from=116350172"
],
"width": 720,
"height": 720
}
],
"card_entries_not_display": null,
"has_insights": false,
"share_qrcode_uri": "75be001898e7b6d5a31c",
"card_sort_priority": null,
"user_mode": 0,
"user_period": 0,
"is_cf": 0,
"is_not_show": false,
"interest_tags": null,
"cv_level": "",
"special_follow_status": 0,
"risk_notice_text": "",
"max_follower_count": 0,
"contacts_status": 2,
"live_high_value": 0,
"aweme_control": {
"can_forward": true,
"can_share": true,
"can_comment": true,
"can_show_comment": true
},
"personal_tag_list": null,
"sec_uid": "MS4wLjABAAAAdBrGekUlNXGPsc8rNnv_jDhN8koyuWDyrU3CrcvzmcQ"
},
"music": {
"id": 7253290130763467557,
"id_str": "7253290130763467557",
"title": "@燃剪Kevin创作的原声",
"author": "燃剪Kevin",
"album": "",
"cover_hd": {
"uri": "1080x1080/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda.jpeg?from=116350172"
],
"width": 720,
"height": 720
},
"cover_large": {
"uri": "1080x1080/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda.jpeg?from=116350172"
],
"width": 720,
"height": 720
},
"cover_medium": {
"uri": "720x720/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda.jpeg?from=116350172"
],
"width": 720,
"height": 720
},
"cover_thumb": {
"uri": "100x100/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda.jpeg?from=116350172"
],
"width": 720,
"height": 720
},
"play_url": {
"uri": "https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/7253290131958942522.mp3",
"url_list": [
"https://sf86-cdn-tos.douyinstatic.com/obj/ies-music/7253290131958942522.mp3",
"https://sf3-cdn-tos.douyinstatic.com/obj/ies-music/7253290131958942522.mp3"
],
"width": 720,
"height": 720,
"url_key": "7253290130763467557"
},
"schema_url": "",
"source_platform": 23,
"start_time": 0,
"end_time": 0,
"duration": 64,
"extra": "{\"cover_colors\":null,\"extract_item_id\":7253290037918354691,\"dsp_switch\":0,\"review_unshelve_reason\":0,\"beats\":{},\"hotsoon_review_time\":-1,\"music_tagging\":{\"Languages\":null,\"Moods\":null,\"Genres\":null,\"Themes\":null,\"AEDs\":null,\"SingingVersions\":null,\"Instruments\":null},\"is_subsidy_exp\":false,\"music_label_id\":null,\"is_aed_music\":0,\"reviewed\":0,\"douyin_beats_info\":{},\"schedule_search_time\":0,\"is_red\":0,\"aggregate_exempt_conf\":[],\"with_aed_model\":1,\"has_edited\":0}",
"user_count": 0,
"position": null,
"collect_stat": 0,
"status": 1,
"offline_desc": "",
"owner_id": "96719499963",
"owner_nickname": "燃剪Kevin",
"is_original": false,
"mid": "7253290130763467557",
"binded_challenge_id": 0,
"redirect": false,
"is_restricted": false,
"author_deleted": false,
"is_del_video": false,
"is_video_self_see": false,
"owner_handle": "W75888",
"author_position": null,
"prevent_download": false,
"unshelve_countries": null,
"prevent_item_download_status": 0,
"external_song_info": [],
"sec_uid": "MS4wLjABAAAAdBrGekUlNXGPsc8rNnv_jDhN8koyuWDyrU3CrcvzmcQ",
"avatar_thumb": {
"uri": "100x100/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda.jpeg?from=116350172"
],
"width": 720,
"height": 720
},
"avatar_medium": {
"uri": "720x720/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda.jpeg?from=116350172"
],
"width": 720,
"height": 720
},
"avatar_large": {
"uri": "1080x1080/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-avt-0015_1fb72c76792162a10da69dcb1f0bedda.jpeg?from=116350172"
],
"width": 720,
"height": 720
},
"preview_start_time": 0,
"preview_end_time": 0,
"is_commerce_music": false,
"is_original_sound": true,
"audition_duration": 64,
"shoot_duration": 64,
"reason_type": 0,
"artists": [],
"lyric_short_position": null,
"mute_share": false,
"tag_list": null,
"dmv_auto_show": false,
"is_pgc": false,
"is_matched_metadata": false,
"is_audio_url_with_cookie": false,
"music_chart_ranks": null,
"can_background_play": true,
"music_status": 1,
"video_duration": 64,
"pgc_music_type": 2,
"author_status": 1,
"search_impr": {
"entity_id": "7253290130763467557"
},
"artist_user_infos": null,
"dsp_status": 10,
"musician_user_infos": null,
"luna_info": {
"is_luna_user": false
},
"music_collect_count": 0,
"music_cover_atmosphere_color_value": ""
},
"jump_tab_info_list": null,
"video": {
"play_addr": {
"uri": "v0200fg10000cikdoqjc77u487ia3t1g",
"url_list": [
"http://v26-web.douyinvod.com/f09adc21743f08884ebfd18bee2c7757/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/oMSoq9gqbAIgtxOKQn9keEBD4DACeAMhgNREnI/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=2198&bt=2198&cs=0&ds=4&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=NzhnOmg5ODc7O2U5ZTVmZ0BpandkOjc6ZnRnbDMzNGkzM0AtX2NeXmJjNl4xLTRfL141YSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"http://v3-web.douyinvod.com/a5e31e04504bc6463031a9d4036d643d/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/oMSoq9gqbAIgtxOKQn9keEBD4DACeAMhgNREnI/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=2198&bt=2198&cs=0&ds=4&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=NzhnOmg5ODc7O2U5ZTVmZ0BpandkOjc6ZnRnbDMzNGkzM0AtX2NeXmJjNl4xLTRfL141YSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"https://www.douyin.com/aweme/v1/play/?video_id=v0200fg10000cikdoqjc77u487ia3t1g&line=0&file_id=8dac22bb760b48a894f5e6aea7fdb504&sign=283df9ddd7ac9739e9bcfbd3f7c9ec59&is_play_url=1&source=PackSourceEnum_PUBLISH"
],
"width": 1728,
"height": 1080,
"url_key": "v0200fg10000cikdoqjc77u487ia3t1g_h264_1080p_2251713",
"data_size": 18025814,
"file_hash": "283df9ddd7ac9739e9bcfbd3f7c9ec59",
"file_cs": "c:0-53558-2651"
},
"cover": {
"uri": "tos-cn-i-dy/bc4a6c96faea452e983b1371561e853d",
"url_list": [
"https://p3-pc-sign.douyinpic.com/tos-cn-i-dy/bc4a6c96faea452e983b1371561e853d~tplv-dy-cropcenter:323:430.jpeg?x-expires=1691143200&x-signature=M%2FmIef2TBxaBIg5VGxQtKuAK%2F5U%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=true&sh=323_430&sc=cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610",
"https://p6-pc-sign.douyinpic.com/obj/tos-cn-i-dy/bc4a6c96faea452e983b1371561e853d?x-expires=1691143200&x-signature=L2cNq8h3oKZfMpL1WEIxZu0s5dY%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610",
"https://p3-pc-sign.douyinpic.com/obj/tos-cn-i-dy/bc4a6c96faea452e983b1371561e853d?x-expires=1691143200&x-signature=eV3D8Q1M6ico%2FIaHMCzI9YAu0p4%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610",
"https://p9-pc-sign.douyinpic.com/obj/tos-cn-i-dy/bc4a6c96faea452e983b1371561e853d?x-expires=1691143200&x-signature=ee2B9Qhql0XamOJ8zHdU8w6tNHY%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610"
],
"width": 720,
"height": 720
},
"height": 1200,
"width": 1920,
"dynamic_cover": {
"uri": "tos-cn-i-dy/bc4a6c96faea452e983b1371561e853d",
"url_list": [
"https://p9-pc-sign.douyinpic.com/obj/tos-cn-i-dy/bc4a6c96faea452e983b1371561e853d?x-expires=1691143200&x-signature=ee2B9Qhql0XamOJ8zHdU8w6tNHY%3D&from=3213915784_large&s=PackSourceEnum_PUBLISH&se=false&sc=origin_cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610",
"https://p3-pc-sign.douyinpic.com/obj/tos-cn-i-dy/bc4a6c96faea452e983b1371561e853d?x-expires=1691143200&x-signature=eV3D8Q1M6ico%2FIaHMCzI9YAu0p4%3D&from=3213915784_large&s=PackSourceEnum_PUBLISH&se=false&sc=origin_cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610",
"https://p6-pc-sign.douyinpic.com/obj/tos-cn-i-dy/bc4a6c96faea452e983b1371561e853d?x-expires=1691143200&x-signature=L2cNq8h3oKZfMpL1WEIxZu0s5dY%3D&from=3213915784_large&s=PackSourceEnum_PUBLISH&se=false&sc=origin_cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610"
],
"width": 720,
"height": 720
},
"origin_cover": {
"uri": "tos-cn-p-0015/a3635a2cf1264a14af11d2ca2a9a62d2_1688788214",
"url_list": [
"https://p3-pc-sign.douyinpic.com/tos-cn-p-0015/a3635a2cf1264a14af11d2ca2a9a62d2_1688788214~tplv-dy-360p.jpeg?x-expires=1691143200&x-signature=MCSrDq4d%2BC1r3x187Qdt6lemtn0%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=origin_cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610",
"https://p9-pc-sign.douyinpic.com/tos-cn-p-0015/a3635a2cf1264a14af11d2ca2a9a62d2_1688788214~tplv-dy-360p.jpeg?x-expires=1691143200&x-signature=F%2B5DrjJGhLaZj5VSv281CktNbL0%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=origin_cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610",
"https://p6-pc-sign.douyinpic.com/tos-cn-p-0015/a3635a2cf1264a14af11d2ca2a9a62d2_1688788214~tplv-dy-360p.jpeg?x-expires=1691143200&x-signature=1Ral%2BJKLKU%2B2B9gGjt9Okgmf6rA%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=origin_cover&biz_tag=pcweb_cover&l=202307211825566527AF3C1671F5138610"
],
"width": 720,
"height": 720
},
"ratio": "1080p",
"gaussian_cover": {
"uri": "tos-cn-p-0015/a3635a2cf1264a14af11d2ca2a9a62d2_1688788214",
"url_list": [
"https://p6-pc-sign.douyinpic.com/tos-cn-p-0015/a3635a2cf1264a14af11d2ca2a9a62d2_1688788214~tplv-tsj2vxp0zn-gaosi:40.jpeg?x-expires=1721469600&x-signature=0tFxlPcaCQkTcvCXkAFVahob2X8%3D&from=3213915784",
"https://p3-pc-sign.douyinpic.com/tos-cn-p-0015/a3635a2cf1264a14af11d2ca2a9a62d2_1688788214~tplv-tsj2vxp0zn-gaosi:40.jpeg?x-expires=1721469600&x-signature=47RZudxN3Is0KIVkoQAQtirvjas%3D&from=3213915784",
"https://p9-pc-sign.douyinpic.com/tos-cn-p-0015/a3635a2cf1264a14af11d2ca2a9a62d2_1688788214~tplv-tsj2vxp0zn-gaosi:40.jpeg?x-expires=1721469600&x-signature=7dul7w7kV9OXoQdy8e4Le1GSF9w%3D&from=3213915784"
],
"width": 720,
"height": 720
},
"use_static_cover": true,
"big_thumbs": [
{
"img_num": 64,
"uri": "tos-cn-p-0015/33257fb02b7a4ea0ad745ff1df9abfb5_1688788223",
"img_url": "http://p9-sign.douyinpic.com/tos-cn-p-0015/33257fb02b7a4ea0ad745ff1df9abfb5_1688788223~tplv-noop.image?dy_q=1689935156&x-expires=1689938820&x-signature=xbb7wogKFsI1qlMYC5ERjsFWdEY%3D",
"img_x_size": 218,
"img_y_size": 136,
"img_x_len": 10,
"img_y_len": 7,
"duration": 64.04,
"interval": 1,
"fext": "jpg"
}
],
"bit_rate": [
{
"gear_name": "normal_1080_0",
"quality_type": 1,
"bit_rate": 2251713,
"play_addr": {
"uri": "v0200fg10000cikdoqjc77u487ia3t1g",
"url_list": [
"http://v26-web.douyinvod.com/f09adc21743f08884ebfd18bee2c7757/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/oMSoq9gqbAIgtxOKQn9keEBD4DACeAMhgNREnI/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=2198&bt=2198&cs=0&ds=4&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=NzhnOmg5ODc7O2U5ZTVmZ0BpandkOjc6ZnRnbDMzNGkzM0AtX2NeXmJjNl4xLTRfL141YSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"http://v3-web.douyinvod.com/a5e31e04504bc6463031a9d4036d643d/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/oMSoq9gqbAIgtxOKQn9keEBD4DACeAMhgNREnI/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=2198&bt=2198&cs=0&ds=4&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=NzhnOmg5ODc7O2U5ZTVmZ0BpandkOjc6ZnRnbDMzNGkzM0AtX2NeXmJjNl4xLTRfL141YSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"https://www.douyin.com/aweme/v1/play/?video_id=v0200fg10000cikdoqjc77u487ia3t1g&line=0&file_id=8dac22bb760b48a894f5e6aea7fdb504&sign=283df9ddd7ac9739e9bcfbd3f7c9ec59&is_play_url=1&source=PackSourceEnum_PUBLISH"
],
"width": 1728,
"height": 1080,
"url_key": "v0200fg10000cikdoqjc77u487ia3t1g_h264_1080p_2251713",
"data_size": 18025814,
"file_hash": "283df9ddd7ac9739e9bcfbd3f7c9ec59",
"file_cs": "c:0-53558-2651"
},
"is_h265": 0,
"is_bytevc1": 0,
"HDR_type": "",
"HDR_bit": "",
"FPS": 25,
"video_extra": "{\"PktOffsetMap\":\"\"}"
},
{
"gear_name": "normal_720_0",
"quality_type": 10,
"bit_rate": 1444459,
"play_addr": {
"uri": "v0200fg10000cikdoqjc77u487ia3t1g",
"url_list": [
"http://v26-web.douyinvod.com/3197a68facb88af40b8827b7c6d7e0ba/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/oMbkQh9yAInqSozDh3exqIBSADLeEgBIN9QCgA/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=1410&bt=1410&cs=0&ds=3&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=ZDNmOjg8OTdpZmU5Z2U1aUBpandkOjc6ZnRnbDMzNGkzM0A1Xy80Li81Ni4xLl8uNjJeYSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"http://v3-web.douyinvod.com/b234128cb6026e44fba840cd36cdae9d/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/oMbkQh9yAInqSozDh3exqIBSADLeEgBIN9QCgA/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=1410&bt=1410&cs=0&ds=3&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=ZDNmOjg8OTdpZmU5Z2U1aUBpandkOjc6ZnRnbDMzNGkzM0A1Xy80Li81Ni4xLl8uNjJeYSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"https://www.douyin.com/aweme/v1/play/?video_id=v0200fg10000cikdoqjc77u487ia3t1g&line=0&file_id=af529b1db61b4c1f94862915772cb08a&sign=26824f525594324205c189e7cc2ff87b&is_play_url=1&source=PackSourceEnum_PUBLISH"
],
"width": 1152,
"height": 720,
"url_key": "v0200fg10000cikdoqjc77u487ia3t1g_h264_720p_1444459",
"data_size": 11563436,
"file_hash": "26824f525594324205c189e7cc2ff87b",
"file_cs": "c:0-54056-7b3e"
},
"is_h265": 0,
"is_bytevc1": 0,
"HDR_type": "",
"HDR_bit": "",
"FPS": 25,
"video_extra": "{\"PktOffsetMap\":\"\"}"
},
{
"gear_name": "normal_540_0",
"quality_type": 20,
"bit_rate": 1305609,
"play_addr": {
"uri": "v0200fg10000cikdoqjc77u487ia3t1g",
"url_list": [
"http://v26-web.douyinvod.com/555d787c81cad3e971a841eba72d67a3/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/owqNBhgbSD9rgJekADQXE4IobxA6yBAC9nI9qe/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=1275&bt=1275&cs=0&ds=6&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=NmQ7OjU5NTU7aDc4NzlpZkBpandkOjc6ZnRnbDMzNGkzM0AyNTZjYy9fNV4xYi0wNDExYSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"http://v3-web.douyinvod.com/450a6e0bda57eceec7b94d7259802a86/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/owqNBhgbSD9rgJekADQXE4IobxA6yBAC9nI9qe/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=1275&bt=1275&cs=0&ds=6&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=0&rc=NmQ7OjU5NTU7aDc4NzlpZkBpandkOjc6ZnRnbDMzNGkzM0AyNTZjYy9fNV4xYi0wNDExYSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"https://www.douyin.com/aweme/v1/play/?video_id=v0200fg10000cikdoqjc77u487ia3t1g&line=0&file_id=4c4f763405e44ea882b226f2f7988a53&sign=f4a596a72da5dedfd950e81a5604f345&is_play_url=1&source=PackSourceEnum_PUBLISH"
],
"width": 922,
"height": 576,
"url_key": "v0200fg10000cikdoqjc77u487ia3t1g_h264_540p_1305609",
"data_size": 10451893,
"file_hash": "f4a596a72da5dedfd950e81a5604f345",
"file_cs": "c:0-54161-5a7b"
},
"is_h265": 0,
"is_bytevc1": 0,
"HDR_type": "",
"HDR_bit": "",
"FPS": 25,
"video_extra": "{\"PktOffsetMap\":\"\"}"
},
{
"gear_name": "lower_540_0",
"quality_type": 24,
"bit_rate": 872751,
"play_addr": {
"uri": "v0200fg10000cikdoqjc77u487ia3t1g",
"url_list": [
"http://v26-web.douyinvod.com/9b23489021428ab7e105003b4dd46e02/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/oQb9IAxgDIqBaGeo9UBWETS4gQeNAkANqhnCqD/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=852&bt=852&cs=0&ds=6&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=4&rc=NWg7MzlkZGVoOmU6Omk6ZkBpandkOjc6ZnRnbDMzNGkzM0BiL2EzYV5fNV4xLjNfNDBfYSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"http://v3-web.douyinvod.com/aadc7bde526062ea8a529a995d42bfd4/64ba6b84/video/tos/cn/tos-cn-ve-15c001-alinc2/oQb9IAxgDIqBaGeo9UBWETS4gQeNAkANqhnCqD/?a=6383&ch=10010&cr=0&dr=0&lr=all&cd=0%7C0%7C0%7C0&cv=1&br=852&bt=852&cs=0&ds=6&ft=bvTKJbQQqUWXf_40mo0OW_EklpPiXwUEiMVJEAmEA.CPD-I&mime_type=video_mp4&qs=4&rc=NWg7MzlkZGVoOmU6Omk6ZkBpandkOjc6ZnRnbDMzNGkzM0BiL2EzYV5fNV4xLjNfNDBfYSMuMGY1cjRnbGhgLS1kLS9zcw%3D%3D&l=202307211825566527AF3C1671F5138610&btag=e00028000&dy_q=1689935156",
"https://www.douyin.com/aweme/v1/play/?video_id=v0200fg10000cikdoqjc77u487ia3t1g&line=0&file_id=bc377fb7671b47ae8bbaaad660d82ee2&sign=31811725e19ff1df3baf348bb53358e8&is_play_url=1&source=PackSourceEnum_PUBLISH"
],
"width": 922,
"height": 576,
"url_key": "v0200fg10000cikdoqjc77u487ia3t1g_h264_540p_872751",
"data_size": 6986705,
"file_hash": "31811725e19ff1df3baf348bb53358e8",
"file_cs": "c:0-41551-d7b4"
},
"is_h265": 0,
"is_bytevc1": 0,
"HDR_type": "",
"HDR_bit": "",
"FPS": 25,
"video_extra": "{\"PktOffsetMap\":\"\"}"
}
],
"duration": 64043,
"horizontal_type": 1,
"is_source_HDR": 0,
"meta": "{\"bright_ratio_mean\":\"0.0382\",\"brightness_mean\":\"84.3949\",\"diff_overexposure_ratio\":\"0.0696\",\"loudness\":\"-9.1\",\"overexposure_ratio_mean\":\"0.0363\",\"peak\":\"1\",\"qprf\":\"1.000\",\"sr_score\":\"1.000\",\"std_brightness\":\"36.3712\",\"title_info\":\"{\\\"ratio_br_l\\\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], \\\"ratio_edge_l\\\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.05], \\\"progress_bar\\\": [0.0, 0.0, 0.0], \\\"bullet_zone\\\": 0.0, \\\"top_res_add\\\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], \\\"bottom_res_add\\\": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], \\\"version\\\": \\\"v1.0\\\"}\"}",
"bit_rate_audio": null,
"is_long_video": 1,
"video_model": ""
},
"share_url": "https://www.iesdouyin.com/share/video/7253290037918354691/?region=CN&mid=7253290130763467557&u_code=l1j9bkbd&did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&titleType=title&share_sign=Q.hVKKsEpG9WNP716jVs.najPoQyEKRTS3pfzao02lc-&share_version=0&ts=1689935156&from_ssr=1",
"user_digged": 0,
"statistics": {
"admire_count": 0,
"comment_count": 48,
"digg_count": 21705,
"collect_count": 330,
"play_count": 0,
"share_count": 63
},
"status": {
"listen_video_status": 0,
"is_delete": false,
"allow_share": true,
"is_prohibited": false,
"in_reviewing": false,
"part_see": 0,
"private_status": 0,
"review_result": {
"review_status": 0
}
},
"image_list": null,
"text_extra": [
{
"start": 20,
"end": 28,
"type": 1,
"hashtag_name": "电影冰雪狙击2",
"hashtag_id": "1770183396544590",
"is_commerce": false
},
{
"start": 30,
"end": 41,
"type": 1,
"hashtag_name": "冰雪狙击2老戏骨飙戏",
"hashtag_id": "1770821731138571",
"is_commerce": false
}
],
"is_top": 1,
"preview_video_status": 1,
"share_info": {
"share_url": "https://www.iesdouyin.com/share/video/7253290037918354691/?region=CN&mid=7253290130763467557&u_code=l1j9bkbd&did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&titleType=title&share_sign=Q.hVKKsEpG9WNP716jVs.najPoQyEKRTS3pfzao02lc-&share_version=0&ts=1689935156&from_ssr=1",
"share_link_desc": "4.69 qeb:/ 飞行员跳伞进山寨,哪知道白捡了个寨主当 # 电影冰雪狙击2 # 冰雪狙击2老戏骨飙戏 %s 复制此链接打开Dou音搜索直接观看视频"
},
"super_like_status": 0,
"video_labels": [],
"collection_corner_mark": 0,
"duration": 64043,
"aweme_type": 0,
"authentication_token": "MS4wLjAAAAAAiH5xanOMcn_wrYeq6V8Wv0lbjnlML3eNxCcqlfPqgSMgoQnYpV-9fBKIlgnYVMauD4yVxbfRfwAaRT1GCMu_6ptC-JSgsn-8Gy_9NZXGatOT8MhZMoEvMRlJY--5OmqgCkLZ2JzFrPrg0C9JrqH1tB_c2SuebwEejpOYtBASKQ81WbAuZwZ1SKwdkJGCK_u4AVB5HpmzOgtNwLFkWurMOg",
"yumme_recreason": null,
"image_infos": null,
"seo_info": {},
"is_share_post": false,
"is_life_item": false,
"position": null,
"uniqid_position": null,
"comment_list": null,
"author_user_id": 96719499963,
"media_type": 4,
"geofencing": [],
"ref_voice_modify_id_list": null,
"tts_id_list": null,
"region": "",
"video_text": [],
"dislike_dimension_list": null,
"collect_stat": 0,
"label_top_text": null,
"promotions": [],
"group_id": "7253008209626156349",
"prevent_download": false,
"nickname_position": null,
"challenge_position": null,
"user_recommend_status": 0,
"is_image_beat": false,
"chapter_list": null,
"long_video": null,
"author_mask_tag": 0,
"packed_clips": null,
"should_open_ad_report": false,
"comment_words_recommend": {
"zero_comment": null
},
"interaction_stickers": null,
"preview_title": "飞行员跳伞进山寨,哪知道白捡了个寨主当 #电影冰雪狙击2 #冰雪狙击2老戏骨飙戏",
"origin_comment_ids": null,
"commerce_config_data": null,
"distribute_circle": {
"distribute_type": 0,
"campus_block_interaction": false,
"is_campus": false
},
"standard_bar_info_list": null,
"aweme_control": {
"can_forward": true,
"can_share": true,
"can_comment": true,
"can_show_comment": true
},
"dislike_dimension_list_v2": null,
"image_crop_ctrl": 0,
"item_warn_notification": {
"type": 0,
"show": false,
"content": ""
},
"image_comment": {},
"anchors": null,
"hybrid_label": null,
"geofencing_regions": null,
"video_game_data_channel_config": {},
"component_info_v2": "{\"desc_lines_limit\":0,\"hide_marquee\":false}",
"is_story": 0,
"report_action": false,
"guide_scene_info": {
"guide_scene_type": 0,
"feed_origin_gid_info_str": "",
"diamond_expose_info_str": ""
},
"danmaku_control": {
"enable_danmaku": true,
"post_privilege_level": 0,
"is_post_denied": false,
"post_denied_reason": "",
"skip_danmaku": true,
"danmaku_cnt": 0
},
"slides_music_beats": null,
"cover_labels": null,
"book_bar": {},
"origin_text_extra": [],
"guide_btn_type": 0,
"voice_modify_id_list": null,
"common_bar_info": "[]",
"images": null,
"relation_labels": null,
"horizontal_type": 1,
"ref_tts_id_list": null,
"impression_data": {
"group_id_list_a": [],
"group_id_list_b": [],
"similar_id_list_a": [
7253007583462608140,
7253008209626156349,
7253265685516700980
],
"similar_id_list_b": [
7253007583462608140,
7253008209626156349,
7253265685516700980
],
"group_id_list_c": [
7253108840202308879,
7253114311474777347,
7253109870549945658,
7253287939206024451
]
},
"disable_relation_bar": 0,
"photo_search_entrance": {
"ecom_type": 0
},
"social_tag_list": null,
"show_follow_button": {},
"duet_aggregate_in_music_tab": false,
"is_duet_sing": false,
"search_impr": {
"entity_id": "7253290037918354691",
"entity_type": "GENERAL"
},
"comment_permission_info": {
"comment_permission_status": 0,
"can_comment": true,
"item_detail_entry": false,
"press_entry": false,
"toast_guide": false
},
"original_images": null,
"series_paid_info": {
"series_paid_status": 0,
"item_price": 0
},
"img_bitrate": null,
"comment_gid": 7253290037918354691,
"digg_lottie": {
"lottie_id": "",
"can_bomb": 0
},
"image_album_music_info": {
"begin_time": -1,
"end_time": -1,
"volume": -1
},
"video_tag": [
{
"tag_id": 2019,
"tag_name": "影视",
"level": 1
},
{
"tag_id": 2019001,
"tag_name": "影视剪辑",
"level": 2
},
{
"tag_id": 2019001001,
"tag_name": "电视剧剪辑",
"level": 3
}
],
"is_collects_selected": 0
}
],
"time_list": null,
"log_pb": {
"impr_id": "202307211825566527AF3C1671F5138610"
},
"request_item_cursor": 0,
"post_serial": 2,
"replace_series_cover": 1
}

366
API/user_profile_info.json Normal file
View File

@@ -0,0 +1,366 @@
{
"extra": {
"fatal_item_ids": [],
"logid": "20230721155923E11B5C46A431FA038B62",
"now": 1689926363000
},
"log_pb": {
"impr_id": "20230721155923E11B5C46A431FA038B62"
},
"status_code": 0,
"status_msg": null,
"user": {
"apple_account": 0,
"avatar_168x168": {
"height": 720,
"uri": "aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6",
"url_list": [
"https://p3-pc.douyinpic.com/img/aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6~c5_168x168.jpeg?from=2956013662"
],
"width": 720
},
"avatar_300x300": {
"height": 720,
"uri": "aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6",
"url_list": [
"https://p3-pc.douyinpic.com/img/aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6~c5_300x300.jpeg?from=2956013662"
],
"width": 720
},
"avatar_larger": {
"height": 720,
"uri": "aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6.jpeg?from=2956013662"
],
"width": 720
},
"avatar_medium": {
"height": 720,
"uri": "aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6.jpeg?from=2956013662"
],
"width": 720
},
"avatar_thumb": {
"height": 720,
"uri": "aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6",
"url_list": [
"https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-i-0813_d1dc48cd00f54143999a07a9ef5b83d6.jpeg?from=2956013662"
],
"width": 720
},
"aweme_count": 509,
"aweme_count_correction_threshold": -1,
"birthday_hide_level": 0,
"can_set_item_cover": false,
"can_show_group_card": 1,
"card_entries": [
{
"card_data": "{\"is_order_card\":false,\"has_new\":false,\"is_store\":false,\"shop_id\":\"\",\"product_count\":45,\"store_type\":\"window\",\"icon_is_repeat\":false,\"icon_type\":\"png\",\"is_promotion_icon\":false,\"subtitle_resource_list\":\"\"}",
"event_params": "",
"goto_url": "sslocal://goods/shop?uid=101881718376&sec_uid=MS4wLjABAAAA85mPkf3FPVNmf_XTn4xpYrqB7kwPf7N7haPEJrRW8CQ",
"icon_dark": {
"url_list": [
"https://lf3-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_light-2x.png",
"https://lf9-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_light-2x.png",
"https://lf26-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_light-2x.png",
"https://lf3-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_light-3x.png",
"https://lf9-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_light-3x.png",
"https://lf26-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_light-3x.png"
]
},
"icon_light": {
"url_list": [
"https://lf3-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_dark-2x.png",
"https://lf9-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_dark-2x.png",
"https://lf26-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_dark-2x.png",
"https://lf3-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_dark-3x.png",
"https://lf9-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_dark-3x.png",
"https://lf26-static.bytednsdoc.com/obj/eden-cn/fylmmlqeh7nupanuhog/ic_dark-3x.png"
]
},
"sub_title": "45件好物",
"title": "进入橱窗",
"type": 1
},
{
"goto_url": "aweme://im/FansGroup/GuestState",
"icon_dark": {
"uri": "https://p3.douyinpic.com/obj/im-resource/old_fans_group_manage_dark.png",
"url_list": [
"https://p3.douyinpic.com/obj/im-resource/old_fans_group_manage_dark.png",
"https://p6.douyinpic.com/obj/im-resource/old_fans_group_manage_dark.png",
"https://p9.douyinpic.com/obj/im-resource/old_fans_group_manage_dark.png"
]
},
"icon_light": {
"uri": "https://p3.douyinpic.com/obj/im-resource/old_fans_group_manage_light.png",
"url_list": [
"https://p3.douyinpic.com/obj/im-resource/old_fans_group_manage_light.png",
"https://p6.douyinpic.com/obj/im-resource/old_fans_group_manage_light.png",
"https://p9.douyinpic.com/obj/im-resource/old_fans_group_manage_light.png"
]
},
"sub_title": "5个群聊",
"title": "粉丝群",
"type": 2
},
{
"card_data": "{\"has_yellow_point\":false,\"announcement_release_time\":0,\"preview_video_release_time\":0,\"precipitation_video_release_time\":0,\"style\":0,\"appointment_id\":0,\"typ\":0,\"subscribe_cnt\":0,\"subscribe_status\":0,\"top_title\":\"\",\"top_subtitle\":\"\",\"cycle\":0}",
"goto_url": "sslocal://webcast_lynxview?url=https%3A%2F%2Flf-webcast-gr-sourcecdn.bytegecko.com%2Fobj%2Fbyte-gurd-source-gr%2Fwebcast%2Fmono%2Flynx%2Fcommunity_live_dynamic_douyin%2Ftemplate%2Fpages%2Flive_dynamic%2Ftemplate.js%3Fanchor_id%3D101881718376%26sec_anchor_id%3DMS4wLjABAAAA85mPkf3FPVNmf_XTn4xpYrqB7kwPf7N7haPEJrRW8CQ&web_bg_color=%23161823&status_bar_color=white&type=fullscreen&hide_nav_bar=1&trans_status_bar=1&enable_preload=main&fallback_url=sslocal%3A%2F%2Fwebcast_webview%3Furl%3Dhttps%253A%252F%252Flf-webcast-gr-sourcecdn.bytegecko.com%252Fobj%252Fbyte-gurd-source-gr%252Fwebcast%252Fmono%252Flynx%252Fcommunity_live_dynamic_douyin%252Fweb%252Ftemplate%252Fpages%252Flive_dynamic%252Findex.html%253Fanchor_id%253D101881718376%2526sec_anchor_id%253DMS4wLjABAAAA85mPkf3FPVNmf_XTn4xpYrqB7kwPf7N7haPEJrRW8CQ%26web_bg_color%3D%2523161823%26status_bar_color%3Dwhite%26type%3Dfullscreen%26hide_nav_bar%3D1%26trans_status_bar%3D1",
"icon_dark": {
"uri": "obj/eden-cn/91eh7uhfnult/all_cards_old_version/type6_live_dynamic_dark.png",
"url_list": [
"https://p6-dy-ipv6.byteimg.com/obj/eden-cn/91eh7uhfnult/all_cards_old_version/type6_live_dynamic_dark.png",
"https://p3-dy-ipv6.byteimg.com/obj/eden-cn/91eh7uhfnult/all_cards_old_version/type6_live_dynamic_dark.png",
"https://p9-dy.byteimg.com/obj/eden-cn/91eh7uhfnult/all_cards_old_version/type6_live_dynamic_dark.png"
]
},
"icon_light": {
"uri": "obj/eden-cn/91eh7uhfnult/all_cards_old_version/type6_live_dynamic_light.png",
"url_list": [
"https://p6-dy-ipv6.byteimg.com/obj/eden-cn/91eh7uhfnult/all_cards_old_version/type6_live_dynamic_light.png",
"https://p3-dy-ipv6.byteimg.com/obj/eden-cn/91eh7uhfnult/all_cards_old_version/type6_live_dynamic_light.png",
"https://p9-dy.byteimg.com/obj/eden-cn/91eh7uhfnult/all_cards_old_version/type6_live_dynamic_light.png"
]
},
"sub_title": "查看历史记录",
"title": "直播动态",
"type": 6
}
],
"city": "",
"close_friend_type": 0,
"commerce_info": {
"challenge_list": [],
"head_image_list": null,
"offline_info_list": [
{
"conf_type": 12,
"content": "{\"content\":\"周一至周日 12:00-19:00\",\"title\":\"营业中\"}",
"link_type": "business_hours",
"offline_info_type": 10,
"text": "营业时间"
}
],
"smart_phone_list": null,
"task_list": null
},
"commerce_permissions": {
"enterprise": 1
},
"commerce_user_info": {
"ad_revenue_rits": null,
"has_ads_entry": true,
"show_star_atlas_cooperation": false,
"star_atlas": 1
},
"commerce_user_level": 0,
"country": "",
"cover_and_head_image_info": {
"cover_list": null,
"profile_cover_list": [
{
"cover_url": {
"uri": "tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh",
"url_list": [
"https://p9-pc-sign.douyinpic.com/obj/tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh?x-expires=1690095600&x-signature=NAJ%2FjJEHPlY7HxKa0kE5fk7Cz1Y%3D&from=2480802190",
"https://p6-pc-sign.douyinpic.com/obj/tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh?x-expires=1690095600&x-signature=DiKX1ZdzN73ZC4yOaHDeGVVobwg%3D&from=2480802190",
"https://p3-pc-sign.douyinpic.com/obj/tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh?x-expires=1690095600&x-signature=L6vVRkoeX3t05kYybFKuh8J67mY%3D&from=2480802190"
]
},
"dark_cover_color": "#FF1c2320",
"light_cover_color": "#FF1c2320"
}
]
},
"cover_colour": "#03373EE5",
"cover_url": [
{
"uri": "tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh",
"url_list": [
"https://p9-pc-sign.douyinpic.com/obj/tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh?x-expires=1690095600&x-signature=NAJ%2FjJEHPlY7HxKa0kE5fk7Cz1Y%3D&from=2480802190",
"https://p6-pc-sign.douyinpic.com/obj/tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh?x-expires=1690095600&x-signature=DiKX1ZdzN73ZC4yOaHDeGVVobwg%3D&from=2480802190",
"https://p3-pc-sign.douyinpic.com/obj/tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh?x-expires=1690095600&x-signature=L6vVRkoeX3t05kYybFKuh8J67mY%3D&from=2480802190"
]
},
{
"uri": "c8510002be9a3a61aad2",
"url_list": [
"https://p3-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1690095600&x-signature=bi35K0GxzoTCJXQTxuuHrK5jtbU%3D&from=2480802190",
"https://p9-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1690095600&x-signature=KVQFnvZbyx4npP5TVeBAyJV81yQ%3D&from=2480802190",
"https://p6-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1690095600&x-signature=oSqLoYWpVlzBQHgYoui1Gxn79Ng%3D&from=2480802190"
]
}
],
"custom_verify": "",
"district": "",
"dongtai_count": 0,
"dynamic_cover": {},
"enable_wish": false,
"enterprise_user_info": "{\"commerce_info\":{\"offline_info_list\":[{\"offline_info_type\":10,\"text\":\"营业时间\",\"link_type\":\"business_hours\",\"content\":\"{\\\"content\\\":\\\"周一至周日 12:00-19:00\\\",\\\"title\\\":\\\"营业中\\\"}\",\"conf_type\":12}],\"challenge_list\":[],\"task_list\":null,\"head_image_list\":null,\"smart_phone_list\":null},\"homepage_bottom_toast\":null,\"tab_settings\":{\"enterprise_tab\":{\"title\":\"商家\",\"tab_type\":0,\"show_tab_settings\":true,\"tab_link\":\"aweme://lynxview/?enter_from=profile&channel=mp_lynx_tab&bundle=template.js&hide_nav_bar=1&dynamic=1&surl=https%3A%2F%2Flf-dy-sourcecdn-tos.bytegecko.com%2Fobj%2Fbyte-gurd-source%2Faweme%2Fplatform%2Flynx%2Fmp_lynx_tab%2Ftemplate.js&is_editor=0&is_checking=0&loading_bgcolor=00000000&needReloadWithTheme=1&use_bdx=1&trans_status_bar=1&use_gecko_first=1&container_bgcolor=00000000&page_enabled=1&page_priority=1&template_id=0&record_id=0&is_owner=0&sec_to_user_id=MS4wLjABAAAA85mPkf3FPVNmf_XTn4xpYrqB7kwPf7N7haPEJrRW8CQ&to_user_id=101881718376&business_type=0&offline_info_count=1&show_loading=1\",\"show_tab_style\":0}},\"profile_tab_type\":5,\"permissions\":[{\"Id\":3,\"Key\":\"ItemShop\",\"Name\":\"视频电商\",\"AppId\":1128,\"Status\":1,\"Extra\":null,\"Customization\":null,\"Parent\":0,\"Actions\":null},{\"Id\":4,\"Key\":\"LiveShop\",\"Name\":\"直播电商\",\"AppId\":1128,\"Status\":1,\"Extra\":null,\"Customization\":null,\"Parent\":0,\"Actions\":null},{\"Id\":5,\"Key\":\"UserShop\",\"Name\":\"个人橱窗\",\"AppId\":1128,\"Status\":1,\"Extra\":null,\"Customization\":null,\"Parent\":1,\"Actions\":null},{\"Id\":54,\"Key\":\"EIMCustomizeMenus\",\"Name\":\"自定义私信菜单\",\"AppId\":1575,\"Status\":1,\"Extra\":null,\"Customization\":null,\"Parent\":12,\"Actions\":null},{\"Id\":76,\"Key\":\"EHomepageTabManagement\",\"Name\":\"商家页面\",\"AppId\":1575,\"Status\":1,\"Extra\":null,\"Customization\":null,\"Parent\":17,\"Actions\":null},{\"Id\":81,\"Key\":\"Enterprise\",\"Name\":\"企业权限标识\",\"AppId\":1128,\"Status\":1,\"Extra\":null,\"Customization\":null,\"Parent\":0,\"Actions\":null},{\"Id\":120,\"Key\":\"IMMonitor\",\"Name\":\"私信监管\",\"AppId\":1128,\"Status\":1,\"Extra\":null,\"Customization\":null,\"Parent\":0,\"Actions\":null},{\"Id\":443,\"Key\":\"EIMCommand\",\"Name\":\"私信指令消息\",\"AppId\":1128,\"Status\":1,\"Extra\":null,\"Customization\":null,\"Parent\":12,\"Actions\":null}],\"e_role_key\":\"EAccountMPlus\",\"tab_ceiling_toast\":null,\"limiters\":null,\"attic_info\":null,\"profile_edit_button\":null,\"elite_center\":{\"recommend_target\":\"GeneralESC\",\"candidates\":[{\"key\":\"GeneralESC\",\"biz\":1,\"title\":\"企业服务中心\",\"schema\":\"aweme://webview?url=https%3A%2F%2Fapi.amemv.com%2Finsights%2Felite%2Fmp_business_elite%2Fpages%2Fenterprise-service-center%2Findex.html%3Fhide_nav_bar%3D1%26allow_lmb%3D1%26container_bgcolor%3Dffffff%26status_font_dark%3D1%26enter_from%3DhomeSidebar&awe_falcon=sh\"}]},\"enterprise_card_visibility\":true,\"blue_label_edit_jump_url\":\"aweme://webview/?url=https%3A%2F%2Fapi.amemv.com%2Finsights%2Flite%2FcontactSetting%3Fhide_nav_bar%3D1%26title%3D%25E8%2581%2594%25E7%25B3%25BB%25E6%2596%25B9%25E5%25BC%258F%26enter_from%3Dcustomized_tab&hide_nav_bar=1&title=%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F&rn_schema=aweme%3A%2F%2Freactnative%2F%3Fchannel_name%3Drn_patch%26bundle_name%3Dbusiness%26module_name%3Dpage_e_lite_contactSetting%26force_h5%3D1%26hide_nav_bar%3D1%26bundle_url%3D%26title%3D%25E8%2581%2594%25E7%25B3%25BB%25E6%2596%25B9%25E5%25BC%258F%26enter_from%3Dcustomized_tab\"}",
"enterprise_verify_reason": "",
"favorite_permission": 0,
"favoriting_count": 0,
"follow_status": 1,
"follower_count": 298468,
"follower_request_status": 0,
"follower_status": 0,
"following_count": 45,
"forward_count": 0,
"gender": 1,
"general_permission": {
"following_follower_list_toast": 1
},
"has_e_account_role": true,
"has_subscription": true,
"im_primary_role_id": 1001,
"im_role_ids": [
1001,
1003,
17,
8,
19,
9,
1100
],
"image_send_exempt": false,
"ins_id": "",
"ip_location": "IP属地广东",
"is_activity_user": false,
"is_ban": false,
"is_block": false,
"is_blocked": false,
"is_effect_artist": false,
"is_gov_media_vip": false,
"is_mix_user": true,
"is_not_show": false,
"is_series_user": false,
"is_sharing_profile_user": 0,
"is_star": false,
"iso_country_code": "",
"life_story_block": {
"life_story_block": false
},
"live_commerce": true,
"live_status": 0,
"max_follower_count": 299824,
"message_chat_entry": true,
"mix_count": 5,
"mplatform_followers_count": 304548,
"new_friend_type": 0,
"nickname": "老司机摄影器材",
"no_recommend_user": true,
"original_musician": {
"digg_count": 0,
"music_count": 0,
"music_used_count": 0
},
"pigeon_daren_status": "",
"pigeon_daren_warn_tag": "",
"profile_tab_type": 5,
"province": "",
"public_collects_count": 0,
"publish_landing_tab": 3,
"r_fans_group_info": {},
"recommend_reason_relation": "",
"recommend_user_reason_source": 0,
"risk_notice_text": "",
"room_id": 0,
"school_name": "",
"sec_uid": "MS4wLjABAAAA85mPkf3FPVNmf_XTn4xpYrqB7kwPf7N7haPEJrRW8CQ",
"secret": 0,
"series_count": 0,
"share_info": {
"bool_persist": 1,
"share_desc": "长按复制此条消息打开抖音搜索查看TA的更多作品。",
"share_image_url": {
"uri": "tos-cn-p-0015/cf422487c0a841f2aecbfa8baacc154c_1689845400",
"url_list": [
"https://p6-pc-sign.douyinpic.com/obj/tos-cn-p-0015/cf422487c0a841f2aecbfa8baacc154c_1689845400?x-expires=1690095600&x-signature=LtFiYu1jClndNFonNKdSblz0ewc%3D&from=2480802190",
"https://p3-pc-sign.douyinpic.com/obj/tos-cn-p-0015/cf422487c0a841f2aecbfa8baacc154c_1689845400?x-expires=1690095600&x-signature=Rh9XdYMU6cyp4me2FRcoofjHOCs%3D&from=2480802190",
"https://p9-pc-sign.douyinpic.com/obj/tos-cn-p-0015/cf422487c0a841f2aecbfa8baacc154c_1689845400?x-expires=1690095600&x-signature=gkR5JLKNVrGNn3FkLpdt%2FSfsLRY%3D&from=2480802190"
]
},
"share_qrcode_url": {
"uri": "9ba90004c7f4cd555885",
"url_list": [
"https://p11.douyinpic.com/obj/9ba90004c7f4cd555885",
"https://p3.douyinpic.com/obj/9ba90004c7f4cd555885",
"https://p26.douyinpic.com/obj/9ba90004c7f4cd555885"
]
},
"share_title": "快来加入抖音,让你发现最有趣的我!",
"share_url": "www.iesdouyin.com/share/user/MS4wLjABAAAA85mPkf3FPVNmf_XTn4xpYrqB7kwPf7N7haPEJrRW8CQ?sec_uid=MS4wLjABAAAA85mPkf3FPVNmf_XTn4xpYrqB7kwPf7N7haPEJrRW8CQ&from_ssr=1&u_code=l1j9bkbd&did=MS4wLjABAAAAtqpCx0hpOERbdSzQdjRZw-wFPxaqdbAzsKDmbJMUI3KWlMGQHC-n6dXAqa-dM2EP&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1",
"share_weibo_desc": "长按复制此条消息打开抖音搜索查看TA的更多作品。"
},
"short_id": "0",
"show_favorite_list": false,
"show_subscription": true,
"signature": "📷【老司机摄影器材】老司机,不翻车\n📷 深圳二手相机、镜头\n📷 danfanlaosiji03\n📷 二手相机销售、回收、置换、估价\n📷 保修两年\n\n💰支持实体店自提平台下单",
"signature_display_lines": 0,
"signature_language": "zh",
"special_follow_status": 0,
"sync_to_toutiao": 0,
"tab_settings": {
"enterprise_tab": {
"show_tab_settings": true,
"show_tab_style": 0,
"tab_link": "aweme://lynxview/?enter_from=profile&channel=mp_lynx_tab&bundle=template.js&hide_nav_bar=1&dynamic=1&surl=https%3A%2F%2Flf-dy-sourcecdn-tos.bytegecko.com%2Fobj%2Fbyte-gurd-source%2Faweme%2Fplatform%2Flynx%2Fmp_lynx_tab%2Ftemplate.js&is_editor=0&is_checking=0&loading_bgcolor=00000000&needReloadWithTheme=1&use_bdx=1&trans_status_bar=1&use_gecko_first=1&container_bgcolor=00000000&page_enabled=1&page_priority=1&template_id=0&record_id=0&is_owner=0&sec_to_user_id=MS4wLjABAAAA85mPkf3FPVNmf_XTn4xpYrqB7kwPf7N7haPEJrRW8CQ&to_user_id=101881718376&business_type=0&offline_info_count=1&show_loading=1",
"tab_type": 0,
"title": "商家"
},
"private_tab": {
"private_tab_style": 1,
"show_private_tab": false
}
},
"total_favorited": 2305265,
"total_favorited_correction_threshold": -1,
"twitter_id": "",
"twitter_name": "",
"uid": "101881718376",
"unique_id": "danfanlaosiji",
"urge_detail": {
"user_urged": 0
},
"user_age": -1,
"user_not_see": 0,
"user_not_show": 1,
"verification_type": 0,
"video_cover": {},
"video_icon": {
"height": 720,
"uri": "",
"url_list": [],
"width": 720
},
"watch_status": false,
"white_cover_url": [
{
"uri": "tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh",
"url_list": [
"https://p9-pc-sign.douyinpic.com/obj/tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh?x-expires=1690095600&x-signature=NAJ%2FjJEHPlY7HxKa0kE5fk7Cz1Y%3D&from=2480802190",
"https://p6-pc-sign.douyinpic.com/obj/tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh?x-expires=1690095600&x-signature=DiKX1ZdzN73ZC4yOaHDeGVVobwg%3D&from=2480802190",
"https://p3-pc-sign.douyinpic.com/obj/tos-cn-i-0813/oYCAEmz7fAE3VIuEAeICACYAWFhEICANgyxpXh?x-expires=1690095600&x-signature=L6vVRkoeX3t05kYybFKuh8J67mY%3D&from=2480802190"
]
},
{
"uri": "318f1000413827e122102",
"url_list": [
"https://p9-pc-sign.douyinpic.com/obj/318f1000413827e122102?x-expires=1690095600&x-signature=WtW5ogqxmw4rkpIFT2RZuMnLG18%3D&from=2480802190",
"https://p3-pc-sign.douyinpic.com/obj/318f1000413827e122102?x-expires=1690095600&x-signature=2nskyBWTs94oR7UUnPMq4GVSiIc%3D&from=2480802190",
"https://p6-pc-sign.douyinpic.com/obj/318f1000413827e122102?x-expires=1690095600&x-signature=WTu2Oj8KsYTPAjDh2GqPTryUF2Y%3D&from=2480802190"
]
}
],
"with_commerce_enterprise_tab_entry": false,
"with_commerce_entry": true,
"with_fusion_shop_entry": true,
"with_new_goods": false,
"youtube_channel_id": "",
"youtube_channel_title": ""
}
}

BIN
Banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

49
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,49 @@
# 贡献者守则
本项目欢迎所有人的贡献。为了保证这个社区的友好和专业的环境,我们制定了以下守则,所有的贡献者和维护者都应当遵守。
## 我们的承诺
为了促进一个开放和欢迎的环境,我们承诺让参与这个项目的每个人无论年龄、体型、身体健康状况、种族、性别认同与表达、经验水平、教育程度、社会经济地位、国籍、个人外貌、种族、宗教信仰或者性取向等,都不会感到被歧视。
## 我们的标准
以下行为可以帮助我们构建一个友好的环境:
* 使用友好和包容的语言
* 尊重不同的观点和经验
* 接纳建设性的批评
* 关注对社区最有利的事情
* 对其他社区成员表现出同情和善意
以下行为是不被接受的:
* 使用侮辱性/贬低性的语言或图像,以及人身攻击
* 喷子行为或恶意批评
* 公开或私下骚扰他人
* 发布他人的私人信息,例如实际地址或电子邮件,未经其明确许可
* 其他可能被认为不合适或不专业的行为
## 我们的责任
项目维护者有责任解释行为标准,并且应当采取适当和公正的纠正措施回应任何违反这些标准的行为。
项目维护者有权利和责任删除、修改或拒绝不符合本守则的评论comments、提交commits、代码、wiki 编辑、问题issues和其他贡献他们也可以因为以下行为封禁一个人的参与包括但不限于
* 有骚扰行为
* 发表侮辱性或贬损性的评论
* 人身攻击
* 发布他人的私人信息
* 其他不道德的行为
## 适用范围
此行为守则适用于项目空间和公共空间,当个体代表项目或其社区时也同样适用。例如,使用官方电子邮件地址、在官方的社交媒体账号发表的,或在公开的在线或离线事件中担任的代表角色等。项目维护者也可能进一步定义和澄清代表项目行为的规范。
## 执行
无论是恶劣的行为公开或私下发生,项目维护者都有权进行调查并采取适当的行动,这可能包括警告、暂时禁止或永久禁止对项目的贡献等。
## 版本历史
此行为准则版本基于 [Contributor Covenant](https://www.contributor-covenant.org) 版本 2.1。欢迎在此基础上进行修改和适应。

5
Dockerfile Normal file
View File

@@ -0,0 +1,5 @@
FROM python:3.7-slim-bullseye
WORKDIR /app
COPY . .
RUN pip3 install -r requirements.txt
CMD ["python3", "TikTokMulti.py"]

346
GUI/Main.ui Normal file
View File

@@ -0,0 +1,346 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1111</width>
<height>711</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<widget class="QLabel" name="Label_Left">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>230</width>
<height>600</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background-color: #060716;
border-bottom-left-radius: 25px;
border-top-left-radius: 25px;
font: 10pt &quot;微软雅黑&quot;;
color: #FFFFFF;</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QLabel" name="Label_Right">
<property name="geometry">
<rect>
<x>230</x>
<y>0</y>
<width>851</width>
<height>600</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);
border-top-right-radius: 25px;
border-bottom-right-radius: 25px;</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QLabel" name="Label_Logo">
<property name="geometry">
<rect>
<x>30</x>
<y>50</y>
<width>161</width>
<height>41</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background: url(:/img/logo-horizontal.svg) no-repeat;</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QLabel" name="Label_Version">
<property name="geometry">
<rect>
<x>180</x>
<y>90</y>
<width>54</width>
<height>12</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(255, 255, 255);
font: 9pt &quot;華康布丁體&quot;;</string>
</property>
<property name="text">
<string>v2.1.1</string>
</property>
</widget>
<widget class="QPushButton" name="Button_Close">
<property name="geometry">
<rect>
<x>1030</x>
<y>20</y>
<width>21</width>
<height>21</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">border-radius: 10px;
background-color: rgb(255, 81, 53);</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QPushButton" name="Button_Max">
<property name="geometry">
<rect>
<x>1000</x>
<y>20</y>
<width>21</width>
<height>21</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">border-radius: 10px;
background-color: #FFC32D;</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QPushButton" name="Button_Min">
<property name="geometry">
<rect>
<x>970</x>
<y>20</y>
<width>21</width>
<height>21</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">border-radius: 10px;
background-color: #37C847;</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QPlainTextEdit" name="plainTextEdit">
<property name="geometry">
<rect>
<x>260</x>
<y>90</y>
<width>651</width>
<height>41</height>
</rect>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color: #292B35;
border-radius: 10px;
font: 12pt &quot;華康布丁體&quot;;
color: rgb(255, 255, 255);
qproperty-alignment:AlignHCenter;</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustIgnored</enum>
</property>
<property name="lineWrapMode">
<enum>QPlainTextEdit::WidgetWidth</enum>
</property>
<property name="plainText">
<string/>
</property>
<property name="backgroundVisible">
<bool>false</bool>
</property>
<property name="centerOnScroll">
<bool>false</bool>
</property>
</widget>
<widget class="QPushButton" name="Button_Go">
<property name="geometry">
<rect>
<x>930</x>
<y>90</y>
<width>121</width>
<height>41</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">#Button_Go {
border-radius: 10px;
font: 19pt &quot;華康布丁體&quot;;
color: rgb(0, 0, 0);
background-color: #B9BAC7;
}
#Button_Go:hover {
color:#F72C51;
}
#Button_Go:pressed, QPushButton:checked {
background-color: #9d9d9d;
}
</string>
</property>
<property name="text">
<string>咻咻</string>
</property>
</widget>
<widget class="QCheckBox" name="Check_All">
<property name="geometry">
<rect>
<x>260</x>
<y>140</y>
<width>71</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>全部下载</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>50</x>
<y>390</y>
<width>131</width>
<height>61</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">border-radius: 25px;
font: 16pt &quot;華康布丁體&quot;;
color: rgb(255, 255, 255);
background-color: rgb(22, 23, 34);</string>
</property>
<property name="text">
<string>设置</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_2">
<property name="geometry">
<rect>
<x>50</x>
<y>490</y>
<width>131</width>
<height>61</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">border-radius: 25px;
font: 16pt &quot;華康布丁體&quot;;
color: rgb(255, 255, 255);
background-color: rgb(22, 23, 34);</string>
</property>
<property name="text">
<string>关于</string>
</property>
</widget>
<widget class="QCheckBox" name="Check_Cover">
<property name="geometry">
<rect>
<x>350</x>
<y>140</y>
<width>101</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>全部封面下载</string>
</property>
</widget>
<widget class="QCheckBox" name="Check_Music">
<property name="geometry">
<rect>
<x>460</x>
<y>140</y>
<width>101</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>全部配乐下载</string>
</property>
</widget>
<widget class="QLabel" name="Label_Background">
<property name="geometry">
<rect>
<x>230</x>
<y>0</y>
<width>851</width>
<height>60</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(199, 199, 199);
border-top-right-radius: 25px;</string>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QTextBrowser" name="textBrowser">
<property name="geometry">
<rect>
<x>260</x>
<y>170</y>
<width>791</width>
<height>401</height>
</rect>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="lineWrapMode">
<enum>QTextEdit::NoWrap</enum>
</property>
</widget>
<zorder>Label_Right</zorder>
<zorder>Label_Background</zorder>
<zorder>Label_Left</zorder>
<zorder>Label_Logo</zorder>
<zorder>Label_Version</zorder>
<zorder>Button_Close</zorder>
<zorder>Button_Max</zorder>
<zorder>Button_Min</zorder>
<zorder>plainTextEdit</zorder>
<zorder>Button_Go</zorder>
<zorder>Check_All</zorder>
<zorder>pushButton</zorder>
<zorder>pushButton_2</zorder>
<zorder>Check_Cover</zorder>
<zorder>Check_Music</zorder>
<zorder>textBrowser</zorder>
</widget>
<resources>
<include location="Resource.qrc"/>
</resources>
<connections/>
</ui>

9
GUI/README-EN.md Normal file
View File

@@ -0,0 +1,9 @@
# TKMGUI V2.1.1
**Currently, only for the development of the preview version**
![mit](https://img.shields.io/badge/license-MIT-blue)![python: v3.8.5](https://img.shields.io/badge/python-v3.8.5-green)![pyqt](https://img.shields.io/badge/Qt5-v5.14.3-red)<a target="_blank" href="http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=PFZTVFJPWU5aEU9ZWVh8WlNEUV1VUBJfU1E" style="text-decoration:none;"><img src="http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_11.png"/></a>
[English](README-EN.md) [简体中文](README.md)
![preview](https://tvax1.sinaimg.cn/large/006908GAly1gytdof69rrj30p00godhe.jpg)

9
GUI/README.md Normal file
View File

@@ -0,0 +1,9 @@
# TKMGUI V2.1.1
**目前仅为开发预览版**
![mit](https://img.shields.io/badge/license-MIT-blue)![python: v3.8.5](https://img.shields.io/badge/python-v3.8.5-green)![pyqt](https://img.shields.io/badge/Qt5-v5.14.3-red)<a target="_blank" href="http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=PFZTVFJPWU5aEU9ZWVh8WlNEUV1VUBJfU1E" style="text-decoration:none;"><img src="http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_11.png"/></a>
[English](README-EN.md) [简体中文](README.md)
![preview](https://tvax1.sinaimg.cn/large/006908GAly1gytdof69rrj30p00godhe.jpg)

6
GUI/Resource.qrc Normal file
View File

@@ -0,0 +1,6 @@
<RCC>
<qresource prefix="img">
<file>背景.svg</file>
<file>logo-horizontal.svg</file>
</qresource>
</RCC>

BIN
GUI/preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

1
GUI/requirements.txt Normal file
View File

@@ -0,0 +1 @@

648
GUI/resource.py Normal file
View File

@@ -0,0 +1,648 @@
# -*- coding: utf-8 -*-
# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2)
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore
qt_resource_data = b"\
\x00\x00\x22\x3e\
\x3c\
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x35\x2e\x30\x2e\x30\x2c\
\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
\x3d\x22\xe5\x9b\xbe\xe5\xb1\x82\x5f\x31\x22\x20\x78\x6d\x6c\x6e\
\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\
\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\
\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\
\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\
\x22\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\
\x74\x68\x3d\x22\x31\x35\x38\x70\x78\x22\x20\x68\x65\x69\x67\x68\
\x74\x3d\x22\x33\x34\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
\x3d\x22\x30\x20\x30\x20\x31\x35\x38\x20\x33\x34\x22\x20\x65\x6e\
\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\
\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x31\x35\x38\x20\x33\x34\x22\
\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\
\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\
\x6c\x6c\x3d\x22\x23\x30\x30\x46\x41\x46\x30\x22\x20\x64\x3d\x22\
\x4d\x31\x31\x2e\x36\x34\x2c\x31\x33\x2e\x34\x33\x34\x76\x2d\x31\
\x2e\x33\x31\x31\x63\x2d\x30\x2e\x34\x35\x36\x2d\x30\x2e\x30\x35\
\x35\x2d\x30\x2e\x39\x31\x31\x2d\x30\x2e\x30\x39\x31\x2d\x31\x2e\
\x33\x38\x35\x2d\x30\x2e\x30\x39\x31\x63\x2d\x35\x2e\x36\x34\x37\
\x2c\x30\x2d\x31\x30\x2e\x32\x35\x36\x2c\x34\x2e\x35\x38\x38\x2d\
\x31\x30\x2e\x32\x35\x36\x2c\x31\x30\x2e\x32\x35\x31\x0d\x0a\x09\
\x63\x30\x2c\x33\x2e\x34\x35\x39\x2c\x31\x2e\x37\x33\x31\x2c\x36\
\x2e\x35\x33\x35\x2c\x34\x2e\x33\x37\x32\x2c\x38\x2e\x33\x39\x33\
\x63\x2d\x31\x2e\x37\x31\x32\x2d\x31\x2e\x38\x33\x39\x2d\x32\x2e\
\x37\x35\x2d\x34\x2e\x32\x37\x39\x2d\x32\x2e\x37\x35\x2d\x36\x2e\
\x39\x37\x33\x43\x31\x2e\x36\x33\x39\x2c\x31\x38\x2e\x31\x31\x33\
\x2c\x36\x2e\x31\x30\x32\x2c\x31\x33\x2e\x35\x36\x32\x2c\x31\x31\
\x2e\x36\x34\x2c\x31\x33\x2e\x34\x33\x34\x7a\x22\x2f\x3e\x0d\x0a\
\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x30\x30\x46\
\x41\x46\x30\x22\x20\x64\x3d\x22\x4d\x31\x31\x2e\x38\x37\x36\x2c\
\x32\x38\x2e\x33\x34\x36\x63\x32\x2e\x35\x31\x34\x2c\x30\x2c\x34\
\x2e\x35\x37\x32\x2d\x32\x2e\x30\x30\x34\x2c\x34\x2e\x36\x36\x34\
\x2d\x34\x2e\x34\x39\x38\x56\x31\x2e\x35\x34\x35\x68\x34\x2e\x30\
\x38\x31\x63\x2d\x30\x2e\x30\x39\x31\x2d\x30\x2e\x34\x35\x35\x2d\
\x30\x2e\x31\x32\x37\x2d\x30\x2e\x39\x32\x38\x2d\x30\x2e\x31\x32\
\x37\x2d\x31\x2e\x34\x32\x48\x31\x34\x2e\x39\x32\x0d\x0a\x09\x76\
\x32\x32\x2e\x33\x30\x33\x63\x2d\x30\x2e\x30\x39\x31\x2c\x32\x2e\
\x34\x39\x34\x2d\x32\x2e\x31\x35\x2c\x34\x2e\x34\x39\x38\x2d\x34\
\x2e\x36\x36\x34\x2c\x34\x2e\x34\x39\x38\x63\x2d\x30\x2e\x37\x38\
\x33\x2c\x30\x2d\x31\x2e\x35\x33\x2d\x30\x2e\x32\x30\x31\x2d\x32\
\x2e\x31\x36\x37\x2d\x30\x2e\x35\x34\x37\x43\x38\x2e\x39\x34\x34\
\x2c\x32\x37\x2e\x35\x38\x2c\x31\x30\x2e\x33\x32\x38\x2c\x32\x38\
\x2e\x33\x34\x36\x2c\x31\x31\x2e\x38\x37\x36\x2c\x32\x38\x2e\x33\
\x34\x36\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\
\x6c\x6c\x3d\x22\x23\x30\x30\x46\x41\x46\x30\x22\x20\x64\x3d\x22\
\x4d\x32\x38\x2e\x32\x35\x31\x2c\x39\x2e\x31\x31\x39\x56\x37\x2e\
\x38\x38\x31\x63\x2d\x31\x2e\x35\x34\x38\x2c\x30\x2d\x33\x2e\x30\
\x30\x36\x2d\x30\x2e\x34\x35\x35\x2d\x34\x2e\x32\x32\x36\x2d\x31\
\x2e\x32\x35\x36\x43\x32\x35\x2e\x31\x31\x38\x2c\x37\x2e\x38\x36\
\x33\x2c\x32\x36\x2e\x35\x39\x34\x2c\x38\x2e\x37\x35\x35\x2c\x32\
\x38\x2e\x32\x35\x31\x2c\x39\x2e\x31\x31\x39\x7a\x22\x2f\x3e\x0d\
\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\
\x30\x30\x35\x30\x22\x20\x64\x3d\x22\x4d\x32\x34\x2e\x30\x34\x35\
\x2c\x36\x2e\x36\x32\x35\x63\x2d\x31\x2e\x31\x38\x34\x2d\x31\x2e\
\x33\x36\x35\x2d\x31\x2e\x39\x31\x33\x2d\x33\x2e\x31\x33\x31\x2d\
\x31\x2e\x39\x31\x33\x2d\x35\x2e\x30\x38\x68\x2d\x31\x2e\x34\x39\
\x34\x43\x32\x31\x2e\x30\x33\x39\x2c\x33\x2e\x36\x35\x38\x2c\x32\
\x32\x2e\x32\x39\x36\x2c\x35\x2e\x34\x37\x39\x2c\x32\x34\x2e\x30\
\x34\x35\x2c\x36\x2e\x36\x32\x35\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\
\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x30\x30\x35\
\x30\x22\x20\x64\x3d\x22\x4d\x31\x30\x2e\x32\x35\x35\x2c\x31\x37\
\x2e\x35\x38\x34\x63\x2d\x32\x2e\x35\x38\x36\x2c\x30\x2d\x34\x2e\
\x36\x38\x32\x2c\x32\x2e\x30\x39\x34\x2d\x34\x2e\x36\x38\x32\x2c\
\x34\x2e\x36\x38\x63\x30\x2c\x31\x2e\x38\x30\x33\x2c\x31\x2e\x30\
\x32\x31\x2c\x33\x2e\x33\x35\x2c\x32\x2e\x35\x31\x34\x2c\x34\x2e\
\x31\x33\x33\x0d\x0a\x09\x63\x2d\x30\x2e\x35\x34\x36\x2d\x30\x2e\
\x37\x36\x35\x2d\x30\x2e\x38\x39\x33\x2d\x31\x2e\x37\x31\x31\x2d\
\x30\x2e\x38\x39\x33\x2d\x32\x2e\x37\x32\x39\x63\x30\x2d\x32\x2e\
\x35\x38\x36\x2c\x32\x2e\x30\x39\x35\x2d\x34\x2e\x36\x38\x31\x2c\
\x34\x2e\x36\x38\x32\x2d\x34\x2e\x36\x38\x31\x63\x30\x2e\x34\x37\
\x34\x2c\x30\x2c\x30\x2e\x39\x34\x37\x2c\x30\x2e\x30\x37\x34\x2c\
\x31\x2e\x33\x38\x34\x2c\x30\x2e\x32\x32\x76\x2d\x35\x2e\x36\x38\
\x0d\x0a\x09\x63\x2d\x30\x2e\x34\x35\x35\x2d\x30\x2e\x30\x35\x35\
\x2d\x30\x2e\x39\x31\x31\x2d\x30\x2e\x30\x39\x31\x2d\x31\x2e\x33\
\x38\x34\x2d\x30\x2e\x30\x39\x31\x63\x2d\x30\x2e\x30\x37\x33\x2c\
\x30\x2d\x30\x2e\x31\x36\x34\x2c\x30\x2d\x30\x2e\x32\x33\x37\x2c\
\x30\x76\x34\x2e\x33\x37\x43\x31\x31\x2e\x32\x30\x32\x2c\x31\x37\
\x2e\x36\x35\x38\x2c\x31\x30\x2e\x37\x34\x37\x2c\x31\x37\x2e\x35\
\x38\x34\x2c\x31\x30\x2e\x32\x35\x35\x2c\x31\x37\x2e\x35\x38\x34\
\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\
\x3d\x22\x23\x46\x46\x30\x30\x35\x30\x22\x20\x64\x3d\x22\x4d\x32\
\x38\x2e\x32\x35\x32\x2c\x39\x2e\x31\x31\x39\x76\x34\x2e\x33\x33\
\x33\x63\x2d\x32\x2e\x38\x39\x36\x2c\x30\x2d\x35\x2e\x35\x35\x36\
\x2d\x30\x2e\x39\x32\x38\x2d\x37\x2e\x37\x34\x32\x2d\x32\x2e\x34\
\x39\x34\x76\x31\x31\x2e\x33\x30\x36\x63\x30\x2c\x35\x2e\x36\x34\
\x36\x2d\x34\x2e\x35\x39\x2c\x31\x30\x2e\x32\x35\x2d\x31\x30\x2e\
\x32\x35\x35\x2c\x31\x30\x2e\x32\x35\x0d\x0a\x09\x63\x2d\x32\x2e\
\x31\x38\x36\x2c\x30\x2d\x34\x2e\x32\x30\x38\x2d\x30\x2e\x36\x39\
\x31\x2d\x35\x2e\x38\x36\x36\x2d\x31\x2e\x38\x35\x35\x63\x31\x2e\
\x38\x37\x36\x2c\x32\x2e\x30\x30\x33\x2c\x34\x2e\x35\x33\x36\x2c\
\x33\x2e\x32\x37\x37\x2c\x37\x2e\x35\x30\x35\x2c\x33\x2e\x32\x37\
\x37\x63\x35\x2e\x36\x34\x37\x2c\x30\x2c\x31\x30\x2e\x32\x35\x36\
\x2d\x34\x2e\x35\x38\x38\x2c\x31\x30\x2e\x32\x35\x36\x2d\x31\x30\
\x2e\x32\x35\x32\x56\x31\x32\x2e\x33\x37\x38\x0d\x0a\x09\x63\x32\
\x2e\x31\x38\x36\x2c\x31\x2e\x35\x36\x36\x2c\x34\x2e\x38\x36\x34\
\x2c\x32\x2e\x34\x39\x35\x2c\x37\x2e\x37\x34\x32\x2c\x32\x2e\x34\
\x39\x35\x56\x39\x2e\x33\x30\x31\x43\x32\x39\x2e\x33\x32\x37\x2c\
\x39\x2e\x32\x38\x33\x2c\x32\x38\x2e\x37\x38\x31\x2c\x39\x2e\x32\
\x32\x39\x2c\x32\x38\x2e\x32\x35\x32\x2c\x39\x2e\x31\x31\x39\x7a\
\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\
\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x32\x30\
\x2e\x35\x30\x39\x2c\x32\x32\x2e\x32\x36\x36\x56\x31\x30\x2e\x39\
\x35\x38\x63\x32\x2e\x31\x38\x36\x2c\x31\x2e\x35\x36\x36\x2c\x34\
\x2e\x38\x36\x34\x2c\x32\x2e\x34\x39\x34\x2c\x37\x2e\x37\x34\x32\
\x2c\x32\x2e\x34\x39\x34\x56\x39\x2e\x31\x32\x63\x2d\x31\x2e\x36\
\x37\x36\x2d\x30\x2e\x33\x36\x34\x2d\x33\x2e\x31\x33\x33\x2d\x31\
\x2e\x32\x35\x36\x2d\x34\x2e\x32\x32\x37\x2d\x32\x2e\x34\x39\x34\
\x0d\x0a\x09\x63\x2d\x31\x2e\x37\x34\x39\x2d\x31\x2e\x31\x32\x39\
\x2d\x33\x2e\x30\x30\x35\x2d\x32\x2e\x39\x34\x39\x2d\x33\x2e\x33\
\x38\x38\x2d\x35\x2e\x30\x38\x68\x2d\x34\x2e\x30\x38\x56\x32\x33\
\x2e\x38\x35\x63\x2d\x30\x2e\x30\x39\x31\x2c\x32\x2e\x34\x39\x34\
\x2d\x32\x2e\x31\x35\x2c\x34\x2e\x34\x39\x36\x2d\x34\x2e\x36\x36\
\x34\x2c\x34\x2e\x34\x39\x36\x63\x2d\x31\x2e\x35\x36\x36\x2c\x30\
\x2d\x32\x2e\x39\x35\x31\x2d\x30\x2e\x37\x36\x35\x2d\x33\x2e\x37\
\x38\x39\x2d\x31\x2e\x39\x34\x37\x0d\x0a\x09\x63\x2d\x31\x2e\x34\
\x39\x34\x2d\x30\x2e\x37\x38\x33\x2d\x32\x2e\x35\x31\x34\x2d\x32\
\x2e\x33\x35\x2d\x32\x2e\x35\x31\x34\x2d\x34\x2e\x31\x33\x33\x63\
\x30\x2d\x32\x2e\x35\x38\x36\x2c\x32\x2e\x30\x39\x35\x2d\x34\x2e\
\x36\x38\x2c\x34\x2e\x36\x38\x32\x2d\x34\x2e\x36\x38\x63\x30\x2e\
\x34\x37\x34\x2c\x30\x2c\x30\x2e\x39\x34\x37\x2c\x30\x2e\x30\x37\
\x32\x2c\x31\x2e\x33\x38\x34\x2c\x30\x2e\x32\x31\x39\x76\x2d\x34\
\x2e\x33\x37\x0d\x0a\x09\x63\x2d\x35\x2e\x35\x33\x36\x2c\x30\x2e\
\x31\x32\x37\x2d\x31\x30\x2c\x34\x2e\x36\x37\x38\x2d\x31\x30\x2c\
\x31\x30\x2e\x32\x33\x31\x63\x30\x2c\x32\x2e\x36\x39\x35\x2c\x31\
\x2e\x30\x33\x39\x2c\x35\x2e\x31\x35\x32\x2c\x32\x2e\x37\x35\x31\
\x2c\x36\x2e\x39\x37\x35\x63\x31\x2e\x36\x35\x38\x2c\x31\x2e\x31\
\x36\x34\x2c\x33\x2e\x36\x39\x38\x2c\x31\x2e\x38\x35\x36\x2c\x35\
\x2e\x38\x36\x36\x2c\x31\x2e\x38\x35\x36\x0d\x0a\x09\x43\x31\x35\
\x2e\x39\x2c\x33\x32\x2e\x35\x31\x36\x2c\x32\x30\x2e\x35\x30\x39\
\x2c\x32\x37\x2e\x39\x30\x38\x2c\x32\x30\x2e\x35\x30\x39\x2c\x32\
\x32\x2e\x32\x36\x36\x7a\x22\x2f\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\
\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\
\x46\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x34\x34\x2e\x35\x37\x36\
\x2c\x31\x35\x2e\x38\x37\x36\x63\x30\x2e\x33\x35\x33\x2d\x30\x2e\
\x30\x38\x2c\x30\x2e\x35\x32\x32\x2c\x30\x2e\x30\x36\x34\x2c\x30\
\x2e\x35\x30\x36\x2c\x30\x2e\x34\x33\x34\x6c\x2d\x30\x2e\x31\x32\
\x2c\x32\x2e\x32\x36\x35\x63\x2d\x30\x2e\x30\x31\x37\x2c\x30\x2e\
\x33\x37\x2d\x30\x2e\x32\x30\x31\x2c\x30\x2e\x35\x39\x35\x2d\x30\
\x2e\x35\x35\x34\x2c\x30\x2e\x36\x37\x35\x0d\x0a\x09\x09\x6c\x2d\
\x31\x2e\x36\x31\x34\x2c\x30\x2e\x34\x30\x39\x76\x35\x2e\x32\x30\
\x34\x63\x30\x2c\x30\x2e\x38\x32\x2d\x30\x2e\x30\x38\x39\x2c\x31\
\x2e\x34\x35\x35\x2d\x30\x2e\x32\x36\x35\x2c\x31\x2e\x39\x30\x34\
\x63\x2d\x30\x2e\x31\x36\x31\x2c\x30\x2e\x34\x34\x39\x2d\x30\x2e\
\x34\x36\x36\x2c\x30\x2e\x37\x39\x35\x2d\x30\x2e\x39\x31\x36\x2c\
\x31\x2e\x30\x33\x35\x63\x2d\x30\x2e\x37\x32\x33\x2c\x30\x2e\x34\
\x31\x38\x2d\x31\x2e\x37\x37\x35\x2c\x30\x2e\x36\x31\x39\x2d\x33\
\x2e\x31\x35\x37\x2c\x30\x2e\x36\x30\x34\x0d\x0a\x09\x09\x63\x2d\
\x30\x2e\x34\x39\x38\x2c\x30\x2e\x30\x31\x36\x2d\x30\x2e\x37\x36\
\x33\x2d\x30\x2e\x31\x36\x32\x2d\x30\x2e\x37\x39\x35\x2d\x30\x2e\
\x35\x33\x31\x6c\x2d\x30\x2e\x32\x34\x31\x2d\x32\x2e\x30\x34\x37\
\x63\x2d\x30\x2e\x30\x33\x32\x2d\x30\x2e\x33\x37\x2c\x30\x2e\x31\
\x33\x37\x2d\x30\x2e\x35\x35\x35\x2c\x30\x2e\x35\x30\x36\x2d\x30\
\x2e\x35\x35\x35\x68\x30\x2e\x39\x38\x38\x0d\x0a\x09\x09\x63\x30\
\x2e\x33\x30\x35\x2c\x30\x2e\x30\x31\x36\x2c\x30\x2e\x34\x35\x38\
\x2d\x30\x2e\x31\x32\x39\x2c\x30\x2e\x34\x35\x38\x2d\x30\x2e\x34\
\x33\x34\x76\x2d\x34\x2e\x33\x33\x38\x6c\x2d\x31\x2e\x36\x36\x32\
\x2c\x30\x2e\x34\x31\x63\x2d\x30\x2e\x33\x35\x34\x2c\x30\x2e\x30\
\x38\x2d\x30\x2e\x35\x33\x39\x2d\x30\x2e\x30\x36\x34\x2d\x30\x2e\
\x35\x35\x34\x2d\x30\x2e\x34\x33\x34\x6c\x2d\x30\x2e\x32\x34\x31\
\x2d\x32\x2e\x33\x33\x37\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x30\x31\
\x36\x2d\x30\x2e\x33\x37\x2c\x30\x2e\x31\x36\x31\x2d\x30\x2e\x35\
\x39\x35\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x36\x37\x35\x6c\x31\x2e\
\x39\x32\x37\x2d\x30\x2e\x33\x38\x36\x76\x2d\x33\x2e\x36\x36\x32\
\x68\x2d\x32\x2e\x31\x36\x38\x63\x2d\x30\x2e\x33\x37\x2c\x30\x2d\
\x30\x2e\x35\x32\x32\x2d\x30\x2e\x31\x37\x37\x2d\x30\x2e\x34\x35\
\x38\x2d\x30\x2e\x35\x33\x6c\x30\x2e\x34\x31\x2d\x32\x2e\x31\x36\
\x38\x0d\x0a\x09\x09\x63\x30\x2e\x30\x36\x34\x2d\x30\x2e\x33\x35\
\x33\x2c\x30\x2e\x32\x38\x31\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x36\
\x35\x2d\x30\x2e\x35\x33\x68\x31\x2e\x35\x36\x36\x56\x36\x2e\x32\
\x38\x37\x63\x30\x2d\x30\x2e\x33\x37\x2c\x30\x2e\x31\x37\x37\x2d\
\x30\x2e\x35\x33\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x34\x38\x32\x6c\
\x32\x2e\x33\x36\x31\x2c\x30\x2e\x34\x35\x38\x63\x30\x2e\x33\x35\
\x33\x2c\x30\x2e\x30\x34\x38\x2c\x30\x2e\x35\x33\x2c\x30\x2e\x32\
\x35\x37\x2c\x30\x2e\x35\x33\x2c\x30\x2e\x36\x32\x36\x76\x33\x2e\
\x33\x30\x31\x0d\x0a\x09\x09\x68\x32\x2e\x30\x39\x36\x63\x30\x2e\
\x33\x36\x39\x2c\x30\x2c\x30\x2e\x35\x32\x31\x2c\x30\x2e\x31\x37\
\x37\x2c\x30\x2e\x34\x35\x38\x2c\x30\x2e\x35\x33\x6c\x2d\x30\x2e\
\x34\x31\x2c\x32\x2e\x31\x36\x38\x63\x2d\x30\x2e\x30\x36\x34\x2c\
\x30\x2e\x33\x35\x34\x2d\x30\x2e\x32\x38\x31\x2c\x30\x2e\x35\x33\
\x2d\x30\x2e\x36\x35\x2c\x30\x2e\x35\x33\x68\x2d\x31\x2e\x34\x39\
\x34\x76\x32\x2e\x38\x39\x31\x4c\x34\x34\x2e\x35\x37\x36\x2c\x31\
\x35\x2e\x38\x37\x36\x7a\x20\x4d\x35\x31\x2e\x34\x39\x31\x2c\x31\
\x35\x2e\x32\x35\x0d\x0a\x09\x09\x63\x30\x2e\x32\x37\x33\x2c\x30\
\x2e\x32\x32\x35\x2c\x30\x2e\x32\x38\x39\x2c\x30\x2e\x34\x36\x36\
\x2c\x30\x2e\x30\x34\x38\x2c\x30\x2e\x37\x32\x33\x6c\x2d\x31\x2e\
\x35\x36\x35\x2c\x31\x2e\x36\x38\x38\x63\x2d\x30\x2e\x32\x34\x31\
\x2c\x30\x2e\x32\x35\x36\x2d\x30\x2e\x34\x37\x35\x2c\x30\x2e\x32\
\x38\x31\x2d\x30\x2e\x36\x39\x39\x2c\x30\x2e\x30\x37\x32\x63\x2d\
\x30\x2e\x33\x35\x34\x2d\x30\x2e\x34\x31\x38\x2d\x31\x2e\x33\x38\
\x32\x2d\x31\x2e\x31\x31\x37\x2d\x33\x2e\x30\x38\x34\x2d\x32\x2e\
\x30\x39\x37\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x34\x31\x38\x2d\x30\
\x2e\x32\x35\x37\x2d\x30\x2e\x34\x39\x2d\x30\x2e\x34\x39\x38\x2d\
\x30\x2e\x32\x31\x37\x2d\x30\x2e\x37\x32\x33\x6c\x31\x2e\x36\x36\
\x32\x2d\x31\x2e\x34\x34\x36\x63\x30\x2e\x32\x37\x33\x2d\x30\x2e\
\x32\x32\x35\x2c\x30\x2e\x36\x31\x2d\x30\x2e\x32\x33\x32\x2c\x31\
\x2e\x30\x31\x33\x2d\x30\x2e\x30\x32\x34\x43\x34\x39\x2e\x38\x38\
\x35\x2c\x31\x34\x2e\x30\x35\x34\x2c\x35\x30\x2e\x38\x33\x32\x2c\
\x31\x34\x2e\x36\x35\x36\x2c\x35\x31\x2e\x34\x39\x31\x2c\x31\x35\
\x2e\x32\x35\x7a\x0d\x0a\x09\x09\x20\x4d\x35\x38\x2e\x39\x31\x32\
\x2c\x31\x38\x2e\x39\x36\x31\x76\x32\x2e\x32\x31\x37\x63\x30\x2c\
\x30\x2e\x33\x36\x39\x2d\x30\x2e\x31\x38\x35\x2c\x30\x2e\x35\x38\
\x36\x2d\x30\x2e\x35\x35\x34\x2c\x30\x2e\x36\x35\x6c\x2d\x31\x2e\
\x39\x32\x38\x2c\x30\x2e\x33\x33\x37\x76\x35\x2e\x38\x38\x63\x30\
\x2c\x30\x2e\x33\x36\x39\x2d\x30\x2e\x31\x37\x37\x2c\x30\x2e\x35\
\x32\x39\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x34\x38\x6c\x2d\x32\x2e\
\x34\x30\x39\x2d\x30\x2e\x34\x35\x37\x0d\x0a\x09\x09\x63\x2d\x30\
\x2e\x33\x35\x34\x2d\x30\x2e\x30\x34\x39\x2d\x30\x2e\x35\x33\x2d\
\x30\x2e\x32\x35\x38\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x36\x32\x37\
\x76\x2d\x34\x2e\x36\x39\x37\x6c\x2d\x36\x2e\x35\x30\x36\x2c\x31\
\x2e\x31\x33\x32\x63\x2d\x30\x2e\x33\x35\x34\x2c\x30\x2e\x30\x34\
\x38\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x31\x31\x32\x2d\x30\x2e\x35\
\x33\x2d\x30\x2e\x34\x38\x31\x6c\x2d\x30\x2e\x30\x34\x38\x2d\x32\
\x2e\x33\x31\x33\x0d\x0a\x09\x09\x63\x30\x2d\x30\x2e\x33\x37\x2c\
\x30\x2e\x31\x38\x35\x2d\x30\x2e\x35\x37\x39\x2c\x30\x2e\x35\x35\
\x34\x2d\x30\x2e\x36\x32\x36\x6c\x36\x2e\x35\x32\x39\x2d\x31\x2e\
\x30\x38\x35\x56\x36\x2e\x32\x36\x33\x63\x30\x2d\x30\x2e\x33\x36\
\x39\x2c\x30\x2e\x31\x37\x37\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x35\
\x33\x2d\x30\x2e\x34\x38\x32\x4c\x35\x35\x2e\x39\x2c\x36\x2e\x32\
\x33\x39\x63\x30\x2e\x33\x35\x34\x2c\x30\x2e\x30\x34\x38\x2c\x30\
\x2e\x35\x33\x2c\x30\x2e\x32\x35\x37\x2c\x30\x2e\x35\x33\x2c\x30\
\x2e\x36\x32\x36\x0d\x0a\x09\x09\x76\x31\x31\x2e\x39\x35\x31\x6c\
\x31\x2e\x39\x35\x32\x2d\x30\x2e\x33\x33\x38\x43\x35\x38\x2e\x37\
\x33\x35\x2c\x31\x38\x2e\x34\x33\x31\x2c\x35\x38\x2e\x39\x31\x32\
\x2c\x31\x38\x2e\x35\x39\x32\x2c\x35\x38\x2e\x39\x31\x32\x2c\x31\
\x38\x2e\x39\x36\x31\x7a\x20\x4d\x35\x32\x2e\x34\x35\x35\x2c\x39\
\x2e\x33\x39\x35\x63\x30\x2e\x32\x35\x37\x2c\x30\x2e\x32\x34\x31\
\x2c\x30\x2e\x32\x35\x37\x2c\x30\x2e\x34\x39\x2c\x30\x2c\x30\x2e\
\x37\x34\x37\x6c\x2d\x31\x2e\x35\x36\x36\x2c\x31\x2e\x34\x39\x34\
\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x32\x35\x37\x2c\x30\x2e\x32\x35\
\x37\x2d\x30\x2e\x35\x30\x36\x2c\x30\x2e\x32\x37\x33\x2d\x30\x2e\
\x37\x34\x37\x2c\x30\x2e\x30\x34\x38\x63\x2d\x30\x2e\x33\x36\x39\
\x2d\x30\x2e\x34\x39\x38\x2d\x31\x2e\x33\x31\x36\x2d\x31\x2e\x32\
\x30\x35\x2d\x32\x2e\x38\x34\x33\x2d\x32\x2e\x31\x32\x63\x2d\x30\
\x2e\x33\x38\x35\x2d\x30\x2e\x32\x35\x37\x2d\x30\x2e\x34\x33\x34\
\x2d\x30\x2e\x34\x39\x38\x2d\x30\x2e\x31\x34\x35\x2d\x30\x2e\x37\
\x32\x33\x6c\x31\x2e\x36\x36\x32\x2d\x31\x2e\x33\x30\x31\x0d\x0a\
\x09\x09\x63\x30\x2e\x32\x39\x2d\x30\x2e\x32\x32\x35\x2c\x30\x2e\
\x36\x32\x37\x2d\x30\x2e\x32\x32\x35\x2c\x31\x2e\x30\x31\x33\x2c\
\x30\x43\x35\x31\x2e\x30\x31\x38\x2c\x38\x2e\x31\x36\x36\x2c\x35\
\x31\x2e\x38\x39\x33\x2c\x38\x2e\x37\x38\x35\x2c\x35\x32\x2e\x34\
\x35\x35\x2c\x39\x2e\x33\x39\x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\
\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x46\x46\
\x46\x46\x22\x20\x64\x3d\x22\x4d\x37\x38\x2e\x34\x37\x37\x2c\x31\
\x33\x2e\x32\x35\x68\x34\x2e\x31\x36\x39\x63\x30\x2e\x33\x36\x39\
\x2c\x30\x2c\x30\x2e\x35\x32\x31\x2c\x30\x2e\x31\x37\x37\x2c\x30\
\x2e\x34\x35\x38\x2c\x30\x2e\x35\x33\x6c\x2d\x30\x2e\x34\x31\x2c\
\x32\x2e\x31\x34\x35\x63\x2d\x30\x2e\x30\x36\x34\x2c\x30\x2e\x33\
\x35\x34\x2d\x30\x2e\x32\x38\x31\x2c\x30\x2e\x35\x33\x2d\x30\x2e\
\x36\x35\x2c\x30\x2e\x35\x33\x48\x36\x31\x2e\x32\x30\x31\x0d\x0a\
\x09\x09\x63\x2d\x30\x2e\x33\x37\x2c\x30\x2d\x30\x2e\x35\x32\x32\
\x2d\x30\x2e\x31\x37\x36\x2d\x30\x2e\x34\x35\x38\x2d\x30\x2e\x35\
\x33\x6c\x30\x2e\x34\x31\x2d\x32\x2e\x31\x34\x35\x63\x30\x2e\x30\
\x36\x33\x2d\x30\x2e\x33\x35\x33\x2c\x30\x2e\x32\x38\x2d\x30\x2e\
\x35\x33\x2c\x30\x2e\x36\x35\x2d\x30\x2e\x35\x33\x68\x33\x2e\x38\
\x37\x39\x6c\x2d\x30\x2e\x32\x31\x37\x2d\x30\x2e\x35\x35\x34\x0d\
\x0a\x09\x09\x63\x2d\x30\x2e\x33\x36\x39\x2d\x30\x2e\x39\x37\x39\
\x2d\x30\x2e\x30\x34\x2d\x31\x2e\x35\x35\x38\x2c\x30\x2e\x39\x38\
\x38\x2d\x31\x2e\x37\x33\x34\x6c\x30\x2e\x37\x32\x33\x2d\x30\x2e\
\x31\x34\x35\x68\x2d\x34\x2e\x36\x30\x33\x63\x2d\x30\x2e\x33\x36\
\x39\x2c\x30\x2d\x30\x2e\x35\x32\x31\x2d\x30\x2e\x31\x37\x36\x2d\
\x30\x2e\x34\x35\x37\x2d\x30\x2e\x35\x33\x6c\x30\x2e\x34\x30\x39\
\x2d\x32\x2e\x31\x34\x35\x0d\x0a\x09\x09\x63\x30\x2e\x30\x36\x34\
\x2d\x30\x2e\x33\x35\x33\x2c\x30\x2e\x32\x38\x31\x2d\x30\x2e\x35\
\x33\x2c\x30\x2e\x36\x35\x2d\x30\x2e\x35\x33\x68\x36\x2e\x39\x33\
\x39\x6c\x2d\x30\x2e\x34\x38\x32\x2d\x31\x2e\x31\x33\x33\x63\x2d\
\x30\x2e\x31\x32\x38\x2d\x30\x2e\x33\x33\x37\x2d\x30\x2e\x30\x30\
\x38\x2d\x30\x2e\x35\x30\x36\x2c\x30\x2e\x33\x36\x32\x2d\x30\x2e\
\x35\x30\x36\x6c\x32\x2e\x39\x36\x33\x2d\x30\x2e\x30\x32\x34\x0d\
\x0a\x09\x09\x63\x30\x2e\x33\x36\x39\x2c\x30\x2c\x30\x2e\x36\x32\
\x37\x2c\x30\x2e\x31\x37\x37\x2c\x30\x2e\x37\x37\x31\x2c\x30\x2e\
\x35\x33\x6c\x30\x2e\x35\x30\x36\x2c\x31\x2e\x31\x33\x33\x68\x37\
\x2e\x33\x32\x34\x63\x30\x2e\x33\x37\x2c\x30\x2c\x30\x2e\x35\x32\
\x32\x2c\x30\x2e\x31\x37\x37\x2c\x30\x2e\x34\x35\x38\x2c\x30\x2e\
\x35\x33\x6c\x2d\x30\x2e\x34\x30\x39\x2c\x32\x2e\x31\x34\x35\x63\
\x2d\x30\x2e\x30\x36\x34\x2c\x30\x2e\x33\x35\x34\x2d\x30\x2e\x32\
\x38\x31\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x36\x35\x2c\x30\x2e\x35\
\x33\x0d\x0a\x09\x09\x48\x37\x37\x2e\x32\x6c\x30\x2e\x36\x37\x35\
\x2c\x30\x2e\x31\x34\x35\x63\x31\x2e\x30\x32\x37\x2c\x30\x2e\x31\
\x39\x32\x2c\x31\x2e\x33\x32\x35\x2c\x30\x2e\x37\x36\x33\x2c\x30\
\x2e\x38\x39\x31\x2c\x31\x2e\x37\x31\x4c\x37\x38\x2e\x34\x37\x37\
\x2c\x31\x33\x2e\x32\x35\x7a\x20\x4d\x36\x34\x2e\x38\x36\x33\x2c\
\x32\x38\x2e\x36\x32\x33\x63\x2d\x30\x2e\x38\x38\x34\x2c\x30\x2d\
\x31\x2e\x33\x32\x35\x2d\x30\x2e\x34\x34\x32\x2d\x31\x2e\x33\x32\
\x35\x2d\x31\x2e\x33\x32\x36\x76\x2d\x38\x2e\x33\x33\x36\x0d\x0a\
\x09\x09\x63\x30\x2d\x30\x2e\x38\x38\x34\x2c\x30\x2e\x34\x34\x31\
\x2d\x31\x2e\x33\x32\x36\x2c\x31\x2e\x33\x32\x35\x2d\x31\x2e\x33\
\x32\x36\x68\x31\x34\x2e\x34\x30\x39\x63\x30\x2e\x38\x38\x33\x2c\
\x30\x2c\x31\x2e\x33\x32\x35\x2c\x30\x2e\x34\x34\x32\x2c\x31\x2e\
\x33\x32\x35\x2c\x31\x2e\x33\x32\x36\x76\x38\x2e\x33\x33\x36\x63\
\x30\x2c\x30\x2e\x38\x38\x34\x2d\x30\x2e\x34\x34\x32\x2c\x31\x2e\
\x33\x32\x36\x2d\x31\x2e\x33\x32\x35\x2c\x31\x2e\x33\x32\x36\x48\
\x36\x34\x2e\x38\x36\x33\x7a\x0d\x0a\x09\x09\x20\x4d\x37\x36\x2e\
\x37\x36\x37\x2c\x32\x31\x2e\x32\x39\x38\x63\x30\x2d\x30\x2e\x34\
\x36\x36\x2d\x30\x2e\x32\x33\x33\x2d\x30\x2e\x36\x39\x38\x2d\x30\
\x2e\x36\x39\x39\x2d\x30\x2e\x36\x39\x38\x68\x2d\x38\x2e\x31\x39\
\x32\x63\x2d\x30\x2e\x34\x36\x36\x2c\x30\x2d\x30\x2e\x36\x39\x38\
\x2c\x30\x2e\x32\x33\x32\x2d\x30\x2e\x36\x39\x38\x2c\x30\x2e\x36\
\x39\x38\x76\x30\x2e\x34\x35\x38\x68\x39\x2e\x35\x39\x56\x32\x31\
\x2e\x32\x39\x38\x7a\x20\x4d\x36\x37\x2e\x31\x37\x37\x2c\x32\x34\
\x2e\x39\x38\x34\x0d\x0a\x09\x09\x63\x30\x2c\x30\x2e\x34\x36\x36\
\x2c\x30\x2e\x32\x33\x32\x2c\x30\x2e\x36\x39\x39\x2c\x30\x2e\x36\
\x39\x38\x2c\x30\x2e\x36\x39\x39\x68\x38\x2e\x31\x39\x32\x63\x30\
\x2e\x34\x36\x36\x2c\x30\x2c\x30\x2e\x36\x39\x39\x2d\x30\x2e\x32\
\x33\x33\x2c\x30\x2e\x36\x39\x39\x2d\x30\x2e\x36\x39\x39\x56\x32\
\x34\x2e\x34\x33\x68\x2d\x39\x2e\x35\x39\x56\x32\x34\x2e\x39\x38\
\x34\x7a\x20\x4d\x37\x35\x2e\x32\x34\x38\x2c\x31\x30\x2e\x38\x31\
\x36\x68\x2d\x36\x2e\x35\x37\x37\x6c\x30\x2e\x39\x38\x37\x2c\x32\
\x2e\x34\x33\x34\x0d\x0a\x09\x09\x68\x34\x2e\x38\x36\x37\x4c\x37\
\x35\x2e\x32\x34\x38\x2c\x31\x30\x2e\x38\x31\x36\x7a\x22\x2f\x3e\
\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\
\x46\x46\x46\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x31\x30\x37\x2e\
\x31\x30\x32\x2c\x31\x35\x2e\x36\x33\x36\x6c\x2d\x30\x2e\x34\x35\
\x38\x2c\x32\x2e\x34\x38\x31\x63\x2d\x30\x2e\x30\x34\x38\x2c\x30\
\x2e\x33\x35\x34\x2d\x30\x2e\x32\x35\x37\x2c\x30\x2e\x35\x33\x2d\
\x30\x2e\x36\x32\x36\x2c\x30\x2e\x35\x33\x48\x39\x35\x2e\x37\x35\
\x33\x0d\x0a\x09\x09\x63\x2d\x31\x2e\x31\x35\x36\x2c\x31\x2e\x38\
\x2d\x32\x2e\x33\x35\x34\x2c\x33\x2e\x33\x37\x33\x2d\x33\x2e\x35\
\x39\x2c\x34\x2e\x37\x32\x33\x63\x2d\x30\x2e\x33\x30\x36\x2c\x30\
\x2e\x33\x35\x33\x2d\x30\x2e\x32\x33\x33\x2c\x30\x2e\x35\x32\x32\
\x2c\x30\x2e\x32\x31\x37\x2c\x30\x2e\x35\x30\x36\x6c\x37\x2e\x38\
\x35\x34\x2d\x30\x2e\x34\x33\x34\x6c\x2d\x31\x2e\x38\x37\x39\x2d\
\x32\x2e\x36\x32\x36\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x32\x30\x39\
\x2d\x30\x2e\x32\x38\x39\x2d\x30\x2e\x31\x33\x37\x2d\x30\x2e\x34\
\x37\x35\x2c\x30\x2e\x32\x31\x37\x2d\x30\x2e\x35\x35\x35\x6c\x32\
\x2e\x35\x35\x34\x2d\x30\x2e\x37\x32\x33\x63\x30\x2e\x33\x35\x34\
\x2d\x30\x2e\x30\x38\x2c\x30\x2e\x36\x34\x33\x2c\x30\x2e\x30\x31\
\x36\x2c\x30\x2e\x38\x36\x37\x2c\x30\x2e\x32\x38\x39\x63\x30\x2e\
\x35\x36\x33\x2c\x30\x2e\x36\x34\x33\x2c\x31\x2e\x33\x33\x33\x2c\
\x31\x2e\x36\x39\x35\x2c\x32\x2e\x33\x31\x33\x2c\x33\x2e\x31\x35\
\x36\x0d\x0a\x09\x09\x63\x30\x2e\x39\x37\x39\x2c\x31\x2e\x34\x34\
\x35\x2c\x31\x2e\x36\x36\x32\x2c\x32\x2e\x35\x38\x36\x2c\x32\x2e\
\x30\x34\x38\x2c\x33\x2e\x34\x32\x32\x63\x30\x2e\x31\x34\x35\x2c\
\x30\x2e\x32\x38\x39\x2c\x30\x2e\x30\x34\x38\x2c\x30\x2e\x34\x38\
\x39\x2d\x30\x2e\x32\x38\x39\x2c\x30\x2e\x36\x30\x32\x6c\x2d\x32\
\x2e\x36\x39\x38\x2c\x30\x2e\x38\x39\x32\x63\x2d\x30\x2e\x33\x33\
\x38\x2c\x30\x2e\x31\x31\x32\x2d\x30\x2e\x35\x39\x35\x2c\x30\x2d\
\x30\x2e\x37\x37\x31\x2d\x30\x2e\x33\x33\x37\x0d\x0a\x09\x09\x6c\
\x2d\x30\x2e\x34\x33\x34\x2d\x30\x2e\x39\x31\x36\x63\x2d\x38\x2e\
\x30\x31\x36\x2c\x30\x2e\x36\x31\x2d\x31\x32\x2e\x34\x39\x37\x2c\
\x30\x2e\x39\x38\x38\x2d\x31\x33\x2e\x34\x34\x34\x2c\x31\x2e\x31\
\x33\x33\x6c\x2d\x30\x2e\x39\x34\x2c\x30\x2e\x32\x34\x63\x2d\x30\
\x2e\x33\x35\x34\x2c\x30\x2e\x30\x38\x2d\x30\x2e\x35\x36\x33\x2d\
\x30\x2e\x30\x35\x36\x2d\x30\x2e\x36\x32\x36\x2d\x30\x2e\x34\x30\
\x39\x6c\x2d\x30\x2e\x35\x37\x38\x2d\x32\x2e\x35\x33\x0d\x0a\x09\
\x09\x63\x2d\x30\x2e\x30\x36\x34\x2d\x30\x2e\x33\x35\x33\x2c\x30\
\x2e\x30\x34\x2d\x30\x2e\x36\x32\x36\x2c\x30\x2e\x33\x31\x33\x2d\
\x30\x2e\x38\x31\x38\x63\x2d\x30\x2e\x30\x34\x38\x2c\x30\x2e\x31\
\x36\x2c\x30\x2e\x33\x30\x36\x2d\x30\x2e\x31\x36\x2c\x31\x2e\x30\
\x36\x31\x2d\x30\x2e\x39\x36\x35\x63\x30\x2e\x33\x33\x37\x2d\x30\
\x2e\x33\x33\x36\x2c\x30\x2e\x38\x33\x35\x2d\x30\x2e\x39\x34\x37\
\x2c\x31\x2e\x34\x39\x34\x2d\x31\x2e\x38\x33\x6c\x31\x2e\x38\x33\
\x31\x2d\x32\x2e\x38\x31\x39\x68\x2d\x35\x2e\x37\x38\x33\x0d\x0a\
\x09\x09\x63\x2d\x30\x2e\x33\x36\x39\x2c\x30\x2d\x30\x2e\x35\x32\
\x39\x2d\x30\x2e\x31\x37\x37\x2d\x30\x2e\x34\x38\x31\x2d\x30\x2e\
\x35\x33\x6c\x30\x2e\x34\x35\x38\x2d\x32\x2e\x34\x38\x31\x63\x30\
\x2e\x30\x34\x38\x2d\x30\x2e\x33\x35\x34\x2c\x30\x2e\x32\x35\x37\
\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x36\x32\x36\x2d\x30\x2e\x35\x33\
\x68\x38\x2e\x30\x34\x38\x76\x2d\x32\x2e\x37\x39\x35\x68\x2d\x36\
\x2e\x37\x39\x35\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x33\x36\x39\x2c\
\x30\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x31\x37\x37\x2d\x30\x2e\x34\
\x38\x31\x2d\x30\x2e\x35\x33\x6c\x30\x2e\x34\x33\x34\x2d\x32\x2e\
\x34\x35\x38\x63\x30\x2e\x30\x34\x38\x2d\x30\x2e\x33\x35\x33\x2c\
\x30\x2e\x32\x36\x35\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x36\x35\x2d\
\x30\x2e\x35\x33\x68\x36\x2e\x31\x39\x32\x76\x2d\x32\x2e\x35\x33\
\x63\x30\x2d\x30\x2e\x33\x36\x39\x2c\x30\x2e\x31\x37\x37\x2d\x30\
\x2e\x35\x33\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x34\x38\x32\x0d\x0a\
\x09\x09\x6c\x32\x2e\x36\x37\x34\x2c\x30\x2e\x34\x35\x38\x63\x30\
\x2e\x33\x35\x34\x2c\x30\x2e\x30\x34\x38\x2c\x30\x2e\x35\x33\x2c\
\x30\x2e\x32\x35\x37\x2c\x30\x2e\x35\x33\x2c\x30\x2e\x36\x32\x36\
\x76\x31\x2e\x39\x32\x37\x68\x37\x2e\x30\x33\x36\x63\x30\x2e\x33\
\x36\x39\x2c\x30\x2c\x30\x2e\x35\x32\x39\x2c\x30\x2e\x31\x37\x37\
\x2c\x30\x2e\x34\x38\x31\x2c\x30\x2e\x35\x33\x6c\x2d\x30\x2e\x34\
\x35\x38\x2c\x32\x2e\x34\x35\x38\x0d\x0a\x09\x09\x63\x2d\x30\x2e\
\x30\x34\x38\x2c\x30\x2e\x33\x35\x34\x2d\x30\x2e\x32\x35\x37\x2c\
\x30\x2e\x35\x33\x2d\x30\x2e\x36\x32\x36\x2c\x30\x2e\x35\x33\x68\
\x2d\x36\x2e\x34\x33\x34\x76\x32\x2e\x37\x39\x35\x68\x38\x2e\x37\
\x34\x36\x43\x31\x30\x36\x2e\x39\x38\x39\x2c\x31\x35\x2e\x31\x30\
\x35\x2c\x31\x30\x37\x2e\x31\x34\x39\x2c\x31\x35\x2e\x32\x38\x32\
\x2c\x31\x30\x37\x2e\x31\x30\x32\x2c\x31\x35\x2e\x36\x33\x36\x7a\
\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\
\x3d\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x31\
\x31\x35\x2e\x31\x39\x37\x2c\x31\x31\x2e\x33\x37\x31\x63\x30\x2e\
\x33\x36\x39\x2c\x30\x2c\x30\x2e\x37\x30\x37\x2c\x30\x2e\x31\x30\
\x35\x2c\x31\x2e\x30\x31\x32\x2c\x30\x2e\x33\x31\x33\x6c\x31\x2e\
\x33\x30\x32\x2c\x30\x2e\x38\x39\x32\x63\x30\x2e\x33\x30\x35\x2c\
\x30\x2e\x32\x30\x39\x2c\x30\x2e\x34\x32\x35\x2c\x30\x2e\x35\x30\
\x36\x2c\x30\x2e\x33\x36\x31\x2c\x30\x2e\x38\x39\x31\x0d\x0a\x09\
\x09\x63\x2d\x30\x2e\x33\x37\x2c\x32\x2e\x35\x30\x36\x2d\x31\x2e\
\x31\x35\x36\x2c\x35\x2e\x30\x30\x34\x2d\x32\x2e\x33\x36\x31\x2c\
\x37\x2e\x34\x39\x34\x63\x2d\x31\x2e\x31\x38\x39\x2c\x32\x2e\x34\
\x37\x33\x2d\x32\x2e\x34\x39\x38\x2c\x34\x2e\x32\x35\x36\x2d\x33\
\x2e\x39\x32\x38\x2c\x35\x2e\x33\x34\x39\x63\x2d\x30\x2e\x32\x35\
\x37\x2c\x30\x2e\x32\x30\x38\x2d\x30\x2e\x34\x39\x38\x2c\x30\x2e\
\x31\x37\x37\x2d\x30\x2e\x37\x32\x33\x2d\x30\x2e\x30\x39\x37\x6c\
\x2d\x31\x2e\x37\x33\x34\x2d\x32\x2e\x31\x39\x32\x0d\x0a\x09\x09\
\x63\x2d\x30\x2e\x32\x32\x36\x2d\x30\x2e\x32\x37\x32\x2d\x30\x2e\
\x32\x30\x31\x2d\x30\x2e\x35\x32\x32\x2c\x30\x2e\x30\x37\x32\x2d\
\x30\x2e\x37\x34\x37\x63\x32\x2e\x30\x38\x38\x2d\x31\x2e\x34\x31\
\x33\x2c\x33\x2e\x35\x36\x35\x2d\x33\x2e\x38\x36\x33\x2c\x34\x2e\
\x34\x33\x33\x2d\x37\x2e\x33\x34\x39\x63\x30\x2e\x31\x36\x31\x2d\
\x30\x2e\x35\x39\x34\x2c\x30\x2e\x30\x30\x39\x2d\x30\x2e\x38\x39\
\x32\x2d\x30\x2e\x34\x35\x37\x2d\x30\x2e\x38\x39\x32\x68\x2d\x33\
\x2e\x33\x35\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x33\x36\x39\x2c\x30\
\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x31\x37\x37\x2d\x30\x2e\x34\x38\
\x31\x2d\x30\x2e\x35\x33\x6c\x30\x2e\x34\x35\x37\x2d\x32\x2e\x34\
\x38\x31\x63\x30\x2e\x30\x34\x39\x2d\x30\x2e\x33\x35\x33\x2c\x30\
\x2e\x32\x35\x37\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x36\x32\x37\x2d\
\x30\x2e\x35\x33\x4c\x31\x31\x35\x2e\x31\x39\x37\x2c\x31\x31\x2e\
\x33\x37\x31\x7a\x20\x4d\x31\x32\x36\x2e\x38\x31\x31\x2c\x31\x30\
\x2e\x31\x39\x0d\x0a\x09\x09\x63\x30\x2e\x32\x30\x39\x2d\x30\x2e\
\x32\x37\x33\x2c\x30\x2e\x34\x34\x32\x2d\x30\x2e\x32\x38\x31\x2c\
\x30\x2e\x36\x39\x39\x2d\x30\x2e\x30\x32\x34\x6c\x31\x2e\x39\x37\
\x36\x2c\x32\x63\x30\x2e\x32\x35\x37\x2c\x30\x2e\x32\x35\x37\x2c\
\x30\x2e\x32\x34\x31\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x30\x34\x38\
\x2c\x30\x2e\x38\x31\x39\x63\x2d\x31\x2e\x34\x33\x2c\x31\x2e\x33\
\x39\x37\x2d\x33\x2e\x30\x32\x31\x2c\x32\x2e\x37\x36\x33\x2d\x34\
\x2e\x37\x37\x31\x2c\x34\x2e\x30\x39\x36\x0d\x0a\x09\x09\x63\x31\
\x2e\x38\x36\x32\x2c\x32\x2e\x38\x34\x33\x2c\x34\x2e\x30\x38\x37\
\x2c\x34\x2e\x38\x32\x37\x2c\x36\x2e\x36\x37\x34\x2c\x35\x2e\x39\
\x35\x32\x63\x30\x2e\x33\x35\x33\x2c\x30\x2e\x31\x34\x35\x2c\x30\
\x2e\x34\x30\x31\x2c\x30\x2e\x33\x33\x37\x2c\x30\x2e\x31\x34\x35\
\x2c\x30\x2e\x35\x37\x38\x4c\x31\x32\x39\x2e\x31\x2c\x32\x35\x2e\
\x39\x63\x2d\x30\x2e\x32\x35\x37\x2c\x30\x2e\x32\x34\x2d\x30\x2e\
\x35\x33\x38\x2c\x30\x2e\x32\x36\x35\x2d\x30\x2e\x38\x34\x33\x2c\
\x30\x2e\x30\x37\x32\x0d\x0a\x09\x09\x63\x2d\x32\x2e\x32\x34\x39\
\x2d\x31\x2e\x31\x37\x33\x2d\x34\x2e\x32\x39\x37\x2d\x33\x2e\x34\
\x31\x34\x2d\x36\x2e\x31\x34\x35\x2d\x36\x2e\x37\x32\x33\x76\x35\
\x2e\x30\x31\x32\x63\x30\x2c\x30\x2e\x39\x39\x36\x2d\x30\x2e\x31\
\x30\x34\x2c\x31\x2e\x37\x36\x37\x2d\x30\x2e\x33\x31\x33\x2c\x32\
\x2e\x33\x31\x33\x63\x2d\x30\x2e\x32\x30\x38\x2c\x30\x2e\x35\x34\
\x36\x2d\x30\x2e\x35\x37\x38\x2c\x30\x2e\x39\x37\x32\x2d\x31\x2e\
\x31\x30\x37\x2c\x31\x2e\x32\x37\x37\x0d\x0a\x09\x09\x63\x2d\x30\
\x2e\x39\x33\x33\x2c\x30\x2e\x35\x32\x39\x2d\x32\x2e\x32\x35\x38\
\x2c\x30\x2e\x37\x38\x37\x2d\x33\x2e\x39\x37\x36\x2c\x30\x2e\x37\
\x37\x31\x63\x2d\x30\x2e\x34\x38\x32\x2c\x30\x2e\x30\x31\x36\x2d\
\x30\x2e\x37\x35\x36\x2d\x30\x2e\x31\x35\x33\x2d\x30\x2e\x38\x31\
\x39\x2d\x30\x2e\x35\x30\x36\x6c\x2d\x30\x2e\x36\x30\x33\x2d\x32\
\x2e\x38\x32\x63\x2d\x30\x2e\x30\x36\x34\x2d\x30\x2e\x33\x35\x33\
\x2c\x30\x2e\x30\x38\x2d\x30\x2e\x35\x32\x39\x2c\x30\x2e\x34\x33\
\x34\x2d\x30\x2e\x35\x32\x39\x0d\x0a\x09\x09\x63\x30\x2e\x31\x37\
\x37\x2c\x30\x2e\x30\x31\x36\x2c\x30\x2e\x38\x36\x37\x2c\x30\x2e\
\x30\x32\x33\x2c\x32\x2e\x30\x37\x32\x2c\x30\x2e\x30\x32\x33\x63\
\x30\x2e\x33\x38\x36\x2c\x30\x2c\x30\x2e\x35\x37\x38\x2d\x30\x2e\
\x31\x38\x34\x2c\x30\x2e\x35\x37\x38\x2d\x30\x2e\x35\x35\x34\x56\
\x36\x2e\x32\x38\x37\x63\x30\x2d\x30\x2e\x33\x37\x2c\x30\x2e\x31\
\x37\x37\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x34\
\x38\x32\x6c\x32\x2e\x36\x37\x34\x2c\x30\x2e\x34\x35\x38\x0d\x0a\
\x09\x09\x63\x30\x2e\x33\x35\x34\x2c\x30\x2e\x30\x34\x38\x2c\x30\
\x2e\x35\x33\x2c\x30\x2e\x32\x35\x37\x2c\x30\x2e\x35\x33\x2c\x30\
\x2e\x36\x32\x36\x76\x34\x2e\x37\x39\x35\x63\x30\x2e\x32\x34\x31\
\x2c\x30\x2e\x37\x35\x35\x2c\x30\x2e\x35\x37\x2c\x31\x2e\x36\x31\
\x34\x2c\x30\x2e\x39\x38\x38\x2c\x32\x2e\x35\x37\x38\x43\x31\x32\
\x34\x2e\x37\x33\x39\x2c\x31\x32\x2e\x37\x33\x36\x2c\x31\x32\x35\
\x2e\x39\x37\x36\x2c\x31\x31\x2e\x33\x37\x39\x2c\x31\x32\x36\x2e\
\x38\x31\x31\x2c\x31\x30\x2e\x31\x39\x7a\x22\x2f\x3e\x0d\x0a\x09\
\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x46\
\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x31\x34\x30\x2e\x38\x35\x38\
\x2c\x36\x2e\x35\x35\x32\x63\x30\x2e\x33\x30\x35\x2d\x30\x2e\x31\
\x34\x35\x2c\x30\x2e\x35\x36\x32\x2d\x30\x2e\x30\x37\x32\x2c\x30\
\x2e\x37\x37\x31\x2c\x30\x2e\x32\x31\x37\x6c\x31\x2e\x34\x39\x34\
\x2c\x32\x2e\x31\x39\x33\x63\x30\x2e\x32\x30\x39\x2c\x30\x2e\x32\
\x38\x39\x2c\x30\x2e\x31\x36\x2c\x30\x2e\x34\x38\x32\x2d\x30\x2e\
\x31\x34\x35\x2c\x30\x2e\x35\x37\x38\x0d\x0a\x09\x09\x63\x2d\x30\
\x2e\x39\x36\x34\x2c\x30\x2e\x33\x37\x2d\x32\x2e\x33\x36\x39\x2c\
\x30\x2e\x37\x36\x33\x2d\x34\x2e\x32\x31\x37\x2c\x31\x2e\x31\x38\
\x31\x63\x2d\x30\x2e\x36\x31\x2c\x30\x2e\x31\x32\x39\x2d\x30\x2e\
\x39\x31\x35\x2c\x30\x2e\x34\x32\x36\x2d\x30\x2e\x39\x31\x35\x2c\
\x30\x2e\x38\x39\x32\x76\x32\x2e\x30\x39\x36\x68\x34\x2e\x39\x31\
\x35\x63\x30\x2e\x33\x36\x39\x2c\x30\x2c\x30\x2e\x35\x32\x31\x2c\
\x30\x2e\x31\x37\x37\x2c\x30\x2e\x34\x35\x38\x2c\x30\x2e\x35\x33\
\x0d\x0a\x09\x09\x6c\x2d\x30\x2e\x34\x31\x2c\x32\x2e\x33\x31\x33\
\x63\x2d\x30\x2e\x30\x36\x34\x2c\x30\x2e\x33\x35\x34\x2d\x30\x2e\
\x32\x38\x31\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x36\x35\x2c\x30\x2e\
\x35\x33\x68\x2d\x34\x2e\x33\x31\x33\x76\x33\x2e\x36\x31\x34\x63\
\x30\x2c\x30\x2e\x34\x36\x37\x2c\x30\x2e\x32\x32\x35\x2c\x30\x2e\
\x36\x35\x38\x2c\x30\x2e\x36\x37\x35\x2c\x30\x2e\x35\x37\x38\x6c\
\x34\x2e\x32\x34\x2d\x30\x2e\x37\x37\x31\x0d\x0a\x09\x09\x63\x30\
\x2e\x33\x35\x34\x2d\x30\x2e\x30\x36\x33\x2c\x30\x2e\x34\x39\x38\
\x2c\x30\x2e\x30\x38\x31\x2c\x30\x2e\x34\x33\x34\x2c\x30\x2e\x34\
\x33\x35\x6c\x2d\x30\x2e\x34\x38\x31\x2c\x32\x2e\x34\x33\x34\x63\
\x2d\x30\x2e\x30\x36\x34\x2c\x30\x2e\x33\x35\x33\x2d\x30\x2e\x33\
\x34\x36\x2c\x30\x2e\x35\x37\x38\x2d\x30\x2e\x38\x34\x34\x2c\x30\
\x2e\x36\x37\x35\x63\x2d\x32\x2e\x32\x39\x37\x2c\x30\x2e\x34\x38\
\x31\x2d\x34\x2e\x30\x32\x33\x2c\x30\x2e\x38\x37\x35\x2d\x35\x2e\
\x31\x38\x31\x2c\x31\x2e\x31\x38\x0d\x0a\x09\x09\x63\x2d\x31\x2e\
\x31\x35\x36\x2c\x30\x2e\x32\x38\x39\x2d\x31\x2e\x38\x35\x34\x2c\
\x30\x2e\x35\x30\x36\x2d\x32\x2e\x30\x39\x36\x2c\x30\x2e\x36\x35\
\x63\x2d\x30\x2e\x32\x32\x36\x2c\x30\x2e\x31\x31\x33\x2d\x30\x2e\
\x33\x37\x2d\x30\x2e\x30\x30\x38\x2d\x30\x2e\x34\x33\x34\x2d\x30\
\x2e\x33\x36\x31\x6c\x2d\x30\x2e\x35\x35\x35\x2d\x33\x2e\x30\x31\
\x32\x63\x2d\x30\x2e\x30\x36\x34\x2d\x30\x2e\x33\x35\x33\x2c\x30\
\x2e\x30\x34\x39\x2d\x30\x2e\x36\x35\x38\x2c\x30\x2e\x33\x33\x38\
\x2d\x30\x2e\x39\x31\x35\x0d\x0a\x09\x09\x63\x30\x2e\x32\x32\x35\
\x2c\x30\x2e\x30\x39\x37\x2c\x30\x2e\x33\x33\x37\x2d\x30\x2e\x32\
\x34\x31\x2c\x30\x2e\x33\x33\x37\x2d\x31\x2e\x30\x31\x33\x56\x39\
\x2e\x38\x35\x33\x63\x30\x2d\x30\x2e\x38\x33\x35\x2c\x30\x2e\x34\
\x37\x34\x2d\x31\x2e\x33\x35\x37\x2c\x31\x2e\x34\x32\x32\x2d\x31\
\x2e\x35\x36\x36\x43\x31\x33\x37\x2e\x34\x36\x39\x2c\x37\x2e\x39\
\x30\x31\x2c\x31\x33\x39\x2e\x31\x38\x38\x2c\x37\x2e\x33\x32\x33\
\x2c\x31\x34\x30\x2e\x38\x35\x38\x2c\x36\x2e\x35\x35\x32\x7a\x0d\
\x0a\x09\x09\x20\x4d\x31\x35\x33\x2e\x33\x33\x39\x2c\x37\x2e\x33\
\x34\x37\x63\x30\x2e\x38\x38\x34\x2c\x30\x2c\x31\x2e\x33\x32\x35\
\x2c\x30\x2e\x34\x34\x32\x2c\x31\x2e\x33\x32\x35\x2c\x31\x2e\x33\
\x32\x35\x56\x32\x31\x2e\x34\x39\x63\x30\x2c\x31\x2e\x36\x35\x34\
\x2d\x30\x2e\x34\x31\x38\x2c\x32\x2e\x37\x33\x39\x2d\x31\x2e\x32\
\x35\x33\x2c\x33\x2e\x32\x35\x33\x63\x2d\x30\x2e\x37\x37\x31\x2c\
\x30\x2e\x34\x38\x31\x2d\x31\x2e\x37\x37\x34\x2c\x30\x2e\x37\x32\
\x34\x2d\x33\x2e\x30\x31\x32\x2c\x30\x2e\x37\x32\x34\x0d\x0a\x09\
\x09\x63\x2d\x30\x2e\x34\x38\x31\x2c\x30\x2d\x30\x2e\x37\x36\x33\
\x2d\x30\x2e\x31\x37\x38\x2d\x30\x2e\x38\x34\x33\x2d\x30\x2e\x35\
\x33\x31\x6c\x2d\x30\x2e\x35\x37\x38\x2d\x32\x2e\x36\x32\x36\x63\
\x2d\x30\x2e\x30\x38\x31\x2d\x30\x2e\x33\x35\x33\x2c\x30\x2e\x30\
\x35\x36\x2d\x30\x2e\x35\x32\x31\x2c\x30\x2e\x34\x30\x39\x2d\x30\
\x2e\x35\x30\x36\x63\x2d\x30\x2e\x30\x38\x2c\x30\x2c\x30\x2e\x33\
\x35\x34\x2c\x30\x2c\x31\x2e\x33\x30\x31\x2c\x30\x0d\x0a\x09\x09\
\x63\x30\x2e\x32\x38\x39\x2c\x30\x2c\x30\x2e\x34\x33\x34\x2d\x30\
\x2e\x31\x34\x35\x2c\x30\x2e\x34\x33\x34\x2d\x30\x2e\x34\x33\x34\
\x76\x2d\x39\x2e\x38\x35\x34\x63\x30\x2d\x30\x2e\x34\x36\x36\x2d\
\x30\x2e\x32\x33\x32\x2d\x30\x2e\x36\x39\x39\x2d\x30\x2e\x36\x39\
\x38\x2d\x30\x2e\x36\x39\x39\x68\x2d\x31\x2e\x37\x38\x33\x63\x2d\
\x30\x2e\x34\x36\x36\x2c\x30\x2d\x30\x2e\x36\x39\x38\x2c\x30\x2e\
\x32\x33\x33\x2d\x30\x2e\x36\x39\x38\x2c\x30\x2e\x36\x39\x39\x56\
\x32\x38\x2e\x30\x32\x0d\x0a\x09\x09\x63\x30\x2c\x30\x2e\x33\x37\
\x2d\x30\x2e\x31\x37\x38\x2c\x30\x2e\x35\x33\x31\x2d\x30\x2e\x35\
\x33\x2c\x30\x2e\x34\x38\x32\x6c\x2d\x32\x2e\x34\x38\x31\x2d\x30\
\x2e\x34\x35\x37\x63\x2d\x30\x2e\x33\x35\x34\x2d\x30\x2e\x30\x34\
\x39\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x32\x35\x38\x2d\x30\x2e\x35\
\x33\x2d\x30\x2e\x36\x32\x37\x56\x38\x2e\x36\x37\x32\x63\x30\x2d\
\x30\x2e\x38\x38\x33\x2c\x30\x2e\x34\x34\x31\x2d\x31\x2e\x33\x32\
\x35\x2c\x31\x2e\x33\x32\x35\x2d\x31\x2e\x33\x32\x35\x48\x31\x35\
\x33\x2e\x33\x33\x39\x7a\x22\x0d\x0a\x09\x09\x2f\x3e\x0d\x0a\x3c\
\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
\x00\x00\x02\x17\
\x00\
\x00\x07\x01\x78\x9c\xe5\x55\xcd\x8a\xdb\x30\x10\x7e\x95\x41\xb9\
\xec\x82\x63\xcb\x3f\xb2\xa2\x10\x07\xb6\x21\x39\xa5\xf4\xd0\x5b\
\x2f\xc5\xbb\x56\x6c\xb3\x8e\x1d\x6c\x25\xce\x3e\x44\xe9\xa9\xb7\
\xbe\x5e\xa1\x8f\xb1\x23\x39\xbb\x4d\x42\x02\x66\x61\x0f\x4b\x65\
\xf4\x33\x9a\x6f\x46\xf3\x7d\x12\x78\xd2\xec\x52\xd8\xaf\x8b\xb2\
\x89\x48\xa6\xd4\x66\xec\x38\x6d\xdb\xda\xad\x6f\x57\x75\xea\x78\
\x94\x52\x07\x11\xa4\x83\x8c\xf7\x45\x5e\x3e\x5e\x02\xba\x42\x08\
\xc7\x78\x09\xb4\x79\xa2\xb2\x88\x08\x4a\x09\x64\x32\x4f\x33\x15\
\x91\x50\x1b\xbb\x5c\xb6\x9f\xaa\x7d\x44\x28\x50\x40\x37\x98\xdd\
\x55\x5e\x14\x11\x29\xab\x52\x92\xe9\x24\x91\xab\x66\x3a\xa9\xe5\
\x83\x82\x3c\x89\xc8\x26\x56\xd9\x77\xc4\xe8\x18\x02\x4f\x66\xbc\
\x9a\xde\x99\x4e\x9c\x2e\x3e\x85\x6a\x13\x3f\xe4\x0a\x03\x5c\x02\
\xaa\x8e\xcb\x66\x55\xd5\xeb\x88\x98\x65\x11\x2b\x79\x83\x25\xdc\
\x02\xd4\x95\xea\x8c\x80\x51\xf0\x29\xbd\x25\x87\xc3\xbb\xa2\x06\
\x0b\xd3\xc8\xdb\xd3\xf5\xae\x7c\x1d\x37\x8f\x86\xf2\x7d\x3a\xd4\
\xeb\x17\x5d\xda\x2c\x57\x5a\x98\x6d\x23\xc1\xe8\x3b\xce\x6a\xb9\
\xc2\xd2\x0e\xd2\x20\x67\x74\xe1\xa8\x83\x34\x73\x3d\x47\x64\x5b\
\x17\x37\x83\x43\x2a\xac\x62\x3a\xd1\x70\x93\xff\xef\xcf\xdf\x7f\
\x7e\xfc\xea\xd2\x0f\xeb\x6d\x21\x23\x22\x77\xb2\xac\x92\x84\x40\
\xa3\x9e\xb4\xad\x5d\xe3\xc1\x9c\xe9\xef\x2a\x5f\xef\x84\xb0\x4b\
\x19\x78\x42\x13\x3e\x96\x0a\x8f\xfb\x4c\x2d\x36\xa2\x4b\xcf\xfd\
\x37\xd3\x65\xd7\xd1\xfe\x06\x86\xfc\xdb\xee\xcb\x35\xd7\xd5\x23\
\x96\xd9\xfe\x88\xb9\x21\x13\x82\xfb\xbe\xe0\x34\x94\x43\xd7\x3f\
\xcb\x17\x08\x5b\x1c\x35\x8e\xd9\x6d\x7a\xd2\x98\x3e\xed\x55\xc6\
\x59\xb5\xbe\xcf\x4b\x99\xc0\xd7\x2c\xde\xc8\x3e\x72\x06\xf3\xbb\
\xf9\xa2\x27\xbb\x5e\xd5\x5c\x90\xda\xa3\x4b\x7c\x5d\x2f\x53\x38\
\x33\x86\x1d\x0a\x18\x09\x6e\xfb\xae\x45\x71\x11\xa0\xf8\xa1\x45\
\x67\x7a\x1f\x37\x0e\x00\x44\x2f\x75\xe0\xe1\x46\x5e\x79\x7e\xd9\
\xc5\x45\x0f\x76\x0b\x81\xdf\xdd\x15\x76\x1c\xf8\x59\xf5\xc1\x31\
\x5b\xdf\x66\xd8\x03\x71\xd2\xc2\x0b\xfc\xb8\x85\xd0\x19\xb7\x5c\
\x9b\x71\x60\x76\xe0\x5b\x26\x18\xb9\xe8\x1d\xc3\xc5\xb8\xa8\xc1\
\xe1\x03\x43\x08\x18\x17\x37\x38\x3e\x33\x41\x58\x4e\xe7\x32\xf9\
\xde\x83\xb0\xfb\xdf\x31\xf6\x3e\x02\x63\x27\x3d\xeb\xf8\x67\x9b\
\x3e\x03\xf1\x7a\xec\xab\
"
qt_resource_name = b"\
\x00\x03\
\x00\x00\x70\x37\
\x00\x69\
\x00\x6d\x00\x67\
\x00\x13\
\x0a\x25\xf2\x27\
\x00\x6c\
\x00\x6f\x00\x67\x00\x6f\x00\x2d\x00\x68\x00\x6f\x00\x72\x00\x69\x00\x7a\x00\x6f\x00\x6e\x00\x74\x00\x61\x00\x6c\x00\x2e\x00\x73\
\x00\x76\x00\x67\
\x00\x06\
\x03\x32\x4a\x27\
\x80\xcc\
\x66\x6f\x00\x2e\x00\x73\x00\x76\x00\x67\
"
qt_resource_struct_v1 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
\x00\x00\x00\x38\x00\x01\x00\x00\x00\x01\x00\x00\x22\x42\
\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
"
qt_resource_struct_v2 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x38\x00\x01\x00\x00\x00\x01\x00\x00\x22\x42\
\x00\x00\x01\x7e\x9b\x06\x48\x80\
\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x7e\x9b\x58\x78\xfc\
"
qt_version = [int(v) for v in QtCore.qVersion().split('.')]
if qt_version < [5, 8, 0]:
rcc_version = 1
qt_resource_struct = qt_resource_struct_v1
else:
rcc_version = 2
qt_resource_struct = qt_resource_struct_v2
def qInitResources():
QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 JohnserfSeed
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

324
README-EN.md Normal file
View File

@@ -0,0 +1,324 @@
![Project Image](https://tvax2.sinaimg.cn/large/006908GAly1hgn9zod1yuj30zk0hstmf.jpg)
<h1 align="center">✨ TikTok Watermark-Free Video Downloader ✨</h1>
<div align="center">
[简体中文](README.md) | English
[![License: MIT](https://img.shields.io/github/license/johnserf-seed/tiktokdownload?style=for-the-badge)](https://github.com/Johnserf-Seed/TikTokDownload/blob/main/LICENSE)
![Release Download](https://img.shields.io/github/downloads/Johnserf-Seed/TikTokDownload/total?style=for-the-badge)
![GitHub Repo size](https://img.shields.io/github/repo-size/Johnserf-Seed/TikTokDownload?style=for-the-badge&color=3cb371)
[![GitHub Repo Languages](https://img.shields.io/github/languages/top/Johnserf-Seed/TikTokDownload?style=for-the-badge)](https://github.com/BeyondDimension/SteamTools/search?l=c%23)
[![Python v3.11.1](https://img.shields.io/badge/python-v3.11.1-orange?style=for-the-badge)](https://github.com/Johnserf-Seed/TikTokDownload)
![Terminal: wt](https://img.shields.io/badge/Terminal-wt-blue?style=for-the-badge)
[![GitHub Stars](https://img.shields.io/github/stars/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
[![GitHub Forks](https://img.shields.io/github/forks/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
[![GitHub Issues](https://img.shields.io/github/issues/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
[![GitHub Closed Issues](https://img.shields.io/github/issues-closed/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
[![jsDelivr monthly hits](https://data.jsdelivr.com/v1/package/gh/Johnserf-Seed/TikTokDownload/badge)](https://www.jsdelivr.com/package/gh/Johnserf-Seed/TikTokDownload)
[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FJohnserf-Seed%2FTikTokDownload&count_bg=%235FFFFF&title_bg=%23FB1953&icon=tiktok.svg&icon_color=%23250C1F&title=view&edge_flat=false)](https://hits.seeyoufarm.com)
[![Discord](https://img.shields.io/discord/1070512513889878067?color=5865F2&logo=discord&logoColor=white?style=for-the-badge)](https://discord.gg/q3hA8qQZbG)
[![Patreon](https://img.shields.io/badge/Patreon-TikTokDownload-red.svg?style=flat&logo=patreon)](https://www.patreon.com/TikTokDownload713)
</div>
## 🚀 Environmental Preparation/Environment
> [![Microsoft App Store](https://tvax1.sinaimg.cn/large/006908GAly1hgn87jhad8j305001qa9y.jpg)](https://aka.ms/terminal)
>
> The old console doesn't adapt well; using Windows Terminal is recommended.
>
> [![Python v3.11.1](https://www.python.org/static/img/python-logo.png)](https://www.python.org/ftp/python/3.11.1/python-3.11.1-amd64.exe)
>
> Unexpected errors might arise with versions below Python3.11.1.
>
> [![GitHub Release Version](https://tvax2.sinaimg.cn/large/006908GAly1hh16psn51aj30a5020gly.jpg)](https://github.com/Johnserf-Seed/TikTokDownload/releases)
>
> Download the release version. It gets repackaged after every commit.
<details><summary> ⚙ Windows Terminal Settings (Must-read) </summary>
![wt configuration](https://github.com/Johnserf-Seed/TikTokDownload/assets/40727745/997b6fc2-586e-4268-bee8-43bb8d68622c)
</details>
## 🧰 Features
- DouYin API Information:
- ✅ Detailed user information.
- ✅ Download published content.
- ✅ Download favorite content.
- ✅ Download liked content.
- ✅ Download picture sets.
- ✅ Download cover images of the content.
- ✅ Download content description.
- ✅ Download original sound.
- ✅ Extract live stream links.
- ⌛ Download content from following.
- ⌛ Download content from friends.
- ⌛ Download recommended content.
- ❌ Download collection content.
- ❌ Extract comments.
- Asynchronous Downloads:
- ✅ Download and process multiple content simultaneously to enhance efficiency.
- ✅ Adjust asynchronous threads to reduce system pressure and reduce API errors.
- ✅ Adjust network concurrency to reduce server verification.
- Cookie Management:
- ✅ Generate the cookie value needed for the web, facilitating the access of login-required APIs.
- ✅ Handle SetCookie.
- Configuration Operations:
- ✅ URL shortening and parsing.
- ✅ Custom save directory.
- ✅ Option to download original sound.
- ✅ Option for automatic updates.
- ✅ Specify download time interval.
- ❌ Set download content likes threshold.
- ❌ Set download content play threshold.
- Version Updates:
- ✅ Features to automatically check and download new versions.
- File Checking:
- ✅ Check if a file exists before downloading to avoid redundancy.
- Command Line Interaction:
- ✅ Provide command line options and global headers for easy operation.
- ⌛ Provide web UI mode.
- Scan Code to Login:
- ✅ Feature for scan code login, no manual cookie entry required.
- Automatic Renaming:
- ✅ Use a nickname mapping table to ensure content from renamed authors isn't downloaded again.
- ⌛ Use content description mapping table to ensure content with edited descriptions isn't downloaded again.
- Local Encrypted Parameter Call:
- ✅ XBogus
- ✅ verifyFp
- ✅ s_v_web_id
- ✅ ttwid
- ✅ x-tt-params
- 🔘 msToken
## 💡 To Do
- Adapt for TikTok.
- Set up automation tasks.
- Multi-user parsing.
- [For more, check the project board](https://github.com/users/Johnserf-Seed/projects/1/views/1)
## 🖥 Supported Operating Systems
<details>
<summary> List of Operating Systems supported by version 1.5.0.0 </summary>
- Windows 11
- Windows 10 Version 1809 (OS Build 17763) or later
- macOS Monterey (12.0) or later
- macOS Big Sur (11.0) or later
- macOS Catalina (10.15) or later
- Ubuntu 20.04 LTS or later
- Debian 10 or later
- CentOS 7 or later
- Fedora 34 or later
- Deepin (UOS) 20 or later
</details>
## 📸 Running Process
<details>
<summary> 🎬 Running without configuration file and scan code login </summary>
https://user-images.githubusercontent.com/40727745/fc1e6c46-d0c3-4f2a-a4a5-ca3d781e7d11
</details>
<details>
<summary> 🎬 Downloading from the homepage </summary>
https://user-images.githubusercontent.com/40727745/12c21d55-b629-485a-b904-54d86341c371
</details>
## 📥 Installation and Running
1. **📦 Installation**
```bash
python -m venv venv
.\venv\Scripts\activate
pip install -r requirements.txt
```
2. **▶️ Running**
```python
import Util
if __name__ == '__main__':
# Get command line and configuration file
cmd = Util.Command()
config = cmd.config_dict
dyheaders = cmd.dyheaders
# Asynchronously download content
Util.asyncio.run(Util.Profile(config, dyheaders).get_Profile())
input("[ Prompt ]: Download completed, press any key to exit.")
```
3. **🔬 Test**
```bash
python example.py
```
## 🗂️ Folder
<details>
<summary>📁 directory</summary>
```bash
├─ .github
│ └─ ISSUE_TEMPLATE
│ ├── --------.md
│ └── -------.md
├─ API
│ ├── API.js
│ ├── API参考.md
│ ├── Server.txt
│ ├── TikTokAPI.py
│ ├── TikTokDownloadVersion.txt
│ ├── TikTokGUIVersion.txt
│ ├── TikTokLive.txt
│ ├── TikTokMultiVersion.txt
│ ├── TikTokPicVersion.txt
│ ├── TikTokTool.txt
│ ├── TikTokUpdata.txt
│ ├── user_base_info.json
│ ├── user_post_delete.json
│ ├── user_post_detail.json
│ ├── user_post_info_image.json
│ ├── user_post_info_video.json
│ └── user_profile_info.json
├─ Collection
│ ├── CopyWritingHomePage_1.json
│ ├── GirlHomePage_1.json
│ └── MusicHomePage_1.json
├─ DB
│ └── create.sql
├─ GUI
│ ├── Main.ui
│ ├── preview.png
│ ├── README-EN.md
│ ├── README.md
│ ├── requirements.txt
│ ├── resource.py
│ └── Resource.qrc
└─ Util
├── Check.py
├── Command.py
├── Config.py
├── Cookies.py
├── Download.py
├── Lives.py
├── Log.py
├── Login.py
├── NickMapper.py
├── Profile.py
├── Resource.py
├── Urls.py
├── XB.py
├── __init__.py
├── __version__.py
└─ algorithm
├── package.json
├── Server.py
├── s_v_web_id.js
├── s_v_web_id.py
├── x-bogus.js
└── x-tt-params.js
├─ .gitignore
├─ Banner.png
├─ build-win.bat
├─ conf.conf
├─ conf.ini
├─ Dockerfile
├─ example.py
├─ info.db
├─ LICENSE
├─ Logo.ico
├─ README-EN.md
├─ README.md
├─ requirements.txt
├─ server.bat
├─ server.sh
├─ TikTokLive.py
├─ TikTokMultiGUI.py
├─ TikTokTool.py
├─ TikTokUpdata.py
├─ version
└─ _config.yml
```
</details>
## 💖 Sponsorship
![Sponsorship Image](https://user-images.githubusercontent.com/40727745/217866800-23980dc1-f3ce-4bc7-b192-518651fef8da.png)
Thank you for supporting this project! If you find this project helpful, please consider sponsoring. You can directly visit our [![Patreon](https://img.shields.io/badge/Patreon-TikTokDownload-red.svg?style=flat&logo=patreon)](https://www.patreon.com/TikTokDownload713)
## 📧 Contact
If you have any questions or suggestions, you can contact me via email:
- Email: [johnserf-seed@foxmail.com](mailto:johnserf-seed@foxmail.com)
## 🙏 Acknowledgments
- [Windows Terminal](https://aka.ms/terminal)
- [aiohttp](https://github.com/aio-libs/aiohttp)
- [requests](https://github.com/psf/requests)
- [Pillow (PIL Fork)](https://github.com/python-pillow/Pillow)
- [lxml](https://github.com/lxml/lxml)
- [rich](https://github.com/willmcgugan/rich)
- [qrcode](https://github.com/lincolnloop/python-qrcode)
- [ConfigObj](https://github.com/DiffSK/configobj)
We genuinely appreciate their contributions and efforts.
## ⚖️ Disclaimer
This project does not sell, share, encrypt, upload, or study any personal information. This project and its associated code are for learning and research purposes only and do not constitute any explicit or implicit warranty. The author assumes no responsibility for any form of loss caused by the use of this project and its code.
## 📜 License Statement
MIT License
Copyright (c) 2021 JohnserfSeed
The source code of this project is licensed under the MIT License. For detailed information, please refer to the [LICENSE](LICENSE) file.
## 📝 Contributor Code of Conduct
All contributors are welcome to this project. We hope to create a friendly environment where everyone can work together in an atmosphere of respect and understanding. Please review our [Contributor Code of Conduct](CODE_OF_CONDUCT.md) before participating.
## 👨‍💻 Contributors
We welcome all kinds of contributions, be it error reporting, improvement suggestions, or provision of code and documentation. We appreciate your help.
![Contributors](https://contributors-img.web.app/image?repo=Johnserf-Seed/TikTokDownload)

370
README.md Normal file
View File

@@ -0,0 +1,370 @@
![项目图](https://tvax2.sinaimg.cn/large/006908GAly1hgn9zod1yuj30zk0hstmf.jpg)
<h1 align="center">✨ 抖音去水印作品下载 ✨</h1>
<div align="center">
[English](README-EN.md) | 简体中文
[![License: MIT](https://img.shields.io/github/license/johnserf-seed/tiktokdownload?style=for-the-badge)](https://github.com/Johnserf-Seed/TikTokDownload/blob/main/LICENSE)
![Release Download](https://img.shields.io/github/downloads/Johnserf-Seed/TikTokDownload/total?style=for-the-badge)
![GitHub Repo size](https://img.shields.io/github/repo-size/Johnserf-Seed/TikTokDownload?style=for-the-badge&color=3cb371)
[![GitHub Repo Languages](https://img.shields.io/github/languages/top/Johnserf-Seed/TikTokDownload?style=for-the-badge)](https://github.com/BeyondDimension/SteamTools/search?l=c%23)
[![Python v3.11.1](https://img.shields.io/badge/python-v3.11.1-orange?style=for-the-badge)](https://github.com/Johnserf-Seed/TikTokDownload)
![Terminal: wt](https://img.shields.io/badge/Terminal-wt-blue?style=for-the-badge)
[![GitHub Stars](https://img.shields.io/github/stars/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
[![GitHub Forks](https://img.shields.io/github/forks/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
[![GitHub Issues](https://img.shields.io/github/issues/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
[![GitHub Closed Issues](https://img.shields.io/github/issues-closed/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
[![F2 Downloads](https://pepy.tech/badge/f2/month)](https://pepy.tech/project/f2)
[![PyPI version](https://badge.fury.io/py/f2.svg)](https://badge.fury.io/py/f2)
[![jsDelivr monthly hits](https://data.jsdelivr.com/v1/package/gh/Johnserf-Seed/TikTokDownload/badge)](https://www.jsdelivr.com/package/gh/Johnserf-Seed/TikTokDownload)
[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FJohnserf-Seed%2FTikTokDownload&count_bg=%235FFFFF&title_bg=%23FB1953&icon=tiktok.svg&icon_color=%23250C1F&title=view&edge_flat=false)](https://hits.seeyoufarm.com)
[![TikHub](https://img.shields.io/badge/%E8%B5%9E%E5%8A%A9%E5%95%86-TikHub-orange?style=flat-square&logo=tiktok)](https://beta-web.tikhub.io/users/signup?referral_code=6hLcGD94)
[![Discord](https://img.shields.io/discord/1146473603450282004?color=5865F2&logo=discord&logoColor=white?style=for-the-badge)](https://discord.gg/3PhtPmgHf8)
[![Patreon](https://img.shields.io/badge/Patreon-TikTokDownload-red.svg?style=flat&logo=patreon)](https://www.patreon.com/TikTokDownload713)
</div>
## 🚀 环境准备/Environment
> [![Microsoft 应用商店](https://tvax1.sinaimg.cn/large/006908GAly1hgn87jhad8j305001qa9y.jpg)](https://aka.ms/terminal)
>
> 旧的控制台无法很好适配推荐使用Windows Terminal。
>
> [![Python v3.11.1](https://www.python.org/static/img/python-logo.png)](https://www.python.org/ftp/python/3.11.1/python-3.11.1-amd64.exe)
>
> Python3.11.1 低于该版本可能会有意外的错误
>
> [![GitHub 发行版](https://tvax2.sinaimg.cn/large/006908GAly1hh16psn51aj30a5020gly.jpg)](https://github.com/Johnserf-Seed/TikTokDownload/releases/tag/v1.4.2.2)
>
> 更新F2前的最后一个发行版下载
<details><summary> ⚙ Windows Terminal 设置(必看) </summary>
![wt配置](https://github.com/Johnserf-Seed/TikTokDownload/assets/40727745/997b6fc2-586e-4268-bee8-43bb8d68622c)
</details>
## 🧰 功能/Features
- DouYin 接口全新Abogus
- ✅ 用户信息。
- ✅ 查询用户信息。
- ✅ 下载发布作品。
- ✅ 下载收藏作品。
- ✅ 下载收藏原声。
- ✅ 下载喜欢作品。
- ✅ 下载图集作品。
- ✅ 下载短剧作品。
- ✅ 下载作品封面。
- ✅ 下载作品文案。
- ✅ 下载作品原声。
- ✅ 下载直播。
- ✅ 下载合集作品。
- ⌛ 下载关注作品。
- ✅ 关注用户信息。
- ✅ 粉丝用户信息。
- ✅ 下载好友作品。
- ✅ 下载首页推荐作品。
- ✅ 下载相关推荐作品。
- ⌛ 提取评论。
- ✅ 详细直播间信息。
- ✅ 关注用户开播状态。
- ✅ 直播间弹幕负载数据。
- ✅ 直播间弹幕采集。
- ✅ 详细用户信息。
- TikTok 接口
- ✅ 下载发布作品。
- ✅ 下载收藏作品。
- ✅ 下载喜欢作品。
- ✅ 下载图集作品。
- ✅ 下载作品封面。
- ✅ 下载作品文案。
- ✅ 下载作品原声。
- ✅ 下载播放列表。
- ✅ 下载合集作品。
- ✅ 下载搜索作品。
- ⌛ 下载关注作品。
- ⌛ 下载好友作品。
- ⌛ 下载推荐作品。
- ⌛ 下载相关推荐作品。
- ⌛ 提取评论。
- ✅ 详细直播间信息。
- ✅ 直播间开播状态。
- ⌛ 直播间弹幕发言。
- ✅ 详细用户信息。
- 更多接口,请查阅 [「F2开发者接口」](https://johnserf-seed.github.io/f2/guide/apps/douyin/)
- 异步下载
- ✅ 同时处理和下载多个作品,提高效率。
- ✅ 异步线程,减轻系统压力减少接口出错。
- ✅ 网络并发数,减少被服务器校验。
- ✅ 超时重试设置,降低采集错误率。
- Cookie
- ✅ 使用--auto-cookie自动从浏览器获取cookie。
- 接口数据模型
- ✅ 开箱即用的接口参数配置,提供完整参数生成。
- 请查阅[「使用接口模型生成XB参数」](https://johnserf-seed.github.io/f2/guide/apps/douyin/#%E4%BD%BF%E7%94%A8%E6%8E%A5%E5%8F%A3%E6%A8%A1%E5%9E%8B%E7%94%9F%E6%88%90xb%E5%8F%82%E6%95%B0-%F0%9F%9F%A2)
- 请查阅[「使用接口模型生成AB参数」](https://johnserf-seed.github.io/f2/guide/apps/douyin/#%E4%BD%BF%E7%94%A8%E6%8E%A5%E5%8F%A3%E6%A8%A1%E5%9E%8B%E7%94%9F%E6%88%90ab%E5%8F%82%E6%95%B0-%F0%9F%9F%A2)
- 接口数据过滤器
- ✅ 通过过滤接口数据,提高采集与数据处理效率。
- 请查阅[「过滤器采集数据」](https://johnserf-seed.github.io/f2/guide/apps/douyin/#%E4%BD%BF%E7%94%A8%E6%8E%A5%E5%8F%A3%E6%A8%A1%E5%9E%8B%E7%94%9F%E6%88%90xb%E5%8F%82%E6%95%B0-%F0%9F%9F%A2)
- 更多功能
- ✅ 长短链解析。
- ✅ 自定义保存目录。
- ✅ 是否下载原声。
- ✅ 是否下载封面。
- ✅ 是否下载文案。
- ✅ 单次下载作品数量。
- ✅ 单次返回作品数量。
- ✅ 自定义文件名模板。
- ✅ 代理设置。
- ✅ 指定下载时间区间。
- ✅ 提取单个/列表用户id。
- ✅ 提取单个/列表作品id。
- ✅ 提取单个/列表合集id。
- ✅ 提取单个/列表直播间rid。
- ✅ 原声json歌词转lrc歌词。
- ⌛ 设定下载作品点赞阈值。
- ⌛ 设定下载作品播放阈值。
- 更多配置文件操作,请查阅[「F2配置文件」](https://johnserf-seed.github.io/f2/site-config.html)
- 多用户配置
- ✅ 对不同用户建立不同配置与不同的下载模式。
- ✅ 灵活的cli模式方便用户快速切换配置。
- ⌛ 灵活的webui模式方便用户快速切换配置。
- 版本更新
- ✅ 全新开发 F2 依赖pip进行升级
- ✅ 自动检查 pypi 上的最新版本
- 文件检查
- ✅ 下载文件前检查文件是否已经存在,避免重复下载。
- ⌛ 添加”黑名单“,不检查这些作品是否存在。
- 命令行交互
- ✅ 提供cli模式与开发者模式
- ⌛ 提供webui模式
- ⌛ 提供本地接口转发,方便部署调用。
- 自动重命名
- ✅ 无需关心用户是否改名,从而造成重复下载。
- ⌛ 无需关心作品是否改文案,从而造成重复下载。
- 本地加密参数调用
- ✅ ABogus(dy)
- ✅ XBogus(dy、tk)
- ✅ verifyFp(dy)
- ✅ s_v_web_id(dy)
- ✅ ttwid(dy、tk)
- ✅ web_id(dy)
- ✅ _signature(dy)
- ✅ x-tt-params(tk)
- ✅ msToken(dy、tk)
- ✅ odin_tt(tk)
- ✅ device_Id(tk)
## 💡 待办/ToDo
- 创建自动化任务
- [更多请查看项目板](https://github.com/users/Johnserf-Seed/projects/1/views/1)
## 🖥 支持的操作系统/Supported Operating Systems
<details>
<summary> TikTokDownload 1.6 / F2 0.0.1.6-pw2 支持的操作系统列表 </summary>
- Windows 11
- Windows 10 版本 1809OS 内部版本 17763或更高版本
- macOS Monterey12.0)或更高版本
- macOS Big Sur11.0)或更高版本
- macOS Catalina10.15)或更高版本
- Ubuntu 20.04 LTS 或更高版本
- Debian 10 或更高版本
- CentOS 7 或更高版本
- Fedora 34 或更高版本
- Deepin (UOS) 20 或更高版本
</details>
## 📥 安装与运行/Installation and Running
1. **📦 安装/Installation**
请查阅 [「安装」](https://johnserf-seed.github.io/f2/install.html)
2. **▶️ 运行/Running**
请查阅 [「配置文件」](https://johnserf-seed.github.io/f2/install.html)
3. **🔬 测试/Test**
在 F2 安装目录打开终端运行,如果配置正确那么你不会看见报错。
```bash
python -m pytest
```
## 📸 运行过程/Running Process
<details>
<summary> 🎬 无配置文件扫码登录 </summary>
https://user-images.githubusercontent.com/40727745/fc1e6c46-d0c3-4f2a-a4a5-ca3d781e7d11
</details>
<details>
<summary> 🎬 主页作品下载 </summary>
https://user-images.githubusercontent.com/40727745/12c21d55-b629-485a-b904-54d86341c371
</details>
更多运行过程请查阅 [「F2 readme」](https://github.com/Johnserf-Seed/f2/blob/main/README.md)
## 🗂️ 项目结构/Folder
<details>
<summary>📁 目录</summary>
```bash
├─ .github
│ └─ ISSUE_TEMPLATE
│ ├── --------.md
│ └── -------.md
├─ API
│ ├── TikTokTool.txt
│ ├── user_base_info.json
│ ├── user_post_delete.json
│ ├── user_post_detail.json
│ ├── user_post_info_image.json
│ ├── user_post_info_video.json
│ └── user_profile_info.json
├─ GUI(待重构)
│ ├── Main.ui
│ ├── preview.png
│ ├── README-EN.md
│ ├── README.md
│ ├── requirements.txt
│ ├── resource.py
│ └── Resource.qrc
└─ Server
└─ algorithm
├── build-win.bat
├── package.json
├── requirements.txt
├── Server.py
├── Server.txt
├── s_v_web_id.js
├── s_v_web_id.py
├── x-bogus.js
└── x-tt-params.js
├─ .gitignore
├─ Banner.png
├─ build-win.bat
├─ Dockerfile
├─ LICENSE
├─ f2-logo.ico
├─ README-EN.md
├─ README.md
├─ requirements.txt
├─ run-server.bat
├─ run-server.sh
├─ TikTokTool.py
├─ version
└─ _config.yml
```
</details>
## 💖 赞赏/Sponsor
<a href="https://tikhub.io/"><img style="border-radius:20px" src="https://github.com/Johnserf-Seed/f2/assets/40727745/70a67dd1-dccb-44a9-b635-c29a950f1daf"></a>
[TikHub](https://tikhub.io/) 是一家提供优质数据接口服务的供应商。通过每日签到,可以获取免费额度。可以使用我的注册邀请链接:[https://beta-web.tikhub.io/users/signup?referral_code=6hLcGD94](https://beta-web.tikhub.io/users/signup?referral_code=6hLcGD94) 或 邀请码:`6hLcGD94`,注册并充值即可获得`$2`额度。
[TikHub](https://tikhub.io/) 提供以下服务:
- 丰富的数据接口
- 每日签到免费获取额度
- 高质量的API服务
- 官网https://tikhub.io/
- 项目地址https://github.com/TikHubIO/
![赞赏](https://user-images.githubusercontent.com/40727745/217866800-23980dc1-f3ce-4bc7-b192-518651fef8da.png)
感谢对本项目的支持!如果您觉得这个项目有帮助,欢迎赞助。您可以直接访问我们的 [![Patreon](https://img.shields.io/badge/Patreon-F2-red.svg?style=flat&logo=patreon)](https://www.patreon.com/F2_pypi)
## 📧 联系/Contact
如果有任何问题或者建议,可以通过邮箱联系我:
- 邮箱:[johnserf-seed@foxmail.com](mailto:johnserf-seed@foxmail.com)
## 🙏 鸣谢/Acknowledgments
- [Windows Terminal](https://aka.ms/terminal)
- [Python](https://www.python.org/)
- [httpx](https://github.com/encode/httpx)
- [click](https://github.com/pallets/click)
- [aiofiles](https://github.com/Tinche/aiofiles)
- [aiosqlite](https://github.com/omnilib/aiosqlite)
- [rich](https://github.com/willmcgugan/rich)
- [qrcode](https://github.com/lincolnloop/python-qrcode)
- [pyyaml](hhttps://github.com/yaml/pyyaml)
- [jsonpath-ng](https://github.com/h2non/jsonpath-ng)
- [m3u8](https://github.com/globocom/m3u8)
- [pytest](https://github.com/pytest-dev/pytest)
对于他们的贡献和努力,表示由衷的感谢。
## ⚖️ 免责声明/Disclaimer
此项目不出售、共享、加密、上传、研究任何个人信息。此项目及其相关代码仅供学习与研究使用,不构成任何明示或暗示的保证。使用者因使用此项目及其代码可能造成的任何形式的损失,作者不承担任何责任。
## 📜 版权声明/LICENSE
MIT License
Copyright (c) 2021 JohnserfSeed
此项目的源代码在 MIT 许可证下授权,有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 📝 贡献者守则/CoC
此项目欢迎所有的贡献者。我们希望能够创建一个友好的环境,让每个人都能在尊重和理解的氛围中共同工作。在参与贡献之前,请参阅我们的 [贡献者守则](CODE_OF_CONDUCT.md)。
## 👨‍💻贡献者/Contributors
我们欢迎任何形式的贡献,无论是提交错误报告,提出改进意见,或者是提供代码和文档。我们都欣赏你的帮助。
![Contributors](https://contributors-img.web.app/image?repo=Johnserf-Seed/TikTokDownload)

197
Server/Server.py Normal file
View File

@@ -0,0 +1,197 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@Description:Server.py
@Date :2023/02/25 17:03:32
@Author :JohnserfSeed
@version :0.0.1
@License :MIT License
@Github :https://github.com/johnserf-seed
@Mail :johnserf-seed@foxmail.com
-------------------------------------------------
Change Log :
2023/02/25 17:03:32 - Create Flask Server XB Gen
2023/08/03 16:48:34 - Fix ttwid
-------------------------------------------------
'''
import time
import execjs
# import sqlite3
import requests
from flask import Flask
from flask import request
from flask import jsonify
# from flask import make_response
# from flask import render_template
from urllib.parse import urlencode
from urllib.parse import unquote
from urllib.parse import parse_qsl
class Server:
def __init__(self) -> None:
# 工厂模式
self.app = Flask(__name__)
self.app.config.from_mapping(
SECRET_KEY='douyin-xbogus'
)
self.app.config['JSON_AS_ASCII'] = False
with open("x-bogus.js", "r", encoding="utf-8") as fp:
self.xbogust_func = execjs.compile(fp.read())
with open("x-tt-params.js", "r", encoding="utf-8") as fp:
self.xttm_func = execjs.compile(fp.read())
self.ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
# 获取xg参数
def getXG(self, url_path, params):
xbogus = self.xbogust_func.call("getXB", url_path)
# 字典中添加xg
params["X-Bogus"] = xbogus
tips = {
"status_code": "200",
"time": {
"strftime": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"timestamp": int(round(time.time() * 1000))
},
"result": [{
"params": params,
"paramsencode": urlencode(params, safe="="),
"user-agent": self.ua,
"X-Bogus": {
0: xbogus,
1: "X-Bogus=%s" % xbogus
}
}]
}
print(tips)
return jsonify(tips)
# 生成x-tt-params
def getxttparams(self, url_path):
xttp = self.xttm_func.call("getXTTP", url_path)
tips = {
"status_code": "200",
"time": {
"strftime": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"timestamp": int(round(time.time() * 1000))
},
"result": [{
"headers": {
"user-agent": self.ua,
"x-tt-params": xttp
}
}]
}
print(tips)
return jsonify(tips)
def gen_ttwid(self) -> str:
"""生成请求必带的ttwid
param :None
return:ttwid
"""
url = 'https://ttwid.bytedance.com/ttwid/union/register/'
data = '{"region":"cn","aid":1768,"needFid":false,"service":"www.ixigua.com","migrate_info":{"ticket":"","source":"node"},"cbUrlProtocol":"https","union":true}'
response = requests.request("POST", url, data=data)
# j = ttwid k = 1%7CfPx9ZM.....
for j, k in response.cookies.items():
tips = {
"status_code": "200",
"time": {
"strftime": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"timestamp": int(round(time.time() * 1000))
},
"result": [{
"headers": {
"user-agent": self.ua,
"cookie": "ttwid=%s;" % k
}
}]
}
print(tips)
return jsonify(tips)
if __name__ == "__main__":
server = Server()
# 首页
@server.app.route('/', methods=['GET', 'POST'])
def index():
tips = {
"status_code": "-1",
"time": {
"strftime": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"timestamp": int(round(time.time() * 1000))
},
"path": {
0: "/xg/path/?url=",
2: "/x-tt-params/path"
}
}
print(tips)
return jsonify(tips)
# xg参数
@server.app.route('/xg/path/', methods=['GET', 'POST'])
def xgpath():
path = request.args.get('url', '')
# 如果str路径为空
if not path:
tips = {
"status_code": "-3",
"time": {
"strftime": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"timestamp": int(round(time.time() * 1000))
},
"message": {
0: "The key url cannot be empty and the need for url encoding, The '&' sign needs to be escaped to '%26', Use urllib.parse.quote(url) to escape. Example:/xg/path/?url=aid=6383%26sec_user_id=xxx%26max_cursor=0%26count=10",
1: "url参数不能为空且需要注意传入值中的“&”需要转义成“%26”使用urllib.parse.quote(url)转义. 例如:/xg/path/?url=aid=6383%26sec_user_id=xxx%26max_cursor=0%26count=10"
}
}
print(tips)
return jsonify(tips)
else:
# url转字典
params = dict(parse_qsl(path))
# 字典转url
url_path = urlencode(params, safe="=")
return server.getXG(url_path, params)
# x-tt-params参数
@server.app.route('/x-tt-params/path', methods=['GET', 'POST'])
def xttppath():
try:
path = request.json
except:
pass
if not path:
tips = {
"status_code": "-5",
"time": {
"strftime": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"timestamp": int(round(time.time() * 1000))
},
"message": {
0: "Body uses raw JSON format to pass dictionary parameters, such as %s" % '{"aid": 1988,"app_name": "tiktok_web","channel": "tiktok_web".........}',
1: "body中使用raw json格式传递字典参数%s" % '{"aid": 1988,"app_name": "tiktok_web","channel": "tiktok_web".........}'
}
}
print(tips)
return jsonify(tips)
else:
return server.getxttparams(path)
# ttwid
@server.app.route('/xg/ttwid', methods=['GET', 'POST'])
def ttwid():
return server.gen_ttwid()
server.app.run(host='0.0.0.0',port='8889')

41
Server/Server.txt Normal file
View File

@@ -0,0 +1,41 @@
# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(
ffi=FixedFileInfo(
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
# Set not needed items to zero 0.
filevers=(1, 4, 2, 2),
prodvers=(1, 4, 2, 2),
# Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file.
flags=0x0,
# The operating system for which this file was designed.
# 0x4 - NT and there is no need to change it.
OS=0x40004,
# The general type of file.
# 0x1 - the file is an application.
fileType=0x1,
# The function of the file.
# 0x0 - the function is not defined for this fileType
subtype=0x0,
# Creation date and time stamp.
date=(0, 0)
),
kids=[
StringFileInfo(
[
StringTable(
u'080404b0',
[StringStruct(u'CompanyName', u'JohnserfSeed'),
StringStruct(u'FileDescription', u'本地解析服务'),
StringStruct(u'FileVersion', u'1.5.0.0'),
StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2023 JohnserfSeed. All Rights Reserved'),
StringStruct(u'ProductName', u'本地解析服务'),
StringStruct(u'ProductVersion', u'1.5.0.0')])
]),
VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
]
)

9
Server/build-win.bat Normal file
View File

@@ -0,0 +1,9 @@
@echo off
echo Install Pip Require
pip install -r requirements.txt
echo Build EXE version, Press Ctrl + C to Exit
echo Build Server
pyinstaller -F -i ..\f2-logo.ico --distpath . --version-file Server.txt --hidden-import=charset_normalizer.md__mypyc Server.py
echo Install Npm Require
npm i
pause

6
Server/package.json Normal file
View File

@@ -0,0 +1,6 @@
{
"dependencies": {
"crypto-js": "^4.1.1",
"md5": "^2.3.0"
}
}

2
Server/requirements.txt Normal file
View File

@@ -0,0 +1,2 @@
Flask==2.2.5
PyExecJS==1.5.1

15
Server/s_v_web_id.js Normal file
View File

@@ -0,0 +1,15 @@
function create_s_v_web_id() {
var e = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("")
, t = e.length
, n = (new Date).getTime().toString(36)
, r = [];
r[8] = r[13] = r[18] = r[23] = "_",
r[14] = "4";
for (var o, i = 0; i < 36; i++)
r[i] || (o = 0 | Math.random() * t,
r[i] = e[19 == i ? 3 & o | 8 : o]);
return "verify_" + n + "_" + r.join("")
}
console.log(create_s_v_web_id())

31
Server/s_v_web_id.py Normal file
View File

@@ -0,0 +1,31 @@
import time
import random
def create_s_v_web_id():
e = list("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
t = len(e)
n = base36_encode(int(time.time()*1000)) # Convert timestamp to base 36
r = [''] * 36
r[8] = r[13] = r[18] = r[23] = "_"
r[14] = "4"
for i in range(36):
if not r[i]:
o = int(random.random() * t)
r[i] = e[3 & o | 8 if i == 19 else o]
return "verify_" + n + "_" + "".join(r)
def base36_encode(number):
"""Converts an integer to a base36 string."""
alphabet = '0123456789abcdefghijklmnopqrstuvwxyz'
base36 = []
while number:
number, i = divmod(number, 36)
base36.append(alphabet[i])
return ''.join(reversed(base36))
print(create_s_v_web_id())

132
Server/x-bogus.js Normal file
View File

@@ -0,0 +1,132 @@
let MD5 = require("md5");
let Array = [ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 10, 11, 12, 13, 14, 15 ];
// let _0x4129ad = 'Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe';
// let _0x127ecb = '=';
let _0x377d66 = "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=";
function _0x39ced2(l) {
let n = [];
for (let u = 0; u < l.length; ) {
n.push(Array[l.charCodeAt(u++)] << 4 | Array[l.charCodeAt(u++)]);
}
return n;
}
function _0x1da120(l) {
return _0x39ced2(MD5(_0x39ced2(MD5(l))));
}
function _0x2efd11(l) {
return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(l);
}
function _0x2d9dba(l) {
var n, u, e, t, r, o = "";
for (n = 0; n < l.length - 3; n += 4) {
u = _0x2efd11(l.charAt(n)), e = _0x2efd11(l.charAt(n + 1)), t = _0x2efd11(l.charAt(n + 2)),
r = _0x2efd11(l.charAt(n + 3)), o += String.fromCharCode(u << 2 | e >>> 4), "=" !== l.charAt(n + 2) && (o += String.fromCharCode(e << 4 & 240 | t >>> 2 & 15)),
"=" !== l.charAt(n + 3) && (o += String.fromCharCode(t << 6 & 192 | r));
}
return o;
}
function _0x24e7c9() {
var l = "";
try {
window.sessionStorage && (l = window.sessionStorage.getItem("_byted_param_sw")),
l && !window.localStorage || (l = window.localStorage.getItem("_byted_param_sw"));
} catch (l) {}
if (l) {
try {
var n = _0x3459bb(_0x2d9dba(l.slice(8)), l.slice(0, 8));
if ("on" === n) {
return !0;
}
if ("off" === n) {
return !1;
}
} catch (l) {}
}
return !1;
}
function _0x4d54ed(l) {
try {
return window.localStorage ? window.localStorage.getItem(l) : null;
} catch (l) {
return null;
}
}
function _0x478bb3(l, n, u) {
let e = (255 & l) << 16;
let t = (255 & n) << 8;
let r = e | t | u;
return _0x377d66[(16515072 & r) >> 18] + _0x377d66[(258048 & r) >> 12] + _0x377d66[(4032 & r) >> 6] + _0x377d66[63 & r];
}
function _0x481826(l) {
void 0 !== l && "" != l && (_0x402a35.ttwid = l);
}
function _0x37f15d() {
var l = _0x4d54ed("xmst");
return l || "";
}
function _0x330d11(l, n, u, e, t, r, o, d, a, c, i, f, x, _, h, g, C, s, p) {
let w = new Uint8Array(19);
w[0] = l, w[1] = i, w[2] = n, w[3] = f, w[4] = u, w[5] = x, w[6] = e, w[7] = _,
w[8] = t, w[9] = h, w[10] = r, w[11] = g, w[12] = o, w[13] = C, w[14] = d, w[15] = s,
w[16] = a, w[17] = p, w[18] = c;
return String.fromCharCode.apply(null, w);
}
function _0x330d112(l, n) {
let u, e = [], t = 0, r = "", o = 0, d = 0, a = 0;
for (let l = 0; l < 256; l++) {
e[l] = l;
}
for (;o < 256; o++) {
t = (t + e[o] + l.charCodeAt(o % l.length)) % 256, u = e[o], e[o] = e[t], e[t] = u;
}
t = 0;
for (;d < n.length; d++) {
t = (t + e[a = (a + 1) % 256]) % 256, u = e[a], e[a] = e[t], e[t] = u, r += String.fromCharCode(n.charCodeAt(d) ^ e[(e[a] + e[t]) % 256]);
}
return r;
}
function _0x33baa6(l, n, u) {
return String.fromCharCode(l) + String.fromCharCode(n) + u;
}
function getXB(l) {
// douyin
let n = _0x39ced2(MD5("d4+pTKoNjJFb5tMtAC3XB9XrDDxlig1kjbh32u+x5YcwWb/me2pvLTh6ZdBVN5skEeIaOYNixbnFK6wyJdl/Lcy9CDAcpXLLQc3QFKIDQ3KkQYie3n258eLS1YFUqFLDjn7dqCRp1jjoORamU2SV"));
// douyin & tiktok
let u = _0x39ced2(MD5(_0x39ced2("d41d8cd98f00b204e9800998ecf8427e")));
let e = _0x1da120(l), t = new Date().getTime() / 1e3, r = 536919696, o = [], d = [], a = "";
let c = [ 64, .00390625, 1, 8, e[14], e[15], u[14], u[15], n[14], n[15], t >> 24 & 255, t >> 16 & 255, t >> 8 & 255, t >> 0 & 255, r >> 24 & 255, r >> 16 & 255, r >> 8 & 255, r >> 0 & 255 ];
c.push(c.reduce(function(l, n) {
return l ^ n;
}));
for (let l = 0; l < c.length; l += 2) {
o.push(c[l]);
d.push(c[l + 1]);
}
//unescape('%FF')
let i = _0x33baa6.apply(null, [ 2, 255, _0x330d112.apply(null, [String.fromCharCode(255), _0x330d11.apply(null, o.concat(d).slice(0, 19)) ]) ]);
for (let l = 0; l < i.length; ) {
a += _0x478bb3(i.charCodeAt(l++), i.charCodeAt(l++), i.charCodeAt(l++));
}
return a;
}
_0x180b4c = _0x37f15d();
module.exports = {
getXB: getXB
};

27
Server/x-tt-params.js Normal file
View File

@@ -0,0 +1,27 @@
let CryptoJS = require("crypto-js");
getXTTP = e => {
const t = [];
return Object.keys(e).forEach((i => {
const o = `${i}=${e[i]}`;
t.push(o)
})),
t.push("is_encryption=1"),
((e, t) => {
const i = ((e, t) => {
let i = e.toString();
const o = i.length;
return o < 16 ? i = new Array(16 - o + 1).join("0") + i : o > 16 && (i = i.slice(0, 16)),
i
})("webapp1.0+20210628"),
n = CryptoJS.enc.Utf8.parse(i);
return CryptoJS.AES.encrypt(e, n, {
iv: n,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString()
})(t.join("&"))
}
module.exports = {
getXTTP: getXTTP
};

52
TikTokTool.py Normal file
View File

@@ -0,0 +1,52 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Description:TikTokTool.py
@Date :2022/07/29 23:19:14
@Author :JohnserfSeed
@version :1.6
@License :MIT License
@Github :https://github.com/johnserf-seed
@Mail :johnserf-seed@foxmail.com
-------------------------------------------------
Change Log :
2022/07/29 23:19:14 : Init
2023/03/10 16:22:19 : gen dyheaders
2023/08/04 02:09:31 : async download
2023/12/26 18:01:56 : Switch to f2
2024/04/05 00:56:22 : Update to 1.6 with f2 0.0.1.5
-------------------------------------------------
"""
import f2
import sys
import time
from f2.cli.cli_console import RichConsoleManager as RCManager
if __name__ == "__main__":
RCManager = RCManager()
if len(sys.argv) <= 1:
RCManager.rich_console.print(
"[bold red]请通过命令行启动并提供必要的参数, 输入[bold green] TikTokTool -h [/bold green]查看不同平台帮助。[/bold red]"
)
RCManager.rich_console.print(
f"[bold white]F2 Version:{f2.__version__}[/bold white]"
)
time.sleep(3)
sys.exit(1)
from f2.apps.douyin.cli import douyin
from f2.apps.tiktok.cli import tiktok
clis = [douyin, tiktok]
selected = RCManager.rich_prompt.ask(
"[bold yellow]1.Douyin 2.TikTok:[/bold yellow]",
choices=[str(i) for i in range(1, len(clis) + 1)],
)
# 调用相应的 CLI 函数
clis[int(selected) - 1]()

1
_config.yml Normal file
View File

@@ -0,0 +1 @@
theme: jekyll-theme-architect

131
auto_cookie.py Normal file
View File

@@ -0,0 +1,131 @@
import os
import time
COOKIE_FILE = r"C:\Users\Administrator\Desktop\TikTokDownload-main\douyin_cookie.txt"
def get_douyin_cookie_auto(force_refresh=False, headless=True):
"""
自动获取抖音访客Cookie使用Edge本地驱动
"""
# 检查是否已有Cookie且不需要强制刷新
if not force_refresh and os.path.exists(COOKIE_FILE):
try:
with open(COOKIE_FILE, 'r', encoding='utf-8') as f:
cookie = f.read().strip()
if cookie and len(cookie) > 100:
print("[自动Cookie] 使用已保存的Cookie")
return cookie
except Exception as e:
print(f"[自动Cookie] 读取Cookie失败: {e}")
print("[自动Cookie] 开始自动获取...")
try:
# 尝试使用selenium with本地Edge
from selenium import webdriver
from selenium.webdriver.edge.options import Options as EdgeOptions
from selenium.webdriver.edge.service import Service as EdgeService
print("[自动Cookie] 启动Edge浏览器...")
options = EdgeOptions()
if headless:
print("[自动Cookie] 使用无头模式...")
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
# 尝试使用系统Edge驱动
try:
# 方法1: 直接使用Edge自动查找驱动
driver = webdriver.Edge(options=options)
print("[自动Cookie] Edge浏览器启动成功自动驱动")
except Exception as e1:
print(f"[自动Cookie] 自动驱动失败: {e1}")
# 方法2: 尝试常见驱动路径
common_paths = [
r"C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe",
r"C:\Program Files\Microsoft\Edge\Application\msedgedriver.exe",
os.path.expandvars(r"%PROGRAMFILES%\Microsoft\Edge\Application\msedgedriver.exe"),
os.path.expandvars(r"%PROGRAMFILES(X86)%\Microsoft\Edge\Application\msedgedriver.exe"),
]
driver = None
for driver_path in common_paths:
if os.path.exists(driver_path):
print(f"[自动Cookie] 尝试使用驱动: {driver_path}")
try:
service = EdgeService(executable_path=driver_path)
driver = webdriver.Edge(service=service, options=options)
print("[自动Cookie] Edge浏览器启动成功指定驱动")
break
except Exception as e2:
print(f"[自动Cookie] 驱动 {driver_path} 失败: {e2}")
continue
if driver is None:
raise Exception("无法找到可用的Edge驱动")
# 访问抖音
print("[自动Cookie] 访问抖音网站...")
driver.get("https://www.douyin.com")
print("[自动Cookie] 等待Cookie生成5秒...")
time.sleep(5)
# 提取Cookie
cookies = driver.get_cookies()
if not cookies:
print("[自动Cookie] 警告: 未获取到Cookie")
driver.quit()
return None
# 转换为字符串
cookie_str = "; ".join([f"{c['name']}={c['value']}" for c in cookies])
print(f"[自动Cookie] 成功获取 {len(cookies)} 个Cookie项")
print(f"[自动Cookie] Cookie项: {', '.join([c['name'] for c in cookies])}")
print(f"[自动Cookie] Cookie长度: {len(cookie_str)}")
# 保存
try:
with open(COOKIE_FILE, 'w', encoding='utf-8') as f:
f.write(cookie_str)
print(f"[自动Cookie] Cookie已保存")
except Exception as e:
print(f"[自动Cookie] 保存失败: {e}")
driver.quit()
return cookie_str
except ImportError as e:
print(f"[自动Cookie] 错误: selenium未安装 - {e}")
print("[自动Cookie] 提示: 请运行 pip install selenium")
return None
except Exception as e:
print(f"[自动Cookie] 错误: {e}")
import traceback
traceback.print_exc()
return None
if __name__ == "__main__":
print("="*60)
print("测试自动获取CookieEdge本地驱动")
print("="*60)
cookie = get_douyin_cookie_auto(force_refresh=True, headless=False)
if cookie:
print(f"\n成功Cookie长度: {len(cookie)}")
print(f"Cookie前200字符:\n{cookie[:200]}...")
else:
print("\n失败无法获取Cookie")

131
auto_cookie_selenium.py Normal file
View File

@@ -0,0 +1,131 @@
import os
import time
COOKIE_FILE = r"C:\Users\Administrator\Desktop\TikTokDownload-main\douyin_cookie.txt"
def get_douyin_cookie_auto(force_refresh=False, headless=True):
"""
自动获取抖音访客Cookie使用Edge本地驱动
"""
# 检查是否已有Cookie且不需要强制刷新
if not force_refresh and os.path.exists(COOKIE_FILE):
try:
with open(COOKIE_FILE, 'r', encoding='utf-8') as f:
cookie = f.read().strip()
if cookie and len(cookie) > 100:
print("[自动Cookie] 使用已保存的Cookie")
return cookie
except Exception as e:
print(f"[自动Cookie] 读取Cookie失败: {e}")
print("[自动Cookie] 开始自动获取...")
try:
# 尝试使用selenium with本地Edge
from selenium import webdriver
from selenium.webdriver.edge.options import Options as EdgeOptions
from selenium.webdriver.edge.service import Service as EdgeService
print("[自动Cookie] 启动Edge浏览器...")
options = EdgeOptions()
if headless:
print("[自动Cookie] 使用无头模式...")
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
# 尝试使用系统Edge驱动
try:
# 方法1: 直接使用Edge自动查找驱动
driver = webdriver.Edge(options=options)
print("[自动Cookie] Edge浏览器启动成功自动驱动")
except Exception as e1:
print(f"[自动Cookie] 自动驱动失败: {e1}")
# 方法2: 尝试常见驱动路径
common_paths = [
r"C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe",
r"C:\Program Files\Microsoft\Edge\Application\msedgedriver.exe",
os.path.expandvars(r"%PROGRAMFILES%\Microsoft\Edge\Application\msedgedriver.exe"),
os.path.expandvars(r"%PROGRAMFILES(X86)%\Microsoft\Edge\Application\msedgedriver.exe"),
]
driver = None
for driver_path in common_paths:
if os.path.exists(driver_path):
print(f"[自动Cookie] 尝试使用驱动: {driver_path}")
try:
service = EdgeService(executable_path=driver_path)
driver = webdriver.Edge(service=service, options=options)
print("[自动Cookie] Edge浏览器启动成功指定驱动")
break
except Exception as e2:
print(f"[自动Cookie] 驱动 {driver_path} 失败: {e2}")
continue
if driver is None:
raise Exception("无法找到可用的Edge驱动")
# 访问抖音
print("[自动Cookie] 访问抖音网站...")
driver.get("https://www.douyin.com")
print("[自动Cookie] 等待Cookie生成5秒...")
time.sleep(5)
# 提取Cookie
cookies = driver.get_cookies()
if not cookies:
print("[自动Cookie] 警告: 未获取到Cookie")
driver.quit()
return None
# 转换为字符串
cookie_str = "; ".join([f"{c['name']}={c['value']}" for c in cookies])
print(f"[自动Cookie] 成功获取 {len(cookies)} 个Cookie项")
print(f"[自动Cookie] Cookie项: {', '.join([c['name'] for c in cookies])}")
print(f"[自动Cookie] Cookie长度: {len(cookie_str)}")
# 保存
try:
with open(COOKIE_FILE, 'w', encoding='utf-8') as f:
f.write(cookie_str)
print(f"[自动Cookie] Cookie已保存")
except Exception as e:
print(f"[自动Cookie] 保存失败: {e}")
driver.quit()
return cookie_str
except ImportError as e:
print(f"[自动Cookie] 错误: selenium未安装 - {e}")
print("[自动Cookie] 提示: 请运行 pip install selenium")
return None
except Exception as e:
print(f"[自动Cookie] 错误: {e}")
import traceback
traceback.print_exc()
return None
if __name__ == "__main__":
print("="*60)
print("测试自动获取CookieEdge本地驱动")
print("="*60)
cookie = get_douyin_cookie_auto(force_refresh=True, headless=False)
if cookie:
print(f"\n成功Cookie长度: {len(cookie)}")
print(f"Cookie前200字符:\n{cookie[:200]}...")
else:
print("\n失败无法获取Cookie")

1
douyin_cookie.txt Normal file
View File

@@ -0,0 +1 @@
odin_tt=0ab64014f8621dcc5185659a02a1da6d71c4e475608a68079d76e337e92f94d79faa3530852b4808b2a227ed12eed380648ebe917960b6ed3a0614221cfb3b4e427a497c8c7c3a96777e1275ad869f3c; passport_auth_mix_state=f4tq1dty1bdyou5gu1vadk0i7zff9c1fdkwurm514fvjmmn5; gulu_source_res=eyJwX2luIjoiY2U2ZGQ3NDE5YmRhYjA4ZTJhN2VmZDIwODlkMTA3YmJlZjUyZjUyYzYxMjVkMDliYjcyYmE3MGEzYWYxMjU4NCJ9; sdk_source_info=7e276470716a68645a606960273f276364697660272927676c715a6d6069756077273f276364697660272927666d776a68605a607d71606b766c6a6b5a7666776c7571273f275e58272927666a6b766a69605a696c6061273f27636469766027292762696a6764695a7364776c6467696076273f275e5927766069606b6c7068375927582729277672715a646971273f2763646976602729277f6b5a666475273f2763646976602729276d6a6e5a6b6a716c273f2763646976602729276c6b6f5a7f6367273f27636469766027292771273f273035343d313c32303137323234272927676c715a75776a716a666a69273f2763646976602778; ttwid=1%7C2WGJmIcw_oo6GaE4FyFjhCXzFdAN7H2clv8bpD27BE4%7C1772457948%7C1b6f2d6daf5b3891c74d69f3f166e319021d978f71e226547441aa4f9a179950; bd_ticket_guard_client_web_domain=2; stream_recommend_feed_params=%22%7B%5C%22cookie_enabled%5C%22%3Atrue%2C%5C%22screen_width%5C%22%3A2560%2C%5C%22screen_height%5C%22%3A1440%2C%5C%22browser_online%5C%22%3Atrue%2C%5C%22cpu_core_num%5C%22%3A16%2C%5C%22device_memory%5C%22%3A8%2C%5C%22downlink%5C%22%3A1.6%2C%5C%22effective_type%5C%22%3A%5C%224g%5C%22%2C%5C%22round_trip_time%5C%22%3A100%7D%22; __security_mc_1_s_sdk_crypt_sdk=9d5addaf-4008-8680; biz_trace_id=c1054347; passport_csrf_token_default=c00aa881509d4db8eed9eddfb1387df6; home_can_add_dy_2_desktop=%221%22; dy_sheight=1440; passport_csrf_token=c00aa881509d4db8eed9eddfb1387df6; dy_swidth=2560; __ac_nonce=069a58fd7009e5225d0ab; =douyin.com; fpk2=8369da3c75ccd12bc017791df73a85c8; IsDouyinActive=true; device_web_cpu_core=16; device_web_memory_size=8; s_v_web_id=verify_mm97p2om_E2hKT2qB_YVco_4Mbp_BWVJ_gDHlqlQuQp34; x-web-secsdk-uid=b8e6e6e8-1d67-402c-abcc-2c917dedb303; architecture=amd64; fpk1=U2FsdGVkX1/SKZb5paKgvDTF5ExF/c2DNCO31JgNuwVdCVw5IMStaxbt3S08U4USh9aph+H+OyLlIy9pwSBSWg==; UIFID_TEMP=c8c20d54553eadab8c678961c2b0df95555df87bbc6b890988ad105aec15abc0078f6c0f89a54645786d4847fe5d733279b7352837201c16eefe8fc2799fbabfd5e252217bf9357348e544c5eba770b8; strategyABtestKey=%221772457946.759%22; __ac_signature=_02B4Z6wo00f01DlZnjAAAIDADn1ab.omBNw5eZqAAGf6fc; bd_ticket_guard_client_data_v2=eyJyZWVfcHVibGljX2tleSI6IkJBKzgza2pPK2tYQTVJSUVxcWdzTTJjc0hFcE5YTjRkVjd0KzRNanVEYnh2MHhNSldVelV6UHpFa1dZS1FIMENubXhvQXBRSm9TdUd6dS9hNnhyQ3U3ST0iLCJyZXFfY29udGVudCI6InNlY190cyIsInJlcV9zaWduIjoiWWxYaURyMU1LNlNHUks2bG9RSFYzbFNrenk0Rmd4dnhDMW1kR0M1OFlQbz0iLCJzZWNfdHMiOiIjS3UxOXhNZVVtYm9TZDg5RUl3YlJCckNxSXZGTkRJSnZFbE1CT2Q3Z0JWREtWUGJzTUIwQlB4ZmJoOVQxIn0%3D; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCQSs4M2tqTytrWEE1SUlFcXFnc00yY3NIRXBOWE40ZFY3dCs0TWp1RGJ4djB4TUpXVXpVelB6RWtXWUtRSDBDbm14b0FwUUpvU3VHenUvYTZ4ckN1N0k9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoyfQ%3D%3D; bit_env=lkuQMjmHOSrwBMrTHzos5sS7xTBdgLBDG9q6GBCelYVM5pRuZfruudJONSvXd-727alZFIfxd8TT_4AktaJU1CWEOYNe7pYlqOt0ja_8t0onKmBsLmUlwdZecN8dVxa6Z6eJtdK4jtdCBjIbIv24BmS0I9kCiPMewHlKqzYGGdq-VR-96TTCbgnL3aUXyop5T0TKeSX-WObcCsv3xAUNFereInqEF_1d6NiFwMWz3P2DoVkEayemJ25kcnKDBzgkIsk-TkhNwyd16JYZphTpuKXbbaKSXUnQk8-p8fxCUFWsWTwYRXsJuqq4_9mtuvD0LZijvX4dwsjEPIXQZ4-CJnOeutft3Mvap75qIlSOERi90d3l-kBchx5oxZgnMZfc8d1vgG8oQKjYnhhzCrNc9ijGoS5I0kzaQBkJpmLXS4WHycoTb_cA2TqUp7pnaFRvXyrgrDUJoskNZpJDfCCxIN912fd56RCec-DhI3N3A40GWlMcbyPpVJcSPmRsBGx2rkANb8STYsH6VUKJgnMWYXLmV6BX1whLixHGRpJFt9c%3D; enter_pc_once=1

382
douyin_ui.py Normal file
View File

@@ -0,0 +1,382 @@
import tkinter as tk
from tkinter import ttk, filedialog, scrolledtext, messagebox
import subprocess
import threading
import os
import re
PYTHON_PATH = r"C:\Program Files\Python311\python.exe"
COOKIE_FILE = r"C:\Users\Administrator\Desktop\TikTokDownload-main\douyin_cookie.txt"
class DouyinDownloaderUI:
def __init__(self, root):
self.root = root
self.root.title("抖音去水印下载器 v3.0 (自动Cookie)")
self.root.geometry("800x700")
self.root.resizable(True, True)
self.download_dir = os.path.join(os.path.expanduser("~"), "Downloads", "DouyinDownloads")
os.makedirs(self.download_dir, exist_ok=True)
self.is_downloading = False
self.cookie = None
self.setup_ui()
self.auto_load_cookie()
def auto_load_cookie(self):
"""启动时自动加载Cookie"""
if os.path.exists(COOKIE_FILE):
try:
with open(COOKIE_FILE, 'r', encoding='utf-8') as f:
self.cookie = f.read().strip()
if self.cookie and len(self.cookie) > 100:
self.update_cookie_status(True)
self.log("✓ 已自动加载Cookie", "SUCCESS")
return
except:
pass
self.update_cookie_status(False)
self.log(" 未检测到Cookie首次下载时将自动获取", "INFO")
def update_cookie_status(self, has_cookie):
"""更新Cookie状态指示"""
if has_cookie:
self.cookie_status.config(text="● Cookie: 有效", foreground="green")
self.cookie_entry.delete(0, tk.END)
self.cookie_entry.insert(0, "[已自动获取Cookie]")
else:
self.cookie_status.config(text="● Cookie: 未获取", foreground="gray")
def setup_ui(self):
style = ttk.Style()
style.theme_use('clam')
main_frame = ttk.Frame(self.root, padding="15")
main_frame.pack(fill=tk.BOTH, expand=True)
# Title
title_label = ttk.Label(main_frame, text="抖音/TikTok 去水印下载器", font=('Microsoft YaHei', 18, 'bold'))
title_label.pack(pady=(0, 5))
subtitle = ttk.Label(main_frame, text="自动Cookie | 无需登录 | 一键下载", font=('Microsoft YaHei', 10), foreground="gray")
subtitle.pack(pady=(0, 10))
# Cookie Status Frame
cookie_frame = ttk.LabelFrame(main_frame, text="Cookie状态", padding="10")
cookie_frame.pack(fill=tk.X, pady=(0, 10))
self.cookie_status = ttk.Label(cookie_frame, text="● Cookie: 检测中...", font=('Microsoft YaHei', 10, 'bold'))
self.cookie_status.pack(side=tk.LEFT, padx=5)
ttk.Button(cookie_frame, text="自动获取Cookie", command=self.auto_get_cookie_ui, width=15).pack(side=tk.LEFT, padx=10)
ttk.Label(cookie_frame, text="(首次下载时会自动获取,无需手动操作)",
font=('Microsoft YaHei', 8), foreground="gray").pack(side=tk.LEFT, padx=5)
# Hidden Cookie Entry (for compatibility)
self.cookie_entry = ttk.Entry(cookie_frame, width=20, state='disabled')
# URL Frame
input_frame = ttk.LabelFrame(main_frame, text="下载设置", padding="10")
input_frame.pack(fill=tk.X, pady=(0, 10))
ttk.Label(input_frame, text="分享链接:", font=('Microsoft YaHei', 10)).grid(row=0, column=0, sticky=tk.W, pady=5)
self.url_entry = ttk.Entry(input_frame, width=80, font=('Microsoft YaHei', 10))
self.url_entry.grid(row=0, column=1, padx=5, pady=5, sticky=tk.EW)
self.url_entry.bind('<Control-v>', self.paste_clipboard)
ttk.Label(input_frame, text="下载模式:", font=('Microsoft YaHei', 10)).grid(row=1, column=0, sticky=tk.W, pady=5)
self.mode_var = tk.StringVar(value="one")
mode_frame = ttk.Frame(input_frame)
mode_frame.grid(row=1, column=1, sticky=tk.W, padx=5, pady=5)
modes = [
("单个作品", "one"),
("用户主页", "post"),
("用户喜欢", "like"),
("用户收藏", "collects"),
("直播", "live"),
]
for i, (text, value) in enumerate(modes):
rb = ttk.Radiobutton(mode_frame, text=text, value=value, variable=self.mode_var)
rb.pack(side=tk.LEFT, padx=8)
ttk.Label(input_frame, text="保存目录:", font=('Microsoft YaHei', 10)).grid(row=2, column=0, sticky=tk.W, pady=5)
dir_frame = ttk.Frame(input_frame)
dir_frame.grid(row=2, column=1, sticky=tk.EW, padx=5, pady=5)
self.dir_entry = ttk.Entry(dir_frame, textvariable=tk.StringVar(value=self.download_dir), font=('Microsoft YaHei', 10))
self.dir_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
ttk.Button(dir_frame, text="浏览", command=self.browse_dir, width=8).pack(side=tk.LEFT, padx=(5, 0))
input_frame.columnconfigure(1, weight=1)
# Options Frame
options_frame = ttk.LabelFrame(main_frame, text="选项", padding="10")
options_frame.pack(fill=tk.X, pady=(0, 10))
self.download_music = tk.BooleanVar(value=False)
self.download_cover = tk.BooleanVar(value=False)
ttk.Checkbutton(options_frame, text="下载原声", variable=self.download_music).pack(side=tk.LEFT, padx=10)
ttk.Checkbutton(options_frame, text="下载封面", variable=self.download_cover).pack(side=tk.LEFT, padx=10)
ttk.Label(options_frame, text="作品数量:").pack(side=tk.LEFT, padx=(20, 5))
self.limit_entry = ttk.Entry(options_frame, width=8)
self.limit_entry.insert(0, "0")
self.limit_entry.pack(side=tk.LEFT)
ttk.Label(options_frame, text="(0=全部)").pack(side=tk.LEFT, padx=5)
# Buttons
btn_frame = ttk.Frame(main_frame)
btn_frame.pack(fill=tk.X, pady=10)
self.download_btn = ttk.Button(btn_frame, text="开始下载", command=self.start_download)
self.download_btn.pack(side=tk.LEFT, padx=5, ipadx=20, ipady=5)
self.stop_btn = ttk.Button(btn_frame, text="停止", command=self.stop_download, state=tk.DISABLED)
self.stop_btn.pack(side=tk.LEFT, padx=5, ipadx=20, ipady=5)
ttk.Button(btn_frame, text="打开目录", command=self.open_download_dir).pack(side=tk.LEFT, padx=5)
ttk.Button(btn_frame, text="清空日志", command=self.clear_log).pack(side=tk.RIGHT, padx=5)
# Log Frame
log_frame = ttk.LabelFrame(main_frame, text="下载日志", padding="5")
log_frame.pack(fill=tk.BOTH, expand=True)
self.log_text = scrolledtext.ScrolledText(log_frame, height=15, font=('Consolas', 9),
bg='#1e1e1e', fg='#00ff00', insertbackground='white')
self.log_text.pack(fill=tk.BOTH, expand=True)
# Progress
self.progress_var = tk.DoubleVar()
self.progress_bar = ttk.Progressbar(main_frame, variable=self.progress_var, maximum=100)
self.progress_bar.pack(fill=tk.X, pady=(10, 0))
self.status_label = ttk.Label(main_frame, text="就绪", font=('Microsoft YaHei', 9))
self.status_label.pack(pady=5)
def auto_get_cookie_ui(self):
"""UI线程自动获取Cookie"""
self.log("正在自动获取Cookie...", "INFO")
self.status_label.config(text="正在获取Cookie...")
self.download_btn.config(state=tk.DISABLED)
thread = threading.Thread(target=self.auto_get_cookie_thread)
thread.daemon = True
thread.start()
def auto_get_cookie_thread(self):
"""后台线程自动获取Cookie"""
try:
from auto_cookie import get_douyin_cookie_auto
# 强制刷新,使用有界面模式(更稳定)
cookie = get_douyin_cookie_auto(force_refresh=True, headless=False)
if cookie and len(cookie) > 100:
self.cookie = cookie
self.root.after(0, lambda: self.update_cookie_status(True))
self.root.after(0, lambda: self.log("✓ Cookie获取成功", "SUCCESS"))
self.root.after(0, lambda: self.status_label.config(text="Cookie已就绪"))
else:
self.root.after(0, lambda: self.log("✗ Cookie获取失败", "ERROR"))
self.root.after(0, lambda: self.status_label.config(text="Cookie获取失败"))
except Exception as e:
self.root.after(0, lambda: self.log(f"✗ Cookie获取失败: {str(e)}", "ERROR"))
self.root.after(0, lambda: self.status_label.config(text="Cookie获取失败"))
finally:
self.root.after(0, lambda: self.download_btn.config(state=tk.NORMAL))
def paste_clipboard(self, event=None):
try:
clipboard = self.root.clipboard_get()
self.url_entry.delete(0, tk.END)
self.url_entry.insert(0, clipboard)
except:
pass
return "break"
def browse_dir(self):
dir_path = filedialog.askdirectory(initialdir=self.download_dir)
if dir_path:
self.download_dir = dir_path
self.dir_entry.delete(0, tk.END)
self.dir_entry.insert(0, dir_path)
def open_download_dir(self):
os.startfile(self.download_dir)
def clear_log(self):
self.log_text.delete(1.0, tk.END)
def log(self, message, level="INFO"):
self.log_text.insert(tk.END, f"[{level}] {message}\n")
self.log_text.see(tk.END)
self.root.update_idletasks()
def extract_url(self, text):
match = re.search(r'https?://[^\s<>"{}|\\^`\[\]]+', text)
if match:
return match.group(0)
return text
def ensure_cookie(self):
"""确保有Cookie如果没有则自动获取"""
if self.cookie and len(self.cookie) > 100:
return True
self.log("检测到无Cookie正在自动获取...", "INFO")
try:
from auto_cookie import get_douyin_cookie_auto
# 自动获取,使用无头模式(不打扰用户)
cookie = get_douyin_cookie_auto(force_refresh=False, headless=True)
if cookie and len(cookie) > 100:
self.cookie = cookie
self.root.after(0, lambda: self.update_cookie_status(True))
self.log("✓ Cookie自动获取成功", "SUCCESS")
return True
else:
self.log("✗ 自动获取Cookie失败", "ERROR")
return False
except Exception as e:
self.log(f"✗ 自动获取Cookie失败: {str(e)}", "ERROR")
return False
def start_download(self):
url = self.url_entry.get().strip()
if not url:
messagebox.showwarning("提示", "请输入分享链接!")
return
# 确保有Cookie
if not self.ensure_cookie():
messagebox.showerror("错误", "无法获取Cookie请检查网络或浏览器是否正常")
return
url = self.extract_url(url)
self.log(f"解析链接: {url}", "INFO")
self.is_downloading = True
self.download_btn.config(state=tk.DISABLED)
self.stop_btn.config(state=tk.NORMAL)
self.progress_var.set(0)
thread = threading.Thread(target=self.download_thread, args=(url,))
thread.daemon = True
thread.start()
def download_thread(self, url):
try:
self.log("开始下载任务...", "INFO")
self.status_label.config(text="正在下载...")
cmd = [PYTHON_PATH, "-m", "f2", "dy"]
mode = self.mode_var.get()
cmd.extend(["-M", mode])
cmd.extend(["-u", url])
download_dir = self.dir_entry.get().strip()
cmd.extend(["-p", download_dir])
# 使用自动获取的Cookie
if self.cookie:
cmd.extend(["-k", self.cookie])
if self.download_music.get():
cmd.extend(["-m", "true"])
if self.download_cover.get():
cmd.extend(["-v", "true"])
limit = self.limit_entry.get().strip()
if limit and limit != "0":
cmd.extend(["-o", limit])
self.log("执行下载命令...", "INFO")
env = os.environ.copy()
env["PYTHONIOENCODING"] = "utf-8"
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
encoding='utf-8',
errors='replace',
env=env,
bufsize=1
)
download_failed = False
while self.is_downloading:
if process.stdout is None:
break
line = process.stdout.readline()
if not line and process.poll() is not None:
break
if line:
line = line.strip()
if line:
self.log(line, "INFO")
if "下载" in line or "成功" in line or "保存" in line:
self.progress_var.set(min(self.progress_var.get() + 10, 90))
# 检测Cookie相关的错误
if "cookie" in line.lower() or "登录" in line or "失败" in line:
download_failed = True
if not self.is_downloading:
process.terminate()
self.log("下载已停止", "WARNING")
elif process.returncode == 0:
self.progress_var.set(100)
self.log("✓ 下载完成!", "SUCCESS")
self.status_label.config(text="下载完成!")
self.root.after(0, lambda: messagebox.showinfo("完成", f"下载完成!\n\n保存位置: {download_dir}"))
elif download_failed:
self.log("检测到Cookie可能过期尝试刷新...", "WARNING")
# 重新获取Cookie
from auto_cookie import get_douyin_cookie_auto
new_cookie = get_douyin_cookie_auto(force_refresh=True, headless=True)
if new_cookie:
self.cookie = new_cookie
self.log("Cookie已刷新请重试下载", "INFO")
self.status_label.config(text="Cookie已刷新请重试")
else:
self.log("下载过程中出现错误", "WARNING")
self.status_label.config(text="下载失败")
except Exception as e:
self.log(f"错误: {str(e)}", "ERROR")
self.status_label.config(text="下载失败")
self.root.after(0, lambda: messagebox.showerror("错误", f"下载失败:\n{str(e)}"))
finally:
self.is_downloading = False
self.download_btn.config(state=tk.NORMAL)
self.stop_btn.config(state=tk.DISABLED)
def stop_download(self):
self.is_downloading = False
def main():
root = tk.Tk()
app = DouyinDownloaderUI(root)
root.mainloop()
if __name__ == "__main__":
main()

156
download_with_cookie.py Normal file
View File

@@ -0,0 +1,156 @@
import requests
import re
import os
import json
import time
from urllib.parse import unquote
COOKIE_FILE = r"C:\Users\Administrator\Desktop\TikTokDownload-main\douyin_cookie.txt"
def get_or_load_cookie():
"""Get cookie from file or prompt user"""
if os.path.exists(COOKIE_FILE):
with open(COOKIE_FILE, 'r', encoding='utf-8') as f:
cookie = f.read().strip()
if cookie:
print(f"Loaded cookie from {COOKIE_FILE}")
return cookie
print("\n" + "="*60)
print("需要Cookie才能下载抖音视频")
print("="*60)
print("\n获取Cookie步骤:")
print("1. 打开Chrome/Edge浏览器访问 www.douyin.com 并登录")
print("2. 按F12打开开发者工具")
print("3. 点击'网络'(Network)标签")
print("4. 刷新页面")
print("5. 点击列表中的任意一个请求")
print("6. 在右侧'请求标头'(Request Headers)中找到Cookie")
print("7. 复制整个Cookie值很长的一串")
print("\n" + "="*60)
cookie = input("\n请粘贴Cookie (直接回车跳过): ").strip()
if cookie:
# Save cookie for future use
with open(COOKIE_FILE, 'w', encoding='utf-8') as f:
f.write(cookie)
print(f"Cookie已保存到 {COOKIE_FILE}")
return cookie
return None
def download_with_cookie(share_url, cookie, save_dir=r"C:\Users\Administrator\Desktop\TestDownload"):
"""Download using provided cookie"""
os.makedirs(save_dir, exist_ok=True)
session = requests.Session()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Cookie': cookie,
'Referer': 'https://www.douyin.com/',
'Accept': 'application/json, text/plain, */*',
}
session.headers.update(headers)
# Get video ID
print(f"\n获取视频ID...")
resp = session.get(share_url, allow_redirects=True)
final_url = resp.url
print(f"URL: {final_url}")
match = re.search(r'/video/(\d+)', final_url)
if not match:
match = re.search(r'video[=/](\d{19})', final_url)
if not match:
print("无法提取视频ID")
return False
video_id = match.group(1)
print(f"视频ID: {video_id}")
# Try using f2 with the cookie
print(f"\n使用f2下载...")
import subprocess
cmd = [
r"C:\Program Files\Python311\python.exe",
"-m", "f2", "dy",
"-M", "one",
"-u", share_url,
"-p", save_dir,
"-k", cookie,
]
result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='replace')
print(result.stdout)
if result.returncode == 0:
print("\n✓ 下载完成!")
return True
else:
print(f"\n错误: {result.stderr}")
# If f2 fails, try direct method
print("\n尝试直接下载...")
# Get video detail API
api_url = f"https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id={video_id}&aid=6383&cookie_enabled=true"
resp = session.get(api_url)
print(f"API状态: {resp.status_code}")
if resp.status_code == 200 and resp.text:
try:
data = resp.json()
if 'aweme_detail' in data:
aweme = data['aweme_detail']
# Get video URL
video_info = aweme.get('video', {})
play_addr = video_info.get('play_addr', {})
url_list = play_addr.get('url_list', [])
if url_list:
video_url = url_list[0]
desc = aweme.get('desc', 'video')
desc = re.sub(r'[\\/:*?"<>|]', '_', desc)[:50]
print(f"\n下载视频...")
video_resp = session.get(video_url)
if video_resp.status_code == 200 and len(video_resp.content) > 50000:
filename = f"{desc}_{video_id}.mp4"
filepath = os.path.join(save_dir, filename)
with open(filepath, 'wb') as f:
f.write(video_resp.content)
print(f"\n✓ 下载成功!")
print(f" 文件: {filepath}")
print(f" 大小: {len(video_resp.content) / 1024 / 1024:.2f} MB")
return True
except Exception as e:
print(f"解析错误: {e}")
return False
def download_douyin_video(share_url, save_dir=r"C:\Users\Administrator\Desktop\TestDownload"):
"""Main download function"""
cookie = get_or_load_cookie()
if cookie:
return download_with_cookie(share_url, cookie, save_dir)
else:
print("\n未提供Cookie尝试无Cookie下载...")
print("(可能无法成功)\n")
# Try without cookie as last resort
return download_with_cookie(share_url, "", save_dir)
if __name__ == "__main__":
url = "https://v.douyin.com/R5doyi5_cTk/"
download_douyin_video(url)

BIN
f2-logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

1
requirements.txt Normal file
View File

@@ -0,0 +1 @@
f2

2
run-server.bat Normal file
View File

@@ -0,0 +1,2 @@
cd Server
py Server.py

2
run-server.sh Normal file
View File

@@ -0,0 +1,2 @@
cd Server
python3 Server.py

261
simple_download.py Normal file
View File

@@ -0,0 +1,261 @@
import requests
import re
import os
import json
import time
from urllib.parse import unquote
def download_douyin_final(share_url, save_dir=r"C:\Users\Administrator\Desktop\TestDownload"):
"""
Final attempt using multiple approaches
"""
os.makedirs(save_dir, exist_ok=True)
session = requests.Session()
# Step 1: Get video ID
print("Step 1: Getting video ID...")
headers_mobile = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 10 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.72 MQQBrowser/6.2 TBS/046291 Mobile Safari/537.36 MicroMessenger/8.0.1.1841(0x2800015D) Process/app WeChat/arm64 Weixin NetType/4G Language/zh_CN ABI/arm64',
}
session.headers.update(headers_mobile)
resp = session.get(share_url, allow_redirects=True)
final_url = resp.url
print(f"Final URL: {final_url}")
match = re.search(r'/video/(\d+)', final_url)
if not match:
match = re.search(r'video[=/](\d{19})', final_url)
if not match:
print("Cannot extract video ID")
return False
video_id = match.group(1)
print(f"Video ID: {video_id}")
# Step 2: Try to get video info from iesdouyin HTML
print("\nStep 2: Parsing share page...")
html = resp.text
# Method 1: Look for ROUTER_DATA
router_match = re.search(r'ROUTER_DATA\s*=\s*(\{.+?\})\s*;\s*</script>', html, re.DOTALL)
if router_match:
try:
router_data = json.loads(router_match.group(1))
print("Found ROUTER_DATA")
# Navigate the data structure
if 'loaderData' in router_data:
for key, val in router_data['loaderData'].items():
if 'video' in key.lower() or 'aweme' in key.lower():
print(f"Checking {key}...")
result = extract_and_download(val, video_id, session, save_dir)
if result:
return True
except Exception as e:
print(f"ROUTER_DATA parse error: {e}")
# Method 2: Try direct video URLs in HTML
print("\nMethod 2: Looking for video URLs in HTML...")
# Look for play_addr patterns
patterns = [
r'"playAddr"\s*:\s*\[\s*\{\s*"src"\s*:\s*"([^"]+)"',
r'"play_addr"\s*:\s*\{\s*"url_list"\s*:\s*\[\s*"([^"]+)"',
r'"url_list"\s*:\s*\[\s*"(https?://[^"]+\.douyinvod\.com[^"]*)"',
r'"src"\s*:\s*"(https?://[^"]+\.douyinvod\.com[^"]*)"',
r'(https?://v[0-9]+-[0-9a-z]+\.douyinvod\.com/[a-f0-9/]+\.mp4[^"\'\s]*)',
]
for pattern in patterns:
matches = re.findall(pattern, html)
if matches:
print(f"Found {len(matches)} matches with pattern: {pattern[:40]}...")
for match in matches[:3]:
video_url = match.replace('\\u002F', '/').replace('\\/', '/')
print(f" URL: {video_url[:80]}...")
if 'douyinvod' in video_url or '.mp4' in video_url:
result = try_download(video_url, video_id, session, save_dir)
if result:
return True
# Method 3: Try the aweme iteminfo API with proper headers
print("\nMethod 3: Trying aweme iteminfo API...")
api_url = f"https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={video_id}&count=1"
api_headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
'Referer': f'https://www.iesdouyin.com/share/video/{video_id}',
'Accept': 'application/json',
}
resp = session.get(api_url, headers=api_headers)
print(f"API status: {resp.status_code}")
if resp.status_code == 200 and resp.text:
try:
data = resp.json()
if data.get('status_code') == 0 and data.get('item_list'):
item = data['item_list'][0]
return extract_and_download({'item': item}, video_id, session, save_dir)
else:
print(f"API response: {json.dumps(data, ensure_ascii=False)[:200]}")
except Exception as e:
print(f"API parse error: {e}")
print(f"Response: {resp.text[:200]}")
# Method 4: Try embed page
print("\nMethod 4: Trying embed page...")
embed_url = f"https://www.douyin.com/embed/video/{video_id}"
embed_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml',
}
resp = session.get(embed_url, headers=embed_headers)
if resp.status_code == 200:
# Look for video src in embed page
video_src = re.search(r'<video[^>]*src=["\']([^"\']+)["\']', resp.text)
if video_src:
video_url = video_src.group(1)
print(f"Found video src: {video_url[:80]}...")
return try_download(video_url, video_id, session, save_dir)
print("\nAll methods failed.")
print("\nThe video likely requires authentication.")
print("Please try the following:")
print("1. Open Chrome/Edge and go to www.douyin.com")
print("2. Login to your account")
print("3. Press F12 -> Network -> Refresh page")
print("4. Click any request -> Headers -> Copy Cookie value")
print("5. Use that cookie with the download tool")
return False
def extract_and_download(data, video_id, session, save_dir):
"""Extract video URL from data and download"""
def find_video_url(obj):
if isinstance(obj, dict):
# Check common video URL locations
for key in ['play_addr', 'playAddr', 'video_url', 'download_addr', 'downloadAddr']:
if key in obj:
val = obj[key]
if isinstance(val, dict):
url_list = val.get('url_list') or val.get('urlList') or val.get('url_list', [])
if url_list and isinstance(url_list, list):
return url_list[0]
elif isinstance(val, str):
return val
elif isinstance(val, list):
if val and isinstance(val[0], dict) and 'src' in val[0]:
return val[0]['src']
# Check for video object
if 'video' in obj:
result = find_video_url(obj['video'])
if result:
return result
# Recurse
for v in obj.values():
result = find_video_url(v)
if result:
return result
elif isinstance(obj, list):
for item in obj:
result = find_video_url(item)
if result:
return result
return None
def find_desc(obj):
if isinstance(obj, dict):
if 'desc' in obj and isinstance(obj['desc'], str):
return obj['desc']
for v in obj.values():
result = find_desc(v)
if result:
return result
elif isinstance(obj, list):
for item in obj:
result = find_desc(item)
if result:
return result
return None
video_url = find_video_url(data)
if video_url:
desc = find_desc(data) or "douyin_video"
desc = re.sub(r'[\\/:*?"<>|]', '_', desc)[:50]
return try_download(video_url, video_id, session, save_dir, desc)
return False
def try_download(video_url, video_id, session, save_dir, desc="douyin_video"):
"""Attempt to download video from URL"""
# Clean URL
video_url = video_url.replace('\\u002F', '/').replace('\\/', '/')
video_url = unquote(video_url)
# Try to get non-watermarked version
video_url = video_url.replace('playwm', 'play')
print(f"\nAttempting download from: {video_url[:100]}...")
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Referer': 'https://www.douyin.com/',
}
try:
resp = session.get(video_url, headers=headers, stream=True, timeout=30)
print(f"Response status: {resp.status_code}")
print(f"Content-Type: {resp.headers.get('Content-Type', 'unknown')}")
print(f"Content-Length: {resp.headers.get('Content-Length', 'unknown')}")
if resp.status_code == 200:
# Check if it's actually a video
content_type = resp.headers.get('Content-Type', '')
content_length = int(resp.headers.get('Content-Length', 0))
if 'video' in content_type or content_length > 50000:
filename = f"{desc}_{video_id}.mp4"
filepath = os.path.join(save_dir, filename)
downloaded = 0
with open(filepath, 'wb') as f:
for chunk in resp.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
downloaded += len(chunk)
file_size = os.path.getsize(filepath)
print(f"\n✓ SUCCESS!")
print(f" File: {filepath}")
print(f" Size: {file_size / 1024 / 1024:.2f} MB")
return True
else:
print(f"Response doesn't appear to be a video file")
print(f"First 200 bytes: {resp.content[:200]}")
except Exception as e:
print(f"Download error: {e}")
return False
if __name__ == "__main__":
url = "https://v.douyin.com/R5doyi5_cTk/"
download_douyin_final(url)

105
test_auto_download.py Normal file
View File

@@ -0,0 +1,105 @@
import sys
import os
import time
import subprocess
# 设置UTF-8编码
os.environ['PYTHONIOENCODING'] = 'utf-8'
# 添加项目路径
sys.path.insert(0, r"C:\Users\Administrator\Desktop\TikTokDownload-main")
from auto_cookie import get_douyin_cookie_auto
def test_auto_download():
"""测试完整的自动下载流程"""
print("="*60)
print("自动下载测试")
print("="*60)
# 步骤1: 自动获取Cookie
print("\n[步骤1] 自动获取Cookie")
cookie = get_douyin_cookie_auto(force_refresh=True)
if not cookie:
print("错误: Cookie获取失败")
return False
print(f"成功: Cookie长度 {len(cookie)}")
print(f"Cookie内容: {cookie}")
# 步骤2: 使用Cookie下载视频
print("\n[步骤2] 使用Cookie下载视频")
test_url = "https://v.douyin.com/R5doyi5_cTk/"
save_dir = r"C:\Users\Administrator\Desktop\TestDownload"
cmd = [
r"C:\Program Files\Python311\python.exe",
"-m", "f2", "dy",
"-M", "one",
"-u", test_url,
"-p", save_dir,
"-k", cookie,
]
print(f"下载链接: {test_url}")
print(f"保存目录: {save_dir}")
print("开始下载...\n")
try:
env = os.environ.copy()
env['PYTHONIOENCODING'] = 'utf-8'
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
env=env,
text=True,
encoding='utf-8',
errors='replace'
)
# 实时输出
for line in process.stdout:
print(line.rstrip())
process.wait()
if process.returncode == 0:
print("\n成功: 下载完成!")
# 检查文件是否存在
if os.path.exists(save_dir):
files = [f for f in os.listdir(save_dir) if f.endswith('.mp4')]
if files:
print(f"下载的文件: {files}")
for f in files:
filepath = os.path.join(save_dir, f)
size = os.path.getsize(filepath) / 1024 / 1024
print(f" - {f} ({size:.2f} MB)")
return True
else:
print(f"\n错误: 下载失败,返回码 {process.returncode}")
return False
except subprocess.TimeoutExpired:
print("错误: 下载超时")
return False
except Exception as e:
print(f"错误: {e}")
import traceback
traceback.print_exc()
return False
if __name__ == "__main__":
success = test_auto_download()
print("\n" + "="*60)
if success:
print("测试结果: 成功 - 自动Cookie功能正常工作")
else:
print("测试结果: 失败")
print("="*60)

40
test_cookie.py Normal file
View File

@@ -0,0 +1,40 @@
import browser_cookie3
import subprocess
import os
browsers = [
("Edge", browser_cookie3.edge),
("Chrome", browser_cookie3.chrome),
("Firefox", browser_cookie3.firefox),
("Chromium", browser_cookie3.chromium),
("Opera", browser_cookie3.opera),
]
for name, func in browsers:
try:
print(f"Try {name}...")
cookies = func(domain_name='douyin.com')
cookie_str = '; '.join([f'{c.name}={c.value}' for c in cookies])
if cookie_str:
print(f"SUCCESS from {name}!")
print(f"Cookie length: {len(cookie_str)}")
# Test download
url = "https://v.douyin.com/R5doyi5_cTk/"
cmd = [
r"C:\Program Files\Python311\python.exe",
"-m", "f2", "dy",
"-M", "one",
"-u", url,
"-p", r"C:\Users\Administrator\Desktop\TestDownload",
"-k", cookie_str,
]
print("Starting download...")
result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='replace')
print(result.stdout)
if result.stderr:
print("STDERR:", result.stderr)
break
except Exception as e:
print(f"{name} failed: {e}")

71
test_direct.py Normal file
View File

@@ -0,0 +1,71 @@
import requests
import re
import json
import os
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Referer': 'https://www.douyin.com/',
}
def get_video_info(share_url):
session = requests.Session()
session.headers.update(headers)
# Get redirect URL
resp = session.get(share_url, allow_redirects=False)
location = resp.headers.get('Location', '')
print(f"Redirect to: {location}")
if location:
# Extract video ID from URL
match = re.search(r'/video/(\d+)', location)
if match:
video_id = match.group(1)
print(f"Video ID: {video_id}")
return video_id
return None
def get_douyin_video_direct(share_url):
session = requests.Session()
session.headers.update({
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
})
# Follow redirects to get the actual video page
resp = session.get(share_url, allow_redirects=True)
print(f"Final URL: {resp.url}")
# Try to find video URL in page source
html = resp.text
# Look for render_data
match = re.search(r'ROUTER_DATA\s*=\s*(\{.+?\})\s*</script>', html, re.DOTALL)
if match:
try:
data = json.loads(match.group(1))
print("Found router data!")
print(json.dumps(data, indent=2, ensure_ascii=False)[:2000])
except:
pass
# Try another pattern
match = re.search(r'_ROUTER_DATA\s*=\s*({.*?})\s*;', html, re.DOTALL)
if match:
try:
data = json.loads(match.group(1))
print("Found _ROUTER_DATA!")
# Navigate to video info
if 'loaderData' in data:
for key, value in data['loaderData'].items():
if 'aweme' in key.lower():
print(f"Found aweme data in {key}")
print(json.dumps(value, indent=2, ensure_ascii=False)[:3000])
except Exception as e:
print(f"Parse error: {e}")
# Test
url = "https://v.douyin.com/R5doyi5_cTk/"
video_id = get_video_info(url)
get_douyin_video_direct(url)

1
version Normal file
View File

@@ -0,0 +1 @@
15000

32
启动UI.bat Normal file
View File

@@ -0,0 +1,32 @@
@echo off
chcp 65001 >nul
cd /d "%~dp0"
echo ====================================
echo Douyin Downloader v3.0
echo Auto Cookie - No Login Required
echo ====================================
echo.
if not exist "C:\Program Files\Python311\python.exe" (
echo [ERROR] Python not found
pause
exit /b 1
)
echo [CHECK] Checking dependencies...
"C:\Program Files\Python311\python.exe" -c "import selenium" 2>nul
if errorlevel 1 (
echo [INSTALL] Installing dependencies...
"C:\Program Files\Python311\python.exe" -m pip install selenium webdriver-manager -q
echo [INSTALL] Done
)
echo [START] Launching...
"C:\Program Files\Python311\python.exe" douyin_ui.py
if errorlevel 1 (
echo.
echo [ERROR] Program error
pause
)

3
启动UI.vbs Normal file
View File

@@ -0,0 +1,3 @@
Set objShell = CreateObject("WScript.Shell")
objShell.CurrentDirectory = "C:\Users\Administrator\Desktop\TikTokDownload-main"
objShell.Run """C:\Program Files\Python311\python.exe"" douyin_ui.py", 1, False