B站一键查询视频/分P视频/番剧的弹幕发送者

近几年因为B站的门槛越来越低,时常会看到一些让人眼前一亮的弹幕。直接举报拉黑这种做法显然已经太便宜了、、

网上大部分查询工具时效性已经过了或者有局限性,所以我打算自己写一款能通过视频、分P视频、番剧来查询弹幕发送者的工具,输入视频链接就能查询。

当然工具我已经放进了GITHUB,可前往https://github.com/cwuom/GetDanmuSender查看!

这里贴出程序运行结果:

注: 'xxx'是为了保护隐私,可直接去github上看

全部弹幕信息已构造完成,请输入关键字(你想要搜索的弹幕内容)来检索弹幕。 若要搜索全部弹幕,请先回车后再输入all来搜索

搜索弹幕> 别再回忆了,好水

检索到弹幕 -> 别再回忆了,好水 ...

按下回车进行midHash逆向操作(UID反推)。这可能需要一点时间.. 'n'取消

cracking -> 40357a2c

==========================

弹幕内容: 别再回忆了,好水

发送时间: 2022-11-25 17:35:33

字体大小: 18

弹幕类型: 普通弹幕

发送者UID: 503xxx7312

发送者主页连接: https://space.bilibili.com/503xxx312

==========================

所有UID反推成功,耗时1.03秒

注意事项👀

使用代理

若您在打开代理的环境下使用本程序,您需要注意以下几点(这里用Clash for Windows举例)

  • 关闭系统代理模式(System Proxy),这可能会导致程序无法访问API

  • 若您关闭了系统代理模式(System Proxy)无法正常上网,请尝试点亮小地球(Service Mode)

  • 若还是无法正常联网,请通过Issues来阐述具体情况(除程序外的软件、网站访问情况或是代理规则等)

报错、闪退

  • 若遇到这些问题,请先将程序闲置几个小时来排除风控的可能。若在闲置后问题依旧复发,请通过Issues告诉我复现方式(视频链接、网络环境、运行环境、操作系统等)。

  • 若您用的是打包版本(exe),您可以通过在运行目录打开命令窗口后输入{软件名称}.exe来运行。在此环境下,报错后不会直接闪退而是会出现具体的报错内容。请将报错内容截图或以文字形式提供给我我才能更好的解决问题。

返回UID一定正确吗?

  • 因为弹幕文件的mid是通过crc32校验得到的结果转为16进制数,一般无法逆向。但在查询后得知还是有类似的反推算法的,此算法作者也在文档中说明“Sometimes the results are inaccurate”,经过核实B站最新的16位mid以及超过10位以上的mid被加密后都无法正常反推出原有数据。但8、9位UID的返回结果基本正确。所以此程序只能保证大部分用户发送的弹幕中mid_hash逆向结果是正确的。若真的要查成分也需进一步核实,若因为此程序造成的误伤后果自负!

声明

  • 一切开发皆在学习,请勿用于非法用途

如果做的可以的话麻烦点个STAR啦,谢谢

这里同样贴出源码:

main.py

# -*- coding: utf-8 -*-

import ctypes
import math
import inspect
import os
import random
import re
from threading import Thread

import requests
import time
import json
import keyboard

import bili_pb2

"""
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
B站弹幕解析,支持解析番剧/分P视频/普通视频的全部弹幕并反推发送者UID

如何使用?
1. 程序在运行时会检测cookies可用性。请不要使用代理,这可能会让你无法通过cookies验证
2. 直接复制视频/番剧URL回车执行解析操作...

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
bilibili@im-cwuom(uid:473400804)
follow to get more
"""

# 保证每一次运行headers都不一样
user_agent_list = [
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/61.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
]
headers = {'User-Agent': random.choice(user_agent_list)}

crack_list = []  # 逆向mid后的弹幕数据
all_danmu = []  # 全部弹幕数据
tlist = []  # 存储逆向线程,用于提前终止逆向操作
STOP_FLAG = False  # 终止标签
gf = 0  # 写入检索弹幕并逆向mid后的结果

# ==================== output-log ====================
# You must initialize logging, otherwise you'll not see debug output.
# http.client.HTTPConnection.debuglevel = 1
# logging.basicConfig(level=logging.DEBUG)
# logging.getLogger().setLevel(logging.DEBUG)
# requests_log = logging.getLogger("requests.packages.urllib3")
# requests_log.setLevel(logging.DEBUG)
# requests_log.propagate = True

# ==================== crc32-crack ====================
# from - https://github.com/Aruelius/crc32-crack
# DO NOT EDIT

CRCPOLYNOMIAL = 0xEDB88320
crctable = [0 for x in range(256)]


def create_table():
    for i in range(256):
        crcreg = i
        for _ in range(8):
            if (crcreg & 1) != 0:
                crcreg = CRCPOLYNOMIAL ^ (crcreg >> 1)
            else:
                crcreg = crcreg >> 1
        crctable[i] = crcreg


def crc32(string):
    crcstart = 0xFFFFFFFF
    for i in range(len(str(string))):
        index = (crcstart ^ ord(str(string)[i])) & 255
        crcstart = (crcstart >> 8) ^ crctable[index]
    return crcstart


def crc32_last_index(string):
    crcstart = 0xFFFFFFFF
    for i in range(len(str(string))):
        index = (crcstart ^ ord(str(string)[i])) & 255
        crcstart = (crcstart >> 8) ^ crctable[index]
    return index


def get_crc_index(t):
    for i in range(256):
        if crctable[i] >> 24 == t:
            return i
    return -1


def deep_check(i, index):
    string = ""
    hashcode = crc32(i)
    tc = hashcode & 0xff ^ index[2]
    if not (57 >= tc >= 48):
        return [0]
    string += str(tc - 48)
    hashcode = crctable[index[2]] ^ (hashcode >> 8)
    tc = hashcode & 0xff ^ index[1]
    if not (57 >= tc >= 48):
        return [0]
    string += str(tc - 48)
    hashcode = crctable[index[1]] ^ (hashcode >> 8)
    tc = hashcode & 0xff ^ index[0]
    if not (57 >= tc >= 48):
        return [0]
    string += str(tc - 48)
    return [1, string]


