├── .gitignore ├── LICENSE ├── Pipfile ├── Pipfile.lock ├── README.md ├── __init__.py ├── douyin_downloader.py ├── douyin_tool.py ├── img ├── URgood.jpg ├── deleted.jpg ├── downloading.png ├── girl.ico ├── owner.jpg ├── result.png └── timeout.jpg ├── json_demo ├── comment_demo.json ├── follow_list.json ├── main_page.json ├── search_result.json ├── user_info.json └── video_list.json ├── requirement.txt ├── setup.py └── util.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | .DS_Store 9 | 10 | # Distribution / packaging 11 | .Python 12 | .idea 13 | build/ 14 | develop-eggs/ 15 | dist/ 16 | downloads/ 17 | eggs/ 18 | .eggs/ 19 | lib/ 20 | lib64/ 21 | parts/ 22 | sdist/ 23 | var/ 24 | wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | .hypothesis/ 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *\.log 57 | .static_storage/ 58 | .media/ 59 | local_settings.py 60 | 61 | # Flask stuff: 62 | instance/ 63 | .webassets-cache 64 | 65 | # Scrapy stuff: 66 | .scrapy 67 | 68 | # Sphinx documentation 69 | docs/_build/ 70 | 71 | # PyBuilder 72 | target/ 73 | 74 | # Jupyter Notebook 75 | .ipynb_checkpoints 76 | 77 | # pyenv 78 | .python-version 79 | 80 | # celery beat schedule file 81 | celerybeat-schedule 82 | 83 | # SageMath parsed files 84 | *.sage.py 85 | 86 | # Environments 87 | .env 88 | .venv 89 | env/ 90 | venv/ 91 | ENV/ 92 | env.bak/ 93 | venv.bak/ 94 | 95 | # Spyder project settings 96 | .spyderproject 97 | .spyproject 98 | 99 | # Rope project settings 100 | .ropeproject 101 | 102 | # mkdocs documentation 103 | /site 104 | 105 | # mypy 106 | .mypy_cache/ 107 | 108 | # for vscode 109 | .vscode/ 110 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.tuna.tsinghua.edu.cn/simple/" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | docopt = "*" 8 | trio = "==0.9.0" 9 | asks = "*" 10 | arrow = "*" 11 | 12 | [dev-packages] 13 | 14 | [requires] 15 | python_version = "3.6" 16 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "0902bd76aaa1a3869ca5d675103457a14e5e1a61373fa869643a218d289b5ced" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.6" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.tuna.tsinghua.edu.cn/simple/", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "arrow": { 20 | "hashes": [ 21 | "sha256:a558d3b7b6ce7ffc74206a86c147052de23d3d4ef0e17c210dd478c53575c4cd" 22 | ], 23 | "index": "pypi", 24 | "version": "==0.12.1" 25 | }, 26 | "asks": { 27 | "hashes": [ 28 | "sha256:1679e5bd1dfa6c5d2220bdf2b8921c9c0d063d08370a7c66b9e167113681406f" 29 | ], 30 | "index": "pypi", 31 | "version": "==2.2.0" 32 | }, 33 | "async-generator": { 34 | "hashes": [ 35 | "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b", 36 | "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144" 37 | ], 38 | "version": "==1.10" 39 | }, 40 | "attrs": { 41 | "hashes": [ 42 | "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", 43 | "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb" 44 | ], 45 | "version": "==18.2.0" 46 | }, 47 | "contextvars": { 48 | "hashes": [ 49 | "sha256:2341042e1c03a271813e07dba29b6b60fa85c1005ea5ed1638a076cf50b4d625" 50 | ], 51 | "markers": "python_version < '3.7'", 52 | "version": "==2.3" 53 | }, 54 | "docopt": { 55 | "hashes": [ 56 | "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" 57 | ], 58 | "index": "pypi", 59 | "version": "==0.6.2" 60 | }, 61 | "h11": { 62 | "hashes": [ 63 | "sha256:acca6a44cb52a32ab442b1779adf0875c443c689e9e028f8d831a3769f9c5208", 64 | "sha256:f2b1ca39bfed357d1f19ac732913d5f9faa54a5062eca7d2ec3a916cfb7ae4c7" 65 | ], 66 | "version": "==0.8.1" 67 | }, 68 | "idna": { 69 | "hashes": [ 70 | "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", 71 | "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" 72 | ], 73 | "version": "==2.7" 74 | }, 75 | "immutables": { 76 | "hashes": [ 77 | "sha256:1e4f4513254ef11e0230a558ee0dcb4551b914993c330005d15338da595d3750", 78 | "sha256:228e38dc7a810ba4ff88909908ac47f840e5dc6c4c0da6b25009c626a9ae771c", 79 | "sha256:2ae88fbfe1d04f4e5859c924e97313edf70e72b4f19871bf329b96a67ede9ba0", 80 | "sha256:2d32b61c222cba1dd11f0faff67c7fb6204ef1982454e1b5b001d4b79966ef17", 81 | "sha256:35af186bfac5b62522fdf2cab11120d7b0547f405aa399b6a1e443cf5f5e318c", 82 | "sha256:63023fa0cceedc62e0d1535cd4ca7a1f6df3120a6d8e5c34e89037402a6fd809", 83 | "sha256:6bf5857f42a96331fd0929c357dc0b36a72f339f3b6acaf870b149c96b141f69", 84 | "sha256:7bb1590024a032c7a57f79faf8c8ff5e91340662550d2980e0177f67e66e9c9c", 85 | "sha256:7c090687d7e623d4eca22962635b5e1a1ee2d6f9a9aca2f3fb5a184a1ffef1f2", 86 | "sha256:bc36a0a8749881eebd753f696b081bd51145e4d77291d671d2e2f622e5b65d2f", 87 | "sha256:d9fc6a236018d99af6453ead945a6bb55f98d14b1801a2c229dd993edc753a00" 88 | ], 89 | "version": "==0.6" 90 | }, 91 | "multio": { 92 | "hashes": [ 93 | "sha256:e8bce12aa8d2e076d96f4c4b6bfb70c01e0e0af9892f9ffc4ec868854e1b877e" 94 | ], 95 | "version": "==0.2.4" 96 | }, 97 | "outcome": { 98 | "hashes": [ 99 | "sha256:7357af9ba2a08fdff8c742818909c5d146fc1fe75aee4bddadaa4f8ad726d262", 100 | "sha256:9d58c05db36a900ce60c6da0167d76e28869f64b338d60fa3a61841cfa54ac71" 101 | ], 102 | "version": "==1.0.0" 103 | }, 104 | "python-dateutil": { 105 | "hashes": [ 106 | "sha256:1adb80e7a782c12e52ef9a8182bebeb73f1d7e24e374397af06fb4956c8dc5c0", 107 | "sha256:e27001de32f627c22380a688bcc43ce83504a7bc5da472209b4c70f02829f0b8" 108 | ], 109 | "version": "==2.7.3" 110 | }, 111 | "six": { 112 | "hashes": [ 113 | "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", 114 | "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" 115 | ], 116 | "version": "==1.11.0" 117 | }, 118 | "sniffio": { 119 | "hashes": [ 120 | "sha256:2e9b81429e3b7c9e119fcee2673ee3be3229982adc68b3f59317863aba05ebb7", 121 | "sha256:afb4997584a920e6e378a81ded2b3e71a696b85a68c4bfbe4dadf1ba57a9ef45" 122 | ], 123 | "version": "==1.0.0" 124 | }, 125 | "sortedcontainers": { 126 | "hashes": [ 127 | "sha256:220bb2e3e1886297fd7cdd6d164cb5cf237be1cfae1a3a3e526d149c52816682", 128 | "sha256:b74f2756fb5e23512572cc76f0fe0832fd86310f77dfee54335a35fb33f6b950" 129 | ], 130 | "version": "==2.0.5" 131 | }, 132 | "trio": { 133 | "hashes": [], 134 | "index": "pypi", 135 | "version": "==0.9.0" 136 | } 137 | }, 138 | "develop": {} 139 | } 140 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # douyin_downloader 2 | 3 | ```univers.flf 4 | 88 88 5 | 88 "" 6 | 88 7 | ,adPPYb,88 ,adPPYba, 88 88 8b d8 88 8b,dPPYba, 8 | a8" `Y88 a8" "8a 88 88 `8b d8' 88 88P' `"8a 9 | 8b 88 8b d8 88 88 `8b d8' 88 88 88 10 | "8a, ,d88 "8a, ,a8" "8a, ,a88 `8b,d8' 88 88 88 11 | `"8bbdP"Y8 `"YbbdP"' `"YbbdP'Y8 Y88' 88 88 88 12 | d8' 13 | d8' 14 | 88 88 88 15 | 88 88 88 16 | 88 88 88 17 | ,adPPYb,88 ,adPPYba, 8b db d8 8b,dPPYba, 88 ,adPPYba, ,adPPYYba, ,adPPYb,88 ,adPPYba, 8b,dPPYba, 18 | a8" `Y88 a8" "8a `8b d88b d8' 88P' `"8a 88 a8" "8a "" `Y8 a8" `Y88 a8P_____88 88P' "Y8 19 | 8b 88 8b d8 `8b d8'`8b d8' 88 88 88 8b d8 ,adPPPPP88 8b 88 8PP""""""" 88 20 | "8a, ,d88 "8a, ,a8" `8bd8' `8bd8' 88 88 88 "8a, ,a8" 88, ,88 "8a, ,d88 "8b, ,aa 88 21 | `"8bbdP"Y8 `"YbbdP"' YP YP 88 88 88 `"YbbdP"' `"8bbdP"Y8 `"8bbdP"Y8 `"Ybbd8"' 88 22 | ``` 23 | 24 | 如果你也是曾经沉迷过抖音,那我相信你的抖音里面点赞的视频数量一定不比我的少。但是最近我遇到了一个烦恼,很多以前点赞的视频都被作者删掉了,感觉很可惜...为了避免再发生这类事情,我决定先把已经喜欢的视频下载下来!然而事情并没有我想的那么简单,我发现在手机上下载简直是龟速!WTF??? 25 | 26 | 视频已删除... 视频正在下载... 27 | 28 | 所以不得不充分发挥我的聪明才智--上网搜一下有没有现成的抖音下载器!于是找到了 https://github.com/AppSign/douyin 和 https://github.com/hacksman/spider_world . 在我尝试着用现有轮子来下载我的喜欢列表的过程中,我发现在我的渣渣网速下,等半天没下载成功还抛出了异常,然后重新下载....形成了一个死循环。鉴于大神们已经将最艰难的数据抓包分析给出了下载相关demo,所以我干脆就自己写一个更顺手的爬虫了,撸起袖子就搞出来了这个工具~至少在我的渣渣网速下,可以顺利达成我的目标了。为了造福和我一样的 douyiner ,稍加整理了一下代码,欢迎大家尝试,如果使用过程中遇到了什么不顺手的,欢迎提出您宝贵的建议。 29 | 30 | 项目地址: [https://github.com/HeLiangHIT/douyin_downloader](https://github.com/HeLiangHIT/douyin_downloader) 31 | 32 | 33 | # 使用方法 34 | 35 | 安装后使用: 36 | 37 | 1. 安装可选如下几种方式: 38 | + 源码安装: `git clone https://github.com/HeLiangHIT/douyin_downloader.git && cd douyin_downloader && python setup.py install` 39 | + pip源安装: `pip install douyin_downloader` 40 | + 到 https://github.com/HeLiangHIT/douyin_downloader/releases 下载可执行文件 41 | 2. 使用: 在cmd下执行 `douyin_downloader` 命令,然后根据提示输入用户id/下载类型/是否下载关注用户等参数。 42 | 43 | ``` 44 | Input user_id:123 45 | Choose action[1.favorite, 2.post] *default 1: 46 | Do you want to follow user? [yes/no] *default no: 47 | Input video save dir *default /Users/heliang/Movies/douyin/: 48 | begin to download 123's favorite video to /Users/heliang/Movies/douyin/ ... 49 | ... 50 | ``` 51 | > 多次重复执行会自动去重处理,相同的视频文件不会重复下载。 52 | 53 | 从源码运行: 54 | 55 | 查看帮助: `python douyin_downloader.py --help` 56 | 57 | ``` 58 | 抖音下载器: 异步下载抖音视频。 follow 参数用于指定是否是下载关注的用户视频。 59 | 60 | Usage: 61 | douyin_downloader.py [--dir=dir] [--concurrency=concurrency] [--follow=follow] follow 62 | douyin_downloader.py [--dir=dir] [--concurrency=concurrency] [--follow=follow] 63 | douyin_downloader.py --version 64 | 65 | Options: 66 | --dir=dir select file save dir. * default: '$HOME/Movies/douyin/' 67 | --concurrency=concurrency select the concurrency number of downloader. [default: 20] 68 | ``` 69 | > 关于用户 user_id 的获取, 参考 https://github.com/hacksman/spider_world 的介绍。大致流程是 抖音>我>右上角...>分享个人主页>以图片形式分享到微信>微信扫码获取url地址>比如http..../user/84834596404最后的数字就是user_id值了。 70 | 71 | 72 | 举例: 73 | 74 | 1. `python douyin_downloader.py 84834596404 favorite` 下载用户 84834596404 喜欢过的视频。 75 | 2. `python douyin_downloader.py --dir=. --concurrency=10 84834596404 post` 下载用户 84834596404 上传的视频。 76 | 3. `python douyin_downloader.py 84838778760 favorite follow` 下载用户 84838778760 关注的用户喜欢过的视频。 77 | 4. `python douyin_downloader.py 84838778760 post follow` 下载用户 84838778760 关注的用户上传的视频。 78 | 79 | 80 | 下载过程和结果展示: 81 | 82 | ![下载中...](img/downloading.png) 83 | ![下载结果](img/result.png) 84 | 85 | # TODO 86 | 87 | * [ ] ~~从首页依次爬取抖音所有点击量超过1w的视频下载...~~ 88 | * [ ] ~~顺藤摸瓜,爬取自己关注的人->爬取他们关注的人...把整个抖音数据库都扒下来了,看看有没有用...~~ 89 | * [ ] ~~融入美女自动识别等功能(可以参考 [Douyin-Bot](https://github.com/wangshub/Douyin-Bot) )。~~ 90 | 91 | > 这些功能貌似没有什么实用意义,不准备做了~ 92 | 93 | # 参考 94 | 95 | 1. https://github.com/AppSign/douyin 96 | 2. https://github.com/hacksman/spider_world 97 | 3. https://github.com/python-trio/trio 98 | 4. https://github.com/theelous3/asks 99 | 100 | 101 | 欢迎扫码关注作者,获取更多信息哦~另外如果本源码对你有所帮助,可以[点赞以支持作者的持续更新](./img/URgood.jpg)。 102 | 103 | 关注作者 104 | 105 | 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | -------------------------------------------------------------------------------- /douyin_downloader.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Date : 2018-10-18 23:38:24 4 | # @Author : He Liang (heianghit@foxmail.com) 5 | # @Link : https://github.com/HeLiangHIT 6 | 7 | ''' 8 | 抖音下载器: 异步下载抖音视频。 follow 参数用于指定是否是下载关注的用户视频。 9 | 10 | Usage: 11 | douyin_downloader.py [--dir=dir] [--concurrency=concurrency] [--follow=follow] follow 12 | douyin_downloader.py [--dir=dir] [--concurrency=concurrency] [--follow=follow] 13 | douyin_downloader.py --version 14 | 15 | Options: 16 | --dir=dir select file save dir. * default: '$HOME/Movies/douyin/' 17 | --concurrency=concurrency select the concurrency number of downloader. [default: 20] 18 | ''' 19 | 20 | from douyin_tool import * 21 | from docopt import docopt 22 | import sys 23 | 24 | # 默认配置参数 25 | _SAVE_DIR = "%s/Movies/douyin/" % os.path.expanduser('~') # os.environ['HOME'] 26 | 27 | 28 | # 生产-消费 流程 的消费者 _receiver 29 | async def download_videos(_receiver, downloader): 30 | while True: 31 | async for video in _receiver: 32 | # video = await _receiver.receive() # may get repeated tail 33 | if video is None: 34 | return # 结束下载 35 | url = video['video_url'] 36 | if downloader.is_file_downloaded(video['name']) or url is None: 37 | logging.info(f"{video['name']} is already downloaded or expired!") 38 | continue 39 | 40 | logging.debug(f"downloading {url} ... ") 41 | content = await downloader.download_file(url) 42 | if content is not None: 43 | await downloader.save_file(video['name'], content) 44 | logging.info(f"download {video['name']} succ") 45 | else: 46 | logging.error(f"download {video['name']} from {url} FAIL!") 47 | 48 | 49 | # 生产-消费 流程 的生产者 _sender 50 | async def generate_videos(_sender, func_dict, user, action, repeat_func): 51 | '''根据用户选择调用指定函数''' 52 | async for video in func_dict[action](user, repeat_func=repeat_func): 53 | await _sender.send(video) 54 | await _sender.send(None) 55 | 56 | 57 | # 爬取单个用户的视频 58 | async def crawler_user_video(user, func_dict, action, save_dir, concurrency): 59 | '''下载指定用户指定的''' 60 | logging.info(f"start download {user}'s favorite video to {save_dir} with {concurrency} concurrency ...") 61 | downloader = AsyncDownloader(os.path.join(save_dir, user, action)) 62 | 63 | async with trio.open_nursery() as nursery: 64 | _sender, _receiver = trio.open_memory_channel(concurrency) # 并行数量 65 | nursery.start_soon(generate_videos, _sender, func_dict, user, action, downloader.is_file_downloaded) 66 | nursery.start_soon(download_videos, _receiver, downloader) 67 | 68 | logging.info(f"video for user with user_id={user} downloads finished!") 69 | 70 | 71 | # 主函数 72 | async def main(user, action, follow, save_dir, concurrency): 73 | dy = DouyinTool() 74 | func_dict = { 75 | "favorite" : dy.get_favorite_list, 76 | "post" : dy.get_post_list, 77 | } 78 | 79 | if action not in func_dict.keys(): 80 | logging.critical(f"action={action} is not supported!") 81 | exit(-1) 82 | if not user.isdigit(): 83 | logging.critical(f"user={user} is illegal!") 84 | exit(-1) 85 | 86 | if follow: 87 | user_ids = set() 88 | logging.info(f"Crawler {user}'s follow list...") 89 | async for people in dy.get_follow_list(user): 90 | user_ids.add(people['user_id']) 91 | logging.info(f"there are {len(user_ids)} followed users need for crawler, let's begin!") 92 | for _user in user_ids: 93 | await crawler_user_video(_user, func_dict, action, save_dir, concurrency) 94 | else: 95 | await crawler_user_video(user, func_dict, action, save_dir, concurrency) 96 | 97 | logging.info("all videos are downloaded! congratulations!!!") 98 | 99 | 100 | def cmd_run(): 101 | '''命令行输入参数''' 102 | user = user_input("Input user_id:") 103 | _action = user_input("Choose action[1.favorite, 2.post] *default 1:", ['1', '2'], '1') 104 | action = ('favorite', 'post')[int(_action) - 1] 105 | _follow = user_input("Do you want to follow user? [yes/no] *default no:", ['yes', 'no'], 'no') 106 | follow = _follow == 'yes' 107 | save_dir = user_input(f"Input video save dir *default {_SAVE_DIR}:", [], _SAVE_DIR) 108 | concurrency = 20 109 | print(f"begin to download {'following of ' if follow else ''}{user}'s {action} video to {save_dir} ... ") 110 | 111 | trio.run(main, user, action, follow, save_dir, concurrency) 112 | 113 | 114 | if __name__ == '__main__': 115 | if len(sys.argv) < 2: 116 | cmd_run() 117 | else: 118 | arguments = docopt(__doc__, version="douyin_downloader 0.0.1") 119 | save_dir = arguments["--dir"] if arguments["--dir"] else _SAVE_DIR # 不会取doc里`*default`的值 120 | concurrency = int(arguments["--concurrency"]) 121 | user = arguments[''] 122 | action = arguments[''] 123 | follow = arguments['follow'] # True if set, else False 124 | trio.run(main, user, action, follow, save_dir, concurrency) 125 | 126 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /douyin_tool.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Date : 2018-10-18 00:15:14 4 | # @Author : He Liang (heianghit@foxmail.com) 5 | # @Link : https://github.com/HeLiangHIT 6 | 7 | from util import * 8 | 9 | 10 | class DouyinTool(object): 11 | def __init__(self, version=APPINFO['version_code']): 12 | super(DouyinTool, self).__init__() 13 | self.sign_util = SignUtil(version) 14 | 15 | async def get_main_page(self, user_id, count=6): 16 | '''爬取主页视频内容内容 17 | >>> resp = trio.run(DouyinTool().get_main_page, "84834596404") 18 | >>> print(resp['status_code']) 19 | 0 20 | ''' 21 | url = "https://aweme.snssdk.com/aweme/v1/feed/" 22 | feed_param = { 23 | "ac": "WIFI", 24 | "count": str(count), 25 | "feed_style": "0", 26 | "filter_warn": "0", 27 | "filter_warn": "0", 28 | "max_cursor": "0", 29 | "min_cursor": "0", 30 | "pull_type": "1", 31 | "type": "0", 32 | "volume": "0.00" 33 | } 34 | resp = await self.sign_util.curl(url, feed_param) 35 | return resp.json() if resp is not None else {"status_code": -1} 36 | 37 | 38 | async def search_web(self, keyword, count=12, offset=0): 39 | '''搜索内容 40 | >>> resp = trio.run(DouyinTool().search_web, "美女") 41 | >>> print(resp['status_code']) 42 | 0 43 | ''' 44 | url = "https://api.amemv.com/aweme/v1/general/search/" 45 | search_param = { 46 | "ac": "WIFI", 47 | "count": str(count), 48 | "keyword": keyword, 49 | "offset": str(offset), 50 | } 51 | resp = await self.sign_util.curl(url, search_param) 52 | return resp.json() if resp is not None else {"status_code": -1} 53 | 54 | async def get_user_info(self, user_id): 55 | '''获取用户详细信息 56 | >>> resp = trio.run(DouyinTool().get_user_info, "84834596404") 57 | >>> print(resp['status_code']) 58 | 0 59 | ''' 60 | url = "https://aweme.snssdk.com/aweme/v1/user/" 61 | user_params = { 62 | "ac": "WIFI", 63 | "user_id": user_id, 64 | } 65 | resp = await self.sign_util.curl(url, user_params) 66 | return resp.json() if resp is not None else {"status_code": -1} 67 | 68 | async def get_comments(self, aweme_id, cursor=0): 69 | '''获取视频评论 70 | >>> comments, _, _ = trio.run(DouyinTool().get_comments, "6610186359145499912", 0) 71 | >>> print(len(comments) > 0) 72 | True 73 | ''' 74 | url = "https://aweme.snssdk.com/aweme/v1/comment/list/" 75 | comment_params = { 76 | "count": str(20), 77 | "cursor": str(cursor), 78 | "comment_style": '2', 79 | "aweme_id": aweme_id, 80 | "digged_cid": "", 81 | } 82 | resp = await self.sign_util.curl(url, comment_params) 83 | comments_res = resp.json() if resp is not None else {"status_code": -1} 84 | hasmore = comments_res.get("hasmore", False) 85 | cursor = comments_res.get("cursor", cursor) 86 | comments = comments_res.get("comments", []) 87 | # for comment in comments: 88 | # real_comment = comment.get("reply_comment")[0] if comment.get("reply_comment") else comment 89 | # upvote_count = real_comment.get("digg_count") 90 | # comment_item = { 91 | # "aweme_id" : aweme_id, 92 | # "text": real_comment.get("text", ''), 93 | # "upvote_count": upvote_count, 94 | # "nick_name": real_comment['user'].get("nickname"), 95 | # "user_id": real_comment['user'].get("uid"), 96 | # } 97 | return comments, hasmore, cursor 98 | 99 | async def like_video(self, aweme_id): 100 | '''喜欢一个视频: 为啥会失败呢?错误码8是什么意思? 101 | >>> resp = trio.run(DouyinTool().like_video, "6613913455902592259") 102 | >>> print(resp['status_code']) 103 | 8 104 | ''' 105 | url = "https://aweme.snssdk.com/aweme/v1/commit/item/digg/" 106 | like_params = { 107 | "pass-region": "1", 108 | "aweme_id": aweme_id, 109 | "type": 1, 110 | } 111 | resp = await self.sign_util.curl(url, like_params, data=like_params, method='POST', 112 | headers={**IPHONE_HEADER, "sdk-version": "1", "Accept-Encoding": 'br, gzip, deflate'}) 113 | return resp.json() if resp is not None else {"status_code": -1} 114 | 115 | async def _get_follow_list(self, user_id, offset=0): 116 | '''获取关注列表举例, 参考 'json_demo/follow_list.json' 117 | >>> follow_list, _, _ = trio.run(DouyinTool()._get_follow_list, "84834596404", 0) 118 | >>> print(len(follow_list)) 119 | 20 120 | ''' 121 | url = 'https://aweme.snssdk.com/aweme/v1/user/following/list/' 122 | follow_para = { 123 | "user_id": user_id, 124 | "offset": str(offset), 125 | "count": str(20), 126 | "source_type": "2", 127 | "max_time": str(int(time.time())), 128 | "ac": "WIFI", 129 | } 130 | resp = await self.sign_util.curl(url, follow_para) 131 | if not resp: 132 | return [], False, offset 133 | 134 | follow_info = resp.json() 135 | follow_list = follow_info.get('followings', []) 136 | # hasmore = follow_info.get('has_more', False) # always be true 137 | hasmore = follow_info.get('total', 0) > (offset + 20) 138 | 139 | return follow_list, hasmore, offset + 20 140 | 141 | async def get_follow_list(self, user_id, offset=0, repeat_func=None): 142 | '''爬取指定用户的所有关注的用户列表 async for video in get_follow_list(uid): ... 143 | 第二次post返回都是失败, post 缺少什么必要参数呢?''' 144 | total = 0 145 | while True: 146 | follow_list, hasmore, offset = await self._get_follow_list(user_id, offset) 147 | # print(len(follow_list), hasmore, offset) 148 | for follow in follow_list: 149 | uid = follow.get('uid', None) 150 | nickname = follow.get('nickname', '') 151 | signature = follow.get('signature', '') 152 | birthday = follow.get('birthday', '') 153 | # if uid == '92654947278' or nickname == '已重置': 154 | # # 测试发现这个号并没有什么卵用,而且并不是关注的用户 155 | # continue 156 | total += 1 157 | yield {'user_id':uid, 'nickname':nickname, 'signature':signature, 'birthday':birthday,} 158 | if not hasmore: 159 | logging.info(f"get follow list finished, there are total {total} people followed by user_id={user_id}!") 160 | # raise StopIteration # ref: https://www.jsonthon.org/dev/peps/pep-0479/ or https://stackoverflow.com/questions/51700960/runtimeerror-generator-raised-stopiteration-everytime-i-try-to-run-app 161 | return 162 | 163 | async def _get_video_list(self, url, user_id, max_cursor=0): 164 | '''获取视频列表 165 | # url = "https://aweme.snssdk.com/aweme/v1/aweme/favorite/" # 用户喜欢的视频 166 | # url = "https://aweme.snssdk.com/aweme/v1/aweme/post/" # 用户发布的视频 167 | # 抓取我喜欢的视频列表, 参考 'json_demo/video_list.json' 168 | >>> video_list, _, _ = trio.run(DouyinTool()._get_video_list, "https://aweme.snssdk.com/aweme/v1/aweme/favorite/", "84834596404", 0) 169 | >>> print(len(video_list)) 170 | 19 171 | 172 | # 抓取我发布的视频列表 173 | >>> video_list, _, _ = trio.run(DouyinTool()._get_video_list, "https://aweme.snssdk.com/aweme/v1/aweme/post/", "84834596404", 0) 174 | >>> print(len(video_list)) 175 | 0 176 | ''' 177 | video_params = { 178 | "count": "21", 179 | "user_id": user_id, 180 | "max_cursor": str(max_cursor), 181 | } 182 | resp = await self.sign_util.curl(url, video_params) 183 | if not resp: 184 | return [], True, max_cursor 185 | 186 | video_resp = resp.json() 187 | video_list = video_resp.get('aweme_list', []) 188 | hasmore = video_resp.get('has_more', False) 189 | max_cursor = video_resp.get('max_cursor', max_cursor) 190 | 191 | return video_list, hasmore, max_cursor 192 | 193 | async def get_favorite_list(self, user_id, max_cursor=0, repeat_func=None): 194 | '''爬取指定用户的所有喜欢视频列表,返回各个视频要下载需要的所有信息,请使用 async for video in get_favorite_list(uid): ...''' 195 | total = 0 196 | while True: 197 | video_list, hasmore, max_cursor = await self._get_video_list("https://aweme.snssdk.com/aweme/v1/aweme/favorite/", user_id, max_cursor) 198 | for video in video_list: 199 | video_item = await self.parse_video_info(video, repeat_func) 200 | total += 1 201 | yield video_item 202 | if not hasmore: 203 | logging.info(f"get favorite list finished, there are total {total} videos for user_id={user_id}!") 204 | return 205 | 206 | async def get_post_list(self, user_id, max_cursor=0, repeat_func=None): 207 | '''爬取指定用户的所有发布视频列表,返回各个视频要下载需要的所有信息,请使用 async for video in get_post_list(uid): ...''' 208 | total = 0 209 | while True: 210 | video_list, hasmore, max_cursor = await self._get_video_list("https://aweme.snssdk.com/aweme/v1/aweme/post/", user_id, max_cursor) 211 | for video in video_list: 212 | video_item = await self.parse_video_info(video, repeat_func) 213 | total += 1 214 | yield video_item 215 | if not hasmore: 216 | logging.info(f"get post list finished, there are total {total} videos for user_id={user_id}!") 217 | return 218 | 219 | 220 | async def _get_video_url(self, aweme_id): 221 | '''获取视频地址,可以直接使用 asks.get(video_url, verify=False, headers=IPHONE_HEADER, verify=False) 下载视频''' 222 | url = "https://aweme.snssdk.com/aweme/v1/aweme/detail/" 223 | video_para = post_data = {'aweme_id': aweme_id} 224 | resp = await self.sign_util.curl(url, video_para) 225 | try: 226 | video_info = resp.json() 227 | play_addr_raw = video_info['aweme_detail']['video']['play_addr']['url_list'] 228 | # 注意测试发现这个播放列表里前两个链接都是可以用的,下载的时候可以为了保险起见循环下载测试 229 | return play_addr_raw[0:2] 230 | except Exception as e: 231 | logging.error(f"parser video url fail from {url}!") 232 | return None 233 | 234 | async def _get_music_url(self, music_id): 235 | '''获取音频地址,可以直接使用 asks.get(music_url, verify=False, headers=IPHONE_HEADER, verify=False) 下载视频''' 236 | url = f"https://p3.pstatp.com/obj/{music_id}" 237 | return url 238 | 239 | async def parse_video_info(self, video, repeat_func=None): 240 | '''解析视频关键信息 241 | >>> dy = DouyinTool() 242 | >>> video_list, _, _ = trio.run(DouyinTool()._get_video_list, "https://aweme.snssdk.com/aweme/v1/aweme/favorite/", "84834596404", 0) 243 | >>> video = video_list[0] 244 | >>> video_item = trio.run(dy.parse_video_info, video) 245 | >>> print(video_item['video_url'][0].startswith("http")) 246 | True 247 | >>> print(video_item['video_url'][1].startswith("http")) 248 | True 249 | ''' 250 | author_name = video['author'].get("nickname") 251 | author_uid = video['author'].get('uid') 252 | video_desc = video.get('desc') 253 | # music_id = video['music']['play_url'].get('uri') 254 | aweme_id = video.get("aweme_id") 255 | 256 | file_name = "_".join([author_name, trim(video_desc, 20, '')]) 257 | name = f"{file_name}.mp4" 258 | if repeat_func and repeat_func(name): 259 | video_url = music_url = None # 用于下载器的去重复处理回调函数,当文件已经存在时不用再获取视频地址了,无需下载 260 | else: 261 | video_url = await self._get_video_url(aweme_id) 262 | # music_url = await self._get_music_url(music_id) 263 | 264 | download_item = { 265 | "author_name": author_name, 266 | "video_desc": video_desc, 267 | "author_uid": author_uid, 268 | # "music_id": music_id, 269 | "aweme_id" : aweme_id, 270 | "video_url" : video_url, 271 | # "music_url" : music_url, 272 | "name" : name, 273 | } 274 | 275 | return download_item 276 | 277 | 278 | async def _get_follow_list_test(): 279 | '''测试 get_follow_list_test 是否正确 280 | >>> print(trio.run(_get_follow_list_test)) 281 | 5 282 | ''' 283 | total = 0 284 | async for people in DouyinTool().get_follow_list("84834596404", 0): 285 | logging.info(f"begin to parser {total}-th {people['nickname']} ... ") 286 | total += 1 287 | if total >= 5: 288 | logging.info("assume we get finished!") 289 | return total 290 | return total 291 | 292 | 293 | async def _get_favorite_list_test(): 294 | '''测试 get_favorite_list_test 是否正确,这里只抓几个做测试 295 | >>> print(trio.run(_get_favorite_list_test)) 296 | 5 297 | ''' 298 | total = 0 299 | async for video in DouyinTool().get_favorite_list("84834596404"): 300 | video_name = "_".join([video["author_name"], video["author_uid"], trim(video["video_desc"], 20, '')]) 301 | logging.info(f"begin download {total}-th {video_name} to ./ ... ") 302 | total += 1 303 | if total >= 5: 304 | logging.info("assume we get finished!") 305 | return total 306 | return total 307 | 308 | 309 | async def _get_post_list_test(): 310 | '''测试 get_post_list_test 是否正确,这里只抓几个做测试 311 | >>> print(trio.run(_get_post_list_test)) 312 | 0 313 | ''' 314 | total = 0 315 | async for video in DouyinTool().get_post_list("84834596404"): 316 | video_name = "_".join([video["author_name"], video["author_uid"], trim(video["video_desc"], 20)]) 317 | logging.info(f"begin download {total}-th {video_name} to ./ ... ") 318 | total += 1 319 | if total >= 5: 320 | logging.info("assume we get finished!") 321 | return total 322 | return total 323 | 324 | 325 | if __name__ == '__main__': 326 | # import doctest 327 | # doctest.testmod(verbose=False) # verbose=True shows the output 328 | # logging.info("doctest finished.") 329 | print(trio.run(_get_follow_list_test)) -------------------------------------------------------------------------------- /img/URgood.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HeLiangHIT/douyin_downloader/82e09df2a59b59efca50e4dd4af71020336a3c53/img/URgood.jpg -------------------------------------------------------------------------------- /img/deleted.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HeLiangHIT/douyin_downloader/82e09df2a59b59efca50e4dd4af71020336a3c53/img/deleted.jpg -------------------------------------------------------------------------------- /img/downloading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HeLiangHIT/douyin_downloader/82e09df2a59b59efca50e4dd4af71020336a3c53/img/downloading.png -------------------------------------------------------------------------------- /img/girl.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HeLiangHIT/douyin_downloader/82e09df2a59b59efca50e4dd4af71020336a3c53/img/girl.ico -------------------------------------------------------------------------------- /img/owner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HeLiangHIT/douyin_downloader/82e09df2a59b59efca50e4dd4af71020336a3c53/img/owner.jpg -------------------------------------------------------------------------------- /img/result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HeLiangHIT/douyin_downloader/82e09df2a59b59efca50e4dd4af71020336a3c53/img/result.png -------------------------------------------------------------------------------- /img/timeout.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HeLiangHIT/douyin_downloader/82e09df2a59b59efca50e4dd4af71020336a3c53/img/timeout.jpg -------------------------------------------------------------------------------- /json_demo/follow_list.json: -------------------------------------------------------------------------------- 1 | { 2 | "log_pb": 3 | { 4 | "impr_id": "201810192216030100160210302250DF" 5 | }, 6 | "extra": 7 | { 8 | "logid": "201810192216030100160210302250DF", 9 | "now": 1539958563318, 10 | "fatal_item_ids": [] 11 | }, 12 | "has_more": true, 13 | "status_code": 0, 14 | "followings": [ 15 | { 16 | "youtube_channel_title": "", 17 | "share_qrcode_uri": "be100018ca72f4e84146", 18 | "original_music_qrcode": null, 19 | "is_gov_media_vip": false, 20 | "live_commerce": false, 21 | "account_region": "", 22 | "user_period": 0, 23 | "reflow_page_gid": 0, 24 | "is_binded_weibo": false, 25 | "video_icon_virtual_URI": "", 26 | "follower_status": 0, 27 | "school_name": "", 28 | "download_setting": -1, 29 | "custom_verify": "", 30 | "special_lock": 1, 31 | "user_canceled": false, 32 | "shield_comment_notice": 0, 33 | "hide_location": false, 34 | "gender": 2, 35 | "video_icon": 36 | { 37 | "url_list": [], 38 | "uri": "" 39 | }, 40 | "school_poi_id": "", 41 | "live_agreement": 0, 42 | "is_phone_binded": false, 43 | "prevent_download": false, 44 | "weibo_schema": "", 45 | "create_time": 1537434307, 46 | "has_insights": false, 47 | "react_setting": 0, 48 | "google_account": "", 49 | "constellation": 8, 50 | "user_mode": 0, 51 | "need_recommend": 1, 52 | "room_id": 0, 53 | "avatar_medium": 54 | { 55 | "url_list": ["https://p1.pstatp.com/aweme/720x720/be0e00230d83b8606136.jpeg", "https://pb3.pstatp.com/aweme/720x720/be0e00230d83b8606136.jpeg", "https://pb3.pstatp.com/aweme/720x720/be0e00230d83b8606136.jpeg"], 56 | "uri": "be0e00230d83b8606136" 57 | }, 58 | "has_orders": false, 59 | "reflow_page_uid": 0, 60 | "cover_url": [ 61 | { 62 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 63 | "uri": "c8510002be9a3a61aad2" 64 | } 65 | ], 66 | "duet_setting": 0, 67 | "language": "zh-Hans", 68 | "geofencing": [], 69 | "ins_id": "", 70 | "unique_id_modify_time": 1539958563, 71 | "school_type": 0, 72 | "twitter_name": "", 73 | "avatar_uri": "be0e00230d83b8606136", 74 | "signature": "\u4e00\u5929\u4e00\u5999\u62db\uff0c\u751f\u6d3b\u4e0d\u7cdf\u7cd5", 75 | "weibo_verify": "", 76 | "comment_setting": 0, 77 | "with_fusion_shop_entry": false, 78 | "youtube_channel_id": "", 79 | "avatar_larger": 80 | { 81 | "url_list": ["https://p1.pstatp.com/aweme/1080x1080/be0e00230d83b8606136.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/be0e00230d83b8606136.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/be0e00230d83b8606136.jpeg"], 82 | "uri": "be0e00230d83b8606136" 83 | }, 84 | "enterprise_verify_reason": "", 85 | "story_open": false, 86 | "user_rate": 1, 87 | "live_verify": 0, 88 | "short_id": "1502737973", 89 | "secret": 0, 90 | "avatar_thumb": 91 | { 92 | "url_list": ["https://p1.pstatp.com/aweme/100x100/be0e00230d83b8606136.jpeg", "https://pb3.pstatp.com/aweme/100x100/be0e00230d83b8606136.jpeg", "https://pb3.pstatp.com/aweme/100x100/be0e00230d83b8606136.jpeg"], 93 | "uri": "be0e00230d83b8606136" 94 | }, 95 | "is_verified": true, 96 | "hide_search": false, 97 | "with_commerce_entry": false, 98 | "download_prompt_ts": 0, 99 | "twitter_id": "", 100 | "has_email": false, 101 | "policy_version": {}, 102 | "region": "CN", 103 | "uid": "104607264852", 104 | "bind_phone": "", 105 | "weibo_url": "", 106 | "live_agreement_time": 0, 107 | "weibo_name": "", 108 | "commerce_user_level": 0, 109 | "verify_info": "", 110 | "apple_account": 0, 111 | "accept_private_policy": false, 112 | "shield_digg_notice": 0, 113 | "verification_type": 1, 114 | "neiguang_shield": 0, 115 | "authority_status": 0, 116 | "birthday": "1993-11-14", 117 | "is_ad_fake": false, 118 | "nickname": "\u7cbe\u81f4\u751f\u6d3b\u5c0f\u5999\u62db", 119 | "shield_follow_notice": 0, 120 | "original_music_cover": null, 121 | "follow_status": 0, 122 | "status": 1, 123 | "unique_id": "" 124 | }, 125 | { 126 | "youtube_channel_title": "", 127 | "share_qrcode_uri": "adf10013f38c27214555", 128 | "original_music_qrcode": null, 129 | "is_gov_media_vip": false, 130 | "live_commerce": false, 131 | "account_region": "", 132 | "user_period": 0, 133 | "reflow_page_gid": 0, 134 | "is_binded_weibo": false, 135 | "video_icon_virtual_URI": "", 136 | "follower_status": 0, 137 | "school_name": "", 138 | "download_setting": -1, 139 | "custom_verify": "", 140 | "special_lock": 1, 141 | "user_canceled": false, 142 | "shield_comment_notice": 0, 143 | "hide_location": false, 144 | "gender": 1, 145 | "video_icon": 146 | { 147 | "url_list": [], 148 | "uri": "" 149 | }, 150 | "school_poi_id": "", 151 | "live_agreement": 0, 152 | "is_phone_binded": false, 153 | "prevent_download": false, 154 | "weibo_schema": "", 155 | "create_time": 1535333828, 156 | "has_insights": false, 157 | "react_setting": 0, 158 | "google_account": "", 159 | "constellation": 9, 160 | "user_mode": 0, 161 | "need_recommend": 1, 162 | "room_id": 0, 163 | "avatar_medium": 164 | { 165 | "url_list": ["https://p3.pstatp.com/aweme/720x720/c7ae001898d3b5edf307.jpeg", "https://pb9.pstatp.com/aweme/720x720/c7ae001898d3b5edf307.jpeg", "https://pb3.pstatp.com/aweme/720x720/c7ae001898d3b5edf307.jpeg"], 166 | "uri": "c7ae001898d3b5edf307" 167 | }, 168 | "has_orders": false, 169 | "reflow_page_uid": 0, 170 | "cover_url": [ 171 | { 172 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 173 | "uri": "c8510002be9a3a61aad2" 174 | } 175 | ], 176 | "duet_setting": 0, 177 | "language": "zh-Hans", 178 | "geofencing": [], 179 | "ins_id": "", 180 | "unique_id_modify_time": 1539958563, 181 | "school_type": 0, 182 | "twitter_name": "", 183 | "avatar_uri": "c7ae001898d3b5edf307", 184 | "signature": "\u60f3\u8981\u4e86\u89e3\u66f4\u591a\u9ad8\u79d1\u6280\u4ea7\u54c1\uff0c\n\u5fae\u4fe1\u516c\u4f17hao\u641c\u7d22 : \u4eca\u65e5\u7ea6\u60e0", 185 | "weibo_verify": "", 186 | "comment_setting": 0, 187 | "with_fusion_shop_entry": false, 188 | "youtube_channel_id": "", 189 | "avatar_larger": 190 | { 191 | "url_list": ["https://p3.pstatp.com/aweme/1080x1080/c7ae001898d3b5edf307.jpeg", "https://pb9.pstatp.com/aweme/1080x1080/c7ae001898d3b5edf307.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/c7ae001898d3b5edf307.jpeg"], 192 | "uri": "c7ae001898d3b5edf307" 193 | }, 194 | "enterprise_verify_reason": "", 195 | "story_open": false, 196 | "user_rate": 1, 197 | "live_verify": 0, 198 | "short_id": "1359426176", 199 | "secret": 0, 200 | "avatar_thumb": 201 | { 202 | "url_list": ["https://p3.pstatp.com/aweme/100x100/c7ae001898d3b5edf307.jpeg", "https://pb9.pstatp.com/aweme/100x100/c7ae001898d3b5edf307.jpeg", "https://pb3.pstatp.com/aweme/100x100/c7ae001898d3b5edf307.jpeg"], 203 | "uri": "c7ae001898d3b5edf307" 204 | }, 205 | "is_verified": true, 206 | "hide_search": false, 207 | "with_commerce_entry": false, 208 | "download_prompt_ts": 0, 209 | "twitter_id": "", 210 | "has_email": false, 211 | "policy_version": {}, 212 | "region": "CN", 213 | "uid": "103302600647", 214 | "bind_phone": "", 215 | "weibo_url": "", 216 | "live_agreement_time": 0, 217 | "weibo_name": "", 218 | "commerce_user_level": 0, 219 | "verify_info": "", 220 | "apple_account": 0, 221 | "accept_private_policy": false, 222 | "shield_digg_notice": 0, 223 | "verification_type": 1, 224 | "neiguang_shield": 0, 225 | "authority_status": 0, 226 | "birthday": "1994-12-09", 227 | "is_ad_fake": false, 228 | "nickname": "\u79d1\u6280\u751f\u6d3b", 229 | "shield_follow_notice": 0, 230 | "original_music_cover": null, 231 | "follow_status": 0, 232 | "status": 1, 233 | "unique_id": "" 234 | }, 235 | { 236 | "youtube_channel_title": "", 237 | "share_qrcode_uri": "5fe300120d511316e935", 238 | "original_music_qrcode": null, 239 | "is_gov_media_vip": false, 240 | "live_commerce": false, 241 | "account_region": "", 242 | "user_period": 0, 243 | "reflow_page_gid": 0, 244 | "is_binded_weibo": false, 245 | "video_icon_virtual_URI": "", 246 | "follower_status": 0, 247 | "school_name": "", 248 | "download_setting": -1, 249 | "custom_verify": "", 250 | "special_lock": 0, 251 | "user_canceled": false, 252 | "shield_comment_notice": 0, 253 | "hide_location": false, 254 | "gender": 1, 255 | "video_icon": 256 | { 257 | "url_list": [], 258 | "uri": "" 259 | }, 260 | "school_poi_id": "", 261 | "live_agreement": 1, 262 | "is_phone_binded": false, 263 | "prevent_download": false, 264 | "weibo_schema": "", 265 | "create_time": 1518225295, 266 | "has_insights": false, 267 | "react_setting": 0, 268 | "google_account": "", 269 | "constellation": 0, 270 | "user_mode": 0, 271 | "need_recommend": 1, 272 | "room_id": 0, 273 | "avatar_medium": 274 | { 275 | "url_list": ["https://p9.pstatp.com/thumb/434e0003beb16afd5c29"], 276 | "uri": "" 277 | }, 278 | "has_orders": false, 279 | "reflow_page_uid": 0, 280 | "cover_url": [ 281 | { 282 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 283 | "uri": "c8510002be9a3a61aad2" 284 | } 285 | ], 286 | "duet_setting": 0, 287 | "language": "zh-Hans", 288 | "geofencing": [], 289 | "ins_id": "", 290 | "unique_id_modify_time": 1539958563, 291 | "school_type": 0, 292 | "twitter_name": "", 293 | "avatar_uri": "", 294 | "signature": "\u521b\u610f\u601d\u7ef4\u4ece\u4f1a\u73a9\u5f00\u59cb\u3002", 295 | "weibo_verify": "", 296 | "comment_setting": 0, 297 | "with_fusion_shop_entry": false, 298 | "youtube_channel_id": "", 299 | "avatar_larger": 300 | { 301 | "url_list": ["https://p9.pstatp.com/thumb/434e0003beb16afd5c29"], 302 | "uri": "" 303 | }, 304 | "enterprise_verify_reason": "\u5317\u4eac\u770b\u89c1\u672a\u6765\u6559\u80b2\u54a8\u8be2\u6709\u9650\u516c\u53f8", 305 | "story_open": false, 306 | "user_rate": 1, 307 | "live_verify": 2, 308 | "short_id": "339120659", 309 | "secret": 0, 310 | "avatar_thumb": 311 | { 312 | "url_list": ["https://p9.pstatp.com/thumb/434e0003beb16afd5c29"], 313 | "uri": "" 314 | }, 315 | "is_verified": true, 316 | "hide_search": false, 317 | "with_commerce_entry": false, 318 | "download_prompt_ts": 0, 319 | "twitter_id": "", 320 | "has_email": false, 321 | "policy_version": {}, 322 | "region": "CN", 323 | "uid": "92339263649", 324 | "bind_phone": "", 325 | "weibo_url": "", 326 | "live_agreement_time": 1539858626, 327 | "weibo_name": "", 328 | "commerce_user_level": 1, 329 | "verify_info": "", 330 | "apple_account": 0, 331 | "accept_private_policy": false, 332 | "shield_digg_notice": 0, 333 | "verification_type": 1, 334 | "neiguang_shield": 0, 335 | "authority_status": 0, 336 | "birthday": "", 337 | "is_ad_fake": false, 338 | "nickname": "\u73a9\u75af\u4e86", 339 | "shield_follow_notice": 0, 340 | "original_music_cover": null, 341 | "follow_status": 0, 342 | "status": 1, 343 | "unique_id": "" 344 | }, 345 | { 346 | "youtube_channel_title": "", 347 | "share_qrcode_uri": "b6b80006a753c46a4054", 348 | "original_music_qrcode": null, 349 | "is_gov_media_vip": false, 350 | "live_commerce": false, 351 | "account_region": "", 352 | "user_period": 0, 353 | "reflow_page_gid": 0, 354 | "is_binded_weibo": false, 355 | "video_icon_virtual_URI": "", 356 | "follower_status": 0, 357 | "school_name": "", 358 | "download_setting": -1, 359 | "custom_verify": "", 360 | "special_lock": 1, 361 | "user_canceled": false, 362 | "shield_comment_notice": 0, 363 | "hide_location": false, 364 | "gender": 1, 365 | "video_icon": 366 | { 367 | "url_list": [], 368 | "uri": "" 369 | }, 370 | "school_poi_id": "", 371 | "live_agreement": 0, 372 | "is_phone_binded": false, 373 | "prevent_download": false, 374 | "weibo_schema": "", 375 | "create_time": 1535468440, 376 | "has_insights": false, 377 | "react_setting": 0, 378 | "google_account": "", 379 | "constellation": 2, 380 | "user_mode": 0, 381 | "need_recommend": 1, 382 | "room_id": 0, 383 | "avatar_medium": 384 | { 385 | "url_list": ["https://p3.pstatp.com/aweme/720x720/b713001cff6c29640256.jpeg", "https://pb9.pstatp.com/aweme/720x720/b713001cff6c29640256.jpeg", "https://pb3.pstatp.com/aweme/720x720/b713001cff6c29640256.jpeg"], 386 | "uri": "b713001cff6c29640256" 387 | }, 388 | "has_orders": false, 389 | "reflow_page_uid": 0, 390 | "cover_url": [ 391 | { 392 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 393 | "uri": "c8510002be9a3a61aad2" 394 | } 395 | ], 396 | "duet_setting": 0, 397 | "language": "zh-Hans", 398 | "geofencing": [], 399 | "ins_id": "", 400 | "unique_id_modify_time": 1539958563, 401 | "school_type": 0, 402 | "twitter_name": "", 403 | "avatar_uri": "b713001cff6c29640256", 404 | "signature": "\u4f1f\u5927\u90fd\u662f\u4ece\u6e3a\u5c0f\u5f00\u59cb", 405 | "weibo_verify": "", 406 | "comment_setting": 0, 407 | "with_fusion_shop_entry": false, 408 | "youtube_channel_id": "", 409 | "avatar_larger": 410 | { 411 | "url_list": ["https://p3.pstatp.com/aweme/1080x1080/b713001cff6c29640256.jpeg", "https://pb9.pstatp.com/aweme/1080x1080/b713001cff6c29640256.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/b713001cff6c29640256.jpeg"], 412 | "uri": "b713001cff6c29640256" 413 | }, 414 | "enterprise_verify_reason": "", 415 | "story_open": false, 416 | "user_rate": 1, 417 | "live_verify": 2, 418 | "short_id": "1366983662", 419 | "secret": 0, 420 | "avatar_thumb": 421 | { 422 | "url_list": ["https://p3.pstatp.com/aweme/100x100/b713001cff6c29640256.jpeg", "https://pb9.pstatp.com/aweme/100x100/b713001cff6c29640256.jpeg", "https://pb3.pstatp.com/aweme/100x100/b713001cff6c29640256.jpeg"], 423 | "uri": "b713001cff6c29640256" 424 | }, 425 | "is_verified": true, 426 | "hide_search": false, 427 | "with_commerce_entry": false, 428 | "download_prompt_ts": 0, 429 | "twitter_id": "", 430 | "has_email": false, 431 | "policy_version": {}, 432 | "region": "CN", 433 | "uid": "103739596496", 434 | "bind_phone": "", 435 | "weibo_url": "", 436 | "live_agreement_time": 0, 437 | "weibo_name": "", 438 | "commerce_user_level": 0, 439 | "verify_info": "", 440 | "apple_account": 0, 441 | "accept_private_policy": false, 442 | "shield_digg_notice": 0, 443 | "verification_type": 1, 444 | "neiguang_shield": 0, 445 | "authority_status": 0, 446 | "birthday": "1981-05-16", 447 | "is_ad_fake": false, 448 | "nickname": "\u4fde\u51cc\u96c4\u5de5\u4f5c\u5ba4", 449 | "shield_follow_notice": 0, 450 | "original_music_cover": null, 451 | "follow_status": 0, 452 | "status": 1, 453 | "unique_id": "" 454 | }, 455 | { 456 | "youtube_channel_title": "", 457 | "share_qrcode_uri": "98850021251bfb3aebed", 458 | "original_music_qrcode": null, 459 | "is_gov_media_vip": false, 460 | "live_commerce": false, 461 | "account_region": "", 462 | "user_period": 0, 463 | "reflow_page_gid": 0, 464 | "is_binded_weibo": false, 465 | "video_icon_virtual_URI": "", 466 | "follower_status": 0, 467 | "school_name": "", 468 | "download_setting": -1, 469 | "custom_verify": "", 470 | "special_lock": 1, 471 | "user_canceled": false, 472 | "shield_comment_notice": 0, 473 | "hide_location": false, 474 | "gender": 1, 475 | "video_icon": 476 | { 477 | "url_list": [], 478 | "uri": "" 479 | }, 480 | "school_poi_id": "", 481 | "live_agreement": 0, 482 | "is_phone_binded": false, 483 | "prevent_download": false, 484 | "weibo_schema": "", 485 | "create_time": 1531381808, 486 | "has_insights": false, 487 | "react_setting": 0, 488 | "google_account": "", 489 | "constellation": 7, 490 | "user_mode": 0, 491 | "need_recommend": 1, 492 | "room_id": 0, 493 | "avatar_medium": 494 | { 495 | "url_list": ["https://p1.pstatp.com/aweme/720x720/988700083a06754fd550.jpeg", "https://pb3.pstatp.com/aweme/720x720/988700083a06754fd550.jpeg", "https://pb3.pstatp.com/aweme/720x720/988700083a06754fd550.jpeg"], 496 | "uri": "988700083a06754fd550" 497 | }, 498 | "has_orders": false, 499 | "reflow_page_uid": 0, 500 | "cover_url": [ 501 | { 502 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 503 | "uri": "c8510002be9a3a61aad2" 504 | } 505 | ], 506 | "duet_setting": 0, 507 | "language": "zh-Hans", 508 | "geofencing": [], 509 | "ins_id": "", 510 | "unique_id_modify_time": 1539958563, 511 | "school_type": 0, 512 | "twitter_name": "", 513 | "avatar_uri": "988700083a06754fd550", 514 | "signature": "\u7ed9\u6211\u4e09\u5206\u949f\uff0c\u8ba9\u4e16\u754c\u542c\u89c1\u4f60\u7684\u58f0\u97f3\uff01\n\u66f4\u591a\u7cbe\u5f69\u5185\u5bb9\uff0c10.27-29\u53a6\u95e8\u7ebf\u4e0b\u8bfe\uff01", 515 | "weibo_verify": "", 516 | "comment_setting": 0, 517 | "with_fusion_shop_entry": false, 518 | "youtube_channel_id": "", 519 | "avatar_larger": 520 | { 521 | "url_list": ["https://p1.pstatp.com/aweme/1080x1080/988700083a06754fd550.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/988700083a06754fd550.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/988700083a06754fd550.jpeg"], 522 | "uri": "988700083a06754fd550" 523 | }, 524 | "enterprise_verify_reason": "\u4f59\u6b4c\u6f14\u8bf4\u5b98\u65b9\u5e10\u53f7", 525 | "story_open": false, 526 | "user_rate": 1, 527 | "live_verify": 0, 528 | "short_id": "1144508894", 529 | "secret": 0, 530 | "avatar_thumb": 531 | { 532 | "url_list": ["https://p1.pstatp.com/aweme/100x100/988700083a06754fd550.jpeg", "https://pb3.pstatp.com/aweme/100x100/988700083a06754fd550.jpeg", "https://pb3.pstatp.com/aweme/100x100/988700083a06754fd550.jpeg"], 533 | "uri": "988700083a06754fd550" 534 | }, 535 | "is_verified": true, 536 | "hide_search": false, 537 | "with_commerce_entry": false, 538 | "download_prompt_ts": 0, 539 | "twitter_id": "", 540 | "has_email": false, 541 | "policy_version": {}, 542 | "region": "CN", 543 | "uid": "101449480396", 544 | "bind_phone": "", 545 | "weibo_url": "", 546 | "live_agreement_time": 0, 547 | "weibo_name": "", 548 | "commerce_user_level": 1, 549 | "verify_info": "", 550 | "apple_account": 0, 551 | "accept_private_policy": false, 552 | "shield_digg_notice": 0, 553 | "verification_type": 1, 554 | "neiguang_shield": 0, 555 | "authority_status": 0, 556 | "birthday": "1971-09-26", 557 | "is_ad_fake": false, 558 | "nickname": "\u4f59\u6b4c\u6559\u6f14\u8bb2", 559 | "shield_follow_notice": 0, 560 | "original_music_cover": null, 561 | "follow_status": 0, 562 | "status": 1, 563 | "unique_id": "yuge0926" 564 | }, 565 | { 566 | "youtube_channel_title": "", 567 | "share_qrcode_uri": "adbf00183f70ca6a3ca7", 568 | "original_music_qrcode": null, 569 | "is_gov_media_vip": false, 570 | "live_commerce": false, 571 | "account_region": "", 572 | "user_period": 0, 573 | "reflow_page_gid": 0, 574 | "is_binded_weibo": false, 575 | "video_icon_virtual_URI": "", 576 | "follower_status": 0, 577 | "school_name": "", 578 | "download_setting": -1, 579 | "custom_verify": "", 580 | "special_lock": 1, 581 | "user_canceled": false, 582 | "shield_comment_notice": 0, 583 | "hide_location": false, 584 | "gender": 1, 585 | "video_icon": 586 | { 587 | "url_list": [], 588 | "uri": "" 589 | }, 590 | "school_poi_id": "", 591 | "live_agreement": 0, 592 | "is_phone_binded": false, 593 | "prevent_download": false, 594 | "weibo_schema": "", 595 | "create_time": 1534864291, 596 | "has_insights": false, 597 | "react_setting": 0, 598 | "google_account": "", 599 | "constellation": 0, 600 | "user_mode": 0, 601 | "need_recommend": 1, 602 | "room_id": 0, 603 | "avatar_medium": 604 | { 605 | "url_list": ["https://p3.pstatp.com/aweme/720x720/adc10012a7e123309142.jpeg", "https://pb9.pstatp.com/aweme/720x720/adc10012a7e123309142.jpeg", "https://pb3.pstatp.com/aweme/720x720/adc10012a7e123309142.jpeg"], 606 | "uri": "adc10012a7e123309142" 607 | }, 608 | "has_orders": false, 609 | "reflow_page_uid": 0, 610 | "cover_url": [ 611 | { 612 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 613 | "uri": "c8510002be9a3a61aad2" 614 | } 615 | ], 616 | "duet_setting": 0, 617 | "language": "zh-Hans", 618 | "geofencing": [], 619 | "ins_id": "", 620 | "unique_id_modify_time": 1539958563, 621 | "school_type": 0, 622 | "twitter_name": "", 623 | "avatar_uri": "adc10012a7e123309142", 624 | "signature": "\u7a77\u5219\u53d8\uff0c\u53d8\u5219\u901a\uff0c\u901a\u5219\u6709\u673a\uff01", 625 | "weibo_verify": "", 626 | "comment_setting": 0, 627 | "with_fusion_shop_entry": true, 628 | "youtube_channel_id": "", 629 | "avatar_larger": 630 | { 631 | "url_list": ["https://p3.pstatp.com/aweme/1080x1080/adc10012a7e123309142.jpeg", "https://pb9.pstatp.com/aweme/1080x1080/adc10012a7e123309142.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/adc10012a7e123309142.jpeg"], 632 | "uri": "adc10012a7e123309142" 633 | }, 634 | "enterprise_verify_reason": "", 635 | "story_open": false, 636 | "user_rate": 1, 637 | "live_verify": 2, 638 | "short_id": "1317493733", 639 | "secret": 0, 640 | "avatar_thumb": 641 | { 642 | "url_list": ["https://p3.pstatp.com/aweme/100x100/adc10012a7e123309142.jpeg", "https://pb9.pstatp.com/aweme/100x100/adc10012a7e123309142.jpeg", "https://pb3.pstatp.com/aweme/100x100/adc10012a7e123309142.jpeg"], 643 | "uri": "adc10012a7e123309142" 644 | }, 645 | "is_verified": true, 646 | "hide_search": false, 647 | "with_commerce_entry": false, 648 | "download_prompt_ts": 0, 649 | "twitter_id": "", 650 | "has_email": false, 651 | "policy_version": {}, 652 | "region": "CN", 653 | "uid": "103404759295", 654 | "bind_phone": "", 655 | "weibo_url": "", 656 | "live_agreement_time": 0, 657 | "weibo_name": "", 658 | "commerce_user_level": 0, 659 | "verify_info": "", 660 | "apple_account": 0, 661 | "accept_private_policy": false, 662 | "shield_digg_notice": 0, 663 | "verification_type": 1, 664 | "neiguang_shield": 0, 665 | "authority_status": 0, 666 | "birthday": "", 667 | "is_ad_fake": false, 668 | "nickname": "\u5546\u4e1a\u601d\u7ef4", 669 | "shield_follow_notice": 0, 670 | "original_music_cover": null, 671 | "follow_status": 0, 672 | "status": 1, 673 | "unique_id": "SYSW888888" 674 | }, 675 | { 676 | "youtube_channel_title": "", 677 | "share_qrcode_uri": "85f0002443442181571d", 678 | "original_music_qrcode": null, 679 | "is_gov_media_vip": false, 680 | "live_commerce": false, 681 | "account_region": "", 682 | "user_period": 0, 683 | "reflow_page_gid": 0, 684 | "is_binded_weibo": false, 685 | "video_icon_virtual_URI": "", 686 | "follower_status": 0, 687 | "school_name": "", 688 | "download_setting": -1, 689 | "custom_verify": "", 690 | "special_lock": 1, 691 | "user_canceled": false, 692 | "shield_comment_notice": 0, 693 | "hide_location": false, 694 | "gender": 1, 695 | "video_icon": 696 | { 697 | "url_list": [], 698 | "uri": "" 699 | }, 700 | "school_poi_id": "", 701 | "live_agreement": 0, 702 | "is_phone_binded": false, 703 | "prevent_download": false, 704 | "weibo_schema": "", 705 | "create_time": 1526982845, 706 | "has_insights": false, 707 | "react_setting": 0, 708 | "google_account": "", 709 | "constellation": 8, 710 | "user_mode": 0, 711 | "need_recommend": 1, 712 | "room_id": 0, 713 | "avatar_medium": 714 | { 715 | "url_list": ["https://p1.pstatp.com/aweme/720x720/b6cc0022a9968ab8c26f.jpeg", "https://pb3.pstatp.com/aweme/720x720/b6cc0022a9968ab8c26f.jpeg", "https://pb3.pstatp.com/aweme/720x720/b6cc0022a9968ab8c26f.jpeg"], 716 | "uri": "b6cc0022a9968ab8c26f" 717 | }, 718 | "has_orders": false, 719 | "reflow_page_uid": 0, 720 | "cover_url": [ 721 | { 722 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 723 | "uri": "c8510002be9a3a61aad2" 724 | } 725 | ], 726 | "duet_setting": 0, 727 | "language": "zh-Hans", 728 | "geofencing": [], 729 | "ins_id": "", 730 | "unique_id_modify_time": 1539958563, 731 | "school_type": 0, 732 | "twitter_name": "", 733 | "avatar_uri": "b6cc0022a9968ab8c26f", 734 | "signature": "", 735 | "weibo_verify": "", 736 | "comment_setting": 0, 737 | "with_fusion_shop_entry": false, 738 | "youtube_channel_id": "", 739 | "avatar_larger": 740 | { 741 | "url_list": ["https://p1.pstatp.com/aweme/1080x1080/b6cc0022a9968ab8c26f.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/b6cc0022a9968ab8c26f.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/b6cc0022a9968ab8c26f.jpeg"], 742 | "uri": "b6cc0022a9968ab8c26f" 743 | }, 744 | "enterprise_verify_reason": "", 745 | "story_open": false, 746 | "user_rate": 1, 747 | "live_verify": 0, 748 | "short_id": "970599066", 749 | "secret": 0, 750 | "avatar_thumb": 751 | { 752 | "url_list": ["https://p1.pstatp.com/aweme/100x100/b6cc0022a9968ab8c26f.jpeg", "https://pb3.pstatp.com/aweme/100x100/b6cc0022a9968ab8c26f.jpeg", "https://pb3.pstatp.com/aweme/100x100/b6cc0022a9968ab8c26f.jpeg"], 753 | "uri": "b6cc0022a9968ab8c26f" 754 | }, 755 | "is_verified": true, 756 | "hide_search": false, 757 | "with_commerce_entry": false, 758 | "download_prompt_ts": 0, 759 | "twitter_id": "", 760 | "has_email": false, 761 | "policy_version": {}, 762 | "region": "CN", 763 | "uid": "98955165681", 764 | "bind_phone": "", 765 | "weibo_url": "", 766 | "live_agreement_time": 0, 767 | "weibo_name": "", 768 | "commerce_user_level": 0, 769 | "verify_info": "", 770 | "apple_account": 0, 771 | "accept_private_policy": false, 772 | "shield_digg_notice": 0, 773 | "verification_type": 1, 774 | "neiguang_shield": 0, 775 | "authority_status": 0, 776 | "birthday": "1987-11-20", 777 | "is_ad_fake": false, 778 | "nickname": "\u5634\u53d4\u8bb2\u8425\u9500", 779 | "shield_follow_notice": 0, 780 | "original_music_cover": null, 781 | "follow_status": 0, 782 | "status": 1, 783 | "unique_id": "V342469205" 784 | }, 785 | { 786 | "youtube_channel_title": "", 787 | "share_qrcode_uri": "72940018558ea2725c87", 788 | "original_music_qrcode": null, 789 | "is_gov_media_vip": false, 790 | "live_commerce": false, 791 | "account_region": "", 792 | "user_period": 0, 793 | "reflow_page_gid": 0, 794 | "is_binded_weibo": false, 795 | "video_icon_virtual_URI": "", 796 | "follower_status": 0, 797 | "school_name": "", 798 | "download_setting": -1, 799 | "custom_verify": "", 800 | "special_lock": 1, 801 | "user_canceled": false, 802 | "shield_comment_notice": 0, 803 | "hide_location": true, 804 | "gender": 1, 805 | "video_icon": 806 | { 807 | "url_list": [], 808 | "uri": "" 809 | }, 810 | "school_poi_id": "", 811 | "live_agreement": 1, 812 | "is_phone_binded": false, 813 | "prevent_download": false, 814 | "weibo_schema": "", 815 | "create_time": 1521883069, 816 | "has_insights": false, 817 | "react_setting": 0, 818 | "google_account": "", 819 | "constellation": 10, 820 | "user_mode": 0, 821 | "need_recommend": 1, 822 | "room_id": 0, 823 | "avatar_medium": 824 | { 825 | "url_list": ["https://p3.pstatp.com/aweme/720x720/8e560020749676e06860.jpeg", "https://pb9.pstatp.com/aweme/720x720/8e560020749676e06860.jpeg", "https://pb3.pstatp.com/aweme/720x720/8e560020749676e06860.jpeg"], 826 | "uri": "8e560020749676e06860" 827 | }, 828 | "has_orders": false, 829 | "reflow_page_uid": 0, 830 | "cover_url": [ 831 | { 832 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 833 | "uri": "c8510002be9a3a61aad2" 834 | } 835 | ], 836 | "duet_setting": 0, 837 | "language": "zh-Hans", 838 | "geofencing": [], 839 | "ins_id": "", 840 | "unique_id_modify_time": 1539958563, 841 | "school_type": 0, 842 | "twitter_name": "", 843 | "avatar_uri": "8e560020749676e06860", 844 | "signature": "\u514d,\u8d39\u60c5\u611f\u54a8\u8be2\u628a\u59b9\u5e72\u8d27\u9886,\u53d6 v \ud83d\udc9d AHYJD666", 845 | "weibo_verify": "", 846 | "comment_setting": 0, 847 | "with_fusion_shop_entry": false, 848 | "youtube_channel_id": "", 849 | "avatar_larger": 850 | { 851 | "url_list": ["https://p3.pstatp.com/aweme/1080x1080/8e560020749676e06860.jpeg", "https://pb9.pstatp.com/aweme/1080x1080/8e560020749676e06860.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/8e560020749676e06860.jpeg"], 852 | "uri": "8e560020749676e06860" 853 | }, 854 | "enterprise_verify_reason": "", 855 | "story_open": false, 856 | "user_rate": 1, 857 | "live_verify": 2, 858 | "short_id": "619352213", 859 | "secret": 0, 860 | "avatar_thumb": 861 | { 862 | "url_list": ["https://p3.pstatp.com/aweme/100x100/8e560020749676e06860.jpeg", "https://pb9.pstatp.com/aweme/100x100/8e560020749676e06860.jpeg", "https://pb3.pstatp.com/aweme/100x100/8e560020749676e06860.jpeg"], 863 | "uri": "8e560020749676e06860" 864 | }, 865 | "is_verified": true, 866 | "hide_search": true, 867 | "with_commerce_entry": false, 868 | "download_prompt_ts": 0, 869 | "twitter_id": "", 870 | "has_email": false, 871 | "policy_version": {}, 872 | "region": "CN", 873 | "uid": "95948003978", 874 | "bind_phone": "", 875 | "weibo_url": "", 876 | "live_agreement_time": 1539598904, 877 | "weibo_name": "", 878 | "commerce_user_level": 0, 879 | "verify_info": "", 880 | "apple_account": 0, 881 | "accept_private_policy": false, 882 | "shield_digg_notice": 0, 883 | "verification_type": 1, 884 | "neiguang_shield": 0, 885 | "authority_status": 0, 886 | "birthday": "1994-12-31", 887 | "is_ad_fake": false, 888 | "nickname": "\u8ffd\u5973\u5b69de\u5b66\u95ee", 889 | "shield_follow_notice": 0, 890 | "original_music_cover": null, 891 | "follow_status": 0, 892 | "status": 1, 893 | "unique_id": "" 894 | }, 895 | { 896 | "youtube_channel_title": "", 897 | "share_qrcode_uri": "38cd0000a50452b12d3c", 898 | "original_music_qrcode": null, 899 | "is_gov_media_vip": false, 900 | "live_commerce": false, 901 | "account_region": "", 902 | "user_period": 0, 903 | "reflow_page_gid": 0, 904 | "is_binded_weibo": false, 905 | "video_icon_virtual_URI": "", 906 | "follower_status": 0, 907 | "school_name": "", 908 | "download_setting": -1, 909 | "custom_verify": "", 910 | "special_lock": 1, 911 | "user_canceled": false, 912 | "shield_comment_notice": 0, 913 | "hide_location": false, 914 | "gender": 1, 915 | "video_icon": 916 | { 917 | "url_list": [], 918 | "uri": "" 919 | }, 920 | "school_poi_id": "", 921 | "live_agreement": 0, 922 | "is_phone_binded": false, 923 | "prevent_download": false, 924 | "weibo_schema": "", 925 | "create_time": 1504226996, 926 | "has_insights": false, 927 | "react_setting": 0, 928 | "google_account": "", 929 | "constellation": 10, 930 | "user_mode": 0, 931 | "need_recommend": 1, 932 | "room_id": 0, 933 | "avatar_medium": 934 | { 935 | "url_list": ["https://p1.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg"], 936 | "uri": "c16000003f97583dac4" 937 | }, 938 | "has_orders": false, 939 | "reflow_page_uid": 0, 940 | "cover_url": [ 941 | { 942 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 943 | "uri": "c8510002be9a3a61aad2" 944 | } 945 | ], 946 | "duet_setting": 0, 947 | "language": "zh-Hans", 948 | "geofencing": [], 949 | "ins_id": "", 950 | "unique_id_modify_time": 1539958563, 951 | "school_type": 0, 952 | "twitter_name": "", 953 | "avatar_uri": "c16000003f97583dac4", 954 | "signature": "", 955 | "weibo_verify": "", 956 | "comment_setting": 0, 957 | "with_fusion_shop_entry": true, 958 | "youtube_channel_id": "", 959 | "avatar_larger": 960 | { 961 | "url_list": ["https://p1.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg"], 962 | "uri": "c16000003f97583dac4" 963 | }, 964 | "enterprise_verify_reason": "", 965 | "story_open": false, 966 | "user_rate": 1, 967 | "live_verify": 0, 968 | "short_id": "67750758", 969 | "secret": 0, 970 | "avatar_thumb": 971 | { 972 | "url_list": ["https://p1.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg"], 973 | "uri": "c16000003f97583dac4" 974 | }, 975 | "is_verified": true, 976 | "hide_search": false, 977 | "with_commerce_entry": false, 978 | "download_prompt_ts": 0, 979 | "twitter_id": "", 980 | "has_email": false, 981 | "policy_version": {}, 982 | "region": "CN", 983 | "uid": "67839827993", 984 | "bind_phone": "", 985 | "weibo_url": "", 986 | "live_agreement_time": 0, 987 | "weibo_name": "", 988 | "commerce_user_level": 0, 989 | "verify_info": "", 990 | "apple_account": 0, 991 | "accept_private_policy": false, 992 | "shield_digg_notice": 0, 993 | "verification_type": 1, 994 | "neiguang_shield": 0, 995 | "authority_status": 0, 996 | "birthday": "2000-01-01", 997 | "is_ad_fake": false, 998 | "nickname": "\u5df2\u91cd\u7f6e", 999 | "shield_follow_notice": 0, 1000 | "original_music_cover": null, 1001 | "follow_status": 0, 1002 | "status": 0, 1003 | "unique_id": "" 1004 | }, 1005 | { 1006 | "youtube_channel_title": "", 1007 | "share_qrcode_uri": "8d8400238150951fd1fc", 1008 | "original_music_qrcode": null, 1009 | "is_gov_media_vip": false, 1010 | "live_commerce": false, 1011 | "account_region": "", 1012 | "user_period": 0, 1013 | "reflow_page_gid": 0, 1014 | "is_binded_weibo": false, 1015 | "video_icon_virtual_URI": "", 1016 | "follower_status": 0, 1017 | "school_name": "", 1018 | "download_setting": -1, 1019 | "custom_verify": "", 1020 | "special_lock": 1, 1021 | "user_canceled": false, 1022 | "shield_comment_notice": 0, 1023 | "hide_location": false, 1024 | "gender": 1, 1025 | "video_icon": 1026 | { 1027 | "url_list": [], 1028 | "uri": "" 1029 | }, 1030 | "school_poi_id": "", 1031 | "live_agreement": 1, 1032 | "is_phone_binded": false, 1033 | "prevent_download": false, 1034 | "weibo_schema": "", 1035 | "create_time": 1528849527, 1036 | "has_insights": false, 1037 | "react_setting": 0, 1038 | "google_account": "", 1039 | "constellation": 3, 1040 | "user_mode": 0, 1041 | "need_recommend": 1, 1042 | "room_id": 0, 1043 | "avatar_medium": 1044 | { 1045 | "url_list": ["https://p1.pstatp.com/obj/8d82002c17cf5110c196"], 1046 | "uri": "" 1047 | }, 1048 | "has_orders": false, 1049 | "reflow_page_uid": 0, 1050 | "cover_url": [ 1051 | { 1052 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 1053 | "uri": "c8510002be9a3a61aad2" 1054 | } 1055 | ], 1056 | "duet_setting": 0, 1057 | "language": "zh-Hans", 1058 | "geofencing": [], 1059 | "ins_id": "", 1060 | "unique_id_modify_time": 1539958563, 1061 | "school_type": 0, 1062 | "twitter_name": "", 1063 | "avatar_uri": "", 1064 | "signature": "\u5317\u5927\u535a\u58eb\uff0c\u9521\u6069\u54a8\u8be2\u603b\u88c1\u59dc\u6c5d\u7965\u539f\u521b\u89c6\u9891\uff0c\u52a0 cncn201807 \u9001\u65b0\u4e66\u7535\u5b50\u7248", 1065 | "weibo_verify": "", 1066 | "comment_setting": 0, 1067 | "with_fusion_shop_entry": false, 1068 | "youtube_channel_id": "", 1069 | "avatar_larger": 1070 | { 1071 | "url_list": ["https://p1.pstatp.com/obj/8d82002c17cf5110c196"], 1072 | "uri": "" 1073 | }, 1074 | "enterprise_verify_reason": "", 1075 | "story_open": false, 1076 | "user_rate": 1, 1077 | "live_verify": 0, 1078 | "short_id": "1056068994", 1079 | "secret": 0, 1080 | "avatar_thumb": 1081 | { 1082 | "url_list": ["https://p1.pstatp.com/obj/8d82002c17cf5110c196"], 1083 | "uri": "" 1084 | }, 1085 | "is_verified": true, 1086 | "hide_search": false, 1087 | "with_commerce_entry": false, 1088 | "download_prompt_ts": 0, 1089 | "twitter_id": "", 1090 | "has_email": false, 1091 | "policy_version": {}, 1092 | "region": "CN", 1093 | "uid": "100200184566", 1094 | "bind_phone": "", 1095 | "weibo_url": "", 1096 | "live_agreement_time": 1535874799, 1097 | "weibo_name": "", 1098 | "commerce_user_level": 0, 1099 | "verify_info": "", 1100 | "apple_account": 0, 1101 | "accept_private_policy": false, 1102 | "shield_digg_notice": 0, 1103 | "verification_type": 1, 1104 | "neiguang_shield": 0, 1105 | "authority_status": 0, 1106 | "birthday": "1977-06-01", 1107 | "is_ad_fake": false, 1108 | "nickname": "\u59dc\u6c5d\u7965", 1109 | "shield_follow_notice": 0, 1110 | "original_music_cover": null, 1111 | "follow_status": 0, 1112 | "status": 1, 1113 | "unique_id": "" 1114 | }, 1115 | { 1116 | "youtube_channel_title": "", 1117 | "share_qrcode_uri": "b70f001f1af6aad593a7", 1118 | "original_music_qrcode": null, 1119 | "is_gov_media_vip": false, 1120 | "live_commerce": false, 1121 | "account_region": "", 1122 | "user_period": 0, 1123 | "reflow_page_gid": 0, 1124 | "is_binded_weibo": false, 1125 | "video_icon_virtual_URI": "", 1126 | "follower_status": 0, 1127 | "school_name": "", 1128 | "download_setting": -1, 1129 | "custom_verify": "", 1130 | "special_lock": 1, 1131 | "user_canceled": false, 1132 | "shield_comment_notice": 0, 1133 | "hide_location": false, 1134 | "gender": 1, 1135 | "video_icon": 1136 | { 1137 | "url_list": [], 1138 | "uri": "" 1139 | }, 1140 | "school_poi_id": "", 1141 | "live_agreement": 0, 1142 | "is_phone_binded": false, 1143 | "prevent_download": false, 1144 | "weibo_schema": "", 1145 | "create_time": 1536558625, 1146 | "has_insights": false, 1147 | "react_setting": 0, 1148 | "google_account": "", 1149 | "constellation": 7, 1150 | "user_mode": 0, 1151 | "need_recommend": 1, 1152 | "room_id": 0, 1153 | "avatar_medium": 1154 | { 1155 | "url_list": ["https://p1.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg"], 1156 | "uri": "c16000003f97583dac4" 1157 | }, 1158 | "has_orders": false, 1159 | "reflow_page_uid": 0, 1160 | "cover_url": [ 1161 | { 1162 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 1163 | "uri": "c8510002be9a3a61aad2" 1164 | } 1165 | ], 1166 | "duet_setting": 0, 1167 | "language": "zh-Hans", 1168 | "geofencing": [], 1169 | "ins_id": "", 1170 | "unique_id_modify_time": 1539958563, 1171 | "school_type": 0, 1172 | "twitter_name": "", 1173 | "avatar_uri": "c16000003f97583dac4", 1174 | "signature": "", 1175 | "weibo_verify": "", 1176 | "comment_setting": 0, 1177 | "with_fusion_shop_entry": false, 1178 | "youtube_channel_id": "", 1179 | "avatar_larger": 1180 | { 1181 | "url_list": ["https://p1.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg"], 1182 | "uri": "c16000003f97583dac4" 1183 | }, 1184 | "enterprise_verify_reason": "", 1185 | "story_open": false, 1186 | "user_rate": 1, 1187 | "live_verify": 0, 1188 | "short_id": "1461434132", 1189 | "secret": 0, 1190 | "avatar_thumb": 1191 | { 1192 | "url_list": ["https://p1.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg"], 1193 | "uri": "c16000003f97583dac4" 1194 | }, 1195 | "is_verified": true, 1196 | "hide_search": false, 1197 | "with_commerce_entry": false, 1198 | "download_prompt_ts": 0, 1199 | "twitter_id": "", 1200 | "has_email": false, 1201 | "policy_version": {}, 1202 | "region": "CN", 1203 | "uid": "92654947278", 1204 | "bind_phone": "", 1205 | "weibo_url": "", 1206 | "live_agreement_time": 0, 1207 | "weibo_name": "", 1208 | "commerce_user_level": 0, 1209 | "verify_info": "", 1210 | "apple_account": 0, 1211 | "accept_private_policy": false, 1212 | "shield_digg_notice": 0, 1213 | "verification_type": 1, 1214 | "neiguang_shield": 0, 1215 | "authority_status": 0, 1216 | "birthday": "1991-10-19", 1217 | "is_ad_fake": false, 1218 | "nickname": "\u5df2\u91cd\u7f6e", 1219 | "shield_follow_notice": 0, 1220 | "original_music_cover": null, 1221 | "follow_status": 0, 1222 | "status": 0, 1223 | "unique_id": "" 1224 | }, 1225 | { 1226 | "youtube_channel_title": "", 1227 | "share_qrcode_uri": "67110030763bda9b4422", 1228 | "original_music_qrcode": null, 1229 | "is_gov_media_vip": false, 1230 | "live_commerce": false, 1231 | "account_region": "", 1232 | "user_period": 0, 1233 | "reflow_page_gid": 0, 1234 | "is_binded_weibo": false, 1235 | "video_icon_virtual_URI": "", 1236 | "follower_status": 0, 1237 | "school_name": "", 1238 | "download_setting": -1, 1239 | "custom_verify": "", 1240 | "special_lock": 0, 1241 | "user_canceled": false, 1242 | "shield_comment_notice": 0, 1243 | "hide_location": false, 1244 | "gender": 2, 1245 | "video_icon": 1246 | { 1247 | "url_list": [], 1248 | "uri": "" 1249 | }, 1250 | "school_poi_id": "", 1251 | "live_agreement": 0, 1252 | "is_phone_binded": false, 1253 | "prevent_download": false, 1254 | "weibo_schema": "", 1255 | "create_time": 1519643256, 1256 | "has_insights": false, 1257 | "react_setting": 0, 1258 | "google_account": "", 1259 | "constellation": 7, 1260 | "user_mode": 0, 1261 | "need_recommend": 1, 1262 | "room_id": 0, 1263 | "avatar_medium": 1264 | { 1265 | "url_list": ["https://p1.pstatp.com/thumb/ef6000edf90b4f0cf91"], 1266 | "uri": "" 1267 | }, 1268 | "has_orders": false, 1269 | "reflow_page_uid": 0, 1270 | "cover_url": [ 1271 | { 1272 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 1273 | "uri": "c8510002be9a3a61aad2" 1274 | } 1275 | ], 1276 | "duet_setting": 0, 1277 | "language": "zh-Hans", 1278 | "geofencing": [], 1279 | "ins_id": "", 1280 | "unique_id_modify_time": 1539958563, 1281 | "school_type": 0, 1282 | "twitter_name": "", 1283 | "avatar_uri": "", 1284 | "signature": "\u4f60\u4eec\u7684\u6bcf\u4e00\u6761\u8bc4\u8bba\uff0c\u8fa3\u8fa3\u90fd\u4f1a\u770b\u5230\u54e6\uff0c\u7231\u4f60\u4eec\uff5e\ud83d\ude18\ud83d\ude18", 1285 | "weibo_verify": "", 1286 | "comment_setting": 0, 1287 | "with_fusion_shop_entry": false, 1288 | "youtube_channel_id": "", 1289 | "avatar_larger": 1290 | { 1291 | "url_list": ["https://p1.pstatp.com/thumb/ef6000edf90b4f0cf91"], 1292 | "uri": "" 1293 | }, 1294 | "enterprise_verify_reason": "", 1295 | "story_open": false, 1296 | "user_rate": 1, 1297 | "live_verify": 0, 1298 | "short_id": "383351215", 1299 | "secret": 0, 1300 | "avatar_thumb": 1301 | { 1302 | "url_list": ["https://p1.pstatp.com/thumb/ef6000edf90b4f0cf91"], 1303 | "uri": "" 1304 | }, 1305 | "is_verified": true, 1306 | "hide_search": false, 1307 | "with_commerce_entry": false, 1308 | "download_prompt_ts": 0, 1309 | "twitter_id": "", 1310 | "has_email": false, 1311 | "policy_version": {}, 1312 | "region": "CN", 1313 | "uid": "93984482190", 1314 | "bind_phone": "", 1315 | "weibo_url": "", 1316 | "live_agreement_time": 0, 1317 | "weibo_name": "", 1318 | "commerce_user_level": 0, 1319 | "verify_info": "", 1320 | "apple_account": 0, 1321 | "accept_private_policy": false, 1322 | "shield_digg_notice": 0, 1323 | "verification_type": 1, 1324 | "neiguang_shield": 0, 1325 | "authority_status": 0, 1326 | "birthday": "1995-10-07", 1327 | "is_ad_fake": false, 1328 | "nickname": "\u79d1\u6280\u516c\u5143", 1329 | "shield_follow_notice": 0, 1330 | "original_music_cover": null, 1331 | "follow_status": 0, 1332 | "status": 1, 1333 | "unique_id": "" 1334 | }, 1335 | { 1336 | "youtube_channel_title": "", 1337 | "share_qrcode_uri": "886b000ecdafcbf79ae6", 1338 | "original_music_qrcode": null, 1339 | "is_gov_media_vip": false, 1340 | "live_commerce": false, 1341 | "account_region": "", 1342 | "user_period": 0, 1343 | "reflow_page_gid": 0, 1344 | "is_binded_weibo": false, 1345 | "video_icon_virtual_URI": "", 1346 | "follower_status": 0, 1347 | "school_name": "", 1348 | "download_setting": -1, 1349 | "custom_verify": "", 1350 | "special_lock": 1, 1351 | "user_canceled": false, 1352 | "shield_comment_notice": 0, 1353 | "hide_location": false, 1354 | "gender": 2, 1355 | "video_icon": 1356 | { 1357 | "url_list": [], 1358 | "uri": "" 1359 | }, 1360 | "school_poi_id": "", 1361 | "live_agreement": 0, 1362 | "is_phone_binded": false, 1363 | "prevent_download": false, 1364 | "weibo_schema": "", 1365 | "create_time": 1527229057, 1366 | "has_insights": false, 1367 | "react_setting": 0, 1368 | "google_account": "", 1369 | "constellation": 10, 1370 | "user_mode": 0, 1371 | "need_recommend": 1, 1372 | "room_id": 0, 1373 | "avatar_medium": 1374 | { 1375 | "url_list": ["https://p3.pstatp.com/aweme/720x720/a164001814580eb38363.jpeg", "https://pb9.pstatp.com/aweme/720x720/a164001814580eb38363.jpeg", "https://pb3.pstatp.com/aweme/720x720/a164001814580eb38363.jpeg"], 1376 | "uri": "a164001814580eb38363" 1377 | }, 1378 | "has_orders": false, 1379 | "reflow_page_uid": 0, 1380 | "cover_url": [ 1381 | { 1382 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 1383 | "uri": "c8510002be9a3a61aad2" 1384 | } 1385 | ], 1386 | "duet_setting": 0, 1387 | "language": "zh-Hans", 1388 | "geofencing": [], 1389 | "ins_id": "", 1390 | "unique_id_modify_time": 1539958563, 1391 | "school_type": 0, 1392 | "twitter_name": "", 1393 | "avatar_uri": "a164001814580eb38363", 1394 | "signature": "\u4e00\u5206\u949f\u80b2\u513f\uff0c\u5206\u4eab\u4e13\u4e1a\u79d1\u5b66\u80b2\u513f\u77e5\u8bc6\u3002\n\ud83c\udf38\u54a8\u8be2\u5b69\u5b50\u95ee\u9898\u52a0\uff1adykzx08\uff0c\u5907\u6ce8dy", 1395 | "weibo_verify": "", 1396 | "comment_setting": 0, 1397 | "with_fusion_shop_entry": false, 1398 | "youtube_channel_id": "", 1399 | "avatar_larger": 1400 | { 1401 | "url_list": ["https://p3.pstatp.com/aweme/1080x1080/a164001814580eb38363.jpeg", "https://pb9.pstatp.com/aweme/1080x1080/a164001814580eb38363.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/a164001814580eb38363.jpeg"], 1402 | "uri": "a164001814580eb38363" 1403 | }, 1404 | "enterprise_verify_reason": "", 1405 | "story_open": false, 1406 | "user_rate": 1, 1407 | "live_verify": 0, 1408 | "short_id": "978829471", 1409 | "secret": 0, 1410 | "avatar_thumb": 1411 | { 1412 | "url_list": ["https://p3.pstatp.com/aweme/100x100/a164001814580eb38363.jpeg", "https://pb9.pstatp.com/aweme/100x100/a164001814580eb38363.jpeg", "https://pb3.pstatp.com/aweme/100x100/a164001814580eb38363.jpeg"], 1413 | "uri": "a164001814580eb38363" 1414 | }, 1415 | "is_verified": true, 1416 | "hide_search": false, 1417 | "with_commerce_entry": false, 1418 | "download_prompt_ts": 0, 1419 | "twitter_id": "", 1420 | "has_email": false, 1421 | "policy_version": {}, 1422 | "region": "CN", 1423 | "uid": "99108662715", 1424 | "bind_phone": "", 1425 | "weibo_url": "", 1426 | "live_agreement_time": 0, 1427 | "weibo_name": "", 1428 | "commerce_user_level": 0, 1429 | "verify_info": "", 1430 | "apple_account": 0, 1431 | "accept_private_policy": false, 1432 | "shield_digg_notice": 0, 1433 | "verification_type": 1, 1434 | "neiguang_shield": 0, 1435 | "authority_status": 0, 1436 | "birthday": "1980-01-01", 1437 | "is_ad_fake": false, 1438 | "nickname": "\u4e00\u5206\u949f\u80b2\u513f\uff08\u5bb6\u957f\u79c1\u4fe1\u5fc5\u56de\uff09", 1439 | "shield_follow_notice": 0, 1440 | "original_music_cover": null, 1441 | "follow_status": 0, 1442 | "status": 1, 1443 | "unique_id": "" 1444 | }, 1445 | { 1446 | "youtube_channel_title": "", 1447 | "share_qrcode_uri": "bde5001aa5c0d33e7eab", 1448 | "original_music_qrcode": null, 1449 | "is_gov_media_vip": false, 1450 | "live_commerce": false, 1451 | "account_region": "", 1452 | "user_period": 0, 1453 | "reflow_page_gid": 0, 1454 | "is_binded_weibo": false, 1455 | "video_icon_virtual_URI": "", 1456 | "follower_status": 0, 1457 | "school_name": "", 1458 | "download_setting": -1, 1459 | "custom_verify": "", 1460 | "special_lock": 1, 1461 | "user_canceled": false, 1462 | "shield_comment_notice": 0, 1463 | "hide_location": false, 1464 | "gender": 1, 1465 | "video_icon": 1466 | { 1467 | "url_list": [], 1468 | "uri": "" 1469 | }, 1470 | "school_poi_id": "", 1471 | "live_agreement": 0, 1472 | "is_phone_binded": false, 1473 | "prevent_download": false, 1474 | "weibo_schema": "", 1475 | "create_time": 1537022349, 1476 | "has_insights": false, 1477 | "react_setting": 0, 1478 | "google_account": "", 1479 | "constellation": 10, 1480 | "user_mode": 0, 1481 | "need_recommend": 1, 1482 | "room_id": 0, 1483 | "avatar_medium": 1484 | { 1485 | "url_list": ["https://p1.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg"], 1486 | "uri": "c16000003f97583dac4" 1487 | }, 1488 | "has_orders": false, 1489 | "reflow_page_uid": 0, 1490 | "cover_url": [ 1491 | { 1492 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 1493 | "uri": "c8510002be9a3a61aad2" 1494 | } 1495 | ], 1496 | "duet_setting": 0, 1497 | "language": "zh-Hans", 1498 | "geofencing": [], 1499 | "ins_id": "", 1500 | "unique_id_modify_time": 1539958563, 1501 | "school_type": 0, 1502 | "twitter_name": "", 1503 | "avatar_uri": "c16000003f97583dac4", 1504 | "signature": "\u6bcf\u5929\u4e00\u5206\u949f\uff0c\u953b\u70bc\u903b\u8f91\uff0c\u542f\u53d1\u601d\u7ef4\uff01", 1505 | "weibo_verify": "", 1506 | "comment_setting": 0, 1507 | "with_fusion_shop_entry": false, 1508 | "youtube_channel_id": "", 1509 | "avatar_larger": 1510 | { 1511 | "url_list": ["https://p1.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg"], 1512 | "uri": "c16000003f97583dac4" 1513 | }, 1514 | "enterprise_verify_reason": "", 1515 | "story_open": false, 1516 | "user_rate": 2, 1517 | "live_verify": 0, 1518 | "short_id": "1482876068", 1519 | "secret": 0, 1520 | "avatar_thumb": 1521 | { 1522 | "url_list": ["https://p1.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg"], 1523 | "uri": "c16000003f97583dac4" 1524 | }, 1525 | "is_verified": true, 1526 | "hide_search": false, 1527 | "with_commerce_entry": false, 1528 | "download_prompt_ts": 0, 1529 | "twitter_id": "", 1530 | "has_email": false, 1531 | "policy_version": {}, 1532 | "region": "CN", 1533 | "uid": "103317765900", 1534 | "bind_phone": "", 1535 | "weibo_url": "", 1536 | "live_agreement_time": 0, 1537 | "weibo_name": "", 1538 | "commerce_user_level": 0, 1539 | "verify_info": "", 1540 | "apple_account": 0, 1541 | "accept_private_policy": false, 1542 | "shield_digg_notice": 0, 1543 | "verification_type": 1, 1544 | "neiguang_shield": 0, 1545 | "authority_status": 0, 1546 | "birthday": "2000-01-01", 1547 | "is_ad_fake": false, 1548 | "nickname": "\u601d\u7ef4\u5b66\u5802", 1549 | "shield_follow_notice": 0, 1550 | "original_music_cover": null, 1551 | "follow_status": 0, 1552 | "status": 0, 1553 | "unique_id": "" 1554 | }, 1555 | { 1556 | "youtube_channel_title": "", 1557 | "share_qrcode_uri": "5fec00019293462b4045", 1558 | "original_music_qrcode": null, 1559 | "is_gov_media_vip": false, 1560 | "live_commerce": false, 1561 | "account_region": "", 1562 | "user_period": 0, 1563 | "reflow_page_gid": 0, 1564 | "is_binded_weibo": false, 1565 | "video_icon_virtual_URI": "", 1566 | "follower_status": 0, 1567 | "school_name": "", 1568 | "download_setting": -1, 1569 | "custom_verify": "", 1570 | "special_lock": 1, 1571 | "user_canceled": false, 1572 | "shield_comment_notice": 0, 1573 | "hide_location": false, 1574 | "gender": 1, 1575 | "video_icon": 1576 | { 1577 | "url_list": [], 1578 | "uri": "" 1579 | }, 1580 | "school_poi_id": "", 1581 | "live_agreement": 1, 1582 | "is_phone_binded": false, 1583 | "prevent_download": false, 1584 | "weibo_schema": "", 1585 | "create_time": 1518415494, 1586 | "has_insights": false, 1587 | "react_setting": 0, 1588 | "google_account": "", 1589 | "constellation": 7, 1590 | "user_mode": 0, 1591 | "need_recommend": 1, 1592 | "room_id": 0, 1593 | "avatar_medium": 1594 | { 1595 | "url_list": ["https://p1.pstatp.com/aweme/720x720/aa74001b75308ab91112.jpeg", "https://pb3.pstatp.com/aweme/720x720/aa74001b75308ab91112.jpeg", "https://pb3.pstatp.com/aweme/720x720/aa74001b75308ab91112.jpeg"], 1596 | "uri": "aa74001b75308ab91112" 1597 | }, 1598 | "has_orders": false, 1599 | "reflow_page_uid": 0, 1600 | "cover_url": [ 1601 | { 1602 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 1603 | "uri": "c8510002be9a3a61aad2" 1604 | } 1605 | ], 1606 | "duet_setting": 0, 1607 | "language": "zh-Hans", 1608 | "geofencing": [], 1609 | "ins_id": "", 1610 | "unique_id_modify_time": 1539958563, 1611 | "school_type": 0, 1612 | "twitter_name": "", 1613 | "avatar_uri": "aa74001b75308ab91112", 1614 | "signature": "\u4e00\u4e2a\u7a77\u4eba\u5bb6\u6709\u68a6\u60f3\u7684\u5b69\u5b50\nV\uff1a2788990897\n\u7231\u597d\uff1a\u8f6e\u6ed1 \u529f\u592b \u5531\u6b4c \u6444\u5f71", 1615 | "weibo_verify": "", 1616 | "comment_setting": 0, 1617 | "with_fusion_shop_entry": false, 1618 | "youtube_channel_id": "", 1619 | "avatar_larger": 1620 | { 1621 | "url_list": ["https://p1.pstatp.com/aweme/1080x1080/aa74001b75308ab91112.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/aa74001b75308ab91112.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/aa74001b75308ab91112.jpeg"], 1622 | "uri": "aa74001b75308ab91112" 1623 | }, 1624 | "enterprise_verify_reason": "", 1625 | "story_open": false, 1626 | "user_rate": 1, 1627 | "live_verify": 0, 1628 | "short_id": "343820448", 1629 | "secret": 0, 1630 | "avatar_thumb": 1631 | { 1632 | "url_list": ["https://p1.pstatp.com/aweme/100x100/aa74001b75308ab91112.jpeg", "https://pb3.pstatp.com/aweme/100x100/aa74001b75308ab91112.jpeg", "https://pb3.pstatp.com/aweme/100x100/aa74001b75308ab91112.jpeg"], 1633 | "uri": "aa74001b75308ab91112" 1634 | }, 1635 | "is_verified": true, 1636 | "hide_search": false, 1637 | "with_commerce_entry": false, 1638 | "download_prompt_ts": 0, 1639 | "twitter_id": "", 1640 | "has_email": false, 1641 | "policy_version": {}, 1642 | "region": "CN", 1643 | "uid": "92874177689", 1644 | "bind_phone": "", 1645 | "weibo_url": "", 1646 | "live_agreement_time": 1535119480, 1647 | "weibo_name": "", 1648 | "commerce_user_level": 0, 1649 | "verify_info": "", 1650 | "apple_account": 0, 1651 | "accept_private_policy": false, 1652 | "shield_digg_notice": 0, 1653 | "verification_type": 1, 1654 | "neiguang_shield": 0, 1655 | "authority_status": 0, 1656 | "birthday": "2018-10-13", 1657 | "is_ad_fake": false, 1658 | "nickname": "\u674e\u5bd2\u8f69", 1659 | "shield_follow_notice": 0, 1660 | "original_music_cover": null, 1661 | "follow_status": 0, 1662 | "status": 1, 1663 | "unique_id": "2788990897." 1664 | }, 1665 | { 1666 | "youtube_channel_title": "", 1667 | "share_qrcode_uri": "adca001f927898405531", 1668 | "original_music_qrcode": null, 1669 | "is_gov_media_vip": false, 1670 | "live_commerce": false, 1671 | "account_region": "", 1672 | "user_period": 0, 1673 | "reflow_page_gid": 0, 1674 | "is_binded_weibo": false, 1675 | "video_icon_virtual_URI": "", 1676 | "follower_status": 0, 1677 | "school_name": "", 1678 | "download_setting": -1, 1679 | "custom_verify": "", 1680 | "special_lock": 1, 1681 | "user_canceled": false, 1682 | "shield_comment_notice": 0, 1683 | "hide_location": false, 1684 | "gender": 1, 1685 | "video_icon": 1686 | { 1687 | "url_list": [], 1688 | "uri": "" 1689 | }, 1690 | "school_poi_id": "", 1691 | "live_agreement": 0, 1692 | "is_phone_binded": false, 1693 | "prevent_download": false, 1694 | "weibo_schema": "", 1695 | "create_time": 1535069200, 1696 | "has_insights": false, 1697 | "react_setting": 0, 1698 | "google_account": "", 1699 | "constellation": 2, 1700 | "user_mode": 0, 1701 | "need_recommend": 1, 1702 | "room_id": 0, 1703 | "avatar_medium": 1704 | { 1705 | "url_list": ["https://p3.pstatp.com/aweme/720x720/b6ff001c3846ccc21a7b.jpeg", "https://pb9.pstatp.com/aweme/720x720/b6ff001c3846ccc21a7b.jpeg", "https://pb3.pstatp.com/aweme/720x720/b6ff001c3846ccc21a7b.jpeg"], 1706 | "uri": "b6ff001c3846ccc21a7b" 1707 | }, 1708 | "has_orders": false, 1709 | "reflow_page_uid": 0, 1710 | "cover_url": [ 1711 | { 1712 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 1713 | "uri": "c8510002be9a3a61aad2" 1714 | } 1715 | ], 1716 | "duet_setting": 0, 1717 | "language": "zh-Hans", 1718 | "geofencing": [], 1719 | "ins_id": "", 1720 | "unique_id_modify_time": 1539958563, 1721 | "school_type": 0, 1722 | "twitter_name": "", 1723 | "avatar_uri": "b6ff001c3846ccc21a7b", 1724 | "signature": "\u559c\u6b22\u8857\u821e\u5173\u6ce8\u6211 \n\u6bcf\u5929\u770b\u6700\u65b0\u8857\u821e\n\u770b\u6700\u7cbe\u5f69\u7684\u6bd4\u8d5b \u539f\u521b\u89c6\u9891\n843303069", 1725 | "weibo_verify": "", 1726 | "comment_setting": 0, 1727 | "with_fusion_shop_entry": false, 1728 | "youtube_channel_id": "", 1729 | "avatar_larger": 1730 | { 1731 | "url_list": ["https://p3.pstatp.com/aweme/1080x1080/b6ff001c3846ccc21a7b.jpeg", "https://pb9.pstatp.com/aweme/1080x1080/b6ff001c3846ccc21a7b.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/b6ff001c3846ccc21a7b.jpeg"], 1732 | "uri": "b6ff001c3846ccc21a7b" 1733 | }, 1734 | "enterprise_verify_reason": "", 1735 | "story_open": false, 1736 | "user_rate": 1, 1737 | "live_verify": 0, 1738 | "short_id": "1341383951", 1739 | "secret": 0, 1740 | "avatar_thumb": 1741 | { 1742 | "url_list": ["https://p3.pstatp.com/aweme/100x100/b6ff001c3846ccc21a7b.jpeg", "https://pb9.pstatp.com/aweme/100x100/b6ff001c3846ccc21a7b.jpeg", "https://pb3.pstatp.com/aweme/100x100/b6ff001c3846ccc21a7b.jpeg"], 1743 | "uri": "b6ff001c3846ccc21a7b" 1744 | }, 1745 | "is_verified": true, 1746 | "hide_search": false, 1747 | "with_commerce_entry": false, 1748 | "download_prompt_ts": 0, 1749 | "twitter_id": "", 1750 | "has_email": false, 1751 | "policy_version": {}, 1752 | "region": "CN", 1753 | "uid": "96468288590", 1754 | "bind_phone": "", 1755 | "weibo_url": "", 1756 | "live_agreement_time": 0, 1757 | "weibo_name": "", 1758 | "commerce_user_level": 0, 1759 | "verify_info": "", 1760 | "apple_account": 0, 1761 | "accept_private_policy": false, 1762 | "shield_digg_notice": 0, 1763 | "verification_type": 1, 1764 | "neiguang_shield": 0, 1765 | "authority_status": 0, 1766 | "birthday": "1995-05-01", 1767 | "is_ad_fake": false, 1768 | "nickname": "\u821e\u8005 \u6728\u8d24", 1769 | "shield_follow_notice": 0, 1770 | "original_music_cover": null, 1771 | "follow_status": 0, 1772 | "status": 1, 1773 | "unique_id": "M888X88" 1774 | }, 1775 | { 1776 | "youtube_channel_title": "", 1777 | "share_qrcode_uri": "988f0021233ba8ab9d64", 1778 | "original_music_qrcode": null, 1779 | "is_gov_media_vip": false, 1780 | "live_commerce": false, 1781 | "account_region": "", 1782 | "user_period": 0, 1783 | "reflow_page_gid": 0, 1784 | "is_binded_weibo": false, 1785 | "video_icon_virtual_URI": "", 1786 | "follower_status": 0, 1787 | "school_name": "", 1788 | "download_setting": -1, 1789 | "custom_verify": "", 1790 | "special_lock": 1, 1791 | "user_canceled": false, 1792 | "shield_comment_notice": 0, 1793 | "hide_location": false, 1794 | "gender": 0, 1795 | "video_icon": 1796 | { 1797 | "url_list": [], 1798 | "uri": "" 1799 | }, 1800 | "school_poi_id": "", 1801 | "live_agreement": 0, 1802 | "is_phone_binded": false, 1803 | "prevent_download": false, 1804 | "weibo_schema": "", 1805 | "create_time": 1531535283, 1806 | "has_insights": false, 1807 | "react_setting": 0, 1808 | "google_account": "", 1809 | "constellation": 10, 1810 | "user_mode": 0, 1811 | "need_recommend": 1, 1812 | "room_id": 0, 1813 | "avatar_medium": 1814 | { 1815 | "url_list": ["https://p1.pstatp.com/obj/9890001ab2e18bfc0384"], 1816 | "uri": "" 1817 | }, 1818 | "has_orders": false, 1819 | "reflow_page_uid": 0, 1820 | "cover_url": [ 1821 | { 1822 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 1823 | "uri": "c8510002be9a3a61aad2" 1824 | } 1825 | ], 1826 | "duet_setting": 0, 1827 | "language": "zh-Hans", 1828 | "geofencing": [], 1829 | "ins_id": "", 1830 | "unique_id_modify_time": 1539958563, 1831 | "school_type": 0, 1832 | "twitter_name": "", 1833 | "avatar_uri": "", 1834 | "signature": "\u5e7f\u6c7d\u7814\u7a76\u9662\u5973\u653b\u57ce\u72ee\u4eec\uff5e", 1835 | "weibo_verify": "", 1836 | "comment_setting": 0, 1837 | "with_fusion_shop_entry": false, 1838 | "youtube_channel_id": "", 1839 | "avatar_larger": 1840 | { 1841 | "url_list": ["https://p1.pstatp.com/obj/9890001ab2e18bfc0384"], 1842 | "uri": "" 1843 | }, 1844 | "enterprise_verify_reason": "", 1845 | "story_open": false, 1846 | "user_rate": 1, 1847 | "live_verify": 0, 1848 | "short_id": "1155651431", 1849 | "secret": 0, 1850 | "avatar_thumb": 1851 | { 1852 | "url_list": ["https://p1.pstatp.com/obj/9890001ab2e18bfc0384"], 1853 | "uri": "" 1854 | }, 1855 | "is_verified": true, 1856 | "hide_search": false, 1857 | "with_commerce_entry": false, 1858 | "download_prompt_ts": 0, 1859 | "twitter_id": "", 1860 | "has_email": false, 1861 | "policy_version": {}, 1862 | "region": "CN", 1863 | "uid": "101648907212", 1864 | "bind_phone": "", 1865 | "weibo_url": "", 1866 | "live_agreement_time": 0, 1867 | "weibo_name": "", 1868 | "commerce_user_level": 0, 1869 | "verify_info": "", 1870 | "apple_account": 0, 1871 | "accept_private_policy": false, 1872 | "shield_digg_notice": 0, 1873 | "verification_type": 1, 1874 | "neiguang_shield": 0, 1875 | "authority_status": 0, 1876 | "birthday": "2000-01-01", 1877 | "is_ad_fake": false, 1878 | "nickname": "\ud83c\udf40\u5468\u5c0f\u69b4\u83b2", 1879 | "shield_follow_notice": 0, 1880 | "original_music_cover": null, 1881 | "follow_status": 0, 1882 | "status": 1, 1883 | "unique_id": "zpe32" 1884 | }, 1885 | { 1886 | "youtube_channel_title": "", 1887 | "share_qrcode_uri": "4d5b0039e8ef793e2526", 1888 | "original_music_qrcode": null, 1889 | "is_gov_media_vip": false, 1890 | "live_commerce": false, 1891 | "account_region": "", 1892 | "user_period": 0, 1893 | "reflow_page_gid": 0, 1894 | "is_binded_weibo": false, 1895 | "video_icon_virtual_URI": "", 1896 | "follower_status": 0, 1897 | "school_name": "", 1898 | "download_setting": -1, 1899 | "custom_verify": "", 1900 | "special_lock": 1, 1901 | "user_canceled": false, 1902 | "shield_comment_notice": 0, 1903 | "hide_location": false, 1904 | "gender": 1, 1905 | "video_icon": 1906 | { 1907 | "url_list": [], 1908 | "uri": "" 1909 | }, 1910 | "school_poi_id": "", 1911 | "live_agreement": 0, 1912 | "is_phone_binded": false, 1913 | "prevent_download": false, 1914 | "weibo_schema": "", 1915 | "create_time": 1511317942, 1916 | "has_insights": false, 1917 | "react_setting": 0, 1918 | "google_account": "", 1919 | "constellation": 4, 1920 | "user_mode": 0, 1921 | "need_recommend": 1, 1922 | "room_id": 0, 1923 | "avatar_medium": 1924 | { 1925 | "url_list": ["https://p1.pstatp.com/aweme/720x720/8873001984a932169bcb.jpeg", "https://pb3.pstatp.com/aweme/720x720/8873001984a932169bcb.jpeg", "https://pb3.pstatp.com/aweme/720x720/8873001984a932169bcb.jpeg"], 1926 | "uri": "8873001984a932169bcb" 1927 | }, 1928 | "has_orders": false, 1929 | "reflow_page_uid": 0, 1930 | "cover_url": [ 1931 | { 1932 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 1933 | "uri": "c8510002be9a3a61aad2" 1934 | } 1935 | ], 1936 | "duet_setting": 0, 1937 | "language": "zh-Hans", 1938 | "geofencing": [], 1939 | "ins_id": "", 1940 | "unique_id_modify_time": 1539958563, 1941 | "school_type": 0, 1942 | "twitter_name": "", 1943 | "avatar_uri": "8873001984a932169bcb", 1944 | "signature": "\u9020\u68a6\u8005:503511203", 1945 | "weibo_verify": "", 1946 | "comment_setting": 0, 1947 | "with_fusion_shop_entry": false, 1948 | "youtube_channel_id": "", 1949 | "avatar_larger": 1950 | { 1951 | "url_list": ["https://p1.pstatp.com/aweme/1080x1080/8873001984a932169bcb.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/8873001984a932169bcb.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/8873001984a932169bcb.jpeg"], 1952 | "uri": "8873001984a932169bcb" 1953 | }, 1954 | "enterprise_verify_reason": "", 1955 | "story_open": false, 1956 | "user_rate": 1, 1957 | "live_verify": 0, 1958 | "short_id": "133048556", 1959 | "secret": 0, 1960 | "avatar_thumb": 1961 | { 1962 | "url_list": ["https://p1.pstatp.com/aweme/100x100/8873001984a932169bcb.jpeg", "https://pb3.pstatp.com/aweme/100x100/8873001984a932169bcb.jpeg", "https://pb3.pstatp.com/aweme/100x100/8873001984a932169bcb.jpeg"], 1963 | "uri": "8873001984a932169bcb" 1964 | }, 1965 | "is_verified": true, 1966 | "hide_search": false, 1967 | "with_commerce_entry": false, 1968 | "download_prompt_ts": 0, 1969 | "twitter_id": "", 1970 | "has_email": false, 1971 | "policy_version": {}, 1972 | "region": "CN", 1973 | "uid": "76863492844", 1974 | "bind_phone": "", 1975 | "weibo_url": "", 1976 | "live_agreement_time": 0, 1977 | "weibo_name": "", 1978 | "commerce_user_level": 0, 1979 | "verify_info": "", 1980 | "apple_account": 0, 1981 | "accept_private_policy": false, 1982 | "shield_digg_notice": 0, 1983 | "verification_type": 1, 1984 | "neiguang_shield": 0, 1985 | "authority_status": 0, 1986 | "birthday": "1987-06-29", 1987 | "is_ad_fake": false, 1988 | "nickname": "\u9020\u68a6\u8005\u4e28\u6797\u54e5", 1989 | "shield_follow_notice": 0, 1990 | "original_music_cover": null, 1991 | "follow_status": 0, 1992 | "status": 1, 1993 | "unique_id": "MHR.LG" 1994 | }, 1995 | { 1996 | "youtube_channel_title": "", 1997 | "share_qrcode_uri": "6722003269ecf1e6d027", 1998 | "original_music_qrcode": null, 1999 | "is_gov_media_vip": false, 2000 | "live_commerce": false, 2001 | "account_region": "", 2002 | "user_period": 0, 2003 | "reflow_page_gid": 0, 2004 | "is_binded_weibo": false, 2005 | "video_icon_virtual_URI": "", 2006 | "follower_status": 0, 2007 | "school_name": "", 2008 | "download_setting": -1, 2009 | "custom_verify": "", 2010 | "special_lock": 1, 2011 | "user_canceled": false, 2012 | "shield_comment_notice": 0, 2013 | "hide_location": false, 2014 | "gender": 1, 2015 | "video_icon": 2016 | { 2017 | "url_list": [], 2018 | "uri": "" 2019 | }, 2020 | "school_poi_id": "", 2021 | "live_agreement": 0, 2022 | "is_phone_binded": false, 2023 | "prevent_download": false, 2024 | "weibo_schema": "", 2025 | "create_time": 1520477528, 2026 | "has_insights": false, 2027 | "react_setting": 0, 2028 | "google_account": "", 2029 | "constellation": 10, 2030 | "user_mode": 0, 2031 | "need_recommend": 1, 2032 | "room_id": 0, 2033 | "avatar_medium": 2034 | { 2035 | "url_list": ["https://p3.pstatp.com/aweme/720x720/7bf20003a94c7334ef35.jpeg", "https://pb9.pstatp.com/aweme/720x720/7bf20003a94c7334ef35.jpeg", "https://pb3.pstatp.com/aweme/720x720/7bf20003a94c7334ef35.jpeg"], 2036 | "uri": "7bf20003a94c7334ef35" 2037 | }, 2038 | "has_orders": false, 2039 | "reflow_page_uid": 0, 2040 | "cover_url": [ 2041 | { 2042 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 2043 | "uri": "c8510002be9a3a61aad2" 2044 | } 2045 | ], 2046 | "duet_setting": 0, 2047 | "language": "zh-Hans", 2048 | "geofencing": [], 2049 | "ins_id": "", 2050 | "unique_id_modify_time": 1539958563, 2051 | "school_type": 0, 2052 | "twitter_name": "", 2053 | "avatar_uri": "7bf20003a94c7334ef35", 2054 | "signature": "\u628a\u5168\u7403\u6700\u9177\u7684\u521b\u610f\u79d1\u6280\u7edf\u7edf\u6296\u51fa\u6765\n\u6700\u70ab\u7684\u521b\u610f\n\u6700\u9177\u7684\u8bbe\u8ba1\n\u6700\u9ed1\u7684\u79d1\u6280\nVX \u6296\u521b\u610f", 2055 | "weibo_verify": "", 2056 | "comment_setting": 0, 2057 | "with_fusion_shop_entry": true, 2058 | "youtube_channel_id": "", 2059 | "avatar_larger": 2060 | { 2061 | "url_list": ["https://p3.pstatp.com/aweme/1080x1080/7bf20003a94c7334ef35.jpeg", "https://pb9.pstatp.com/aweme/1080x1080/7bf20003a94c7334ef35.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/7bf20003a94c7334ef35.jpeg"], 2062 | "uri": "7bf20003a94c7334ef35" 2063 | }, 2064 | "enterprise_verify_reason": "", 2065 | "story_open": false, 2066 | "user_rate": 1, 2067 | "live_verify": 2, 2068 | "short_id": "579225373", 2069 | "secret": 0, 2070 | "avatar_thumb": 2071 | { 2072 | "url_list": ["https://p3.pstatp.com/aweme/100x100/7bf20003a94c7334ef35.jpeg", "https://pb9.pstatp.com/aweme/100x100/7bf20003a94c7334ef35.jpeg", "https://pb3.pstatp.com/aweme/100x100/7bf20003a94c7334ef35.jpeg"], 2073 | "uri": "7bf20003a94c7334ef35" 2074 | }, 2075 | "is_verified": true, 2076 | "hide_search": false, 2077 | "with_commerce_entry": false, 2078 | "download_prompt_ts": 0, 2079 | "twitter_id": "", 2080 | "has_email": false, 2081 | "policy_version": {}, 2082 | "region": "CN", 2083 | "uid": "94814458657", 2084 | "bind_phone": "", 2085 | "weibo_url": "", 2086 | "live_agreement_time": 0, 2087 | "weibo_name": "", 2088 | "commerce_user_level": 0, 2089 | "verify_info": "", 2090 | "apple_account": 0, 2091 | "accept_private_policy": false, 2092 | "shield_digg_notice": 0, 2093 | "verification_type": 1, 2094 | "neiguang_shield": 0, 2095 | "authority_status": 0, 2096 | "birthday": "2015-01-05", 2097 | "is_ad_fake": false, 2098 | "nickname": "\u6296\u521b\u610f", 2099 | "shield_follow_notice": 0, 2100 | "original_music_cover": null, 2101 | "follow_status": 0, 2102 | "status": 1, 2103 | "unique_id": "douchuangyi" 2104 | }, 2105 | { 2106 | "youtube_channel_title": "", 2107 | "share_qrcode_uri": "836c00104751d8989245", 2108 | "original_music_qrcode": null, 2109 | "is_gov_media_vip": false, 2110 | "live_commerce": false, 2111 | "account_region": "", 2112 | "user_period": 0, 2113 | "reflow_page_gid": 0, 2114 | "is_binded_weibo": false, 2115 | "video_icon_virtual_URI": "", 2116 | "follower_status": 0, 2117 | "school_name": "", 2118 | "download_setting": -1, 2119 | "custom_verify": " ", 2120 | "special_lock": 1, 2121 | "user_canceled": false, 2122 | "shield_comment_notice": 0, 2123 | "hide_location": true, 2124 | "gender": 1, 2125 | "video_icon": 2126 | { 2127 | "url_list": [], 2128 | "uri": "" 2129 | }, 2130 | "school_poi_id": "", 2131 | "live_agreement": 0, 2132 | "is_phone_binded": false, 2133 | "prevent_download": false, 2134 | "weibo_schema": "", 2135 | "create_time": 1526193107, 2136 | "has_insights": false, 2137 | "react_setting": 0, 2138 | "google_account": "", 2139 | "constellation": 0, 2140 | "user_mode": 0, 2141 | "need_recommend": 1, 2142 | "room_id": 0, 2143 | "avatar_medium": 2144 | { 2145 | "url_list": ["https://p3.pstatp.com/aweme/720x720/836600286b21c2e3bcae.jpeg", "https://pb9.pstatp.com/aweme/720x720/836600286b21c2e3bcae.jpeg", "https://pb3.pstatp.com/aweme/720x720/836600286b21c2e3bcae.jpeg"], 2146 | "uri": "836600286b21c2e3bcae" 2147 | }, 2148 | "has_orders": false, 2149 | "reflow_page_uid": 0, 2150 | "cover_url": [ 2151 | { 2152 | "url_list": ["http://p98.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"], 2153 | "uri": "c8510002be9a3a61aad2" 2154 | } 2155 | ], 2156 | "duet_setting": 0, 2157 | "language": "zh-Hans", 2158 | "geofencing": [], 2159 | "ins_id": "", 2160 | "unique_id_modify_time": 1539958563, 2161 | "school_type": 0, 2162 | "twitter_name": "", 2163 | "avatar_uri": "836600286b21c2e3bcae", 2164 | "signature": "", 2165 | "weibo_verify": "", 2166 | "comment_setting": 0, 2167 | "with_fusion_shop_entry": false, 2168 | "youtube_channel_id": "", 2169 | "avatar_larger": 2170 | { 2171 | "url_list": ["https://p3.pstatp.com/aweme/1080x1080/836600286b21c2e3bcae.jpeg", "https://pb9.pstatp.com/aweme/1080x1080/836600286b21c2e3bcae.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/836600286b21c2e3bcae.jpeg"], 2172 | "uri": "836600286b21c2e3bcae" 2173 | }, 2174 | "enterprise_verify_reason": "", 2175 | "story_open": false, 2176 | "user_rate": 1, 2177 | "live_verify": 0, 2178 | "short_id": "937951956", 2179 | "secret": 0, 2180 | "avatar_thumb": 2181 | { 2182 | "url_list": ["https://p3.pstatp.com/aweme/100x100/836600286b21c2e3bcae.jpeg", "https://pb9.pstatp.com/aweme/100x100/836600286b21c2e3bcae.jpeg", "https://pb3.pstatp.com/aweme/100x100/836600286b21c2e3bcae.jpeg"], 2183 | "uri": "836600286b21c2e3bcae" 2184 | }, 2185 | "is_verified": true, 2186 | "hide_search": false, 2187 | "with_commerce_entry": false, 2188 | "download_prompt_ts": 0, 2189 | "twitter_id": "", 2190 | "has_email": false, 2191 | "policy_version": {}, 2192 | "region": "CN", 2193 | "uid": "98463336988", 2194 | "bind_phone": "", 2195 | "weibo_url": "", 2196 | "live_agreement_time": 0, 2197 | "weibo_name": "", 2198 | "commerce_user_level": 0, 2199 | "verify_info": "", 2200 | "apple_account": 0, 2201 | "accept_private_policy": false, 2202 | "shield_digg_notice": 0, 2203 | "verification_type": 1, 2204 | "neiguang_shield": 0, 2205 | "authority_status": 0, 2206 | "birthday": "", 2207 | "is_ad_fake": false, 2208 | "nickname": "\u829d\u9a6c\u5feb\u5f00\u95e8", 2209 | "shield_follow_notice": 0, 2210 | "original_music_cover": null, 2211 | "follow_status": 0, 2212 | "status": 1, 2213 | "unique_id": "" 2214 | } 2215 | ], 2216 | "max_time": 1538925370, 2217 | "offset": 0, 2218 | "min_time": 1529665862, 2219 | "total": 110, 2220 | "myself_user_id": "0" 2221 | } 2222 | -------------------------------------------------------------------------------- /json_demo/user_info.json: -------------------------------------------------------------------------------- 1 | { 2 | "user": 3 | { 4 | "hide_search": false, 5 | "duet_setting": 0, 6 | "signature": "大家一起来编程哇~", 7 | "avatar_medium": 8 | { 9 | "uri": "c16000003f97583dac4", 10 | "url_list": ["https://p1.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/720x720/c16000003f97583dac4.jpeg"] 11 | }, 12 | "follower_count": 8, 13 | "shield_comment_notice": 0, 14 | "short_id": "363498850", 15 | "avatar_larger": 16 | { 17 | "uri": "c16000003f97583dac4", 18 | "url_list": ["https://p1.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/1080x1080/c16000003f97583dac4.jpeg"] 19 | }, 20 | "is_block": false, 21 | "bind_phone": "#", 22 | "story_count": 0, 23 | "tw_expire_time": 0, 24 | "accept_private_policy": false, 25 | "video_icon_virtual_URI": "", 26 | "verification_type": 0, 27 | "with_shop_entry": false, 28 | "with_dou_entry": true, 29 | "recommend_reason_relation": "", 30 | "shield_follow_notice": 0, 31 | "school_poi_id": "", 32 | "with_commerce_entry": false, 33 | "with_fusion_shop_entry": false, 34 | "user_rate": 1, 35 | "birthday": "", 36 | "favoriting_count": 2120, 37 | "room_id": 0, 38 | "react_setting": 0, 39 | "profile_tab_type": 2, 40 | "live_commerce": false, 41 | "prevent_download": false, 42 | "with_douplus_entry": true, 43 | "reflow_page_gid": 0, 44 | "followers_detail": [ 45 | { 46 | "app_name": "aweme", 47 | "name": "抖音", 48 | "icon": "http://p3.pstatp.com/origin/50ec00079b64de2050dc", 49 | "fans_count": 8, 50 | "open_url": "snssdk1128://user/profile/84834596404?", 51 | "apple_id": "1142110895", 52 | "download_url": "https://d.douyin.com/Y4Fy/", 53 | "package_name": "com.ss.android.ugc.aweme" 54 | }, 55 | { 56 | "package_name": "com.ss.android.article.news", 57 | "app_name": "news_article", 58 | "name": "头条", 59 | "icon": "http://p3.pstatp.com/origin/50ed00079a1b6b8d1fb1", 60 | "fans_count": 0, 61 | "open_url": "snssdk141://profile?uid=0?", 62 | "apple_id": "529092160", 63 | "download_url": "https://d.toutiao.com/fUN5/" 64 | }, 65 | { 66 | "apple_id": "1086047750", 67 | "download_url": "http://d.huoshanzhibo.com/e7fw/", 68 | "package_name": "com.ss.android.ugc.live", 69 | "app_name": "live_stream", 70 | "name": "火山", 71 | "icon": "http://p3.pstatp.com/origin/551900041a7e00ec86ca", 72 | "fans_count": 0, 73 | "open_url": "snssdk1112://profile?id=84834596404" 74 | } 75 | ], 76 | "comment_setting": 0, 77 | "uid": "84834596404", 78 | "aweme_count": 0, 79 | "hide_location": false, 80 | "platform_sync_info": null, 81 | "has_orders": false, 82 | "geofencing": null, 83 | "unique_id_modify_time": 1539965087, 84 | "twitter_id": "", 85 | "shield_digg_notice": 0, 86 | "school_type": 0, 87 | "region": "CN", 88 | "reflow_page_uid": 0, 89 | "with_new_goods": false, 90 | "college_name": "", 91 | "fb_expire_time": 0, 92 | "mplatform_followers_count": 8, 93 | "dongtai_count": 0, 94 | "unique_id": "qq1042248300", 95 | "has_facebook_token": false, 96 | "city": "杭州", 97 | "iso_country_code": "", 98 | "is_verified": true, 99 | "constellation": 0, 100 | "enterprise_verify_reason": "", 101 | "youtube_channel_id": "", 102 | "country": "中国", 103 | "total_favorited": 0, 104 | "youtube_expire_time": 0, 105 | "live_verify": 0, 106 | "avatar_uri": "c16000003f97583dac4", 107 | "verify_info": "", 108 | "is_phone_binded": false, 109 | "login_platform": 0, 110 | "has_activity_medal": false, 111 | "is_gov_media_vip": false, 112 | "follow_status": 0, 113 | "weibo_name": "编程蛙", 114 | "show_gender_strategy": 0, 115 | "special_lock": 1, 116 | "secret": 0, 117 | "location": "杭州", 118 | "policy_version": null, 119 | "download_prompt_ts": 0, 120 | "realname_verify_status": 0, 121 | "follower_status": 0, 122 | "download_setting": 0, 123 | "share_qrcode_uri": "65a900147fe9b48dd879", 124 | "avatar_thumb": 125 | { 126 | "uri": "c16000003f97583dac4", 127 | "url_list": ["https://p1.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg", "https://pb3.pstatp.com/aweme/100x100/c16000003f97583dac4.jpeg"] 128 | }, 129 | "video_icon": 130 | { 131 | "uri": "", 132 | "url_list": [] 133 | }, 134 | "youtube_channel_title": "", 135 | "weibo_verify": "", 136 | "weibo_schema": "sinaweibo://userinfo?uid=2522328415", 137 | "with_item_commerce_entry": false, 138 | "with_commerce_newbie_task": false, 139 | "has_twitter_token": false, 140 | "sync_to_toutiao": 1, 141 | "dou_plus_share_location": 0, 142 | "live_agreement": 0, 143 | "ins_id": "", 144 | "twitter_name": "", 145 | "authority_status": 0, 146 | "show_image_bubble": false, 147 | "has_insights": false, 148 | "province": "浙江", 149 | "following_count": 110, 150 | "share_info": 151 | { 152 | "share_url": "www.iesdouyin.com/share/user/84834596404", 153 | "share_weibo_desc": "在抖音,记录美好生活!", 154 | "share_desc": "在抖音,记录美好生活!", 155 | "share_title": "快来加入抖音,让你发现最有趣的我!", 156 | "share_qrcode_url": 157 | { 158 | "uri": "65a900147fe9b48dd879", 159 | "url_list": ["http://p3.pstatp.com/obj/65a900147fe9b48dd879", "http://pb9.pstatp.com/obj/65a900147fe9b48dd879", "http://pb3.pstatp.com/obj/65a900147fe9b48dd879"] 160 | }, 161 | "share_image_url": 162 | { 163 | "uri": "c16000003f97583dac4", 164 | "url_list": ["http://p1.pstatp.com/obj/c16000003f97583dac4", "http://pb3.pstatp.com/obj/c16000003f97583dac4", "http://pb3.pstatp.com/obj/c16000003f97583dac4"] 165 | }, 166 | "bool_persist": 1 167 | }, 168 | "activity": 169 | { 170 | "digg_count": 0, 171 | "use_music_count": 0 172 | }, 173 | "status": 1, 174 | "cover_url": [ 175 | { 176 | "uri": "c8510002be9a3a61aad2", 177 | "url_list": ["http://p1.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2", "http://pb3.pstatp.com/obj/c8510002be9a3a61aad2"] 178 | } 179 | ], 180 | "is_ad_fake": false, 181 | "google_account": "", 182 | "apple_account": 0, 183 | "district": "", 184 | "weibo_url": "https://m.weibo.cn/u/2522328415", 185 | "has_youtube_token": false, 186 | "school_name": "", 187 | "nickname": "编程之蛙", 188 | "user_canceled": false, 189 | "original_musician": 190 | { 191 | "digg_count": 0, 192 | "music_count": 0, 193 | "music_used_count": 0 194 | }, 195 | "commerce_user_level": 0, 196 | "watch_status": false, 197 | "enroll_year": "", 198 | "is_binded_weibo": false, 199 | "has_email": false, 200 | "neiguang_shield": 0, 201 | "star_use_new_download": true, 202 | "account_region": "", 203 | "is_discipline_member": false, 204 | "language": "zh-Hans", 205 | "gender": 0, 206 | "need_recommend": 0, 207 | "story_open": false, 208 | "custom_verify": "", 209 | "live_agreement_time": 0, 210 | "is_flowcard_member": false 211 | }, 212 | "extra": 213 | { 214 | "now": 1539965087000 215 | }, 216 | "log_pb": 217 | { 218 | "impr_id": "20181020000447010018046046841408" 219 | }, 220 | "status_code": 0 221 | } 222 | -------------------------------------------------------------------------------- /requirement.txt: -------------------------------------------------------------------------------- 1 | arrow==0.12.1 2 | asks==2.2.0 3 | async-generator==1.10 4 | attrs==18.2.0 5 | contextvars==2.3 6 | docopt==0.6.2 7 | h11==0.8.1 8 | idna==2.7 9 | immutables==0.6 10 | multio==0.2.4 11 | outcome==1.0.0 12 | python-dateutil==2.7.3 13 | six==1.11.0 14 | sniffio==1.0.0 15 | sortedcontainers==2.0.5 16 | trio==0.9.0 17 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Date : 2018-10-21 10:29:28 4 | # @Author : He Liang (heianghit@foxmail.com) 5 | # @Link : https://github.com/HeLiangHIT 6 | 7 | 8 | from setuptools import setup 9 | import codecs, os 10 | 11 | here = os.path.abspath(os.path.dirname(__file__)) 12 | 13 | setup( 14 | name='douyin_downloader', #pypi中的名称,pip或者easy_install安装时使用的名称 15 | version='1.0.4', 16 | py_modules=['util', 'douyin_tool', 'douyin_downloader'], # 需要打包的 Python 单文件列表 17 | url='https://github.com/HeLiangHIT/douyin_downloader', 18 | license='GPLv3', 19 | author='He Liang', 20 | author_email='heianghit@foxmail.com', 21 | keywords="douyin trio", 22 | install_requires=[ # 需要安装的依赖 23 | 'arrow>=0.12.1', 24 | 'asks>=2.2.0', 25 | 'trio>=0.9.0', 26 | ], 27 | # packages = [], # 需要处理的包目录 28 | 29 | description='The douyin video downloader', 30 | long_description='''douyin_downloader 31 | 抖音视频下载器,批量下载自己喜欢过的视频/上传的视频/关注用户发布的视频/关注用户喜欢的视频。 32 | 用法:执行 douyin_downloader 命令,根据提示输入合法参数即可。 33 | ''', 34 | # 添加这个选项,在 windows 下Python目录的 scripts 下生成exe文件,注意:模块与函数之间是冒号: 35 | entry_points={'console_scripts': [ 36 | 'douyin_downloader = douyin_downloader:cmd_run', 37 | ]}, 38 | # 此项需要,否则卸载时报windows error 39 | zip_safe=False, 40 | 41 | classifiers=[ # 程序的所属分类列表 42 | 'Programming Language :: Python :: 3', 43 | 'Development Status :: 3 - Alpha', 44 | 'Natural Language :: English', 45 | 'Environment :: Console', 46 | 'Intended Audience :: Developers', 47 | 'Operating System :: OS Independent', 48 | "Topic :: Utilities", 49 | "License :: OSI Approved :: GNU General Public License (GPL)", 50 | ], 51 | extras_require={}, 52 | ) -------------------------------------------------------------------------------- /util.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Date : 2018-10-17 22:12:00 4 | # @Author : He Liang (heianghit@foxmail.com) 5 | # @Link : https://github.com/HeLiangHIT 6 | 7 | ''' 8 | ref1: https://github.com/AppSign/douyin 抖音通信协议 2.9.1版本协议签名 9 | ref2: https://github.com/hacksman/spider_world 抖音爬虫例子 10 | ''' 11 | 12 | import trio, asks, logging, json, time, os, arrow, socket, random 13 | from contextlib import suppress 14 | asks.init('trio') 15 | 16 | logging.basicConfig(level=logging.INFO, 17 | format='%(asctime)s %(filename)s:%(lineno)d %(threadName)s:%(funcName)s %(levelname)s] %(message)s') 18 | IPHONE_HEADER = {"User-Agent": "Aweme/2.8.0 (iPhone; iOS 11.0; Scale/2.00)"} 19 | CURL_TIMEOUT = 60 20 | DOWNLOAD_TIMEOUT = 600 21 | RETRIES_TIMES = 5 22 | 23 | # 基本配置 24 | _API = "https://api.appsign.vip:2688" 25 | APPINFO = { 26 | "version_code": "2.7.0", 27 | "app_version": "2.7.0", 28 | "channel": "App%20Stroe", 29 | "app_name": "aweme", 30 | "build_number": "27014", 31 | "aid": "1128", 32 | } 33 | ''' 34 | APPINFO = { 35 | "version_code": "2.9.1", 36 | "app_version": "2.9.1", 37 | "channel": "App Stroe", 38 | "app_name": "aweme", 39 | "build_number": "29101", 40 | "aid": "1128", 41 | } 42 | ''' 43 | 44 | 45 | def trim(text, max_len = 50, suffix = '...'): 46 | '''为避免打印的日志过长,可以使用该函数裁剪一下''' 47 | text = text.replace('\n', '') 48 | return f"{text[:max_len]} {suffix}" if len(text) > max_len else text 49 | 50 | def fname_normalize(name, del_char=' /~!@#$%^&*()\\[]}{|?'): 51 | '''规范化文件名称''' 52 | for c in del_char: 53 | name = name.replace(c, '') 54 | return name 55 | 56 | 57 | def params2str(params): 58 | '''拼装请求参数 59 | >>> print(params2str({'a':1, 'b':1})) 60 | a=1&b=1 61 | ''' 62 | return "&".join(["%s=%s" % (k, v) for k, v in params.items()]) 63 | 64 | 65 | def mixString(pwd): 66 | '''混淆手机号码和密码 67 | >>> print(mixString('0123456789abcdeefg')) 68 | 35343736313033323d3c6467666160606362 69 | ''' 70 | return "".join([hex(ord(c) ^ 5)[-2:] for c in pwd]) 71 | 72 | 73 | def user_input(msg, choices=[], default='', retries=3): 74 | '''用户输入验证''' 75 | res = input(msg) 76 | if len(res) == 0: 77 | return default 78 | if choices and res not in choices: 79 | if retries-1 <= 0: 80 | print("Byebye! Stubborn man!") 81 | exit(-1) 82 | print(f'Choose one of {choices}, please!', end=' ') 83 | return user_input(msg, choices, retries-1) 84 | return res 85 | 86 | 87 | class SignUtil(object): 88 | """抖音签名请求专用""" 89 | def __init__(self, version=APPINFO['version_code']): 90 | super(SignUtil, self).__init__() 91 | self.version = version 92 | self.sign = {"expired": arrow.Arrow(2000, 1, 1, 0, 0, 0), "common_params": None, "token":None} 93 | self.s = asks.Session(_API, connections=5) 94 | 95 | async def get_token(self): 96 | '''获取Token: 有效期60分钟 97 | get https://api.appsign.vip:2688/token/douyin -> 98 | { 99 | "token":"5826aa5b56614ea798ca42d767170e74", 100 | "success":true 101 | } 102 | >>> token = trio.run(SignUtil().get_token) # doctest: +ELLIPSIS 103 | >>> print(len(token)) 104 | 32 105 | ''' 106 | url = f"{_API}/token/douyin/version/{self.version}" if self.version else f"{_API}/token/douyin" 107 | resp = await self.s.get(url, verify=False) 108 | logging.debug(f"get response from {url} is {resp} with body: {trim(resp.text)}") 109 | return resp.json().get('token', '') 110 | 111 | async def get_device(self): 112 | '''获取新的设备信息:有效期60分钟永久 113 | get https://api.appsign.vip:2688/douyin/device/new -> 114 | { 115 | "data":{ 116 | "os_api":"23", 117 | "screen_width":"1334", 118 | "vid":"39******-ABCD-DA1D-C2C5-******995D7", 119 | "os_version":"11.0", 120 | "new_user":1, 121 | "install_id":4286******3, 122 | "iid":***********, 123 | "idfa":"95******-87D6-F152-04F1-88B******418", 124 | "device_type":"iPhone8.1", 125 | "device_platform":"iphone", 126 | "openudid":"b9f9a7c2c9******45c9aafec7b******24cc6", 127 | "device_id":57000****** 128 | }, 129 | "success":true 130 | } 131 | >>> device = trio.run(SignUtil().get_device) # doctest: +ELLIPSIS 132 | >>> print(device['device_type']) 133 | iPhone8,1 134 | ''' 135 | url = f"{_API}/douyin/device/new/version/{self.version}" if self.version else "{_API}/douyin/device/new" 136 | resp = await self.s.get(url, verify=False) 137 | logging.debug(f"get response from {url} is {resp} with body: {trim(resp.text)}") 138 | return resp.json().get('data', {}) 139 | 140 | async def get_sign(self, token, query): 141 | '''使用拼装参数签名 142 | post https://api.appsign.vip:2688/sign --> 143 | { 144 | "token":"TOKEN", 145 | "query":"通过参数生成的加签字符串" 146 | } 147 | >>> data, res = trio.run(SignUtil().get_sign, 'aaa', {"aaa":"aaa"}) 148 | >>> print(res) 149 | {'success': False, 'error': 'token is error'} 150 | ''' 151 | assert isinstance(query, dict) 152 | url = f"{_API}/sign" 153 | resp = await self.s.post(url, json={"token": token, "query": params2str(query)}, verify=False) 154 | logging.debug(f"post response from {url} is {resp} with body: {trim(resp.text)}") 155 | return resp.json().get('data', {}), resp.json() 156 | 157 | async def get_sign_params(self, force=False): 158 | '''获取可用的签名参数,由于每次获取后的有效时间是大概60分钟, 159 | 因此此处维护一个带时间戳的字典,如果超过 55min 则重新生成,否则就不重新生成,除非强制刷新''' 160 | if not force and self.sign['expired'] > arrow.utcnow(): 161 | return self.sign['common_params'], self.sign['token'] 162 | 163 | device = await self.get_device() 164 | common_params = {** device, ** APPINFO} 165 | token = await self.get_token() 166 | logging.debug(f"new sign params generated, last time is {self.sign['expired']}") 167 | 168 | self.sign = { 169 | "expired" : arrow.utcnow().shift(minutes=5), # 实测貌似很快就失效了 170 | "common_params" : common_params, 171 | "token" : token 172 | } 173 | return self.sign['common_params'], self.sign['token'] 174 | 175 | async def get_signed_params(self, params, force = False): 176 | '''给请求 params 签名''' 177 | assert isinstance(params, dict) 178 | common_params, token = await self.get_sign_params(force) 179 | query_params = {**params, ** common_params} 180 | signed, _ = await self.get_sign(token, query_params) 181 | return {**query_params, **signed} 182 | 183 | async def curl(self, url, params, data=None, headers=IPHONE_HEADER, method='GET', retries=2, timeout=CURL_TIMEOUT): 184 | '''抖音的签名请求函数''' 185 | if retries <= 0: 186 | logging.error(f"curl {url} with method={method} failed, return None!") 187 | return None 188 | try: 189 | s_params = await self.get_signed_params(params) 190 | if method.upper() == 'GET': 191 | resp = await self.s.get(url, params=s_params, data=data, headers=IPHONE_HEADER, verify=False, timeout=timeout) 192 | elif method.upper() == 'POST': 193 | resp = await self.s.post(url, params=s_params, data=data, headers=IPHONE_HEADER, verify=False, timeout=timeout) 194 | else: 195 | logging.error(f"undefined method={method} for url={url}") 196 | return None 197 | logging.debug(f"curl response from {url} is {resp} with body: {trim(resp.text)}") 198 | return resp 199 | except Exception as e: 200 | logging.warning(f"curl {url} with method={method} failed, retry with new signed params!") 201 | await self.get_sign_params(True) # force fresh self.sign 202 | self.s = asks.Session(_API, connections=5) # restart session 203 | return await self.curl(url, params, data, headers, method, retries-1) 204 | 205 | 206 | # 异步下载/保存器 207 | class AsyncDownloader(object): 208 | def __init__(self, save_dir): 209 | super(AsyncDownloader, self).__init__() 210 | self.save_dir = save_dir 211 | if not os.path.exists(save_dir): 212 | os.makedirs(save_dir) 213 | 214 | async def download_file(self, url, headers=IPHONE_HEADER, timeout=DOWNLOAD_TIMEOUT, res_time=RETRIES_TIMES): 215 | if res_time <= 0: # 重试超过了次数 216 | return None 217 | try: 218 | _url = random.choice(url) if isinstance(url, list) else url 219 | res = await asks.get(_url, headers=headers, timeout=timeout, retries=3) 220 | except (socket.gaierror, trio.BrokenResourceError, trio.TooSlowError, asks.errors.RequestTimeout) as e: 221 | logging.error("download from %s fail]err=%s!" % (url, e)) 222 | await trio.sleep(random.randint(1, 5)) # for scheduler 223 | return await self.download_file(url, res_time=res_time-1) 224 | 225 | if res.status_code not in [200, 202]: 226 | logging.warn(f"download from {url} fail]response={res}") 227 | await trio.sleep(random.randint(3, 10)) 228 | return await self.download_file(url, res_time=res_time-1) 229 | return res.content 230 | 231 | def is_file_downloaded(self, name): 232 | file_path = os.path.join(self.save_dir, fname_normalize(name)) 233 | return os.path.exists(file_path) 234 | 235 | # 异步文件保存 236 | async def save_file(self, name, content): 237 | file_path = os.path.join(self.save_dir, fname_normalize(name)) 238 | with suppress(OSError): 239 | fd = await trio.open_file(file_path, 'wb') 240 | await fd.write(content) 241 | await fd.aclose() 242 | 243 | 244 | 245 | 246 | if __name__ == '__main__': 247 | import doctest 248 | doctest.testmod(verbose=False) # verbose=True shows the output 249 | logging.info("doctest finished.") 250 | 251 | 252 | 253 | 254 | 255 | --------------------------------------------------------------------------------