众所周知d-y的所有数据都是以json形式的接口数据返回,我们页面上所看到的数据都是有后端获取到数据库中指定的数据,然后经过一系列的组合成json数据,前端获取到后进行页面的数据绑定展示就得到我们所看的的界面效果。
文章图片
首先何为监控?按上面所说的监控就是需要一直去请求接口,将数据记录下来,捕捉到从开始到结束这个过程中所产生的数据就是监控所得到的,接下来为大家带来正常抖音直播的监控流程
一:开播监控
- 监控一个指定主播有没有开播的情况有很多方法,通过关键词搜索用户的直播接口,web用户主页接口等,最常用的应该就是app的用户主页接口,传入用户sec_id请求主页接口,拿到的json数据后去匹配有没有live_room_id_str这个字段就很容易能得到用户开播情况
- 弹幕处理就会麻烦很多,因为弹幕走的是protobuf协议,拿到二进制文件后还需要进行反序列化的操作,目前大多的都是以wss存在形式,常用的还是走的websocekt协议,拿到当前的弹幕二进制进行反序列,控制请求时间一直获取
DESCRIPTOR = _descriptor.FileDescriptor(
name='douyin_comment.proto',
package='',
syntax='proto3',
serialized_options=None,
create_key=_descriptor._internal_create_key,
serialized_pb=b'\n\x14\x64ouyin_comment.proto\"\x85\x01\n\rDouYinComment\x12\x19\n\x07message\x18\x01 \x03(\x0b\x32\x08.Message\x12\x0e\n\x06\x63ursor\x18\x02 \x01(\t\x12\x15\n\rfetchInterval\x18\x03 \x01(\x04\x12\x0b\n\x03now\x18\x04 \x01(\x04\x12\x13\n\x0binternalExt\x18\x05 \x01(\t\x12\x10\n\x08\x66\x65tchTyp\x18\x06 \x01(\x05\"Z\n\x07Message\x12\x0e\n\x06method\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\r\n\x05msgId\x18\x03 \x01(\x04\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0e\n\x06offset\x18\x05 \x01(\x04\"\x9b\x01\n\x14WebcastMemberMessage\x12\x17\n\x06\x63ommon\x18\x01 \x03(\x0b\x32\x07.Common\x12\x13\n\x04user\x18\x02 \x03(\x0b\x32\x05.User\x12\x13\n\x0bmemberCount\x18\x03 \x01(\x04\x12\x17\n\x08operator\x18\x04 \x03(\x0b\x32\x05.User\x12\x14\n\x0cisSetToAdmin\x18\x05 \x01(\x08\x12\x11\n\tisTopUser\x18\x06 \x01(\x08\"S\n\x12WebcastChatMessage\x12\x17\n\x06\x63ommon\x18\x01 \x03(\x0b\x32\x07.Common\x12\x13\n\x04user\x18\x02 \x03(\x0b\x32\x05.User\x12\x0f\n\x07\x63ontent\x18\x03 \x01(\t\"\xaa\x02\n\x06\x43ommon\x12\x0e\n\x06method\x18\x01 \x01(\t\x12\r\n\x05msgId\x18\x02 \x01(\x04\x12\x0e\n\x06roomId\x18\x03 \x01(\x04\x12\x12\n\ncreateTime\x18\x04 \x01(\x04\x12\x0f\n\x07monitor\x18\x05 \x01(\x05\x12\x11\n\tisShowMsg\x18\x06 \x01(\x08\x12\x10\n\x08\x64\x65scribe\x18\x07 \x01(\t\x12!\n\x0b\x64isplayText\x18\x08 \x03(\x0b\x32\x0c.DisplayText\x12\x10\n\x08\x66oldType\x18\t \x01(\x04\x12\x16\n\x0e\x61nchorFoldType\x18\n \x01(\x04\x12\x15\n\rpriorityScore\x18\x0b \x01(\x04\x12\r\n\x05logId\x18\x0c \x01(\t\x12\x19\n\x11msgProcessFilterK\x18\r \x01(\t\x12\x19\n\x11msgProcessFilterV\x18\x0e \x01(\t\"\x8c\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0f\n\x07shortId\x18\x02 \x01(\x04\x12\x10\n\x08nickname\x18\x03 \x01(\t\x12\x0e\n\x06gender\x18\x04 \x01(\x05\x12\x11\n\tsignature\x18\x05 \x01(\t\x12\r\n\x05level\x18\x06 \x01(\x05\x12\x10\n\x08\x62irthday\x18\x07 \x01(\x04\x12\x11\n\ttelephone\x18\x08 \x01(\t\"V\n\x0b\x44isplayText\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x16\n\x0e\x64\x65\x66\x61ultPattern\x18\x02 \x01(\t\x12\"\n\rdefaultFormat\x18\x03 \x03(\x0b\x32\x0b.TextFormat\"\x0c\n\nTextFormatb\x06proto3'
)_DOUYINCOMMENT = _descriptor.Descriptor(
name='DouYinComment',
full_name='DouYinComment',
filename=None,
file=DESCRIPTOR,
containing_type=None,
create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name='message', full_name='DouYinComment.message', index=0,
number=1, type=11, cpp_type=10, label=3,
has_default_value=https://www.it610.com/article/False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR,create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='cursor', full_name='DouYinComment.cursor', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=https://www.it610.com/article/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,create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='fetchInterval', full_name='DouYinComment.fetchInterval', index=2,
number=3, type=4, cpp_type=4, label=1,
has_default_value=https://www.it610.com/article/False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR,create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='now', full_name='DouYinComment.now', index=3,
number=4, type=4, cpp_type=4, label=1,
has_default_value=https://www.it610.com/article/False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR,create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='internalExt', full_name='DouYinComment.internalExt', index=4,
number=5, type=9, cpp_type=9, label=1,
has_default_value=https://www.it610.com/article/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,create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='fetchTyp', full_name='DouYinComment.fetchTyp', index=5,
number=6, type=5, cpp_type=1, label=1,
has_default_value=https://www.it610.com/article/False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR,create_key=_descriptor._internal_create_key),
],
extensions=[
],
nested_types=[],
enum_types=[
],
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=25,
serialized_end=158,
)_MESSAGE = _descriptor.Descriptor(
name='Message',
full_name='Message',
filename=None,
file=DESCRIPTOR,
containing_type=None,
create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name='method', full_name='Message.method', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=https://www.it610.com/article/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,create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='payload', full_name='Message.payload', index=1,
number=2, type=12, cpp_type=9, label=1,
has_default_value=https://www.it610.com/article/False, default_value=b"",
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR,create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='msgId', full_name='Message.msgId', index=2,
number=3, type=4, cpp_type=4, label=1,
has_default_value=https://www.it610.com/article/False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR,create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='msgType', full_name='Message.msgType', index=3,
number=4, type=5, cpp_type=1, label=1,
has_default_value=https://www.it610.com/article/False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR,create_key=_descriptor._internal_create_key),
_descriptor.FieldDescriptor(
name='offset', full_name='Message.offset', index=4,
number=5, type=4, cpp_type=4, label=1,
has_default_value=https://www.it610.com/article/False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR,create_key=_descriptor._internal_create_key),
],
extensions=[
],
nested_types=[],
enum_types=[
],
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=160,
serialized_end=250,
)
二、下载流媒体文件
从网上下载各种流媒体,常常要使用Streambox Vcr(点这里下载)。
StreamBox Vcr可以解析RSTP地址背后流媒体文件真正的下载链接,并最终将文件下载到本地硬盘上。它可以下载RAM、RA(Real Media)、ASX(Windows Media)、SMIL(Real Media Conter)、PLS(MP3 Stream)和MOV(Quicktime)等格式的流媒体文件,它不但支持点播形式的流节目也同样支持现场流节目,而且两者可以同时下载,还支持断点续传!
【抖音方案|抖音直播监控-循环值守24小时-直播弹幕】Streambox Vcr 1.0 Suite软件包中包含了三个不同的版本,其中 Beta 2 版本适合用于下载 Real 格式影片,而 Beta 3.1 版本则适合下载 ASF 格式影片。
下载方法:
把找到的地址拷贝到剪贴板中,然后运行Streambox Vcr(如图),点击“添加”按钮,软件则会自动把节目的链接地址复制到“Location”(待下载链接框)中,接着你再选择文件的保存路径和文件名字,下载协议选“Auto”让Streambox Vcr自动判别。以上步骤完成后按一下“OK”按钮,Streambox Vcr经过分析地址无误后就会开始
下载了。
三、利用OE自动下载流媒体
Offline Explorer 是一款使用方便的离线浏览工具(点这里下载),也可以用来下载流媒体。对于地址形如
rtsp://17k:2245352@www.17k.cn/17kfilms/movies/action/s4120364/01.sm的流媒体,要下载还必须使用OE呢!
OE可以让你选择要抓取网站的深度、下载的存放位置等,还可以提供抓取网站的MAP,使整个网站的链接及目
录结构一目了然。
推荐阅读
- python|【Python基础教程】类的定义和使用
- python|python写一个简单的爬虫程序(爬取快手)(附源码)
- python基础知识|【实现用户注册,登录和登出】但是用 Flask + MySQL(python)
- 历史上的今天|【历史上的今天】12 月 18 日(Perl 1.0 诞生;音频制作软件 FL Studio 问世;微软发布 Windows MCE 2003)
- pycharm|最新版pycharm-2022.1中换源按钮manage repositories更改位置
- python|PyCharm 2021.1最新版现已发布|附下载
- pycharm2022.1版本更换pip镜像源
- python|python license 过期_pycharm2020.2专业版永久激活(已失效)
- pycharm|最新版PyCharm 2022.1.2 (Community Edition)的pip镜像设置攻略