def crack(danmu):
    print(f"cracking -> {danmu['midHash']}")
    index = [0 for _ in range(4)]
    i = 0
    ht = int(f"0x{danmu['midHash']}", 16) ^ 0xffffffff
    for i in range(3, -1, -1):
        index[3 - i] = get_crc_index(ht >> (i * 8))
        snum = crctable[index[3 - i]]
        ht ^= snum >> ((3 - i) * 8)
    for i in range(100000000):
        lastindex = crc32_last_index(i)
        if lastindex == index[3]:
            deepCheckData = deep_check(i, index)
            if deepCheckData[0]:
                break
    if i == 100000000:
        return -1
    danmu['mid'] = f"{i}{deepCheckData[1]}"
    crack_list.append(danmu)


# ==================== check-cookies ====================
def check_cookies():
    """
    检测cookies的可用性
    :return: cookies(dict)
    """
    while True:
        try:
            f = open("cookies.txt", "r", encoding="utf-8")
            cookies = f.read()
            cookies = convert_cookies_to_dict(cookies)
            try:
                check_cookie = requests.get("https://api.bilibili.com/x/space/upstat?mid=1", cookies=cookies,
                                            headers=headers).text
            except:
                output_log("E", "无法验证您的cookies.. 请检查您的网络设置,若您开启了代理请先关闭代理。")
                break
            if check_cookie == """{"code":0,"message":"0","ttl":1,"data":{}}""":
                open("cookies.txt", "w+", encoding="utf-8")
                print("校验失败,请检查cookies是否过期并及时更新您的cookies。")
                continue

            return cookies
        except:
            f = open("cookies.txt", "w+", encoding="utf-8")
            cookies = input("cookies> ")
            f.write(cookies)


def convert_cookies_to_dict(cookies):
    """
    将输入的cookies转为可识别的字典类型

    :param cookies: string
    :return: cookies(dict)
    """
    cookies = dict([l.split("=", 1) for l in cookies.split("; ")])
    return cookies


# ==================== Get-Video-Info ====================

def get_info(bvid, cookies):
    """
    获取视频基本信息

    :param bvid: BV号(番剧、视频)
    :param cookies: cookies(dict)

    :return: 视频信息
    """
    data = requests.get(f"https://api.bilibili.com/x/web-interface/view?bvid={bvid}",
                        headers=headers,
                        cookies=cookies).text

    data = json.loads(data)["data"]
    video_num = data["videos"]
    title = data["title"]

    pub_time = time.strftime("%Y-%m-%d", time.localtime(data["pubdate"]))

    desc = data["desc"]
    danmuku = data["stat"]["danmaku"]
    name = data["owner"]["name"]
    cid = data["cid"]
    duration = data["duration"]

    dict_info = {"title": title, "pub_time": pub_time, "desc": desc,
                 "danmuku": danmuku, "name": name, "cid": cid, "duration": duration}
    if int(video_num) == 1:
        return dict_info
    else:
        while True:
            try:
                page = int(input("此视频为分P视频,请指定一个page\npage> "))
                dict_info["cid"] = data["pages"][page - 1]["cid"]
                dict_info["title"] = data["pages"][page - 1]["part"]
                dict_info["duration"] = data["pages"][page - 1]["duration"]
                return dict_info
            except:
                continue


def get_ep_key(url):
    """
    获取番剧bvid

    :param url:
    :return: 番剧bvid
    """
    header = {
        "cookie": "_uuid=9D4E10FEF-4CE4-3FD7-CE107-4D1F438110A5229945infoc; buvid3=F94E7751-DA48-4F97-89C9-5A4EE9CF1AA4148817infoc; buvid_fp=F94E7751-DA48-4F97-89C9-5A4EE9CF1AA4148817infoc; video_page_version=v_old_home; blackside_state=1; rpdid=|(J~l|mlYku|0J'uYJ~~u)~)J; CURRENT_BLACKGAP=1; CURRENT_QUALITY=0; CURRENT_FNVAL=80; innersign=0; b_lsid=1FCBBAF8_17E38C696A6; bsource=search_360; PVID=1; buvid_fp_plain=F94E7751-DA48-4F97-89C9-5A4EE9CF1AA4148817infoc; SESSDATA=68181722%2C1657187087%2C2b3ad%2A11; bili_jct=0e3de1c40e32e00990ca7fb365a3350e; DedeUserID=2036429689; DedeUserID__ckMd5=f4d43c2865058f15; sid=ccvhr5mv; i-wanna-go-back=-1; b_ut=5; fingerprint3=a284a6f2bcfcdf907cfb890ae01472e1; fingerprint=bb4d7ec794b31153738097e6b58d32d4; fingerprint_s=03d24d5903476f4db97405b6daaf39c9; bp_video_offset_2036429689=612909923547040740; bp_t_offset_2036429689=612909923547040740",
        "origin": "https://www.bilibili.com",
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55'
    }

    resp = requests.get(url, headers=header)

    # (?P<cid>.*?)
    obj = re.compile(
        r'"bvid":"(?P<bvid>.*?)","cid":(?P<cid>.*?),"cover":"(?P<cover>.*?)",(?P<b>.*?),"link":"(?P<link>.*?)",',
        re.S)
    result = obj.finditer(resp.text)

    for it in result:
        link = it.group("link")
        if url.find(link) != -1:
            bvid = it.group("bvid")
    resp.close()

    return bvid


def get_bvid(url):
    """
    获取一般视频、分P视频的bvid

    :param url: 视频地址
    :return: 视频bvid
    """

    bvid = re.search(r'(BV.*?).{10}', url)
    return bvid.group(0)


