Add Douyin video downloader with auto-cookie feature
This commit is contained in:
72
.github/ISSUE_TEMPLATE/--------.md
vendored
Normal file
72
.github/ISSUE_TEMPLATE/--------.md
vendored
Normal 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
26
.github/ISSUE_TEMPLATE/-------.md
vendored
Normal 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
144
.gitignore
vendored
Normal 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
41
API/TikTokTool.txt
Normal 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
50
API/user_base_info.json
Normal 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
14
API/user_post_delete.json
Normal 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
679
API/user_post_detail.json
Normal 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
|
||||||
|
}
|
||||||
743
API/user_post_info_image.json
Normal file
743
API/user_post_info_image.json
Normal file
File diff suppressed because one or more lines are too long
716
API/user_post_info_video.json
Normal file
716
API/user_post_info_video.json
Normal 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
366
API/user_profile_info.json
Normal 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
BIN
Banner.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
49
CODE_OF_CONDUCT.md
Normal file
49
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# 贡献者守则
|
||||||
|
|
||||||
|
本项目欢迎所有人的贡献。为了保证这个社区的友好和专业的环境,我们制定了以下守则,所有的贡献者和维护者都应当遵守。
|
||||||
|
|
||||||
|
## 我们的承诺
|
||||||
|
|
||||||
|
为了促进一个开放和欢迎的环境,我们承诺让参与这个项目的每个人无论年龄、体型、身体健康状况、种族、性别认同与表达、经验水平、教育程度、社会经济地位、国籍、个人外貌、种族、宗教信仰或者性取向等,都不会感到被歧视。
|
||||||
|
|
||||||
|
## 我们的标准
|
||||||
|
|
||||||
|
以下行为可以帮助我们构建一个友好的环境:
|
||||||
|
|
||||||
|
* 使用友好和包容的语言
|
||||||
|
* 尊重不同的观点和经验
|
||||||
|
* 接纳建设性的批评
|
||||||
|
* 关注对社区最有利的事情
|
||||||
|
* 对其他社区成员表现出同情和善意
|
||||||
|
|
||||||
|
以下行为是不被接受的:
|
||||||
|
|
||||||
|
* 使用侮辱性/贬低性的语言或图像,以及人身攻击
|
||||||
|
* 喷子行为或恶意批评
|
||||||
|
* 公开或私下骚扰他人
|
||||||
|
* 发布他人的私人信息,例如实际地址或电子邮件,未经其明确许可
|
||||||
|
* 其他可能被认为不合适或不专业的行为
|
||||||
|
|
||||||
|
## 我们的责任
|
||||||
|
|
||||||
|
项目维护者有责任解释行为标准,并且应当采取适当和公正的纠正措施回应任何违反这些标准的行为。
|
||||||
|
|
||||||
|
项目维护者有权利和责任删除、修改或拒绝不符合本守则的评论(comments)、提交(commits)、代码、wiki 编辑、问题(issues)和其他贡献,他们也可以因为以下行为封禁一个人的参与,包括但不限于:
|
||||||
|
|
||||||
|
* 有骚扰行为
|
||||||
|
* 发表侮辱性或贬损性的评论
|
||||||
|
* 人身攻击
|
||||||
|
* 发布他人的私人信息
|
||||||
|
* 其他不道德的行为
|
||||||
|
|
||||||
|
## 适用范围
|
||||||
|
|
||||||
|
此行为守则适用于项目空间和公共空间,当个体代表项目或其社区时也同样适用。例如,使用官方电子邮件地址、在官方的社交媒体账号发表的,或在公开的在线或离线事件中担任的代表角色等。项目维护者也可能进一步定义和澄清代表项目行为的规范。
|
||||||
|
|
||||||
|
## 执行
|
||||||
|
|
||||||
|
无论是恶劣的行为公开或私下发生,项目维护者都有权进行调查并采取适当的行动,这可能包括警告、暂时禁止或永久禁止对项目的贡献等。
|
||||||
|
|
||||||
|
## 版本历史
|
||||||
|
|
||||||
|
此行为准则版本基于 [Contributor Covenant](https://www.contributor-covenant.org) 版本 2.1。欢迎在此基础上进行修改和适应。
|
||||||
5
Dockerfile
Normal file
5
Dockerfile
Normal 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
346
GUI/Main.ui
Normal 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 "微软雅黑";
|
||||||
|
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 "華康布丁體";</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 "華康布丁體";
|
||||||
|
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 "華康布丁體";
|
||||||
|
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 "華康布丁體";
|
||||||
|
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 "華康布丁體";
|
||||||
|
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
9
GUI/README-EN.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# TKMGUI V2.1.1
|
||||||
|
**Currently, only for the development of the preview version**
|
||||||
|
|
||||||
|
<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)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
9
GUI/README.md
Normal file
9
GUI/README.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# TKMGUI V2.1.1
|
||||||
|
**目前仅为开发预览版**
|
||||||
|
|
||||||
|
<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)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
6
GUI/Resource.qrc
Normal file
6
GUI/Resource.qrc
Normal 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
BIN
GUI/preview.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
1
GUI/requirements.txt
Normal file
1
GUI/requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
648
GUI/resource.py
Normal file
648
GUI/resource.py
Normal 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
21
LICENSE
Normal 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
324
README-EN.md
Normal file
@@ -0,0 +1,324 @@
|
|||||||
|

