commit 0f3dd8f2871d5171437cb1723a86c082f5940ba2 Author: 237899745 <237899745@qq.com> Date: Mon Mar 2 21:42:52 2026 +0800 Add Douyin video downloader with auto-cookie feature 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 0000000..0d6f3bb Binary files /dev/null and b/Banner.png differ 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 0000000..da9a75c Binary files /dev/null and b/GUI/preview.png differ diff --git a/GUI/requirements.txt b/GUI/requirements.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GUI/requirements.txt @@ -0,0 +1 @@ + diff --git a/GUI/resource.py b/GUI/resource.py new file mode 100644 index 0000000..fcec3d7 --- /dev/null +++ b/GUI/resource.py @@ -0,0 +1,648 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2) +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore + +qt_resource_data = b"\ +\x00\x00\x22\x3e\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\ +\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\ +\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\ +\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x35\x2e\x30\x2e\x30\x2c\ +\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\ +\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\ +\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\ +\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\ +\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\ +\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\ +\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ +\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\ +\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\ +\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\ +\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\ +\x3d\x22\xe5\x9b\xbe\xe5\xb1\x82\x5f\x31\x22\x20\x78\x6d\x6c\x6e\ +\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ +\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\ +\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ +\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ +\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\ +\x22\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\ +\x74\x68\x3d\x22\x31\x35\x38\x70\x78\x22\x20\x68\x65\x69\x67\x68\ +\x74\x3d\x22\x33\x34\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\ +\x3d\x22\x30\x20\x30\x20\x31\x35\x38\x20\x33\x34\x22\x20\x65\x6e\ +\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\ +\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x31\x35\x38\x20\x33\x34\x22\ +\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\ +\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\ +\x6c\x6c\x3d\x22\x23\x30\x30\x46\x41\x46\x30\x22\x20\x64\x3d\x22\ +\x4d\x31\x31\x2e\x36\x34\x2c\x31\x33\x2e\x34\x33\x34\x76\x2d\x31\ +\x2e\x33\x31\x31\x63\x2d\x30\x2e\x34\x35\x36\x2d\x30\x2e\x30\x35\ +\x35\x2d\x30\x2e\x39\x31\x31\x2d\x30\x2e\x30\x39\x31\x2d\x31\x2e\ +\x33\x38\x35\x2d\x30\x2e\x30\x39\x31\x63\x2d\x35\x2e\x36\x34\x37\ +\x2c\x30\x2d\x31\x30\x2e\x32\x35\x36\x2c\x34\x2e\x35\x38\x38\x2d\ +\x31\x30\x2e\x32\x35\x36\x2c\x31\x30\x2e\x32\x35\x31\x0d\x0a\x09\ +\x63\x30\x2c\x33\x2e\x34\x35\x39\x2c\x31\x2e\x37\x33\x31\x2c\x36\ +\x2e\x35\x33\x35\x2c\x34\x2e\x33\x37\x32\x2c\x38\x2e\x33\x39\x33\ +\x63\x2d\x31\x2e\x37\x31\x32\x2d\x31\x2e\x38\x33\x39\x2d\x32\x2e\ +\x37\x35\x2d\x34\x2e\x32\x37\x39\x2d\x32\x2e\x37\x35\x2d\x36\x2e\ +\x39\x37\x33\x43\x31\x2e\x36\x33\x39\x2c\x31\x38\x2e\x31\x31\x33\ +\x2c\x36\x2e\x31\x30\x32\x2c\x31\x33\x2e\x35\x36\x32\x2c\x31\x31\ +\x2e\x36\x34\x2c\x31\x33\x2e\x34\x33\x34\x7a\x22\x2f\x3e\x0d\x0a\ +\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x30\x30\x46\ +\x41\x46\x30\x22\x20\x64\x3d\x22\x4d\x31\x31\x2e\x38\x37\x36\x2c\ +\x32\x38\x2e\x33\x34\x36\x63\x32\x2e\x35\x31\x34\x2c\x30\x2c\x34\ +\x2e\x35\x37\x32\x2d\x32\x2e\x30\x30\x34\x2c\x34\x2e\x36\x36\x34\ +\x2d\x34\x2e\x34\x39\x38\x56\x31\x2e\x35\x34\x35\x68\x34\x2e\x30\ +\x38\x31\x63\x2d\x30\x2e\x30\x39\x31\x2d\x30\x2e\x34\x35\x35\x2d\ +\x30\x2e\x31\x32\x37\x2d\x30\x2e\x39\x32\x38\x2d\x30\x2e\x31\x32\ +\x37\x2d\x31\x2e\x34\x32\x48\x31\x34\x2e\x39\x32\x0d\x0a\x09\x76\ +\x32\x32\x2e\x33\x30\x33\x63\x2d\x30\x2e\x30\x39\x31\x2c\x32\x2e\ +\x34\x39\x34\x2d\x32\x2e\x31\x35\x2c\x34\x2e\x34\x39\x38\x2d\x34\ +\x2e\x36\x36\x34\x2c\x34\x2e\x34\x39\x38\x63\x2d\x30\x2e\x37\x38\ +\x33\x2c\x30\x2d\x31\x2e\x35\x33\x2d\x30\x2e\x32\x30\x31\x2d\x32\ +\x2e\x31\x36\x37\x2d\x30\x2e\x35\x34\x37\x43\x38\x2e\x39\x34\x34\ +\x2c\x32\x37\x2e\x35\x38\x2c\x31\x30\x2e\x33\x32\x38\x2c\x32\x38\ +\x2e\x33\x34\x36\x2c\x31\x31\x2e\x38\x37\x36\x2c\x32\x38\x2e\x33\ +\x34\x36\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\ +\x6c\x6c\x3d\x22\x23\x30\x30\x46\x41\x46\x30\x22\x20\x64\x3d\x22\ +\x4d\x32\x38\x2e\x32\x35\x31\x2c\x39\x2e\x31\x31\x39\x56\x37\x2e\ +\x38\x38\x31\x63\x2d\x31\x2e\x35\x34\x38\x2c\x30\x2d\x33\x2e\x30\ +\x30\x36\x2d\x30\x2e\x34\x35\x35\x2d\x34\x2e\x32\x32\x36\x2d\x31\ +\x2e\x32\x35\x36\x43\x32\x35\x2e\x31\x31\x38\x2c\x37\x2e\x38\x36\ +\x33\x2c\x32\x36\x2e\x35\x39\x34\x2c\x38\x2e\x37\x35\x35\x2c\x32\ +\x38\x2e\x32\x35\x31\x2c\x39\x2e\x31\x31\x39\x7a\x22\x2f\x3e\x0d\ +\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\ +\x30\x30\x35\x30\x22\x20\x64\x3d\x22\x4d\x32\x34\x2e\x30\x34\x35\ +\x2c\x36\x2e\x36\x32\x35\x63\x2d\x31\x2e\x31\x38\x34\x2d\x31\x2e\ +\x33\x36\x35\x2d\x31\x2e\x39\x31\x33\x2d\x33\x2e\x31\x33\x31\x2d\ +\x31\x2e\x39\x31\x33\x2d\x35\x2e\x30\x38\x68\x2d\x31\x2e\x34\x39\ +\x34\x43\x32\x31\x2e\x30\x33\x39\x2c\x33\x2e\x36\x35\x38\x2c\x32\ +\x32\x2e\x32\x39\x36\x2c\x35\x2e\x34\x37\x39\x2c\x32\x34\x2e\x30\ +\x34\x35\x2c\x36\x2e\x36\x32\x35\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\ +\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x30\x30\x35\ +\x30\x22\x20\x64\x3d\x22\x4d\x31\x30\x2e\x32\x35\x35\x2c\x31\x37\ +\x2e\x35\x38\x34\x63\x2d\x32\x2e\x35\x38\x36\x2c\x30\x2d\x34\x2e\ +\x36\x38\x32\x2c\x32\x2e\x30\x39\x34\x2d\x34\x2e\x36\x38\x32\x2c\ +\x34\x2e\x36\x38\x63\x30\x2c\x31\x2e\x38\x30\x33\x2c\x31\x2e\x30\ +\x32\x31\x2c\x33\x2e\x33\x35\x2c\x32\x2e\x35\x31\x34\x2c\x34\x2e\ +\x31\x33\x33\x0d\x0a\x09\x63\x2d\x30\x2e\x35\x34\x36\x2d\x30\x2e\ +\x37\x36\x35\x2d\x30\x2e\x38\x39\x33\x2d\x31\x2e\x37\x31\x31\x2d\ +\x30\x2e\x38\x39\x33\x2d\x32\x2e\x37\x32\x39\x63\x30\x2d\x32\x2e\ +\x35\x38\x36\x2c\x32\x2e\x30\x39\x35\x2d\x34\x2e\x36\x38\x31\x2c\ +\x34\x2e\x36\x38\x32\x2d\x34\x2e\x36\x38\x31\x63\x30\x2e\x34\x37\ +\x34\x2c\x30\x2c\x30\x2e\x39\x34\x37\x2c\x30\x2e\x30\x37\x34\x2c\ +\x31\x2e\x33\x38\x34\x2c\x30\x2e\x32\x32\x76\x2d\x35\x2e\x36\x38\ +\x0d\x0a\x09\x63\x2d\x30\x2e\x34\x35\x35\x2d\x30\x2e\x30\x35\x35\ +\x2d\x30\x2e\x39\x31\x31\x2d\x30\x2e\x30\x39\x31\x2d\x31\x2e\x33\ +\x38\x34\x2d\x30\x2e\x30\x39\x31\x63\x2d\x30\x2e\x30\x37\x33\x2c\ +\x30\x2d\x30\x2e\x31\x36\x34\x2c\x30\x2d\x30\x2e\x32\x33\x37\x2c\ +\x30\x76\x34\x2e\x33\x37\x43\x31\x31\x2e\x32\x30\x32\x2c\x31\x37\ +\x2e\x36\x35\x38\x2c\x31\x30\x2e\x37\x34\x37\x2c\x31\x37\x2e\x35\ +\x38\x34\x2c\x31\x30\x2e\x32\x35\x35\x2c\x31\x37\x2e\x35\x38\x34\ +\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\ +\x3d\x22\x23\x46\x46\x30\x30\x35\x30\x22\x20\x64\x3d\x22\x4d\x32\ +\x38\x2e\x32\x35\x32\x2c\x39\x2e\x31\x31\x39\x76\x34\x2e\x33\x33\ +\x33\x63\x2d\x32\x2e\x38\x39\x36\x2c\x30\x2d\x35\x2e\x35\x35\x36\ +\x2d\x30\x2e\x39\x32\x38\x2d\x37\x2e\x37\x34\x32\x2d\x32\x2e\x34\ +\x39\x34\x76\x31\x31\x2e\x33\x30\x36\x63\x30\x2c\x35\x2e\x36\x34\ +\x36\x2d\x34\x2e\x35\x39\x2c\x31\x30\x2e\x32\x35\x2d\x31\x30\x2e\ +\x32\x35\x35\x2c\x31\x30\x2e\x32\x35\x0d\x0a\x09\x63\x2d\x32\x2e\ +\x31\x38\x36\x2c\x30\x2d\x34\x2e\x32\x30\x38\x2d\x30\x2e\x36\x39\ +\x31\x2d\x35\x2e\x38\x36\x36\x2d\x31\x2e\x38\x35\x35\x63\x31\x2e\ +\x38\x37\x36\x2c\x32\x2e\x30\x30\x33\x2c\x34\x2e\x35\x33\x36\x2c\ +\x33\x2e\x32\x37\x37\x2c\x37\x2e\x35\x30\x35\x2c\x33\x2e\x32\x37\ +\x37\x63\x35\x2e\x36\x34\x37\x2c\x30\x2c\x31\x30\x2e\x32\x35\x36\ +\x2d\x34\x2e\x35\x38\x38\x2c\x31\x30\x2e\x32\x35\x36\x2d\x31\x30\ +\x2e\x32\x35\x32\x56\x31\x32\x2e\x33\x37\x38\x0d\x0a\x09\x63\x32\ +\x2e\x31\x38\x36\x2c\x31\x2e\x35\x36\x36\x2c\x34\x2e\x38\x36\x34\ +\x2c\x32\x2e\x34\x39\x35\x2c\x37\x2e\x37\x34\x32\x2c\x32\x2e\x34\ +\x39\x35\x56\x39\x2e\x33\x30\x31\x43\x32\x39\x2e\x33\x32\x37\x2c\ +\x39\x2e\x32\x38\x33\x2c\x32\x38\x2e\x37\x38\x31\x2c\x39\x2e\x32\ +\x32\x39\x2c\x32\x38\x2e\x32\x35\x32\x2c\x39\x2e\x31\x31\x39\x7a\ +\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\ +\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x32\x30\ +\x2e\x35\x30\x39\x2c\x32\x32\x2e\x32\x36\x36\x56\x31\x30\x2e\x39\ +\x35\x38\x63\x32\x2e\x31\x38\x36\x2c\x31\x2e\x35\x36\x36\x2c\x34\ +\x2e\x38\x36\x34\x2c\x32\x2e\x34\x39\x34\x2c\x37\x2e\x37\x34\x32\ +\x2c\x32\x2e\x34\x39\x34\x56\x39\x2e\x31\x32\x63\x2d\x31\x2e\x36\ +\x37\x36\x2d\x30\x2e\x33\x36\x34\x2d\x33\x2e\x31\x33\x33\x2d\x31\ +\x2e\x32\x35\x36\x2d\x34\x2e\x32\x32\x37\x2d\x32\x2e\x34\x39\x34\ +\x0d\x0a\x09\x63\x2d\x31\x2e\x37\x34\x39\x2d\x31\x2e\x31\x32\x39\ +\x2d\x33\x2e\x30\x30\x35\x2d\x32\x2e\x39\x34\x39\x2d\x33\x2e\x33\ +\x38\x38\x2d\x35\x2e\x30\x38\x68\x2d\x34\x2e\x30\x38\x56\x32\x33\ +\x2e\x38\x35\x63\x2d\x30\x2e\x30\x39\x31\x2c\x32\x2e\x34\x39\x34\ +\x2d\x32\x2e\x31\x35\x2c\x34\x2e\x34\x39\x36\x2d\x34\x2e\x36\x36\ +\x34\x2c\x34\x2e\x34\x39\x36\x63\x2d\x31\x2e\x35\x36\x36\x2c\x30\ +\x2d\x32\x2e\x39\x35\x31\x2d\x30\x2e\x37\x36\x35\x2d\x33\x2e\x37\ +\x38\x39\x2d\x31\x2e\x39\x34\x37\x0d\x0a\x09\x63\x2d\x31\x2e\x34\ +\x39\x34\x2d\x30\x2e\x37\x38\x33\x2d\x32\x2e\x35\x31\x34\x2d\x32\ +\x2e\x33\x35\x2d\x32\x2e\x35\x31\x34\x2d\x34\x2e\x31\x33\x33\x63\ +\x30\x2d\x32\x2e\x35\x38\x36\x2c\x32\x2e\x30\x39\x35\x2d\x34\x2e\ +\x36\x38\x2c\x34\x2e\x36\x38\x32\x2d\x34\x2e\x36\x38\x63\x30\x2e\ +\x34\x37\x34\x2c\x30\x2c\x30\x2e\x39\x34\x37\x2c\x30\x2e\x30\x37\ +\x32\x2c\x31\x2e\x33\x38\x34\x2c\x30\x2e\x32\x31\x39\x76\x2d\x34\ +\x2e\x33\x37\x0d\x0a\x09\x63\x2d\x35\x2e\x35\x33\x36\x2c\x30\x2e\ +\x31\x32\x37\x2d\x31\x30\x2c\x34\x2e\x36\x37\x38\x2d\x31\x30\x2c\ +\x31\x30\x2e\x32\x33\x31\x63\x30\x2c\x32\x2e\x36\x39\x35\x2c\x31\ +\x2e\x30\x33\x39\x2c\x35\x2e\x31\x35\x32\x2c\x32\x2e\x37\x35\x31\ +\x2c\x36\x2e\x39\x37\x35\x63\x31\x2e\x36\x35\x38\x2c\x31\x2e\x31\ +\x36\x34\x2c\x33\x2e\x36\x39\x38\x2c\x31\x2e\x38\x35\x36\x2c\x35\ +\x2e\x38\x36\x36\x2c\x31\x2e\x38\x35\x36\x0d\x0a\x09\x43\x31\x35\ +\x2e\x39\x2c\x33\x32\x2e\x35\x31\x36\x2c\x32\x30\x2e\x35\x30\x39\ +\x2c\x32\x37\x2e\x39\x30\x38\x2c\x32\x30\x2e\x35\x30\x39\x2c\x32\ +\x32\x2e\x32\x36\x36\x7a\x22\x2f\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\ +\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\ +\x46\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x34\x34\x2e\x35\x37\x36\ +\x2c\x31\x35\x2e\x38\x37\x36\x63\x30\x2e\x33\x35\x33\x2d\x30\x2e\ +\x30\x38\x2c\x30\x2e\x35\x32\x32\x2c\x30\x2e\x30\x36\x34\x2c\x30\ +\x2e\x35\x30\x36\x2c\x30\x2e\x34\x33\x34\x6c\x2d\x30\x2e\x31\x32\ +\x2c\x32\x2e\x32\x36\x35\x63\x2d\x30\x2e\x30\x31\x37\x2c\x30\x2e\ +\x33\x37\x2d\x30\x2e\x32\x30\x31\x2c\x30\x2e\x35\x39\x35\x2d\x30\ +\x2e\x35\x35\x34\x2c\x30\x2e\x36\x37\x35\x0d\x0a\x09\x09\x6c\x2d\ +\x31\x2e\x36\x31\x34\x2c\x30\x2e\x34\x30\x39\x76\x35\x2e\x32\x30\ +\x34\x63\x30\x2c\x30\x2e\x38\x32\x2d\x30\x2e\x30\x38\x39\x2c\x31\ +\x2e\x34\x35\x35\x2d\x30\x2e\x32\x36\x35\x2c\x31\x2e\x39\x30\x34\ +\x63\x2d\x30\x2e\x31\x36\x31\x2c\x30\x2e\x34\x34\x39\x2d\x30\x2e\ +\x34\x36\x36\x2c\x30\x2e\x37\x39\x35\x2d\x30\x2e\x39\x31\x36\x2c\ +\x31\x2e\x30\x33\x35\x63\x2d\x30\x2e\x37\x32\x33\x2c\x30\x2e\x34\ +\x31\x38\x2d\x31\x2e\x37\x37\x35\x2c\x30\x2e\x36\x31\x39\x2d\x33\ +\x2e\x31\x35\x37\x2c\x30\x2e\x36\x30\x34\x0d\x0a\x09\x09\x63\x2d\ +\x30\x2e\x34\x39\x38\x2c\x30\x2e\x30\x31\x36\x2d\x30\x2e\x37\x36\ +\x33\x2d\x30\x2e\x31\x36\x32\x2d\x30\x2e\x37\x39\x35\x2d\x30\x2e\ +\x35\x33\x31\x6c\x2d\x30\x2e\x32\x34\x31\x2d\x32\x2e\x30\x34\x37\ +\x63\x2d\x30\x2e\x30\x33\x32\x2d\x30\x2e\x33\x37\x2c\x30\x2e\x31\ +\x33\x37\x2d\x30\x2e\x35\x35\x35\x2c\x30\x2e\x35\x30\x36\x2d\x30\ +\x2e\x35\x35\x35\x68\x30\x2e\x39\x38\x38\x0d\x0a\x09\x09\x63\x30\ +\x2e\x33\x30\x35\x2c\x30\x2e\x30\x31\x36\x2c\x30\x2e\x34\x35\x38\ +\x2d\x30\x2e\x31\x32\x39\x2c\x30\x2e\x34\x35\x38\x2d\x30\x2e\x34\ +\x33\x34\x76\x2d\x34\x2e\x33\x33\x38\x6c\x2d\x31\x2e\x36\x36\x32\ +\x2c\x30\x2e\x34\x31\x63\x2d\x30\x2e\x33\x35\x34\x2c\x30\x2e\x30\ +\x38\x2d\x30\x2e\x35\x33\x39\x2d\x30\x2e\x30\x36\x34\x2d\x30\x2e\ +\x35\x35\x34\x2d\x30\x2e\x34\x33\x34\x6c\x2d\x30\x2e\x32\x34\x31\ +\x2d\x32\x2e\x33\x33\x37\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x30\x31\ +\x36\x2d\x30\x2e\x33\x37\x2c\x30\x2e\x31\x36\x31\x2d\x30\x2e\x35\ +\x39\x35\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x36\x37\x35\x6c\x31\x2e\ +\x39\x32\x37\x2d\x30\x2e\x33\x38\x36\x76\x2d\x33\x2e\x36\x36\x32\ +\x68\x2d\x32\x2e\x31\x36\x38\x63\x2d\x30\x2e\x33\x37\x2c\x30\x2d\ +\x30\x2e\x35\x32\x32\x2d\x30\x2e\x31\x37\x37\x2d\x30\x2e\x34\x35\ +\x38\x2d\x30\x2e\x35\x33\x6c\x30\x2e\x34\x31\x2d\x32\x2e\x31\x36\ +\x38\x0d\x0a\x09\x09\x63\x30\x2e\x30\x36\x34\x2d\x30\x2e\x33\x35\ +\x33\x2c\x30\x2e\x32\x38\x31\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x36\ +\x35\x2d\x30\x2e\x35\x33\x68\x31\x2e\x35\x36\x36\x56\x36\x2e\x32\ +\x38\x37\x63\x30\x2d\x30\x2e\x33\x37\x2c\x30\x2e\x31\x37\x37\x2d\ +\x30\x2e\x35\x33\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x34\x38\x32\x6c\ +\x32\x2e\x33\x36\x31\x2c\x30\x2e\x34\x35\x38\x63\x30\x2e\x33\x35\ +\x33\x2c\x30\x2e\x30\x34\x38\x2c\x30\x2e\x35\x33\x2c\x30\x2e\x32\ +\x35\x37\x2c\x30\x2e\x35\x33\x2c\x30\x2e\x36\x32\x36\x76\x33\x2e\ +\x33\x30\x31\x0d\x0a\x09\x09\x68\x32\x2e\x30\x39\x36\x63\x30\x2e\ +\x33\x36\x39\x2c\x30\x2c\x30\x2e\x35\x32\x31\x2c\x30\x2e\x31\x37\ +\x37\x2c\x30\x2e\x34\x35\x38\x2c\x30\x2e\x35\x33\x6c\x2d\x30\x2e\ +\x34\x31\x2c\x32\x2e\x31\x36\x38\x63\x2d\x30\x2e\x30\x36\x34\x2c\ +\x30\x2e\x33\x35\x34\x2d\x30\x2e\x32\x38\x31\x2c\x30\x2e\x35\x33\ +\x2d\x30\x2e\x36\x35\x2c\x30\x2e\x35\x33\x68\x2d\x31\x2e\x34\x39\ +\x34\x76\x32\x2e\x38\x39\x31\x4c\x34\x34\x2e\x35\x37\x36\x2c\x31\ +\x35\x2e\x38\x37\x36\x7a\x20\x4d\x35\x31\x2e\x34\x39\x31\x2c\x31\ +\x35\x2e\x32\x35\x0d\x0a\x09\x09\x63\x30\x2e\x32\x37\x33\x2c\x30\ +\x2e\x32\x32\x35\x2c\x30\x2e\x32\x38\x39\x2c\x30\x2e\x34\x36\x36\ +\x2c\x30\x2e\x30\x34\x38\x2c\x30\x2e\x37\x32\x33\x6c\x2d\x31\x2e\ +\x35\x36\x35\x2c\x31\x2e\x36\x38\x38\x63\x2d\x30\x2e\x32\x34\x31\ +\x2c\x30\x2e\x32\x35\x36\x2d\x30\x2e\x34\x37\x35\x2c\x30\x2e\x32\ +\x38\x31\x2d\x30\x2e\x36\x39\x39\x2c\x30\x2e\x30\x37\x32\x63\x2d\ +\x30\x2e\x33\x35\x34\x2d\x30\x2e\x34\x31\x38\x2d\x31\x2e\x33\x38\ +\x32\x2d\x31\x2e\x31\x31\x37\x2d\x33\x2e\x30\x38\x34\x2d\x32\x2e\ +\x30\x39\x37\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x34\x31\x38\x2d\x30\ +\x2e\x32\x35\x37\x2d\x30\x2e\x34\x39\x2d\x30\x2e\x34\x39\x38\x2d\ +\x30\x2e\x32\x31\x37\x2d\x30\x2e\x37\x32\x33\x6c\x31\x2e\x36\x36\ +\x32\x2d\x31\x2e\x34\x34\x36\x63\x30\x2e\x32\x37\x33\x2d\x30\x2e\ +\x32\x32\x35\x2c\x30\x2e\x36\x31\x2d\x30\x2e\x32\x33\x32\x2c\x31\ +\x2e\x30\x31\x33\x2d\x30\x2e\x30\x32\x34\x43\x34\x39\x2e\x38\x38\ +\x35\x2c\x31\x34\x2e\x30\x35\x34\x2c\x35\x30\x2e\x38\x33\x32\x2c\ +\x31\x34\x2e\x36\x35\x36\x2c\x35\x31\x2e\x34\x39\x31\x2c\x31\x35\ +\x2e\x32\x35\x7a\x0d\x0a\x09\x09\x20\x4d\x35\x38\x2e\x39\x31\x32\ +\x2c\x31\x38\x2e\x39\x36\x31\x76\x32\x2e\x32\x31\x37\x63\x30\x2c\ +\x30\x2e\x33\x36\x39\x2d\x30\x2e\x31\x38\x35\x2c\x30\x2e\x35\x38\ +\x36\x2d\x30\x2e\x35\x35\x34\x2c\x30\x2e\x36\x35\x6c\x2d\x31\x2e\ +\x39\x32\x38\x2c\x30\x2e\x33\x33\x37\x76\x35\x2e\x38\x38\x63\x30\ +\x2c\x30\x2e\x33\x36\x39\x2d\x30\x2e\x31\x37\x37\x2c\x30\x2e\x35\ +\x32\x39\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x34\x38\x6c\x2d\x32\x2e\ +\x34\x30\x39\x2d\x30\x2e\x34\x35\x37\x0d\x0a\x09\x09\x63\x2d\x30\ +\x2e\x33\x35\x34\x2d\x30\x2e\x30\x34\x39\x2d\x30\x2e\x35\x33\x2d\ +\x30\x2e\x32\x35\x38\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x36\x32\x37\ +\x76\x2d\x34\x2e\x36\x39\x37\x6c\x2d\x36\x2e\x35\x30\x36\x2c\x31\ +\x2e\x31\x33\x32\x63\x2d\x30\x2e\x33\x35\x34\x2c\x30\x2e\x30\x34\ +\x38\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x31\x31\x32\x2d\x30\x2e\x35\ +\x33\x2d\x30\x2e\x34\x38\x31\x6c\x2d\x30\x2e\x30\x34\x38\x2d\x32\ +\x2e\x33\x31\x33\x0d\x0a\x09\x09\x63\x30\x2d\x30\x2e\x33\x37\x2c\ +\x30\x2e\x31\x38\x35\x2d\x30\x2e\x35\x37\x39\x2c\x30\x2e\x35\x35\ +\x34\x2d\x30\x2e\x36\x32\x36\x6c\x36\x2e\x35\x32\x39\x2d\x31\x2e\ +\x30\x38\x35\x56\x36\x2e\x32\x36\x33\x63\x30\x2d\x30\x2e\x33\x36\ +\x39\x2c\x30\x2e\x31\x37\x37\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x35\ +\x33\x2d\x30\x2e\x34\x38\x32\x4c\x35\x35\x2e\x39\x2c\x36\x2e\x32\ +\x33\x39\x63\x30\x2e\x33\x35\x34\x2c\x30\x2e\x30\x34\x38\x2c\x30\ +\x2e\x35\x33\x2c\x30\x2e\x32\x35\x37\x2c\x30\x2e\x35\x33\x2c\x30\ +\x2e\x36\x32\x36\x0d\x0a\x09\x09\x76\x31\x31\x2e\x39\x35\x31\x6c\ +\x31\x2e\x39\x35\x32\x2d\x30\x2e\x33\x33\x38\x43\x35\x38\x2e\x37\ +\x33\x35\x2c\x31\x38\x2e\x34\x33\x31\x2c\x35\x38\x2e\x39\x31\x32\ +\x2c\x31\x38\x2e\x35\x39\x32\x2c\x35\x38\x2e\x39\x31\x32\x2c\x31\ +\x38\x2e\x39\x36\x31\x7a\x20\x4d\x35\x32\x2e\x34\x35\x35\x2c\x39\ +\x2e\x33\x39\x35\x63\x30\x2e\x32\x35\x37\x2c\x30\x2e\x32\x34\x31\ +\x2c\x30\x2e\x32\x35\x37\x2c\x30\x2e\x34\x39\x2c\x30\x2c\x30\x2e\ +\x37\x34\x37\x6c\x2d\x31\x2e\x35\x36\x36\x2c\x31\x2e\x34\x39\x34\ +\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x32\x35\x37\x2c\x30\x2e\x32\x35\ +\x37\x2d\x30\x2e\x35\x30\x36\x2c\x30\x2e\x32\x37\x33\x2d\x30\x2e\ +\x37\x34\x37\x2c\x30\x2e\x30\x34\x38\x63\x2d\x30\x2e\x33\x36\x39\ +\x2d\x30\x2e\x34\x39\x38\x2d\x31\x2e\x33\x31\x36\x2d\x31\x2e\x32\ +\x30\x35\x2d\x32\x2e\x38\x34\x33\x2d\x32\x2e\x31\x32\x63\x2d\x30\ +\x2e\x33\x38\x35\x2d\x30\x2e\x32\x35\x37\x2d\x30\x2e\x34\x33\x34\ +\x2d\x30\x2e\x34\x39\x38\x2d\x30\x2e\x31\x34\x35\x2d\x30\x2e\x37\ +\x32\x33\x6c\x31\x2e\x36\x36\x32\x2d\x31\x2e\x33\x30\x31\x0d\x0a\ +\x09\x09\x63\x30\x2e\x32\x39\x2d\x30\x2e\x32\x32\x35\x2c\x30\x2e\ +\x36\x32\x37\x2d\x30\x2e\x32\x32\x35\x2c\x31\x2e\x30\x31\x33\x2c\ +\x30\x43\x35\x31\x2e\x30\x31\x38\x2c\x38\x2e\x31\x36\x36\x2c\x35\ +\x31\x2e\x38\x39\x33\x2c\x38\x2e\x37\x38\x35\x2c\x35\x32\x2e\x34\ +\x35\x35\x2c\x39\x2e\x33\x39\x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\ +\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x46\x46\ +\x46\x46\x22\x20\x64\x3d\x22\x4d\x37\x38\x2e\x34\x37\x37\x2c\x31\ +\x33\x2e\x32\x35\x68\x34\x2e\x31\x36\x39\x63\x30\x2e\x33\x36\x39\ +\x2c\x30\x2c\x30\x2e\x35\x32\x31\x2c\x30\x2e\x31\x37\x37\x2c\x30\ +\x2e\x34\x35\x38\x2c\x30\x2e\x35\x33\x6c\x2d\x30\x2e\x34\x31\x2c\ +\x32\x2e\x31\x34\x35\x63\x2d\x30\x2e\x30\x36\x34\x2c\x30\x2e\x33\ +\x35\x34\x2d\x30\x2e\x32\x38\x31\x2c\x30\x2e\x35\x33\x2d\x30\x2e\ +\x36\x35\x2c\x30\x2e\x35\x33\x48\x36\x31\x2e\x32\x30\x31\x0d\x0a\ +\x09\x09\x63\x2d\x30\x2e\x33\x37\x2c\x30\x2d\x30\x2e\x35\x32\x32\ +\x2d\x30\x2e\x31\x37\x36\x2d\x30\x2e\x34\x35\x38\x2d\x30\x2e\x35\ +\x33\x6c\x30\x2e\x34\x31\x2d\x32\x2e\x31\x34\x35\x63\x30\x2e\x30\ +\x36\x33\x2d\x30\x2e\x33\x35\x33\x2c\x30\x2e\x32\x38\x2d\x30\x2e\ +\x35\x33\x2c\x30\x2e\x36\x35\x2d\x30\x2e\x35\x33\x68\x33\x2e\x38\ +\x37\x39\x6c\x2d\x30\x2e\x32\x31\x37\x2d\x30\x2e\x35\x35\x34\x0d\ +\x0a\x09\x09\x63\x2d\x30\x2e\x33\x36\x39\x2d\x30\x2e\x39\x37\x39\ +\x2d\x30\x2e\x30\x34\x2d\x31\x2e\x35\x35\x38\x2c\x30\x2e\x39\x38\ +\x38\x2d\x31\x2e\x37\x33\x34\x6c\x30\x2e\x37\x32\x33\x2d\x30\x2e\ +\x31\x34\x35\x68\x2d\x34\x2e\x36\x30\x33\x63\x2d\x30\x2e\x33\x36\ +\x39\x2c\x30\x2d\x30\x2e\x35\x32\x31\x2d\x30\x2e\x31\x37\x36\x2d\ +\x30\x2e\x34\x35\x37\x2d\x30\x2e\x35\x33\x6c\x30\x2e\x34\x30\x39\ +\x2d\x32\x2e\x31\x34\x35\x0d\x0a\x09\x09\x63\x30\x2e\x30\x36\x34\ +\x2d\x30\x2e\x33\x35\x33\x2c\x30\x2e\x32\x38\x31\x2d\x30\x2e\x35\ +\x33\x2c\x30\x2e\x36\x35\x2d\x30\x2e\x35\x33\x68\x36\x2e\x39\x33\ +\x39\x6c\x2d\x30\x2e\x34\x38\x32\x2d\x31\x2e\x31\x33\x33\x63\x2d\ +\x30\x2e\x31\x32\x38\x2d\x30\x2e\x33\x33\x37\x2d\x30\x2e\x30\x30\ +\x38\x2d\x30\x2e\x35\x30\x36\x2c\x30\x2e\x33\x36\x32\x2d\x30\x2e\ +\x35\x30\x36\x6c\x32\x2e\x39\x36\x33\x2d\x30\x2e\x30\x32\x34\x0d\ +\x0a\x09\x09\x63\x30\x2e\x33\x36\x39\x2c\x30\x2c\x30\x2e\x36\x32\ +\x37\x2c\x30\x2e\x31\x37\x37\x2c\x30\x2e\x37\x37\x31\x2c\x30\x2e\ +\x35\x33\x6c\x30\x2e\x35\x30\x36\x2c\x31\x2e\x31\x33\x33\x68\x37\ +\x2e\x33\x32\x34\x63\x30\x2e\x33\x37\x2c\x30\x2c\x30\x2e\x35\x32\ +\x32\x2c\x30\x2e\x31\x37\x37\x2c\x30\x2e\x34\x35\x38\x2c\x30\x2e\ +\x35\x33\x6c\x2d\x30\x2e\x34\x30\x39\x2c\x32\x2e\x31\x34\x35\x63\ +\x2d\x30\x2e\x30\x36\x34\x2c\x30\x2e\x33\x35\x34\x2d\x30\x2e\x32\ +\x38\x31\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x36\x35\x2c\x30\x2e\x35\ +\x33\x0d\x0a\x09\x09\x48\x37\x37\x2e\x32\x6c\x30\x2e\x36\x37\x35\ +\x2c\x30\x2e\x31\x34\x35\x63\x31\x2e\x30\x32\x37\x2c\x30\x2e\x31\ +\x39\x32\x2c\x31\x2e\x33\x32\x35\x2c\x30\x2e\x37\x36\x33\x2c\x30\ +\x2e\x38\x39\x31\x2c\x31\x2e\x37\x31\x4c\x37\x38\x2e\x34\x37\x37\ +\x2c\x31\x33\x2e\x32\x35\x7a\x20\x4d\x36\x34\x2e\x38\x36\x33\x2c\ +\x32\x38\x2e\x36\x32\x33\x63\x2d\x30\x2e\x38\x38\x34\x2c\x30\x2d\ +\x31\x2e\x33\x32\x35\x2d\x30\x2e\x34\x34\x32\x2d\x31\x2e\x33\x32\ +\x35\x2d\x31\x2e\x33\x32\x36\x76\x2d\x38\x2e\x33\x33\x36\x0d\x0a\ +\x09\x09\x63\x30\x2d\x30\x2e\x38\x38\x34\x2c\x30\x2e\x34\x34\x31\ +\x2d\x31\x2e\x33\x32\x36\x2c\x31\x2e\x33\x32\x35\x2d\x31\x2e\x33\ +\x32\x36\x68\x31\x34\x2e\x34\x30\x39\x63\x30\x2e\x38\x38\x33\x2c\ +\x30\x2c\x31\x2e\x33\x32\x35\x2c\x30\x2e\x34\x34\x32\x2c\x31\x2e\ +\x33\x32\x35\x2c\x31\x2e\x33\x32\x36\x76\x38\x2e\x33\x33\x36\x63\ +\x30\x2c\x30\x2e\x38\x38\x34\x2d\x30\x2e\x34\x34\x32\x2c\x31\x2e\ +\x33\x32\x36\x2d\x31\x2e\x33\x32\x35\x2c\x31\x2e\x33\x32\x36\x48\ +\x36\x34\x2e\x38\x36\x33\x7a\x0d\x0a\x09\x09\x20\x4d\x37\x36\x2e\ +\x37\x36\x37\x2c\x32\x31\x2e\x32\x39\x38\x63\x30\x2d\x30\x2e\x34\ +\x36\x36\x2d\x30\x2e\x32\x33\x33\x2d\x30\x2e\x36\x39\x38\x2d\x30\ +\x2e\x36\x39\x39\x2d\x30\x2e\x36\x39\x38\x68\x2d\x38\x2e\x31\x39\ +\x32\x63\x2d\x30\x2e\x34\x36\x36\x2c\x30\x2d\x30\x2e\x36\x39\x38\ +\x2c\x30\x2e\x32\x33\x32\x2d\x30\x2e\x36\x39\x38\x2c\x30\x2e\x36\ +\x39\x38\x76\x30\x2e\x34\x35\x38\x68\x39\x2e\x35\x39\x56\x32\x31\ +\x2e\x32\x39\x38\x7a\x20\x4d\x36\x37\x2e\x31\x37\x37\x2c\x32\x34\ +\x2e\x39\x38\x34\x0d\x0a\x09\x09\x63\x30\x2c\x30\x2e\x34\x36\x36\ +\x2c\x30\x2e\x32\x33\x32\x2c\x30\x2e\x36\x39\x39\x2c\x30\x2e\x36\ +\x39\x38\x2c\x30\x2e\x36\x39\x39\x68\x38\x2e\x31\x39\x32\x63\x30\ +\x2e\x34\x36\x36\x2c\x30\x2c\x30\x2e\x36\x39\x39\x2d\x30\x2e\x32\ +\x33\x33\x2c\x30\x2e\x36\x39\x39\x2d\x30\x2e\x36\x39\x39\x56\x32\ +\x34\x2e\x34\x33\x68\x2d\x39\x2e\x35\x39\x56\x32\x34\x2e\x39\x38\ +\x34\x7a\x20\x4d\x37\x35\x2e\x32\x34\x38\x2c\x31\x30\x2e\x38\x31\ +\x36\x68\x2d\x36\x2e\x35\x37\x37\x6c\x30\x2e\x39\x38\x37\x2c\x32\ +\x2e\x34\x33\x34\x0d\x0a\x09\x09\x68\x34\x2e\x38\x36\x37\x4c\x37\ +\x35\x2e\x32\x34\x38\x2c\x31\x30\x2e\x38\x31\x36\x7a\x22\x2f\x3e\ +\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\ +\x46\x46\x46\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x31\x30\x37\x2e\ +\x31\x30\x32\x2c\x31\x35\x2e\x36\x33\x36\x6c\x2d\x30\x2e\x34\x35\ +\x38\x2c\x32\x2e\x34\x38\x31\x63\x2d\x30\x2e\x30\x34\x38\x2c\x30\ +\x2e\x33\x35\x34\x2d\x30\x2e\x32\x35\x37\x2c\x30\x2e\x35\x33\x2d\ +\x30\x2e\x36\x32\x36\x2c\x30\x2e\x35\x33\x48\x39\x35\x2e\x37\x35\ +\x33\x0d\x0a\x09\x09\x63\x2d\x31\x2e\x31\x35\x36\x2c\x31\x2e\x38\ +\x2d\x32\x2e\x33\x35\x34\x2c\x33\x2e\x33\x37\x33\x2d\x33\x2e\x35\ +\x39\x2c\x34\x2e\x37\x32\x33\x63\x2d\x30\x2e\x33\x30\x36\x2c\x30\ +\x2e\x33\x35\x33\x2d\x30\x2e\x32\x33\x33\x2c\x30\x2e\x35\x32\x32\ +\x2c\x30\x2e\x32\x31\x37\x2c\x30\x2e\x35\x30\x36\x6c\x37\x2e\x38\ +\x35\x34\x2d\x30\x2e\x34\x33\x34\x6c\x2d\x31\x2e\x38\x37\x39\x2d\ +\x32\x2e\x36\x32\x36\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x32\x30\x39\ +\x2d\x30\x2e\x32\x38\x39\x2d\x30\x2e\x31\x33\x37\x2d\x30\x2e\x34\ +\x37\x35\x2c\x30\x2e\x32\x31\x37\x2d\x30\x2e\x35\x35\x35\x6c\x32\ +\x2e\x35\x35\x34\x2d\x30\x2e\x37\x32\x33\x63\x30\x2e\x33\x35\x34\ +\x2d\x30\x2e\x30\x38\x2c\x30\x2e\x36\x34\x33\x2c\x30\x2e\x30\x31\ +\x36\x2c\x30\x2e\x38\x36\x37\x2c\x30\x2e\x32\x38\x39\x63\x30\x2e\ +\x35\x36\x33\x2c\x30\x2e\x36\x34\x33\x2c\x31\x2e\x33\x33\x33\x2c\ +\x31\x2e\x36\x39\x35\x2c\x32\x2e\x33\x31\x33\x2c\x33\x2e\x31\x35\ +\x36\x0d\x0a\x09\x09\x63\x30\x2e\x39\x37\x39\x2c\x31\x2e\x34\x34\ +\x35\x2c\x31\x2e\x36\x36\x32\x2c\x32\x2e\x35\x38\x36\x2c\x32\x2e\ +\x30\x34\x38\x2c\x33\x2e\x34\x32\x32\x63\x30\x2e\x31\x34\x35\x2c\ +\x30\x2e\x32\x38\x39\x2c\x30\x2e\x30\x34\x38\x2c\x30\x2e\x34\x38\ +\x39\x2d\x30\x2e\x32\x38\x39\x2c\x30\x2e\x36\x30\x32\x6c\x2d\x32\ +\x2e\x36\x39\x38\x2c\x30\x2e\x38\x39\x32\x63\x2d\x30\x2e\x33\x33\ +\x38\x2c\x30\x2e\x31\x31\x32\x2d\x30\x2e\x35\x39\x35\x2c\x30\x2d\ +\x30\x2e\x37\x37\x31\x2d\x30\x2e\x33\x33\x37\x0d\x0a\x09\x09\x6c\ +\x2d\x30\x2e\x34\x33\x34\x2d\x30\x2e\x39\x31\x36\x63\x2d\x38\x2e\ +\x30\x31\x36\x2c\x30\x2e\x36\x31\x2d\x31\x32\x2e\x34\x39\x37\x2c\ +\x30\x2e\x39\x38\x38\x2d\x31\x33\x2e\x34\x34\x34\x2c\x31\x2e\x31\ +\x33\x33\x6c\x2d\x30\x2e\x39\x34\x2c\x30\x2e\x32\x34\x63\x2d\x30\ +\x2e\x33\x35\x34\x2c\x30\x2e\x30\x38\x2d\x30\x2e\x35\x36\x33\x2d\ +\x30\x2e\x30\x35\x36\x2d\x30\x2e\x36\x32\x36\x2d\x30\x2e\x34\x30\ +\x39\x6c\x2d\x30\x2e\x35\x37\x38\x2d\x32\x2e\x35\x33\x0d\x0a\x09\ +\x09\x63\x2d\x30\x2e\x30\x36\x34\x2d\x30\x2e\x33\x35\x33\x2c\x30\ +\x2e\x30\x34\x2d\x30\x2e\x36\x32\x36\x2c\x30\x2e\x33\x31\x33\x2d\ +\x30\x2e\x38\x31\x38\x63\x2d\x30\x2e\x30\x34\x38\x2c\x30\x2e\x31\ +\x36\x2c\x30\x2e\x33\x30\x36\x2d\x30\x2e\x31\x36\x2c\x31\x2e\x30\ +\x36\x31\x2d\x30\x2e\x39\x36\x35\x63\x30\x2e\x33\x33\x37\x2d\x30\ +\x2e\x33\x33\x36\x2c\x30\x2e\x38\x33\x35\x2d\x30\x2e\x39\x34\x37\ +\x2c\x31\x2e\x34\x39\x34\x2d\x31\x2e\x38\x33\x6c\x31\x2e\x38\x33\ +\x31\x2d\x32\x2e\x38\x31\x39\x68\x2d\x35\x2e\x37\x38\x33\x0d\x0a\ +\x09\x09\x63\x2d\x30\x2e\x33\x36\x39\x2c\x30\x2d\x30\x2e\x35\x32\ +\x39\x2d\x30\x2e\x31\x37\x37\x2d\x30\x2e\x34\x38\x31\x2d\x30\x2e\ +\x35\x33\x6c\x30\x2e\x34\x35\x38\x2d\x32\x2e\x34\x38\x31\x63\x30\ +\x2e\x30\x34\x38\x2d\x30\x2e\x33\x35\x34\x2c\x30\x2e\x32\x35\x37\ +\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x36\x32\x36\x2d\x30\x2e\x35\x33\ +\x68\x38\x2e\x30\x34\x38\x76\x2d\x32\x2e\x37\x39\x35\x68\x2d\x36\ +\x2e\x37\x39\x35\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x33\x36\x39\x2c\ +\x30\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x31\x37\x37\x2d\x30\x2e\x34\ +\x38\x31\x2d\x30\x2e\x35\x33\x6c\x30\x2e\x34\x33\x34\x2d\x32\x2e\ +\x34\x35\x38\x63\x30\x2e\x30\x34\x38\x2d\x30\x2e\x33\x35\x33\x2c\ +\x30\x2e\x32\x36\x35\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x36\x35\x2d\ +\x30\x2e\x35\x33\x68\x36\x2e\x31\x39\x32\x76\x2d\x32\x2e\x35\x33\ +\x63\x30\x2d\x30\x2e\x33\x36\x39\x2c\x30\x2e\x31\x37\x37\x2d\x30\ +\x2e\x35\x33\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x34\x38\x32\x0d\x0a\ +\x09\x09\x6c\x32\x2e\x36\x37\x34\x2c\x30\x2e\x34\x35\x38\x63\x30\ +\x2e\x33\x35\x34\x2c\x30\x2e\x30\x34\x38\x2c\x30\x2e\x35\x33\x2c\ +\x30\x2e\x32\x35\x37\x2c\x30\x2e\x35\x33\x2c\x30\x2e\x36\x32\x36\ +\x76\x31\x2e\x39\x32\x37\x68\x37\x2e\x30\x33\x36\x63\x30\x2e\x33\ +\x36\x39\x2c\x30\x2c\x30\x2e\x35\x32\x39\x2c\x30\x2e\x31\x37\x37\ +\x2c\x30\x2e\x34\x38\x31\x2c\x30\x2e\x35\x33\x6c\x2d\x30\x2e\x34\ +\x35\x38\x2c\x32\x2e\x34\x35\x38\x0d\x0a\x09\x09\x63\x2d\x30\x2e\ +\x30\x34\x38\x2c\x30\x2e\x33\x35\x34\x2d\x30\x2e\x32\x35\x37\x2c\ +\x30\x2e\x35\x33\x2d\x30\x2e\x36\x32\x36\x2c\x30\x2e\x35\x33\x68\ +\x2d\x36\x2e\x34\x33\x34\x76\x32\x2e\x37\x39\x35\x68\x38\x2e\x37\ +\x34\x36\x43\x31\x30\x36\x2e\x39\x38\x39\x2c\x31\x35\x2e\x31\x30\ +\x35\x2c\x31\x30\x37\x2e\x31\x34\x39\x2c\x31\x35\x2e\x32\x38\x32\ +\x2c\x31\x30\x37\x2e\x31\x30\x32\x2c\x31\x35\x2e\x36\x33\x36\x7a\ +\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\ +\x3d\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x31\ +\x31\x35\x2e\x31\x39\x37\x2c\x31\x31\x2e\x33\x37\x31\x63\x30\x2e\ +\x33\x36\x39\x2c\x30\x2c\x30\x2e\x37\x30\x37\x2c\x30\x2e\x31\x30\ +\x35\x2c\x31\x2e\x30\x31\x32\x2c\x30\x2e\x33\x31\x33\x6c\x31\x2e\ +\x33\x30\x32\x2c\x30\x2e\x38\x39\x32\x63\x30\x2e\x33\x30\x35\x2c\ +\x30\x2e\x32\x30\x39\x2c\x30\x2e\x34\x32\x35\x2c\x30\x2e\x35\x30\ +\x36\x2c\x30\x2e\x33\x36\x31\x2c\x30\x2e\x38\x39\x31\x0d\x0a\x09\ +\x09\x63\x2d\x30\x2e\x33\x37\x2c\x32\x2e\x35\x30\x36\x2d\x31\x2e\ +\x31\x35\x36\x2c\x35\x2e\x30\x30\x34\x2d\x32\x2e\x33\x36\x31\x2c\ +\x37\x2e\x34\x39\x34\x63\x2d\x31\x2e\x31\x38\x39\x2c\x32\x2e\x34\ +\x37\x33\x2d\x32\x2e\x34\x39\x38\x2c\x34\x2e\x32\x35\x36\x2d\x33\ +\x2e\x39\x32\x38\x2c\x35\x2e\x33\x34\x39\x63\x2d\x30\x2e\x32\x35\ +\x37\x2c\x30\x2e\x32\x30\x38\x2d\x30\x2e\x34\x39\x38\x2c\x30\x2e\ +\x31\x37\x37\x2d\x30\x2e\x37\x32\x33\x2d\x30\x2e\x30\x39\x37\x6c\ +\x2d\x31\x2e\x37\x33\x34\x2d\x32\x2e\x31\x39\x32\x0d\x0a\x09\x09\ +\x63\x2d\x30\x2e\x32\x32\x36\x2d\x30\x2e\x32\x37\x32\x2d\x30\x2e\ +\x32\x30\x31\x2d\x30\x2e\x35\x32\x32\x2c\x30\x2e\x30\x37\x32\x2d\ +\x30\x2e\x37\x34\x37\x63\x32\x2e\x30\x38\x38\x2d\x31\x2e\x34\x31\ +\x33\x2c\x33\x2e\x35\x36\x35\x2d\x33\x2e\x38\x36\x33\x2c\x34\x2e\ +\x34\x33\x33\x2d\x37\x2e\x33\x34\x39\x63\x30\x2e\x31\x36\x31\x2d\ +\x30\x2e\x35\x39\x34\x2c\x30\x2e\x30\x30\x39\x2d\x30\x2e\x38\x39\ +\x32\x2d\x30\x2e\x34\x35\x37\x2d\x30\x2e\x38\x39\x32\x68\x2d\x33\ +\x2e\x33\x35\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x33\x36\x39\x2c\x30\ +\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x31\x37\x37\x2d\x30\x2e\x34\x38\ +\x31\x2d\x30\x2e\x35\x33\x6c\x30\x2e\x34\x35\x37\x2d\x32\x2e\x34\ +\x38\x31\x63\x30\x2e\x30\x34\x39\x2d\x30\x2e\x33\x35\x33\x2c\x30\ +\x2e\x32\x35\x37\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x36\x32\x37\x2d\ +\x30\x2e\x35\x33\x4c\x31\x31\x35\x2e\x31\x39\x37\x2c\x31\x31\x2e\ +\x33\x37\x31\x7a\x20\x4d\x31\x32\x36\x2e\x38\x31\x31\x2c\x31\x30\ +\x2e\x31\x39\x0d\x0a\x09\x09\x63\x30\x2e\x32\x30\x39\x2d\x30\x2e\ +\x32\x37\x33\x2c\x30\x2e\x34\x34\x32\x2d\x30\x2e\x32\x38\x31\x2c\ +\x30\x2e\x36\x39\x39\x2d\x30\x2e\x30\x32\x34\x6c\x31\x2e\x39\x37\ +\x36\x2c\x32\x63\x30\x2e\x32\x35\x37\x2c\x30\x2e\x32\x35\x37\x2c\ +\x30\x2e\x32\x34\x31\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x30\x34\x38\ +\x2c\x30\x2e\x38\x31\x39\x63\x2d\x31\x2e\x34\x33\x2c\x31\x2e\x33\ +\x39\x37\x2d\x33\x2e\x30\x32\x31\x2c\x32\x2e\x37\x36\x33\x2d\x34\ +\x2e\x37\x37\x31\x2c\x34\x2e\x30\x39\x36\x0d\x0a\x09\x09\x63\x31\ +\x2e\x38\x36\x32\x2c\x32\x2e\x38\x34\x33\x2c\x34\x2e\x30\x38\x37\ +\x2c\x34\x2e\x38\x32\x37\x2c\x36\x2e\x36\x37\x34\x2c\x35\x2e\x39\ +\x35\x32\x63\x30\x2e\x33\x35\x33\x2c\x30\x2e\x31\x34\x35\x2c\x30\ +\x2e\x34\x30\x31\x2c\x30\x2e\x33\x33\x37\x2c\x30\x2e\x31\x34\x35\ +\x2c\x30\x2e\x35\x37\x38\x4c\x31\x32\x39\x2e\x31\x2c\x32\x35\x2e\ +\x39\x63\x2d\x30\x2e\x32\x35\x37\x2c\x30\x2e\x32\x34\x2d\x30\x2e\ +\x35\x33\x38\x2c\x30\x2e\x32\x36\x35\x2d\x30\x2e\x38\x34\x33\x2c\ +\x30\x2e\x30\x37\x32\x0d\x0a\x09\x09\x63\x2d\x32\x2e\x32\x34\x39\ +\x2d\x31\x2e\x31\x37\x33\x2d\x34\x2e\x32\x39\x37\x2d\x33\x2e\x34\ +\x31\x34\x2d\x36\x2e\x31\x34\x35\x2d\x36\x2e\x37\x32\x33\x76\x35\ +\x2e\x30\x31\x32\x63\x30\x2c\x30\x2e\x39\x39\x36\x2d\x30\x2e\x31\ +\x30\x34\x2c\x31\x2e\x37\x36\x37\x2d\x30\x2e\x33\x31\x33\x2c\x32\ +\x2e\x33\x31\x33\x63\x2d\x30\x2e\x32\x30\x38\x2c\x30\x2e\x35\x34\ +\x36\x2d\x30\x2e\x35\x37\x38\x2c\x30\x2e\x39\x37\x32\x2d\x31\x2e\ +\x31\x30\x37\x2c\x31\x2e\x32\x37\x37\x0d\x0a\x09\x09\x63\x2d\x30\ +\x2e\x39\x33\x33\x2c\x30\x2e\x35\x32\x39\x2d\x32\x2e\x32\x35\x38\ +\x2c\x30\x2e\x37\x38\x37\x2d\x33\x2e\x39\x37\x36\x2c\x30\x2e\x37\ +\x37\x31\x63\x2d\x30\x2e\x34\x38\x32\x2c\x30\x2e\x30\x31\x36\x2d\ +\x30\x2e\x37\x35\x36\x2d\x30\x2e\x31\x35\x33\x2d\x30\x2e\x38\x31\ +\x39\x2d\x30\x2e\x35\x30\x36\x6c\x2d\x30\x2e\x36\x30\x33\x2d\x32\ +\x2e\x38\x32\x63\x2d\x30\x2e\x30\x36\x34\x2d\x30\x2e\x33\x35\x33\ +\x2c\x30\x2e\x30\x38\x2d\x30\x2e\x35\x32\x39\x2c\x30\x2e\x34\x33\ +\x34\x2d\x30\x2e\x35\x32\x39\x0d\x0a\x09\x09\x63\x30\x2e\x31\x37\ +\x37\x2c\x30\x2e\x30\x31\x36\x2c\x30\x2e\x38\x36\x37\x2c\x30\x2e\ +\x30\x32\x33\x2c\x32\x2e\x30\x37\x32\x2c\x30\x2e\x30\x32\x33\x63\ +\x30\x2e\x33\x38\x36\x2c\x30\x2c\x30\x2e\x35\x37\x38\x2d\x30\x2e\ +\x31\x38\x34\x2c\x30\x2e\x35\x37\x38\x2d\x30\x2e\x35\x35\x34\x56\ +\x36\x2e\x32\x38\x37\x63\x30\x2d\x30\x2e\x33\x37\x2c\x30\x2e\x31\ +\x37\x37\x2d\x30\x2e\x35\x33\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x34\ +\x38\x32\x6c\x32\x2e\x36\x37\x34\x2c\x30\x2e\x34\x35\x38\x0d\x0a\ +\x09\x09\x63\x30\x2e\x33\x35\x34\x2c\x30\x2e\x30\x34\x38\x2c\x30\ +\x2e\x35\x33\x2c\x30\x2e\x32\x35\x37\x2c\x30\x2e\x35\x33\x2c\x30\ +\x2e\x36\x32\x36\x76\x34\x2e\x37\x39\x35\x63\x30\x2e\x32\x34\x31\ +\x2c\x30\x2e\x37\x35\x35\x2c\x30\x2e\x35\x37\x2c\x31\x2e\x36\x31\ +\x34\x2c\x30\x2e\x39\x38\x38\x2c\x32\x2e\x35\x37\x38\x43\x31\x32\ +\x34\x2e\x37\x33\x39\x2c\x31\x32\x2e\x37\x33\x36\x2c\x31\x32\x35\ +\x2e\x39\x37\x36\x2c\x31\x31\x2e\x33\x37\x39\x2c\x31\x32\x36\x2e\ +\x38\x31\x31\x2c\x31\x30\x2e\x31\x39\x7a\x22\x2f\x3e\x0d\x0a\x09\ +\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x46\ +\x46\x46\x46\x22\x20\x64\x3d\x22\x4d\x31\x34\x30\x2e\x38\x35\x38\ +\x2c\x36\x2e\x35\x35\x32\x63\x30\x2e\x33\x30\x35\x2d\x30\x2e\x31\ +\x34\x35\x2c\x30\x2e\x35\x36\x32\x2d\x30\x2e\x30\x37\x32\x2c\x30\ +\x2e\x37\x37\x31\x2c\x30\x2e\x32\x31\x37\x6c\x31\x2e\x34\x39\x34\ +\x2c\x32\x2e\x31\x39\x33\x63\x30\x2e\x32\x30\x39\x2c\x30\x2e\x32\ +\x38\x39\x2c\x30\x2e\x31\x36\x2c\x30\x2e\x34\x38\x32\x2d\x30\x2e\ +\x31\x34\x35\x2c\x30\x2e\x35\x37\x38\x0d\x0a\x09\x09\x63\x2d\x30\ +\x2e\x39\x36\x34\x2c\x30\x2e\x33\x37\x2d\x32\x2e\x33\x36\x39\x2c\ +\x30\x2e\x37\x36\x33\x2d\x34\x2e\x32\x31\x37\x2c\x31\x2e\x31\x38\ +\x31\x63\x2d\x30\x2e\x36\x31\x2c\x30\x2e\x31\x32\x39\x2d\x30\x2e\ +\x39\x31\x35\x2c\x30\x2e\x34\x32\x36\x2d\x30\x2e\x39\x31\x35\x2c\ +\x30\x2e\x38\x39\x32\x76\x32\x2e\x30\x39\x36\x68\x34\x2e\x39\x31\ +\x35\x63\x30\x2e\x33\x36\x39\x2c\x30\x2c\x30\x2e\x35\x32\x31\x2c\ +\x30\x2e\x31\x37\x37\x2c\x30\x2e\x34\x35\x38\x2c\x30\x2e\x35\x33\ +\x0d\x0a\x09\x09\x6c\x2d\x30\x2e\x34\x31\x2c\x32\x2e\x33\x31\x33\ +\x63\x2d\x30\x2e\x30\x36\x34\x2c\x30\x2e\x33\x35\x34\x2d\x30\x2e\ +\x32\x38\x31\x2c\x30\x2e\x35\x33\x2d\x30\x2e\x36\x35\x2c\x30\x2e\ +\x35\x33\x68\x2d\x34\x2e\x33\x31\x33\x76\x33\x2e\x36\x31\x34\x63\ +\x30\x2c\x30\x2e\x34\x36\x37\x2c\x30\x2e\x32\x32\x35\x2c\x30\x2e\ +\x36\x35\x38\x2c\x30\x2e\x36\x37\x35\x2c\x30\x2e\x35\x37\x38\x6c\ +\x34\x2e\x32\x34\x2d\x30\x2e\x37\x37\x31\x0d\x0a\x09\x09\x63\x30\ +\x2e\x33\x35\x34\x2d\x30\x2e\x30\x36\x33\x2c\x30\x2e\x34\x39\x38\ +\x2c\x30\x2e\x30\x38\x31\x2c\x30\x2e\x34\x33\x34\x2c\x30\x2e\x34\ +\x33\x35\x6c\x2d\x30\x2e\x34\x38\x31\x2c\x32\x2e\x34\x33\x34\x63\ +\x2d\x30\x2e\x30\x36\x34\x2c\x30\x2e\x33\x35\x33\x2d\x30\x2e\x33\ +\x34\x36\x2c\x30\x2e\x35\x37\x38\x2d\x30\x2e\x38\x34\x34\x2c\x30\ +\x2e\x36\x37\x35\x63\x2d\x32\x2e\x32\x39\x37\x2c\x30\x2e\x34\x38\ +\x31\x2d\x34\x2e\x30\x32\x33\x2c\x30\x2e\x38\x37\x35\x2d\x35\x2e\ +\x31\x38\x31\x2c\x31\x2e\x31\x38\x0d\x0a\x09\x09\x63\x2d\x31\x2e\ +\x31\x35\x36\x2c\x30\x2e\x32\x38\x39\x2d\x31\x2e\x38\x35\x34\x2c\ +\x30\x2e\x35\x30\x36\x2d\x32\x2e\x30\x39\x36\x2c\x30\x2e\x36\x35\ +\x63\x2d\x30\x2e\x32\x32\x36\x2c\x30\x2e\x31\x31\x33\x2d\x30\x2e\ +\x33\x37\x2d\x30\x2e\x30\x30\x38\x2d\x30\x2e\x34\x33\x34\x2d\x30\ +\x2e\x33\x36\x31\x6c\x2d\x30\x2e\x35\x35\x35\x2d\x33\x2e\x30\x31\ +\x32\x63\x2d\x30\x2e\x30\x36\x34\x2d\x30\x2e\x33\x35\x33\x2c\x30\ +\x2e\x30\x34\x39\x2d\x30\x2e\x36\x35\x38\x2c\x30\x2e\x33\x33\x38\ +\x2d\x30\x2e\x39\x31\x35\x0d\x0a\x09\x09\x63\x30\x2e\x32\x32\x35\ +\x2c\x30\x2e\x30\x39\x37\x2c\x30\x2e\x33\x33\x37\x2d\x30\x2e\x32\ +\x34\x31\x2c\x30\x2e\x33\x33\x37\x2d\x31\x2e\x30\x31\x33\x56\x39\ +\x2e\x38\x35\x33\x63\x30\x2d\x30\x2e\x38\x33\x35\x2c\x30\x2e\x34\ +\x37\x34\x2d\x31\x2e\x33\x35\x37\x2c\x31\x2e\x34\x32\x32\x2d\x31\ +\x2e\x35\x36\x36\x43\x31\x33\x37\x2e\x34\x36\x39\x2c\x37\x2e\x39\ +\x30\x31\x2c\x31\x33\x39\x2e\x31\x38\x38\x2c\x37\x2e\x33\x32\x33\ +\x2c\x31\x34\x30\x2e\x38\x35\x38\x2c\x36\x2e\x35\x35\x32\x7a\x0d\ +\x0a\x09\x09\x20\x4d\x31\x35\x33\x2e\x33\x33\x39\x2c\x37\x2e\x33\ +\x34\x37\x63\x30\x2e\x38\x38\x34\x2c\x30\x2c\x31\x2e\x33\x32\x35\ +\x2c\x30\x2e\x34\x34\x32\x2c\x31\x2e\x33\x32\x35\x2c\x31\x2e\x33\ +\x32\x35\x56\x32\x31\x2e\x34\x39\x63\x30\x2c\x31\x2e\x36\x35\x34\ +\x2d\x30\x2e\x34\x31\x38\x2c\x32\x2e\x37\x33\x39\x2d\x31\x2e\x32\ +\x35\x33\x2c\x33\x2e\x32\x35\x33\x63\x2d\x30\x2e\x37\x37\x31\x2c\ +\x30\x2e\x34\x38\x31\x2d\x31\x2e\x37\x37\x34\x2c\x30\x2e\x37\x32\ +\x34\x2d\x33\x2e\x30\x31\x32\x2c\x30\x2e\x37\x32\x34\x0d\x0a\x09\ +\x09\x63\x2d\x30\x2e\x34\x38\x31\x2c\x30\x2d\x30\x2e\x37\x36\x33\ +\x2d\x30\x2e\x31\x37\x38\x2d\x30\x2e\x38\x34\x33\x2d\x30\x2e\x35\ +\x33\x31\x6c\x2d\x30\x2e\x35\x37\x38\x2d\x32\x2e\x36\x32\x36\x63\ +\x2d\x30\x2e\x30\x38\x31\x2d\x30\x2e\x33\x35\x33\x2c\x30\x2e\x30\ +\x35\x36\x2d\x30\x2e\x35\x32\x31\x2c\x30\x2e\x34\x30\x39\x2d\x30\ +\x2e\x35\x30\x36\x63\x2d\x30\x2e\x30\x38\x2c\x30\x2c\x30\x2e\x33\ +\x35\x34\x2c\x30\x2c\x31\x2e\x33\x30\x31\x2c\x30\x0d\x0a\x09\x09\ +\x63\x30\x2e\x32\x38\x39\x2c\x30\x2c\x30\x2e\x34\x33\x34\x2d\x30\ +\x2e\x31\x34\x35\x2c\x30\x2e\x34\x33\x34\x2d\x30\x2e\x34\x33\x34\ +\x76\x2d\x39\x2e\x38\x35\x34\x63\x30\x2d\x30\x2e\x34\x36\x36\x2d\ +\x30\x2e\x32\x33\x32\x2d\x30\x2e\x36\x39\x39\x2d\x30\x2e\x36\x39\ +\x38\x2d\x30\x2e\x36\x39\x39\x68\x2d\x31\x2e\x37\x38\x33\x63\x2d\ +\x30\x2e\x34\x36\x36\x2c\x30\x2d\x30\x2e\x36\x39\x38\x2c\x30\x2e\ +\x32\x33\x33\x2d\x30\x2e\x36\x39\x38\x2c\x30\x2e\x36\x39\x39\x56\ +\x32\x38\x2e\x30\x32\x0d\x0a\x09\x09\x63\x30\x2c\x30\x2e\x33\x37\ +\x2d\x30\x2e\x31\x37\x38\x2c\x30\x2e\x35\x33\x31\x2d\x30\x2e\x35\ +\x33\x2c\x30\x2e\x34\x38\x32\x6c\x2d\x32\x2e\x34\x38\x31\x2d\x30\ +\x2e\x34\x35\x37\x63\x2d\x30\x2e\x33\x35\x34\x2d\x30\x2e\x30\x34\ +\x39\x2d\x30\x2e\x35\x33\x2d\x30\x2e\x32\x35\x38\x2d\x30\x2e\x35\ +\x33\x2d\x30\x2e\x36\x32\x37\x56\x38\x2e\x36\x37\x32\x63\x30\x2d\ +\x30\x2e\x38\x38\x33\x2c\x30\x2e\x34\x34\x31\x2d\x31\x2e\x33\x32\ +\x35\x2c\x31\x2e\x33\x32\x35\x2d\x31\x2e\x33\x32\x35\x48\x31\x35\ +\x33\x2e\x33\x33\x39\x7a\x22\x0d\x0a\x09\x09\x2f\x3e\x0d\x0a\x3c\ +\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\ +\x00\x00\x02\x17\ +\x00\ +\x00\x07\x01\x78\x9c\xe5\x55\xcd\x8a\xdb\x30\x10\x7e\x95\x41\xb9\ +\xec\x82\x63\xcb\x3f\xb2\xa2\x10\x07\xb6\x21\x39\xa5\xf4\xd0\x5b\ +\x2f\xc5\xbb\x56\x6c\xb3\x8e\x1d\x6c\x25\xce\x3e\x44\xe9\xa9\xb7\ +\xbe\x5e\xa1\x8f\xb1\x23\x39\xbb\x4d\x42\x02\x66\x61\x0f\x4b\x65\ +\xf4\x33\x9a\x6f\x46\xf3\x7d\x12\x78\xd2\xec\x52\xd8\xaf\x8b\xb2\ +\x89\x48\xa6\xd4\x66\xec\x38\x6d\xdb\xda\xad\x6f\x57\x75\xea\x78\ +\x94\x52\x07\x11\xa4\x83\x8c\xf7\x45\x5e\x3e\x5e\x02\xba\x42\x08\ +\xc7\x78\x09\xb4\x79\xa2\xb2\x88\x08\x4a\x09\x64\x32\x4f\x33\x15\ +\x91\x50\x1b\xbb\x5c\xb6\x9f\xaa\x7d\x44\x28\x50\x40\x37\x98\xdd\ +\x55\x5e\x14\x11\x29\xab\x52\x92\xe9\x24\x91\xab\x66\x3a\xa9\xe5\ +\x83\x82\x3c\x89\xc8\x26\x56\xd9\x77\xc4\xe8\x18\x02\x4f\x66\xbc\ +\x9a\xde\x99\x4e\x9c\x2e\x3e\x85\x6a\x13\x3f\xe4\x0a\x03\x5c\x02\ +\xaa\x8e\xcb\x66\x55\xd5\xeb\x88\x98\x65\x11\x2b\x79\x83\x25\xdc\ +\x02\xd4\x95\xea\x8c\x80\x51\xf0\x29\xbd\x25\x87\xc3\xbb\xa2\x06\ +\x0b\xd3\xc8\xdb\xd3\xf5\xae\x7c\x1d\x37\x8f\x86\xf2\x7d\x3a\xd4\ +\xeb\x17\x5d\xda\x2c\x57\x5a\x98\x6d\x23\xc1\xe8\x3b\xce\x6a\xb9\ +\xc2\xd2\x0e\xd2\x20\x67\x74\xe1\xa8\x83\x34\x73\x3d\x47\x64\x5b\ +\x17\x37\x83\x43\x2a\xac\x62\x3a\xd1\x70\x93\xff\xef\xcf\xdf\x7f\ +\x7e\xfc\xea\xd2\x0f\xeb\x6d\x21\x23\x22\x77\xb2\xac\x92\x84\x40\ +\xa3\x9e\xb4\xad\x5d\xe3\xc1\x9c\xe9\xef\x2a\x5f\xef\x84\xb0\x4b\ +\x19\x78\x42\x13\x3e\x96\x0a\x8f\xfb\x4c\x2d\x36\xa2\x4b\xcf\xfd\ +\x37\xd3\x65\xd7\xd1\xfe\x06\x86\xfc\xdb\xee\xcb\x35\xd7\xd5\x23\ +\x96\xd9\xfe\x88\xb9\x21\x13\x82\xfb\xbe\xe0\x34\x94\x43\xd7\x3f\ +\xcb\x17\x08\x5b\x1c\x35\x8e\xd9\x6d\x7a\xd2\x98\x3e\xed\x55\xc6\ +\x59\xb5\xbe\xcf\x4b\x99\xc0\xd7\x2c\xde\xc8\x3e\x72\x06\xf3\xbb\ +\xf9\xa2\x27\xbb\x5e\xd5\x5c\x90\xda\xa3\x4b\x7c\x5d\x2f\x53\x38\ +\x33\x86\x1d\x0a\x18\x09\x6e\xfb\xae\x45\x71\x11\xa0\xf8\xa1\x45\ +\x67\x7a\x1f\x37\x0e\x00\x44\x2f\x75\xe0\xe1\x46\x5e\x79\x7e\xd9\ +\xc5\x45\x0f\x76\x0b\x81\xdf\xdd\x15\x76\x1c\xf8\x59\xf5\xc1\x31\ +\x5b\xdf\x66\xd8\x03\x71\xd2\xc2\x0b\xfc\xb8\x85\xd0\x19\xb7\x5c\ +\x9b\x71\x60\x76\xe0\x5b\x26\x18\xb9\xe8\x1d\xc3\xc5\xb8\xa8\xc1\ +\xe1\x03\x43\x08\x18\x17\x37\x38\x3e\x33\x41\x58\x4e\xe7\x32\xf9\ +\xde\x83\xb0\xfb\xdf\x31\xf6\x3e\x02\x63\x27\x3d\xeb\xf8\x67\x9b\ +\x3e\x03\xf1\x7a\xec\xab\ +" + +qt_resource_name = b"\ +\x00\x03\ +\x00\x00\x70\x37\ +\x00\x69\ +\x00\x6d\x00\x67\ +\x00\x13\ +\x0a\x25\xf2\x27\ +\x00\x6c\ +\x00\x6f\x00\x67\x00\x6f\x00\x2d\x00\x68\x00\x6f\x00\x72\x00\x69\x00\x7a\x00\x6f\x00\x6e\x00\x74\x00\x61\x00\x6c\x00\x2e\x00\x73\ +\x00\x76\x00\x67\ +\x00\x06\ +\x03\x32\x4a\x27\ +\x80\xcc\ +\x66\x6f\x00\x2e\x00\x73\x00\x76\x00\x67\ +" + +qt_resource_struct_v1 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\ +\x00\x00\x00\x38\x00\x01\x00\x00\x00\x01\x00\x00\x22\x42\ +\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +" + +qt_resource_struct_v2 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x38\x00\x01\x00\x00\x00\x01\x00\x00\x22\x42\ +\x00\x00\x01\x7e\x9b\x06\x48\x80\ +\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x7e\x9b\x58\x78\xfc\ +" + +qt_version = [int(v) for v in QtCore.qVersion().split('.')] +if qt_version < [5, 8, 0]: + rcc_version = 1 + qt_resource_struct = qt_resource_struct_v1 +else: + rcc_version = 2 + qt_resource_struct = qt_resource_struct_v2 + +def qInitResources(): + QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ee42c85 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 JohnserfSeed + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README-EN.md b/README-EN.md new file mode 100644 index 0000000..88b992c --- /dev/null +++ b/README-EN.md @@ -0,0 +1,324 @@ +![Project Image](https://tvax2.sinaimg.cn/large/006908GAly1hgn9zod1yuj30zk0hstmf.jpg) + +

✨ 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 0000000..453da51 Binary files /dev/null and b/f2-logo.ico differ 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