def get_danmu(cid, segment_index, cookies):
    """
    获取全部弹幕并累加到all_danmu

    :param cid: oid
    :param segment_index: 弹幕分包(6min为一包)
    :param cookies: cookies(dict)
    """
    global all_danmu

    url = f'https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid={cid}&segment_index={segment_index}'
    resp = requests.get(url, cookies=cookies, headers=headers)
    data = resp.content
    output_log("Getting", url)

    danmaku_seg = bili_pb2.DmSegMobileReply()
    danmaku_seg.ParseFromString(data)

    mode_list = ["普通弹幕", "普通弹幕", "普通弹幕", "普通弹幕", "底部弹幕", "顶部弹幕", "逆向弹幕", "高级弹幕",
                 "代码弹幕", "BAS弹幕(仅限于特殊弹幕专包)"]
    for danmu in danmaku_seg.elems:
        ctime = time.localtime(danmu.ctime)
        add = {"midHash": danmu.midHash, "content": danmu.content, "ctime": time.strftime("%Y-%m-%d %H:%M:%S", ctime),
               "fontsize": danmu.fontsize, "mode": mode_list[danmu.mode], "id": danmu.idStr}
        all_danmu.append(add)


# ==================== Tools ====================

def output_log(title, text):
    """
    输出日志

    :param title: 标题
    :param text: 内容
    """
    print(f"[{title}] {text}")


def print_long_line(t=1):
    """
    输出分割线

    :param t: 分割线样式
    """
    if t == 1:
        print("\n==========================\n")
    elif t == 2:
        print("==========================")


def _async_raise(tid, exctype):
    """
    线程杀手,用于提前终止线程

    :param tid: t.ident
    :param exctype: SystemExit
    """
    """raises the exception, performs cleanup if needed"""
    tid = ctypes.c_long(tid)
    if not inspect.isclass(exctype):
        exctype = type(exctype)
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
    if res == 0:
        raise ValueError("invalid thread id")
    elif res != 1:
        # """if it returns a number greater than one, you're in trouble,
        # and you should call it again with exc=NULL to revert the effect"""
        ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
        raise SystemError("PyThreadState_SetAsyncExc failed")


def StopThread():
    """
    终止所有逆向线程
    """

    global tlist, STOP_FLAG
    for t in tlist:
        STOP_FLAG = True
        try:
            _async_raise(t.ident, SystemExit)
            output_log("STOP", t)
        except:
            pass


def makedirs(folder):
    """
    创建必要文件夹

    :param folder: 文件夹名称
    """
    if not os.path.exists(folder):
        os.makedirs(folder)


def output(msg):
    """
    输出结果并同步输出到文件中

    :param msg: 内容
    """
    global gf
    print(msg)
    gf.write(str(msg) + "\n")


def output_result(danmu):
    """
    输出所有逆向后弹幕信息

    :param danmu: 弹幕
    """
    output("\n==========================")
    output(f"弹幕内容: {danmu['content']}")
    output(f"发送时间: {danmu['ctime']}")
    output(f"字体大小: {danmu['fontsize']}")
    output(f"弹幕类型: {danmu['mode']}")
    output(f"发送者UID: {danmu['mid']}")
    output(f"发送者主页连接: https://space.bilibili.com/{danmu['mid']}")
    output("==========================")


def listToJson(lst):
    """
    将列表转换为json格式,方便其他程序调用

    :param lst: 列表
    :return: json(string)
    """
    str_json = json.dumps(lst, indent=2, ensure_ascii=False)
    return str_json


# ==================================================


def main():
    """
    主函数
    """

    global crack_list, tlist, STOP_FLAG, gf, all_danmu

    cookies = check_cookies()
    while True:
        url = input("bvid&url> ")
        try:
            bvid = get_bvid(url)
            output_log("BVID", bvid)
            break
        except:
            if input("[?] 无法匹配到该视频,你是否需要匹配番剧?(n/*)") == "n":
                continue

            try:
                bvid = get_ep_key(url)
                break
            except:
                output_log("E", "无法找到此番剧。")
                continue

    output_log("/", "获取视频/番剧基本信息...")
    data = get_info(bvid, cookies)
    cid = data["cid"]
    title = data["title"]
    danmuku = data["danmuku"]
    desc = data["desc"]
    pub_time = data["pub_time"]
    duration = data["duration"]

    print_long_line(2)
    output_log("CID", cid)
    output_log("标题", title)
    output_log("弹幕库(?)", danmuku)
    output_log("描述", desc)
    output_log("视频时长", f"{duration}s")
    output_log("发布时间", pub_time)
    print_long_line(2)

    if input("信息无误?(n/*)") == "n":
        main()

    output_log("/", "正在获取全部弹幕...")

    start_time = time.time()
    for i in range(math.ceil(duration / (60 * 6))):
        get_danmu(cid, i + 1, cookies)

    end_time = time.time()

    print(f"弹幕获取完成,耗时{round(end_time - start_time, 2)}秒")

    if len(all_danmu) == 0:
        output_log("E", "此视频没有任何弹幕,请解析其它视频。")
        main()
    output_log("danmu_size", len(all_danmu))

    f = open(f"DanmuJSON/danmu_list_{bvid}.json", "w", encoding="utf-8")
    f.write(listToJson(all_danmu))
    f.close()

    print(
        "\n\n全部弹幕信息已构造完成,请输入关键字(你想要搜索的弹幕内容)来检索弹幕。 若要搜索全部弹幕,请先回车后再输入all来搜索")
    while True:
        STOP_FLAG = False
        crack_list = []
        ftext = input("搜索弹幕> ")
        if ftext == "":
            print("你没有输入任何关键词,请输入关键词后检索!\n若需要检索全部弹幕,请输入'all'")
            if input() != "all":
                continue

        flist = []
        gf = open(f"outputs/{ftext}_{bvid}.txt", "a+", encoding="utf-8")

        for danmu in all_danmu:
            content = danmu["content"]
            if content.find(ftext) != -1:
                flist.append(danmu)
                print(f"检索到弹幕 -> {content} ...")

        if input("按下回车进行midHash逆向操作(UID反推)。这可能需要一点时间.. 'n'取消") == "n":
            continue
        start_time = time.time()
        tlist = []
        for danmu in flist:
            if STOP_FLAG:
                break
            create_table()
            t = Thread(target=crack, args=(danmu,))
            t.start()
            tlist.append(t)

        for t in tlist:
            t.join()

        end_time = time.time()

        for danmu in crack_list:
            output_result(danmu)

        print(f"所有UID反推成功,耗时{round(end_time - start_time, 2)}秒")
        gf.close()
        if input("回车继续检索,输入q退出...") == "q":
            break

        print_long_line()


