From 0f3dd8f2871d5171437cb1723a86c082f5940ba2 Mon Sep 17 00:00:00 2001 From: 237899745 <237899745@qq.com> Date: Mon, 2 Mar 2026 21:42:52 +0800 Subject: [PATCH] Add Douyin video downloader with auto-cookie feature --- .github/ISSUE_TEMPLATE/--------.md | 72 +++ .github/ISSUE_TEMPLATE/-------.md | 26 + .gitignore | 144 ++++++ API/TikTokTool.txt | 41 ++ API/user_base_info.json | 50 ++ API/user_post_delete.json | 14 + API/user_post_detail.json | 679 ++++++++++++++++++++++++++ API/user_post_info_image.json | 743 +++++++++++++++++++++++++++++ API/user_post_info_video.json | 716 +++++++++++++++++++++++++++ API/user_profile_info.json | 366 ++++++++++++++ Banner.png | Bin 0 -> 30599 bytes CODE_OF_CONDUCT.md | 49 ++ Dockerfile | 5 + GUI/Main.ui | 346 ++++++++++++++ GUI/README-EN.md | 9 + GUI/README.md | 9 + GUI/Resource.qrc | 6 + GUI/preview.png | Bin 0 -> 22328 bytes GUI/requirements.txt | 1 + GUI/resource.py | 648 +++++++++++++++++++++++++ LICENSE | 21 + README-EN.md | 324 +++++++++++++ README.md | 370 ++++++++++++++ Server/Server.py | 197 ++++++++ Server/Server.txt | 41 ++ Server/build-win.bat | 9 + Server/package.json | 6 + Server/requirements.txt | 2 + Server/s_v_web_id.js | 15 + Server/s_v_web_id.py | 31 ++ Server/x-bogus.js | 132 +++++ Server/x-tt-params.js | 27 ++ TikTokTool.py | 52 ++ _config.yml | 1 + auto_cookie.py | 131 +++++ auto_cookie_selenium.py | 131 +++++ douyin_cookie.txt | 1 + douyin_ui.py | 382 +++++++++++++++ download_with_cookie.py | 156 ++++++ f2-logo.ico | Bin 0 -> 29873 bytes requirements.txt | 1 + run-server.bat | 2 + run-server.sh | 2 + simple_download.py | 261 ++++++++++ test_auto_download.py | 105 ++++ test_cookie.py | 40 ++ test_direct.py | 71 +++ version | 1 + 启动UI.bat | 32 ++ 启动UI.vbs | 3 + 50 files changed, 6471 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/--------.md create mode 100644 .github/ISSUE_TEMPLATE/-------.md create mode 100644 .gitignore create mode 100644 API/TikTokTool.txt create mode 100644 API/user_base_info.json create mode 100644 API/user_post_delete.json create mode 100644 API/user_post_detail.json create mode 100644 API/user_post_info_image.json create mode 100644 API/user_post_info_video.json create mode 100644 API/user_profile_info.json create mode 100644 Banner.png create mode 100644 CODE_OF_CONDUCT.md create mode 100644 Dockerfile create mode 100644 GUI/Main.ui create mode 100644 GUI/README-EN.md create mode 100644 GUI/README.md create mode 100644 GUI/Resource.qrc create mode 100644 GUI/preview.png create mode 100644 GUI/requirements.txt create mode 100644 GUI/resource.py create mode 100644 LICENSE create mode 100644 README-EN.md create mode 100644 README.md create mode 100644 Server/Server.py create mode 100644 Server/Server.txt create mode 100644 Server/build-win.bat create mode 100644 Server/package.json create mode 100644 Server/requirements.txt create mode 100644 Server/s_v_web_id.js create mode 100644 Server/s_v_web_id.py create mode 100644 Server/x-bogus.js create mode 100644 Server/x-tt-params.js create mode 100644 TikTokTool.py create mode 100644 _config.yml create mode 100644 auto_cookie.py create mode 100644 auto_cookie_selenium.py create mode 100644 douyin_cookie.txt create mode 100644 douyin_ui.py create mode 100644 download_with_cookie.py create mode 100644 f2-logo.ico create mode 100644 requirements.txt create mode 100644 run-server.bat create mode 100644 run-server.sh create mode 100644 simple_download.py create mode 100644 test_auto_download.py create mode 100644 test_cookie.py create mode 100644 test_direct.py create mode 100644 version create mode 100644 启动UI.bat create mode 100644 启动UI.vbs diff --git a/.github/ISSUE_TEMPLATE/--------.md b/.github/ISSUE_TEMPLATE/--------.md new file mode 100644 index 0000000..22b4ac8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/--------.md @@ -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`。 + + +**详细描述错误** +简明扼要地描述遇到的错误。 + +**系统平台** +
+单击展开 +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] + +
+ +**错误重现** +
+单击展开 +Q: 请你复制并粘贴出错时运行的命令和配置文件内容,以及重现该行为的步骤。如果你一次性就提供完整信息,就会节省很多解决问题的时间。 + +A: + +1. +2. +3. + +Q: 请添加调试命令`f2 -d DEBUG`重新运行出错的命令并提供日志目录下的日志文件。 + +A: + +Q: 如果是开发者请提供最小的代码示例 + +A: + +```python + +``` + +
+ +**预期行为** +简明扼要地描述期望发生的事情。 + +**屏幕截图** +请添加截图以帮助解释你的问题。 + +**日志文件** +请添加调试日志文件以帮助解释你的问题。 + +**其他** +如有,可以添加有关问题的其他信息。 diff --git a/.github/ISSUE_TEMPLATE/-------.md b/.github/ISSUE_TEMPLATE/-------.md new file mode 100644 index 0000000..0a47b90 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/-------.md @@ -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: + +**其他** +如有,请添加有关功能请求的任何其他内容或截图。 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a440f2 --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/API/TikTokTool.txt b/API/TikTokTool.txt new file mode 100644 index 0000000..ade4452 --- /dev/null +++ b/API/TikTokTool.txt @@ -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])]) + ] +) \ No newline at end of file diff --git a/API/user_base_info.json b/API/user_base_info.json new file mode 100644 index 0000000..2f9352d --- /dev/null +++ b/API/user_base_info.json @@ -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" + } +} \ No newline at end of file diff --git a/API/user_post_delete.json b/API/user_post_delete.json new file mode 100644 index 0000000..954ac99 --- /dev/null +++ b/API/user_post_delete.json @@ -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 +} \ No newline at end of file diff --git a/API/user_post_detail.json b/API/user_post_detail.json new file mode 100644 index 0000000..c024729 --- /dev/null +++ b/API/user_post_detail.json @@ -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 +} \ No newline at end of file diff --git a/API/user_post_info_image.json b/API/user_post_info_image.json new file mode 100644 index 0000000..66aeaa3 --- /dev/null +++ b/API/user_post_info_image.json @@ -0,0 +1,743 @@ +{ + "status_code": 0, + "min_cursor": 1689909551000, + "max_cursor": 1689909551000, + "has_more": 1, + "aweme_list": [ + { + "aweme_id": "7232626237586312485", + "desc": "辣妹统治世界٩(˃̶͈̀௰˂̶͈́)و。#ootd穿搭 #氛围感 #女友穿搭#辣妹穿搭 #生活碎片", + "create_time": 1683977029, + "author": { + "uid": "64115698134", + "ky_only_predict": 0, + "nickname": "肥牛卷儿(我爱吴世勋", + "data_label_list": null, + "user_not_show": 1, + "homepage_bottom_toast": null, + "avatar_thumb": { + "uri": "100x100/aweme-avatar/tos-cn-avt-0015_0f0f760731f3a659ad557fb9718a7019", + "url_list": [ + "https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-avt-0015_0f0f760731f3a659ad557fb9718a7019.jpeg?from=116350172" + ], + "width": 720, + "height": 720 + }, + "cf_list": null, + "is_ban": false, + "show_nearby_active": false, + "follow_status": 0, + "aweme_count": 208, + "following_count": 4, + "follower_count": 457352, + "favoriting_count": 133, + "total_favorited": 14192407, + "link_item_list": null, + "hide_search": true, + "constellation": 10, + "not_seen_item_id_list_v2": null, + "offline_info_list": null, + "weibo_verify": "", + "custom_verify": "", + "sec_uid": "MS4wLjABAAAA-hFsLR8fSnbmWhrmAEnGvYgG6rM2txNpNm2oT9WSrIQ", + "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": "6709002b0726ba37852d", + "url_list": [ + "https://p9-pc-sign.douyinpic.com/obj/6709002b0726ba37852d?x-expires=1691017200&x-signature=N5pryQ1sD408IDBdB1G0HOL4gzs%3D&from=116350172", + "https://p3-pc-sign.douyinpic.com/obj/6709002b0726ba37852d?x-expires=1691017200&x-signature=4%2FKt4LGxET25WkvDLMLld0wrUoc%3D&from=116350172", + "https://p6-pc-sign.douyinpic.com/obj/6709002b0726ba37852d?x-expires=1691017200&x-signature=CdxAS1ooJ2O%2FDcJkvdCQQgRwYLw%3D&from=116350172" + ], + "width": 720, + "height": 720 + }, + "share_title_myself": "", + "share_title_other": "", + "share_desc_info": "" + }, + "aweme_hotsoon_auth": 1, + "user_tags": null, + "need_points": null, + "enterprise_verify_reason": "", + "user_permissions": null, + "follower_list_secondary_information_struct": null, + "display_info": null, + "account_region": "", + "enable_nearby_visible": false, + "im_role_ids": null, + "live_agreement": 0, + "follower_request_status": 0, + "with_shop_entry": false, + "search_impr": { + "entity_id": "64115698134" + }, + "user_not_see": 0, + "has_orders": false, + "prevent_download": false, + "show_image_bubble": false, + "is_blocking_v2": false, + "unique_id_modify_time": 1690995606, + "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": true, + "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_0f0f760731f3a659ad557fb9718a7019", + "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://p9-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1692205200&x-signature=UFlvC%2FAJrGf9iYLQR1OJLJVURQM%3D&from=116350172", + "https://p6-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1692205200&x-signature=6PNBiaCXEae1yyR%2BHUIVfF2Vh%2BY%3D&from=116350172", + "https://p3-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1692205200&x-signature=Wq6LxfQKvmy1b6kAA2srRciA%2BMw%3D&from=116350172" + ], + "width": 720, + "height": 720 + } + ], + "card_entries_not_display": null, + "has_insights": false, + "share_qrcode_uri": "6709002b0726ba37852d", + "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 + }, + "music": { + "id": 7203284398119225346, + "id_str": "7203284398119225346", + "title": "BABYDOLL (新版)", + "author": "星野新一", + "album": "多秋", + "cover_hd": { + "uri": "tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz", + "url_list": [ + "https://p26.douyinpic.com/aweme/1080x1080/tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz.jpeg", + "https://p6.douyinpic.com/aweme/1080x1080/tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz.jpeg" + ], + "width": 720, + "height": 720 + }, + "cover_large": { + "uri": "tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz", + "url_list": [ + "https://p26.douyinpic.com/aweme/720x720/tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz.jpeg", + "https://p6.douyinpic.com/aweme/720x720/tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz.jpeg" + ], + "width": 720, + "height": 720 + }, + "cover_medium": { + "uri": "tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz", + "url_list": [ + "https://p26.douyinpic.com/aweme/200x200/tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz.jpeg", + "https://p6.douyinpic.com/aweme/200x200/tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz.jpeg" + ], + "width": 720, + "height": 720 + }, + "cover_thumb": { + "uri": "tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz", + "url_list": [ + "https://p26.douyinpic.com/aweme/100x100/tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz.jpeg", + "https://p6.douyinpic.com/aweme/100x100/tos-cn-v-2774c002/oofuwAByVBRVAxCAhPWBCsNAoSoNE9pAWtuwEz.jpeg" + ], + "width": 720, + "height": 720 + }, + "play_url": { + "uri": "https://sf3-cdn-tos.douyinstatic.com/obj/tos-cn-ve-2774/oM6Jt8KtDYaQgWr6OsbuyqcCZefYknQ6BdZ6BT", + "url_list": [ + "https://sf3-cdn-tos.douyinstatic.com/obj/tos-cn-ve-2774/oM6Jt8KtDYaQgWr6OsbuyqcCZefYknQ6BdZ6BT", + "https://sf86-cdn-tos.douyinstatic.com/obj/tos-cn-ve-2774/oM6Jt8KtDYaQgWr6OsbuyqcCZefYknQ6BdZ6BT" + ], + "width": 720, + "height": 720, + "url_key": "7203284398119225346" + }, + "schema_url": "", + "source_platform": 10033, + "start_time": 0, + "end_time": 0, + "duration": 60, + "extra": "{\"reviewed\":0,\"review_unshelve_reason\":0,\"douyin_beats_info\":{},\"music_label_id\":6,\"loudness\":\"-7.497722\",\"cover_colors\":{\"rgb\":[246,219,243]},\"music_tagging\":{\"Languages\":[\"English\"],\"Moods\":null,\"Genres\":null,\"Themes\":[\"Low\"],\"AEDs\":[\"Vocal\"],\"SingingVersions\":null,\"Instruments\":null},\"is_red\":0,\"is_aed_music\":0,\"dsp_switch\":0,\"has_edited\":0,\"beats\":{\"audio_effect_onset\":\"https://sf86-cdn-tos.douyinstatic.com/obj/tos-cn-v-2774c002/7f97e721f8574d09b6ba1aa178874707\",\"beats_tracker\":\"https://sf6-cdn-tos.douyinstatic.com/obj/tos-cn-v-2774c002/3b29238855df486ca79a7bf6aa8681bf\",\"energy_trace\":\"https://sf3-cdn-tos.douyinstatic.com/obj/tos-cn-v-2774c002/235edc65924b4d7cb1c8a557650d4a60\",\"merged_beats\":\"https://sf86-cdn-tos.douyinstatic.com/obj/tos-cn-v-2774c002/d94342cd4ef64905b5bd57c00921c36a\"},\"schedule_search_time\":0,\"aggregate_exempt_conf\":[],\"with_aed_model\":0,\"peak\":\"1.0452917\",\"hotsoon_review_time\":-1,\"is_subsidy_exp\":false}", + "user_count": 0, + "position": null, + "collect_stat": 0, + "status": 1, + "offline_desc": "", + "owner_nickname": "", + "is_original": false, + "mid": "7203284398119225346", + "binded_challenge_id": 0, + "redirect": false, + "is_restricted": false, + "author_deleted": false, + "is_del_video": false, + "is_video_self_see": false, + "owner_handle": "", + "author_position": null, + "prevent_download": false, + "strong_beat_url": { + "uri": "https://sf86-cdn-tos.douyinstatic.com/obj/tos-cn-v-2774c002/c8c23d5034ba4559b2eab9065b1339c1", + "url_list": [ + "https://sf86-cdn-tos.douyinstatic.com/obj/tos-cn-v-2774c002/c8c23d5034ba4559b2eab9065b1339c1", + "https://sf6-cdn-tos.douyinstatic.com/obj/tos-cn-v-2774c002/c8c23d5034ba4559b2eab9065b1339c1" + ], + "width": 720, + "height": 720 + }, + "unshelve_countries": null, + "prevent_item_download_status": 0, + "external_song_info": [], + "preview_start_time": 0, + "preview_end_time": 0, + "is_commerce_music": false, + "is_original_sound": false, + "audition_duration": 60, + "shoot_duration": 60, + "reason_type": 0, + "artists": [], + "lyric_short_position": null, + "mute_share": false, + "tag_list": null, + "dmv_auto_show": false, + "is_pgc": true, + "is_matched_metadata": false, + "is_audio_url_with_cookie": false, + "music_chart_ranks": null, + "can_background_play": true, + "music_status": 1, + "video_duration": 60, + "pgc_music_type": 2, + "cover_color_hsv": { + "h": -52, + "s": 11, + "v": 96 + }, + "search_impr": { + "entity_id": "7203284398119225346" + }, + "song": { + "id": 7203284393765537793, + "id_str": "7203284393765537793", + "title": "BABYDOLL (新版)", + "artists": null, + "chorus": { + "start_ms": 21504, + "duration_ms": 23232 + }, + "chorus_v3_infos": null + }, + "artist_user_infos": null, + "dsp_status": 10, + "musician_user_infos": null, + "luna_info": { + "is_luna_user": false, + "has_copyright": false + }, + "music_collect_count": 0, + "music_cover_atmosphere_color_value": "" + }, + "slides_music_beats": null, + "video": { + "play_addr": { + "uri": "https://sf3-cdn-tos.douyinstatic.com/obj/tos-cn-ve-2774/oM6Jt8KtDYaQgWr6OsbuyqcCZefYknQ6BdZ6BT", + "url_list": [ + "https://sf3-cdn-tos.douyinstatic.com/obj/tos-cn-ve-2774/oM6Jt8KtDYaQgWr6OsbuyqcCZefYknQ6BdZ6BT", + "https://sf86-cdn-tos.douyinstatic.com/obj/tos-cn-ve-2774/oM6Jt8KtDYaQgWr6OsbuyqcCZefYknQ6BdZ6BT" + ], + "width": 720, + "height": 720, + "url_key": "7203284398119225346" + }, + "cover": { + "uri": "tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2", + "url_list": [ + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~noop.jpeg?x-expires=1692205200&x-signature=Yv%2BgEKcE10bTwft3GIluKjVivMo%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&biz_tag=pcweb_cover&l=20230803010005712927738F4143360D62", + "https://p6-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~noop.jpeg?x-expires=1692205200&x-signature=vJ4RkrzNXP4xL0cza7kRrgtru00%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&biz_tag=pcweb_cover&l=20230803010005712927738F4143360D62", + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~noop.jpeg?x-expires=1692205200&x-signature=91qKVf%2Buz4fDjIArCjlYWi1jjeo%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&biz_tag=pcweb_cover&l=20230803010005712927738F4143360D62" + ], + "width": 720, + "height": 720 + }, + "height": 1918, + "width": 1440, + "origin_cover": { + "uri": "tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2", + "url_list": [ + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~noop.jpeg?x-expires=1692205200&x-signature=91qKVf%2Buz4fDjIArCjlYWi1jjeo%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&biz_tag=pcweb_cover&l=20230803010005712927738F4143360D62", + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~noop.jpeg?x-expires=1692205200&x-signature=Yv%2BgEKcE10bTwft3GIluKjVivMo%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&biz_tag=pcweb_cover&l=20230803010005712927738F4143360D62", + "https://p6-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~noop.jpeg?x-expires=1692205200&x-signature=vJ4RkrzNXP4xL0cza7kRrgtru00%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&biz_tag=pcweb_cover&l=20230803010005712927738F4143360D62" + ], + "width": 720, + "height": 720 + }, + "ratio": "default", + "meta": "", + "bit_rate": [], + "duration": 0, + "bit_rate_audio": null, + "big_thumbs": null + }, + "share_url": "https://www.iesdouyin.com/share/video/7232626237586312485/?region=CN&mid=7203284398119225346&u_code=l1j9bkbd&did=MS4wLjABAAAAtqpCx0hpOERbdSzQdjRZw-wFPxaqdbAzsKDmbJMUI3KWlMGQHC-n6dXAqa-dM2EP&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&titleType=title&schema_type=37&share_sign=wjgkFzHXh6p.xcQ.fS.Ficm9.QSyu256DJAsxMt1IGI-&share_version=170400&ts=1690995606&from_ssr=1", + "user_digged": 0, + "statistics": { + "admire_count": 1, + "comment_count": 166, + "digg_count": 20629, + "collect_count": 1572, + "play_count": 0, + "share_count": 406 + }, + "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": 27, + "type": 1, + "hashtag_name": "ootd穿搭", + "hashtag_id": "1645837370349579", + "is_commerce": false + }, + { + "start": 29, + "end": 33, + "type": 1, + "hashtag_name": "氛围感", + "hashtag_id": "1640936621124619", + "is_commerce": false + }, + { + "start": 34, + "end": 39, + "type": 1, + "hashtag_name": "女友穿搭", + "hashtag_id": "1621254417954830", + "is_commerce": false + }, + { + "start": 39, + "end": 44, + "type": 1, + "hashtag_name": "辣妹穿搭", + "hashtag_id": "1661587378647047", + "is_commerce": false + }, + { + "start": 45, + "end": 50, + "type": 1, + "hashtag_name": "生活碎片", + "hashtag_id": "1605855447219300", + "is_commerce": false + } + ], + "is_top": 0, + "preview_video_status": 1, + "share_info": { + "share_url": "https://www.iesdouyin.com/share/video/7232626237586312485/?region=CN&mid=7203284398119225346&u_code=l1j9bkbd&did=MS4wLjABAAAAtqpCx0hpOERbdSzQdjRZw-wFPxaqdbAzsKDmbJMUI3KWlMGQHC-n6dXAqa-dM2EP&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&titleType=title&schema_type=37&share_sign=wjgkFzHXh6p.xcQ.fS.Ficm9.QSyu256DJAsxMt1IGI-&share_version=170400&ts=1690995606&from_ssr=1", + "share_link_desc": "8.74 Jvs:/ 辣妹统治世界٩(˃̶͈̀௰˂̶͈́)و。# ootd穿搭 # 氛围感 # 女友穿搭# 辣妹穿搭 # 生活碎片 %s 复制此链接,打开Dou音搜索,直接观看视频!" + }, + "distribute_circle": { + "distribute_type": 0, + "campus_block_interaction": false, + "is_campus": false + }, + "video_labels": [], + "user_recommend_status": 0, + "media_type": 2, + "duration": 0, + "aweme_type": 68, + "book_bar": {}, + "image_crop_ctrl": 0, + "image_infos": null, + "main_arch_common": "{\"music_detail_fail_reason\":\"no_sound\",\"music_detail_fail_type\":1,\"music_detail_fail_toast\":\"该作品没有声音\"}", + "collection_corner_mark": 0, + "seo_info": {}, + "position": null, + "uniqid_position": null, + "comment_list": null, + "author_user_id": 64115698134, + "jump_tab_info_list": null, + "geofencing": [], + "voice_modify_id_list": null, + "image_comment": {}, + "region": "CN", + "video_text": [], + "dislike_dimension_list": null, + "collect_stat": 0, + "label_top_text": null, + "promotions": [], + "group_id": "7232626237586312485", + "prevent_download": false, + "nickname_position": null, + "challenge_position": null, + "author_mask_tag": 0, + "is_image_beat": false, + "chapter_list": null, + "long_video": null, + "vtag_search": { + "vtag_enable": true, + "vtag_delay_ts": 4 + }, + "packed_clips": null, + "should_open_ad_report": false, + "super_like_status": 0, + "interaction_stickers": null, + "preview_title": "辣妹统治世界٩(˃̶͈̀௰˂̶͈́)و。#ootd穿搭 #氛围感 #女友穿搭#辣妹穿搭 #生活碎片", + "origin_comment_ids": null, + "commerce_config_data": null, + "dislike_dimension_list_v2": null, + "standard_bar_info_list": null, + "aweme_control": { + "can_forward": true, + "can_share": true, + "can_comment": true, + "can_show_comment": true + }, + "video_game_data_channel_config": {}, + "mix_info": { + "mix_id": "7238089454588528701", + "mix_name": "穿搭图文(⁎⁍̴̛ᴗ⁍̴̛⁎)", + "cover_url": { + "uri": "douyin-user-image-file/da2d54a80674cd272dce92735d73068c", + "url_list": [ + "https://p5-a-sign.douyinpic.com/obj/douyin-user-image-file/da2d54a80674cd272dce92735d73068c?x-expires=1692205200&x-signature=OgOZOAC7yg3yJjjiJGD7r2zBEqA%3D&from=116350172", + "https://p3-sign.douyinpic.com/obj/douyin-user-image-file/da2d54a80674cd272dce92735d73068c?x-expires=1692205200&x-signature=EpF94BNwjOB7SwjzFGstDe%2FsEIM%3D&from=116350172", + "https://p9-sign.douyinpic.com/obj/douyin-user-image-file/da2d54a80674cd272dce92735d73068c?x-expires=1692205200&x-signature=Lh6hMXBNsum7TNK4BClTA%2Bh%2BWSE%3D&from=116350172" + ], + "width": 720, + "height": 720 + }, + "status": { + "status": 2, + "is_collected": 0 + }, + "statis": { + "play_vv": 0, + "collect_vv": 0, + "current_episode": 1, + "updated_to_episode": 9 + }, + "desc": "", + "extra": "{\"create_source\":0,\"douyin_search_mix_copyright_block_area\":\"\",\"douyin_search_mix_lvideo_actors\":\" \",\"douyin_search_mix_lvideo_cid\":\"\",\"douyin_search_mix_lvideo_name\":\"\",\"douyin_search_mix_lvideo_tags\":\"\",\"douyin_search_mix_lvideo_type\":\"\",\"douyin_search_ocr_content\":\"\",\"douyin_search_user_generated_title\":\" \",\"enter_from\":\"app\",\"first_reviewed\":1,\"is_conflict\":false,\"last_added_item_time\":1685249026,\"mix_ad_info\":{\"copy_right_item_count\":9,\"music_physical_game_count\":0,\"risk_copy_right_item_count\":0},\"mix_earliest_video_creation_time\":0,\"mix_latest_video_creation_time\":0,\"mix_lvideo_quality_match\":0,\"mix_lvideo_quality_text\":0,\"mix_movie_commentary_type\":0,\"mix_ocr_mining_terms\":\"\",\"mix_pic_type\":2,\"mix_title_mining_terms\":\"\",\"next_info\":{\"cover\":\"douyin-user-image-file/da2d54a80674cd272dce92735d73068c\",\"desc\":\"\",\"name\":\"穿搭图文(⁎⁍̴̛ᴗ⁍̴̛⁎)\"},\"pic_item_count\":8,\"segmentation\":\"穿 搭 图文 ( ⁎ ⁍ ̴ ̛ ᴗ ⁍ ̴ ̛ ⁎ )\",\"top_item_content_label\":{\"2001\":1,\"2003\":1,\"2014\":3,\"2029\":4}}", + "share_info": { + "share_url": "https://www.iesdouyin.com/share/mix/detail/7238089454588528701/?schema_type=24&object_id=7238089454588528701&from_ssr=1", + "share_weibo_desc": "4.15 Duf:/ 我正在看【穿搭图文(⁎⁍̴̛ᴗ⁍̴̛⁎)】长按复制此条消息,打开抖音搜索,一起看合集~", + "share_desc": "3.58 Atr:/ 我正在看【穿搭图文(⁎⁍̴̛ᴗ⁍̴̛⁎)】长按复制此条消息,打开抖音搜索,一起看合集~", + "share_title": "这么有趣的合集,不能只有我一个人知道吧", + "share_title_myself": "", + "share_title_other": "", + "share_desc_info": "4.15 Duf:/ 我正在看【穿搭图文(⁎⁍̴̛ᴗ⁍̴̛⁎)】长按复制此条消息,打开抖音搜索,一起看合集~" + }, + "mix_type": 0, + "create_time": 1685249026, + "update_time": 1685252084, + "ids": null, + "watched_item": "", + "is_serial_mix": 0, + "mix_pic_type": 2 + }, + "comment_words_recommend": { + "zero_comment": null + }, + "anchor_info": { + "type": 2, + "id": "6601123594271459336", + "icon": { + "uri": "", + "url_list": [], + "width": 720, + "height": 720, + "url_key": "https://p9-pc-sign.douyinpic.com/obj/33a2200013bb98733b01e?x-expires=1691168400&x-signature=1M12aMUABYvSi4qTtvKt55zFCMI%3D&from=2788469086" + }, + "title": "", + "open_url": "", + "web_url": "", + "mp_url": "", + "title_tag": "", + "content": "{}", + "style_info": { + "scene_icon": "{\"feed\":\"https://p9-pc-sign.douyinpic.com/obj/33a2200013bb98733b01e?x-expires=1691168400&x-signature=1M12aMUABYvSi4qTtvKt55zFCMI%3D&from=2788469086\"}", + "extra": "{}" + }, + "extra": "{\"poi_id\":\"6601123594271459336\",\"poi_name\":\"武汉市\",\"type_code\":\"190104\",\"user_count\":232583541,\"item_count\":36452424,\"share_info\":{\"share_url\":\"https://aweme.snssdk.com/falcon/poi_mwa/poi_detail?poi_id=B001B16JYH\",\"share_weibo_desc\":\"武汉市附近超多有趣的抖音视频,一起来玩,戳这里\",\"share_desc\":\"\",\"share_title\":\"武汉市附近超多有趣的抖音视频,一起来玩,戳这里\",\"bool_persist\":0,\"share_title_myself\":\"\",\"share_title_other\":\"\",\"share_desc_info\":\"武汉市附近超多有趣的抖音视频,一起来玩,戳这里\",\"life_share_ext\":\"{\\\"life_share_id\\\":\\\"a932354e1c6a44ddb62fe45d6a3d9ab2\\\",\\\"from_user_id\\\":71774324045}\"},\"cover_hd\":{\"uri\":\"42dd001cf2907be11106\",\"url_list\":[\"https://p9-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=fa68Vvp5geTmDIMgII8SMUMeSGo%3D\\u0026from=2788469086\",\"https://p3-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=h6fyUI6AwWLYRmwflAaG83Rr6xA%3D\\u0026from=2788469086\",\"https://p6-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=LfwKv5CluheoPJCW8TTFd1RtNgM%3D\\u0026from=2788469086\"],\"width\":720,\"height\":720},\"cover_large\":{\"uri\":\"42dd001cf2907be11106\",\"url_list\":[\"https://p9-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=fa68Vvp5geTmDIMgII8SMUMeSGo%3D\\u0026from=2788469086\",\"https://p3-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=h6fyUI6AwWLYRmwflAaG83Rr6xA%3D\\u0026from=2788469086\",\"https://p6-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=LfwKv5CluheoPJCW8TTFd1RtNgM%3D\\u0026from=2788469086\"],\"width\":720,\"height\":720},\"cover_medium\":{\"uri\":\"42dd001cf2907be11106\",\"url_list\":[\"https://p9-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=fa68Vvp5geTmDIMgII8SMUMeSGo%3D\\u0026from=2788469086\",\"https://p3-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=h6fyUI6AwWLYRmwflAaG83Rr6xA%3D\\u0026from=2788469086\",\"https://p6-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=LfwKv5CluheoPJCW8TTFd1RtNgM%3D\\u0026from=2788469086\"],\"width\":720,\"height\":720},\"cover_thumb\":{\"uri\":\"42dd001cf2907be11106\",\"url_list\":[\"https://p9-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=fa68Vvp5geTmDIMgII8SMUMeSGo%3D\\u0026from=2788469086\",\"https://p3-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=h6fyUI6AwWLYRmwflAaG83Rr6xA%3D\\u0026from=2788469086\",\"https://p6-pc-sign.douyinpic.com/obj/42dd001cf2907be11106?x-expires=1691168400\\u0026x-signature=LfwKv5CluheoPJCW8TTFd1RtNgM%3D\\u0026from=2788469086\"],\"width\":720,\"height\":720},\"distance\":\"\",\"address_info\":{\"province\":\"湖北省\",\"city\":\"武汉市\",\"district\":\"\",\"address\":\"\",\"simple_addr\":\"武汉市\",\"city_code\":\"420100\",\"country\":\"中国\",\"country_code\":\"CN\",\"ad_code_v2\":\"420102\",\"city_code_v2\":\"420100\"},\"icon_type\":8,\"collect_stat\":0,\"poi_longitude\":114.298972,\"poi_latitude\":30.59573,\"expand_type\":0,\"icon_on_map\":{\"uri\":\"a098001211c7e534f72c\",\"url_list\":[\"https://p9-pc-sign.douyinpic.com/obj/a098001211c7e534f72c?x-expires=1691168400\\u0026x-signature=%2FsT%2ByvBszjpvTSMtlbHN4yPbcJ8%3D\\u0026from=2788469086\",\"https://p6-pc-sign.douyinpic.com/obj/a098001211c7e534f72c?x-expires=1691168400\\u0026x-signature=Tnom2CBjZS3X9HspqgPyfag7p1c%3D\\u0026from=2788469086\",\"https://p3-pc-sign.douyinpic.com/obj/a098001211c7e534f72c?x-expires=1691168400\\u0026x-signature=0SpYU5iYIzL%2BlSx0ROHlvWYJsPQ%3D\\u0026from=2788469086\"],\"width\":720,\"height\":720},\"icon_on_entry\":{\"uri\":\"33a2200013bb98733b01e\",\"url_list\":[\"https://p9-pc-sign.douyinpic.com/obj/33a2200013bb98733b01e?x-expires=1691168400\\u0026x-signature=1M12aMUABYvSi4qTtvKt55zFCMI%3D\\u0026from=2788469086\",\"https://p6-pc-sign.douyinpic.com/obj/33a2200013bb98733b01e?x-expires=1691168400\\u0026x-signature=vSeSa8WlOHf8R6C1jXbaGo4YKj4%3D\\u0026from=2788469086\",\"https://p3-pc-sign.douyinpic.com/obj/33a2200013bb98733b01e?x-expires=1691168400\\u0026x-signature=FSNW2NUvlbPIsi6Ld0MnP%2Bw%2BoKo%3D\\u0026from=2788469086\"],\"width\":720,\"height\":720},\"icon_on_info\":{\"uri\":\"9b960001e92e97c77951\",\"url_list\":[\"https://p6-pc-sign.douyinpic.com/obj/9b960001e92e97c77951?x-expires=1691168400\\u0026x-signature=gqz%2F99tCE0wFfZe%2FCiwY0%2BUrcgc%3D\\u0026from=2788469086\",\"https://p9-pc-sign.douyinpic.com/obj/9b960001e92e97c77951?x-expires=1691168400\\u0026x-signature=5i1eOMl2jdrx82TyrORruh%2FwlXY%3D\\u0026from=2788469086\",\"https://p3-pc-sign.douyinpic.com/obj/9b960001e92e97c77951?x-expires=1691168400\\u0026x-signature=UWpT1uh50y8g%2FFepdZ0v5WEGmUc%3D\\u0026from=2788469086\"],\"width\":720,\"height\":720},\"poi_subtitle\":\"\",\"show_type\":4,\"poi_subtitle_type\":0,\"voucher_release_areas\":null,\"poi_frontend_type\":null,\"poi_backend_type\":{\"code\":\"130205\",\"name\":\"地名地址;普通地点;地市级地名\"},\"is_admin_area\":true,\"collected_count\":\"685687\",\"view_count\":\"248123419471\",\"icon_service_type_list\":null,\"ext_json\":\"{\\\"item_ext\\\":{\\\"anchor_info\\\":{\\\"exist_relation_poi\\\":false,\\\"anchor_content_json\\\":\\\"{\\\\\\\"log_id\\\\\\\":\\\\\\\"20230803010005712927738F4143360D62\\\\\\\",\\\\\\\"poi_anchor_text_strategy\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"poi_anchor_text_type\\\\\\\":\\\\\\\"0\\\\\\\"}\\\",\\\"log_extra\\\":{\\\"has_delivery_product\\\":\\\"0\\\",\\\"has_favourite_product_tips\\\":\\\"0\\\",\\\"is_poi_live\\\":\\\"0\\\",\\\"poi_id\\\":\\\"6601123594271459336\\\"},\\\"is_commerce_intention\\\":false},\\\"anchor_comment\\\":{\\\"poi_anchor\\\":{\\\"primary_tags\\\":[{\\\"content\\\":\\\"武汉市\\\",\\\"type\\\":2,\\\"style\\\":0,\\\"priority\\\":1}],\\\"minor_tags\\\":[{\\\"content\\\":\\\"2481.2亿次看过\\\",\\\"type\\\":7,\\\"style\\\":0,\\\"priority\\\":-1,\\\"ExtraJson\\\":\\\"{\\\\\\\"cta_text\\\\\\\":\\\\\\\"2481.2亿\\\\\\\",\\\\\\\"final_text\\\\\\\":\\\\\\\"2481.2亿次看过\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"次看过\\\\\\\",\\\\\\\"type\\\\\\\":100001}\\\",\\\"ContentKey\\\":\\\"content1\\\"}]},\\\"anchor_content_json\\\":\\\"{\\\\\\\"content1\\\\\\\":\\\\\\\"{\\\\\\\\\\\\\\\"cta_text\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"2481.2亿\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"final_text\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"2481.2亿次看过\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"text\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"次看过\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"type\\\\\\\\\\\\\\\":100001}\\\\\\\",\\\\\\\"log_id\\\\\\\":\\\\\\\"20230803010005712927738F4143360D62\\\\\\\",\\\\\\\"poi_anchor_text_info_comment\\\\\\\":0,\\\\\\\"poi_anchor_text_strategy_comment\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"poi_anchor_text_type_comment\\\\\\\":\\\\\\\"0\\\\\\\"}\\\",\\\"log_extra\\\":{\\\"text_type\\\":\\\"100005,100001\\\"}},\\\"poi_popularity\\\":\\\"148.9w人想去\\\"},\\\"distance_meters_bury\\\":-1}\\n\",\"effect_ids\":null,\"poi_detail_tags\":null,\"is_food_group_buy\":false,\"popularity\":\"148.9w人想去\",\"is_at_call_back_collect\":false,\"quality_score\":0,\"service_type_list\":null,\"poi_ranks\":null,\"is_red_poi\":false,\"is_life_service\":false,\"fulfill_task_list\":null,\"poi_search_tags\":null,\"life_extra\":{\"delivery_info\":{},\"is_ad_life_promote\":false,\"visit_history\":{\"never_poi_anchor\":true}}}", + "log_extra": "{\"has_delivery_product\":\"0\",\"has_favourite_product_tips\":\"0\",\"is_poi_live\":\"0\",\"life_anchor_type\":\"poi\",\"life_publish_type\":\"position\",\"poi_backend_type\":\"130205\",\"poi_id\":\"6601123594271459336\",\"use_lab_text\":0}" + }, + "item_warn_notification": { + "type": 0, + "show": false, + "content": "" + }, + "is_share_post": false, + "anchors": null, + "hybrid_label": null, + "geofencing_regions": null, + "authentication_token": "MS4wLjAAAAAACDLXxWSjHm-E6xSNKL2-QMEfb6vitxgSaOcZ3rIzGTwknHkpqxn-_hK4AEuj0kXVEU_dCTK9JgZC6NZU3T61nppQGF-IXCq50yLiHVpgiBcxzpbJ9pPa3upxzNHGXeHbQTLC7VxX5UtBxeceQFjx4PzgAcLxROu-T5jtbQvQBNAMkUwaoDZKMKZDEaj-eq8fa4dFCnPhQQN7ijtFOP_FzTN7OEoe_xAHowNBIj5DJSA2ezVtMEOdJdhoqGNwL5--I2LdTJkLJM10dVriM17rEg", + "aweme_acl": { + "download_mask_panel": { + "code": 1, + "show_type": 0 + } + }, + "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": "" + }, + "is_life_item": true, + "yumme_recreason": null, + "cover_labels": null, + "ref_voice_modify_id_list": null, + "origin_text_extra": [], + "guide_btn_type": 0, + "ref_tts_id_list": null, + "common_bar_info": "[]", + "images": [ + { + "uri": "tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2", + "url_list": [ + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~tplv-dy-aweme-images:q75.webp?x-expires=1693587600&x-signature=ggkrFgYjN6KC%2Bs%2FVZG4gMHyuXYY%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~tplv-dy-aweme-images:q75.webp?x-expires=1693587600&x-signature=Vpzp%2B58jT6if6k8negKdFHjG6sI%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p6-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~tplv-dy-aweme-images:q75.webp?x-expires=1693587600&x-signature=4XYaIAgZ%2B9Y0sGhqwDDp6%2F1A4qI%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~tplv-dy-aweme-images:q75.jpeg?x-expires=1693587600&x-signature=GnBL4m34wmcN7aCN4rUoS3PThag%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62" + ], + "download_url_list": [ + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1918.webp?x-expires=1693587600&x-signature=0gOpYZNtDiXhxxQYj5nd38vA8dM%3D&sig=X_15vWgUDAxoAaaDkDIHxsx90DI%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1918.webp?x-expires=1693587600&x-signature=yl8CI3SSPA%2Fb3x3O6mSwwVN0f90%3D&sig=X_15vWgUDAxoAaaDkDIHxsx90DI%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p6-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1918.webp?x-expires=1693587600&x-signature=wlO1NNnFszuIlCbGVCPCYCi5k%2FU%3D&sig=X_15vWgUDAxoAaaDkDIHxsx90DI%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813c001/6daa91f096d9487394e8345858769ba2~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1918.jpeg?x-expires=1693587600&x-signature=qxOfzIYfvUopQtlNMbbsoH5LvgA%3D&sig=9W6hhDRU2ZPLHkEXQyl7zdJfnjA%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62" + ], + "height": 1918, + "width": 1440, + "mask_url_list": null, + "interaction_stickers": null + }, + { + "uri": "tos-cn-i-0813/45bb5491af38446e9b4671ec06a76a5a", + "url_list": [ + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813/45bb5491af38446e9b4671ec06a76a5a~tplv-dy-aweme-images:q75.webp?x-expires=1693587600&x-signature=M%2B1%2FTFrRATaYQ3m9g1Xy2QTSlzE%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813/45bb5491af38446e9b4671ec06a76a5a~tplv-dy-aweme-images:q75.webp?x-expires=1693587600&x-signature=99cYHpuNFAlgdOgx%2Bbl4o%2FvmBKc%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p6-pc-sign.douyinpic.com/tos-cn-i-0813/45bb5491af38446e9b4671ec06a76a5a~tplv-dy-aweme-images:q75.webp?x-expires=1693587600&x-signature=DtTHqOFgL76eBzF5UDudk%2F2Kk%2FY%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813/45bb5491af38446e9b4671ec06a76a5a~tplv-dy-aweme-images:q75.jpeg?x-expires=1693587600&x-signature=OX09kair5Emnbh7inwhee3%2FfcVw%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62" + ], + "download_url_list": [ + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813/45bb5491af38446e9b4671ec06a76a5a~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1920.webp?x-expires=1693587600&x-signature=dPKWUoBBNxtwtyngzMHUoDcs%2BO4%3D&sig=leAHHKvV0O9CuO3J2MFB6SX0bPs%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813/45bb5491af38446e9b4671ec06a76a5a~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1920.webp?x-expires=1693587600&x-signature=txR35%2BnzUU1VWE70kh491kd1hKs%3D&sig=leAHHKvV0O9CuO3J2MFB6SX0bPs%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p6-pc-sign.douyinpic.com/tos-cn-i-0813/45bb5491af38446e9b4671ec06a76a5a~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1920.webp?x-expires=1693587600&x-signature=ccQaVpkHJd%2B%2Bro%2B1Br4yZWFUJzw%3D&sig=leAHHKvV0O9CuO3J2MFB6SX0bPs%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813/45bb5491af38446e9b4671ec06a76a5a~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1920.jpeg?x-expires=1693587600&x-signature=6Bh3%2F0ADP8mkG0HJsskWX9c35AA%3D&sig=iX_rk0P9cAymCtUmwMFOLTZaj_Q%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62" + ], + "height": 1920, + "width": 1440, + "mask_url_list": null, + "interaction_stickers": null + }, + { + "uri": "tos-cn-i-0813c001/367fbd724765454dab3cdc1fe48cf8fc", + "url_list": [ + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813c001/367fbd724765454dab3cdc1fe48cf8fc~tplv-dy-aweme-images:q75.webp?x-expires=1693587600&x-signature=sTJnOym%2FnjXAaCZ3UyxmyO7stxM%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p6-pc-sign.douyinpic.com/tos-cn-i-0813c001/367fbd724765454dab3cdc1fe48cf8fc~tplv-dy-aweme-images:q75.webp?x-expires=1693587600&x-signature=gymyaIG1n09AJ9EwxF1BIVBFPOE%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813c001/367fbd724765454dab3cdc1fe48cf8fc~tplv-dy-aweme-images:q75.webp?x-expires=1693587600&x-signature=BQYvHqT%2BkGaiBuTW%2Fvnj%2FmBHje8%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813c001/367fbd724765454dab3cdc1fe48cf8fc~tplv-dy-aweme-images:q75.jpeg?x-expires=1693587600&x-signature=kv4oYu7xPA7Mu5snPK%2FeDxDnQKA%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62" + ], + "download_url_list": [ + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813c001/367fbd724765454dab3cdc1fe48cf8fc~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1918.webp?x-expires=1693587600&x-signature=hs9hAcqiRUxxc3SmbJfJLjMQrko%3D&sig=RnPWS2PjylfuurgQV2ABt1gyDds%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p6-pc-sign.douyinpic.com/tos-cn-i-0813c001/367fbd724765454dab3cdc1fe48cf8fc~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1918.webp?x-expires=1693587600&x-signature=jd9G5EEylcLJZVo88GelP6sTA%2B0%3D&sig=RnPWS2PjylfuurgQV2ABt1gyDds%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p3-pc-sign.douyinpic.com/tos-cn-i-0813c001/367fbd724765454dab3cdc1fe48cf8fc~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1918.webp?x-expires=1693587600&x-signature=oAJgYc28tnj0XEgfRjEo9Bv2O80%3D&sig=RnPWS2PjylfuurgQV2ABt1gyDds%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62", + "https://p9-pc-sign.douyinpic.com/tos-cn-i-0813c001/367fbd724765454dab3cdc1fe48cf8fc~tplv-dy-water-v2:5oqW6Z-z5Y-377yaMzc1NTIzMTM5:1440:1918.jpeg?x-expires=1693587600&x-signature=8iv2uW71zA7sVwHtJSMva2RXdHc%3D&sig=ECD3VXX9zE7C7rdBuCgt_YhUZdY%3D&from=3213915784&s=PackSourceEnum_PUBLISH&se=false&sc=image&biz_tag=aweme_images&l=20230803010005712927738F4143360D62" + ], + "height": 1918, + "width": 1440, + "mask_url_list": null, + "interaction_stickers": null + } + ], + "relation_labels": null, + "tts_id_list": null, + "impression_data": { + "group_id_list_a": [], + "group_id_list_b": [], + "similar_id_list_a": null, + "similar_id_list_b": null, + "group_id_list_c": [ + 7232626237586312485 + ] + }, + "disable_relation_bar": 0, + "photo_search_entrance": { + "ecom_type": 2 + }, + "social_tag_list": null, + "suggest_words": { + "suggest_words": [ + { + "words": [ + { + "word": "吴世勋", + "word_id": "6538738270849733901", + "info": "{\"qrec_for_search\":\"{\\\"video_ecom\\\":\\\"1\\\"}\"}" + } + ], + "scene": "comment_top_rec", + "icon_url": "", + "hint_text": "大家都在搜:", + "extra_info": "{}" + }, + { + "words": [ + { + "word": "吴世勋", + "word_id": "6538738270849733901", + "info": "{\"qrec_for_search\":\"{\\\"video_ecom\\\":\\\"1\\\"}\"}" + } + ], + "scene": "detail_inbox_rex", + "icon_url": "", + "hint_text": "", + "extra_info": "{}" + } + ] + }, + "show_follow_button": {}, + "duet_aggregate_in_music_tab": false, + "is_duet_sing": false, + "search_impr": { + "entity_id": "7232626237586312485", + "entity_type": "IMAGE_PUBLISH" + }, + "comment_permission_info": { + "comment_permission_status": 0, + "can_comment": true, + "item_detail_entry": false, + "press_entry": false, + "toast_guide": false + }, + "original_images": null, + "is_multi_content": 1, + "series_paid_info": { + "series_paid_status": 0, + "item_price": 0 + }, + "img_bitrate": null, + "comment_gid": 7232626237586312485, + "digg_lottie": { + "lottie_id": "", + "can_bomb": 0 + }, + "image_album_music_info": { + "begin_time": 0, + "end_time": 60046, + "volume": 100 + }, + "video_tag": [ + { + "tag_id": 2003, + "tag_name": "时尚", + "level": 1 + }, + { + "tag_id": 2003007, + "tag_name": "穿搭", + "level": 2 + }, + { + "tag_id": 2003007011, + "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 +} \ No newline at end of file diff --git a/API/user_post_info_video.json b/API/user_post_info_video.json new file mode 100644 index 0000000..584c829 --- /dev/null +++ b/API/user_post_info_video.json @@ -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 +} \ No newline at end of file diff --git a/API/user_profile_info.json b/API/user_profile_info.json new file mode 100644 index 0000000..13c8755 --- /dev/null +++ b/API/user_profile_info.json @@ -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": "" + } +} \ No newline at end of file diff --git a/Banner.png b/Banner.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6f3bb7ab08eec1efc1b97a963cd89e8ea2d667 GIT binary patch literal 30599 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 P9rv@8f@GDrVZi?YU+mg8 literal 0 HcmV?d00001 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..f48afaf --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,49 @@ +# 贡献者守则 + +本项目欢迎所有人的贡献。为了保证这个社区的友好和专业的环境,我们制定了以下守则,所有的贡献者和维护者都应当遵守。 + +## 我们的承诺 + +为了促进一个开放和欢迎的环境,我们承诺让参与这个项目的每个人无论年龄、体型、身体健康状况、种族、性别认同与表达、经验水平、教育程度、社会经济地位、国籍、个人外貌、种族、宗教信仰或者性取向等,都不会感到被歧视。 + +## 我们的标准 + +以下行为可以帮助我们构建一个友好的环境: + +* 使用友好和包容的语言 +* 尊重不同的观点和经验 +* 接纳建设性的批评 +* 关注对社区最有利的事情 +* 对其他社区成员表现出同情和善意 + +以下行为是不被接受的: + +* 使用侮辱性/贬低性的语言或图像,以及人身攻击 +* 喷子行为或恶意批评 +* 公开或私下骚扰他人 +* 发布他人的私人信息,例如实际地址或电子邮件,未经其明确许可 +* 其他可能被认为不合适或不专业的行为 + +## 我们的责任 + +项目维护者有责任解释行为标准,并且应当采取适当和公正的纠正措施回应任何违反这些标准的行为。 + +项目维护者有权利和责任删除、修改或拒绝不符合本守则的评论(comments)、提交(commits)、代码、wiki 编辑、问题(issues)和其他贡献,他们也可以因为以下行为封禁一个人的参与,包括但不限于: + +* 有骚扰行为 +* 发表侮辱性或贬损性的评论 +* 人身攻击 +* 发布他人的私人信息 +* 其他不道德的行为 + +## 适用范围 + +此行为守则适用于项目空间和公共空间,当个体代表项目或其社区时也同样适用。例如,使用官方电子邮件地址、在官方的社交媒体账号发表的,或在公开的在线或离线事件中担任的代表角色等。项目维护者也可能进一步定义和澄清代表项目行为的规范。 + +## 执行 + +无论是恶劣的行为公开或私下发生,项目维护者都有权进行调查并采取适当的行动,这可能包括警告、暂时禁止或永久禁止对项目的贡献等。 + +## 版本历史 + +此行为准则版本基于 [Contributor Covenant](https://www.contributor-covenant.org) 版本 2.1。欢迎在此基础上进行修改和适应。 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e43dbc7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3.7-slim-bullseye +WORKDIR /app +COPY . . +RUN pip3 install -r requirements.txt +CMD ["python3", "TikTokMulti.py"] \ No newline at end of file diff --git a/GUI/Main.ui b/GUI/Main.ui new file mode 100644 index 0000000..98329b4 --- /dev/null +++ b/GUI/Main.ui @@ -0,0 +1,346 @@ + + + Dialog + + + + 0 + 0 + 1111 + 711 + + + + Dialog + + + + + + + + 0 + 0 + 230 + 600 + + + + background-color: #060716; +border-bottom-left-radius: 25px; +border-top-left-radius: 25px; +font: 10pt "微软雅黑"; +color: #FFFFFF; + + + + + + + + + 230 + 0 + 851 + 600 + + + + background-color: rgb(255, 255, 255); +border-top-right-radius: 25px; +border-bottom-right-radius: 25px; + + + + + + + + + 30 + 50 + 161 + 41 + + + + background: url(:/img/logo-horizontal.svg) no-repeat; + + + + + + + + + 180 + 90 + 54 + 12 + + + + color: rgb(255, 255, 255); +font: 9pt "華康布丁體"; + + + v2.1.1 + + + + + + 1030 + 20 + 21 + 21 + + + + border-radius: 10px; +background-color: rgb(255, 81, 53); + + + + + + + + + 1000 + 20 + 21 + 21 + + + + border-radius: 10px; +background-color: #FFC32D; + + + + + + + + + 970 + 20 + 21 + 21 + + + + border-radius: 10px; +background-color: #37C847; + + + + + + + + + 260 + 90 + 651 + 41 + + + + false + + + background-color: #292B35; +border-radius: 10px; +font: 12pt "華康布丁體"; +color: rgb(255, 255, 255); +qproperty-alignment:AlignHCenter; + + + QFrame::StyledPanel + + + Qt::ScrollBarAsNeeded + + + QAbstractScrollArea::AdjustIgnored + + + QPlainTextEdit::WidgetWidth + + + + + + false + + + false + + + + + + 930 + 90 + 121 + 41 + + + + #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; +} + + + + 咻咻 + + + + + + 260 + 140 + 71 + 16 + + + + 全部下载 + + + + + + 50 + 390 + 131 + 61 + + + + border-radius: 25px; +font: 16pt "華康布丁體"; +color: rgb(255, 255, 255); +background-color: rgb(22, 23, 34); + + + 设置 + + + + + + 50 + 490 + 131 + 61 + + + + border-radius: 25px; +font: 16pt "華康布丁體"; +color: rgb(255, 255, 255); +background-color: rgb(22, 23, 34); + + + 关于 + + + + + + 350 + 140 + 101 + 16 + + + + 全部封面下载 + + + + + + 460 + 140 + 101 + 16 + + + + 全部配乐下载 + + + + + + 230 + 0 + 851 + 60 + + + + background-color: rgb(199, 199, 199); +border-top-right-radius: 25px; + + + + + + + + + 260 + 170 + 791 + 401 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + QTextEdit::NoWrap + + + Label_Right + Label_Background + Label_Left + Label_Logo + Label_Version + Button_Close + Button_Max + Button_Min + plainTextEdit + Button_Go + Check_All + pushButton + pushButton_2 + Check_Cover + Check_Music + textBrowser + + + + + + diff --git a/GUI/README-EN.md b/GUI/README-EN.md new file mode 100644 index 0000000..0aad290 --- /dev/null +++ b/GUI/README-EN.md @@ -0,0 +1,9 @@ +# TKMGUI V2.1.1 +**Currently, only for the development of the preview version** + +![mit](https://img.shields.io/badge/license-MIT-blue)![python: v3.8.5](https://img.shields.io/badge/python-v3.8.5-green)![pyqt](https://img.shields.io/badge/Qt5-v5.14.3-red) + +[English](README-EN.md) [简体中文](README.md) + +![preview](https://tvax1.sinaimg.cn/large/006908GAly1gytdof69rrj30p00godhe.jpg) + diff --git a/GUI/README.md b/GUI/README.md new file mode 100644 index 0000000..dcb98ae --- /dev/null +++ b/GUI/README.md @@ -0,0 +1,9 @@ +# TKMGUI V2.1.1 +**目前仅为开发预览版** + +![mit](https://img.shields.io/badge/license-MIT-blue)![python: v3.8.5](https://img.shields.io/badge/python-v3.8.5-green)![pyqt](https://img.shields.io/badge/Qt5-v5.14.3-red) + +[English](README-EN.md) [简体中文](README.md) + +![preview](https://tvax1.sinaimg.cn/large/006908GAly1gytdof69rrj30p00godhe.jpg) + diff --git a/GUI/Resource.qrc b/GUI/Resource.qrc new file mode 100644 index 0000000..bb03f7e --- /dev/null +++ b/GUI/Resource.qrc @@ -0,0 +1,6 @@ + + + 背景.svg + logo-horizontal.svg + + diff --git a/GUI/preview.png b/GUI/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..da9a75c1df608635d40cb481b3d4256d25e01fcf GIT binary patch literal 22328 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𝔤x{Y*Tcx| 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✨ TikTok Watermark-Free Video Downloader ✨ +
+ +[简体中文](README.md) | English + +[![License: MIT](https://img.shields.io/github/license/johnserf-seed/tiktokdownload?style=for-the-badge)](https://github.com/Johnserf-Seed/TikTokDownload/blob/main/LICENSE) +![Release Download](https://img.shields.io/github/downloads/Johnserf-Seed/TikTokDownload/total?style=for-the-badge) +![GitHub Repo size](https://img.shields.io/github/repo-size/Johnserf-Seed/TikTokDownload?style=for-the-badge&color=3cb371) +[![GitHub Repo Languages](https://img.shields.io/github/languages/top/Johnserf-Seed/TikTokDownload?style=for-the-badge)](https://github.com/BeyondDimension/SteamTools/search?l=c%23) +[![Python v3.11.1](https://img.shields.io/badge/python-v3.11.1-orange?style=for-the-badge)](https://github.com/Johnserf-Seed/TikTokDownload) +![Terminal: wt](https://img.shields.io/badge/Terminal-wt-blue?style=for-the-badge) + +[![GitHub Stars](https://img.shields.io/github/stars/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload) +[![GitHub Forks](https://img.shields.io/github/forks/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload) +[![GitHub Issues](https://img.shields.io/github/issues/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload) +[![GitHub Closed Issues](https://img.shields.io/github/issues-closed/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload) + +[![jsDelivr monthly hits](https://data.jsdelivr.com/v1/package/gh/Johnserf-Seed/TikTokDownload/badge)](https://www.jsdelivr.com/package/gh/Johnserf-Seed/TikTokDownload) +[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FJohnserf-Seed%2FTikTokDownload&count_bg=%235FFFFF&title_bg=%23FB1953&icon=tiktok.svg&icon_color=%23250C1F&title=view&edge_flat=false)](https://hits.seeyoufarm.com) +[![Discord](https://img.shields.io/discord/1070512513889878067?color=5865F2&logo=discord&logoColor=white?style=for-the-badge)](https://discord.gg/q3hA8qQZbG) +[![Patreon](https://img.shields.io/badge/Patreon-TikTokDownload-red.svg?style=flat&logo=patreon)](https://www.patreon.com/TikTokDownload713) +
+ +## 🚀 Environmental Preparation/Environment + +> [![Microsoft App Store](https://tvax1.sinaimg.cn/large/006908GAly1hgn87jhad8j305001qa9y.jpg)](https://aka.ms/terminal) +> +> The old console doesn't adapt well; using Windows Terminal is recommended. +> +> [![Python v3.11.1](https://www.python.org/static/img/python-logo.png)](https://www.python.org/ftp/python/3.11.1/python-3.11.1-amd64.exe) +> +> Unexpected errors might arise with versions below Python3.11.1. +> +> [![GitHub Release Version](https://tvax2.sinaimg.cn/large/006908GAly1hh16psn51aj30a5020gly.jpg)](https://github.com/Johnserf-Seed/TikTokDownload/releases) +> +> Download the release version. It gets repackaged after every commit. + +
⚙ Windows Terminal Settings (Must-read) + +![wt configuration](https://github.com/Johnserf-Seed/TikTokDownload/assets/40727745/997b6fc2-586e-4268-bee8-43bb8d68622c) + +
+ +## 🧰 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 + +
+ List of Operating Systems supported by version 1.5.0.0 + +- 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 + +
+ +## 📸 Running Process + +
+ 🎬 Running without configuration file and scan code login + +https://user-images.githubusercontent.com/40727745/fc1e6c46-d0c3-4f2a-a4a5-ca3d781e7d11 + +
+ +
+ 🎬 Downloading from the homepage + +https://user-images.githubusercontent.com/40727745/12c21d55-b629-485a-b904-54d86341c371 + +
+ +## 📥 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 + +
+📁 directory + +```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 + +``` + +
+ +## 💖 Sponsorship + +![Sponsorship Image](https://user-images.githubusercontent.com/40727745/217866800-23980dc1-f3ce-4bc7-b192-518651fef8da.png) + +Thank you for supporting this project! If you find this project helpful, please consider sponsoring. You can directly visit our [![Patreon](https://img.shields.io/badge/Patreon-TikTokDownload-red.svg?style=flat&logo=patreon)](https://www.patreon.com/TikTokDownload713) + +## 📧 Contact + +If you have any questions or suggestions, you can contact me via email: + +- Email: [johnserf-seed@foxmail.com](mailto:johnserf-seed@foxmail.com) + +## 🙏 Acknowledgments + +- [Windows Terminal](https://aka.ms/terminal) +- [aiohttp](https://github.com/aio-libs/aiohttp) +- [requests](https://github.com/psf/requests) +- [Pillow (PIL Fork)](https://github.com/python-pillow/Pillow) +- [lxml](https://github.com/lxml/lxml) +- [rich](https://github.com/willmcgugan/rich) +- [qrcode](https://github.com/lincolnloop/python-qrcode) +- [ConfigObj](https://github.com/DiffSK/configobj) + +We genuinely appreciate their contributions and efforts. + +## ⚖️ Disclaimer + +This project does not sell, share, encrypt, upload, or study any personal information. This project and its associated code are for learning and research purposes only and do not constitute any explicit or implicit warranty. The author assumes no responsibility for any form of loss caused by the use of this project and its code. + +## 📜 License Statement + +MIT License + +Copyright (c) 2021 JohnserfSeed + +The source code of this project is licensed under the MIT License. For detailed information, please refer to the [LICENSE](LICENSE) file. + +## 📝 Contributor Code of Conduct + +All contributors are welcome to this project. We hope to create a friendly environment where everyone can work together in an atmosphere of respect and understanding. Please review our [Contributor Code of Conduct](CODE_OF_CONDUCT.md) before participating. + +## 👨‍💻 Contributors + +We welcome all kinds of contributions, be it error reporting, improvement suggestions, or provision of code and documentation. We appreciate your help. + +![Contributors](https://contributors-img.web.app/image?repo=Johnserf-Seed/TikTokDownload) + diff --git a/README.md b/README.md new file mode 100644 index 0000000..0d7ec17 --- /dev/null +++ b/README.md @@ -0,0 +1,370 @@ + +![项目图](https://tvax2.sinaimg.cn/large/006908GAly1hgn9zod1yuj30zk0hstmf.jpg) + +

✨ 抖音去水印作品下载 ✨

+
+ +[English](README-EN.md) | 简体中文 + +[![License: MIT](https://img.shields.io/github/license/johnserf-seed/tiktokdownload?style=for-the-badge)](https://github.com/Johnserf-Seed/TikTokDownload/blob/main/LICENSE) +![Release Download](https://img.shields.io/github/downloads/Johnserf-Seed/TikTokDownload/total?style=for-the-badge) +![GitHub Repo size](https://img.shields.io/github/repo-size/Johnserf-Seed/TikTokDownload?style=for-the-badge&color=3cb371) +[![GitHub Repo Languages](https://img.shields.io/github/languages/top/Johnserf-Seed/TikTokDownload?style=for-the-badge)](https://github.com/BeyondDimension/SteamTools/search?l=c%23) +[![Python v3.11.1](https://img.shields.io/badge/python-v3.11.1-orange?style=for-the-badge)](https://github.com/Johnserf-Seed/TikTokDownload) +![Terminal: wt](https://img.shields.io/badge/Terminal-wt-blue?style=for-the-badge) + +[![GitHub Stars](https://img.shields.io/github/stars/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload) +[![GitHub Forks](https://img.shields.io/github/forks/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload) +[![GitHub Issues](https://img.shields.io/github/issues/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload) +[![GitHub Closed Issues](https://img.shields.io/github/issues-closed/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload) + +[![F2 Downloads](https://pepy.tech/badge/f2/month)](https://pepy.tech/project/f2) +[![PyPI version](https://badge.fury.io/py/f2.svg)](https://badge.fury.io/py/f2) +[![jsDelivr monthly hits](https://data.jsdelivr.com/v1/package/gh/Johnserf-Seed/TikTokDownload/badge)](https://www.jsdelivr.com/package/gh/Johnserf-Seed/TikTokDownload) +[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FJohnserf-Seed%2FTikTokDownload&count_bg=%235FFFFF&title_bg=%23FB1953&icon=tiktok.svg&icon_color=%23250C1F&title=view&edge_flat=false)](https://hits.seeyoufarm.com) +[![TikHub](https://img.shields.io/badge/%E8%B5%9E%E5%8A%A9%E5%95%86-TikHub-orange?style=flat-square&logo=tiktok)](https://beta-web.tikhub.io/users/signup?referral_code=6hLcGD94) +[![Discord](https://img.shields.io/discord/1146473603450282004?color=5865F2&logo=discord&logoColor=white?style=for-the-badge)](https://discord.gg/3PhtPmgHf8) +[![Patreon](https://img.shields.io/badge/Patreon-TikTokDownload-red.svg?style=flat&logo=patreon)](https://www.patreon.com/TikTokDownload713) + +
+ + +## 🚀 环境准备/Environment + +> [![Microsoft 应用商店](https://tvax1.sinaimg.cn/large/006908GAly1hgn87jhad8j305001qa9y.jpg)](https://aka.ms/terminal) +> +> 旧的控制台无法很好适配,推荐使用Windows Terminal。 +> +> [![Python v3.11.1](https://www.python.org/static/img/python-logo.png)](https://www.python.org/ftp/python/3.11.1/python-3.11.1-amd64.exe) +> +> Python3.11.1 低于该版本可能会有意外的错误 +> +> [![GitHub 发行版](https://tvax2.sinaimg.cn/large/006908GAly1hh16psn51aj30a5020gly.jpg)](https://github.com/Johnserf-Seed/TikTokDownload/releases/tag/v1.4.2.2) +> +> 更新F2前的最后一个发行版下载 + +
⚙ Windows Terminal 设置(必看) + +![wt配置](https://github.com/Johnserf-Seed/TikTokDownload/assets/40727745/997b6fc2-586e-4268-bee8-43bb8d68622c) + +
+ + +## 🧰 功能/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 + +
+ TikTokDownload 1.6 / F2 0.0.1.6-pw2 支持的操作系统列表 + +- 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 或更高版本 + +
+ + +## 📥 安装与运行/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 + +
+ 🎬 无配置文件扫码登录 + +https://user-images.githubusercontent.com/40727745/fc1e6c46-d0c3-4f2a-a4a5-ca3d781e7d11 + +
+ +
+ 🎬 主页作品下载 + +https://user-images.githubusercontent.com/40727745/12c21d55-b629-485a-b904-54d86341c371 + +
+ + 更多运行过程请查阅 [「F2 readme」](https://github.com/Johnserf-Seed/f2/blob/main/README.md) + + +## 🗂️ 项目结构/Folder + +
+📁 目录 + +```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 + +``` + +
+ + +## 💖 赞赏/Sponsor + + + +[TikHub](https://tikhub.io/) 是一家提供优质数据接口服务的供应商。通过每日签到,可以获取免费额度。可以使用我的注册邀请链接:[https://beta-web.tikhub.io/users/signup?referral_code=6hLcGD94](https://beta-web.tikhub.io/users/signup?referral_code=6hLcGD94) 或 邀请码:`6hLcGD94`,注册并充值即可获得`$2`额度。 + +[TikHub](https://tikhub.io/) 提供以下服务: + +- 丰富的数据接口 +- 每日签到免费获取额度 +- 高质量的API服务 +- 官网:https://tikhub.io/ +- 项目地址:https://github.com/TikHubIO/ + + +![赞赏](https://user-images.githubusercontent.com/40727745/217866800-23980dc1-f3ce-4bc7-b192-518651fef8da.png) + +感谢对本项目的支持!如果您觉得这个项目有帮助,欢迎赞助。您可以直接访问我们的 [![Patreon](https://img.shields.io/badge/Patreon-F2-red.svg?style=flat&logo=patreon)](https://www.patreon.com/F2_pypi) + + +## 📧 联系/Contact + +如果有任何问题或者建议,可以通过邮箱联系我: + +- 邮箱:[johnserf-seed@foxmail.com](mailto:johnserf-seed@foxmail.com) + + +## 🙏 鸣谢/Acknowledgments + +- [Windows Terminal](https://aka.ms/terminal) +- [Python](https://www.python.org/) +- [httpx](https://github.com/encode/httpx) +- [click](https://github.com/pallets/click) +- [aiofiles](https://github.com/Tinche/aiofiles) +- [aiosqlite](https://github.com/omnilib/aiosqlite) +- [rich](https://github.com/willmcgugan/rich) +- [qrcode](https://github.com/lincolnloop/python-qrcode) +- [pyyaml](hhttps://github.com/yaml/pyyaml) +- [jsonpath-ng](https://github.com/h2non/jsonpath-ng) +- [m3u8](https://github.com/globocom/m3u8) +- [pytest](https://github.com/pytest-dev/pytest) + +对于他们的贡献和努力,表示由衷的感谢。 + + +## ⚖️ 免责声明/Disclaimer + +此项目不出售、共享、加密、上传、研究任何个人信息。此项目及其相关代码仅供学习与研究使用,不构成任何明示或暗示的保证。使用者因使用此项目及其代码可能造成的任何形式的损失,作者不承担任何责任。 + + +## 📜 版权声明/LICENSE + +MIT License + +Copyright (c) 2021 JohnserfSeed + +此项目的源代码在 MIT 许可证下授权,有关详细信息,请参阅 [LICENSE](LICENSE) 文件。 + + +## 📝 贡献者守则/CoC + +此项目欢迎所有的贡献者。我们希望能够创建一个友好的环境,让每个人都能在尊重和理解的氛围中共同工作。在参与贡献之前,请参阅我们的 [贡献者守则](CODE_OF_CONDUCT.md)。 + + +## 👨‍💻贡献者/Contributors + +我们欢迎任何形式的贡献,无论是提交错误报告,提出改进意见,或者是提供代码和文档。我们都欣赏你的帮助。 + +![Contributors](https://contributors-img.web.app/image?repo=Johnserf-Seed/TikTokDownload) diff --git a/Server/Server.py b/Server/Server.py new file mode 100644 index 0000000..63270dd --- /dev/null +++ b/Server/Server.py @@ -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') diff --git a/Server/Server.txt b/Server/Server.txt new file mode 100644 index 0000000..fea3c60 --- /dev/null +++ b/Server/Server.txt @@ -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])]) + ] +) \ No newline at end of file diff --git a/Server/build-win.bat b/Server/build-win.bat new file mode 100644 index 0000000..bf70424 --- /dev/null +++ b/Server/build-win.bat @@ -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 \ No newline at end of file diff --git a/Server/package.json b/Server/package.json new file mode 100644 index 0000000..6f31807 --- /dev/null +++ b/Server/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "crypto-js": "^4.1.1", + "md5": "^2.3.0" + } +} diff --git a/Server/requirements.txt b/Server/requirements.txt new file mode 100644 index 0000000..6da2898 --- /dev/null +++ b/Server/requirements.txt @@ -0,0 +1,2 @@ +Flask==2.2.5 +PyExecJS==1.5.1 \ No newline at end of file diff --git a/Server/s_v_web_id.js b/Server/s_v_web_id.js new file mode 100644 index 0000000..6d620ac --- /dev/null +++ b/Server/s_v_web_id.js @@ -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()) \ No newline at end of file diff --git a/Server/s_v_web_id.py b/Server/s_v_web_id.py new file mode 100644 index 0000000..c93d99f --- /dev/null +++ b/Server/s_v_web_id.py @@ -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()) \ No newline at end of file diff --git a/Server/x-bogus.js b/Server/x-bogus.js new file mode 100644 index 0000000..6e73604 --- /dev/null +++ b/Server/x-bogus.js @@ -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 +}; \ No newline at end of file diff --git a/Server/x-tt-params.js b/Server/x-tt-params.js new file mode 100644 index 0000000..8522576 --- /dev/null +++ b/Server/x-tt-params.js @@ -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 +}; \ No newline at end of file diff --git a/TikTokTool.py b/TikTokTool.py new file mode 100644 index 0000000..5081fb2 --- /dev/null +++ b/TikTokTool.py @@ -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]() diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..b4fb3bc --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-architect diff --git a/auto_cookie.py b/auto_cookie.py new file mode 100644 index 0000000..73416df --- /dev/null +++ b/auto_cookie.py @@ -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") diff --git a/auto_cookie_selenium.py b/auto_cookie_selenium.py new file mode 100644 index 0000000..73416df --- /dev/null +++ b/auto_cookie_selenium.py @@ -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") diff --git a/douyin_cookie.txt b/douyin_cookie.txt new file mode 100644 index 0000000..351c2d8 --- /dev/null +++ b/douyin_cookie.txt @@ -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 \ No newline at end of file diff --git a/douyin_ui.py b/douyin_ui.py new file mode 100644 index 0000000..f5fa6c9 --- /dev/null +++ b/douyin_ui.py @@ -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('', 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() diff --git a/download_with_cookie.py b/download_with_cookie.py new file mode 100644 index 0000000..5719a3e --- /dev/null +++ b/download_with_cookie.py @@ -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) diff --git a/f2-logo.ico b/f2-logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..453da5135cbbb14330ae267808ca6b805bc71e5c GIT binary patch literal 29873 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 axSw;61bTlAL|{Zm0d*A}6Sn#Q literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..70f80fc --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +f2 \ No newline at end of file diff --git a/run-server.bat b/run-server.bat new file mode 100644 index 0000000..497226d --- /dev/null +++ b/run-server.bat @@ -0,0 +1,2 @@ +cd Server +py Server.py \ No newline at end of file diff --git a/run-server.sh b/run-server.sh new file mode 100644 index 0000000..db662fe --- /dev/null +++ b/run-server.sh @@ -0,0 +1,2 @@ +cd Server +python3 Server.py \ No newline at end of file diff --git a/simple_download.py b/simple_download.py new file mode 100644 index 0000000..46bc4c2 --- /dev/null +++ b/simple_download.py @@ -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*', 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']*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) diff --git a/test_auto_download.py b/test_auto_download.py new file mode 100644 index 0000000..ef90516 --- /dev/null +++ b/test_auto_download.py @@ -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) diff --git a/test_cookie.py b/test_cookie.py new file mode 100644 index 0000000..7114937 --- /dev/null +++ b/test_cookie.py @@ -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}") diff --git a/test_direct.py b/test_direct.py new file mode 100644 index 0000000..6cfd7f6 --- /dev/null +++ b/test_direct.py @@ -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*', 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) diff --git a/version b/version new file mode 100644 index 0000000..f0cc45c --- /dev/null +++ b/version @@ -0,0 +1 @@ +15000 \ No newline at end of file diff --git a/启动UI.bat b/启动UI.bat new file mode 100644 index 0000000..2fd7079 --- /dev/null +++ b/启动UI.bat @@ -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 +) diff --git a/启动UI.vbs b/启动UI.vbs new file mode 100644 index 0000000..1507235 --- /dev/null +++ b/启动UI.vbs @@ -0,0 +1,3 @@ +Set objShell = CreateObject("WScript.Shell") +objShell.CurrentDirectory = "C:\Users\Administrator\Desktop\TikTokDownload-main" +objShell.Run """C:\Program Files\Python311\python.exe"" douyin_ui.py", 1, False