mirror of
https://github.com/jwdeveloper/TikTokLiveJava.git
synced 2026-02-27 16:59:39 -05:00
`onWebsocketMessage()` TikTokWebsocketMessageEvent new event that is triggered when new ProtocolBuffer message come from TikTok server. Should be mainly use for debuging purpose Bugs: - Fixed bug: WebcastSocialMessage was always triggering `TikTokShareEvent` events such as `TikTokLikeEvent`, `TikTokFollowEvent`, `TikTokShareEvent`, `TikTokJoinEvent` was ignored - Fixed bug: Websocket was disconnecting when there was no incoming events for the while. Fixed by implementing background loop that pinging TikTok server every few ms. - Fixed bug: Disconnect method was not working
1347 lines
30 KiB
Protocol Buffer
1347 lines
30 KiB
Protocol Buffer
syntax = "proto3";
|
|
package TikTok;
|
|
|
|
/**
|
|
|
|
This Proto-Schema has been hand-written from
|
|
the current C#-Classes in TikTokLiveSharp.
|
|
|
|
These objects are reverse-engineered from the Server-Messages and are only partially understood:
|
|
- Many of the values are simply called Data{X} as their value is unknown.
|
|
- There are many Timestamps labeled Timestamp{X} as it's unsure which time-value they reflect.
|
|
These are all UNIX-timestamps close to present time.
|
|
- For each (int-)value a relevant size has been picked based on read values
|
|
Some of the uint32-values could potentially be interpreted as boolean types or enums
|
|
|
|
If you have any data to add or contexts/names you can fill
|
|
please add an issue to the Github: https://github.com/frankvHoof93/TikTokLiveSharp
|
|
|
|
*/
|
|
|
|
option java_package = "io.github.jwdeveloper.tiktok.messages";
|
|
option java_multiple_files = true;
|
|
|
|
/**
|
|
|
|
-=-=-=-=-=-=-=-=-=-=-=
|
|
GENERIC MESSAGES
|
|
-=-=-=-=-=-=-=-=-=-=-=
|
|
|
|
*/
|
|
|
|
// Acknowledgement-Message for Websocket-Connection
|
|
message WebcastWebsocketAck {
|
|
uint64 id = 2;
|
|
string type = 7;
|
|
}
|
|
|
|
// Websocket-Message as sent by TikTok-Server (outer structure)
|
|
message WebcastWebsocketMessage {
|
|
uint32 data1 = 1;
|
|
uint64 id = 2;
|
|
uint32 data2 = 3;
|
|
uint32 data3 = 4;
|
|
repeated MessageData connectiondata = 5; // CompressionType, ServerTime, etc
|
|
WebsocketMessageDetails data4 = 6; // Unknown additional details
|
|
string type = 7; // "hb" for heartbeat, "msg" for messages
|
|
bytes binary = 8; // Response
|
|
|
|
message MessageData {
|
|
string datatype = 1;
|
|
string value = 2;
|
|
}
|
|
|
|
message WebsocketMessageDetails {
|
|
uint32 data1 = 14;
|
|
}
|
|
}
|
|
|
|
// Response from TikTokServer. Container for Messages
|
|
message WebcastResponse {
|
|
repeated Message messages = 1;
|
|
string cursor = 2;
|
|
int32 fetchInterval = 3;
|
|
uint64 serverTimestamp = 4;
|
|
string ackIds = 5;
|
|
int32 fetchType = 6; // 1 = websocket, 2 = long-polling
|
|
repeated WebsocketRouteParam socketParams = 7;
|
|
int32 heartbeatDuration = 8;
|
|
bool needsAck = 9;
|
|
string socketUrl = 10;
|
|
|
|
// Server-Message. Binary will deserialize into specific message
|
|
message Message {
|
|
string type =1 ; // Message(Class)Name
|
|
bytes binary = 2; // Data for Message
|
|
}
|
|
|
|
message WebsocketRouteParam {
|
|
string name = 1;
|
|
string value = 2;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
-=-=-=-=-=-=-=-=-=-=-=
|
|
TikTok-Objects
|
|
-=-=-=-=-=-=-=-=-=-=-=
|
|
|
|
*/
|
|
|
|
// Container for uint-Data
|
|
message DataContainer {
|
|
uint64 data1 = 1;
|
|
uint32 data2 = 2;
|
|
uint32 data3 = 3;
|
|
uint32 data4 = 4;
|
|
uint32 data5 = 5;
|
|
uint32 data6 = 6;
|
|
uint32 data7 = 7;
|
|
uint32 data8 = 8;
|
|
uint32 data9 = 9;
|
|
}
|
|
|
|
// Links 2 Ids
|
|
message IdContainer {
|
|
uint64 id1 = 1;
|
|
uint64 id2 = 2;
|
|
}
|
|
|
|
// Links IDs & data
|
|
message IdData
|
|
{
|
|
string data1 = 1;
|
|
string id1 = 2;
|
|
string data2 = 3;
|
|
string id2 = 4;
|
|
}
|
|
|
|
// Container for Strings
|
|
message StringData {
|
|
string data1 = 1;
|
|
string data2 = 2;
|
|
}
|
|
|
|
// Links Data & Timestamp
|
|
message TimeData {
|
|
uint32 data = 1;
|
|
uint64 timeStamp = 2;
|
|
uint64 timeStamp2 = 3;
|
|
}
|
|
|
|
// Container for multiple Timestamps
|
|
message TimeStampContainer {
|
|
uint64 timestamp1 = 1;
|
|
uint64 timestamp2 = 2;
|
|
uint64 timestamp3 = 3;
|
|
}
|
|
|
|
// Type & Value
|
|
message TypeValue {
|
|
string type = 1;
|
|
uint32 data = 2;
|
|
}
|
|
|
|
message UserContainer {
|
|
User user = 1;
|
|
uint32 data1 = 2;
|
|
}
|
|
|
|
message ValueLabel {
|
|
uint32 data = 1;
|
|
string label = 2;
|
|
string label2 = 3;
|
|
string label3 = 11;
|
|
}
|
|
|
|
|
|
// Badges earned by Users
|
|
message Badge {
|
|
uint32 data1 = 1;
|
|
uint32 data2 = 2;
|
|
uint32 data3 = 3;
|
|
uint32 data4 = 4;
|
|
string shortUrl = 10;
|
|
uint32 data5 = 11;
|
|
IdData badgeId = 12;
|
|
/*
|
|
Typically either 20, 21 or 23 is populated.
|
|
More than one is not populated at once.
|
|
*/
|
|
repeated BadgeImage imageBadges = 20; // Seems to hold images (top gifter, sub) with no extra data
|
|
repeated BadgeText textBadges = 21; // Holds badge info (moderator)
|
|
BadgeComplex complexBadge = 23; // Seems to hold image badges but with data (Level badge, sub level w/ name, etc)
|
|
|
|
message BadgeText {
|
|
string type = 2;
|
|
string name = 3;
|
|
}
|
|
|
|
message BadgeImage {
|
|
uint32 displayType = 1; // Is an Enum
|
|
Picture image = 2;
|
|
}
|
|
|
|
message BadgeComplex {
|
|
uint32 data1 = 1;
|
|
//string imageUrl = 2; Protocol message had invalid UTF-8
|
|
string data = 4;
|
|
DataContainer detail1 = 5;
|
|
string data2 = 6;
|
|
BadgeText detail2 = 11;
|
|
BadgeText detail3 = 12;
|
|
uint32 data3 = 15;
|
|
uint32 data4 = 16;
|
|
}
|
|
}
|
|
|
|
// Details about a Gift
|
|
message Gift {
|
|
Picture image = 1;
|
|
string description = 2;
|
|
int32 data1 = 4;
|
|
uint64 id = 5; // Gift-Id
|
|
int32 data2 = 7;
|
|
int32 data3 = 10;
|
|
uint32 giftType = 11; // SHOULD BE AN ENUM?
|
|
uint32 coinCount = 12; // Value of Gift
|
|
int32 data4 = 13;
|
|
uint32 data5 = 14;
|
|
Picture picture = 15; // Additional
|
|
string name = 16; // Name for Gift
|
|
Picture coloredImage = 21; // Same as image, but with different color
|
|
uint32 data7 = 38;
|
|
uint32 data8 = 42;
|
|
uint32 data9 = 51;
|
|
repeated GiftDetails details = 102;
|
|
GiftMasks masks = 104;
|
|
uint32 data10 = 105;
|
|
string data11 = 106;
|
|
|
|
message GiftDetails {
|
|
uint32 data1 = 1;
|
|
string name = 2;
|
|
repeated string colors = 3;
|
|
Picture image = 4;
|
|
Picture icon = 5;
|
|
uint32 data2 = 6;
|
|
uint32 data3 = 7;
|
|
}
|
|
|
|
message GiftMasks {
|
|
GiftMask mask1 = 3;
|
|
GiftMask mask2 = 4;
|
|
|
|
message GiftMask {
|
|
uint32 mask = 13; // BitMask (EnumFlags?)
|
|
}
|
|
}
|
|
}
|
|
|
|
message GiftDetailsData {
|
|
uint32 data1 = 1;
|
|
TikTokColor color = 2;
|
|
string data2 = 11;
|
|
UserContainer user = 21;
|
|
GiftDataDetailed details = 22;
|
|
}
|
|
|
|
message GiftDataDetailed {
|
|
uint32 data1 = 1;
|
|
StringData strings = 2;
|
|
uint32 data2 = 3;
|
|
int32 data3 = 4;
|
|
}
|
|
|
|
// Receipt for sending a Gift. Names are mostly taken from JSON
|
|
message GiftReceipt {
|
|
uint64 anchorId = 1;
|
|
uint64 profitApiStartTimeStamp = 3; // send_gift_profit_api_start_ms
|
|
uint64 profitCoreStartTimeStamp = 4; // send_gift_profit_core_start_ms
|
|
uint64 sendGiftRequestTimeStamp = 5; // send_gift_req_start_ms
|
|
uint64 timeStamp = 6; // send_gift_send_message_success_ms
|
|
uint64 profitApiDuration = 7; // send_profitapi_dur
|
|
uint64 receiverUserId = 8; // UserId for receiver
|
|
uint64 timeStamp1 = 9; // Unknown timestamp. Earliest in message (Possibly Request-Start?)
|
|
string operatingSystem = 10;
|
|
string data1 = 11; // 270504 (Id?)
|
|
}
|
|
|
|
message GoalUpdateData {
|
|
uint64 id = 1;
|
|
uint32 data1 = 2;
|
|
uint32 data2 = 3;
|
|
GoalUpdateDetails details = 4;
|
|
string label = 5;
|
|
uint32 data3 = 6;
|
|
uint32 data4 = 7;
|
|
uint64 timeStamp2 = 8;
|
|
uint64 timeStamp3 = 9;
|
|
repeated GoalUpdateUser users = 11;
|
|
uint32 data5 = 12;
|
|
string idString = 13;
|
|
string label2 = 14; // same as label?
|
|
}
|
|
|
|
message GoalUpdateDetails {
|
|
uint32 data1 = 1;
|
|
uint32 data2 = 2;
|
|
uint32 data3 = 3;
|
|
uint32 data4 = 4;
|
|
GoalUpdateGiftData data5 = 5;
|
|
string data6 = 6;
|
|
|
|
message GoalUpdateGiftData {
|
|
string name = 1;
|
|
Picture picture = 2;
|
|
uint32 data1 = 3;
|
|
uint32 data2 = 4;
|
|
}
|
|
}
|
|
|
|
message GoalUpdateUser {
|
|
uint64 id = 1;
|
|
Picture profilePicture = 2;
|
|
string nickname = 3;
|
|
uint64 timeStamp = 4;
|
|
string idString = 5;
|
|
uint32 data1 = 6;
|
|
uint32 data2 = 7;
|
|
GoalUpdateUserDetails details = 10;
|
|
|
|
message GoalUpdateUserDetails {
|
|
uint32 data1 = 1;
|
|
uint32 data2 = 2;
|
|
uint32 data3 = 3;
|
|
GoalUserPictureContainer links = 10;
|
|
|
|
message GoalUserPictureContainer {
|
|
uint32 data1 = 1;
|
|
Picture links = 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
message LikeData {
|
|
string type = 1;
|
|
string label = 2;
|
|
TikTokColor color = 3;
|
|
LikeUserContainer user = 4;
|
|
|
|
message LikeUserContainer {
|
|
uint64 data1 = 1;
|
|
UserContainer user = 21;
|
|
}
|
|
}
|
|
|
|
message LinkMicArmiesItems {
|
|
uint64 hostUserId = 1;
|
|
repeated LinkMicArmiesGroup battleGroups = 2;
|
|
|
|
message LinkMicArmiesGroup {
|
|
repeated User users = 1;
|
|
uint32 points = 2;
|
|
}
|
|
}
|
|
|
|
message MessageDetails {
|
|
uint32 data1 = 1;
|
|
TikTokColor color = 2;
|
|
string category = 11;
|
|
UserContainer user = 21;
|
|
}
|
|
|
|
message MemberMessageData {
|
|
string type = 1;
|
|
string label = 2;
|
|
TikTokColor color = 3;
|
|
repeated MessageDetails details = 4; // UserContainer-Data is empty
|
|
}
|
|
|
|
message SocialMessageData {
|
|
string type = 1;
|
|
string label = 2;
|
|
TikTokColor color = 3;
|
|
repeated MessageDetails details = 4; // UserContainer-Data is sometimes empty
|
|
}
|
|
|
|
message RankTextMessage {
|
|
string type = 1;
|
|
string label = 2;
|
|
TikTokColor color = 3;
|
|
repeated MessageDetails details = 4;
|
|
}
|
|
|
|
// Links to Image-Files on the TikTok CDN
|
|
message Picture {
|
|
repeated string urls = 1; // Usually has 3 different urls with different sizes/extensions
|
|
// string prefix = 2; // uri not working
|
|
uint32 data1 = 3;
|
|
uint32 data2 = 4;
|
|
string color = 5;
|
|
uint32 data3 = 6;
|
|
string additionalUrl = 7;
|
|
string data4 = 8;
|
|
}
|
|
|
|
message Ranking {
|
|
string type = 1;
|
|
string label = 2;
|
|
TikTokColor color = 3;
|
|
repeated ValueLabel details = 4;
|
|
}
|
|
|
|
message TikTokColor {
|
|
string color = 1;
|
|
uint64 id = 4;
|
|
uint32 data1 = 6;
|
|
}
|
|
|
|
message TopViewer {
|
|
uint32 coinsGiven = 1; // Coins given to Room
|
|
User user = 2; //
|
|
uint32 rank = 3; // Index in list
|
|
}
|
|
|
|
// TikTok-User
|
|
message User {
|
|
uint64 userId = 1;
|
|
uint32 data1 = 2;
|
|
string nickname = 3; // Name set in Profile
|
|
string description = 5; // User-Description
|
|
Picture profilePicture = 9; // Avatar
|
|
Picture picture720 = 10; // 720p
|
|
Picture picture1080 = 11; // 1080p
|
|
int32 status = 15;
|
|
int64 createTime = 16;
|
|
int64 modifyTime = 17;
|
|
int32 secret = 18;
|
|
string shareQrcodeUri = 19;
|
|
repeated Picture additionalPictures = 21;
|
|
FollowerData followerData = 22;
|
|
// string userString1 = 23;
|
|
UserRanking userRank1 = 25;
|
|
// string userString2 = 32;
|
|
uint64 data4 = 37;
|
|
string uniqueId = 38; // @-ID for user
|
|
string data5 = 46;
|
|
UserRanking userRank2 = 61;
|
|
repeated Badge badges = 64;
|
|
string userIdString = 1028;
|
|
|
|
// Data about Follower-Counts
|
|
message FollowerData {
|
|
uint32 following = 1; // Amount this user Follows
|
|
uint32 followers = 2; // Amount following this user
|
|
uint32 followsHost = 3; // Relative Role of this User to the Host. IS AN ENUM
|
|
}
|
|
|
|
message UserRanking {
|
|
Picture img1 = 1;
|
|
string eventType = 3;
|
|
Picture img2 = 4;
|
|
IdData id1 = 5;
|
|
IdData id2 = 6;
|
|
}
|
|
}
|
|
|
|
// Is part of WebcastGiftBroadcastMessage. Thus far not seen sent seperately
|
|
message WebcastRoomNotifyMessage {
|
|
string type = 1;
|
|
uint64 id1 = 2;
|
|
uint64 id2 = 3;
|
|
uint64 timeStamp = 4;
|
|
uint32 data1 = 6;
|
|
NotifyData data = 8;
|
|
|
|
message NotifyData {
|
|
string type = 1;
|
|
string label = 2;
|
|
TikTokColor color = 3;
|
|
repeated GiftDetailsData data = 4;
|
|
}
|
|
}
|
|
|
|
/**
|
|
|
|
-=-=-=-=-=-=-=-=-=-=-=
|
|
Server-Messages
|
|
-=-=-=-=-=-=-=-=-=-=-=
|
|
|
|
*/
|
|
|
|
// Separate from WebcastLinkMicMethod. This contains RTC-Data
|
|
message LinkMicMethod {
|
|
MessageHeader header = 1;
|
|
uint32 data1 = 2;
|
|
uint64 rtcChannelId = 8;
|
|
uint32 data2 = 9; // Either data2 or data3 is probably RTC_Vendor
|
|
uint32 data3 = 10;
|
|
uint32 data4 = 11;
|
|
uint64 data5 = 13;
|
|
uint64 id1 = 24;
|
|
uint64 data6 = 28;
|
|
uint64 data7 = 29; // Either data7 or data9 is probably RTC_MixType
|
|
string data8 = 31;
|
|
string json = 32; // RTC-Data in JSON-Format
|
|
string rtcUserId = 37;
|
|
uint32 data9 = 43;
|
|
uint32 data10 = 51;
|
|
}
|
|
|
|
message RoomMessage {
|
|
MessageHeader header = 1;
|
|
string message = 2;
|
|
uint32 data1 = 7;
|
|
}
|
|
|
|
message SystemMessage {
|
|
MessageHeader header = 1;
|
|
string message = 2;
|
|
}
|
|
|
|
message WebcastBarrageMessage {
|
|
MessageHeader header = 1;
|
|
uint32 data1 = 3;
|
|
Picture picture = 4;
|
|
BarrageMessage message = 5;
|
|
uint32 data3 = 6;
|
|
Picture picture2 = 7;
|
|
Picture picture3 = 8;
|
|
BarrageUser userData = 100;
|
|
|
|
message BarrageMessage {
|
|
string eventType = 1;
|
|
string label = 2;
|
|
TikTokColor color = 3;
|
|
repeated BarrageData data1 = 4;
|
|
|
|
message BarrageData {
|
|
uint64 data1 = 1;
|
|
string data2 = 11;
|
|
UserContainer user = 21;
|
|
}
|
|
}
|
|
|
|
message BarrageUser {
|
|
uint32 data1 = 1;
|
|
uint32 data2 = 2;
|
|
string userId = 3;
|
|
User user = 4;
|
|
}
|
|
}
|
|
|
|
// Closed Captioning for Video
|
|
message WebcastCaptionMessage {
|
|
MessageHeader header = 1;
|
|
uint64 timeStamp = 2;
|
|
uint32 data1 = 3;
|
|
CaptionData captionData = 4;
|
|
|
|
message CaptionData {
|
|
string ISOLanguage = 1;
|
|
string Text = 2;
|
|
}
|
|
}
|
|
|
|
// Variety of Meta-Data about a (Chat-)Message
|
|
message ModerationData {
|
|
string type = 1;
|
|
uint64 value = 2;
|
|
}
|
|
|
|
// Comment sent by User
|
|
message WebcastChatMessage {
|
|
MessageHeader header = 1;
|
|
User sender = 2; // User who sent message
|
|
string comment = 3; // Text for Chat-Message
|
|
uint64 data1 = 11;
|
|
repeated User mentionedUsers = 12; // Users mentioned in comment
|
|
repeated ChatImage images = 13;
|
|
string language = 14; // Language for sender
|
|
DataContainer chatData = 18;
|
|
repeated ModerationData moderationData = 19;
|
|
|
|
message ChatImage {
|
|
uint64 data1 = 1;
|
|
Picture picture = 2;
|
|
}
|
|
}
|
|
|
|
// System-Control Message from Room (e.g. Host ended Stream)
|
|
message WebcastControlMessage {
|
|
enum ControlAction {
|
|
UNKNOWN = 0;
|
|
STREAM_PAUSED = 1; // Stream Paused by Host
|
|
STREAM_ENDED = 3; // Stream Ended by Host
|
|
}
|
|
|
|
MessageHeader header = 1;
|
|
ControlAction action = 2;
|
|
ControlDetails details = 4;
|
|
|
|
message ControlDetails {
|
|
string type = 8;
|
|
}
|
|
}
|
|
|
|
// Emote sent by user
|
|
message WebcastEmoteChatMessage {
|
|
MessageHeader header = 1;
|
|
User sender = 2;
|
|
EmoteDetails details = 3;
|
|
|
|
message EmoteDetails {
|
|
string id = 1;
|
|
EmoteImage image = 2;
|
|
|
|
message EmoteImage {
|
|
string url = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Envelope
|
|
message WebcastEnvelopeMessage {
|
|
MessageHeader header = 1;
|
|
EnvelopeUser user = 2;
|
|
uint32 data1 = 3;
|
|
|
|
message EnvelopeUser {
|
|
string id = 1;
|
|
uint32 data1 = 2;
|
|
string username = 3;
|
|
string id2 = 4;
|
|
uint32 data2 = 5;
|
|
uint32 data3 = 6;
|
|
uint64 timestamp1 = 7;
|
|
string id1string = 8;
|
|
Picture picture = 9;
|
|
string timestamp2string = 10;
|
|
string id2string = 11;
|
|
uint32 data4 = 12;
|
|
}
|
|
}
|
|
|
|
// Gift Broadcast (Unsure of exact event)
|
|
message WebcastGiftBroadcastMessage {
|
|
GiftMessageHeader header = 1;
|
|
uint64 data1 = 2;
|
|
Picture picture = 3;
|
|
GiftBroadcastData data = 4;
|
|
|
|
message GiftBroadcastData {
|
|
WebcastRoomNotifyMessage roomNotifyMessage = 1;
|
|
string uri = 2;
|
|
uint32 data1 = 3;
|
|
GiftBroadCastImageDataContainer imageData = 6;
|
|
string notifyType = 9;
|
|
uint64 data2 = 10;
|
|
StringData data3 = 11;
|
|
|
|
message GiftBroadCastImageDataContainer {
|
|
uint32 data1 = 1;
|
|
GiftBroadcastImageData image = 2;
|
|
|
|
message GiftBroadcastImageData {
|
|
uint32 data1 = 1;
|
|
uint32 data2 = 2;
|
|
repeated string urls = 3;
|
|
string uri = 4;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Gift sent by user
|
|
message WebcastGiftMessage {
|
|
GiftMessageHeader header = 1;
|
|
uint64 giftId = 2; // Gift-ID
|
|
int32 data1 = 3;
|
|
int32 data2 = 4;
|
|
uint32 repeatCount = 5; // Index of Message in Streak
|
|
uint32 amount = 6; // Number of Gifts sent (in Streak)
|
|
User sender = 7; // User who sent the gift
|
|
User user2 = 8; // Receiver? Found with text "live_gift_send_message_to_anyuser" (Host sent a gift to a viewer?)
|
|
bool repeatEnd = 9; // Whether this is the final message in the GiftStreak
|
|
uint64 serverTime = 11;
|
|
int32 data3 = 13;
|
|
GiftData1 data4 = 14;
|
|
Gift giftDetails = 15; // Details for Gift that was sent
|
|
string logId = 16; // "202301050654360101042172152C002035"
|
|
int32 data5 = 17;
|
|
string data6 = 19;
|
|
string receiptJson = 22; // Same a GiftReceipt
|
|
GiftReceipt receipt = 23; // Same as JSON, but deserialized
|
|
int32 data7 = 24;
|
|
uint32 data8 = 25;
|
|
GiftDetails1 firstGift1 = 26;
|
|
GiftDetails1 firstGift2 = 27;
|
|
GiftDetails2 data9 = 31;
|
|
DataContainer data10 = 32;
|
|
uint32 data11 = 34;
|
|
|
|
message GiftData1 {
|
|
// string data1 = 1; not working
|
|
uint32 data2 = 2;
|
|
uint32 data3 = 3;
|
|
}
|
|
|
|
message GiftDetails1 {
|
|
string eventType = 1;
|
|
string label = 2;
|
|
TikTokColor color = 3;
|
|
GiftDetailsData data = 4;
|
|
}
|
|
|
|
message GiftDetails2 {
|
|
uint32 data1 = 1;
|
|
uint32 data2 = 3;
|
|
repeated string data3 = 4;
|
|
}
|
|
}
|
|
|
|
message WebcastGoalUpdateMessage {
|
|
MessageHeader header = 1;
|
|
TypeValue data = 2;
|
|
GoalUpdateData updateData = 3;
|
|
uint64 id = 4;
|
|
Picture picture = 5;
|
|
string userId = 6;
|
|
GoalUpdateDetails details = 7;
|
|
uint32 data2 = 9;
|
|
uint32 data3 = 10;
|
|
uint32 data4 = 11;
|
|
string idString = 12;
|
|
TimeData timeData = 15;
|
|
}
|
|
|
|
message WebcastHourlyRankMessage {
|
|
MessageHeader header = 1;
|
|
RankContainer data = 2;
|
|
uint32 data2 = 3;
|
|
|
|
message RankContainer {
|
|
uint32 data1 = 1;
|
|
RankingData rankingdata = 2;
|
|
uint32 data2 = 3;
|
|
Ranking rankings = 4;
|
|
RankingData2 rankingdata2 = 5;
|
|
uint32 data3 = 6;
|
|
uint32 data4 = 7;
|
|
|
|
message RankingData {
|
|
uint32 data1 = 1;
|
|
Ranking rankdata = 2;
|
|
string data2 = 3;
|
|
}
|
|
|
|
message RankingData2 {
|
|
uint32 data1 = 1;
|
|
uint32 data2 = 2;
|
|
Ranking rankdata = 3;
|
|
string data3 = 4;
|
|
uint32 data4 = 5;
|
|
uint32 data5 = 6;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Message related to Chat-moderation?
|
|
message WebcastImDeleteMessage {
|
|
MessageHeader header = 1;
|
|
bytes data = 3;
|
|
}
|
|
|
|
message WebcastInRoomBannerMessage {
|
|
MessageHeader header = 1;
|
|
string json = 2; // Json-Data for BannerMessage
|
|
}
|
|
|
|
// User sent one or multiple likes to Stream. Maxes at 15 likes per message
|
|
message WebcastLikeMessage {
|
|
LikeMessageHeader header = 1;
|
|
uint32 count = 2; // Number of Likes for this message. Maxes at 15
|
|
uint64 totalLikes = 3;
|
|
User sender = 5; // Sender of Like(s)
|
|
LikeDataContainer likeData = 8; // Not always filled. The one in Header IS filled.
|
|
uint32 data1 = 9;
|
|
|
|
message LikeDataContainer {
|
|
uint64 data1 = 1;
|
|
LikeData likeData = 2;
|
|
}
|
|
}
|
|
|
|
message WebcastLinkLayerMessage {
|
|
MessageHeader header = 1;
|
|
uint32 data1 = 2;
|
|
uint64 id = 3;
|
|
uint32 data2 = 4;
|
|
LinkLayerDetails details = 100;
|
|
LinkLayerData dataContainer = 102;
|
|
LinkLayerIdContainer idContainer1 = 110;
|
|
LinkLayerIdContainer idContainer2 = 111;
|
|
|
|
message LinkLayerDetails {
|
|
IdContainer ids = 1;
|
|
string idString = 2;
|
|
StringData data = 3; // Only data2 is filled
|
|
uint64 id2 = 4;
|
|
string data2 = 5;
|
|
}
|
|
|
|
message LinkLayerData {
|
|
uint32 data1 = 1;
|
|
LinkLayerDetailsContainer details = 2;
|
|
|
|
message LinkLayerDetailsContainer {
|
|
LinkLayerDetails data1 = 2;
|
|
repeated LinkLayerDetails data2 = 3;
|
|
}
|
|
}
|
|
|
|
message LinkLayerIdContainer {
|
|
IdContainer ids = 1;
|
|
uint32 data1 = 2;
|
|
}
|
|
}
|
|
|
|
message WebcastLinkMessage {
|
|
MessageHeader header = 1;
|
|
uint32 data1 = 2;
|
|
uint64 data2 = 3;
|
|
uint32 data3 = 4;
|
|
LinkMessageData data = 18;
|
|
LinkMessageUserContainer user = 20;
|
|
string token = 200;
|
|
|
|
message LinkMessageData {
|
|
DataContainer data = 1; // index 1 is an Id
|
|
}
|
|
|
|
message LinkMessageUserContainer {
|
|
LinkMessageUser user = 1;
|
|
repeated LinkMessageUser otherUsers = 2;
|
|
|
|
message LinkMessageUser {
|
|
User user = 1;
|
|
uint64 timeStamp = 2;
|
|
uint32 data1 = 4;
|
|
string idString = 5;
|
|
uint32 data2 = 7;
|
|
}
|
|
}
|
|
}
|
|
|
|
message WebcastLinkMicArmies {
|
|
MessageHeader header = 1;
|
|
uint64 id = 2;
|
|
repeated LinkMicArmiesItems battleItems = 3;
|
|
uint64 id2 = 4;
|
|
uint64 timeStamp1 = 5;
|
|
uint64 timeStamp2 = 6;
|
|
int32 battleStatus = 7; // SHOULD BE AN ENUM
|
|
uint64 data1 = 8;
|
|
uint64 data2 = 9;
|
|
uint32 data3 = 10;
|
|
Picture picture = 11;
|
|
uint32 data4 = 12;
|
|
uint32 data5 = 13;
|
|
}
|
|
|
|
// Battle Start?
|
|
message WebcastLinkMicBattle {
|
|
MessageHeader header = 1;
|
|
uint64 id = 2;
|
|
LinkMicBattleConfig battleConfig = 3;
|
|
uint32 data2 = 4;
|
|
repeated LinkMicBattleDetails details = 5;
|
|
repeated LinkMicBattleTeam teams1 = 9;
|
|
repeated LinkMicBattleTeam teams2 = 10;
|
|
repeated LinkMicBattleTeamData teamData = 13;
|
|
|
|
message LinkMicBattleConfig {
|
|
uint64 id1 = 1;
|
|
uint64 timestamp = 2;
|
|
uint32 data1 = 3;
|
|
uint64 id2 = 4;
|
|
uint32 data2 = 5;
|
|
}
|
|
|
|
message LinkMicBattleData {
|
|
uint64 id = 1;
|
|
uint32 data1 = 2;
|
|
uint32 data2 = 3;
|
|
uint32 data3 = 5;
|
|
string url = 6;
|
|
}
|
|
|
|
message LinkMicBattleDetails {
|
|
uint64 id = 1;
|
|
LinkMicBattleData details = 2;
|
|
}
|
|
|
|
message LinkMicBattleTeam {
|
|
uint64 id = 1;
|
|
repeated User users = 2;
|
|
}
|
|
|
|
message LinkMicBattleTeamData {
|
|
uint64 teamId = 1;
|
|
LinkMicBattleData data = 2;
|
|
}
|
|
}
|
|
|
|
message WebcastLinkMicFanTicketMethod {
|
|
MessageHeader header = 1;
|
|
FanTicketDataContainer data = 2;
|
|
|
|
message FanTicketDataContainer {
|
|
FanTicketData details = 1;
|
|
uint32 data1 = 2;
|
|
string icon = 5;
|
|
|
|
message FanTicketData {
|
|
uint64 id = 1;
|
|
uint32 data = 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
message WebcastLinkMicMethod {
|
|
MessageHeader header = 1;
|
|
uint64 data1 = 2;
|
|
uint64 id1 = 5;
|
|
uint32 data2 = 6;
|
|
uint32 data3 = 7;
|
|
uint64 id2 = 8;
|
|
uint32 data4 = 9;
|
|
uint64 data5 = 10;
|
|
uint64 id3 = 38;
|
|
uint32 data6 = 39;
|
|
string data7 = 40; // Combines data6 & id
|
|
uint32 data8 = 43;
|
|
}
|
|
|
|
message WebcastLiveIntroMessage {
|
|
MessageHeader header = 1;
|
|
uint64 roomId = 2;
|
|
uint64 data1 = 3;
|
|
string description = 4;
|
|
User host = 5;
|
|
uint32 data2 = 6;
|
|
IntroData messageData = 7;
|
|
string language = 8; // ISO-language of Host
|
|
|
|
message IntroData {
|
|
uint32 data1 = 1;
|
|
ValueLabel details = 21;
|
|
}
|
|
}
|
|
|
|
// Sent for a variety of events, including Join & Subscribe
|
|
message WebcastMemberMessage {
|
|
enum MemberMessageAction {
|
|
UNKNOWN = 0;
|
|
JOINED = 1; // User Joined the Stream
|
|
SUBSCRIBED = 3; // User Subscribed to the Host
|
|
//?? = 26
|
|
//?? = 27
|
|
//?? = 50 (share?)
|
|
}
|
|
|
|
MemberMessageHeader header = 1;
|
|
User user = 2;
|
|
uint64 totalViewers = 3; // Available in Join-Message
|
|
User user2 = 4;
|
|
MemberMessageAction action = 10;
|
|
MemberMessageData eventDetails = 18; // Identical to details in Header
|
|
string data1 = 19; // "unknown"/"homepage_hot-live_cell"
|
|
string data2 = 20; // "click"
|
|
string data3 = 21; // "rec"
|
|
string data4 = 23; // "other"
|
|
uint32 data5 = 24;
|
|
}
|
|
|
|
message WebcastMsgDetectMessage {
|
|
MessageHeader header = 1;
|
|
uint32 data1 = 2;
|
|
DataContainer data2 = 3; // Only uses index 1, 2 & 4
|
|
TimeStampContainer timestamps = 4;
|
|
string language = 6;
|
|
}
|
|
|
|
message WebcastOecLiveShoppingMessage {
|
|
MessageHeader header = 1;
|
|
uint32 data1 = 2;
|
|
LiveShoppingData shopData = 4;
|
|
TimeStampContainer shopTimings = 5; // Uses index 1, 2 & 3
|
|
LiveShoppingDetails details = 9;
|
|
|
|
message LiveShoppingData {
|
|
string title = 1;
|
|
string priceString = 2; // $55.99
|
|
string imageUrl = 3;
|
|
string shopUrl = 4;
|
|
uint64 data1 = 6;
|
|
string shopName = 7; // "Shopify"
|
|
uint64 data2 = 8;
|
|
string shopUrl2 = 9;
|
|
uint64 data3 = 10;
|
|
uint64 data4 = 11;
|
|
}
|
|
|
|
message LiveShoppingDetails {
|
|
string id1 = 1;
|
|
string data1 = 3;
|
|
uint32 data2 = 4;
|
|
uint64 timestamp = 5;
|
|
ValueLabel data = 6;
|
|
}
|
|
}
|
|
|
|
message WebcastPollMessage {
|
|
MessageHeader header = 1;
|
|
uint32 data1 = 2;
|
|
uint64 id = 3;
|
|
PollMessageData pollData = 4;
|
|
PollMessageOptionsContainer options1 = 5;
|
|
PollMessageOptionsContainer options2 = 6;
|
|
|
|
message PollMessageOptionsContainer {
|
|
repeated PollMessageOption Options = 2;
|
|
User user = 3;
|
|
}
|
|
|
|
message PollMessageOption {
|
|
uint32 currentTotal = 1;
|
|
string label = 2;
|
|
uint32 data1 = 3;
|
|
}
|
|
|
|
message PollMessageData {
|
|
uint64 timeStamp1 = 1;
|
|
uint64 timeStamp2 = 2;
|
|
repeated PollMessageOption options = 3;
|
|
User user = 5;
|
|
}
|
|
}
|
|
|
|
message WebcastQuestionNewMessage {
|
|
MessageHeader header = 1;
|
|
QuestionDetails details = 2;
|
|
|
|
message QuestionDetails {
|
|
uint64 id = 1;
|
|
string text = 2;
|
|
uint64 timeStamp = 4;
|
|
User user = 5;
|
|
uint32 data1 = 20;
|
|
}
|
|
}
|
|
|
|
message WebcastRankTextMessage {
|
|
//WebcastRankTextMessageHeader header = 1;
|
|
uint32 data1 = 2;
|
|
uint32 data2 = 3;
|
|
uint32 data3 = 4;
|
|
RankTextMessageSummary detailsSmall = 5;
|
|
RankTextMessage details = 6;
|
|
uint64 id1 = 7;
|
|
|
|
message RankTextMessageSummary {
|
|
string type = 1;
|
|
string label = 2;
|
|
TikTokColor color = 3;
|
|
ValueLabel details = 4;
|
|
}
|
|
}
|
|
|
|
message WebcastRankUpdateMessage {
|
|
MessageHeader header = 1;
|
|
RankUpdateData data = 2;
|
|
uint32 data1 = 3;
|
|
uint32 data2 = 5;
|
|
|
|
message RankUpdateData {
|
|
uint32 data1 = 1;
|
|
uint32 data2 = 2;
|
|
Ranking rankData = 3;
|
|
RankColor color = 4;
|
|
uint64 data3 = 6;
|
|
string data4 = 7;
|
|
uint32 data5 = 8;
|
|
uint32 data6 = 9;
|
|
uint64 data7 = 10;
|
|
|
|
message RankColor {
|
|
string color = 4;
|
|
}
|
|
|
|
message RankColor2 {
|
|
uint32 data1 = 1;
|
|
string color = 2;
|
|
uint32 data2 = 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Basic Text Message from Room
|
|
message WebcastRoomMessage {
|
|
MessageHeader header = 1;
|
|
string data = 2;
|
|
Picture picture = 5;
|
|
string data2 = 6;
|
|
}
|
|
|
|
// Host Pins comment to stream
|
|
message WebcastRoomPinMessage {
|
|
MessageHeader header = 1;
|
|
RoomPinMessageData pinData1 = 2;
|
|
string originalMsgType = 30;
|
|
uint64 timestamp = 31;
|
|
RoomPinMessageData2 pinData2 = 32;
|
|
uint32 data1 = 33;
|
|
int32 data2 = 34;
|
|
uint64 data3 = 35;
|
|
|
|
message RoomPinMessageData {
|
|
RoomPinMessageDataDetails details = 1;
|
|
User sender = 2;
|
|
string comment = 3;
|
|
repeated User mentionedUsers = 12;
|
|
string language = 14;
|
|
DataContainer chatData = 18;
|
|
repeated ModerationData moderationData = 19;
|
|
|
|
// Basically a RoomPinMessageHeader
|
|
message RoomPinMessageDataDetails {
|
|
string messageType = 1;
|
|
uint64 messageId = 2;
|
|
uint64 roomId = 3;
|
|
uint64 serverTime = 4;
|
|
uint64 data1 = 6;
|
|
PinMessageStringContainer data2 = 8;
|
|
uint64 data3 = 9;
|
|
uint64 data4 = 10;
|
|
uint64 data5 = 11;
|
|
string serverDescription = 15;
|
|
uint64 data6 = 21;
|
|
uint64 data7 = 22;
|
|
uint64 data8 = 23;
|
|
uint64 data9 = 24;
|
|
uint64 data10 = 25;
|
|
|
|
message PinMessageStringContainer {
|
|
string data = 3;
|
|
}
|
|
}
|
|
}
|
|
|
|
message RoomPinMessageData2 {
|
|
uint64 id = 1;
|
|
RoomPinMessageData2Details details = 32;
|
|
|
|
message RoomPinMessageData2Details {
|
|
uint32 data = 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Status of Room (ViewerCount + Top Viewers)
|
|
message WebcastRoomUserSeqMessage {
|
|
MessageHeader header = 1;
|
|
repeated TopViewer topViewers = 2; // Top 4 or less
|
|
uint32 viewerCount = 3; // Number of Viewers in Room
|
|
uint64 data1 = 7;
|
|
uint32 data2 = 8;
|
|
}
|
|
|
|
// Sent for a variety of events, including Follow & Share
|
|
message WebcastSocialMessage {
|
|
SocialMessageHeader header = 1;
|
|
User sender = 2; // CAN BE NULL
|
|
uint64 data1 = 3; // Exists on Share-Message
|
|
uint64 data2 = 4;
|
|
string data3 = 5;
|
|
uint64 totalFollowers = 6; // Exists on Follow-Message
|
|
uint64 data4 = 8; // Exists on Share-Message
|
|
}
|
|
|
|
message WebcastSubNotifyMessage {
|
|
SocialMessageHeader header = 1;
|
|
User sender = 2;
|
|
uint32 data1 = 4;
|
|
uint32 data2 = 5;
|
|
uint32 data3 = 6;
|
|
uint32 data4 = 8;
|
|
}
|
|
|
|
// Related to someone getting banned?
|
|
message WebcastUnauthorizedMemberMessage {
|
|
MessageHeader header = 1;
|
|
uint32 data1 = 2;
|
|
MemberMessageData details1 = 3;
|
|
string data2 = 4;
|
|
MemberMessageData details2 = 5;
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
-=-=-=-=-=-=-=-=-=-=-=
|
|
Message-Headers
|
|
-=-=-=-=-=-=-=-=-=-=-=
|
|
|
|
Most Headers here only different from the base MessageHeader in index 8 (HeaderData)
|
|
This field usually holds a summary of the outer message
|
|
|
|
*/
|
|
|
|
message HeaderData {
|
|
string messageType = 1;
|
|
string details = 2;
|
|
TikTokColor color = 3;
|
|
HeaderDataDetails additionalData = 4;
|
|
|
|
message HeaderDataDetails {
|
|
uint32 data1 = 1;
|
|
string data2 = 11;
|
|
repeated UserContainer users = 21;
|
|
}
|
|
}
|
|
|
|
message ControlData {
|
|
StringData data = 1;
|
|
uint64 serverTime = 2;
|
|
}
|
|
|
|
// Header for Messages. Usually stored in Index1 in the Message
|
|
message MessageHeader {
|
|
string messageType = 1;
|
|
uint64 messageId = 2;
|
|
uint64 roomId = 3;
|
|
uint64 serverTime = 4;
|
|
uint32 data1 = 5;
|
|
uint64 data2 = 6;
|
|
HeaderData headerData = 8;
|
|
uint64 data3 = 9;
|
|
uint64 data4 = 10;
|
|
uint64 data5 = 11;
|
|
string details = 15;
|
|
ControlData controlData = 18;
|
|
uint64 data6 = 21;
|
|
uint64 data7 = 22;
|
|
uint64 data8 = 23;
|
|
uint64 data9 = 24;
|
|
uint64 timeStamp1 = 25;
|
|
}
|
|
|
|
message GiftMessageHeader {
|
|
string messageType = 1;
|
|
uint64 messageId = 2;
|
|
uint64 roomId = 3; // Does not always match RoomID?
|
|
uint64 serverTime = 4;
|
|
uint32 data1 = 5;
|
|
uint64 data2 = 6;
|
|
string description = 7; // "{0}: gifted the host {amount} {giftName}"
|
|
GiftHeaderData headerData = 8;
|
|
uint64 data3 = 9;
|
|
uint64 data4 = 10;
|
|
uint64 data5 = 11;
|
|
string details = 15;
|
|
string description2 = 17 ;// "gift_expensive" found in WebcastGiftBroadcastMessage
|
|
ControlData controlData = 18;
|
|
uint64 data6 = 21;
|
|
uint64 data7 = 22;
|
|
uint64 data8 = 23;
|
|
uint64 data9 = 24;
|
|
uint64 timeStamp1 = 25;
|
|
|
|
message GiftHeaderData {
|
|
string messageType = 1;
|
|
string details = 2;
|
|
TikTokColor color = 3;
|
|
repeated GiftHeaderGiftData giftData = 4;
|
|
|
|
message GiftHeaderGiftData {
|
|
uint32 data1 = 1;
|
|
TikTokColor color = 2;
|
|
string details = 11;
|
|
UserContainer user = 21;
|
|
GiftHeaderGiftDataDetails data2 = 22;
|
|
|
|
message GiftHeaderGiftDataDetails {
|
|
uint64 data1 = 1;
|
|
StringData details = 2; // 1 = DataType, 2 = GiftName
|
|
uint64 data2 = 4;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
message LikeMessageHeader {
|
|
string messageType = 1;
|
|
uint64 messageId = 2;
|
|
uint64 roomId = 3;
|
|
uint64 serverTime = 4;
|
|
uint32 data1 = 5;
|
|
uint64 data2 = 6;
|
|
string description = 7;
|
|
LikeData likeData = 8;
|
|
uint64 data3 = 9;
|
|
uint64 data4 = 10;
|
|
uint64 data5 = 11;
|
|
string details = 15;
|
|
ControlData controlData = 18;
|
|
uint64 data6 = 21;
|
|
uint64 data7 = 22;
|
|
uint64 data8 = 23;
|
|
uint64 data9 = 24;
|
|
uint64 timeStamp1 = 25;
|
|
}
|
|
|
|
message MemberMessageHeader {
|
|
string messageType = 1;
|
|
uint64 messageId = 2;
|
|
uint64 roomId = 3;
|
|
uint64 serverTime = 4;
|
|
uint32 data1 = 5;
|
|
uint64 data2 = 6;
|
|
string description = 7;
|
|
MemberMessageData messageData = 8;
|
|
uint64 data3 = 9;
|
|
uint64 data4 = 10;
|
|
uint64 data5 = 11;
|
|
string details = 15;
|
|
ControlData controlData = 18;
|
|
uint64 data6 = 21;
|
|
uint64 data7 = 22;
|
|
uint64 data8 = 23;
|
|
uint64 data9 = 24;
|
|
uint64 timeStamp1 = 25;
|
|
}
|
|
|
|
message SocialMessageHeader {
|
|
string messageType = 1;
|
|
uint64 messageId = 2;
|
|
uint64 roomId = 3;
|
|
uint64 serverTime = 4;
|
|
uint32 data1 = 5;
|
|
uint64 data2 = 6;
|
|
string description = 7;
|
|
SocialMessageData socialData = 8;
|
|
uint64 data3 = 9;
|
|
uint64 data4 = 10;
|
|
uint64 data5 = 11;
|
|
string details = 15;
|
|
ControlData controlData = 18;
|
|
uint64 data6 = 21;
|
|
uint64 data7 = 22;
|
|
uint64 data8 = 23;
|
|
uint64 data9 = 24;
|
|
uint64 timeStamp1 = 25;
|
|
} |