if __name__ == '__main__':
    keyboard.add_hotkey('`', StopThread)
    print_long_line(2)
    print("GetDanmuSender 1.0b - By cwuom\nbilibili> https://space.bilibili.com/473400804")
    print_long_line(2)

    makedirs("DanmuJSON")
    makedirs("outputs")
    main()

 bili_pb2.py

# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: my.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x08my.proto\x12 bilibili.community.service.dm.v1\"X\n\x0e\x42uzzwordConfig\x12\x46\n\x08keywords\x18\x01 \x03(\x0b\x32\x34.bilibili.community.service.dm.v1.BuzzwordShowConfig\"x\n\x12\x42uzzwordShowConfig\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\x05\x12\n\n\x02id\x18\x04 \x01(\x03\x12\x13\n\x0b\x62uzzword_id\x18\x05 \x01(\x03\x12\x13\n\x0bschema_type\x18\x06 \x01(\x05\"\xa1\x01\n\tCommandDm\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0b\n\x03mid\x18\x03 \x01(\t\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x05 \x01(\t\x12\x10\n\x08progress\x18\x06 \x01(\x05\x12\r\n\x05\x63time\x18\x07 \x01(\t\x12\r\n\x05mtime\x18\x08 \x01(\t\x12\r\n\x05\x65xtra\x18\t \x01(\t\x12\r\n\x05idStr\x18\n \x01(\t\"P\n\rDanmakuAIFlag\x12?\n\x08\x64m_flags\x18\x01 \x03(\x0b\x32-.bilibili.community.service.dm.v1.DanmakuFlag\"\xd6\x01\n\x0b\x44\x61nmakuElem\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x10\n\x08progress\x18\x02 \x01(\x05\x12\x0c\n\x04mode\x18\x03 \x01(\x05\x12\x10\n\x08\x66ontsize\x18\x04 \x01(\x05\x12\r\n\x05\x63olor\x18\x05 \x01(\r\x12\x0f\n\x07midHash\x18\x06 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x07 \x01(\t\x12\r\n\x05\x63time\x18\x08 \x01(\x03\x12\x0e\n\x06weight\x18\t \x01(\x05\x12\x0e\n\x06\x61\x63tion\x18\n \x01(\t\x12\x0c\n\x04pool\x18\x0b \x01(\x05\x12\r\n\x05idStr\x18\x0c \x01(\t\x12\x0c\n\x04\x61ttr\x18\r \x01(\x05\")\n\x0b\x44\x61nmakuFlag\x12\x0c\n\x04\x64mid\x18\x01 \x01(\x03\x12\x0c\n\x04\x66lag\x18\x02 \x01(\r\"K\n\x11\x44\x61nmakuFlagConfig\x12\x10\n\x08rec_flag\x18\x01 \x01(\x05\x12\x10\n\x08rec_text\x18\x02 \x01(\t\x12\x12\n\nrec_switch\x18\x03 \x01(\x05\"\xcc\x04\n\x18\x44\x61nmuDefaultPlayerConfig\x12)\n!player_danmaku_use_default_config\x18\x01 \x01(\x08\x12,\n$player_danmaku_ai_recommended_switch\x18\x04 \x01(\x08\x12+\n#player_danmaku_ai_recommended_level\x18\x05 \x01(\x05\x12\x1f\n\x17player_danmaku_blocktop\x18\x06 \x01(\x08\x12\"\n\x1aplayer_danmaku_blockscroll\x18\x07 \x01(\x08\x12\"\n\x1aplayer_danmaku_blockbottom\x18\x08 \x01(\x08\x12$\n\x1cplayer_danmaku_blockcolorful\x18\t \x01(\x08\x12\"\n\x1aplayer_danmaku_blockrepeat\x18\n \x01(\x08\x12#\n\x1bplayer_danmaku_blockspecial\x18\x0b \x01(\x08\x12\x1e\n\x16player_danmaku_opacity\x18\x0c \x01(\x02\x12$\n\x1cplayer_danmaku_scalingfactor\x18\r \x01(\x02\x12\x1d\n\x15player_danmaku_domain\x18\x0e \x01(\x02\x12\x1c\n\x14player_danmaku_speed\x18\x0f \x01(\x05\x12$\n\x1cinline_player_danmaku_switch\x18\x10 \x01(\x08\x12)\n!player_danmaku_senior_mode_switch\x18\x11 \x01(\x05\"\xfe\x05\n\x11\x44\x61nmuPlayerConfig\x12\x1d\n\x15player_danmaku_switch\x18\x01 \x01(\x08\x12\"\n\x1aplayer_danmaku_switch_save\x18\x02 \x01(\x08\x12)\n!player_danmaku_use_default_config\x18\x03 \x01(\x08\x12,\n$player_danmaku_ai_recommended_switch\x18\x04 \x01(\x08\x12+\n#player_danmaku_ai_recommended_level\x18\x05 \x01(\x05\x12\x1f\n\x17player_danmaku_blocktop\x18\x06 \x01(\x08\x12\"\n\x1aplayer_danmaku_blockscroll\x18\x07 \x01(\x08\x12\"\n\x1aplayer_danmaku_blockbottom\x18\x08 \x01(\x08\x12$\n\x1cplayer_danmaku_blockcolorful\x18\t \x01(\x08\x12\"\n\x1aplayer_danmaku_blockrepeat\x18\n \x01(\x08\x12#\n\x1bplayer_danmaku_blockspecial\x18\x0b \x01(\x08\x12\x1e\n\x16player_danmaku_opacity\x18\x0c \x01(\x02\x12$\n\x1cplayer_danmaku_scalingfactor\x18\r \x01(\x02\x12\x1d\n\x15player_danmaku_domain\x18\x0e \x01(\x02\x12\x1c\n\x14player_danmaku_speed\x18\x0f \x01(\x05\x12&\n\x1eplayer_danmaku_enableblocklist\x18\x10 \x01(\x08\x12$\n\x1cinline_player_danmaku_switch\x18\x11 \x01(\x08\x12$\n\x1cinline_player_danmaku_config\x18\x12 \x01(\x05\x12&\n\x1eplayer_danmaku_ios_switch_save\x18\x13 \x01(\x05\x12)\n!player_danmaku_senior_mode_switch\x18\x14 \x01(\x05\"K\n\x18\x44\x61nmuPlayerDynamicConfig\x12\x10\n\x08progress\x18\x01 \x01(\x05\x12\x1d\n\x15player_danmaku_domain\x18\x0e \x01(\x02\"\xb1\x02\n\x15\x44\x61nmuPlayerViewConfig\x12\x61\n\x1d\x64\x61nmuku_default_player_config\x18\x01 \x01(\x0b\x32:.bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig\x12R\n\x15\x64\x61nmuku_player_config\x18\x02 \x01(\x0b\x32\x33.bilibili.community.service.dm.v1.DanmuPlayerConfig\x12\x61\n\x1d\x64\x61nmuku_player_dynamic_config\x18\x03 \x03(\x0b\x32:.bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig\"\xab\x03\n\x14\x44\x61nmuWebPlayerConfig\x12\x11\n\tdm_switch\x18\x01 \x01(\x08\x12\x11\n\tai_switch\x18\x02 \x01(\x08\x12\x10\n\x08\x61i_level\x18\x03 \x01(\x05\x12\x10\n\x08\x62locktop\x18\x04 \x01(\x08\x12\x13\n\x0b\x62lockscroll\x18\x05 \x01(\x08\x12\x13\n\x0b\x62lockbottom\x18\x06 \x01(\x08\x12\x12\n\nblockcolor\x18\x07 \x01(\x08\x12\x14\n\x0c\x62lockspecial\x18\x08 \x01(\x08\x12\x14\n\x0cpreventshade\x18\t \x01(\x08\x12\r\n\x05\x64mask\x18\n \x01(\x08\x12\x0f\n\x07opacity\x18\x0b \x01(\x02\x12\x0e\n\x06\x64marea\x18\x0c \x01(\x05\x12\x11\n\tspeedplus\x18\r \x01(\x02\x12\x10\n\x08\x66ontsize\x18\x0e \x01(\x02\x12\x12\n\nscreensync\x18\x0f \x01(\x08\x12\x11\n\tspeedsync\x18\x10 \x01(\x08\x12\x12\n\nfontfamily\x18\x11 \x01(\t\x12\x0c\n\x04\x62old\x18\x12 \x01(\x08\x12\x12\n\nfontborder\x18\x13 \x01(\x05\x12\x11\n\tdraw_type\x18\x14 \x01(\t\x12\x1a\n\x12senior_mode_switch\x18\x15 \x01(\x05\"A\n\x0f\x44mExpoReportReq\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\r\n\x05spmid\x18\x04 \x01(\t\"\x11\n\x0f\x44mExpoReportRes\"\xfd\x0b\n\x11\x44mPlayerConfigReq\x12\n\n\x02ts\x18\x01 \x01(\x03\x12\x45\n\x06switch\x18\x02 \x01(\x0b\x32\x35.bilibili.community.service.dm.v1.PlayerDanmakuSwitch\x12N\n\x0bswitch_save\x18\x03 \x01(\x0b\x32\x39.bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave\x12[\n\x12use_default_config\x18\x04 \x01(\x0b\x32?.bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig\x12\x61\n\x15\x61i_recommended_switch\x18\x05 \x01(\x0b\x32\x42.bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch\x12_\n\x14\x61i_recommended_level\x18\x06 \x01(\x0b\x32\x41.bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel\x12I\n\x08\x62locktop\x18\x07 \x01(\x0b\x32\x37.bilibili.community.service.dm.v1.PlayerDanmakuBlocktop\x12O\n\x0b\x62lockscroll\x18\x08 \x01(\x0b\x32:.bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll\x12O\n\x0b\x62lockbottom\x18\t \x01(\x0b\x32:.bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom\x12S\n\rblockcolorful\x18\n \x01(\x0b\x32<.bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful\x12O\n\x0b\x62lockrepeat\x18\x0b \x01(\x0b\x32:.bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat\x12Q\n\x0c\x62lockspecial\x18\x0c \x01(\x0b\x32;.bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial\x12G\n\x07opacity\x18\r \x01(\x0b\x32\x36.bilibili.community.service.dm.v1.PlayerDanmakuOpacity\x12S\n\rscalingfactor\x18\x0e \x01(\x0b\x32<.bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor\x12\x45\n\x06\x64omain\x18\x0f \x01(\x0b\x32\x35.bilibili.community.service.dm.v1.PlayerDanmakuDomain\x12\x43\n\x05speed\x18\x10 \x01(\x0b\x32\x34.bilibili.community.service.dm.v1.PlayerDanmakuSpeed\x12W\n\x0f\x65nableblocklist\x18\x11 \x01(\x0b\x32>.bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist\x12^\n\x19inlinePlayerDanmakuSwitch\x18\x12 \x01(\x0b\x32;.bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch\x12[\n\x12senior_mode_switch\x18\x13 \x01(\x0b\x32?.bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch\"/\n\x0b\x44mSegConfig\x12\x11\n\tpage_size\x18\x01 \x01(\x03\x12\r\n\x05total\x18\x02 \x01(\x03\"\xa1\x01\n\x10\x44mSegMobileReply\x12<\n\x05\x65lems\x18\x01 \x03(\x0b\x32-.bilibili.community.service.dm.v1.DanmakuElem\x12\r\n\x05state\x18\x02 \x01(\x05\x12@\n\x07\x61i_flag\x18\x03 \x01(\x0b\x32/.bilibili.community.service.dm.v1.DanmakuAIFlag\"g\n\x0e\x44mSegMobileReq\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x15\n\rsegment_index\x18\x04 \x01(\x03\x12\x16\n\x0eteenagers_mode\x18\x05 \x01(\x05\"]\n\rDmSegOttReply\x12\x0e\n\x06\x63losed\x18\x01 \x01(\x08\x12<\n\x05\x65lems\x18\x02 \x03(\x0b\x32-.bilibili.community.service.dm.v1.DanmakuElem\"L\n\x0b\x44mSegOttReq\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x15\n\rsegment_index\x18\x04 \x01(\x03\"]\n\rDmSegSDKReply\x12\x0e\n\x06\x63losed\x18\x01 \x01(\x08\x12<\n\x05\x65lems\x18\x02 \x03(\x0b\x32-.bilibili.community.service.dm.v1.DanmakuElem\"L\n\x0b\x44mSegSDKReq\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x15\n\rsegment_index\x18\x04 \x01(\x03\"\xc2\x05\n\x0b\x44mViewReply\x12\x0e\n\x06\x63losed\x18\x01 \x01(\x08\x12\x39\n\x04mask\x18\x02 \x01(\x0b\x32+.bilibili.community.service.dm.v1.VideoMask\x12\x41\n\x08subtitle\x18\x03 \x01(\x0b\x32/.bilibili.community.service.dm.v1.VideoSubtitle\x12\x13\n\x0bspecial_dms\x18\x04 \x03(\t\x12\x44\n\x07\x61i_flag\x18\x05 \x01(\x0b\x32\x33.bilibili.community.service.dm.v1.DanmakuFlagConfig\x12N\n\rplayer_config\x18\x06 \x01(\x0b\x32\x37.bilibili.community.service.dm.v1.DanmuPlayerViewConfig\x12\x16\n\x0esend_box_style\x18\x07 \x01(\x05\x12\r\n\x05\x61llow\x18\x08 \x01(\x08\x12\x11\n\tcheck_box\x18\t \x01(\t\x12\x1a\n\x12\x63heck_box_show_msg\x18\n \x01(\t\x12\x18\n\x10text_placeholder\x18\x0b \x01(\t\x12\x19\n\x11input_placeholder\x18\x0c \x01(\t\x12\x1d\n\x15report_filter_content\x18\r \x03(\t\x12\x41\n\x0b\x65xpo_report\x18\x0e \x01(\x0b\x32,.bilibili.community.service.dm.v1.ExpoReport\x12I\n\x0f\x62uzzword_config\x18\x0f \x01(\x0b\x32\x30.bilibili.community.service.dm.v1.BuzzwordConfig\x12\x42\n\x0b\x65xpressions\x18\x10 \x03(\x0b\x32-.bilibili.community.service.dm.v1.Expressions\"X\n\tDmViewReq\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\r\n\x05spmid\x18\x04 \x01(\t\x12\x14\n\x0cis_hard_boot\x18\x05 \x01(\x05\"\xec\x03\n\x0e\x44mWebViewReply\x12\r\n\x05state\x18\x01 \x01(\x05\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x11\n\ttext_side\x18\x03 \x01(\t\x12=\n\x06\x64m_sge\x18\x04 \x01(\x0b\x32-.bilibili.community.service.dm.v1.DmSegConfig\x12\x41\n\x04\x66lag\x18\x05 \x01(\x0b\x32\x33.bilibili.community.service.dm.v1.DanmakuFlagConfig\x12\x13\n\x0bspecial_dms\x18\x06 \x03(\t\x12\x11\n\tcheck_box\x18\x07 \x01(\x08\x12\r\n\x05\x63ount\x18\x08 \x01(\x03\x12?\n\ncommandDms\x18\t \x03(\x0b\x32+.bilibili.community.service.dm.v1.CommandDm\x12M\n\rplayer_config\x18\n \x01(\x0b\x32\x36.bilibili.community.service.dm.v1.DanmuWebPlayerConfig\x12\x1d\n\x15report_filter_content\x18\x0b \x03(\t\x12\x42\n\x0b\x65xpressions\x18\x0c \x03(\x0b\x32-.bilibili.community.service.dm.v1.Expressions\"*\n\nExpoReport\x12\x1c\n\x14should_report_at_end\x18\x01 \x01(\x08\"d\n\nExpression\x12\x0f\n\x07keyword\x18\x01 \x03(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x38\n\x06period\x18\x03 \x03(\x0b\x32(.bilibili.community.service.dm.v1.Period\"I\n\x0b\x45xpressions\x12:\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32,.bilibili.community.service.dm.v1.Expression\"$\n\x06Period\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\"*\n\x19InlinePlayerDanmakuSwitch\x12\r\n\x05value\x18\x01 \x01(\x08\"0\n\x1fPlayerDanmakuAiRecommendedLevel\x12\r\n\x05value\x18\x01 \x01(\x08\"1\n PlayerDanmakuAiRecommendedSwitch\x12\r\n\x05value\x18\x01 \x01(\x08\")\n\x18PlayerDanmakuBlockbottom\x12\r\n\x05value\x18\x01 \x01(\x08\"+\n\x1aPlayerDanmakuBlockcolorful\x12\r\n\x05value\x18\x01 \x01(\x08\")\n\x18PlayerDanmakuBlockrepeat\x12\r\n\x05value\x18\x01 \x01(\x08\")\n\x18PlayerDanmakuBlockscroll\x12\r\n\x05value\x18\x01 \x01(\x08\"*\n\x19PlayerDanmakuBlockspecial\x12\r\n\x05value\x18\x01 \x01(\x08\"&\n\x15PlayerDanmakuBlocktop\x12\r\n\x05value\x18\x01 \x01(\x08\"$\n\x13PlayerDanmakuDomain\x12\r\n\x05value\x18\x01 \x01(\x02\"-\n\x1cPlayerDanmakuEnableblocklist\x12\r\n\x05value\x18\x01 \x01(\x08\"%\n\x14PlayerDanmakuOpacity\x12\r\n\x05value\x18\x01 \x01(\x02\"+\n\x1aPlayerDanmakuScalingfactor\x12\r\n\x05value\x18\x01 \x01(\x02\".\n\x1dPlayerDanmakuSeniorModeSwitch\x12\r\n\x05value\x18\x01 \x01(\x05\"#\n\x12PlayerDanmakuSpeed\x12\r\n\x05value\x18\x01 \x01(\x05\"7\n\x13PlayerDanmakuSwitch\x12\r\n\x05value\x18\x01 \x01(\x08\x12\x11\n\tcanIgnore\x18\x02 \x01(\x08\"(\n\x17PlayerDanmakuSwitchSave\x12\r\n\x05value\x18\x01 \x01(\x08\".\n\x1dPlayerDanmakuUseDefaultConfig\x12\r\n\x05value\x18\x01 \x01(\x08\")\n\x08Response\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xd8\x01\n\x0cSubtitleItem\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0e\n\x06id_str\x18\x02 \x01(\t\x12\x0b\n\x03lan\x18\x03 \x01(\t\x12\x0f\n\x07lan_doc\x18\x04 \x01(\t\x12\x14\n\x0csubtitle_url\x18\x05 \x01(\t\x12:\n\x06\x61uthor\x18\x06 \x01(\x0b\x32*.bilibili.community.service.dm.v1.UserInfo\x12<\n\x04type\x18\x07 \x01(\x0e\x32..bilibili.community.service.dm.v1.SubtitleType\"\\\n\x08UserInfo\x12\x0b\n\x03mid\x18\x01 \x01(\x03\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0b\n\x03sex\x18\x03 \x01(\t\x12\x0c\n\x04\x66\x61\x63\x65\x18\x04 \x01(\t\x12\x0c\n\x04sign\x18\x05 \x01(\t\x12\x0c\n\x04rank\x18\x06 \x01(\x05\"S\n\tVideoMask\x12\x0b\n\x03\x63id\x18\x01 \x01(\x03\x12\x0c\n\x04plat\x18\x02 \x01(\x05\x12\x0b\n\x03\x66ps\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x03\x12\x10\n\x08mask_url\x18\x05 \x01(\t\"o\n\rVideoSubtitle\x12\x0b\n\x03lan\x18\x01 \x01(\t\x12\x0e\n\x06lanDoc\x18\x02 \x01(\t\x12\x41\n\tsubtitles\x18\x03 \x03(\x0b\x32..bilibili.community.service.dm.v1.SubtitleItem*L\n\tDMAttrBit\x12\x14\n\x10\x44MAttrBitProtect\x10\x00\x12\x15\n\x11\x44MAttrBitFromLive\x10\x01\x12\x12\n\x0e\x44MAttrHighLike\x10\x02*\x1e\n\x0cSubtitleType\x12\x06\n\x02\x43\x43\x10\x00\x12\x06\n\x02\x41I\x10\x01\x32\xa0\x05\n\x02\x44M\x12s\n\x0b\x44mSegMobile\x12\x30.bilibili.community.service.dm.v1.DmSegMobileReq\x1a\x32.bilibili.community.service.dm.v1.DmSegMobileReply\x12\x64\n\x06\x44mView\x12+.bilibili.community.service.dm.v1.DmViewReq\x1a-.bilibili.community.service.dm.v1.DmViewReply\x12q\n\x0e\x44mPlayerConfig\x12\x33.bilibili.community.service.dm.v1.DmPlayerConfigReq\x1a*.bilibili.community.service.dm.v1.Response\x12j\n\x08\x44mSegOtt\x12-.bilibili.community.service.dm.v1.DmSegOttReq\x1a/.bilibili.community.service.dm.v1.DmSegOttReply\x12j\n\x08\x44mSegSDK\x12-.bilibili.community.service.dm.v1.DmSegSDKReq\x1a/.bilibili.community.service.dm.v1.DmSegSDKReply\x12t\n\x0c\x44mExpoReport\x12\x31.bilibili.community.service.dm.v1.DmExpoReportReq\x1a\x31.bilibili.community.service.dm.v1.DmExpoReportResb\x06proto3')

