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