|
||||||
|
|
||||||
|
<h1 align="center">✨ TikTok Watermark-Free Video Downloader ✨</h1>
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
[简体中文](README.md) | English
|
||||||
|
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload/blob/main/LICENSE)
|
||||||
|

|
||||||
|

|
||||||
|
[](https://github.com/BeyondDimension/SteamTools/search?l=c%23)
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|

|
||||||
|
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|
|
||||||
|
[](https://www.jsdelivr.com/package/gh/Johnserf-Seed/TikTokDownload)
|
||||||
|
[](https://hits.seeyoufarm.com)
|
||||||
|
[](https://discord.gg/q3hA8qQZbG)
|
||||||
|
[](https://www.patreon.com/TikTokDownload713)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## 🚀 Environmental Preparation/Environment
|
||||||
|
|
||||||
|
> [](https://aka.ms/terminal)
|
||||||
|
>
|
||||||
|
> The old console doesn't adapt well; using Windows Terminal is recommended.
|
||||||
|
>
|
||||||
|
> [](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.
|
||||||
|
>
|
||||||
|
> [](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>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</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
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Thank you for supporting this project! If you find this project helpful, please consider sponsoring. You can directly visit our [](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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
370
README.md
Normal file
370
README.md
Normal file
@@ -0,0 +1,370 @@
|
|||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<h1 align="center">✨ 抖音去水印作品下载 ✨</h1>
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
[English](README-EN.md) | 简体中文
|
||||||
|
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload/blob/main/LICENSE)
|
||||||
|

|
||||||
|

|
||||||
|
[](https://github.com/BeyondDimension/SteamTools/search?l=c%23)
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|

|
||||||
|
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|
[](https://github.com/Johnserf-Seed/TikTokDownload)
|
||||||
|
|
||||||
|
[](https://pepy.tech/project/f2)
|
||||||
|
[](https://badge.fury.io/py/f2)
|
||||||
|
[](https://www.jsdelivr.com/package/gh/Johnserf-Seed/TikTokDownload)
|
||||||
|
[](https://hits.seeyoufarm.com)
|
||||||
|
[](https://beta-web.tikhub.io/users/signup?referral_code=6hLcGD94)
|
||||||
|
[](https://discord.gg/3PhtPmgHf8)
|
||||||
|
[](https://www.patreon.com/TikTokDownload713)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
## 🚀 环境准备/Environment
|
||||||
|
|
||||||
|
> [](https://aka.ms/terminal)
|
||||||
|
>
|
||||||
|
> 旧的控制台无法很好适配,推荐使用Windows Terminal。
|
||||||
|
>
|
||||||
|
> [](https://www.python.org/ftp/python/3.11.1/python-3.11.1-amd64.exe)
|
||||||
|
>
|
||||||
|
> Python3.11.1 低于该版本可能会有意外的错误
|
||||||
|
>
|
||||||
|
> [](https://github.com/Johnserf-Seed/TikTokDownload/releases/tag/v1.4.2.2)
|
||||||
|
>
|
||||||
|
> 更新F2前的最后一个发行版下载
|
||||||
|
|
||||||
|
<details><summary> ⚙ Windows Terminal 设置(必看) </summary>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</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 版本 1809(OS 内部版本 17763)或更高版本
|
||||||
|
- macOS Monterey(12.0)或更高版本
|
||||||
|
- macOS Big Sur(11.0)或更高版本
|
||||||
|
- macOS Catalina(10.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://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
|
||||||
|
|
||||||
|
我们欢迎任何形式的贡献,无论是提交错误报告,提出改进意见,或者是提供代码和文档。我们都欣赏你的帮助。
|
||||||
|
|
||||||
|

|
||||||
197
Server/Server.py
Normal file
197
Server/Server.py
Normal 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
41
Server/Server.txt
Normal 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
9
Server/build-win.bat
Normal 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
6
Server/package.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"crypto-js": "^4.1.1",
|
||||||
|
"md5": "^2.3.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Server/requirements.txt
Normal file
2
Server/requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Flask==2.2.5
|
||||||
|
PyExecJS==1.5.1
|
||||||
15
Server/s_v_web_id.js
Normal file
15
Server/s_v_web_id.js
Normal 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
31
Server/s_v_web_id.py
Normal 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
132
Server/x-bogus.js
Normal 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
27
Server/x-tt-params.js
Normal 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
52
TikTokTool.py
Normal 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
1
_config.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
theme: jekyll-theme-architect
|
||||||
131
auto_cookie.py
Normal file
131
auto_cookie.py
Normal 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("测试:自动获取Cookie(Edge本地驱动)")
|
||||||
|
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
131
auto_cookie_selenium.py
Normal 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("测试:自动获取Cookie(Edge本地驱动)")
|
||||||
|
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
1
douyin_cookie.txt
Normal 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
382
douyin_ui.py
Normal 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
156
download_with_cookie.py
Normal 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
BIN
f2-logo.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
f2
|
||||||
2
run-server.bat
Normal file
2
run-server.bat
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
cd Server
|
||||||
|
py Server.py
|
||||||
2
run-server.sh
Normal file
2
run-server.sh
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
cd Server
|
||||||
|
python3 Server.py
|
||||||
261
simple_download.py
Normal file
261
simple_download.py
Normal 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
105
test_auto_download.py
Normal 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
40
test_cookie.py
Normal 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
71
test_direct.py
Normal 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)
|
||||||
32
启动UI.bat
Normal file
32
启动UI.bat
Normal 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
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user