抖音直播间(web版)弹幕抓取
This commit is contained in:
commit
4ea37b0a65
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
evn/*
|
||||
.DS_Store
|
18
README.md
Normal file
18
README.md
Normal file
@ -0,0 +1,18 @@
|
||||
**抖音直播间(web)弹幕抓取**
|
||||
|
||||
Pre Requirements
|
||||
- Python3
|
||||
- Charles
|
||||
|
||||
1. `git clone https://github.com/gll19920817/tiktok_live`
|
||||
2. `pip install -r requirements.txt`
|
||||
3. `Open Charles > Tools > Mirror > Mirrors Setting`
|
||||
- `Enable Mirror`
|
||||
- `Save to a folder, eg:/Users/douyin/feeds/`
|
||||
- `Add location: https://live.douyin.com/webcast/im/fetch/`
|
||||
4. `change main.py Watcher directory parameter to folder that Step 3 choose, eg: /Users/douyin/feeds/`
|
||||
5. `python3 main.py`
|
||||
|
||||
Final thoughts :
|
||||
1. Save data to mongodb
|
||||
2. Charles alternative: maybe mitmproxy & scapy
|
6
main.py
Normal file
6
main.py
Normal file
@ -0,0 +1,6 @@
|
||||
from scripts import watcher
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
w = watcher.Watcher(directory='/Users/geng/charles/autosaved')
|
||||
w.run()
|
13
messages/Base.py
Normal file
13
messages/Base.py
Normal file
@ -0,0 +1,13 @@
|
||||
class Base:
|
||||
|
||||
instance = None
|
||||
|
||||
def set_payload(self, payload):
|
||||
self.instance.ParseFromString(payload)
|
||||
|
||||
def user(self):
|
||||
return self.instance.user
|
||||
|
||||
def __str__(self):
|
||||
pass
|
||||
|
0
messages/__init__.py
Normal file
0
messages/__init__.py
Normal file
11
messages/chat.py
Normal file
11
messages/chat.py
Normal file
@ -0,0 +1,11 @@
|
||||
import time
|
||||
|
||||
from protobuf import message_pb2
|
||||
from messages.base import Base
|
||||
|
||||
class ChatMessage(Base):
|
||||
def __init__(self):
|
||||
self.instance = message_pb2.ChatMessage()
|
||||
|
||||
def __str__(self):
|
||||
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '【发言】' + self.user().nickname + ': ' + self.instance.content
|
11
messages/gift.py
Normal file
11
messages/gift.py
Normal file
@ -0,0 +1,11 @@
|
||||
import time
|
||||
|
||||
from protobuf import message_pb2
|
||||
from messages.base import Base
|
||||
|
||||
class GiftMessage(Base):
|
||||
def __init__(self):
|
||||
self.instance = message_pb2.GiftMessage()
|
||||
|
||||
def __str__(self):
|
||||
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '【送礼】' + self.instance.common.describe
|
11
messages/like.py
Normal file
11
messages/like.py
Normal file
@ -0,0 +1,11 @@
|
||||
import time
|
||||
|
||||
from protobuf import message_pb2
|
||||
from messages.base import Base
|
||||
|
||||
class LikeMessage(Base):
|
||||
def __init__(self):
|
||||
self.instance = message_pb2.LikeMessage()
|
||||
|
||||
def __str__(self):
|
||||
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '【点赞】' + self.user().nickname + ' 点赞了直播间(' + str(self.instance.count) + '连赞)'
|
14
messages/member.py
Normal file
14
messages/member.py
Normal file
@ -0,0 +1,14 @@
|
||||
import time
|
||||
|
||||
from protobuf import message_pb2
|
||||
from messages.base import Base
|
||||
|
||||
class MemberMessage(Base):
|
||||
def __init__(self):
|
||||
self.instance = message_pb2.MemberMessage()
|
||||
|
||||
def __str__(self):
|
||||
template = self.instance.common.displayText.defaultPattern
|
||||
nickname = self.user().nickname
|
||||
|
||||
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '【进入直播间】' + template.replace('{0:user}', nickname).replace('{1:string}', '')
|
11
messages/roomuserseq.py
Normal file
11
messages/roomuserseq.py
Normal file
@ -0,0 +1,11 @@
|
||||
import time
|
||||
|
||||
from protobuf import message_pb2
|
||||
from messages.base import Base
|
||||
|
||||
class RoomUserSeqMessage(Base):
|
||||
def __init__(self):
|
||||
self.instance = message_pb2.RoomUserSeqMessage()
|
||||
|
||||
def __str__(self):
|
||||
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '【观看人数】' + self.instance.totalUserStr
|
11
messages/social.py
Normal file
11
messages/social.py
Normal file
@ -0,0 +1,11 @@
|
||||
import time
|
||||
|
||||
from protobuf import message_pb2
|
||||
from messages.base import Base
|
||||
|
||||
class SocialMessage(Base):
|
||||
def __init__(self):
|
||||
self.instance = message_pb2.SocialMessage()
|
||||
|
||||
def __str__(self):
|
||||
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '【关注】' + self.user().nickname + ' 关注了主播'
|
67
messages/utils.py
Normal file
67
messages/utils.py
Normal file
@ -0,0 +1,67 @@
|
||||
from protobuf import message_pb2
|
||||
|
||||
from messages.member import MemberMessage
|
||||
from messages.like import LikeMessage
|
||||
from messages.roomuserseq import RoomUserSeqMessage
|
||||
from messages.gift import GiftMessage
|
||||
from messages.social import SocialMessage
|
||||
from messages.chat import ChatMessage
|
||||
|
||||
from colorama import init, Fore
|
||||
# define colors
|
||||
RED = Fore.RED
|
||||
GREEN = Fore.GREEN
|
||||
BLUE = Fore.BLUE
|
||||
CYAN = Fore.CYAN
|
||||
MAGENTA = Fore.MAGENTA
|
||||
YELLOW = Fore.YELLOW
|
||||
WHITE = Fore.WHITE
|
||||
RESET = Fore.RESET
|
||||
init()
|
||||
|
||||
def unpackMsgBin(filepath):
|
||||
response = message_pb2.Response()
|
||||
|
||||
try:
|
||||
with open(filepath, 'rb') as f:
|
||||
response.ParseFromString(f.read())
|
||||
|
||||
decodeMsg(response.messages)
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
def decodeMsg(messages):
|
||||
for message in messages:
|
||||
try:
|
||||
if message.method == 'WebcastMemberMessage':
|
||||
member_message = MemberMessage()
|
||||
member_message.set_payload(message.payload)
|
||||
print(f"\n{RED}[+] {member_message} {RESET}")
|
||||
|
||||
elif message.method == 'WebcastSocialMessage':
|
||||
social_message = SocialMessage()
|
||||
social_message.set_payload(message.payload)
|
||||
print(f"\n{GREEN}[+] {social_message} {RESET}")
|
||||
|
||||
elif message.method == 'WebcastChatMessage':
|
||||
chat_message = ChatMessage()
|
||||
chat_message.set_payload(message.payload)
|
||||
print(f"\n{BLUE}[+] {chat_message} {RESET}")
|
||||
|
||||
elif message.method == 'WebcastLikeMessage':
|
||||
like_message = LikeMessage()
|
||||
like_message.set_payload(message.payload)
|
||||
print(f"\n{CYAN}[+] {like_message} {RESET}")
|
||||
|
||||
elif message.method == 'WebcastGiftMessage':
|
||||
gift_message = GiftMessage()
|
||||
gift_message.set_payload(message.payload)
|
||||
print(f"\n{MAGENTA}[+] {gift_message} {RESET}")
|
||||
|
||||
elif message.method == 'WebcastRoomUserSeqMessage':
|
||||
room_user_seq_message = RoomUserSeqMessage()
|
||||
room_user_seq_message.set_payload(message.payload)
|
||||
print(f"\n{YELLOW}[+] {room_user_seq_message} {RESET}")
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
0
protobuf/__init__.py
Normal file
0
protobuf/__init__.py
Normal file
1735
protobuf/decoded.txt
Normal file
1735
protobuf/decoded.txt
Normal file
File diff suppressed because it is too large
Load Diff
551
protobuf/message.proto
Normal file
551
protobuf/message.proto
Normal file
@ -0,0 +1,551 @@
|
||||
syntax = "proto3";
|
||||
|
||||
message Response{
|
||||
repeated Message messages = 1;
|
||||
string cursor = 2;
|
||||
int64 fetchInterval = 3;
|
||||
int64 now = 4;
|
||||
string internalExt = 5;
|
||||
int32 fetchType = 6;
|
||||
map<string, string> routeParams = 7;
|
||||
int64 heartbeatDuration = 8;
|
||||
bool needAck = 9;
|
||||
string pushServer = 10;
|
||||
}
|
||||
|
||||
message Message{
|
||||
string method = 1;
|
||||
bytes payload = 2;
|
||||
int64 msgId = 3;
|
||||
int32 msgType = 4;
|
||||
int64 offset = 5;
|
||||
}
|
||||
|
||||
message RoomUserSeqMessage {
|
||||
Common common = 1;
|
||||
repeated Contributor ranks = 2;
|
||||
int64 total = 3;
|
||||
string popStr = 4;
|
||||
repeated Contributor seats = 5;
|
||||
int64 popularity = 6;
|
||||
int64 totalUser = 7;
|
||||
string totalUserStr = 8;
|
||||
string totalStr = 9;
|
||||
string onlineUserForAnchor = 10;
|
||||
string totalPvForAnchor = 11;
|
||||
|
||||
message Contributor {
|
||||
int64 score = 1;
|
||||
User user = 2;
|
||||
int64 rank = 3;
|
||||
int64 delta = 4;
|
||||
bool isHidden = 5;
|
||||
string scoreDescription = 6;
|
||||
string exactlyScore = 7;
|
||||
}
|
||||
}
|
||||
|
||||
message GiftMessage {
|
||||
Common common = 1;
|
||||
int64 giftId = 2;
|
||||
int64 fanTicketCount = 3;
|
||||
int64 groupCount = 4;
|
||||
int64 repeatCount = 5;
|
||||
int64 comboCount = 6;
|
||||
User user = 7;
|
||||
User toUser = 8;
|
||||
int32 repeatEnd = 9;
|
||||
TextEffect textEffect = 10;
|
||||
int64 groupId = 11;
|
||||
int64 incomeTaskgifts = 12;
|
||||
int64 roomFanTicketCount = 13;
|
||||
GiftIMPriority priority = 14;
|
||||
GiftStruct gift = 15;
|
||||
string logId = 16;
|
||||
int64 sendType = 17;
|
||||
PublicAreaCommon publicAreaCommon = 18;
|
||||
Text trayDisplayText = 19;
|
||||
int64 bannedDisplayEffects = 20;
|
||||
GiftTrayInfo trayInfo = 21;
|
||||
AssetEffectMixInfo assetEffectMixInfo = 24;
|
||||
|
||||
message TextEffect{
|
||||
Detail portrait = 1;
|
||||
Detail landscape = 2;
|
||||
|
||||
message Detail {
|
||||
Text text = 1;
|
||||
int32 textFontSize = 2;
|
||||
Image background = 3;
|
||||
int32 start = 4;
|
||||
int32 duration = 5;
|
||||
int32 x = 6;
|
||||
int32 y = 7;
|
||||
int32 width = 8;
|
||||
int32 height = 9;
|
||||
int32 shadowDx = 10;
|
||||
int32 shadowDy = 11;
|
||||
int32 shadowRadius = 12;
|
||||
string shadowColor = 13;
|
||||
string strokeColor = 14;
|
||||
int32 strokeWidth = 15;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
message LikeMessage {
|
||||
Common common = 1;
|
||||
int64 count = 2;
|
||||
int64 total = 3;
|
||||
int64 color = 4;
|
||||
User user = 5;
|
||||
string icon = 6;
|
||||
}
|
||||
|
||||
message ChatMessage {
|
||||
Common common = 1;
|
||||
User user = 2;
|
||||
string content = 3;
|
||||
bool visibleToSender = 4;
|
||||
Image backgroundImage = 5;
|
||||
string fullScreenTextColor = 6;
|
||||
Image backgroundImageV2 = 7;
|
||||
PublicAreaCommon publicAreaCommon = 9;
|
||||
Image giftImage = 10;
|
||||
}
|
||||
|
||||
message SocialMessage {
|
||||
Common common = 1;
|
||||
User user = 2;
|
||||
int64 shareType = 3;
|
||||
int64 action = 4;
|
||||
string shareTarget = 5;
|
||||
int64 followCount = 6;
|
||||
PublicAreaCommon publicAreaCommon = 7;
|
||||
}
|
||||
|
||||
message MemberMessage{
|
||||
Common common = 1;
|
||||
User user = 2;
|
||||
int64 memberCount = 3;
|
||||
User operator = 4;
|
||||
bool isSetToAdmin = 5;
|
||||
bool isTopUser = 6;
|
||||
int64 rankScore = 7;
|
||||
int64 topUserNo = 8;
|
||||
int64 enterType = 9;
|
||||
int64 action = 10;
|
||||
string actionDescription = 11;
|
||||
int64 userId = 12;
|
||||
EffectConfig effectConfig = 13;
|
||||
string popStr = 14;
|
||||
EffectConfig enterEffectConfig = 15;
|
||||
Image backgroundImage = 16;
|
||||
Image backgroundImageV2 = 17;
|
||||
Text anchorDisplayText = 18;
|
||||
PublicAreaCommon publicAreaCommon = 19;
|
||||
|
||||
message EffectConfig{
|
||||
int64 type = 1;
|
||||
Image icon = 2;
|
||||
int64 avatarPos = 3;
|
||||
Text text = 4;
|
||||
Image textIcon = 5;
|
||||
int32 stayTime = 6;
|
||||
int64 animAssetId = 7;
|
||||
Image badge = 8;
|
||||
repeated int64 flexSettingArray = 9;
|
||||
Image textIconOverlay = 10;
|
||||
Image animatedBadge = 11;
|
||||
bool hasSweepLight = 12;
|
||||
repeated int64 textFlexSettingArray = 13;
|
||||
int64 centerAnimAssetId = 14;
|
||||
}
|
||||
}
|
||||
|
||||
message Common{
|
||||
string method = 1;
|
||||
int64 msgId = 2;
|
||||
int64 roomId = 3;
|
||||
int64 createTime = 4;
|
||||
int32 monitor = 5;
|
||||
bool isShowMsg = 6;
|
||||
string describe = 7;
|
||||
Text displayText = 8;
|
||||
int64 foldType = 9;
|
||||
int64 anchorFoldType = 10;
|
||||
int64 priorityScore = 11;
|
||||
string logId = 12;
|
||||
string msgProcessFilterK = 13;
|
||||
string msgProcessFilterV = 14;
|
||||
User user = 15;
|
||||
Room room = 16;
|
||||
int64 anchorFoldTypeV2 = 17;
|
||||
int64 processAtSeiTimeMs = 18;
|
||||
}
|
||||
|
||||
message Text{
|
||||
string key = 1;
|
||||
string defaultPattern = 2;
|
||||
TextFormat defaultFormat = 3;
|
||||
repeated TextPiece pieces = 4;
|
||||
}
|
||||
|
||||
message Room {
|
||||
int64 id = 1;
|
||||
string idStr = 2;
|
||||
int64 status = 3;
|
||||
int64 ownerUserId = 4;
|
||||
string title = 5;
|
||||
int64 userCount = 6;
|
||||
int64 createTime = 7;
|
||||
int64 linkmicLayout = 8;
|
||||
int64 finishTime = 9;
|
||||
RoomExtra extra = 10;
|
||||
string dynamicCoverUri = 11;
|
||||
map<int64, string> dynamicCoverDict = 12;
|
||||
int64 lastPingTime = 13;
|
||||
int64 liveId = 14;
|
||||
int64 streamProvider = 15;
|
||||
int64 osType = 16;
|
||||
int64 clientVersion = 17;
|
||||
bool withLinkmic = 18;
|
||||
bool enableRoomPerspective = 19;
|
||||
Image cover = 20;
|
||||
Image dynamicCover = 21;
|
||||
Image dynamicCoverLow = 22;
|
||||
string shareUrl = 23;
|
||||
string anchorShareText = 24;
|
||||
string userShareText = 25;
|
||||
int64 streamId = 26;
|
||||
string streamIdStr = 27;
|
||||
StreamUrl streamUrl = 28;
|
||||
int64 mosaicStatus = 29;
|
||||
string mosaicTip = 30;
|
||||
int64 cellStyle = 31;
|
||||
LinkMic linkMic = 32;
|
||||
int64 luckymoneyNum = 33;
|
||||
repeated Decoration decoList = 34;
|
||||
repeated TopFan topFans = 35;
|
||||
RoomStats stats = 36;
|
||||
string sunDailyIconContent = 37;
|
||||
string distance = 38;
|
||||
string distanceCity = 39;
|
||||
string location = 40;
|
||||
string realDistance = 41;
|
||||
Image feedRoomLabel = 42;
|
||||
string commonLabelList = 43;
|
||||
RoomUserAttr livingRoomAttrs = 44;
|
||||
repeated int64 adminUserIds = 45;
|
||||
User owner = 46;
|
||||
string privateInfo = 47;
|
||||
}
|
||||
|
||||
message RoomExtra{
|
||||
|
||||
}
|
||||
|
||||
message RoomStats{
|
||||
|
||||
}
|
||||
|
||||
message RoomUserAttr{
|
||||
|
||||
}
|
||||
|
||||
message StreamUrl{
|
||||
|
||||
}
|
||||
|
||||
message LinkMic {
|
||||
|
||||
}
|
||||
|
||||
message Decoration{
|
||||
|
||||
}
|
||||
|
||||
message TopFan {
|
||||
|
||||
}
|
||||
|
||||
message User{
|
||||
int64 id = 1;
|
||||
int64 shortId = 2;
|
||||
string nickname = 3;
|
||||
int32 gender = 4;
|
||||
string signature = 5;
|
||||
int32 level = 6;
|
||||
int64 birthday = 7;
|
||||
string telephone = 8;
|
||||
Image avatarThumb = 9;
|
||||
Image avatarMedium = 10;
|
||||
Image avatarLarge = 11;
|
||||
bool verified = 12;
|
||||
int32 experience = 13;
|
||||
string city = 14;
|
||||
int32 status = 15;
|
||||
int64 createTime = 16;
|
||||
int64 modifyTime = 17;
|
||||
int32 secret = 18;
|
||||
string shareQrcodeUri = 19;
|
||||
int32 incomeSharePercent = 20;
|
||||
Image badgeImageList = 21;
|
||||
FollowInfo followInfo = 22;
|
||||
PayGrade payGrade = 23;
|
||||
FansClub fansClub = 24;
|
||||
Border border = 25;
|
||||
string specialId = 26;
|
||||
Image avatarBorder = 27;
|
||||
Image medal = 28;
|
||||
repeated Image realTimeIcons = 29;
|
||||
repeated Image newRealTimeIcons = 30;
|
||||
int64 topVipNo = 31;
|
||||
UserAttr userAttr = 32;
|
||||
OwnRoom ownRoom = 33;
|
||||
int64 payScore = 34;
|
||||
int64 ticketCount = 35;
|
||||
AnchorInfo anchorInfo = 36;
|
||||
int32 linkMicStats = 37;
|
||||
string displayId = 38;
|
||||
|
||||
message UserAttr {
|
||||
|
||||
}
|
||||
|
||||
message OwnRoom {
|
||||
|
||||
}
|
||||
|
||||
message AnchorInfo {
|
||||
|
||||
}
|
||||
|
||||
message FollowInfo {
|
||||
int64 followingCount = 1;
|
||||
int64 followerCount = 2;
|
||||
int64 followStatus = 3;
|
||||
int64 pushStatus = 4;
|
||||
string remarkName = 5;
|
||||
}
|
||||
|
||||
message FansClub{
|
||||
FansClubData data = 1;
|
||||
map<int32, FansClubData> preferData = 2;
|
||||
|
||||
message FansClubData {
|
||||
string clubName = 1;
|
||||
int32 level = 2;
|
||||
int32 userFansClubStatus = 3;
|
||||
UserBadge badge = 4;
|
||||
repeated int64 availableGiftIds = 5;
|
||||
int64 anchorId = 6;
|
||||
|
||||
message UserBadge {
|
||||
map<int32, Image> icons = 1;
|
||||
string title = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
message Border{
|
||||
|
||||
}
|
||||
|
||||
message GradeBuffInfo {
|
||||
int64 buffLevel = 1;
|
||||
int32 status = 2;
|
||||
int64 endTime = 3;
|
||||
map<int64, int64> statsInfo = 4;
|
||||
Image buffBadge = 5;
|
||||
}
|
||||
|
||||
message PayGrade {
|
||||
int64 totalDiamondCount = 1;
|
||||
Image diamondIcon = 2;
|
||||
string name = 3;
|
||||
Image icon = 4;
|
||||
string nextName = 5;
|
||||
int64 level = 6;
|
||||
Image nextIcon = 7;
|
||||
int64 nextDiamond = 8;
|
||||
int64 nowDiamond = 9;
|
||||
int64 thisGradeMinDiamond = 10;
|
||||
int64 thisGradeMaxDiamond = 11;
|
||||
int64 payDiamondBak = 12;
|
||||
string gradeDescribe = 13;
|
||||
repeated GradeIcon gradeIconList = 14;
|
||||
int64 screenChatType = 15;
|
||||
Image imIcon = 16;
|
||||
Image imIconWithLevel = 17;
|
||||
Image liveIcon = 18;
|
||||
Image newImIconWithLevel = 19;
|
||||
Image newLiveIcon = 20;
|
||||
int64 upgradeNeedConsume = 21;
|
||||
string nextPrivileges = 22;
|
||||
Image background = 23;
|
||||
Image backgroundBack = 24;
|
||||
int64 score = 25;
|
||||
GradeBuffInfo buffInfo = 26;
|
||||
string gradeBanner = 1001;
|
||||
Image profileDialogBg = 1002;
|
||||
Image profileDialogBgBack = 1003;
|
||||
|
||||
message GradeIcon{
|
||||
Image icon = 1;
|
||||
int64 iconDiamond = 2;
|
||||
int64 level = 3;
|
||||
string levelStr = 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
message TextFormat{
|
||||
string color = 1;
|
||||
bool bold = 2;
|
||||
bool italic = 3;
|
||||
int32 weight = 4;
|
||||
int32 italicAngle = 5;
|
||||
int32 fontSize = 6;
|
||||
bool userHeightLightColor = 7;
|
||||
bool useRemoteClor = 8;
|
||||
}
|
||||
|
||||
message TextPiece{
|
||||
int32 type = 1;
|
||||
TextFormat format = 2;
|
||||
string stringValue = 11;
|
||||
TextPieceUser userValue = 21;
|
||||
}
|
||||
|
||||
message Image{
|
||||
}
|
||||
|
||||
message TextPieceUser{
|
||||
User user = 1;
|
||||
bool withColon = 2;
|
||||
}
|
||||
|
||||
message PublicAreaCommon {
|
||||
Image userLabel = 1;
|
||||
int64 userConsumeInRoom = 2;
|
||||
int64 userSendGiftCntInRoom = 3;
|
||||
}
|
||||
|
||||
message GiftIMPriority {
|
||||
repeated int64 queueSizes = 1;
|
||||
int64 selfQueuePriority = 2;
|
||||
int64 priority = 3;
|
||||
}
|
||||
|
||||
message GiftTrayInfo{
|
||||
Text trayDisplayText = 1;
|
||||
Image trayBaseImg = 2;
|
||||
Image trayHeadImg = 3;
|
||||
Image trayRightImg = 4;
|
||||
int64 trayLevel = 5;
|
||||
Image trayDynamicImg = 6;
|
||||
}
|
||||
|
||||
message GiftStruct {
|
||||
Image image = 1;
|
||||
string describe = 2;
|
||||
bool notify = 3;
|
||||
int64 duration = 4;
|
||||
int64 id = 5;
|
||||
GiftStructFansClubInfo fansclubInfo = 6;
|
||||
bool forLinkmic = 7;
|
||||
bool doodle = 8;
|
||||
bool forFansclub = 9;
|
||||
bool combo = 10;
|
||||
int32 type = 11;
|
||||
int32 diamondCount = 12;
|
||||
int32 isDisplayedOnPanel = 13;
|
||||
int64 primaryEffectId = 14;
|
||||
Image giftLabelIcon = 15;
|
||||
string name = 16;
|
||||
string region = 17;
|
||||
string manual = 18;
|
||||
bool forCustom = 19;
|
||||
map<string, int64> specialEffects = 20;
|
||||
Image icon = 21;
|
||||
int32 actionType = 22;
|
||||
int32 watermelonSeeds = 23;
|
||||
string goldEffect = 24;
|
||||
repeated LuckyMoneyGiftMeta subs = 25;
|
||||
int64 goldenBeans = 26;
|
||||
int64 honorLevel = 27;
|
||||
int32 itemType = 28;
|
||||
string schemeUrl = 29;
|
||||
GiftPanelOperation giftOperation = 30;
|
||||
string eventName = 31;
|
||||
int64 nobleLevel = 32;
|
||||
string guideUrl = 33;
|
||||
bool punishMedicine = 34;
|
||||
bool forPortal = 35;
|
||||
string businessText = 36;
|
||||
bool cnyGift = 37;
|
||||
int64 appId = 38;
|
||||
int64 vipLevel = 39;
|
||||
bool isGray = 40;
|
||||
string graySchemeUrl = 41;
|
||||
int64 giftScene = 42;
|
||||
GiftBanner giftBanner = 43;
|
||||
repeated string triggerWords = 44;
|
||||
repeated GiftBuffInfo giftBuffInfos = 45;
|
||||
bool forFirstRecharge = 46;
|
||||
Image dynamicImgForSelected = 47;
|
||||
int32 afterSendAction = 48;
|
||||
int64 giftOfflineTime = 49;
|
||||
string topBarText = 50;
|
||||
Image topRightAvatar = 51;
|
||||
string bannerSchemeUrl = 52;
|
||||
bool isLocked = 53;
|
||||
int64 reqExtraType = 54;
|
||||
repeated int64 assetIds = 55;
|
||||
GiftPreviewInfo giftPreviewInfo = 56;
|
||||
GiftTip giftTip = 57;
|
||||
int32 needSweepLightCount = 58;
|
||||
repeated GiftGroupInfo groupInfo = 59;
|
||||
|
||||
message GiftStructFansClubInfo {
|
||||
int32 minLevel = 1;
|
||||
int32 insertPos = 2;
|
||||
}
|
||||
}
|
||||
|
||||
message AssetEffectMixInfo{
|
||||
|
||||
}
|
||||
|
||||
message LuckyMoneyGiftMeta {
|
||||
|
||||
}
|
||||
|
||||
message GiftPanelOperation {
|
||||
|
||||
}
|
||||
|
||||
message GiftBanner {
|
||||
|
||||
}
|
||||
|
||||
message GiftBuffInfo{
|
||||
|
||||
}
|
||||
|
||||
message GiftPreviewInfo{
|
||||
|
||||
}
|
||||
|
||||
message GiftTip {
|
||||
|
||||
}
|
||||
|
||||
message GiftGroupInfo {
|
||||
|
||||
}
|
||||
|
||||
message EffectMixImageInfo {
|
||||
|
||||
}
|
4714
protobuf/message_pb2.py
Normal file
4714
protobuf/message_pb2.py
Normal file
File diff suppressed because one or more lines are too long
BIN
protobuf/raw.bin
Normal file
BIN
protobuf/raw.bin
Normal file
Binary file not shown.
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
||||
colorama==0.4.4
|
||||
protobuf==3.19.1
|
||||
watchdog==2.1.6
|
0
scripts/__init__.py
Normal file
0
scripts/__init__.py
Normal file
37
scripts/watcher.py
Normal file
37
scripts/watcher.py
Normal file
@ -0,0 +1,37 @@
|
||||
import time
|
||||
from watchdog.observers import Observer
|
||||
from watchdog.events import FileSystemEventHandler
|
||||
|
||||
from messages.utils import unpackMsgBin
|
||||
|
||||
class Watcher:
|
||||
DIRECTORY_TO_WATCH = ""
|
||||
|
||||
def __init__(self, directory):
|
||||
self.observer = Observer()
|
||||
self.DIRECTORY_TO_WATCH = directory
|
||||
|
||||
def run(self):
|
||||
event_handler = Handler()
|
||||
self.observer.schedule(event_handler, self.DIRECTORY_TO_WATCH, recursive=True)
|
||||
self.observer.start()
|
||||
|
||||
try:
|
||||
while True:
|
||||
time.sleep(5)
|
||||
except:
|
||||
self.observer.stop()
|
||||
|
||||
self.observer.join()
|
||||
|
||||
|
||||
class Handler(FileSystemEventHandler):
|
||||
|
||||
@staticmethod
|
||||
def on_any_event(event):
|
||||
if event.is_directory:
|
||||
return None
|
||||
|
||||
elif event.event_type == 'created':
|
||||
unpackMsgBin(event.src_path)
|
||||
|
Reference in New Issue
Block a user