├── .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 | 
83 | 
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 |
--------------------------------------------------------------------------------