You've already forked XiguaLiveDanmakuHelper
Compare commits
234 Commits
v0.1.3-alp
...
v0.0.3c
Author | SHA1 | Date | |
---|---|---|---|
7893bb0cd5 | |||
0add87dfa8 | |||
4ef018a34b | |||
7102a45382 | |||
27e5224b6c | |||
d9d0778834 | |||
e36eec9dac | |||
81dbc119da | |||
cf5913e281 | |||
bb5fa72f50 | |||
6a2288a45d | |||
ee9556548d | |||
107309c043 | |||
d0b630262f | |||
ce23a67b59 | |||
7586432907 | |||
5351641144 | |||
f971380b5f | |||
cae988e0fe | |||
ff53afffb5 | |||
8f1893fdb1 | |||
5c0ed5e13f | |||
d327a230b2 | |||
560baf1b01 | |||
d3cce09a7a | |||
a3fec20b52 | |||
c4e2d8ee14 | |||
452e1da468 | |||
3096f742d5 | |||
58991a8c43 | |||
f598a5da05 | |||
372953b3e0 | |||
37fdd0fa9a | |||
2d6a723be0 | |||
3cd2db8f7b | |||
28ed1df26b | |||
608f6924e3 | |||
e8b981e7df | |||
d742edaff4 | |||
0e37230f69 | |||
a14d1361bb | |||
4da7e0c85d | |||
a3b9f52684 | |||
e402595a75 | |||
b15428af21 | |||
e1eaf45e58 | |||
d5f7306e59 | |||
de8cda6846 | |||
637046c4ef | |||
96c68dc608 | |||
fb25a21c4c | |||
c8198bf246 | |||
f0f3316714 | |||
cd03b04cf7 | |||
e3fa5d9de0 | |||
8520a36be2 | |||
65be98f6b8 | |||
53bda4d853 | |||
1c7840c10d | |||
96fc50498c | |||
6acc94b7c5 | |||
ca7dc40b03 | |||
f96dd9448b | |||
9fb552e6dc | |||
9b2f1a744f | |||
172e82ba54 | |||
2b0adbb81a | |||
83af0df5d4 | |||
f80a44f1ac | |||
f8a602e6a3 | |||
adc6e10df1 | |||
64fbe010ef | |||
204d8342bb | |||
0fc33fccff | |||
cf169021c6 | |||
a307760dcc | |||
ae08a4398a | |||
f6501ca698 | |||
3be383c750 | |||
6536acb10e | |||
586ef37874 | |||
8f20250dee | |||
b9d9a8c435 | |||
2554b537e8 | |||
a0824785e5 | |||
f25aac1fd9 | |||
325e781758 | |||
997fa950fd | |||
081649ab58 | |||
71e6f829c5 | |||
9e78994c03 | |||
359b4b43c7 | |||
e1c9beb872 | |||
add5a4654c | |||
95565c33ec | |||
3e3881022e | |||
76f280172b | |||
182c97fb84 | |||
ee7ddbb1de | |||
0cb3987380 | |||
567bf5f002 | |||
fecd35844f | |||
b4559f6771 | |||
708218d34a | |||
a3d9e17a71 | |||
89e9410810 | |||
a6aafd0ef2 | |||
6f1563cfb6 | |||
f5971c8429 | |||
1677afd975 | |||
22925398da | |||
f1615957bc | |||
b61bd4c70c | |||
f4bc6d847d | |||
c1141c366a | |||
ef0fe2cb04 | |||
46b3500faa | |||
1f07e1046c | |||
251c1e53fc | |||
84a283b4c2 | |||
4389016b95 | |||
f1b4a878a5 | |||
43e161ebb6 | |||
ed3ab5dc4f | |||
2099321f0b | |||
4ea19b4ff4 | |||
1644f52eb0 | |||
f607f11b82 | |||
c4c6b1a752 | |||
99926827f1 | |||
03ce8df291 | |||
5c1f712900 | |||
d17d0bd534 | |||
e520e39b72 | |||
b3162b1ed5 | |||
69b594cf8e | |||
86e4aa483f | |||
17d2cc4ebd | |||
1ec9f3c922 | |||
9f075077ba | |||
ba40134219 | |||
1ca7226cfe | |||
e50ca2fd5a | |||
a9ecd1e7ab | |||
987c7aef01 | |||
21009f6b51 | |||
035e71185a | |||
2a51593cc3 | |||
b813129410 | |||
6c02b965b0 | |||
e77fa5d6ad | |||
e066048e9f | |||
612a9185eb | |||
a6fa88b981 | |||
a6662450de | |||
86fbf31120 | |||
ef7d4c8d3e | |||
9f999c013e | |||
78fe5582e6 | |||
14430e79ef | |||
5e3f9e9aee | |||
b55686d095 | |||
c3a965f284 | |||
99d148666e | |||
be1a1df00b | |||
ce819185eb | |||
16c68e5ceb | |||
5fa4ee929e | |||
00190468a8 | |||
b9b0994f4c | |||
f8d4be5385 | |||
90f6e8e1cb | |||
3c872b0484 | |||
5f949ccf34 | |||
2750c9d25b | |||
6842961d42 | |||
c89f84a44f | |||
5ee60d3dc7 | |||
4c25ea3410 | |||
6cbaa384dc | |||
c9c962f646 | |||
4d54e3dd6d | |||
dd08229ff1 | |||
11161c4b71 | |||
07d42c558a | |||
bf8d3b48cb | |||
80ac42075e | |||
9a3d3bd048 | |||
9a74b2b6e5 | |||
9316b1e855 | |||
054c143e66 | |||
041580e1ab | |||
73d1dc6cf2 | |||
7692757091 | |||
426f4d6273 | |||
4c9d04f175 | |||
7bc0b85ae5 | |||
179b808de6 | |||
19d48ed324 | |||
d1124a9370 | |||
d9627a3ced | |||
1e039fb1c9 | |||
bfbbe06cd2 | |||
767b4728b5 | |||
dee41be85d | |||
1e1654a4b8 | |||
b9b24fe7c6 | |||
216c9085c1 | |||
0fd44117ec | |||
ed718fa438 | |||
8a61170fbf | |||
fa7a9bc102 | |||
35d97a77b1 | |||
48eccd68c5 | |||
362f5c51d3 | |||
0219d5d1aa | |||
530522f51c | |||
b8b793e292 | |||
e4fef3df33 | |||
54fa20c4f7 | |||
89edd10dc2 | |||
ebe01566c0 | |||
a0f76eb00b | |||
f81c2811ce | |||
c12d8cf4bb | |||
77d7f35d25 | |||
84ca4d0a62 | |||
4a59cbcf82 | |||
1b920fa55c | |||
81f730ea68 | |||
a1cfc9b914 | |||
81763fdf37 | |||
884122b007 | |||
8c0320c97e |
181
.gitignore
vendored
Normal file
181
.gitignore
vendored
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
### Python template
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# celery beat schedule file
|
||||||
|
celerybeat-schedule
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
### JetBrains template
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
.idea/httpRequests
|
||||||
|
### VirtualEnv template
|
||||||
|
# Virtualenv
|
||||||
|
# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
|
||||||
|
.Python
|
||||||
|
[Bb]in
|
||||||
|
[Ii]nclude
|
||||||
|
[Ll]ib
|
||||||
|
[Ll]ib64
|
||||||
|
[Ll]ocal
|
||||||
|
[Ss]cripts
|
||||||
|
pyvenv.cfg
|
||||||
|
.venv
|
||||||
|
pip-selfcheck.json
|
||||||
|
|
23
Chat.py
23
Chat.py
@ -1,23 +0,0 @@
|
|||||||
from User import User
|
|
||||||
|
|
||||||
class Chat:
|
|
||||||
|
|
||||||
content: str =""
|
|
||||||
user: User=None
|
|
||||||
|
|
||||||
def __init__(self, json=None):
|
|
||||||
if json:
|
|
||||||
self.parse(json)
|
|
||||||
|
|
||||||
def parse(self, json):
|
|
||||||
self.user = User(json)
|
|
||||||
if "extra" in json:
|
|
||||||
if "content" in json["extra"]:
|
|
||||||
self.content = json["extra"]['content']
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return "{} : {}".format(self.user,self.content)
|
|
||||||
|
|
||||||
def __unicode__(self):
|
|
||||||
return self.__str__()
|
|
||||||
|
|
1
Demo/256_.json
Executable file
1
Demo/256_.json
Executable file
File diff suppressed because one or more lines are too long
BIN
Demo/324_.txt
Normal file
BIN
Demo/324_.txt
Normal file
Binary file not shown.
15
Demo/Xigua.proto
Executable file
15
Demo/Xigua.proto
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
message XiguaLive {
|
||||||
|
message Data {
|
||||||
|
// WebcastChatMessage 聊天
|
||||||
|
// WebcastGiftMessage 礼物
|
||||||
|
required string method = 1;
|
||||||
|
required bytes raw = 2;
|
||||||
|
}
|
||||||
|
repeated Data data = 1;
|
||||||
|
required string cursor = 2;
|
||||||
|
optional int32 fetch_interval = 3;
|
||||||
|
optional int32 now = 4;
|
||||||
|
required string internal_ext = 5;
|
||||||
|
}
|
10
Demo/XiguaGift.proto
Normal file
10
Demo/XiguaGift.proto
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
syntax = "proto2";
|
||||||
|
// 礼物
|
||||||
|
message Gift {
|
||||||
|
required string id = 1;
|
||||||
|
required string name = 2;
|
||||||
|
}
|
||||||
|
message GiftPack {
|
||||||
|
required int32 id = 1;
|
||||||
|
required Gift gift = 2;
|
||||||
|
}
|
89
Demo/XiguaMessage.proto
Normal file
89
Demo/XiguaMessage.proto
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
syntax = "proto2";
|
||||||
|
import "XiguaUser.proto";
|
||||||
|
import "XiguaGift.proto";
|
||||||
|
message Message {
|
||||||
|
required CommonInfo commonInfo = 1;
|
||||||
|
}
|
||||||
|
message FansClubMessage {
|
||||||
|
required CommonInfo commonInfo = 1;
|
||||||
|
// 升级是1,加入是2
|
||||||
|
required int32 type = 2;
|
||||||
|
// 提示文字
|
||||||
|
required string content = 3;
|
||||||
|
required User user = 4;
|
||||||
|
}
|
||||||
|
message FansClubStatsMessage {
|
||||||
|
required CommonInfo commonInfo = 1;
|
||||||
|
required string title = 2;
|
||||||
|
required int32 count = 3;
|
||||||
|
}
|
||||||
|
message UserSeqMessage {
|
||||||
|
required CommonInfo commonInfo = 1;
|
||||||
|
required string popularityText = 4;
|
||||||
|
required int32 popularity = 6;
|
||||||
|
}
|
||||||
|
message DailyRankMessage {
|
||||||
|
required CommonInfo commonInfo = 1;
|
||||||
|
required int32 ranking = 10;
|
||||||
|
}
|
||||||
|
message ChatMessage {
|
||||||
|
required CommonInfo commonInfo = 1;
|
||||||
|
required User user = 2;
|
||||||
|
required string content = 3;
|
||||||
|
}
|
||||||
|
message MemberMessage {
|
||||||
|
required CommonInfo commonInfo = 1;
|
||||||
|
required User user = 2;
|
||||||
|
required string popularityText = 14;
|
||||||
|
}
|
||||||
|
message GiftMessage {
|
||||||
|
required CommonInfo commonInfo = 1;
|
||||||
|
required int32 giftId = 2;
|
||||||
|
// 可能是GroupId之类的东西
|
||||||
|
// required int32 UNKNOWN_INT = 3;
|
||||||
|
required int32 content4 = 4;
|
||||||
|
required int32 repeated = 5;
|
||||||
|
required int32 combo = 6;
|
||||||
|
optional User user = 7;
|
||||||
|
// 是否发完了,注:不可连击的也是没有发完的
|
||||||
|
optional bool isFinished = 9 [ default = false ];
|
||||||
|
}
|
||||||
|
message SocialMessage {
|
||||||
|
required CommonInfo commonInfo = 1;
|
||||||
|
required User user = 2;
|
||||||
|
required int32 int4 = 4;
|
||||||
|
required int32 fansCount = 6;
|
||||||
|
}
|
||||||
|
// 样式
|
||||||
|
message Style {
|
||||||
|
optional string color = 1;
|
||||||
|
optional int32 fontWeight = 4;
|
||||||
|
}
|
||||||
|
// 参数
|
||||||
|
message Params {
|
||||||
|
// 1 字符串
|
||||||
|
// 11 用户
|
||||||
|
// 12 礼物
|
||||||
|
required int32 type = 1;
|
||||||
|
optional Style style = 2;
|
||||||
|
optional string string = 11;
|
||||||
|
optional UserPack users = 21;
|
||||||
|
optional GiftPack gifts = 22;
|
||||||
|
}
|
||||||
|
// 自定义显示信息
|
||||||
|
message DisplayText {
|
||||||
|
// 参数
|
||||||
|
required string method = 1;
|
||||||
|
required string format = 2;
|
||||||
|
optional Style bgStyle = 3;
|
||||||
|
required Params params = 4;
|
||||||
|
}
|
||||||
|
// 通用定义
|
||||||
|
message CommonInfo {
|
||||||
|
required string method = 1;
|
||||||
|
required int32 msg_id = 2;
|
||||||
|
required int32 room_id = 3;
|
||||||
|
required int32 create_time = 4;
|
||||||
|
optional int32 someEnum = 6;
|
||||||
|
optional DisplayText displayText = 8;
|
||||||
|
}
|
81
Demo/XiguaUser.proto
Normal file
81
Demo/XiguaUser.proto
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
message UserPack {
|
||||||
|
required User user = 1;
|
||||||
|
}
|
||||||
|
// 头衔
|
||||||
|
message Badge {
|
||||||
|
message FanClubText {
|
||||||
|
required string text = 1;
|
||||||
|
optional string color = 2;
|
||||||
|
required int32 level = 3;
|
||||||
|
}
|
||||||
|
repeated string url = 1;
|
||||||
|
// optional string localUrl = 2;
|
||||||
|
optional int32 height = 3;
|
||||||
|
optional int32 width = 4;
|
||||||
|
// 3 房管
|
||||||
|
// 6 贵族
|
||||||
|
// 7 粉丝团
|
||||||
|
optional int32 type = 6;
|
||||||
|
optional string clickTo = 7;
|
||||||
|
optional FanClubText fanClubText = 8;
|
||||||
|
}
|
||||||
|
message FansClubPack {
|
||||||
|
message FansClub {
|
||||||
|
required string title = 1 [default = ''];
|
||||||
|
required int32 level = 2 [default = 0];
|
||||||
|
optional int32 someEnum = 3;
|
||||||
|
}
|
||||||
|
required FansClub fansClub = 1;
|
||||||
|
}
|
||||||
|
// 用户信息
|
||||||
|
message User {
|
||||||
|
// 头像
|
||||||
|
message Avatar {
|
||||||
|
required string url = 1;
|
||||||
|
optional string id = 2;
|
||||||
|
}
|
||||||
|
// 粉丝和粉
|
||||||
|
message Follow {
|
||||||
|
optional int32 following = 1 [default = 0];
|
||||||
|
optional int32 follower = 2 [default = 0];
|
||||||
|
}
|
||||||
|
// 花钱等级
|
||||||
|
message PayGrade {
|
||||||
|
required int32 current = 1;
|
||||||
|
required int32 level = 6;
|
||||||
|
optional int32 currentLevelNeed = 10;
|
||||||
|
optional int32 nextLevelNeed = 11;
|
||||||
|
optional string content = 13;
|
||||||
|
required Badge badge = 19;
|
||||||
|
optional int32 toNextLevelNeed = 21;
|
||||||
|
}
|
||||||
|
// 荣誉等级
|
||||||
|
message HonorLevel {
|
||||||
|
required Badge badge = 19;
|
||||||
|
}
|
||||||
|
// 贵族
|
||||||
|
message Noble {
|
||||||
|
message NobleBoarder {
|
||||||
|
repeated string urlList = 1;
|
||||||
|
required string uri = 2;
|
||||||
|
optional int32 height = 3;
|
||||||
|
optional int32 width = 4;
|
||||||
|
}
|
||||||
|
required string content = 4;
|
||||||
|
optional NobleBoarder boarder = 8;
|
||||||
|
}
|
||||||
|
required int64 id = 1;
|
||||||
|
required string nickname = 3;
|
||||||
|
required int32 gender = 4;
|
||||||
|
// 这个顺序可能有点迷,不是很清楚
|
||||||
|
required Avatar avatarThumb = 9;
|
||||||
|
optional Avatar avatarMedium = 10;
|
||||||
|
optional Avatar avatarLarge = 11;
|
||||||
|
repeated Badge badge = 21;
|
||||||
|
optional Follow follow = 22;
|
||||||
|
required PayGrade payGrade = 23;
|
||||||
|
required FansClubPack fansClub = 24;
|
||||||
|
required int32 totalPaid = 34;
|
||||||
|
}
|
BIN
Demo/a.txt
Normal file
BIN
Demo/a.txt
Normal file
Binary file not shown.
BIN
Demo/fst.txt
Normal file
BIN
Demo/fst.txt
Normal file
Binary file not shown.
997
Demo/guanzhu.txt
Normal file
997
Demo/guanzhu.txt
Normal file
@ -0,0 +1,997 @@
|
|||||||
|
1 {
|
||||||
|
1: "WebcastGiftMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastGiftMessage"
|
||||||
|
2: 6787717978657360643
|
||||||
|
3: 6787691314156276488
|
||||||
|
4: 1580388803763
|
||||||
|
6: 1
|
||||||
|
8 {
|
||||||
|
1: "webcast_xigua_gift_message"
|
||||||
|
2: "{0:user} \351\200\201\347\273\231\344\270\273\346\222\255{2:string}\344\270\252{1:gift}"
|
||||||
|
3 {
|
||||||
|
1: "#ffff9d5c"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#ffffd600"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 105855829073
|
||||||
|
3: "\345\260\217\350\234\234\346\237\240\346\252\254\350\214\266"
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
10 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
11 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
15: 1
|
||||||
|
21 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 2
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
1: 62
|
||||||
|
6: 5
|
||||||
|
10: 51
|
||||||
|
11: 99
|
||||||
|
13: "\350\267\235\347\246\2736\347\272\247\350\277\230\345\267\25638\351\222\273\347\237\263"
|
||||||
|
19 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21: 38
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: 14
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\346\260\270\346\201\222"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
34: 62
|
||||||
|
37: 1
|
||||||
|
38: "0"
|
||||||
|
44: ""
|
||||||
|
46: "MS4wLjABAAAAd4R7mC-c8FCTjCqTIhJ0CoydF_FMweyatdS66xud0hY"
|
||||||
|
48: ""
|
||||||
|
1028: "105855829073"
|
||||||
|
}
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 12
|
||||||
|
2 {
|
||||||
|
1: "#ffff9d5c"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 10001
|
||||||
|
2 {
|
||||||
|
1: "live_gift_10001"
|
||||||
|
2: "\350\245\277\347\223\234"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 1
|
||||||
|
2 {
|
||||||
|
1: "#ffff9d5c"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
11: "18"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: 10001
|
||||||
|
3: 4997044
|
||||||
|
4: 1
|
||||||
|
5: 18
|
||||||
|
6: 18
|
||||||
|
7 {
|
||||||
|
1: 105855829073
|
||||||
|
3: "\345\260\217\350\234\234\346\237\240\346\252\254\350\214\266"
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
10 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
11 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
15: 1
|
||||||
|
21 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 2
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
1: 62
|
||||||
|
6: 5
|
||||||
|
10: 51
|
||||||
|
11: 99
|
||||||
|
13: "\350\267\235\347\246\2736\347\272\247\350\277\230\345\267\25638\351\222\273\347\237\263"
|
||||||
|
19 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21: 38
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: 14
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\346\260\270\346\201\222"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
34: 62
|
||||||
|
37: 1
|
||||||
|
38: "0"
|
||||||
|
44: ""
|
||||||
|
46: "MS4wLjABAAAAd4R7mC-c8FCTjCqTIhJ0CoydF_FMweyatdS66xud0hY"
|
||||||
|
48: ""
|
||||||
|
1028: "105855829073"
|
||||||
|
}
|
||||||
|
11: 1580388797
|
||||||
|
12: 7453182
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastSocialMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastSocialMessage"
|
||||||
|
2: 6787718225754295054
|
||||||
|
3: 6787691314156276488
|
||||||
|
4: 1580388803802
|
||||||
|
6: 1
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 111036833136
|
||||||
|
3: "\347\224\250\346\210\2679627521617519"
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/3796/2975850990~120x256.image"
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 1
|
||||||
|
2: 19
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
19: ""
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 0
|
||||||
|
2: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAApZHNJdD-IbL7CES631w87jSXrSyXZfqETb-HYnYx6Ug"
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
4: 1
|
||||||
|
6: 169079
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastGiftMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastGiftMessage"
|
||||||
|
2: 6787718023417531148
|
||||||
|
3: 6787691314156276488
|
||||||
|
4: 1580388804048
|
||||||
|
6: 1
|
||||||
|
8 {
|
||||||
|
1: "webcast_xigua_gift_message"
|
||||||
|
2: "{0:user} \351\200\201\347\273\231\344\270\273\346\222\255{2:string}\344\270\252{1:gift}"
|
||||||
|
3 {
|
||||||
|
1: "#ffff9d5c"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#ffffd600"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 105855829073
|
||||||
|
3: "\345\260\217\350\234\234\346\237\240\346\252\254\350\214\266"
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
10 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
11 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
15: 1
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 2
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
1: 62
|
||||||
|
6: 5
|
||||||
|
10: 51
|
||||||
|
11: 99
|
||||||
|
13: "\350\267\235\347\246\2736\347\272\247\350\277\230\345\267\25638\351\222\273\347\237\263"
|
||||||
|
19 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21: 38
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: 14
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\346\260\270\346\201\222"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
34: 62
|
||||||
|
37: 1
|
||||||
|
38: "0"
|
||||||
|
44: ""
|
||||||
|
46: "MS4wLjABAAAAd4R7mC-c8FCTjCqTIhJ0CoydF_FMweyatdS66xud0hY"
|
||||||
|
48: ""
|
||||||
|
1028: "105855829073"
|
||||||
|
}
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 12
|
||||||
|
2 {
|
||||||
|
1: "#ffff9d5c"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 10001
|
||||||
|
2 {
|
||||||
|
1: "live_gift_10001"
|
||||||
|
2: "\350\245\277\347\223\234"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 1
|
||||||
|
2 {
|
||||||
|
1: "#ffff9d5c"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
11: "19"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: 10001
|
||||||
|
3: 4997044
|
||||||
|
4: 1
|
||||||
|
5: 19
|
||||||
|
6: 19
|
||||||
|
7 {
|
||||||
|
1: 105855829073
|
||||||
|
3: "\345\260\217\350\234\234\346\237\240\346\252\254\350\214\266"
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
10 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
11 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
15: 1
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 2
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
1: 62
|
||||||
|
6: 5
|
||||||
|
10: 51
|
||||||
|
11: 99
|
||||||
|
13: "\350\267\235\347\246\2736\347\272\247\350\277\230\345\267\25638\351\222\273\347\237\263"
|
||||||
|
19 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21: 38
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: 14
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\346\260\270\346\201\222"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
34: 62
|
||||||
|
37: 1
|
||||||
|
38: "0"
|
||||||
|
44: ""
|
||||||
|
46: "MS4wLjABAAAAd4R7mC-c8FCTjCqTIhJ0CoydF_FMweyatdS66xud0hY"
|
||||||
|
48: ""
|
||||||
|
1028: "105855829073"
|
||||||
|
}
|
||||||
|
11: 1580388797
|
||||||
|
12: 7453182
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastRoomUserSeqMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastRoomUserSeqMessage"
|
||||||
|
2: 6787718227533761294
|
||||||
|
3: 6787691314156276488
|
||||||
|
4: 1580388804226
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 9999
|
||||||
|
2 {
|
||||||
|
1: 4719119436
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/6368/3857576856~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 1
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 9998
|
||||||
|
2 {
|
||||||
|
1: 60374191432
|
||||||
|
2: 259345
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/da99000fd41edfb7daa6~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 2
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 1699
|
||||||
|
2 {
|
||||||
|
1: 3544417251634206
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/830d7e15f45946aa9b757a500cc6dcbe~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 3
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 1099
|
||||||
|
2 {
|
||||||
|
1: 4261353838881501
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/c24df9dffd6d45929c227c5da22fe406~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 4
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 520
|
||||||
|
2 {
|
||||||
|
1: 2933125236921479
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/2e1c9d64f34a4a3e8a326fe5394659fd~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 5
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 300
|
||||||
|
2 {
|
||||||
|
1: 3927095572170669
|
||||||
|
9 {
|
||||||
|
1: "http://p1-xg.bytecdn.cn/thumb/daaa001914e0039994ae"
|
||||||
|
2: "daaa001914e0039994ae"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 6
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 120
|
||||||
|
2 {
|
||||||
|
1: 153552343543981
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/3795/3033762272~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 7
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 99
|
||||||
|
2 {
|
||||||
|
1: 1732418933370259
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/5941f17833524bfa9316a648c39c990f~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 8
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 99
|
||||||
|
2 {
|
||||||
|
1: 104372509299
|
||||||
|
9 {
|
||||||
|
1: "http://p1-xg.bytecdn.cn/thumb/da920004cd041ec12061"
|
||||||
|
2: "da920004cd041ec12061"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 9
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 60
|
||||||
|
2 {
|
||||||
|
1: 60518722952
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/0f9162a614bd474f9fbda57614a0c9f1~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 10
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 30
|
||||||
|
2 {
|
||||||
|
1: 1261881879167767
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3795/3044413937~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 11
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 22
|
||||||
|
2 {
|
||||||
|
1: 1173933315333736
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/a181c0707ff540aba16f43af049a3791~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 12
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 20
|
||||||
|
2 {
|
||||||
|
1: 3949047076102647
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/187afa353816402cb827e9fae386ca2a~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 13
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: 65771610619
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/3793/3131589739~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 99827340042
|
||||||
|
9 {
|
||||||
|
1: "http://p1-xg.bytecdn.cn/thumb/da74000192436fc5db6e"
|
||||||
|
2: "da74000192436fc5db6e"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 15
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 99482502045
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/3793/3114521287~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 16
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 98103952579
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/3793/3131589739~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 17
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 9746464842
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/6ad34237256e4471b16810eb098224c0~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 18
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 97221408269
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/3793/3131589739~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 19
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 971618215795604
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3797/2889309425~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 20
|
||||||
|
}
|
||||||
|
3: 461
|
||||||
|
4: "15\344\270\207\344\272\272\346\260\224"
|
||||||
|
6: 158310
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastGiftMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastGiftMessage"
|
||||||
|
2: 6787717971278351115
|
||||||
|
3: 6787691314156276488
|
||||||
|
4: 1580388804414
|
||||||
|
6: 1
|
||||||
|
8 {
|
||||||
|
1: "webcast_xigua_gift_message"
|
||||||
|
2: "{0:user} \351\200\201\347\273\231\344\270\273\346\222\255{2:string}\344\270\252{1:gift}"
|
||||||
|
3 {
|
||||||
|
1: "#ffff9d5c"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#ffffd600"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 105855829073
|
||||||
|
3: "\345\260\217\350\234\234\346\237\240\346\252\254\350\214\266"
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
10 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
11 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
15: 1
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 2
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
1: 62
|
||||||
|
6: 5
|
||||||
|
10: 51
|
||||||
|
11: 99
|
||||||
|
13: "\350\267\235\347\246\2736\347\272\247\350\277\230\345\267\25638\351\222\273\347\237\263"
|
||||||
|
19 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21: 38
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: 14
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\346\260\270\346\201\222"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
34: 62
|
||||||
|
37: 1
|
||||||
|
38: "0"
|
||||||
|
44: ""
|
||||||
|
46: "MS4wLjABAAAAd4R7mC-c8FCTjCqTIhJ0CoydF_FMweyatdS66xud0hY"
|
||||||
|
48: ""
|
||||||
|
1028: "105855829073"
|
||||||
|
}
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 12
|
||||||
|
2 {
|
||||||
|
1: "#ffff9d5c"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 10001
|
||||||
|
2 {
|
||||||
|
1: "live_gift_10001"
|
||||||
|
2: "\350\245\277\347\223\234"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 1
|
||||||
|
2 {
|
||||||
|
1: "#ffff9d5c"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
11: "20"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: 10001
|
||||||
|
3: 4997044
|
||||||
|
4: 1
|
||||||
|
5: 20
|
||||||
|
6: 20
|
||||||
|
7 {
|
||||||
|
1: 105855829073
|
||||||
|
3: "\345\260\217\350\234\234\346\237\240\346\252\254\350\214\266"
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
10 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
11 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3791/5070639578~120x256.image"
|
||||||
|
}
|
||||||
|
15: 1
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 2
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
1: 62
|
||||||
|
6: 5
|
||||||
|
10: 51
|
||||||
|
11: 99
|
||||||
|
13: "\350\267\235\347\246\2736\347\272\247\350\277\230\345\267\25638\351\222\273\347\237\263"
|
||||||
|
19 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21: 38
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: 14
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\346\260\270\346\201\222"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
34: 62
|
||||||
|
37: 1
|
||||||
|
38: "0"
|
||||||
|
44: ""
|
||||||
|
46: "MS4wLjABAAAAd4R7mC-c8FCTjCqTIhJ0CoydF_FMweyatdS66xud0hY"
|
||||||
|
48: ""
|
||||||
|
1028: "105855829073"
|
||||||
|
}
|
||||||
|
11: 1580388797
|
||||||
|
12: 7453184
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "6787717971278351115_1580388804554_6787718002764073739_1"
|
||||||
|
3: 1000
|
||||||
|
4: 1580388804554
|
||||||
|
5: "fetch_time:1580388804554|start_time:1580388804048|ack_ids:6787718023417531148_1b2|fetch_id:6787718004823608078|flag:1|seq:141"
|
165
Demo/jingyan.txt
Normal file
165
Demo/jingyan.txt
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2: 6787727734057011981
|
||||||
|
3: 6787691314156276488
|
||||||
|
6: 1
|
||||||
|
8 {
|
||||||
|
1: "member_silence_toast_3"
|
||||||
|
2: "{0:user} \350\242\253\347\256\241\347\220\206\345\221\230 {1:user} \347\246\201\350\250\200\344\272\206"
|
||||||
|
3 {
|
||||||
|
1: "#de000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#61000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 53536270159
|
||||||
|
3: "\350\243\244\350\243\206\351\207\214\347\232\204\345\244\247\345\256\235\345\211\221"
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAtH9p-LupXO1oQVJtlefmpryPoXqWzKs3_Nad9BlAREA"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#61000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 2721997823950523
|
||||||
|
3: "\350\257\267\345\217\253\346\210\221\347\226\257\345\255\220\345\205\255"
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAA1KKMtPQlRg_wecgX0G2Wl-ZIcWe-Yos95-IBwF1AzhSYzL5-zXCa4lciHj2HZho5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 53536270159
|
||||||
|
3: "\350\243\244\350\243\206\351\207\214\347\232\204\345\244\247\345\256\235\345\211\221"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://p3-xg.bytecdn.cn/thumb/1bf40000bd6dc5335b2d"
|
||||||
|
2: "1bf40000bd6dc5335b2d"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_9.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_7.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_7.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_7.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_7.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 7
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 1
|
||||||
|
2: 17
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
6: 9
|
||||||
|
19 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_9.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\346\260\270\346\201\222"
|
||||||
|
2: 7
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_7.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_7.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_7.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_7.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\346\260\270\346\201\222"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32 {
|
||||||
|
1: 1
|
||||||
|
}
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAtH9p-LupXO1oQVJtlefmpryPoXqWzKs3_Nad9BlAREA"
|
||||||
|
50 {
|
||||||
|
1 {
|
||||||
|
3: 1008
|
||||||
|
4: 1125
|
||||||
|
}
|
||||||
|
3 {
|
||||||
|
3: 105
|
||||||
|
4: 111
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2Fnoble%2Fnoble_privilege_intro%2Findex.html%3Fforbid_right_back%3D1&type=fullscreen&hide_nav_bar=1&status_bar_color=white&status_bar_bg_color=%2300000000&noble_intercept=1&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
4: "\346\231\256\351\200\232\347\224\250\346\210\267"
|
||||||
|
6 {
|
||||||
|
3: 366
|
||||||
|
4: 615
|
||||||
|
}
|
||||||
|
7 {
|
||||||
|
3: 60
|
||||||
|
4: 108
|
||||||
|
}
|
||||||
|
8 {
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
2: "webcast/noble_boarder.png"
|
||||||
|
3: 64
|
||||||
|
4: 64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
54: 3
|
||||||
|
}
|
||||||
|
3: 555
|
||||||
|
4 {
|
||||||
|
1: 2721997823950523
|
||||||
|
3: "\350\257\267\345\217\253\346\210\221\347\226\257\345\255\220\345\205\255"
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAA1KKMtPQlRg_wecgX0G2Wl-ZIcWe-Yos95-IBwF1AzhSYzL5-zXCa4lciHj2HZho5"
|
||||||
|
}
|
||||||
|
10: 9
|
||||||
|
14: "16\344\270\207\344\272\272\346\260\224"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "6787727734057011981_1580391018357_6787727537927867150_1"
|
||||||
|
3: 1000
|
||||||
|
4: 1580391018357
|
||||||
|
5: "fetch_time:1580391018357|start_time:1580391017508|ack_ids:6787727734057011981_1296|fetch_id:6787727723432626957|flag:1|seq:126"
|
1104
Demo/result.txt
Executable file
1104
Demo/result.txt
Executable file
File diff suppressed because it is too large
Load Diff
4406
Demo/result2.txt
Executable file
4406
Demo/result2.txt
Executable file
File diff suppressed because it is too large
Load Diff
1434
Demo/result3.txt
Executable file
1434
Demo/result3.txt
Executable file
File diff suppressed because it is too large
Load Diff
2576
Demo/result4.json
Normal file
2576
Demo/result4.json
Normal file
File diff suppressed because it is too large
Load Diff
6007
Demo/result4.txt
Normal file
6007
Demo/result4.txt
Normal file
File diff suppressed because it is too large
Load Diff
605
Demo/result5.txt
Normal file
605
Demo/result5.txt
Normal file
@ -0,0 +1,605 @@
|
|||||||
|
1 {
|
||||||
|
1: "WebcastChatMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastChatMessage"
|
||||||
|
2: 6776883976293452551
|
||||||
|
3: 6776859660747344653
|
||||||
|
4: 1577866267927
|
||||||
|
6: 1
|
||||||
|
8 {
|
||||||
|
1: "webcast_chat_display_text"
|
||||||
|
2: "{0:user}{1:string}"
|
||||||
|
3 {
|
||||||
|
1: "#ff36c0cf"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#60000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 51510235218
|
||||||
|
3: "\351\222\242\346\236\252\345\205\204\345\274\237\350\266\205\345\223\245"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/2e8b032f45854441bd5e539ea892e00f~120x256.image"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_admin_badge_v2.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_admin_badge_v2.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_admin_badge_v2.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_admin_badge_v2.png"
|
||||||
|
3: 16
|
||||||
|
4: 28
|
||||||
|
6: 3
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_16.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&__live_platform__=webcast&type=popup&gravity=bottom&height=400&radius=8"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_15.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\351\222\242\346\236\252\346\211\213"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 15
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 45
|
||||||
|
2: 17
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
6: 16
|
||||||
|
19 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_16.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&__live_platform__=webcast&type=popup&gravity=bottom&height=400&radius=8"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\351\222\242\346\236\252\346\211\213"
|
||||||
|
2: 15
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_15.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\351\222\242\346\236\252\346\211\213"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32 {
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAALx1qtwLJiLVbuWXt7ZYTxHxVFvZz2PITy5YfQidfGp4"
|
||||||
|
50 {
|
||||||
|
1 {
|
||||||
|
3: 1008
|
||||||
|
4: 1125
|
||||||
|
}
|
||||||
|
3 {
|
||||||
|
3: 105
|
||||||
|
4: 111
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2Fnoble%2Fnoble_privilege_intro%2Findex.html%3Fforbid_right_back%3D1&status_bar_bg_color=%2300000000&noble_intercept=1&__live_platform__=webcast&type=fullscreen&hide_nav_bar=1&status_bar_color=white"
|
||||||
|
}
|
||||||
|
4: "\346\231\256\351\200\232\347\224\250\346\210\267"
|
||||||
|
6 {
|
||||||
|
3: 366
|
||||||
|
4: 615
|
||||||
|
}
|
||||||
|
7 {
|
||||||
|
3: 60
|
||||||
|
4: 108
|
||||||
|
}
|
||||||
|
8 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
2: "webcast/noble_boarder.png"
|
||||||
|
3: 64
|
||||||
|
4: 64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 1
|
||||||
|
11: "\350\277\231\346\263\242\346\223\215\344\275\234\343\200\202\346\254\272\350\264\237\344\272\272\345\221\200"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 51510235218
|
||||||
|
3: "\351\222\242\346\236\252\345\205\204\345\274\237\350\266\205\345\223\245"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/2e8b032f45854441bd5e539ea892e00f~120x256.image"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_admin_badge_v2.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_admin_badge_v2.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_admin_badge_v2.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_admin_badge_v2.png"
|
||||||
|
3: 16
|
||||||
|
4: 28
|
||||||
|
6: 3
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_16.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&__live_platform__=webcast&type=popup&gravity=bottom&height=400&radius=8"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_15.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\351\222\242\346\236\252\346\211\213"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 15
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 45
|
||||||
|
2: 17
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
6: 16
|
||||||
|
19 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_16.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_16.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&__live_platform__=webcast&type=popup&gravity=bottom&height=400&radius=8"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\351\222\242\346\236\252\346\211\213"
|
||||||
|
2: 15
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_15.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_15.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\351\222\242\346\236\252\346\211\213"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32 {
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAALx1qtwLJiLVbuWXt7ZYTxHxVFvZz2PITy5YfQidfGp4"
|
||||||
|
50 {
|
||||||
|
1 {
|
||||||
|
3: 1008
|
||||||
|
4: 1125
|
||||||
|
}
|
||||||
|
3 {
|
||||||
|
3: 105
|
||||||
|
4: 111
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2Fnoble%2Fnoble_privilege_intro%2Findex.html%3Fforbid_right_back%3D1&status_bar_bg_color=%2300000000&noble_intercept=1&__live_platform__=webcast&type=fullscreen&hide_nav_bar=1&status_bar_color=white"
|
||||||
|
}
|
||||||
|
4: "\346\231\256\351\200\232\347\224\250\346\210\267"
|
||||||
|
6 {
|
||||||
|
3: 366
|
||||||
|
4: 615
|
||||||
|
}
|
||||||
|
7 {
|
||||||
|
3: 60
|
||||||
|
4: 108
|
||||||
|
}
|
||||||
|
8 {
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
2: "webcast/noble_boarder.png"
|
||||||
|
3: 64
|
||||||
|
4: 64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
3: "\350\277\231\346\263\242\346\223\215\344\275\234\343\200\202\346\254\272\350\264\237\344\272\272\345\221\200"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastChatMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastChatMessage"
|
||||||
|
2: 6776883987831969295
|
||||||
|
3: 6776859660747344653
|
||||||
|
4: 1577866267933
|
||||||
|
6: 1
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 100902326983
|
||||||
|
3: "\346\211\254\345\256\266\345\206\233\347\201\254\344\272\232\351\243\236"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/aade000f6df1961243c5~120x256.image"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_9.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_4.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_4.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_4.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_4.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\351\222\242\346\236\252\346\211\213"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 45
|
||||||
|
2: 7
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
6: 9
|
||||||
|
19 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_9.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_9.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\351\222\242\346\236\252\346\211\213"
|
||||||
|
2: 4
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_4.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_4.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_4.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_4.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\351\222\242\346\236\252\346\211\213"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAArfQQ4YVnKMKthzbKgv2swkggu8Ovv8eQCp56JmvvRvE"
|
||||||
|
50 {
|
||||||
|
1 {
|
||||||
|
3: 1008
|
||||||
|
4: 1125
|
||||||
|
}
|
||||||
|
3 {
|
||||||
|
3: 105
|
||||||
|
4: 111
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2Fnoble%2Fnoble_privilege_intro%2Findex.html%3Fforbid_right_back%3D1&type=fullscreen&hide_nav_bar=1&status_bar_color=white&status_bar_bg_color=%2300000000&noble_intercept=1&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
4: "\346\231\256\351\200\232\347\224\250\346\210\267"
|
||||||
|
6 {
|
||||||
|
3: 366
|
||||||
|
4: 615
|
||||||
|
}
|
||||||
|
7 {
|
||||||
|
3: 60
|
||||||
|
4: 108
|
||||||
|
}
|
||||||
|
8 {
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
2: "webcast/noble_boarder.png"
|
||||||
|
3: 64
|
||||||
|
4: 64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
3: "\351\230\277\344\274\237\345\220\271\347\211\233\346\257\224"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastRoomUserSeqMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastRoomUserSeqMessage"
|
||||||
|
2: 6776884008732789507
|
||||||
|
3: 6776859660747344653
|
||||||
|
4: 1577866268029
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 1975
|
||||||
|
2 {
|
||||||
|
1: 479033461313651
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/49b2bd0b157e4787917b029da02d2622~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 1
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 999
|
||||||
|
2 {
|
||||||
|
1: 3962278245043603
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/241f1001013a2e8505175~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 2
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 571
|
||||||
|
2 {
|
||||||
|
1: 53231054839
|
||||||
|
9 {
|
||||||
|
1: "http://wx.qlogo.cn/mmopen/XFJ8HdGGwGDwy1reeaMqlfQrUh81uSv81HqUsESBK8YsNQ2oEIct3ibwdq1k55HLC7m43nfFiaX3EYpw2lKH4wibw/64"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 3
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 520
|
||||||
|
2 {
|
||||||
|
1: 88336033429
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/647c6fcddfa84d328d9c51f0294599d0~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 4
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 520
|
||||||
|
2 {
|
||||||
|
1: 58722717092
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/8a4dc6f002b545bca632615290f4527d~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 5
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 297
|
||||||
|
2 {
|
||||||
|
1: 52379408873
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/24990023eae5e3325fcc~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 6
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 140
|
||||||
|
2 {
|
||||||
|
1: 57254508132
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/216c00283d70176a9e97~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 7
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 128
|
||||||
|
2 {
|
||||||
|
1: 3056263838569380
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/fe8f000122d925f9a0fb~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 8
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 99
|
||||||
|
2 {
|
||||||
|
1: 23239313505
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/5d4700073713949f592e~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 9
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 35
|
||||||
|
2 {
|
||||||
|
1: 3239311302
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/737/6093229802~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 10
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 30
|
||||||
|
2 {
|
||||||
|
1: 822069738617544
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/2b5f6e3d331443b3bf51875567fa2b5d~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 11
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 22
|
||||||
|
2 {
|
||||||
|
1: 83166975758782
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/0baffeeb3d2d4fa8898b275968f18564~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 12
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 14
|
||||||
|
2 {
|
||||||
|
1: 104729678256
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/db140012b3f29800ab6d~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 13
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: 5538311676
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/dad300141ece34b4e3c7~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 8
|
||||||
|
2 {
|
||||||
|
1: 109675723458
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/9cf549b429f740f6a90c41e4b5b632b9~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 15
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 6
|
||||||
|
2 {
|
||||||
|
1: 81425804261
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/9fd60005b91e43cc85e2~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 16
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 5
|
||||||
|
2 {
|
||||||
|
1: 2115111742610984
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/b20c086a5b644a6f919dfdd3dad442e6~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 17
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 3
|
||||||
|
2 {
|
||||||
|
1: 100743319316
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/6d8e7bba2195468fb24a4e3ea7992b92~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 18
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: 51035982268
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/d041e17415bc42c9a9815a8aaa2c3d8b~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 19
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 1
|
||||||
|
2 {
|
||||||
|
1: 1772009086784855
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/9fe0aa53dc254c0081a0fc2ce65f1559~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 20
|
||||||
|
}
|
||||||
|
3: 826
|
||||||
|
4: "13\344\270\207\344\272\272\346\260\224"
|
||||||
|
6: 136763
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "6776884008732789507_1577866268700_1_1"
|
||||||
|
3: 1000
|
||||||
|
4: 1577866268700
|
||||||
|
5: "fetch_time:1577866268700|start_time:1577866263586|fetch_id:6776884010443557636|flag:0|seq:22"
|
234
Demo/resulta.txt
Normal file
234
Demo/resulta.txt
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
1 {
|
||||||
|
1: "WebcastRoomUserSeqMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastRoomUserSeqMessage"
|
||||||
|
2: 6776963484661500684
|
||||||
|
3: 6776943780420389640
|
||||||
|
4: 1577884770601
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 132
|
||||||
|
2 {
|
||||||
|
1: 3962279791967276
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/278ac6165ba34b7aa371e1df5ea337b3~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 1
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 66
|
||||||
|
2 {
|
||||||
|
1: 2933125236921479
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/2e1c9d64f34a4a3e8a326fe5394659fd~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 2
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 45
|
||||||
|
2 {
|
||||||
|
1: 50230797308
|
||||||
|
9 {
|
||||||
|
1: "http://p9-xg.bytecdn.cn/thumb/dac400045e7008dbd42d"
|
||||||
|
2: "dac400045e7008dbd42d"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 3
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 5
|
||||||
|
2 {
|
||||||
|
1: 9746464842
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/6ad34237256e4471b16810eb098224c0~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 4
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 5
|
||||||
|
2 {
|
||||||
|
1: 111552853752
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/3792/5112637127~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 5
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 3
|
||||||
|
2 {
|
||||||
|
1: 16665341581
|
||||||
|
9 {
|
||||||
|
1: "http://p3-xg.bytecdn.cn/thumb/da80000309bef5b49fa0"
|
||||||
|
2: "da80000309bef5b49fa0"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 6
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 97942455882
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/3792/5112637127~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 7
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 97363408846
|
||||||
|
9 {
|
||||||
|
1: "http://p3-xg.bytecdn.cn/thumb/dab00018fc4fda3b5a21"
|
||||||
|
2: "dab00018fc4fda3b5a21"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 8
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 96959753387
|
||||||
|
9 {
|
||||||
|
1: "http://p9-xg.bytecdn.cn/thumb/173b600285dcf9f649150"
|
||||||
|
2: "173b600285dcf9f649150"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 9
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 96119123780
|
||||||
|
9 {
|
||||||
|
1: "http://p9-xg.bytecdn.cn/thumb/241ef00000e3f17f517d7"
|
||||||
|
2: "241ef00000e3f17f517d7"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 10
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 9609510451
|
||||||
|
9 {
|
||||||
|
1: "http://p3-xg.bytecdn.cn/thumb/da51000807963daceae0"
|
||||||
|
2: "da51000807963daceae0"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 11
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 95931639233
|
||||||
|
9 {
|
||||||
|
1: "http://p9-xg.bytecdn.cn/thumb/71a30006cf20be61eb9b"
|
||||||
|
2: "71a30006cf20be61eb9b"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 12
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 94602295110
|
||||||
|
9 {
|
||||||
|
1: "http://p1-xg.bytecdn.cn/thumb/173b70008753becec983c"
|
||||||
|
2: "173b70008753becec983c"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 13
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 94432960458
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/3795/3047680722~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 94385438443
|
||||||
|
9 {
|
||||||
|
1: "http://p3-xg.bytecdn.cn/thumb/6593000eb2048e45ee0b"
|
||||||
|
2: "6593000eb2048e45ee0b"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 15
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 94193267099
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/da57000b43a72cedd2fc~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 16
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 93948536567
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/fe7300005f28e10f3c52~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 17
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 93175525403
|
||||||
|
9 {
|
||||||
|
1: "http://p9-xg.bytecdn.cn/thumb/da83000d9328094b90d6"
|
||||||
|
2: "da83000d9328094b90d6"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 18
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 93064266997
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/6588002a7fcd121c60f6~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 19
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
2 {
|
||||||
|
1: 92866340217
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3795/3044413937~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 20
|
||||||
|
}
|
||||||
|
3: 365
|
||||||
|
4: "5.6\344\270\207\344\272\272\346\260\224"
|
||||||
|
6: 56661
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "6776963484661500684_1577884771191_6776957423184169736_1"
|
||||||
|
3: 1000
|
||||||
|
4: 1577884771191
|
||||||
|
5: "fetch_time:1577884771191|start_time:1577884288940|fetch_id:6776963481247042317|flag:0|seq:1283"
|
4732
Demo/resultb.txt
Normal file
4732
Demo/resultb.txt
Normal file
File diff suppressed because it is too large
Load Diff
4489
Demo/resultc.txt
Normal file
4489
Demo/resultc.txt
Normal file
File diff suppressed because it is too large
Load Diff
862
Demo/resultfst.txt
Normal file
862
Demo/resultfst.txt
Normal file
@ -0,0 +1,862 @@
|
|||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2: 6776965782439283463
|
||||||
|
3: 6776895930592398094
|
||||||
|
6: 1
|
||||||
|
8 {
|
||||||
|
1: "live_room_enter_toast"
|
||||||
|
2: "{0:user} \346\235\245\344\272\206{1:string}"
|
||||||
|
3 {
|
||||||
|
1: "#de000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#61000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 1587335753631549
|
||||||
|
3: "\345\260\217\345\244\251\346\211\215\350\264\235\345\243\263"
|
||||||
|
9 {
|
||||||
|
1: "http://p3.pstatp.com/thumb/3793/3131589739"
|
||||||
|
2: "3793/3131589739"
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 33
|
||||||
|
2: 2
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
19: ""
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 0
|
||||||
|
2: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAh0jOEAHZj6-a55dwsKu6i0ilHwHcWPx8mLImJ5iDJzfgkYhU0mFv-oLZ6yx6wNi0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 1587335753631549
|
||||||
|
3: "\345\260\217\345\244\251\346\211\215\350\264\235\345\243\263"
|
||||||
|
9 {
|
||||||
|
1: "http://p3.pstatp.com/thumb/3793/3131589739"
|
||||||
|
2: "3793/3131589739"
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 33
|
||||||
|
2: 2
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
19: ""
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 0
|
||||||
|
2: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAh0jOEAHZj6-a55dwsKu6i0ilHwHcWPx8mLImJ5iDJzfgkYhU0mFv-oLZ6yx6wNi0"
|
||||||
|
}
|
||||||
|
3: 15103
|
||||||
|
10: 1
|
||||||
|
14: "132\344\270\207\344\272\272\346\260\224"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2: 6776965783190555404
|
||||||
|
3: 6776895930592398094
|
||||||
|
6: 1
|
||||||
|
8 {
|
||||||
|
1: "live_room_enter_toast"
|
||||||
|
2: "{0:user} \346\235\245\344\272\206{1:string}"
|
||||||
|
3 {
|
||||||
|
1: "#de000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#61000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 50909397248
|
||||||
|
3: "\347\214\223\347\214\223\347\214\223\345\255\220"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://p1.pstatp.com/thumb/96b002412f02c3d2735"
|
||||||
|
2: "96b002412f02c3d2735"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 24
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
6: 5
|
||||||
|
19 {
|
||||||
|
1: "http://p3-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 0
|
||||||
|
2: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAwlVH0meNefJYE9l5cBWj5vZX8ooB9bII44Cf2CRXp9s"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 50909397248
|
||||||
|
3: "\347\214\223\347\214\223\347\214\223\345\255\220"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://p1.pstatp.com/thumb/96b002412f02c3d2735"
|
||||||
|
2: "96b002412f02c3d2735"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 24
|
||||||
|
2: 1
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
6: 5
|
||||||
|
19 {
|
||||||
|
1: "http://p3-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_5.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_5.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 0
|
||||||
|
2: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAwlVH0meNefJYE9l5cBWj5vZX8ooB9bII44Cf2CRXp9s"
|
||||||
|
}
|
||||||
|
3: 15103
|
||||||
|
10: 1
|
||||||
|
14: "132\344\270\207\344\272\272\346\260\224"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastRoomUserSeqMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastRoomUserSeqMessage"
|
||||||
|
2: 6776965783814933256
|
||||||
|
3: 6776895930592398094
|
||||||
|
4: 1577885306057
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 2997
|
||||||
|
2 {
|
||||||
|
1: 92747501043
|
||||||
|
2: 517409
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/feaa00016eaa01bf172e~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 1
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 2198
|
||||||
|
2 {
|
||||||
|
1: 1182693581391939
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/dae10014972e8d70953e~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 2
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 1998
|
||||||
|
2 {
|
||||||
|
1: 5981054057
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/75660014ae3215bae055~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 3
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 1099
|
||||||
|
2 {
|
||||||
|
1: 3836408254
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/6620/5484795979~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 4
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 999
|
||||||
|
2 {
|
||||||
|
1: 830872766922279
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/5a67caf5ae404432aa0524c33001241c~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 5
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 999
|
||||||
|
2 {
|
||||||
|
1: 7185332641
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/754e3527d08540089a3adf6495845240~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 6
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 520
|
||||||
|
2 {
|
||||||
|
1: 93127918477
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/3795/3044413937~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 7
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 520
|
||||||
|
2 {
|
||||||
|
1: 50073154686
|
||||||
|
9 {
|
||||||
|
1: "http://p1-xg.bytecdn.cn/thumb/da790015e9c75441ff34"
|
||||||
|
2: "da790015e9c75441ff34"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 8
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 520
|
||||||
|
2 {
|
||||||
|
1: 104620584571
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/daa30018abcde9559b55~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 9
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 120
|
||||||
|
2 {
|
||||||
|
1: 5994520551
|
||||||
|
9 {
|
||||||
|
1: "http://p1-xg.bytecdn.cn/thumb/aae5000ffc17e4f1f5da"
|
||||||
|
2: "aae5000ffc17e4f1f5da"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 10
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 100
|
||||||
|
2 {
|
||||||
|
1: 54883854814
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/da68001693847d505008~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 11
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 99
|
||||||
|
2 {
|
||||||
|
1: 82020236564
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/5042000ff6673790f6d2~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 12
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 66
|
||||||
|
2 {
|
||||||
|
1: 3688188102
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/e590005f1b8bdbd812c~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 13
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 38
|
||||||
|
2 {
|
||||||
|
1: 75972230499
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/173b400272ba1269fb7d8~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 20
|
||||||
|
2 {
|
||||||
|
1: 654947037492940
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/2e549000299b4f464f99f~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 15
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 17
|
||||||
|
2 {
|
||||||
|
1: 6896749077
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/mosaic-legacy/5046000873dbc5a8f31f~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 16
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 14
|
||||||
|
2 {
|
||||||
|
1: 50569473736
|
||||||
|
9 {
|
||||||
|
1: "http://p3-xg.bytecdn.cn/thumb/5d4b0002a7134afffa47"
|
||||||
|
2: "5d4b0002a7134afffa47"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 17
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 14
|
||||||
|
2 {
|
||||||
|
1: 2581241782866604
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/51c85ec9c5754938b89504217ae5bbbc~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 18
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 13
|
||||||
|
2 {
|
||||||
|
1: 50651928991
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/f81fee15e94a4405acc921916bfaff09~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 19
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: 106001804992
|
||||||
|
9 {
|
||||||
|
1: "http://sf6-ttcdn-tos.pstatp.com/img/mosaic-legacy/fe5f000080632ba520f5~120x256.image"
|
||||||
|
}
|
||||||
|
23: ""
|
||||||
|
}
|
||||||
|
3: 20
|
||||||
|
}
|
||||||
|
3: 15094
|
||||||
|
4: "132\344\270\207\344\272\272\346\260\224"
|
||||||
|
6: 1329944
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastChatMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastChatMessage"
|
||||||
|
2: 6776965784796482315
|
||||||
|
3: 6776895930592398094
|
||||||
|
4: 1577885306078
|
||||||
|
6: 1
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 52120728008
|
||||||
|
3: "\346\234\250\345\255\2202910"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://p1.pstatp.com/thumb/ef6000df19086df2853"
|
||||||
|
2: "ef6000df19086df2853"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p3-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_3.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_3.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_3.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_3.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&__live_platform__=webcast&type=popup&gravity=bottom&height=400&radius=8"
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 65
|
||||||
|
2: 16
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
6: 3
|
||||||
|
19 {
|
||||||
|
1: "http://p3-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_3.png~tplv-obj.png"
|
||||||
|
1: "http://p6-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_3.png~tplv-obj.png"
|
||||||
|
1: "http://p1-webcast-ttcdn.byteimg.com/img/webcast/xigua_paygrade_level_3.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_3.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&__live_platform__=webcast&type=popup&gravity=bottom&height=400&radius=8"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 0
|
||||||
|
2: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAD4OSjJ5hRbYDzZI0GJT_usTlLPEBYFrtPEYzBwLiIzQ"
|
||||||
|
50 {
|
||||||
|
1 {
|
||||||
|
3: 1008
|
||||||
|
4: 1125
|
||||||
|
}
|
||||||
|
3 {
|
||||||
|
3: 105
|
||||||
|
4: 111
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2Fnoble%2Fnoble_privilege_intro%2Findex.html%3Fforbid_right_back%3D1&type=fullscreen&hide_nav_bar=1&status_bar_color=white&status_bar_bg_color=%2300000000&noble_intercept=1&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
4: "\346\231\256\351\200\232\347\224\250\346\210\267"
|
||||||
|
6 {
|
||||||
|
3: 366
|
||||||
|
4: 615
|
||||||
|
}
|
||||||
|
7 {
|
||||||
|
3: 60
|
||||||
|
4: 108
|
||||||
|
}
|
||||||
|
8 {
|
||||||
|
1: "http://p1-webcast-ttcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p3-webcast-ttcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
1: "http://p9-webcast-ttcdn.byteimg.com/img/webcast/noble_boarder.png~tplv-obj.image"
|
||||||
|
2: "webcast/noble_boarder.png"
|
||||||
|
3: 64
|
||||||
|
4: 64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
3: "\350\277\231\346\230\257\345\267\247\345\205\213\345\212\233\345\270\275\345\255\220\357\274\237"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2: 6776965784520887054
|
||||||
|
3: 6776895930592398094
|
||||||
|
6: 1
|
||||||
|
8 {
|
||||||
|
1: "live_room_enter_toast"
|
||||||
|
2: "{0:user} \346\235\245\344\272\206{1:string}"
|
||||||
|
3 {
|
||||||
|
1: "#de000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#61000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 71581494772
|
||||||
|
3: "\345\217\253\346\210\221\350\221\211\345\220\214\345\255\246"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/3792/5112637127~120x256.image"
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 6
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
19: ""
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 0
|
||||||
|
2: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAfgxQATVlN1REs0ezLccSYBNp34sVcfh3EZHMu5Fi8uE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 71581494772
|
||||||
|
3: "\345\217\253\346\210\221\350\221\211\345\220\214\345\255\246"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://sf3-ttcdn-tos.pstatp.com/img/mosaic-legacy/3792/5112637127~120x256.image"
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 6
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
19: ""
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 0
|
||||||
|
2: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAfgxQATVlN1REs0ezLccSYBNp34sVcfh3EZHMu5Fi8uE"
|
||||||
|
}
|
||||||
|
3: 15103
|
||||||
|
10: 1
|
||||||
|
14: "132\344\270\207\344\272\272\346\260\224"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastMemberMessage"
|
||||||
|
2: 6776965785094048520
|
||||||
|
3: 6776895930592398094
|
||||||
|
6: 1
|
||||||
|
8 {
|
||||||
|
1: "live_room_enter_toast"
|
||||||
|
2: "{0:user} \346\235\245\344\272\206{1:string}"
|
||||||
|
3 {
|
||||||
|
1: "#de000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
4 {
|
||||||
|
1: 11
|
||||||
|
2 {
|
||||||
|
1: "#61000000"
|
||||||
|
4: 400
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1 {
|
||||||
|
1: 6205145196
|
||||||
|
3: "\346\210\221\344\270\215\346\230\257\350\200\201\351\211\204"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://p1-xg.bytecdn.cn/thumb/249a001395445a62671d"
|
||||||
|
2: "249a001395445a62671d"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_8.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\345\270\203\344\270\200\347\217\255"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 15
|
||||||
|
2: 54
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
6: 8
|
||||||
|
19 {
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_8.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\345\270\203\344\270\200\347\217\255"
|
||||||
|
2: 14
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\345\270\203\344\270\200\347\217\255"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAGMn5pO7qE_ZZu6ETuJmfSW8KLhLOtRkLnr3IiLE2e6A"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2 {
|
||||||
|
1: 6205145196
|
||||||
|
3: "\346\210\221\344\270\215\346\230\257\350\200\201\351\211\204"
|
||||||
|
4: 1
|
||||||
|
9 {
|
||||||
|
1: "http://p1-xg.bytecdn.cn/thumb/249a001395445a62671d"
|
||||||
|
2: "249a001395445a62671d"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_8.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
21 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
6: 7
|
||||||
|
8 {
|
||||||
|
1: "\345\270\203\344\270\200\347\217\255"
|
||||||
|
2: "#FFFFFF"
|
||||||
|
3: 14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
22 {
|
||||||
|
1: 15
|
||||||
|
2: 54
|
||||||
|
}
|
||||||
|
23 {
|
||||||
|
6: 8
|
||||||
|
19 {
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
1: "http://p3-webcast-xgcdn.byteimg.com/img/webcast/xigua_paygrade_level_8.png~tplv-obj.png"
|
||||||
|
2: "webcast/xigua_paygrade_level_8.png"
|
||||||
|
3: 16
|
||||||
|
4: 30
|
||||||
|
6: 1
|
||||||
|
7: "sslocal://webcast_webview?url=https%3A%2F%2Fwebcast.ixigua.com%2Ffalcon%2Fwebcast_xigua%2Fpage%2FhonorLevel%2Findex.html&type=popup&gravity=bottom&height=400&radius=8&__live_platform__=webcast"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\345\270\203\344\270\200\347\217\255"
|
||||||
|
2: 14
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "http://p9-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p1-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
1: "http://p6-webcast-xgcdn.byteimg.com/img/webcast/xigua_fansclub_medal_14.png~tplv-obj.image"
|
||||||
|
2: "webcast/xigua_fansclub_medal_14.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\345\270\203\344\270\200\347\217\255"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32: ""
|
||||||
|
38: "0"
|
||||||
|
46: "MS4wLjABAAAAGMn5pO7qE_ZZu6ETuJmfSW8KLhLOtRkLnr3IiLE2e6A"
|
||||||
|
}
|
||||||
|
3: 15103
|
||||||
|
10: 1
|
||||||
|
14: "132\344\270\207\344\272\272\346\260\224"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastFansclubStatisticsMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastFansclubStatisticsMessage"
|
||||||
|
2: 6776950071441869579
|
||||||
|
3: 6776895930592398094
|
||||||
|
4: 1577885306430
|
||||||
|
6: 1
|
||||||
|
}
|
||||||
|
2: "\345\270\203\344\270\200\347\217\255"
|
||||||
|
3: 19325
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1 {
|
||||||
|
1: "WebcastFansclubMessage"
|
||||||
|
2 {
|
||||||
|
1 {
|
||||||
|
1: "WebcastFansclubMessage"
|
||||||
|
2: 6776950071441885963
|
||||||
|
3: 6776895930592398094
|
||||||
|
4: 1577885306441
|
||||||
|
6: 1
|
||||||
|
}
|
||||||
|
2: 2
|
||||||
|
3: "\346\201\255\345\226\234 \347\210\261\345\220\203\351\261\274\347\232\204\347\213\256\345\255\220\351\270\255 \346\210\220\344\270\272\347\254\25419325\345\220\215\347\262\211\344\270\235\345\233\242\346\210\220\345\221\230"
|
||||||
|
4 {
|
||||||
|
1: 109556646111
|
||||||
|
3: "\347\210\261\345\220\203\351\261\274\347\232\204\347\213\256\345\255\220\351\270\255"
|
||||||
|
9 {
|
||||||
|
1: "http://sf1-ttcdn-tos.pstatp.com/img/tos-cn-i-0022/66d462f176c841a0a4939ad355fe8c00~120x256.image"
|
||||||
|
}
|
||||||
|
24 {
|
||||||
|
1 {
|
||||||
|
1: "\345\270\203\344\270\200\347\217\255"
|
||||||
|
2: 1
|
||||||
|
3: 1
|
||||||
|
4 {
|
||||||
|
1 {
|
||||||
|
1: 2
|
||||||
|
2 {
|
||||||
|
1: "https://p1.pstatp.com/obj/webcast/xigua_fansclub_1.png"
|
||||||
|
2: "webcast/xigua_fansclub_1.png"
|
||||||
|
3: 48
|
||||||
|
4: 150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "\345\270\203\344\270\200\347\217\255"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
2: "6776950071441885963_1577885306619_6776965731513060100_1"
|
||||||
|
3: 1000
|
||||||
|
4: 1577885306619
|
||||||
|
5: "fetch_time:1577885306619|start_time:1577885302380|fetch_id:6776965761064883715|flag:0|seq:387"
|
49
Gift.py
49
Gift.py
@ -1,49 +0,0 @@
|
|||||||
import requests
|
|
||||||
from User import User
|
|
||||||
|
|
||||||
|
|
||||||
class Gift:
|
|
||||||
ID:int = 0
|
|
||||||
count:int = 0
|
|
||||||
roomID:int = 0
|
|
||||||
giftList:dict = {10001: {"Name": "西瓜", "Price": 0}}
|
|
||||||
amount:int = 0
|
|
||||||
user:User = None
|
|
||||||
|
|
||||||
def __init__(self, json=None):
|
|
||||||
if json:
|
|
||||||
self.parse(json)
|
|
||||||
|
|
||||||
def parse(self, json):
|
|
||||||
self.user = User(json)
|
|
||||||
if "extra" in json:
|
|
||||||
if "present_info" in json["extra"] and json["extra"]['present_info'] is not None:
|
|
||||||
self.ID = int(json["extra"]['present_info']['id'])
|
|
||||||
self.count = json["extra"]['present_info']['repeat_count']
|
|
||||||
elif "present_end_info" in json["extra"] and json["extra"]['present_end_info'] is not None:
|
|
||||||
self.ID = int(json["extra"]['present_end_info']['id'])
|
|
||||||
self.count = json["extra"]['present_end_info']['count']
|
|
||||||
if self.ID in self.giftList:
|
|
||||||
self.amount = self.giftList[self.ID]["Price"] * self.count
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def update(roomID):
|
|
||||||
Gift.roomID = roomID
|
|
||||||
p = requests.get("https://i.snssdk.com/videolive/gift/get_gift_list?room_id={roomID}".format(roomID= roomID))
|
|
||||||
d = p.json()
|
|
||||||
if "gift_info" not in d:
|
|
||||||
print("错误:礼物更新失败")
|
|
||||||
else:
|
|
||||||
for i in d["gift_info"]:
|
|
||||||
_id = int(i["id"])
|
|
||||||
Gift.giftList[_id] = {"Name": i["name"], "Price": i["diamond_count"]}
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if self.ID in self.giftList:
|
|
||||||
giftN = self.giftList[self.ID]["Name"]
|
|
||||||
else:
|
|
||||||
giftN = "未知礼物[{}]".format(self.ID)
|
|
||||||
return "{user} 送出的 {count} 个 {name}".format(user= self.user, count= self.count, name= giftN)
|
|
||||||
|
|
||||||
def __unicode__(self):
|
|
||||||
return self.__str__()
|
|
17
README.md
17
README.md
@ -1,15 +1,18 @@
|
|||||||
# XiguaLiveDanmakuHelper
|
# XiguaLiveDanmakuHelper
|
||||||
|
|
||||||
|
### 因西瓜直播弹幕接口换成了ProtoBuf,已经尝试解析出了部分proto
|
||||||
|
([v7旧版本](https://github.com/q792602257/XiguaLiveDanmakuHelper/tree/v7)仍可用就是带动画的礼物不显示而已)
|
||||||
|
|
||||||
### 西瓜直播弹幕助手--控制台版
|
### 西瓜直播弹幕助手--控制台版
|
||||||
|
|
||||||
界面版:[q792602257/XiguaDanmakuHelperGUI](https://github.com/q792602257/XiguaDanmakuHelperGUI "C# ver")
|
界面版:[q792602257/XiguaDanmakuHelperGUI](https://github.com/q792602257/XiguaDanmakuHelperGUI "C# ver")
|
||||||
|
|
||||||
### 计划更新:
|
### 西瓜直播弹幕接口```api.py```
|
||||||
+ √ ~~使用android app协议~~
|
|
||||||
|
|
||||||
已使用
|
> - 基于安卓8.1.6
|
||||||
除从用户ID获取roomID及判断是否在播外,其他均改为Android Api
|
|
||||||
|
|
||||||
+ √ ~~闲的无聊的时候看一看有没有好用的GUI轮子可以用用~~
|
### 西瓜直播弹幕助手--礼物端```WinMain.py```
|
||||||
|
|
||||||
已完成
|
### <s>计划更新</s>
|
||||||
已基于BiliLive_dm制作出初代西瓜直播弹幕姬,api未跟进
|
|
||||||
|
### 并没有呢,这段时间太忙了
|
||||||
|
40
Struct/Chat.py
Normal file
40
Struct/Chat.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
from .User import User
|
||||||
|
from .Lottery import Lottery
|
||||||
|
from XiguaMessage_pb2 import ChatMessage
|
||||||
|
|
||||||
|
class Chat:
|
||||||
|
content = ""
|
||||||
|
user = None
|
||||||
|
filterString = ["", ]
|
||||||
|
isFiltered = False
|
||||||
|
|
||||||
|
def __init__(self, json=None, lottery: Lottery = None):
|
||||||
|
if lottery:
|
||||||
|
self.filterString.append(lottery.content)
|
||||||
|
if json:
|
||||||
|
if type(json) == bytes:
|
||||||
|
self.parsePb(json)
|
||||||
|
else:
|
||||||
|
self.parse(json)
|
||||||
|
|
||||||
|
def parsePb(self, raw):
|
||||||
|
_message = ChatMessage()
|
||||||
|
_message.ParseFromString(raw)
|
||||||
|
self.user = User(_message.user)
|
||||||
|
self.content = _message.content
|
||||||
|
if self.content in self.filterString:
|
||||||
|
self.isFiltered = True
|
||||||
|
|
||||||
|
def parse(self, json):
|
||||||
|
self.user = User(json)
|
||||||
|
if "extra" in json:
|
||||||
|
if "content" in json["extra"]:
|
||||||
|
self.content = json["extra"]['content']
|
||||||
|
if self.content in self.filterString:
|
||||||
|
self.isFiltered = True
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "{} : {}".format(self.user, self.content)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.__str__()
|
0
Struct/Digg.py
Normal file
0
Struct/Digg.py
Normal file
93
Struct/Gift.py
Normal file
93
Struct/Gift.py
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import requests
|
||||||
|
from .User import User
|
||||||
|
from XiguaMessage_pb2 import GiftMessage
|
||||||
|
|
||||||
|
|
||||||
|
class Gift:
|
||||||
|
roomID = 0
|
||||||
|
giftList = {}
|
||||||
|
|
||||||
|
def __init__(self, json=None):
|
||||||
|
self.ID = 0
|
||||||
|
self.count = 0
|
||||||
|
self.amount = 0
|
||||||
|
self.user = None
|
||||||
|
self.isFinished = False
|
||||||
|
self.backupName = None
|
||||||
|
if json:
|
||||||
|
if type(json) == bytes:
|
||||||
|
self.parsePb(json)
|
||||||
|
else:
|
||||||
|
self.parse(json)
|
||||||
|
|
||||||
|
def parsePb(self, raw):
|
||||||
|
_message = GiftMessage()
|
||||||
|
_message.ParseFromString(raw)
|
||||||
|
self.user = User(_message.user)
|
||||||
|
self.ID = _message.giftId
|
||||||
|
self.count = _message.repeated
|
||||||
|
self.isFinished = _message.isFinished
|
||||||
|
self.backupName = _message.commonInfo.displayText.params.gifts.gift.name
|
||||||
|
|
||||||
|
def parse(self, json):
|
||||||
|
self.user = User(json)
|
||||||
|
if "common" in json and json["common"] is not None:
|
||||||
|
if Gift.roomID != int(json["common"]["room_id"]):
|
||||||
|
Gift.roomID = int(json["common"]["room_id"])
|
||||||
|
self.update()
|
||||||
|
if "extra" in json and json["extra"] is not None:
|
||||||
|
if "present_info" in json["extra"] and json["extra"]['present_info'] is not None:
|
||||||
|
self.ID = int(json["extra"]['present_info']['id'])
|
||||||
|
self.count = json["extra"]['present_info']['repeat_count']
|
||||||
|
elif "present_end_info" in json["extra"] and json["extra"]['present_end_info'] is not None:
|
||||||
|
self.ID = int(json["extra"]['present_end_info']['id'])
|
||||||
|
self.count = json["extra"]['present_end_info']['count']
|
||||||
|
if self.ID != 0 and self.ID in self.giftList:
|
||||||
|
self.amount = self.giftList[self.ID]['diamond_count'] * self.count
|
||||||
|
else:
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def update(cls):
|
||||||
|
p = requests.get("https://i.snssdk.com/videolive/gift/get_gift_list?room_id={roomID}"
|
||||||
|
"&version_code=800&device_platform=android".format(roomID=Gift.roomID))
|
||||||
|
d = p.json()
|
||||||
|
if "gift_info" not in d:
|
||||||
|
print("错误:礼物更新失败")
|
||||||
|
else:
|
||||||
|
for i in d["gift_info"]:
|
||||||
|
cls.addGift(i)
|
||||||
|
|
||||||
|
def isAnimate(self):
|
||||||
|
if self.ID != 0 and self.ID in self.giftList:
|
||||||
|
if 'combo' in self.giftList[self.ID]:
|
||||||
|
return self.giftList[self.ID]["combo"] == False
|
||||||
|
elif 'meta' in self.giftList[self.ID] and 'combo' in self.giftList[self.ID]['meta']:
|
||||||
|
return self.giftList[self.ID]['meta']["combo"] == False
|
||||||
|
elif 'type' in self.giftList[self.ID]:
|
||||||
|
return self.giftList[self.ID]["type"] == 2
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _getGiftName(self):
|
||||||
|
if self.ID in self.giftList:
|
||||||
|
return self.giftList[self.ID]["name"]
|
||||||
|
elif self.backupName is not None:
|
||||||
|
return self.backupName
|
||||||
|
else:
|
||||||
|
return "未知礼物[{}]".format(self.ID)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "{user} 送出的 {count} 个 {name}".format(user=self.user, count=self.count, name=self._getGiftName())
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.__str__()
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "西瓜礼物【{}(ID:{})】".format(self._getGiftName(), self.ID)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def addGift(cls, _gift):
|
||||||
|
if 'id' not in _gift:
|
||||||
|
return
|
||||||
|
_id = int(_gift["id"])
|
||||||
|
cls.giftList[_id] = _gift
|
71
Struct/Lottery.py
Normal file
71
Struct/Lottery.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
# coding=utf-8
|
||||||
|
import requests
|
||||||
|
import time
|
||||||
|
from .LuckyUser import LuckyUser
|
||||||
|
|
||||||
|
|
||||||
|
class Lottery:
|
||||||
|
ID = 0
|
||||||
|
isActive = False
|
||||||
|
content = ""
|
||||||
|
isFinished = False
|
||||||
|
luckyUsers = []
|
||||||
|
joinedUserCount = 0
|
||||||
|
prizeName = ""
|
||||||
|
finish = 0
|
||||||
|
|
||||||
|
def __init__(self, json=None):
|
||||||
|
if json:
|
||||||
|
self.parse(json)
|
||||||
|
|
||||||
|
def parse(self, json):
|
||||||
|
if "lottery_info" in json and json["lottery_info"] is not None:
|
||||||
|
self.isActive = int(json["lottery_info"]["status"]) > 0
|
||||||
|
self.ID = json["lottery_info"]["lottery_id"]
|
||||||
|
for i in json["lottery_info"]['conditions']:
|
||||||
|
if i['type'] != 3:
|
||||||
|
continue
|
||||||
|
self.content = i["content"]
|
||||||
|
self.joinedUserCount = int(json["lottery_info"]["candidate_num"])
|
||||||
|
self.prizeName = json["lottery_info"]["prize_info"]["name"]
|
||||||
|
_delta = int(json["lottery_info"]["draw_time"]) - int(json["lottery_info"]["current_time"])
|
||||||
|
self.finish = time.time()+_delta+1
|
||||||
|
elif "extra" in json and json["extra"] is not None:
|
||||||
|
if "lottery_info" in json["extra"] and json["extra"]["lottery_info"] is not None:
|
||||||
|
return self.parse(json["extra"])
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
if self.isActive:
|
||||||
|
if not self.isFinished and self.finish > time.time():
|
||||||
|
self.checkFinished()
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def checkFinished(self):
|
||||||
|
p = requests.get("https://i.snssdk.com/videolive/lottery/check_user_right?lottery_id={}"
|
||||||
|
"&version_code=730&device_platform=android".format(
|
||||||
|
self.ID
|
||||||
|
))
|
||||||
|
d = p.json()
|
||||||
|
if d["base_resp"]["status_code"] != 0:
|
||||||
|
self.isActive = False
|
||||||
|
self.isFinished = False
|
||||||
|
return
|
||||||
|
self.isActive = int(d["lottery_info"]["status"]) > 0
|
||||||
|
self.isFinished = int(d["lottery_info"]["status"]) == 2
|
||||||
|
self.joinedUserCount = int(d["lottery_info"]["candidate_num"])
|
||||||
|
if self.isFinished:
|
||||||
|
self.luckyUsers = [ LuckyUser(i) for i in d["lottery_info"]["lucky_users"] ]
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
if self.isFinished:
|
||||||
|
ret = "恭喜以下中奖用户:\n"
|
||||||
|
for i in self.luckyUsers:
|
||||||
|
ret += "> {} {}\n".format(i,self.prizeName)
|
||||||
|
ret += "> 参与人数:{}".format(self.joinedUserCount)
|
||||||
|
return ret
|
||||||
|
elif self.isActive:
|
||||||
|
return "正在抽奖中。。。\n" \
|
||||||
|
"> 参与人数:{}".format(self.joinedUserCount)
|
||||||
|
else:
|
||||||
|
return "抽奖已失效"
|
19
Struct/LuckyUser.py
Normal file
19
Struct/LuckyUser.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
from .User import User
|
||||||
|
|
||||||
|
class LuckyUser:
|
||||||
|
|
||||||
|
user = None
|
||||||
|
count = 0
|
||||||
|
|
||||||
|
def __init__(self, json=None):
|
||||||
|
if json:
|
||||||
|
self.parse(json)
|
||||||
|
|
||||||
|
def parse(self, json):
|
||||||
|
self.user = User()
|
||||||
|
self.user.ID = json['user_id']
|
||||||
|
self.user.name = json['user_name']
|
||||||
|
self.count = int(json["grant_count"])
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "用户 {} 获得了 {} 个".format(self.user,self.count)
|
@ -1,10 +1,10 @@
|
|||||||
from User import User
|
from .User import User
|
||||||
|
|
||||||
|
|
||||||
class MemberMsg:
|
class MemberMsg:
|
||||||
type:int = 0
|
type = 0
|
||||||
content:str = ""
|
content = ""
|
||||||
user:User = None
|
user = None
|
||||||
|
|
||||||
def __init__(self, json=None):
|
def __init__(self, json=None):
|
||||||
if json:
|
if json:
|
||||||
@ -28,7 +28,8 @@ class MemberMsg:
|
|||||||
elif self.type == 1:
|
elif self.type == 1:
|
||||||
return "{} 进入了房间".format(self.user)
|
return "{} 进入了房间".format(self.user)
|
||||||
else:
|
else:
|
||||||
print(self.type)
|
if self.content == "":
|
||||||
|
return "未知消息{} 关于用户 {}".format(self.type, self.user)
|
||||||
return self.content.format(self.user)
|
return self.content.format(self.user)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
@ -1,15 +1,33 @@
|
|||||||
class User:
|
from XiguaUser_pb2 import User as UserPb
|
||||||
ID: int = 0
|
|
||||||
name: str = ""
|
|
||||||
brand: str = ""
|
|
||||||
level: int = 0
|
|
||||||
type: int = 0
|
|
||||||
block: bool = False
|
|
||||||
mute: bool = False
|
|
||||||
|
|
||||||
|
|
||||||
|
class User:
|
||||||
def __init__(self, json=None):
|
def __init__(self, json=None):
|
||||||
|
self.ID = 0
|
||||||
|
self.name = ""
|
||||||
|
self.brand = ""
|
||||||
|
self.level = 0
|
||||||
|
self.type = 0
|
||||||
|
self.block = False
|
||||||
|
self.mute = False
|
||||||
if json:
|
if json:
|
||||||
self.parse(json)
|
if type(json) == bytes:
|
||||||
|
self.parsePb(json)
|
||||||
|
elif type(json) == UserPb:
|
||||||
|
self.parseUserPb(json)
|
||||||
|
else:
|
||||||
|
self.parse(json)
|
||||||
|
|
||||||
|
def parseUserPb(self, _user):
|
||||||
|
self.ID = _user.id
|
||||||
|
self.name = _user.nickname
|
||||||
|
self.brand = _user.fansClub.fansClub.title
|
||||||
|
self.level = _user.fansClub.fansClub.level
|
||||||
|
|
||||||
|
def parsePb(self, raw):
|
||||||
|
_user = UserPb()
|
||||||
|
_user.ParseFromString(raw)
|
||||||
|
self.parseUserPb(_user)
|
||||||
|
|
||||||
def parse(self, json):
|
def parse(self, json):
|
||||||
if "extra" in json:
|
if "extra" in json:
|
||||||
@ -23,10 +41,13 @@ class User:
|
|||||||
self.type = json["extra"]["user_room_auth_status"]["user_type"]
|
self.type = json["extra"]["user_room_auth_status"]["user_type"]
|
||||||
self.block = json["extra"]["user_room_auth_status"]["is_block"]
|
self.block = json["extra"]["user_room_auth_status"]["is_block"]
|
||||||
self.mute = json["extra"]["user_room_auth_status"]["is_silence"]
|
self.mute = json["extra"]["user_room_auth_status"]["is_silence"]
|
||||||
elif "data" in json:
|
elif "user_info" in json and json["user_info"] is not None:
|
||||||
if "anchorInfo" in json["data"]:
|
self.ID = json['user_info']['user_id']
|
||||||
self.ID = json["data"]['anchorInfo']['id']
|
self.name = json['user_info']['name']
|
||||||
self.name = json["data"]['anchorInfo']['name']
|
elif "anchor" in json and json["anchor"] is not None:
|
||||||
|
if "user_info" in json["anchor"] and json["anchor"]['user_info'] is not None:
|
||||||
|
self.ID = json["anchor"]['user_info']['user_id']
|
||||||
|
self.name = json["anchor"]['user_info']['name']
|
||||||
if self.type is None:
|
if self.type is None:
|
||||||
self.type = 0
|
self.type = 0
|
||||||
if isinstance(self.level, str):
|
if isinstance(self.level, str):
|
||||||
@ -43,8 +64,10 @@ class User:
|
|||||||
else:
|
else:
|
||||||
if self.type != 0:
|
if self.type != 0:
|
||||||
return "[{}{}]{}".format(self.brand, self.level, self.name)
|
return "[{}{}]{}".format(self.brand, self.level, self.name)
|
||||||
return "<{}{}>{}".format(self.brand,self.level,self.name)
|
return "<{}{}>{}".format(self.brand, self.level, self.name)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.__str__()
|
return self.__str__()
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "西瓜用户【{}(ID:{})】".format(self.name, self.ID)
|
123
WinMain.py
123
WinMain.py
@ -2,24 +2,27 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from Gift import Gift
|
import requests
|
||||||
from MemberMsg import MemberMsg
|
|
||||||
from User import User
|
|
||||||
|
|
||||||
from Chat import Chat
|
from Struct.MemberMsg import MemberMsg
|
||||||
|
from Struct.User import User
|
||||||
|
from Struct.Gift import Gift
|
||||||
|
from Struct.Chat import Chat
|
||||||
|
from Struct.Lottery import Lottery
|
||||||
from api import XiGuaLiveApi as Api
|
from api import XiGuaLiveApi as Api
|
||||||
import msvcrt
|
import msvcrt
|
||||||
import ctypes
|
import ctypes
|
||||||
|
|
||||||
SHOW_ALL = False
|
SHOW_ALL = False
|
||||||
|
|
||||||
|
|
||||||
def readInput(caption, default, timeout: int = 5):
|
def readInput(caption, default, timeout: int = 5):
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
print('{}({})\r\n>'.format(caption, default), end="")
|
print('{}({})\r\n>'.format(caption, default), end="")
|
||||||
input = ''
|
input = ''
|
||||||
while True:
|
while True:
|
||||||
if msvcrt.kbhit():
|
if msvcrt.kbhit():
|
||||||
chr = msvcrt.getche()
|
chr = msvcrt.getwche()
|
||||||
if ord(chr) == 13: # enter_key
|
if ord(chr) == 13: # enter_key
|
||||||
break
|
break
|
||||||
elif ord(chr) == 27:
|
elif ord(chr) == 27:
|
||||||
@ -28,11 +31,15 @@ def readInput(caption, default, timeout: int = 5):
|
|||||||
if input != "":
|
if input != "":
|
||||||
input = input[:-1]
|
input = input[:-1]
|
||||||
msvcrt.putch(b" ")
|
msvcrt.putch(b" ")
|
||||||
|
msvcrt.putch(b" ")
|
||||||
|
msvcrt.putch(b"\b")
|
||||||
msvcrt.putch(b"\b")
|
msvcrt.putch(b"\b")
|
||||||
if len(input) == 0:
|
if len(input) == 0:
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
elif 32 <= ord(chr) <= 126: # space_char
|
elif 32 > ord(chr) or 255 > ord(chr) > 126: # space_char
|
||||||
input += chr.decode("utf8")
|
continue
|
||||||
|
else:
|
||||||
|
input += chr
|
||||||
if len(input) == 0 and (time.time() - start_time) > timeout:
|
if len(input) == 0 and (time.time() - start_time) > timeout:
|
||||||
break
|
break
|
||||||
|
|
||||||
@ -70,8 +77,9 @@ FOREGROUND_YELLOW = 0x0e # yellow.
|
|||||||
FOREGROUND_WHITE = 0x0f # white.
|
FOREGROUND_WHITE = 0x0f # white.
|
||||||
|
|
||||||
# Windows CMD命令行 背景颜色定义 background colors
|
# Windows CMD命令行 背景颜色定义 background colors
|
||||||
BACKGROUND_BLUE = 0x10 # dark blue.
|
BACKGROUND_BLACK = 0x00 # dark blue.
|
||||||
BACKGROUND_GREEN = 0x20 # dark green.
|
BACKGROUND_DARKBLUE = 0x10 # dark blue.
|
||||||
|
BACKGROUND_DARKGREEN = 0x20 # dark green.
|
||||||
BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue.
|
BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue.
|
||||||
BACKGROUND_DARKRED = 0x40 # dark red.
|
BACKGROUND_DARKRED = 0x40 # dark red.
|
||||||
BACKGROUND_DARKPINK = 0x50 # dark pink.
|
BACKGROUND_DARKPINK = 0x50 # dark pink.
|
||||||
@ -93,7 +101,7 @@ def set_cmd_text_color(color, handle=std_out_handle):
|
|||||||
|
|
||||||
|
|
||||||
def resetColor():
|
def resetColor():
|
||||||
set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
|
set_cmd_text_color(BACKGROUND_BLACK | FOREGROUND_WHITE)
|
||||||
|
|
||||||
|
|
||||||
class WinMain(Api):
|
class WinMain(Api):
|
||||||
@ -103,8 +111,8 @@ class WinMain(Api):
|
|||||||
self._tmp += 1
|
self._tmp += 1
|
||||||
if self._tmp > 10:
|
if self._tmp > 10:
|
||||||
self._tmp = 0
|
self._tmp = 0
|
||||||
if self._tmp < 5 :
|
if self._tmp < 5:
|
||||||
return "{} 的直播间 --弹幕助手 by JerryYan".format(self.roomLiver)
|
return "{} 的直播间 --弹幕助手 by JerryYan".format(self.broadcaster)
|
||||||
else:
|
else:
|
||||||
if self.roomPopularity == 0:
|
if self.roomPopularity == 0:
|
||||||
self._tmp = 0
|
self._tmp = 0
|
||||||
@ -113,47 +121,63 @@ class WinMain(Api):
|
|||||||
return "人气:{} --弹幕助手 by JerryYan".format(self.roomPopularity)
|
return "人气:{} --弹幕助手 by JerryYan".format(self.roomPopularity)
|
||||||
|
|
||||||
def onMessage(self, msg: str):
|
def onMessage(self, msg: str):
|
||||||
set_cmd_text_color(FOREGROUND_DARKGRAY)
|
set_cmd_text_color(BACKGROUND_BLACK | FOREGROUND_DARKGRAY)
|
||||||
print("消息 : ", msg)
|
print("消息 : ", msg, end="")
|
||||||
resetColor()
|
resetColor()
|
||||||
|
print()
|
||||||
|
|
||||||
def onJoin(self, user: User):
|
def onJoin(self, user: User):
|
||||||
set_cmd_text_color(BACKGROUND_WHITE | FOREGROUND_BLACK)
|
set_cmd_text_color(BACKGROUND_WHITE | FOREGROUND_BLACK)
|
||||||
print("感谢", user, "加入了粉丝团")
|
print("欢迎", user, "加入了粉丝团", end="")
|
||||||
resetColor()
|
resetColor()
|
||||||
|
print()
|
||||||
|
|
||||||
def onSubscribe(self, user: User):
|
def onSubscribe(self, user: User):
|
||||||
if SHOW_ALL:
|
if SHOW_ALL:
|
||||||
set_cmd_text_color(FOREGROUND_DARKGRAY)
|
set_cmd_text_color(BACKGROUND_BLACK | FOREGROUND_DARKGRAY)
|
||||||
print("用户", user, "关注了主播")
|
print("用户", user, "关注了主播", end="")
|
||||||
resetColor()
|
resetColor()
|
||||||
|
print()
|
||||||
|
|
||||||
def onEnter(self, msg:MemberMsg):
|
def onEnter(self, msg:MemberMsg):
|
||||||
if SHOW_ALL:
|
if SHOW_ALL:
|
||||||
set_cmd_text_color(FOREGROUND_DARKGRAY)
|
set_cmd_text_color(BACKGROUND_BLACK | FOREGROUND_DARKGRAY)
|
||||||
print("提示 :", msg)
|
print("提示 :", msg, end="")
|
||||||
resetColor()
|
resetColor()
|
||||||
|
print()
|
||||||
|
|
||||||
def onChat(self, chat: Chat):
|
def onChat(self, chat: Chat):
|
||||||
if SHOW_ALL:
|
if SHOW_ALL:
|
||||||
print(chat)
|
set_cmd_text_color(BACKGROUND_BLACK | FOREGROUND_WHITE)
|
||||||
|
if not chat.isFiltered:
|
||||||
|
print(chat, end="")
|
||||||
|
resetColor()
|
||||||
|
print()
|
||||||
|
|
||||||
|
def onLottery(self, i:Lottery):
|
||||||
|
set_cmd_text_color(FOREGROUND_WHITE | BACKGROUND_DARKGRAY)
|
||||||
|
print(i, end="")
|
||||||
|
resetColor()
|
||||||
|
print()
|
||||||
|
|
||||||
def onPresent(self, gift: Gift):
|
def onPresent(self, gift: Gift):
|
||||||
if SHOW_ALL:
|
if SHOW_ALL:
|
||||||
set_cmd_text_color(FOREGROUND_DARKGRAY)
|
set_cmd_text_color(BACKGROUND_BLACK | FOREGROUND_DARKGRAY)
|
||||||
print("连击 :", gift)
|
print("连击 :", gift)
|
||||||
resetColor()
|
resetColor()
|
||||||
|
|
||||||
def onPresentEnd(self, gift: Gift):
|
def onPresentEnd(self, gift: Gift):
|
||||||
set_cmd_text_color(BACKGROUND_WHITE | FOREGROUND_BLACK)
|
set_cmd_text_color(BACKGROUND_WHITE | FOREGROUND_BLACK)
|
||||||
print("感谢", gift)
|
print("感谢", gift, end="")
|
||||||
resetColor()
|
resetColor()
|
||||||
|
print()
|
||||||
|
|
||||||
def onLike(self, user: User):
|
def onLike(self, user: User):
|
||||||
if SHOW_ALL:
|
if SHOW_ALL:
|
||||||
set_cmd_text_color(FOREGROUND_DARKGRAY)
|
set_cmd_text_color(BACKGROUND_BLACK | FOREGROUND_DARKGRAY)
|
||||||
print("用户", user, "点了喜欢")
|
print("用户", user, "点了喜欢", end="")
|
||||||
resetColor()
|
resetColor()
|
||||||
|
print()
|
||||||
|
|
||||||
def onLeave(self, json: any):
|
def onLeave(self, json: any):
|
||||||
return
|
return
|
||||||
@ -164,41 +188,50 @@ def warning(*args):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
room = 97621754276 # 永恒
|
name = "永恒de草薙"
|
||||||
# room = 75366565294
|
|
||||||
# room = 83940182312 #Dae
|
|
||||||
resetColor()
|
resetColor()
|
||||||
print("西瓜直播弹幕助手 by JerryYan")
|
print("西瓜直播礼物助手 by JerryYan")
|
||||||
|
print("接口版本8.1.6")
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
if sys.argv[-1] == "a":
|
name = sys.argv[1]
|
||||||
SHOW_ALL = True
|
if len(sys.argv) > 2:
|
||||||
try:
|
SHOW_ALL = sys.argv[2] == "a"
|
||||||
room = int(sys.argv[1])
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
else:
|
else:
|
||||||
try:
|
name = readInput("请输入主播用户名,默认为", name, 3)
|
||||||
room = int(readInput("请输入用户ID号,默认为永恒的ID号", room, 3))
|
print("搜索【", name, "】", end="\t", flush=True)
|
||||||
except ValueError:
|
api = WinMain(name)
|
||||||
pass
|
if not api.isValidUser:
|
||||||
api = WinMain(room)
|
input("用户不存在")
|
||||||
print("进入", api.roomLiver, "的直播间")
|
|
||||||
if not api.isValidRoom:
|
|
||||||
input("房间不存在")
|
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
print("OK")
|
||||||
|
print(api.broadcaster.__repr__())
|
||||||
|
print("更新房间信息,请稍后", end="\t", flush=True)
|
||||||
os.system("title {}".format(api.getTitle()))
|
os.system("title {}".format(api.getTitle()))
|
||||||
|
if api.updRoomInfo(True):
|
||||||
|
print("OK")
|
||||||
|
else:
|
||||||
|
print("FAIL")
|
||||||
|
print("更新房间礼物信息", end="\t", flush=True)
|
||||||
|
__res = api.updGiftInfo()
|
||||||
|
if __res < 0:
|
||||||
|
print("FAIL")
|
||||||
|
else:
|
||||||
|
print('OK\n礼物种数:', __res)
|
||||||
print("=" * 30)
|
print("=" * 30)
|
||||||
while True:
|
while True:
|
||||||
if api.isLive:
|
if api.isLive:
|
||||||
|
os.system("title {}".format(api.getTitle()))
|
||||||
try:
|
try:
|
||||||
os.system("title {}".format(api.getTitle()))
|
|
||||||
api.getDanmaku()
|
api.getDanmaku()
|
||||||
|
except requests.exceptions.BaseHTTPError:
|
||||||
|
print("网络错误,请确认网络")
|
||||||
|
time.sleep(5)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
warning(e)
|
print(e.__str__())
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
else:
|
else:
|
||||||
set_cmd_text_color(FOREGROUND_RED)
|
set_cmd_text_color(FOREGROUND_RED)
|
||||||
print("主播未开播,等待1分钟后重试")
|
print("主播未开播,等待1分钟后重试")
|
||||||
resetColor()
|
resetColor()
|
||||||
time.sleep(60)
|
time.sleep(60)
|
||||||
api.updRoomInfo()
|
api.updRoomInfo(True)
|
||||||
|
33
WinMain.spec
Normal file
33
WinMain.spec
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# -*- mode: python -*-
|
||||||
|
|
||||||
|
block_cipher = None
|
||||||
|
|
||||||
|
|
||||||
|
a = Analysis(['WinMain.py'],
|
||||||
|
pathex=['E:\\XiGuaLiveDanmakuHelper',r'C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\10.0.18362.0\\ucrt\\DLLs\\x86'],
|
||||||
|
binaries=[],
|
||||||
|
datas=[],
|
||||||
|
hiddenimports=[],
|
||||||
|
hookspath=[],
|
||||||
|
runtime_hooks=[],
|
||||||
|
excludes=[],
|
||||||
|
win_no_prefer_redirects=False,
|
||||||
|
win_private_assemblies=False,
|
||||||
|
cipher=block_cipher,
|
||||||
|
noarchive=False)
|
||||||
|
pyz = PYZ(a.pure, a.zipped_data,
|
||||||
|
cipher=block_cipher)
|
||||||
|
exe = EXE(pyz,
|
||||||
|
a.scripts,
|
||||||
|
a.binaries,
|
||||||
|
a.zipfiles,
|
||||||
|
a.datas,
|
||||||
|
[],
|
||||||
|
name='西瓜直播礼物助手',
|
||||||
|
debug=False,
|
||||||
|
bootloader_ignore_signals=False,
|
||||||
|
strip=False,
|
||||||
|
upx=False,
|
||||||
|
runtime_tmpdir=None,
|
||||||
|
console=True,
|
||||||
|
icon='./ico.ico' )
|
122
XiguaGift_pb2.py
Normal file
122
XiguaGift_pb2.py
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
# source: XiguaGift.proto
|
||||||
|
|
||||||
|
from google.protobuf import descriptor as _descriptor
|
||||||
|
from google.protobuf import message as _message
|
||||||
|
from google.protobuf import reflection as _reflection
|
||||||
|
from google.protobuf import symbol_database as _symbol_database
|
||||||
|
# @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
_sym_db = _symbol_database.Default()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTOR = _descriptor.FileDescriptor(
|
||||||
|
name='XiguaGift.proto',
|
||||||
|
package='',
|
||||||
|
syntax='proto2',
|
||||||
|
serialized_options=None,
|
||||||
|
serialized_pb=b'\n\x0fXiguaGift.proto\" \n\x04Gift\x12\n\n\x02id\x18\x01 \x02(\t\x12\x0c\n\x04name\x18\x02 \x02(\t\"+\n\x08GiftPack\x12\n\n\x02id\x18\x01 \x02(\x05\x12\x13\n\x04gift\x18\x02 \x02(\x0b\x32\x05.Gift'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_GIFT = _descriptor.Descriptor(
|
||||||
|
name='Gift',
|
||||||
|
full_name='Gift',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='id', full_name='Gift.id', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='name', full_name='Gift.name', index=1,
|
||||||
|
number=2, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=19,
|
||||||
|
serialized_end=51,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_GIFTPACK = _descriptor.Descriptor(
|
||||||
|
name='GiftPack',
|
||||||
|
full_name='GiftPack',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='id', full_name='GiftPack.id', index=0,
|
||||||
|
number=1, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='gift', full_name='GiftPack.gift', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=53,
|
||||||
|
serialized_end=96,
|
||||||
|
)
|
||||||
|
|
||||||
|
_GIFTPACK.fields_by_name['gift'].message_type = _GIFT
|
||||||
|
DESCRIPTOR.message_types_by_name['Gift'] = _GIFT
|
||||||
|
DESCRIPTOR.message_types_by_name['GiftPack'] = _GIFTPACK
|
||||||
|
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
|
||||||
|
|
||||||
|
Gift = _reflection.GeneratedProtocolMessageType('Gift', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _GIFT,
|
||||||
|
'__module__' : 'XiguaGift_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:Gift)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(Gift)
|
||||||
|
|
||||||
|
GiftPack = _reflection.GeneratedProtocolMessageType('GiftPack', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _GIFTPACK,
|
||||||
|
'__module__' : 'XiguaGift_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:GiftPack)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(GiftPack)
|
||||||
|
|
||||||
|
|
||||||
|
# @@protoc_insertion_point(module_scope)
|
797
XiguaMessage_pb2.py
Normal file
797
XiguaMessage_pb2.py
Normal file
@ -0,0 +1,797 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
# source: XiguaMessage.proto
|
||||||
|
|
||||||
|
from google.protobuf import descriptor as _descriptor
|
||||||
|
from google.protobuf import message as _message
|
||||||
|
from google.protobuf import reflection as _reflection
|
||||||
|
from google.protobuf import symbol_database as _symbol_database
|
||||||
|
# @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
_sym_db = _symbol_database.Default()
|
||||||
|
|
||||||
|
|
||||||
|
import XiguaUser_pb2 as XiguaUser__pb2
|
||||||
|
import XiguaGift_pb2 as XiguaGift__pb2
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTOR = _descriptor.FileDescriptor(
|
||||||
|
name='XiguaMessage.proto',
|
||||||
|
package='',
|
||||||
|
syntax='proto2',
|
||||||
|
serialized_options=None,
|
||||||
|
serialized_pb=b'\n\x12XiguaMessage.proto\x1a\x0fXiguaUser.proto\x1a\x0fXiguaGift.proto\"*\n\x07Message\x12\x1f\n\ncommonInfo\x18\x01 \x02(\x0b\x32\x0b.CommonInfo\"f\n\x0f\x46\x61nsClubMessage\x12\x1f\n\ncommonInfo\x18\x01 \x02(\x0b\x32\x0b.CommonInfo\x12\x0c\n\x04type\x18\x02 \x02(\x05\x12\x0f\n\x07\x63ontent\x18\x03 \x02(\t\x12\x13\n\x04user\x18\x04 \x02(\x0b\x32\x05.User\"U\n\x14\x46\x61nsClubStatsMessage\x12\x1f\n\ncommonInfo\x18\x01 \x02(\x0b\x32\x0b.CommonInfo\x12\r\n\x05title\x18\x02 \x02(\t\x12\r\n\x05\x63ount\x18\x03 \x02(\x05\"]\n\x0eUserSeqMessage\x12\x1f\n\ncommonInfo\x18\x01 \x02(\x0b\x32\x0b.CommonInfo\x12\x16\n\x0epopularityText\x18\x04 \x02(\t\x12\x12\n\npopularity\x18\x06 \x02(\x05\"D\n\x10\x44\x61ilyRankMessage\x12\x1f\n\ncommonInfo\x18\x01 \x02(\x0b\x32\x0b.CommonInfo\x12\x0f\n\x07ranking\x18\n \x02(\x05\"T\n\x0b\x43hatMessage\x12\x1f\n\ncommonInfo\x18\x01 \x02(\x0b\x32\x0b.CommonInfo\x12\x13\n\x04user\x18\x02 \x02(\x0b\x32\x05.User\x12\x0f\n\x07\x63ontent\x18\x03 \x02(\t\"]\n\rMemberMessage\x12\x1f\n\ncommonInfo\x18\x01 \x02(\x0b\x32\x0b.CommonInfo\x12\x13\n\x04user\x18\x02 \x02(\x0b\x32\x05.User\x12\x16\n\x0epopularityText\x18\x0e \x02(\t\"\xa1\x01\n\x0bGiftMessage\x12\x1f\n\ncommonInfo\x18\x01 \x02(\x0b\x32\x0b.CommonInfo\x12\x0e\n\x06giftId\x18\x02 \x02(\x05\x12\x10\n\x08\x63ontent4\x18\x04 \x02(\x05\x12\x10\n\x08repeated\x18\x05 \x02(\x05\x12\r\n\x05\x63ombo\x18\x06 \x02(\x05\x12\x13\n\x04user\x18\x07 \x01(\x0b\x32\x05.User\x12\x19\n\nisFinished\x18\t \x01(\x08:\x05\x66\x61lse\"f\n\rSocialMessage\x12\x1f\n\ncommonInfo\x18\x01 \x02(\x0b\x32\x0b.CommonInfo\x12\x13\n\x04user\x18\x02 \x02(\x0b\x32\x05.User\x12\x0c\n\x04int4\x18\x04 \x02(\x05\x12\x11\n\tfansCount\x18\x06 \x02(\x05\"*\n\x05Style\x12\r\n\x05\x63olor\x18\x01 \x01(\t\x12\x12\n\nfontWeight\x18\x04 \x01(\x05\"q\n\x06Params\x12\x0c\n\x04type\x18\x01 \x02(\x05\x12\x15\n\x05style\x18\x02 \x01(\x0b\x32\x06.Style\x12\x0e\n\x06string\x18\x0b \x01(\t\x12\x18\n\x05users\x18\x15 \x01(\x0b\x32\t.UserPack\x12\x18\n\x05gifts\x18\x16 \x01(\x0b\x32\t.GiftPack\"_\n\x0b\x44isplayText\x12\x0e\n\x06method\x18\x01 \x02(\t\x12\x0e\n\x06\x66ormat\x18\x02 \x02(\t\x12\x17\n\x07\x62gStyle\x18\x03 \x01(\x0b\x32\x06.Style\x12\x17\n\x06params\x18\x04 \x02(\x0b\x32\x07.Params\"\x87\x01\n\nCommonInfo\x12\x0e\n\x06method\x18\x01 \x02(\t\x12\x0e\n\x06msg_id\x18\x02 \x02(\x05\x12\x0f\n\x07room_id\x18\x03 \x02(\x05\x12\x13\n\x0b\x63reate_time\x18\x04 \x02(\x05\x12\x10\n\x08someEnum\x18\x06 \x01(\x05\x12!\n\x0b\x64isplayText\x18\x08 \x01(\x0b\x32\x0c.DisplayText'
|
||||||
|
,
|
||||||
|
dependencies=[XiguaUser__pb2.DESCRIPTOR,XiguaGift__pb2.DESCRIPTOR,])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_MESSAGE = _descriptor.Descriptor(
|
||||||
|
name='Message',
|
||||||
|
full_name='Message',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='commonInfo', full_name='Message.commonInfo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=56,
|
||||||
|
serialized_end=98,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_FANSCLUBMESSAGE = _descriptor.Descriptor(
|
||||||
|
name='FansClubMessage',
|
||||||
|
full_name='FansClubMessage',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='commonInfo', full_name='FansClubMessage.commonInfo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='type', full_name='FansClubMessage.type', index=1,
|
||||||
|
number=2, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='content', full_name='FansClubMessage.content', index=2,
|
||||||
|
number=3, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='user', full_name='FansClubMessage.user', index=3,
|
||||||
|
number=4, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=100,
|
||||||
|
serialized_end=202,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_FANSCLUBSTATSMESSAGE = _descriptor.Descriptor(
|
||||||
|
name='FansClubStatsMessage',
|
||||||
|
full_name='FansClubStatsMessage',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='commonInfo', full_name='FansClubStatsMessage.commonInfo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='title', full_name='FansClubStatsMessage.title', index=1,
|
||||||
|
number=2, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='count', full_name='FansClubStatsMessage.count', index=2,
|
||||||
|
number=3, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=204,
|
||||||
|
serialized_end=289,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_USERSEQMESSAGE = _descriptor.Descriptor(
|
||||||
|
name='UserSeqMessage',
|
||||||
|
full_name='UserSeqMessage',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='commonInfo', full_name='UserSeqMessage.commonInfo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='popularityText', full_name='UserSeqMessage.popularityText', index=1,
|
||||||
|
number=4, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='popularity', full_name='UserSeqMessage.popularity', index=2,
|
||||||
|
number=6, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=291,
|
||||||
|
serialized_end=384,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_DAILYRANKMESSAGE = _descriptor.Descriptor(
|
||||||
|
name='DailyRankMessage',
|
||||||
|
full_name='DailyRankMessage',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='commonInfo', full_name='DailyRankMessage.commonInfo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='ranking', full_name='DailyRankMessage.ranking', index=1,
|
||||||
|
number=10, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=386,
|
||||||
|
serialized_end=454,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_CHATMESSAGE = _descriptor.Descriptor(
|
||||||
|
name='ChatMessage',
|
||||||
|
full_name='ChatMessage',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='commonInfo', full_name='ChatMessage.commonInfo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='user', full_name='ChatMessage.user', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='content', full_name='ChatMessage.content', index=2,
|
||||||
|
number=3, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=456,
|
||||||
|
serialized_end=540,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_MEMBERMESSAGE = _descriptor.Descriptor(
|
||||||
|
name='MemberMessage',
|
||||||
|
full_name='MemberMessage',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='commonInfo', full_name='MemberMessage.commonInfo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='user', full_name='MemberMessage.user', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='popularityText', full_name='MemberMessage.popularityText', index=2,
|
||||||
|
number=14, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=542,
|
||||||
|
serialized_end=635,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_GIFTMESSAGE = _descriptor.Descriptor(
|
||||||
|
name='GiftMessage',
|
||||||
|
full_name='GiftMessage',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='commonInfo', full_name='GiftMessage.commonInfo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='giftId', full_name='GiftMessage.giftId', index=1,
|
||||||
|
number=2, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='content4', full_name='GiftMessage.content4', index=2,
|
||||||
|
number=4, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='repeated', full_name='GiftMessage.repeated', index=3,
|
||||||
|
number=5, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='combo', full_name='GiftMessage.combo', index=4,
|
||||||
|
number=6, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='user', full_name='GiftMessage.user', index=5,
|
||||||
|
number=7, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='isFinished', full_name='GiftMessage.isFinished', index=6,
|
||||||
|
number=9, type=8, cpp_type=7, label=1,
|
||||||
|
has_default_value=True, default_value=False,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=638,
|
||||||
|
serialized_end=799,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_SOCIALMESSAGE = _descriptor.Descriptor(
|
||||||
|
name='SocialMessage',
|
||||||
|
full_name='SocialMessage',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='commonInfo', full_name='SocialMessage.commonInfo', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='user', full_name='SocialMessage.user', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='int4', full_name='SocialMessage.int4', index=2,
|
||||||
|
number=4, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='fansCount', full_name='SocialMessage.fansCount', index=3,
|
||||||
|
number=6, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=801,
|
||||||
|
serialized_end=903,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_STYLE = _descriptor.Descriptor(
|
||||||
|
name='Style',
|
||||||
|
full_name='Style',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='color', full_name='Style.color', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=1,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='fontWeight', full_name='Style.fontWeight', index=1,
|
||||||
|
number=4, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=905,
|
||||||
|
serialized_end=947,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_PARAMS = _descriptor.Descriptor(
|
||||||
|
name='Params',
|
||||||
|
full_name='Params',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='type', full_name='Params.type', index=0,
|
||||||
|
number=1, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='style', full_name='Params.style', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='string', full_name='Params.string', index=2,
|
||||||
|
number=11, type=9, cpp_type=9, label=1,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='users', full_name='Params.users', index=3,
|
||||||
|
number=21, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='gifts', full_name='Params.gifts', index=4,
|
||||||
|
number=22, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=949,
|
||||||
|
serialized_end=1062,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_DISPLAYTEXT = _descriptor.Descriptor(
|
||||||
|
name='DisplayText',
|
||||||
|
full_name='DisplayText',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='method', full_name='DisplayText.method', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='format', full_name='DisplayText.format', index=1,
|
||||||
|
number=2, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='bgStyle', full_name='DisplayText.bgStyle', index=2,
|
||||||
|
number=3, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='params', full_name='DisplayText.params', index=3,
|
||||||
|
number=4, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=1064,
|
||||||
|
serialized_end=1159,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_COMMONINFO = _descriptor.Descriptor(
|
||||||
|
name='CommonInfo',
|
||||||
|
full_name='CommonInfo',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='method', full_name='CommonInfo.method', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='msg_id', full_name='CommonInfo.msg_id', index=1,
|
||||||
|
number=2, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='room_id', full_name='CommonInfo.room_id', index=2,
|
||||||
|
number=3, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='create_time', full_name='CommonInfo.create_time', index=3,
|
||||||
|
number=4, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='someEnum', full_name='CommonInfo.someEnum', index=4,
|
||||||
|
number=6, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='displayText', full_name='CommonInfo.displayText', index=5,
|
||||||
|
number=8, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=1162,
|
||||||
|
serialized_end=1297,
|
||||||
|
)
|
||||||
|
|
||||||
|
_MESSAGE.fields_by_name['commonInfo'].message_type = _COMMONINFO
|
||||||
|
_FANSCLUBMESSAGE.fields_by_name['commonInfo'].message_type = _COMMONINFO
|
||||||
|
_FANSCLUBMESSAGE.fields_by_name['user'].message_type = XiguaUser__pb2._USER
|
||||||
|
_FANSCLUBSTATSMESSAGE.fields_by_name['commonInfo'].message_type = _COMMONINFO
|
||||||
|
_USERSEQMESSAGE.fields_by_name['commonInfo'].message_type = _COMMONINFO
|
||||||
|
_DAILYRANKMESSAGE.fields_by_name['commonInfo'].message_type = _COMMONINFO
|
||||||
|
_CHATMESSAGE.fields_by_name['commonInfo'].message_type = _COMMONINFO
|
||||||
|
_CHATMESSAGE.fields_by_name['user'].message_type = XiguaUser__pb2._USER
|
||||||
|
_MEMBERMESSAGE.fields_by_name['commonInfo'].message_type = _COMMONINFO
|
||||||
|
_MEMBERMESSAGE.fields_by_name['user'].message_type = XiguaUser__pb2._USER
|
||||||
|
_GIFTMESSAGE.fields_by_name['commonInfo'].message_type = _COMMONINFO
|
||||||
|
_GIFTMESSAGE.fields_by_name['user'].message_type = XiguaUser__pb2._USER
|
||||||
|
_SOCIALMESSAGE.fields_by_name['commonInfo'].message_type = _COMMONINFO
|
||||||
|
_SOCIALMESSAGE.fields_by_name['user'].message_type = XiguaUser__pb2._USER
|
||||||
|
_PARAMS.fields_by_name['style'].message_type = _STYLE
|
||||||
|
_PARAMS.fields_by_name['users'].message_type = XiguaUser__pb2._USERPACK
|
||||||
|
_PARAMS.fields_by_name['gifts'].message_type = XiguaGift__pb2._GIFTPACK
|
||||||
|
_DISPLAYTEXT.fields_by_name['bgStyle'].message_type = _STYLE
|
||||||
|
_DISPLAYTEXT.fields_by_name['params'].message_type = _PARAMS
|
||||||
|
_COMMONINFO.fields_by_name['displayText'].message_type = _DISPLAYTEXT
|
||||||
|
DESCRIPTOR.message_types_by_name['Message'] = _MESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['FansClubMessage'] = _FANSCLUBMESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['FansClubStatsMessage'] = _FANSCLUBSTATSMESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['UserSeqMessage'] = _USERSEQMESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['DailyRankMessage'] = _DAILYRANKMESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['ChatMessage'] = _CHATMESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['MemberMessage'] = _MEMBERMESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['GiftMessage'] = _GIFTMESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['SocialMessage'] = _SOCIALMESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['Style'] = _STYLE
|
||||||
|
DESCRIPTOR.message_types_by_name['Params'] = _PARAMS
|
||||||
|
DESCRIPTOR.message_types_by_name['DisplayText'] = _DISPLAYTEXT
|
||||||
|
DESCRIPTOR.message_types_by_name['CommonInfo'] = _COMMONINFO
|
||||||
|
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
|
||||||
|
|
||||||
|
Message = _reflection.GeneratedProtocolMessageType('Message', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _MESSAGE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:Message)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(Message)
|
||||||
|
|
||||||
|
FansClubMessage = _reflection.GeneratedProtocolMessageType('FansClubMessage', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _FANSCLUBMESSAGE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:FansClubMessage)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(FansClubMessage)
|
||||||
|
|
||||||
|
FansClubStatsMessage = _reflection.GeneratedProtocolMessageType('FansClubStatsMessage', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _FANSCLUBSTATSMESSAGE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:FansClubStatsMessage)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(FansClubStatsMessage)
|
||||||
|
|
||||||
|
UserSeqMessage = _reflection.GeneratedProtocolMessageType('UserSeqMessage', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _USERSEQMESSAGE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:UserSeqMessage)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(UserSeqMessage)
|
||||||
|
|
||||||
|
DailyRankMessage = _reflection.GeneratedProtocolMessageType('DailyRankMessage', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _DAILYRANKMESSAGE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:DailyRankMessage)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(DailyRankMessage)
|
||||||
|
|
||||||
|
ChatMessage = _reflection.GeneratedProtocolMessageType('ChatMessage', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _CHATMESSAGE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:ChatMessage)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(ChatMessage)
|
||||||
|
|
||||||
|
MemberMessage = _reflection.GeneratedProtocolMessageType('MemberMessage', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _MEMBERMESSAGE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:MemberMessage)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(MemberMessage)
|
||||||
|
|
||||||
|
GiftMessage = _reflection.GeneratedProtocolMessageType('GiftMessage', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _GIFTMESSAGE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:GiftMessage)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(GiftMessage)
|
||||||
|
|
||||||
|
SocialMessage = _reflection.GeneratedProtocolMessageType('SocialMessage', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _SOCIALMESSAGE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:SocialMessage)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(SocialMessage)
|
||||||
|
|
||||||
|
Style = _reflection.GeneratedProtocolMessageType('Style', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _STYLE,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:Style)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(Style)
|
||||||
|
|
||||||
|
Params = _reflection.GeneratedProtocolMessageType('Params', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _PARAMS,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:Params)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(Params)
|
||||||
|
|
||||||
|
DisplayText = _reflection.GeneratedProtocolMessageType('DisplayText', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _DISPLAYTEXT,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:DisplayText)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(DisplayText)
|
||||||
|
|
||||||
|
CommonInfo = _reflection.GeneratedProtocolMessageType('CommonInfo', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _COMMONINFO,
|
||||||
|
'__module__' : 'XiguaMessage_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:CommonInfo)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(CommonInfo)
|
||||||
|
|
||||||
|
|
||||||
|
# @@protoc_insertion_point(module_scope)
|
727
XiguaUser_pb2.py
Normal file
727
XiguaUser_pb2.py
Normal file
@ -0,0 +1,727 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
# source: XiguaUser.proto
|
||||||
|
|
||||||
|
from google.protobuf import descriptor as _descriptor
|
||||||
|
from google.protobuf import message as _message
|
||||||
|
from google.protobuf import reflection as _reflection
|
||||||
|
from google.protobuf import symbol_database as _symbol_database
|
||||||
|
# @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
_sym_db = _symbol_database.Default()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTOR = _descriptor.FileDescriptor(
|
||||||
|
name='XiguaUser.proto',
|
||||||
|
package='',
|
||||||
|
syntax='proto2',
|
||||||
|
serialized_options=None,
|
||||||
|
serialized_pb=b'\n\x0fXiguaUser.proto\"\x1f\n\x08UserPack\x12\x13\n\x04user\x18\x01 \x02(\x0b\x32\x05.User\"\xb6\x01\n\x05\x42\x61\x64ge\x12\x0b\n\x03url\x18\x01 \x03(\t\x12\x0e\n\x06height\x18\x03 \x01(\x05\x12\r\n\x05width\x18\x04 \x01(\x05\x12\x0c\n\x04type\x18\x06 \x01(\x05\x12\x0f\n\x07\x63lickTo\x18\x07 \x01(\t\x12\'\n\x0b\x66\x61nClubText\x18\x08 \x01(\x0b\x32\x12.Badge.FanClubText\x1a\x39\n\x0b\x46\x61nClubText\x12\x0c\n\x04text\x18\x01 \x02(\t\x12\r\n\x05\x63olor\x18\x02 \x01(\t\x12\r\n\x05level\x18\x03 \x02(\x05\"y\n\x0c\x46\x61nsClubPack\x12(\n\x08\x66\x61nsClub\x18\x01 \x02(\x0b\x32\x16.FansClubPack.FansClub\x1a?\n\x08\x46\x61nsClub\x12\x0f\n\x05title\x18\x01 \x02(\t:\x00\x12\x10\n\x05level\x18\x02 \x02(\x05:\x01\x30\x12\x10\n\x08someEnum\x18\x03 \x01(\x05\"\xd8\x05\n\x04User\x12\n\n\x02id\x18\x01 \x02(\x03\x12\x10\n\x08nickname\x18\x03 \x02(\t\x12\x0e\n\x06gender\x18\x04 \x02(\x05\x12!\n\x0b\x61vatarThumb\x18\t \x02(\x0b\x32\x0c.User.Avatar\x12\"\n\x0c\x61vatarMedium\x18\n \x01(\x0b\x32\x0c.User.Avatar\x12!\n\x0b\x61vatarLarge\x18\x0b \x01(\x0b\x32\x0c.User.Avatar\x12\x15\n\x05\x62\x61\x64ge\x18\x15 \x03(\x0b\x32\x06.Badge\x12\x1c\n\x06\x66ollow\x18\x16 \x01(\x0b\x32\x0c.User.Follow\x12 \n\x08payGrade\x18\x17 \x02(\x0b\x32\x0e.User.PayGrade\x12\x1f\n\x08\x66\x61nsClub\x18\x18 \x02(\x0b\x32\r.FansClubPack\x12\x11\n\ttotalPaid\x18\" \x02(\x05\x1a!\n\x06\x41vatar\x12\x0b\n\x03url\x18\x01 \x02(\t\x12\n\n\x02id\x18\x02 \x01(\t\x1a\x33\n\x06\x46ollow\x12\x14\n\tfollowing\x18\x01 \x01(\x05:\x01\x30\x12\x13\n\x08\x66ollower\x18\x02 \x01(\x05:\x01\x30\x1a\x9c\x01\n\x08PayGrade\x12\x0f\n\x07\x63urrent\x18\x01 \x02(\x05\x12\r\n\x05level\x18\x06 \x02(\x05\x12\x18\n\x10\x63urrentLevelNeed\x18\n \x01(\x05\x12\x15\n\rnextLevelNeed\x18\x0b \x01(\x05\x12\x0f\n\x07\x63ontent\x18\r \x01(\t\x12\x15\n\x05\x62\x61\x64ge\x18\x13 \x02(\x0b\x32\x06.Badge\x12\x17\n\x0ftoNextLevelNeed\x18\x15 \x01(\x05\x1a#\n\nHonorLevel\x12\x15\n\x05\x62\x61\x64ge\x18\x13 \x02(\x0b\x32\x06.Badge\x1a\x90\x01\n\x05Noble\x12\x0f\n\x07\x63ontent\x18\x04 \x02(\t\x12)\n\x07\x62oarder\x18\x08 \x01(\x0b\x32\x18.User.Noble.NobleBoarder\x1aK\n\x0cNobleBoarder\x12\x0f\n\x07urlList\x18\x01 \x03(\t\x12\x0b\n\x03uri\x18\x02 \x02(\t\x12\x0e\n\x06height\x18\x03 \x01(\x05\x12\r\n\x05width\x18\x04 \x01(\x05'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_USERPACK = _descriptor.Descriptor(
|
||||||
|
name='UserPack',
|
||||||
|
full_name='UserPack',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='user', full_name='UserPack.user', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=19,
|
||||||
|
serialized_end=50,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_BADGE_FANCLUBTEXT = _descriptor.Descriptor(
|
||||||
|
name='FanClubText',
|
||||||
|
full_name='Badge.FanClubText',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='text', full_name='Badge.FanClubText.text', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='color', full_name='Badge.FanClubText.color', index=1,
|
||||||
|
number=2, type=9, cpp_type=9, label=1,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='level', full_name='Badge.FanClubText.level', index=2,
|
||||||
|
number=3, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=178,
|
||||||
|
serialized_end=235,
|
||||||
|
)
|
||||||
|
|
||||||
|
_BADGE = _descriptor.Descriptor(
|
||||||
|
name='Badge',
|
||||||
|
full_name='Badge',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='url', full_name='Badge.url', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='height', full_name='Badge.height', index=1,
|
||||||
|
number=3, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='width', full_name='Badge.width', index=2,
|
||||||
|
number=4, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='type', full_name='Badge.type', index=3,
|
||||||
|
number=6, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='clickTo', full_name='Badge.clickTo', index=4,
|
||||||
|
number=7, type=9, cpp_type=9, label=1,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='fanClubText', full_name='Badge.fanClubText', index=5,
|
||||||
|
number=8, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[_BADGE_FANCLUBTEXT, ],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=53,
|
||||||
|
serialized_end=235,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_FANSCLUBPACK_FANSCLUB = _descriptor.Descriptor(
|
||||||
|
name='FansClub',
|
||||||
|
full_name='FansClubPack.FansClub',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='title', full_name='FansClubPack.FansClub.title', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=True, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='level', full_name='FansClubPack.FansClub.level', index=1,
|
||||||
|
number=2, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=True, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='someEnum', full_name='FansClubPack.FansClub.someEnum', index=2,
|
||||||
|
number=3, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=295,
|
||||||
|
serialized_end=358,
|
||||||
|
)
|
||||||
|
|
||||||
|
_FANSCLUBPACK = _descriptor.Descriptor(
|
||||||
|
name='FansClubPack',
|
||||||
|
full_name='FansClubPack',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='fansClub', full_name='FansClubPack.fansClub', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[_FANSCLUBPACK_FANSCLUB, ],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=237,
|
||||||
|
serialized_end=358,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_USER_AVATAR = _descriptor.Descriptor(
|
||||||
|
name='Avatar',
|
||||||
|
full_name='User.Avatar',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='url', full_name='User.Avatar.url', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='id', full_name='User.Avatar.id', index=1,
|
||||||
|
number=2, type=9, cpp_type=9, label=1,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=660,
|
||||||
|
serialized_end=693,
|
||||||
|
)
|
||||||
|
|
||||||
|
_USER_FOLLOW = _descriptor.Descriptor(
|
||||||
|
name='Follow',
|
||||||
|
full_name='User.Follow',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='following', full_name='User.Follow.following', index=0,
|
||||||
|
number=1, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=True, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='follower', full_name='User.Follow.follower', index=1,
|
||||||
|
number=2, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=True, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=695,
|
||||||
|
serialized_end=746,
|
||||||
|
)
|
||||||
|
|
||||||
|
_USER_PAYGRADE = _descriptor.Descriptor(
|
||||||
|
name='PayGrade',
|
||||||
|
full_name='User.PayGrade',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='current', full_name='User.PayGrade.current', index=0,
|
||||||
|
number=1, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='level', full_name='User.PayGrade.level', index=1,
|
||||||
|
number=6, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='currentLevelNeed', full_name='User.PayGrade.currentLevelNeed', index=2,
|
||||||
|
number=10, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='nextLevelNeed', full_name='User.PayGrade.nextLevelNeed', index=3,
|
||||||
|
number=11, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='content', full_name='User.PayGrade.content', index=4,
|
||||||
|
number=13, type=9, cpp_type=9, label=1,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='badge', full_name='User.PayGrade.badge', index=5,
|
||||||
|
number=19, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='toNextLevelNeed', full_name='User.PayGrade.toNextLevelNeed', index=6,
|
||||||
|
number=21, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=749,
|
||||||
|
serialized_end=905,
|
||||||
|
)
|
||||||
|
|
||||||
|
_USER_HONORLEVEL = _descriptor.Descriptor(
|
||||||
|
name='HonorLevel',
|
||||||
|
full_name='User.HonorLevel',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='badge', full_name='User.HonorLevel.badge', index=0,
|
||||||
|
number=19, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=907,
|
||||||
|
serialized_end=942,
|
||||||
|
)
|
||||||
|
|
||||||
|
_USER_NOBLE_NOBLEBOARDER = _descriptor.Descriptor(
|
||||||
|
name='NobleBoarder',
|
||||||
|
full_name='User.Noble.NobleBoarder',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='urlList', full_name='User.Noble.NobleBoarder.urlList', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='uri', full_name='User.Noble.NobleBoarder.uri', index=1,
|
||||||
|
number=2, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='height', full_name='User.Noble.NobleBoarder.height', index=2,
|
||||||
|
number=3, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='width', full_name='User.Noble.NobleBoarder.width', index=3,
|
||||||
|
number=4, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=1014,
|
||||||
|
serialized_end=1089,
|
||||||
|
)
|
||||||
|
|
||||||
|
_USER_NOBLE = _descriptor.Descriptor(
|
||||||
|
name='Noble',
|
||||||
|
full_name='User.Noble',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='content', full_name='User.Noble.content', index=0,
|
||||||
|
number=4, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='boarder', full_name='User.Noble.boarder', index=1,
|
||||||
|
number=8, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[_USER_NOBLE_NOBLEBOARDER, ],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=945,
|
||||||
|
serialized_end=1089,
|
||||||
|
)
|
||||||
|
|
||||||
|
_USER = _descriptor.Descriptor(
|
||||||
|
name='User',
|
||||||
|
full_name='User',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='id', full_name='User.id', index=0,
|
||||||
|
number=1, type=3, cpp_type=2, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='nickname', full_name='User.nickname', index=1,
|
||||||
|
number=3, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='gender', full_name='User.gender', index=2,
|
||||||
|
number=4, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='avatarThumb', full_name='User.avatarThumb', index=3,
|
||||||
|
number=9, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='avatarMedium', full_name='User.avatarMedium', index=4,
|
||||||
|
number=10, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='avatarLarge', full_name='User.avatarLarge', index=5,
|
||||||
|
number=11, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='badge', full_name='User.badge', index=6,
|
||||||
|
number=21, type=11, cpp_type=10, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='follow', full_name='User.follow', index=7,
|
||||||
|
number=22, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='payGrade', full_name='User.payGrade', index=8,
|
||||||
|
number=23, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='fansClub', full_name='User.fansClub', index=9,
|
||||||
|
number=24, type=11, cpp_type=10, label=2,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='totalPaid', full_name='User.totalPaid', index=10,
|
||||||
|
number=34, type=5, cpp_type=1, label=2,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[_USER_AVATAR, _USER_FOLLOW, _USER_PAYGRADE, _USER_HONORLEVEL, _USER_NOBLE, ],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=361,
|
||||||
|
serialized_end=1089,
|
||||||
|
)
|
||||||
|
|
||||||
|
_USERPACK.fields_by_name['user'].message_type = _USER
|
||||||
|
_BADGE_FANCLUBTEXT.containing_type = _BADGE
|
||||||
|
_BADGE.fields_by_name['fanClubText'].message_type = _BADGE_FANCLUBTEXT
|
||||||
|
_FANSCLUBPACK_FANSCLUB.containing_type = _FANSCLUBPACK
|
||||||
|
_FANSCLUBPACK.fields_by_name['fansClub'].message_type = _FANSCLUBPACK_FANSCLUB
|
||||||
|
_USER_AVATAR.containing_type = _USER
|
||||||
|
_USER_FOLLOW.containing_type = _USER
|
||||||
|
_USER_PAYGRADE.fields_by_name['badge'].message_type = _BADGE
|
||||||
|
_USER_PAYGRADE.containing_type = _USER
|
||||||
|
_USER_HONORLEVEL.fields_by_name['badge'].message_type = _BADGE
|
||||||
|
_USER_HONORLEVEL.containing_type = _USER
|
||||||
|
_USER_NOBLE_NOBLEBOARDER.containing_type = _USER_NOBLE
|
||||||
|
_USER_NOBLE.fields_by_name['boarder'].message_type = _USER_NOBLE_NOBLEBOARDER
|
||||||
|
_USER_NOBLE.containing_type = _USER
|
||||||
|
_USER.fields_by_name['avatarThumb'].message_type = _USER_AVATAR
|
||||||
|
_USER.fields_by_name['avatarMedium'].message_type = _USER_AVATAR
|
||||||
|
_USER.fields_by_name['avatarLarge'].message_type = _USER_AVATAR
|
||||||
|
_USER.fields_by_name['badge'].message_type = _BADGE
|
||||||
|
_USER.fields_by_name['follow'].message_type = _USER_FOLLOW
|
||||||
|
_USER.fields_by_name['payGrade'].message_type = _USER_PAYGRADE
|
||||||
|
_USER.fields_by_name['fansClub'].message_type = _FANSCLUBPACK
|
||||||
|
DESCRIPTOR.message_types_by_name['UserPack'] = _USERPACK
|
||||||
|
DESCRIPTOR.message_types_by_name['Badge'] = _BADGE
|
||||||
|
DESCRIPTOR.message_types_by_name['FansClubPack'] = _FANSCLUBPACK
|
||||||
|
DESCRIPTOR.message_types_by_name['User'] = _USER
|
||||||
|
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
|
||||||
|
|
||||||
|
UserPack = _reflection.GeneratedProtocolMessageType('UserPack', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _USERPACK,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:UserPack)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(UserPack)
|
||||||
|
|
||||||
|
Badge = _reflection.GeneratedProtocolMessageType('Badge', (_message.Message,), {
|
||||||
|
|
||||||
|
'FanClubText' : _reflection.GeneratedProtocolMessageType('FanClubText', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _BADGE_FANCLUBTEXT,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:Badge.FanClubText)
|
||||||
|
})
|
||||||
|
,
|
||||||
|
'DESCRIPTOR' : _BADGE,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:Badge)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(Badge)
|
||||||
|
_sym_db.RegisterMessage(Badge.FanClubText)
|
||||||
|
|
||||||
|
FansClubPack = _reflection.GeneratedProtocolMessageType('FansClubPack', (_message.Message,), {
|
||||||
|
|
||||||
|
'FansClub' : _reflection.GeneratedProtocolMessageType('FansClub', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _FANSCLUBPACK_FANSCLUB,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:FansClubPack.FansClub)
|
||||||
|
})
|
||||||
|
,
|
||||||
|
'DESCRIPTOR' : _FANSCLUBPACK,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:FansClubPack)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(FansClubPack)
|
||||||
|
_sym_db.RegisterMessage(FansClubPack.FansClub)
|
||||||
|
|
||||||
|
User = _reflection.GeneratedProtocolMessageType('User', (_message.Message,), {
|
||||||
|
|
||||||
|
'Avatar' : _reflection.GeneratedProtocolMessageType('Avatar', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _USER_AVATAR,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:User.Avatar)
|
||||||
|
})
|
||||||
|
,
|
||||||
|
|
||||||
|
'Follow' : _reflection.GeneratedProtocolMessageType('Follow', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _USER_FOLLOW,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:User.Follow)
|
||||||
|
})
|
||||||
|
,
|
||||||
|
|
||||||
|
'PayGrade' : _reflection.GeneratedProtocolMessageType('PayGrade', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _USER_PAYGRADE,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:User.PayGrade)
|
||||||
|
})
|
||||||
|
,
|
||||||
|
|
||||||
|
'HonorLevel' : _reflection.GeneratedProtocolMessageType('HonorLevel', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _USER_HONORLEVEL,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:User.HonorLevel)
|
||||||
|
})
|
||||||
|
,
|
||||||
|
|
||||||
|
'Noble' : _reflection.GeneratedProtocolMessageType('Noble', (_message.Message,), {
|
||||||
|
|
||||||
|
'NobleBoarder' : _reflection.GeneratedProtocolMessageType('NobleBoarder', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _USER_NOBLE_NOBLEBOARDER,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:User.Noble.NobleBoarder)
|
||||||
|
})
|
||||||
|
,
|
||||||
|
'DESCRIPTOR' : _USER_NOBLE,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:User.Noble)
|
||||||
|
})
|
||||||
|
,
|
||||||
|
'DESCRIPTOR' : _USER,
|
||||||
|
'__module__' : 'XiguaUser_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:User)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(User)
|
||||||
|
_sym_db.RegisterMessage(User.Avatar)
|
||||||
|
_sym_db.RegisterMessage(User.Follow)
|
||||||
|
_sym_db.RegisterMessage(User.PayGrade)
|
||||||
|
_sym_db.RegisterMessage(User.HonorLevel)
|
||||||
|
_sym_db.RegisterMessage(User.Noble)
|
||||||
|
_sym_db.RegisterMessage(User.Noble.NobleBoarder)
|
||||||
|
|
||||||
|
|
||||||
|
# @@protoc_insertion_point(module_scope)
|
143
Xigua_pb2.py
Normal file
143
Xigua_pb2.py
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
# source: Xigua.proto
|
||||||
|
|
||||||
|
from google.protobuf import descriptor as _descriptor
|
||||||
|
from google.protobuf import message as _message
|
||||||
|
from google.protobuf import reflection as _reflection
|
||||||
|
from google.protobuf import symbol_database as _symbol_database
|
||||||
|
# @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
_sym_db = _symbol_database.Default()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTOR = _descriptor.FileDescriptor(
|
||||||
|
name='Xigua.proto',
|
||||||
|
package='',
|
||||||
|
syntax='proto2',
|
||||||
|
serialized_options=None,
|
||||||
|
serialized_pb=b'\n\x0bXigua.proto\"\x9a\x01\n\tXiguaLive\x12\x1d\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32\x0f.XiguaLive.Data\x12\x0e\n\x06\x63ursor\x18\x02 \x02(\t\x12\x16\n\x0e\x66\x65tch_interval\x18\x03 \x01(\x05\x12\x0b\n\x03now\x18\x04 \x01(\x05\x12\x14\n\x0cinternal_ext\x18\x05 \x02(\t\x1a#\n\x04\x44\x61ta\x12\x0e\n\x06method\x18\x01 \x02(\t\x12\x0b\n\x03raw\x18\x02 \x02(\x0c'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_XIGUALIVE_DATA = _descriptor.Descriptor(
|
||||||
|
name='Data',
|
||||||
|
full_name='XiguaLive.Data',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='method', full_name='XiguaLive.Data.method', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='raw', full_name='XiguaLive.Data.raw', index=1,
|
||||||
|
number=2, type=12, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"",
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=135,
|
||||||
|
serialized_end=170,
|
||||||
|
)
|
||||||
|
|
||||||
|
_XIGUALIVE = _descriptor.Descriptor(
|
||||||
|
name='XiguaLive',
|
||||||
|
full_name='XiguaLive',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='data', full_name='XiguaLive.data', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='cursor', full_name='XiguaLive.cursor', index=1,
|
||||||
|
number=2, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='fetch_interval', full_name='XiguaLive.fetch_interval', index=2,
|
||||||
|
number=3, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='now', full_name='XiguaLive.now', index=3,
|
||||||
|
number=4, type=5, cpp_type=1, label=1,
|
||||||
|
has_default_value=False, default_value=0,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='internal_ext', full_name='XiguaLive.internal_ext', index=4,
|
||||||
|
number=5, type=9, cpp_type=9, label=2,
|
||||||
|
has_default_value=False, default_value=b"".decode('utf-8'),
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[_XIGUALIVE_DATA, ],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=16,
|
||||||
|
serialized_end=170,
|
||||||
|
)
|
||||||
|
|
||||||
|
_XIGUALIVE_DATA.containing_type = _XIGUALIVE
|
||||||
|
_XIGUALIVE.fields_by_name['data'].message_type = _XIGUALIVE_DATA
|
||||||
|
DESCRIPTOR.message_types_by_name['XiguaLive'] = _XIGUALIVE
|
||||||
|
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
|
||||||
|
|
||||||
|
XiguaLive = _reflection.GeneratedProtocolMessageType('XiguaLive', (_message.Message,), {
|
||||||
|
|
||||||
|
'Data' : _reflection.GeneratedProtocolMessageType('Data', (_message.Message,), {
|
||||||
|
'DESCRIPTOR' : _XIGUALIVE_DATA,
|
||||||
|
'__module__' : 'Xigua_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:XiguaLive.Data)
|
||||||
|
})
|
||||||
|
,
|
||||||
|
'DESCRIPTOR' : _XIGUALIVE,
|
||||||
|
'__module__' : 'Xigua_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:XiguaLive)
|
||||||
|
})
|
||||||
|
_sym_db.RegisterMessage(XiguaLive)
|
||||||
|
_sym_db.RegisterMessage(XiguaLive.Data)
|
||||||
|
|
||||||
|
|
||||||
|
# @@protoc_insertion_point(module_scope)
|
514
api.py
514
api.py
@ -1,195 +1,453 @@
|
|||||||
|
# coding=utf-8
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from MemberMsg import MemberMsg
|
from Struct.MemberMsg import MemberMsg
|
||||||
from User import User
|
from Struct.User import User
|
||||||
from Gift import Gift
|
from Struct.Gift import Gift
|
||||||
from Chat import Chat
|
from Struct.Chat import Chat
|
||||||
|
from Struct.Lottery import Lottery
|
||||||
import requests
|
import requests
|
||||||
import time
|
import time
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
from Xigua_pb2 import XiguaLive
|
||||||
|
from XiguaMessage_pb2 import FansClubMessage, SocialMessage
|
||||||
|
|
||||||
s = requests.Session()
|
DEBUG = False
|
||||||
|
COMMON_GET_PARAM = (
|
||||||
DEBUG: bool = False
|
"&iid=96159232732&device_id=55714661189&channel=xiaomi&aid=32&app_name=video_article&version_code=816"
|
||||||
|
"&version_name=8.1.6&device_platform=android&ab_version=941090,785218,668858,1046292,1073579,830454,956074,929436,"
|
||||||
|
"797199,1135476,1179370,994679,959010,900042,1113833,668854,1193963,901277,1043330,1038721,994822,1002058,1230687,"
|
||||||
|
"1189797,1143356,1143441,1143501,1143698,1143713,1371009,1243997,1392586,1395695,1395486,1398858,668852,668856,"
|
||||||
|
"668853,1186421,668851,668859,999124,668855,1039075&device_type=MI+8+SE&device_brand=Xiaomi&language=zh"
|
||||||
|
"&os_api=28&os_version=9&openudid=70d6668d41512c39&manifest_version_code=412&update_version_code=81606"
|
||||||
|
"&_rticket={TIMESTAMP:.0f}&cdid_ts={TIMESTAMP:.0f}&fp=a_fake_fp&tma_jssdk_version=1290000"
|
||||||
|
"&cdid=ed4295e8-5d9a-4cb9-b2a2-04009a3baa2d&oaid=a625f466e0975d42")
|
||||||
|
SEARCH_USER_API = (
|
||||||
|
"https://security.snssdk.com/video/app/search/live/?format=json&search_sug=0&forum=0&m_tab=live&is_native_req=0"
|
||||||
|
"&offset=0&from=live&en_qc=1&pd=xigua_live&ssmix=a{COMMON}&keyword={keyword}")
|
||||||
|
USER_INFO_API = "https://is.snssdk.com/video/app/user/home/v7/?to_user_id={userId}{COMMON}"
|
||||||
|
ROOM_INFO_API = ("https://webcast3.ixigua.com/webcast/room/enter/?room_id={roomId}&webcast_sdk_version=1350"
|
||||||
|
"&webcast_language=zh&webcast_locale=zh_CN&pack_level=4{COMMON}")
|
||||||
|
DANMAKU_GET_API = ("https://webcast3.ixigua.com/webcast/room/{roomId}/_fetch_message_polling/?webcast_sdk_version=1350"
|
||||||
|
"&webcast_language=zh&webcast_locale=zh_CN{COMMON}")
|
||||||
|
GIFT_DATA_API = ("https://webcast.ixigua.com/webcast/gift/list/?room_id={roomId}&fetch_giftlist_from=2"
|
||||||
|
"&webcast_sdk_version=1350&webcast_language=zh&webcast_locale=zh_CN{COMMON}")
|
||||||
|
COMMON_HEADERS = {
|
||||||
|
"sdk-version": '1',
|
||||||
|
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9) VideoArticle/8.1.6 cronet/TTNetVersion:b97574c0 2019-09-24",
|
||||||
|
"Accept-Encoding": "gzip, deflate"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class XiGuaLiveApi:
|
class XiGuaLiveApi:
|
||||||
isLive: bool = False
|
|
||||||
isValidRoom: bool = False
|
|
||||||
_rawRoomInfo = {}
|
|
||||||
roomID: int = 0
|
|
||||||
roomTitle: str = ""
|
|
||||||
roomLiver: User = None
|
|
||||||
roomPopularity: int = 0
|
|
||||||
roomMember: int = 0
|
|
||||||
_cursor:str = "0"
|
|
||||||
|
|
||||||
def __init__(self, room: int):
|
def __init__(self, name=None):
|
||||||
self.room = room
|
"""
|
||||||
|
Api类
|
||||||
|
Init Function
|
||||||
|
:param name: class:str|User: 主播名
|
||||||
|
"""
|
||||||
|
if name is None:
|
||||||
|
name = "永恒de草薙"
|
||||||
|
self.broadcaster = None
|
||||||
|
self.isValidUser = False
|
||||||
|
if type(name) == User:
|
||||||
|
self.broadcaster = name
|
||||||
|
self.name = name.name
|
||||||
|
elif str(name).isdigit():
|
||||||
|
self.broadcaster = User()
|
||||||
|
self.isValidUser = True
|
||||||
|
self.broadcaster.ID = int(name)
|
||||||
|
else:
|
||||||
|
self.name = str(name)
|
||||||
|
self.isLive = False
|
||||||
|
self._rawRoomInfo = {}
|
||||||
|
self.roomID = 0
|
||||||
|
self.roomPopularity = 0
|
||||||
|
self.lottery = None
|
||||||
|
self.s = requests.session()
|
||||||
|
self.s.headers.update(COMMON_HEADERS)
|
||||||
|
self._updRoomAt = datetime.fromtimestamp(0)
|
||||||
self.updRoomInfo()
|
self.updRoomInfo()
|
||||||
Gift.update(self.roomID)
|
self._ext = ""
|
||||||
self._enterRoom()
|
self._cursor = "0"
|
||||||
|
|
||||||
def _updateRoomInfo(self, json):
|
def _updateRoomPopularity(self, _data):
|
||||||
if "extra" in json:
|
"""
|
||||||
if "member_count" in json["extra"] and json["extra"]["member_count"] > 0:
|
更新房间人气的方法
|
||||||
self.roomPopularity = json["extra"]["member_count"]
|
Update Room Popularity
|
||||||
elif "data" in json:
|
:param _data: Received Message
|
||||||
if "popularity" in json["data"]:
|
"""
|
||||||
self.roomPopularity = json["data"]["popularity"]
|
if "extra" in _data:
|
||||||
|
if "member_count" in _data["extra"] and _data["extra"]["member_count"] > 0:
|
||||||
|
self.roomPopularity = _data["extra"]["member_count"]
|
||||||
|
if "data" in _data:
|
||||||
|
if "popularity" in _data["data"]:
|
||||||
|
self.roomPopularity = _data["data"]["popularity"]
|
||||||
|
|
||||||
def apiChangedError(self, msg: str, *args):
|
def getJson(self, url, **kwargs):
|
||||||
|
try:
|
||||||
|
p = self.s.get(url, **kwargs)
|
||||||
|
except Exception as e:
|
||||||
|
print("网络请求失败")
|
||||||
|
if DEBUG:
|
||||||
|
print("GET")
|
||||||
|
print("URL", url)
|
||||||
|
print("ERR ", e.__str__())
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
return p.json()
|
||||||
|
except Exception as e:
|
||||||
|
print("解析请求失败")
|
||||||
|
if DEBUG:
|
||||||
|
print("GET JSON")
|
||||||
|
print("URL", url)
|
||||||
|
print("CNT", p.text)
|
||||||
|
print("ERR ", e.__str__())
|
||||||
|
return None
|
||||||
|
|
||||||
|
def postJson(self, url, data, **kwargs):
|
||||||
|
try:
|
||||||
|
p = self.s.post(url, data=data, **kwargs)
|
||||||
|
except Exception as e:
|
||||||
|
print("网络请求失败")
|
||||||
|
if DEBUG:
|
||||||
|
print("POST")
|
||||||
|
print("URL", url)
|
||||||
|
print("ERR ", e.__str__())
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
return p.json()
|
||||||
|
except Exception as e:
|
||||||
|
print("解析请求失败")
|
||||||
|
if DEBUG:
|
||||||
|
print("GET JSON")
|
||||||
|
print("URL", url)
|
||||||
|
print("CNT", p.text)
|
||||||
|
print("ERR ", e.__str__())
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def apiChangedError(msg: str, *args):
|
||||||
|
"""
|
||||||
|
API发生更改时的提示
|
||||||
|
Warning while Detected Api has Changed
|
||||||
|
:param msg: 提示信息
|
||||||
|
:param args: DEBUG模式下,显示更多信息
|
||||||
|
"""
|
||||||
print(msg)
|
print(msg)
|
||||||
print(*args)
|
if DEBUG:
|
||||||
|
print(*args)
|
||||||
|
|
||||||
def onPresent(self, gift: Gift):
|
def onPresent(self, gift: Gift):
|
||||||
|
"""
|
||||||
|
礼物连击中的消息
|
||||||
|
Message On Sending Presents
|
||||||
|
:param gift: Struct of Gift Message
|
||||||
|
"""
|
||||||
print("礼物连击 :", gift)
|
print("礼物连击 :", gift)
|
||||||
|
|
||||||
def onPresentEnd(self, gift: Gift):
|
def onPresentEnd(self, gift: Gift):
|
||||||
|
"""
|
||||||
|
礼物送完了的提示信息
|
||||||
|
Message On Finished Send Present
|
||||||
|
:param gift: Struct of Gift Message
|
||||||
|
"""
|
||||||
print("感谢", gift)
|
print("感谢", gift)
|
||||||
|
|
||||||
def onAd(self, i):
|
def onAd(self, i):
|
||||||
|
"""
|
||||||
|
全局广播
|
||||||
|
All Channel Broadcasting Message( Just An Ad )
|
||||||
|
:param i: JSON DATA if you wanna using it
|
||||||
|
"""
|
||||||
# print(i)
|
# print(i)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def onChat(self, chat: Chat):
|
def onChat(self, chat: Chat):
|
||||||
print(chat)
|
"""
|
||||||
|
聊天信息
|
||||||
|
On Chatting
|
||||||
|
:param chat: Struct of Chat Message
|
||||||
|
"""
|
||||||
|
if not chat.isFiltered:
|
||||||
|
print(chat)
|
||||||
|
|
||||||
def onEnter(self, msg: MemberMsg):
|
def onEnter(self, msg: MemberMsg):
|
||||||
|
"""
|
||||||
|
进入房间消息
|
||||||
|
On Entering Room
|
||||||
|
:param msg: Struct of Member Message
|
||||||
|
"""
|
||||||
print("提示 :", msg)
|
print("提示 :", msg)
|
||||||
|
|
||||||
def onSubscribe(self, user: User):
|
def onSubscribe(self, user: User):
|
||||||
|
"""
|
||||||
|
关注主播时的消息
|
||||||
|
On Subscribe
|
||||||
|
:param user: Struct of User Message
|
||||||
|
"""
|
||||||
print("消息 :", user, "关注了主播")
|
print("消息 :", user, "关注了主播")
|
||||||
|
|
||||||
def onJoin(self, user: User):
|
def onJoin(self, user: User):
|
||||||
print("感谢", user, "加入了粉丝团")
|
"""
|
||||||
|
加入粉丝团消息
|
||||||
|
:param user:
|
||||||
|
"""
|
||||||
|
print("欢迎", user, "加入了粉丝团")
|
||||||
|
|
||||||
def onMessage(self, msg: str):
|
def onMessage(self, msg: str):
|
||||||
|
"""
|
||||||
|
系统消息
|
||||||
|
:param msg:
|
||||||
|
"""
|
||||||
print("消息 :", msg)
|
print("消息 :", msg)
|
||||||
|
|
||||||
def onLike(self, user: User):
|
def onLike(self, user: User):
|
||||||
|
"""
|
||||||
|
点击喜欢的消息
|
||||||
|
On Like
|
||||||
|
:param user:
|
||||||
|
"""
|
||||||
print("用户", user, "点了喜欢")
|
print("用户", user, "点了喜欢")
|
||||||
|
|
||||||
def onLeave(self, json: any):
|
def onLeave(self, json: any):
|
||||||
print("消息 :", "主播离开一小会")
|
"""
|
||||||
|
下播消息
|
||||||
|
On Liver Leave
|
||||||
|
:param json:
|
||||||
|
"""
|
||||||
|
print("消息 :", "主播离开了")
|
||||||
|
self.updRoomInfo()
|
||||||
|
|
||||||
def _enterRoom(self):
|
def onLottery(self, i: Lottery):
|
||||||
if not self.isValidRoom:
|
"""
|
||||||
return
|
中奖的内容
|
||||||
p = s.post("https://i.snssdk.com/videolive/room/enter&version_code=730"
|
:param i:
|
||||||
"&device_platform=android",
|
"""
|
||||||
data="room_id={roomID}&version_code=730"
|
print("中奖消息 :", i)
|
||||||
"&device_platform=android".format(roomID=self.roomID),
|
|
||||||
headers={"Content-Type":"application/x-www-form-urlencoded"})
|
|
||||||
if DEBUG:
|
|
||||||
print(p.text)
|
|
||||||
|
|
||||||
def searchLive(self, keyword):
|
def _checkUsernameIsMatched(self, compare=None):
|
||||||
ret = []
|
"""
|
||||||
p = s.get("https://security.snssdk.com/video/app/search/live/?version_code=730&device_platform=android"
|
验证主播名字是自己想要的那个
|
||||||
"&format=json&keyword={}".format(keyword))
|
Check name matched
|
||||||
d = p.json()
|
:return: bool: 是否匹配
|
||||||
if "data" not in d:
|
"""
|
||||||
|
if compare is None:
|
||||||
|
compare = self.broadcaster
|
||||||
|
if self.name is None or compare is None:
|
||||||
|
return False
|
||||||
|
return self.name == compare.__str__() or compare.__str__() in self.name or self.name in compare.__str__()
|
||||||
|
|
||||||
|
def _forceSearchUser(self):
|
||||||
|
"""
|
||||||
|
搜索主播名
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
_formatData = {"COMMON": COMMON_GET_PARAM, "TIMESTAMP": time.time() * 1000, "keyword": self.name}
|
||||||
|
_url = SEARCH_USER_API.format_map(_formatData).format_map(_formatData)
|
||||||
|
d = self.getJson(_url)
|
||||||
|
if d is None:
|
||||||
|
print("搜索接口请求失败")
|
||||||
|
return False
|
||||||
|
self.broadcaster = None
|
||||||
|
self.isValidUser = False
|
||||||
|
if "data" in d and d["data"] is not None:
|
||||||
for i in d["data"]:
|
for i in d["data"]:
|
||||||
if i["block_type"] != 2:
|
if self.broadcaster is not None:
|
||||||
|
break
|
||||||
|
if i["block_type"] != 0:
|
||||||
continue
|
continue
|
||||||
for _i in i["cells"]:
|
if "cells" not in i or len(i["cells"]) == 0:
|
||||||
ret.append(_i["room"])
|
break
|
||||||
return ret
|
for _j in i["cells"]:
|
||||||
|
_user = User(_j)
|
||||||
|
if self._checkUsernameIsMatched(_user):
|
||||||
|
self.isValidUser = True
|
||||||
|
self.broadcaster = _user
|
||||||
|
break
|
||||||
|
self._updRoomAt = datetime.now()
|
||||||
|
return self._updateUserInfo()
|
||||||
|
|
||||||
def updRoomInfo(self):
|
def _updateUserInfo(self):
|
||||||
p = s.get("https://live.ixigua.com/api/room?anchorId={room}".format(room=self.room))
|
"""
|
||||||
if DEBUG:
|
获取用户信息
|
||||||
print(p.text)
|
:return:
|
||||||
d = p.json()
|
"""
|
||||||
if "data" not in d or "title" not in d["data"] or "id" not in d["data"]:
|
if self.broadcaster is None:
|
||||||
self.apiChangedError("无法获取RoomID,请与我联系")
|
self.isValidUser = False
|
||||||
return
|
return False
|
||||||
self.isValidRoom = True
|
_formatData = {"COMMON": COMMON_GET_PARAM, "TIMESTAMP": time.time() * 1000, "userId": self.broadcaster.ID}
|
||||||
self._rawRoomInfo = d["data"]
|
_url = USER_INFO_API.format_map(_formatData).format_map(_formatData)
|
||||||
self.roomLiver = User(d)
|
d = self.getJson(_url)
|
||||||
self.roomTitle = d["data"]["title"]
|
if d is None:
|
||||||
self.roomID = d["data"]["id"]
|
print("获取用户信息失败")
|
||||||
self._updateRoomInfo(d)
|
return False
|
||||||
if "status" in d["data"] and d["data"]["status"] == 2:
|
self.isValidUser = d["status"] == 0
|
||||||
self.isLive = True
|
if "user_info" not in d and d["user_info"] is None:
|
||||||
else:
|
self.apiChangedError("Api发生改变,请及时联系我", d)
|
||||||
|
return False
|
||||||
|
self.broadcaster = User(d)
|
||||||
|
if not self._checkUsernameIsMatched():
|
||||||
self.isLive = False
|
self.isLive = False
|
||||||
|
return False
|
||||||
|
self.isLive = d["user_info"]["is_living"]
|
||||||
|
self._updRoomAt = datetime.now()
|
||||||
|
self._rawRoomInfo = d["user_info"]['live_info']
|
||||||
|
if self.isLive:
|
||||||
|
self.roomID = d["user_info"]['live_info']['room_id']
|
||||||
|
# 处理抽奖事件
|
||||||
|
l = Lottery(self._rawRoomInfo)
|
||||||
|
if l.isActive:
|
||||||
|
# 因为现在每个房间只能同时开启一个抽奖,所以放一个就行了
|
||||||
|
self.lottery = l
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _getRoomInfo(self, force=False):
|
||||||
|
if self.roomID == 0:
|
||||||
|
self.isLive = False
|
||||||
|
return False
|
||||||
|
if not force and (self._updRoomAt + timedelta(minutes=10) > datetime.now()):
|
||||||
|
return self.isLive
|
||||||
|
_formatData = {"COMMON": COMMON_GET_PARAM, "TIMESTAMP": time.time() * 1000, "roomId": self.roomID}
|
||||||
|
_url = ROOM_INFO_API.format_map(_formatData).format_map(_formatData)
|
||||||
|
d = self.getJson(_url)
|
||||||
|
if d is None:
|
||||||
|
print("获取房间信息接口请求失败")
|
||||||
|
return False
|
||||||
|
if d["status_code"] != 0:
|
||||||
|
print("接口提示:【{}】".format(d["data"]["message"]))
|
||||||
|
return False
|
||||||
|
self._rawRoomInfo = d["data"]
|
||||||
|
self.isLive = d["data"]["status"] == 2
|
||||||
|
self._updRoomAt = datetime.now()
|
||||||
|
self._updateRoomPopularity(d)
|
||||||
|
Gift.roomID = self.roomID
|
||||||
|
return self.isLive
|
||||||
|
|
||||||
|
def updRoomInfo(self, force=False):
|
||||||
|
"""
|
||||||
|
更新房间信息
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
if not force and (self._updRoomAt + timedelta(minutes=2) > datetime.now()):
|
||||||
|
return self.isLive
|
||||||
|
if not self.isValidUser:
|
||||||
|
return self._forceSearchUser()
|
||||||
|
elif not self.isLive:
|
||||||
|
return self._updateUserInfo()
|
||||||
|
else:
|
||||||
|
return self._getRoomInfo(force)
|
||||||
|
|
||||||
|
def updGiftInfo(self):
|
||||||
|
self.updRoomInfo()
|
||||||
|
_formatData = {"COMMON": COMMON_GET_PARAM, "TIMESTAMP": time.time() * 1000, "roomId": self.roomID}
|
||||||
|
_url = GIFT_DATA_API.format_map(_formatData).format_map(_formatData)
|
||||||
|
d = self.getJson(_url)
|
||||||
|
Gift.roomID = self.roomID
|
||||||
|
if d is None or d["status_code"] != 0:
|
||||||
|
Gift.update()
|
||||||
|
elif 'pages' not in d["data"]:
|
||||||
|
Gift.update()
|
||||||
|
else:
|
||||||
|
for _page in d["data"]['pages']:
|
||||||
|
if 'gifts' in _page:
|
||||||
|
for _gift in _page['gifts']:
|
||||||
|
Gift.addGift(_gift)
|
||||||
|
return len(Gift.giftList)
|
||||||
|
|
||||||
def getDanmaku(self):
|
def getDanmaku(self):
|
||||||
if not self.isValidRoom:
|
"""
|
||||||
|
获取弹幕
|
||||||
|
"""
|
||||||
|
self.updRoomInfo()
|
||||||
|
_formatData = {"COMMON": COMMON_GET_PARAM, "TIMESTAMP": time.time() * 1000, "roomId": self.roomID}
|
||||||
|
_url = DANMAKU_GET_API.format_map(_formatData).format_map(_formatData)
|
||||||
|
p = self.s.post(_url, data="cursor={cursor}&resp_content_type=protobuf&live_id=3&user_id=0&identity=audience"
|
||||||
|
"&internal_ext={ext}".format_map({"cursor": self._cursor, "ext": self._ext}),
|
||||||
|
headers={"Content-Type": "application/x-www-form-urlencoded"})
|
||||||
|
if p.status_code != 200:
|
||||||
return
|
return
|
||||||
p = s.get("https://i.snssdk.com/videolive/im/get_msg?cursor={cursor}&room_id={roomID}"
|
data = XiguaLive()
|
||||||
"&version_code=730&device_platform=android".format(
|
data.ParseFromString(p.content)
|
||||||
roomID=self.roomID,
|
self._cursor = data.cursor
|
||||||
cursor=self._cursor
|
self._ext = data.internal_ext
|
||||||
))
|
for _each in data.data:
|
||||||
d = p.json()
|
if _each.method == "WebcastGiftMessage":
|
||||||
if "data" not in d or "extra" not in d or "cursor" not in d["extra"]:
|
_gift = Gift(_each.raw)
|
||||||
if DEBUG:
|
if _gift.isAnimate() or _gift.isFinished:
|
||||||
print(d)
|
self.onPresentEnd(_gift)
|
||||||
self.apiChangedError("数据结构改变,请与我联系")
|
else:
|
||||||
return
|
self.onPresent(_gift)
|
||||||
else:
|
elif _each.method == "WebcastChatMessage":
|
||||||
self._cursor = d["extra"]["cursor"]
|
_chat = Chat(_each.raw)
|
||||||
if DEBUG:
|
self.onChat(_chat)
|
||||||
print("Cursor", self._cursor)
|
elif _each.method == "WebcastSocialMessage":
|
||||||
if len(d['data']) == 0:
|
_socialMessage = SocialMessage()
|
||||||
self.updRoomInfo()
|
_socialMessage.ParseFromString(_each.raw)
|
||||||
return
|
_user = User(_socialMessage.user)
|
||||||
for i in d['data']:
|
self.onSubscribe(_user)
|
||||||
if DEBUG:
|
elif _each.method == "WebcastFansclubMessage":
|
||||||
print(i)
|
_fansClubMessage = FansClubMessage()
|
||||||
if "common" not in i and "method" not in i["common"]:
|
_fansClubMessage.ParseFromString(_each.raw)
|
||||||
continue
|
# 升级是1,加入是2
|
||||||
if i["common"]['method'] == "VideoLivePresentMessage":
|
if _fansClubMessage.type == 2:
|
||||||
self.onPresent(Gift(i))
|
_user = User(_fansClubMessage.user)
|
||||||
elif i["common"]['method'] == "VideoLivePresentEndTipMessage":
|
self.onJoin(_user)
|
||||||
self.onPresentEnd(Gift(i))
|
else:
|
||||||
elif i["common"]['method'] == "VideoLiveRoomAdMessage":
|
self.onMessage(_fansClubMessage.content)
|
||||||
self.onAd(i)
|
|
||||||
elif i["common"]['method'] == "VideoLiveChatMessage":
|
|
||||||
self.onChat(Chat(i))
|
|
||||||
elif i["common"]['method'] == "VideoLiveMemberMessage":
|
|
||||||
self._updateRoomInfo(i)
|
|
||||||
self.onEnter(MemberMsg(i))
|
|
||||||
elif i["common"]['method'] == "VideoLiveSocialMessage":
|
|
||||||
self.onSubscribe(User(i))
|
|
||||||
elif i["common"]['method'] == "VideoLiveJoinDiscipulusMessage":
|
|
||||||
self.onJoin(User(i))
|
|
||||||
elif i["common"]['method'] == "VideoLiveControlMessage":
|
|
||||||
print("消息:", "主播离开一小会")
|
|
||||||
elif i["common"]['method'] == "VideoLiveDiggMessage":
|
|
||||||
self.onLike(User(i))
|
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
# 更新抽奖信息
|
||||||
|
if self.lottery is not None and self.lottery.ID != 0:
|
||||||
|
self.lottery.update()
|
||||||
|
if self.lottery.isFinished:
|
||||||
|
self.onLottery(self.lottery)
|
||||||
|
self.lottery = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def updateAt(self):
|
||||||
|
return self._updRoomAt
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
room = 97621754276 # 永恒
|
name = "永恒de草薙"
|
||||||
# room = 75366565294
|
if len(sys.argv) > 2:
|
||||||
# room = 83940182312 #Dae
|
|
||||||
if len(sys.argv) > 1:
|
|
||||||
if sys.argv[-1] == "d":
|
if sys.argv[-1] == "d":
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
try:
|
name = sys.argv[1]
|
||||||
room = int(sys.argv[1])
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
print("西瓜直播弹幕助手 by JerryYan")
|
print("西瓜直播弹幕助手 by JerryYan")
|
||||||
api = XiGuaLiveApi(room)
|
print("接口版本8.1.6")
|
||||||
print("进入", api.roomLiver, "的直播间")
|
print("搜索【", name, "】", end="\t", flush=True)
|
||||||
if not api.isValidRoom:
|
api = XiGuaLiveApi(name)
|
||||||
input("房间不存在")
|
if not api.isValidUser:
|
||||||
|
input("用户不存在")
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
print("OK")
|
||||||
|
print(api.broadcaster.__repr__())
|
||||||
|
print("更新房间信息,请稍后", end="\t", flush=True)
|
||||||
|
if api.updRoomInfo(True):
|
||||||
|
print("OK")
|
||||||
|
else:
|
||||||
|
print("FAIL")
|
||||||
|
print("更新房间礼物信息", end="\t", flush=True)
|
||||||
|
__res = api.updGiftInfo()
|
||||||
|
if __res < 0:
|
||||||
|
print("FAIL")
|
||||||
|
else:
|
||||||
|
print('OK\n礼物种数:', __res)
|
||||||
print("=" * 30)
|
print("=" * 30)
|
||||||
while True:
|
while True:
|
||||||
if api.isLive:
|
if api.isLive:
|
||||||
try:
|
try:
|
||||||
api.getDanmaku()
|
api.getDanmaku()
|
||||||
except Exception as e:
|
time.sleep(1)
|
||||||
print(e)
|
except requests.exceptions.BaseHTTPError:
|
||||||
time.sleep(1)
|
print("网络错误,请确认网络")
|
||||||
|
time.sleep(5)
|
||||||
|
# except Exception as e:
|
||||||
|
# print(e)
|
||||||
else:
|
else:
|
||||||
print("主播未开播,等待1分钟后重试")
|
print("主播未开播,等待1分钟后重试")
|
||||||
time.sleep(60)
|
time.sleep(60)
|
||||||
api.updRoomInfo()
|
api.updRoomInfo(True)
|
||||||
|
492
bilibili.py
492
bilibili.py
@ -1,492 +0,0 @@
|
|||||||
# coding=utf-8
|
|
||||||
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
import rsa
|
|
||||||
import math
|
|
||||||
import base64
|
|
||||||
import hashlib
|
|
||||||
import requests
|
|
||||||
from urllib import parse
|
|
||||||
|
|
||||||
|
|
||||||
class VideoPart:
|
|
||||||
def __init__(self, path, title='', desc=''):
|
|
||||||
self.path = path
|
|
||||||
self.title = title
|
|
||||||
self.desc = desc
|
|
||||||
|
|
||||||
|
|
||||||
class Bilibili:
|
|
||||||
def __init__(self, cookie=None):
|
|
||||||
self.files = []
|
|
||||||
self.videos = []
|
|
||||||
self.session = requests.session()
|
|
||||||
if cookie:
|
|
||||||
self.session.headers["cookie"] = cookie
|
|
||||||
self.csrf = re.search('bili_jct=(.*?);', cookie).group(1)
|
|
||||||
self.mid = re.search('DedeUserID=(.*?);', cookie).group(1)
|
|
||||||
self.session.headers['Accept'] = 'application/json, text/javascript, */*; q=0.01'
|
|
||||||
self.session.headers['Referer'] = 'https://space.bilibili.com/{mid}/#!/'.format(mid=self.mid)
|
|
||||||
# session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'
|
|
||||||
# session.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
|
|
||||||
|
|
||||||
def login(self, user, pwd):
|
|
||||||
"""
|
|
||||||
|
|
||||||
:param user: username
|
|
||||||
:type user: str
|
|
||||||
:param pwd: password
|
|
||||||
:type pwd: str
|
|
||||||
:return: if success return True
|
|
||||||
else return msg json
|
|
||||||
"""
|
|
||||||
APPKEY = '1d8b6e7d45233436'
|
|
||||||
ACTIONKEY = 'appkey'
|
|
||||||
BUILD = 520001
|
|
||||||
DEVICE = 'android'
|
|
||||||
MOBI_APP = 'android'
|
|
||||||
PLATFORM = 'android'
|
|
||||||
APPSECRET = '560c52ccd288fed045859ed18bffd973'
|
|
||||||
|
|
||||||
def md5(s):
|
|
||||||
h = hashlib.md5()
|
|
||||||
h.update(s.encode('utf-8'))
|
|
||||||
return h.hexdigest()
|
|
||||||
|
|
||||||
def sign(s):
|
|
||||||
"""
|
|
||||||
|
|
||||||
:return: return sign
|
|
||||||
"""
|
|
||||||
return md5(s + APPSECRET)
|
|
||||||
|
|
||||||
def signed_body(body):
|
|
||||||
"""
|
|
||||||
|
|
||||||
:return: body which be added sign
|
|
||||||
"""
|
|
||||||
if isinstance(body, str):
|
|
||||||
return body + '&sign=' + sign(body)
|
|
||||||
elif isinstance(body, dict):
|
|
||||||
ls = []
|
|
||||||
for k, v in body.items():
|
|
||||||
ls.append(k + '=' + v)
|
|
||||||
body['sign'] = sign('&'.join(ls))
|
|
||||||
return body
|
|
||||||
|
|
||||||
def getkey():
|
|
||||||
"""
|
|
||||||
|
|
||||||
:return: hash, key
|
|
||||||
"""
|
|
||||||
r = self.session.post(
|
|
||||||
'https://passport.bilibili.com/api/oauth2/getKey',
|
|
||||||
signed_body({'appkey': APPKEY}),
|
|
||||||
)
|
|
||||||
# {"ts":1544152439,"code":0,"data":{"hash":"99c7573759582e0b","key":"-----BEGIN PUBLIC----- -----END PUBLIC KEY-----\n"}}
|
|
||||||
json = r.json()
|
|
||||||
data = json['data']
|
|
||||||
return data['hash'], data['key']
|
|
||||||
|
|
||||||
def cnn_captcha(img):
|
|
||||||
url = "http://47.95.255.188:5000/code"
|
|
||||||
data = {"image": img}
|
|
||||||
r = requests.post(url, data=data)
|
|
||||||
return r.text
|
|
||||||
|
|
||||||
self.session.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
|
|
||||||
h, k = getkey()
|
|
||||||
pwd = base64.b64encode(
|
|
||||||
rsa.encrypt(
|
|
||||||
(h + pwd).encode('utf-8'),
|
|
||||||
rsa.PublicKey.load_pkcs1_openssl_pem(k.encode())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
user = parse.quote_plus(user)
|
|
||||||
pwd = parse.quote_plus(pwd)
|
|
||||||
|
|
||||||
r = self.session.post(
|
|
||||||
'https://passport.bilibili.com/api/v2/oauth2/login',
|
|
||||||
signed_body('appkey={appkey}&password={password}&username={username}'
|
|
||||||
.format(appkey=APPKEY, username=user, password=pwd))
|
|
||||||
)
|
|
||||||
try:
|
|
||||||
json = r.json()
|
|
||||||
except:
|
|
||||||
return r.text
|
|
||||||
|
|
||||||
if json['code'] == -105:
|
|
||||||
# need captcha
|
|
||||||
self.session.headers['cookie'] = 'sid=xxxxxxxx'
|
|
||||||
r = self.session.get('https://passport.bilibili.com/captcha')
|
|
||||||
captcha = cnn_captcha(base64.b64encode(r.content))
|
|
||||||
r = self.session.post(
|
|
||||||
'https://passport.bilibili.com/api/v2/oauth2/login',
|
|
||||||
signed_body('actionKey={actionKey}&appkey={appkey}&build={build}&captcha={captcha}&device={device}'
|
|
||||||
'&mobi_app={mobi_app}&password={password}&platform={platform}&username={username}'
|
|
||||||
.format(actionKey=ACTIONKEY,
|
|
||||||
appkey=APPKEY,
|
|
||||||
build=BUILD,
|
|
||||||
captcha=captcha,
|
|
||||||
device=DEVICE,
|
|
||||||
mobi_app=MOBI_APP,
|
|
||||||
password=pwd,
|
|
||||||
platform=PLATFORM,
|
|
||||||
username=user)),
|
|
||||||
)
|
|
||||||
json = r.json()
|
|
||||||
|
|
||||||
if json['code'] is not 0:
|
|
||||||
return r.text
|
|
||||||
|
|
||||||
ls = []
|
|
||||||
for item in json['data']['cookie_info']['cookies']:
|
|
||||||
ls.append(item['name'] + '=' + item['value'])
|
|
||||||
cookie = '; '.join(ls)
|
|
||||||
self.session.headers["cookie"] = cookie
|
|
||||||
|
|
||||||
self.csrf = re.search('bili_jct=(.*?);', cookie).group(1)
|
|
||||||
self.mid = re.search('DedeUserID=(.*?);', cookie).group(1)
|
|
||||||
self.session.headers['Accept'] = 'application/json, text/javascript, */*; q=0.01'
|
|
||||||
self.session.headers['Referer'] = 'https://space.bilibili.com/{mid}/#!/'.format(mid=self.mid)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def upload(self,
|
|
||||||
parts,
|
|
||||||
title,
|
|
||||||
tid,
|
|
||||||
tag,
|
|
||||||
desc,
|
|
||||||
source='',
|
|
||||||
cover='',
|
|
||||||
no_reprint=1,
|
|
||||||
):
|
|
||||||
"""
|
|
||||||
|
|
||||||
:param parts: e.g. VideoPart('part path', 'part title', 'part desc'), or [VideoPart(...), VideoPart(...)]
|
|
||||||
:type parts: VideoPart or list<VideoPart>
|
|
||||||
:param title: video's title
|
|
||||||
:type title: str
|
|
||||||
:param tid: video type, see: https://member.bilibili.com/x/web/archive/pre
|
|
||||||
or https://github.com/uupers/BiliSpider/wiki/%E8%A7%86%E9%A2%91%E5%88%86%E5%8C%BA%E5%AF%B9%E5%BA%94%E8%A1%A8
|
|
||||||
:type tid: int
|
|
||||||
:param tag: video's tag
|
|
||||||
:type tag: list<str>
|
|
||||||
:param desc: video's description
|
|
||||||
:type desc: str
|
|
||||||
:param source: (optional) 转载地址
|
|
||||||
:type source: str
|
|
||||||
:param cover: (optional) cover's URL, use method *cover_up* to get
|
|
||||||
:type cover: str
|
|
||||||
:param no_reprint: (optional) 0=可以转载, 1=禁止转载(default)
|
|
||||||
:type no_reprint: int
|
|
||||||
"""
|
|
||||||
self.preUpload(parts)
|
|
||||||
self.finishUpload(title, tid, tag, desc, source, cover, no_reprint)
|
|
||||||
|
|
||||||
def preUpload(self, parts):
|
|
||||||
"""
|
|
||||||
:param parts: e.g. VideoPart('part path', 'part title', 'part desc'), or [VideoPart(...), VideoPart(...)]
|
|
||||||
:type parts: VideoPart or list<VideoPart>
|
|
||||||
"""
|
|
||||||
|
|
||||||
self.session.headers['Content-Type'] = 'application/json; charset=utf-8'
|
|
||||||
if not isinstance(parts, list):
|
|
||||||
parts = [parts]
|
|
||||||
|
|
||||||
for part in parts:
|
|
||||||
filepath = part.path
|
|
||||||
filename = os.path.basename(filepath)
|
|
||||||
filesize = os.path.getsize(filepath)
|
|
||||||
self.files.append(part)
|
|
||||||
r = self.session.get('https://member.bilibili.com/preupload?'
|
|
||||||
'os=upos&upcdn=ws&name={name}&size={size}&r=upos&profile=ugcupos%2Fyb&ssl=0'
|
|
||||||
.format(name=filename, size=filesize))
|
|
||||||
"""return example
|
|
||||||
{
|
|
||||||
"upos_uri": "upos://ugc/i181012ws18x52mti3gg0h33chn3tyhp.mp4",
|
|
||||||
"biz_id": 58993125,
|
|
||||||
"endpoint": "//upos-hz-upcdnws.acgvideo.com",
|
|
||||||
"endpoints": [
|
|
||||||
"//upos-hz-upcdnws.acgvideo.com",
|
|
||||||
"//upos-hz-upcdntx.acgvideo.com"
|
|
||||||
],
|
|
||||||
"chunk_retry_delay": 3,
|
|
||||||
"chunk_retry": 200,
|
|
||||||
"chunk_size": 4194304,
|
|
||||||
"threads": 2,
|
|
||||||
"timeout": 900,
|
|
||||||
"auth": "os=upos&cdn=upcdnws&uid=&net_state=4&device=&build=&os_version=&ak=×tamp=&sign=",
|
|
||||||
"OK": 1
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
json = r.json()
|
|
||||||
upos_uri = json['upos_uri']
|
|
||||||
endpoint = json['endpoint']
|
|
||||||
auth = json['auth']
|
|
||||||
biz_id = json['biz_id']
|
|
||||||
chunk_size = json['chunk_size']
|
|
||||||
self.session.headers['X-Upos-Auth'] = auth # add auth header
|
|
||||||
r = self.session.post(
|
|
||||||
'https:{}/{}?uploads&output=json'.format(endpoint, upos_uri.replace('upos://', '')))
|
|
||||||
# {"upload_id":"72eb747b9650b8c7995fdb0efbdc2bb6","key":"\/i181012ws2wg1tb7tjzswk2voxrwlk1u.mp4","OK":1,"bucket":"ugc"}
|
|
||||||
json = r.json()
|
|
||||||
upload_id = json['upload_id']
|
|
||||||
|
|
||||||
with open(filepath, 'rb') as f:
|
|
||||||
chunks_num = math.ceil(filesize / chunk_size)
|
|
||||||
chunks_index = -1
|
|
||||||
while True:
|
|
||||||
chunks_data = f.read(chunk_size)
|
|
||||||
if not chunks_data:
|
|
||||||
break
|
|
||||||
chunks_index += 1 # start with 0
|
|
||||||
r = self.session.put('https:{endpoint}/{upos_uri}?'
|
|
||||||
'partNumber={part_number}&uploadId={upload_id}&chunk={chunk}&chunks={chunks}&size={size}&start={start}&end={end}&total={total}'
|
|
||||||
.format(endpoint=endpoint,
|
|
||||||
upos_uri=upos_uri.replace('upos://', ''),
|
|
||||||
part_number=chunks_index + 1, # starts with 1
|
|
||||||
upload_id=upload_id,
|
|
||||||
chunk=chunks_index,
|
|
||||||
chunks=chunks_num,
|
|
||||||
size=len(chunks_data),
|
|
||||||
start=chunks_index * chunk_size,
|
|
||||||
end=chunks_index * chunk_size + len(chunks_data),
|
|
||||||
total=filesize,
|
|
||||||
),
|
|
||||||
chunks_data,
|
|
||||||
)
|
|
||||||
print('{} : UPLOAD {}/{}'.format(datetime.strftime(datetime.now(), "%y%m%d %H%M"), chunks_index,
|
|
||||||
chunks_num), r.text)
|
|
||||||
|
|
||||||
# NOT DELETE! Refer to https://github.com/comwrg/bilibiliupload/issues/15#issuecomment-424379769
|
|
||||||
self.session.post('https:{endpoint}/{upos_uri}?'
|
|
||||||
'output=json&name={name}&profile=ugcupos%2Fyb&uploadId={upload_id}&biz_id={biz_id}'
|
|
||||||
.format(endpoint=endpoint,
|
|
||||||
upos_uri=upos_uri.replace('upos://', ''),
|
|
||||||
name=filename,
|
|
||||||
upload_id=upload_id,
|
|
||||||
biz_id=biz_id,
|
|
||||||
),
|
|
||||||
{"parts": [{"partNumber": i, "eTag": "etag"} for i in range(1, chunks_num + 1)]},
|
|
||||||
)
|
|
||||||
|
|
||||||
self.videos.append({'filename': upos_uri.replace('upos://ugc/', '').split('.')[0],
|
|
||||||
'title': part.title,
|
|
||||||
'desc': part.desc})
|
|
||||||
|
|
||||||
def finishUpload(self,
|
|
||||||
title,
|
|
||||||
tid,
|
|
||||||
tag,
|
|
||||||
desc,
|
|
||||||
source='',
|
|
||||||
cover='',
|
|
||||||
no_reprint=1,
|
|
||||||
):
|
|
||||||
"""
|
|
||||||
:param title: video's title
|
|
||||||
:type title: str
|
|
||||||
:param tid: video type, see: https://member.bilibili.com/x/web/archive/pre
|
|
||||||
or https://github.com/uupers/BiliSpider/wiki/%E8%A7%86%E9%A2%91%E5%88%86%E5%8C%BA%E5%AF%B9%E5%BA%94%E8%A1%A8
|
|
||||||
:type tid: int
|
|
||||||
:param tag: video's tag
|
|
||||||
:type tag: list<str>
|
|
||||||
:param desc: video's description
|
|
||||||
:type desc: str
|
|
||||||
:param source: (optional) 转载地址
|
|
||||||
:type source: str
|
|
||||||
:param cover: (optional) cover's URL, use method *cover_up* to get
|
|
||||||
:type cover: str
|
|
||||||
:param no_reprint: (optional) 0=可以转载, 1=禁止转载(default)
|
|
||||||
:type no_reprint: int
|
|
||||||
"""
|
|
||||||
self.session.headers['Content-Type'] = 'application/json; charset=utf-8'
|
|
||||||
copyright = 2 if source else 1
|
|
||||||
r = self.session.post('https://member.bilibili.com/x/vu/web/add?csrf=' + self.csrf,
|
|
||||||
json={
|
|
||||||
"copyright": copyright,
|
|
||||||
"source": source,
|
|
||||||
"title": title,
|
|
||||||
"tid": tid,
|
|
||||||
"tag": ','.join(tag),
|
|
||||||
"no_reprint": no_reprint,
|
|
||||||
"desc": desc,
|
|
||||||
"cover": cover,
|
|
||||||
"mission_id": 0,
|
|
||||||
"order_id": 0,
|
|
||||||
"videos": self.videos}
|
|
||||||
)
|
|
||||||
print(r.text)
|
|
||||||
for _p in self.files:
|
|
||||||
os.remove(_p.path)
|
|
||||||
|
|
||||||
def appendUpload(self,
|
|
||||||
aid,
|
|
||||||
parts,
|
|
||||||
title="",
|
|
||||||
tid="",
|
|
||||||
tag="",
|
|
||||||
desc="",
|
|
||||||
source='',
|
|
||||||
cover='',
|
|
||||||
no_reprint=1,
|
|
||||||
):
|
|
||||||
"""
|
|
||||||
:param aid: just aid
|
|
||||||
:type aid: int
|
|
||||||
:param parts: e.g. VideoPart('part path', 'part title', 'part desc'), or [VideoPart(...), VideoPart(...)]
|
|
||||||
:type parts: VideoPart or list<VideoPart>
|
|
||||||
:param title: video's title
|
|
||||||
:type title: str
|
|
||||||
:param tid: video type, see: https://member.bilibili.com/x/web/archive/pre
|
|
||||||
or https://github.com/uupers/BiliSpider/wiki/%E8%A7%86%E9%A2%91%E5%88%86%E5%8C%BA%E5%AF%B9%E5%BA%94%E8%A1%A8
|
|
||||||
:type tid: int
|
|
||||||
:param tag: video's tag
|
|
||||||
:type tag: list<str>
|
|
||||||
:param desc: video's description
|
|
||||||
:type desc: str
|
|
||||||
:param source: (optional) 转载地址
|
|
||||||
:type source: str
|
|
||||||
:param cover: (optional) cover's URL, use method *cover_up* to get
|
|
||||||
:type cover: str
|
|
||||||
:param no_reprint: (optional) 0=可以转载, 1=禁止转载(default)
|
|
||||||
:type no_reprint: int
|
|
||||||
"""
|
|
||||||
self.session.headers['Content-Type'] = 'application/json; charset=utf-8'
|
|
||||||
p = self.session.get("https://member.bilibili.com/x/web/archive/view?aid={}&history=".format(aid))
|
|
||||||
j = p.json()
|
|
||||||
if len(self.videos) == 0:
|
|
||||||
for i in j['data']['videos']:
|
|
||||||
self.videos.append({'filename': i['filename'],
|
|
||||||
'title': i["title"],
|
|
||||||
'desc': i["desc"]})
|
|
||||||
if (title == ""): title = j["data"]["archive"]['title']
|
|
||||||
if (tag == ""): tag = j["data"]["archive"]['tag']
|
|
||||||
if (no_reprint == ""): no_reprint = j["data"]["archive"]['no_reprint']
|
|
||||||
if (desc == ""): desc = j["data"]["archive"]['desc']
|
|
||||||
if (source == ""): source = j["data"]["archive"]['source']
|
|
||||||
if (tid == ""): tid = j["data"]["archive"]['tid']
|
|
||||||
self.preUpload(parts)
|
|
||||||
self.editUpload(aid, title, tid, tag, desc, source, cover, no_reprint)
|
|
||||||
|
|
||||||
def editUpload(self,
|
|
||||||
aid,
|
|
||||||
title,
|
|
||||||
tid,
|
|
||||||
tag,
|
|
||||||
desc,
|
|
||||||
source='',
|
|
||||||
cover='',
|
|
||||||
no_reprint=1,
|
|
||||||
):
|
|
||||||
"""
|
|
||||||
:param aid: just aid
|
|
||||||
:type aid: int
|
|
||||||
:param parts: e.g. VideoPart('part path', 'part title', 'part desc'), or [VideoPart(...), VideoPart(...)]
|
|
||||||
:type parts: VideoPart or list<VideoPart>
|
|
||||||
:param title: video's title
|
|
||||||
:type title: str
|
|
||||||
:param tid: video type, see: https://member.bilibili.com/x/web/archive/pre
|
|
||||||
or https://github.com/uupers/BiliSpider/wiki/%E8%A7%86%E9%A2%91%E5%88%86%E5%8C%BA%E5%AF%B9%E5%BA%94%E8%A1%A8
|
|
||||||
:type tid: int
|
|
||||||
:param tag: video's tag
|
|
||||||
:type tag: list<str>
|
|
||||||
:param desc: video's description
|
|
||||||
:type desc: str
|
|
||||||
:param source: (optional) 转载地址
|
|
||||||
:type source: str
|
|
||||||
:param cover: (optional) cover's URL, use method *cover_up* to get
|
|
||||||
:type cover: str
|
|
||||||
:param no_reprint: (optional) 0=可以转载, 1=禁止转载(default)
|
|
||||||
:type no_reprint: int
|
|
||||||
"""
|
|
||||||
copyright = 2 if source else 1
|
|
||||||
r = self.session.post('https://member.bilibili.com/x/vu/web/edit?csrf=' + self.csrf,
|
|
||||||
json={
|
|
||||||
"aid": aid,
|
|
||||||
"copyright": copyright,
|
|
||||||
"source": source,
|
|
||||||
"title": title,
|
|
||||||
"tid": tid,
|
|
||||||
"tag": ','.join(tag),
|
|
||||||
"no_reprint": no_reprint,
|
|
||||||
"desc": desc,
|
|
||||||
"cover": cover,
|
|
||||||
"mission_id": 0,
|
|
||||||
"order_id": 0,
|
|
||||||
"videos": self.videos}
|
|
||||||
)
|
|
||||||
print(r.text)
|
|
||||||
for _p in self.files:
|
|
||||||
os.remove(_p.path)
|
|
||||||
|
|
||||||
def addChannel(self, name, intro=''):
|
|
||||||
"""
|
|
||||||
|
|
||||||
:param name: channel's name
|
|
||||||
:type name: str
|
|
||||||
:param intro: channel's introduction
|
|
||||||
:type intro: str
|
|
||||||
"""
|
|
||||||
r = self.session.post(
|
|
||||||
url='https://space.bilibili.com/ajax/channel/addChannel',
|
|
||||||
data={
|
|
||||||
'name': name,
|
|
||||||
'intro': intro,
|
|
||||||
'aids': '',
|
|
||||||
'csrf': self.csrf,
|
|
||||||
},
|
|
||||||
# name=123&intro=123&aids=&csrf=565d7ed17cef2cc8ad054210c4e64324&_=1497077610768
|
|
||||||
|
|
||||||
)
|
|
||||||
# return
|
|
||||||
# {"status":true,"data":{"cid":"15812"}}
|
|
||||||
print(r.json())
|
|
||||||
|
|
||||||
def channel_addVideo(self, cid, aids):
|
|
||||||
"""
|
|
||||||
|
|
||||||
:param cid: channel's id
|
|
||||||
:type cid: int
|
|
||||||
:param aids: videos' id
|
|
||||||
:type aids: list<int>
|
|
||||||
"""
|
|
||||||
|
|
||||||
r = self.session.post(
|
|
||||||
url='https://space.bilibili.com/ajax/channel/addVideo',
|
|
||||||
data={
|
|
||||||
'aids': '%2C'.join(aids),
|
|
||||||
'cid': cid,
|
|
||||||
'csrf': self.csrf
|
|
||||||
}
|
|
||||||
# aids=9953555%2C9872953&cid=15814&csrf=565d7ed17cef2cc8ad054210c4e64324&_=1497079332679
|
|
||||||
)
|
|
||||||
print(r.json())
|
|
||||||
|
|
||||||
def cover_up(self, img):
|
|
||||||
"""
|
|
||||||
|
|
||||||
:param img: img path or stream
|
|
||||||
:type img: str or BufferedReader
|
|
||||||
:return: img URL
|
|
||||||
"""
|
|
||||||
|
|
||||||
if isinstance(img, str):
|
|
||||||
f = open(img, 'rb')
|
|
||||||
else:
|
|
||||||
f = img
|
|
||||||
r = self.session.post(
|
|
||||||
url='https://member.bilibili.com/x/vu/web/cover/up',
|
|
||||||
data={
|
|
||||||
'cover': b'data:image/jpeg;base64,' + (base64.b64encode(f.read())),
|
|
||||||
'csrf': self.csrf,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
# print(r.text)
|
|
||||||
# {"code":0,"data":{"url":"http://i0.hdslb.com/bfs/archive/67db4a6eae398c309244e74f6e85ae8d813bd7c9.jpg"},"message":"","ttl":1}
|
|
||||||
return r.json()['data']['url']
|
|
@ -1,187 +0,0 @@
|
|||||||
import sys
|
|
||||||
import time
|
|
||||||
from datetime import datetime
|
|
||||||
import m3u8
|
|
||||||
import queue
|
|
||||||
import threading
|
|
||||||
from config import config
|
|
||||||
from api import XiGuaLiveApi
|
|
||||||
from bilibili import *
|
|
||||||
|
|
||||||
q = queue.Queue()
|
|
||||||
base_uri = ""
|
|
||||||
isUpload = False
|
|
||||||
uq = queue.Queue()
|
|
||||||
|
|
||||||
|
|
||||||
class downloader(XiGuaLiveApi):
|
|
||||||
files = []
|
|
||||||
playlist: str = None
|
|
||||||
|
|
||||||
def updRoomInfo(self):
|
|
||||||
super(downloader, self).updRoomInfo()
|
|
||||||
self.updPlayList()
|
|
||||||
|
|
||||||
def updPlayList(self):
|
|
||||||
if "playInfo" not in self._rawRoomInfo or "Main" not in self._rawRoomInfo["playInfo"]:
|
|
||||||
if self.playlist is None:
|
|
||||||
self.apiChangedError("无法获取直播链接")
|
|
||||||
self.playlist = False
|
|
||||||
else:
|
|
||||||
self.playlist = self._rawRoomInfo["playInfo"]["Main"]["1"]["Url"]["HlsUrl"]
|
|
||||||
|
|
||||||
def onLike(self, user):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def onAd(self, i):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def onChat(self, chat):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def onEnter(self, msg):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def onJoin(self, user):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def onLeave(self, json):
|
|
||||||
self.updRoomInfo()
|
|
||||||
|
|
||||||
def onMessage(self, msg):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def onPresent(self, gift):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def onPresentEnd(self, gift):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def onSubscribe(self, user):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def preDownload(self):
|
|
||||||
global base_uri
|
|
||||||
if self.playlist:
|
|
||||||
try:
|
|
||||||
p = m3u8.load(self.playlist)
|
|
||||||
except:
|
|
||||||
self.updRoomInfo()
|
|
||||||
return
|
|
||||||
base_uri = p.base_uri
|
|
||||||
for i in p.files:
|
|
||||||
if i not in self.files:
|
|
||||||
self.files.append(i)
|
|
||||||
print("{} : Add Sequence {}".format(datetime.strftime(datetime.now(), "%y%m%d %H%M"),
|
|
||||||
len(self.files)))
|
|
||||||
q.put(i)
|
|
||||||
self.genNewName()
|
|
||||||
|
|
||||||
def genNewName(self):
|
|
||||||
if len(self.files) > 800:
|
|
||||||
q.put(True)
|
|
||||||
self.files.clear()
|
|
||||||
|
|
||||||
|
|
||||||
def download(path=datetime.strftime(datetime.now(), "%Y%m%d_%H%M.ts")):
|
|
||||||
global isUpload
|
|
||||||
print("{} : Download Daemon Starting".format(datetime.strftime(datetime.now(), "%y%m%d %H%M")))
|
|
||||||
n = False
|
|
||||||
isUpload = False
|
|
||||||
i = q.get()
|
|
||||||
while True:
|
|
||||||
if isinstance(i, bool):
|
|
||||||
print("{} : Download Daemon Receive Command {}".format(datetime.strftime(datetime.now(), "%y%m%d %H%M"), i))
|
|
||||||
break
|
|
||||||
print("{} : Download {}".format(datetime.strftime(datetime.now(), "%y%m%d %H%M"), i))
|
|
||||||
try:
|
|
||||||
_p = requests.get("{}{}".format(base_uri, i))
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
f = open(path, "ab")
|
|
||||||
f.write(_p.content)
|
|
||||||
f.close()
|
|
||||||
n = True
|
|
||||||
i = q.get()
|
|
||||||
if n:
|
|
||||||
isUpload = True
|
|
||||||
uq.put(path)
|
|
||||||
print("{} : Download Daemon Quiting".format(datetime.strftime(datetime.now(), "%y%m%d %H%M")))
|
|
||||||
|
|
||||||
|
|
||||||
def upload(date=datetime.strftime(datetime.now(), "%Y_%m_%d")):
|
|
||||||
print("{} : Upload Daemon Starting".format(datetime.strftime(datetime.now(), "%y%m%d %H%M")))
|
|
||||||
i = uq.get()
|
|
||||||
while True:
|
|
||||||
if isinstance(i, bool):
|
|
||||||
print("{} : Upload Daemon Receive Command {}"
|
|
||||||
.format(datetime.strftime(datetime.now(), "%y%m%d %H%M"), i))
|
|
||||||
if i is True:
|
|
||||||
print("自动投稿中,请稍后")
|
|
||||||
b.finishUpload(config["t_t"].format(date), 17, config["tag"], config["des"],
|
|
||||||
source="https://live.ixigua.com/userlive/97621754276", no_reprint=0)
|
|
||||||
break
|
|
||||||
print("{} : Upload {}".format(datetime.strftime(datetime.now(), "%y%m%d %H%M"), i))
|
|
||||||
try:
|
|
||||||
b.preUpload(VideoPart(i, i))
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
i = uq.get()
|
|
||||||
print("{} : Upload Daemon Quiting".format(datetime.strftime(datetime.now(), "%y%m%d %H%M")))
|
|
||||||
|
|
||||||
|
|
||||||
b = Bilibili()
|
|
||||||
b.login(config["b_u"], config["b_p"])
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
room = 97621754276 # 永恒
|
|
||||||
# room = 75366565294
|
|
||||||
# room = 83940182312 #Dae
|
|
||||||
# room = 5947850784 #⑦
|
|
||||||
# room = 58649240617 #戏
|
|
||||||
if len(sys.argv) > 1:
|
|
||||||
try:
|
|
||||||
room = int(sys.argv[1])
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
print("西瓜直播录播助手 by JerryYan")
|
|
||||||
api = downloader(room)
|
|
||||||
print("进入", api.roomLiver, "的直播间")
|
|
||||||
if not api.isValidRoom:
|
|
||||||
input("房间不存在")
|
|
||||||
sys.exit()
|
|
||||||
print("=" * 30)
|
|
||||||
d = datetime.strftime(datetime.now(), "%Y_%m_%d")
|
|
||||||
_preT = datetime.strftime(datetime.now(), "%Y%m%d_%H%M.ts")
|
|
||||||
t = threading.Thread(target=download, args=(_preT,))
|
|
||||||
ut = threading.Thread(target=upload, args=(d,))
|
|
||||||
while True:
|
|
||||||
if api.isLive:
|
|
||||||
if d is None:
|
|
||||||
d = datetime.strftime(datetime.now(), "%Y_%m_%d")
|
|
||||||
if not t.is_alive():
|
|
||||||
_preT = datetime.strftime(datetime.now(), "%Y%m%d_%H%M.ts")
|
|
||||||
t = threading.Thread(target=download, args=(_preT,))
|
|
||||||
t.setDaemon(True)
|
|
||||||
t.start()
|
|
||||||
if not ut.is_alive():
|
|
||||||
ut = threading.Thread(target=upload, args=(d,))
|
|
||||||
ut.setDaemon(True)
|
|
||||||
ut.start()
|
|
||||||
try:
|
|
||||||
api.preDownload()
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
time.sleep(3)
|
|
||||||
else:
|
|
||||||
if d is not None:
|
|
||||||
q.put(False)
|
|
||||||
d = None
|
|
||||||
if isUpload:
|
|
||||||
uq.put(True)
|
|
||||||
isUpload = False
|
|
||||||
else:
|
|
||||||
pass
|
|
||||||
# print("主播未开播,等待1分钟后重试")
|
|
||||||
time.sleep(60)
|
|
||||||
api.updRoomInfo()
|
|
Reference in New Issue
Block a user