_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'my_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:

  DESCRIPTOR._options = None
  _DMATTRBIT._serialized_start=8213
  _DMATTRBIT._serialized_end=8289
  _SUBTITLETYPE._serialized_start=8291
  _SUBTITLETYPE._serialized_end=8321
  _BUZZWORDCONFIG._serialized_start=46
  _BUZZWORDCONFIG._serialized_end=134
  _BUZZWORDSHOWCONFIG._serialized_start=136
  _BUZZWORDSHOWCONFIG._serialized_end=256
  _COMMANDDM._serialized_start=259
  _COMMANDDM._serialized_end=420
  _DANMAKUAIFLAG._serialized_start=422
  _DANMAKUAIFLAG._serialized_end=502
  _DANMAKUELEM._serialized_start=505
  _DANMAKUELEM._serialized_end=719
  _DANMAKUFLAG._serialized_start=721
  _DANMAKUFLAG._serialized_end=762
  _DANMAKUFLAGCONFIG._serialized_start=764
  _DANMAKUFLAGCONFIG._serialized_end=839
  _DANMUDEFAULTPLAYERCONFIG._serialized_start=842
  _DANMUDEFAULTPLAYERCONFIG._serialized_end=1430
  _DANMUPLAYERCONFIG._serialized_start=1433
  _DANMUPLAYERCONFIG._serialized_end=2199
  _DANMUPLAYERDYNAMICCONFIG._serialized_start=2201
  _DANMUPLAYERDYNAMICCONFIG._serialized_end=2276
  _DANMUPLAYERVIEWCONFIG._serialized_start=2279
  _DANMUPLAYERVIEWCONFIG._serialized_end=2584
  _DANMUWEBPLAYERCONFIG._serialized_start=2587
  _DANMUWEBPLAYERCONFIG._serialized_end=3014
  _DMEXPOREPORTREQ._serialized_start=3016
  _DMEXPOREPORTREQ._serialized_end=3081
  _DMEXPOREPORTRES._serialized_start=3083
  _DMEXPOREPORTRES._serialized_end=3100
  _DMPLAYERCONFIGREQ._serialized_start=3103
  _DMPLAYERCONFIGREQ._serialized_end=4636
  _DMSEGCONFIG._serialized_start=4638
  _DMSEGCONFIG._serialized_end=4685
  _DMSEGMOBILEREPLY._serialized_start=4688
  _DMSEGMOBILEREPLY._serialized_end=4849
  _DMSEGMOBILEREQ._serialized_start=4851
  _DMSEGMOBILEREQ._serialized_end=4954
  _DMSEGOTTREPLY._serialized_start=4956
  _DMSEGOTTREPLY._serialized_end=5049
  _DMSEGOTTREQ._serialized_start=5051
  _DMSEGOTTREQ._serialized_end=5127
  _DMSEGSDKREPLY._serialized_start=5129
  _DMSEGSDKREPLY._serialized_end=5222
  _DMSEGSDKREQ._serialized_start=5224
  _DMSEGSDKREQ._serialized_end=5300
  _DMVIEWREPLY._serialized_start=5303
  _DMVIEWREPLY._serialized_end=6009
  _DMVIEWREQ._serialized_start=6011
  _DMVIEWREQ._serialized_end=6099
  _DMWEBVIEWREPLY._serialized_start=6102
  _DMWEBVIEWREPLY._serialized_end=6594
  _EXPOREPORT._serialized_start=6596
  _EXPOREPORT._serialized_end=6638
  _EXPRESSION._serialized_start=6640
  _EXPRESSION._serialized_end=6740
  _EXPRESSIONS._serialized_start=6742
  _EXPRESSIONS._serialized_end=6815
  _PERIOD._serialized_start=6817
  _PERIOD._serialized_end=6853
  _INLINEPLAYERDANMAKUSWITCH._serialized_start=6855
  _INLINEPLAYERDANMAKUSWITCH._serialized_end=6897
  _PLAYERDANMAKUAIRECOMMENDEDLEVEL._serialized_start=6899
  _PLAYERDANMAKUAIRECOMMENDEDLEVEL._serialized_end=6947
  _PLAYERDANMAKUAIRECOMMENDEDSWITCH._serialized_start=6949
  _PLAYERDANMAKUAIRECOMMENDEDSWITCH._serialized_end=6998
  _PLAYERDANMAKUBLOCKBOTTOM._serialized_start=7000
  _PLAYERDANMAKUBLOCKBOTTOM._serialized_end=7041
  _PLAYERDANMAKUBLOCKCOLORFUL._serialized_start=7043
  _PLAYERDANMAKUBLOCKCOLORFUL._serialized_end=7086
  _PLAYERDANMAKUBLOCKREPEAT._serialized_start=7088
  _PLAYERDANMAKUBLOCKREPEAT._serialized_end=7129
  _PLAYERDANMAKUBLOCKSCROLL._serialized_start=7131
  _PLAYERDANMAKUBLOCKSCROLL._serialized_end=7172
  _PLAYERDANMAKUBLOCKSPECIAL._serialized_start=7174
  _PLAYERDANMAKUBLOCKSPECIAL._serialized_end=7216
  _PLAYERDANMAKUBLOCKTOP._serialized_start=7218
  _PLAYERDANMAKUBLOCKTOP._serialized_end=7256
  _PLAYERDANMAKUDOMAIN._serialized_start=7258
  _PLAYERDANMAKUDOMAIN._serialized_end=7294
  _PLAYERDANMAKUENABLEBLOCKLIST._serialized_start=7296
  _PLAYERDANMAKUENABLEBLOCKLIST._serialized_end=7341
  _PLAYERDANMAKUOPACITY._serialized_start=7343
  _PLAYERDANMAKUOPACITY._serialized_end=7380
  _PLAYERDANMAKUSCALINGFACTOR._serialized_start=7382
  _PLAYERDANMAKUSCALINGFACTOR._serialized_end=7425
  _PLAYERDANMAKUSENIORMODESWITCH._serialized_start=7427
  _PLAYERDANMAKUSENIORMODESWITCH._serialized_end=7473
  _PLAYERDANMAKUSPEED._serialized_start=7475
  _PLAYERDANMAKUSPEED._serialized_end=7510
  _PLAYERDANMAKUSWITCH._serialized_start=7512
  _PLAYERDANMAKUSWITCH._serialized_end=7567
  _PLAYERDANMAKUSWITCHSAVE._serialized_start=7569
  _PLAYERDANMAKUSWITCHSAVE._serialized_end=7609
  _PLAYERDANMAKUUSEDEFAULTCONFIG._serialized_start=7611
  _PLAYERDANMAKUUSEDEFAULTCONFIG._serialized_end=7657
  _RESPONSE._serialized_start=7659
  _RESPONSE._serialized_end=7700
  _SUBTITLEITEM._serialized_start=7703
  _SUBTITLEITEM._serialized_end=7919
  _USERINFO._serialized_start=7921
  _USERINFO._serialized_end=8013
  _VIDEOMASK._serialized_start=8015
  _VIDEOMASK._serialized_end=8098
  _VIDEOSUBTITLE._serialized_start=8100
  _VIDEOSUBTITLE._serialized_end=8211
  _DM._serialized_start=8324
  _DM._serialized_end=8996
# @@protoc_insertion_point(module_scope)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值