吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4019|回复: 25
收起左侧

[Python 原创] B 站弹幕 protobuf 协议

  [复制链接]
天空宫阙 发表于 2022-7-27 22:06
本帖最后由 天空宫阙 于 2022-7-27 22:06 编辑

B 站弹幕 protobuf 协议还原分析

根据链接 https://mp.weixin.qq.com/s/OzcjH8UXZl62p8TUgZQadg 修改

https://developers.google.com/protocol-buffers/docs/pythontutorial

Protobuf介绍

Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构。所以很适合做数据存储和为不同语言,不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为proto文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过Protobuf序列化的数据。目前官方提供c++,java,go,python等语言支持。
压缩程度高,相同量数据传输速度更快。

欲要逆向必先正向

先跟着 https://developers.google.com/protocol-buffers/docs/pythontutorial 了解一下正向开发

protobuf协议还原

方法一

使用官方方法编译序列化和反序列话的py文件

  • 安装编译器 Protocol Compiler Installation
    https://github.com/protocolbuffers/protobuf/releases

  • 安装python模块

pip install protobuf

反序列化

response = requests.get('https://api.bilibili.com/x/v2/dm/web/seg.so', params=params, cookies=cookies,
                            headers=headers)
info = Feed()
info.ParseFromString(response.content)
_data = MessageToDict(info, preserving_proto_field_name=True)
messages = _data.get("message") or []

方法二

使用blackboxprotobuf库

pip install blackboxprotobuf
response = requests.get('https://api.bilibili.com/x/v2/dm/web/seg.so', params=params, cookies=cookies,headers=headers)
message,typedef = blackboxprotobuf.protobuf_to_json(response.content)
print(message)

注意方法一和方法二都依赖protobuf,且blackboxprotobuf依赖较低版本的protobuf;使用方法一时Protocol Compiler和protobuf版本需要一致

代码

import json
import requests
from feed_pb2 import Feed
from google.protobuf.json_format import MessageToDict
# import blackboxprotobuf

def start_requests():
    cookies = {
        'rpdid': '|(J~RkYYY|k|0J\'uYulYRlJl)',
        'buvid3': '794669E2-CEBC-4737-AB8F-73CB9D9C0088184988infoc',
        'buvid4': '046D34538-767A-526A-8625-7D1F04E0183673538-022021413-+yHNrXw7i70NUnsrLeJd2Q%3D%3D',
        'DedeUserID': '481849275',
        'DedeUserID__ckMd5': '04771b27fae39420',
        'sid': 'ij1go1j8',
        'i-wanna-go-back': '-1',
        'b_ut': '5',
        'CURRENT_BLACKGAP': '0',
        'buvid_fp_plain': 'undefined',
        'blackside_state': '0',
        'nostalgia_conf': '-1',
        'PVID': '2',
        'b_lsid': '55BA153F_18190A78A34',
        'bsource': 'search_baidu',
        'innersign': '1',
        'CURRENT_FNVAL': '4048',
        'b_timer': '%7B%22ffp%22%3A%7B%22333.1007.fp.risk_794669E2%22%3A%2218190A78B5F%22%2C%22333.788.fp.risk_794669E2%22%3A%2218190A797FF%22%2C%22333.42.fp.risk_794669E2%22%3A%2218190A7A6C5%22%7D%7D',
    }

    headers = {
        'authority': 'api.bilibili.com',
        'accept': '*/*',
        'accept-language': 'zh-CN,zh;q=0.9',
        'cache-control': 'no-cache',
        'origin': 'https://www.bilibili.com',
        'pragma': 'no-cache',
        'referer': 'https://www.bilibili.com',
        'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-site',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
    }

    # params = {
    #     'type': '1',
    #     'oid': '729126061',
    #     'pid': '896926231',
    #     'segment_index': '1',
    # }
    params = {
        'type': '1',
        'oid': '783082950',
        'pid': '686364718',
        'segment_index': '1',
    }
    response = requests.get('https://api.bilibili.com/x/v2/dm/web/seg.so', params=params, cookies=cookies,
                            headers=headers)
    # 1. 调用proto文件编译的py文件进行反序列话
    info = Feed()
    info.ParseFromString(response.content)
    _data = MessageToDict(info, preserving_proto_field_name=True)
    messages = _data.get("message") or []
    for message in messages:
        print(message)

    # 2. 调用blackboxprotobuf库
    # message,typedef = blackboxprotobuf.protobuf_to_json(response.content)
    # message_json = json.loads(message)
    # for each in message_json['1']:
    #     print(each['8'],each["7"])
    # print(message_json['1'])
    # print(typedef)

if __name__ == '__main__':
    start_requests()

成功留念

image-20220727215355050.png

image-20220727215409537.png

github地址

https://github.com/skygongque/Spider/tree/master/11-B%E7%AB%99%E5%BC%B9%E5%B9%95%EF%BC%88protobuf%EF%BC%89

免费评分

参与人数 7威望 +1 吾爱币 +28 热心值 +5 收起 理由
我是不会改名的 + 4 + 1 用心讨论,共获提升!
Mr-chen + 1 + 1 nice
苏紫方璇 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
allspark + 1 用心讨论,共获提升!
西瓜小刚 + 1 谢谢@Thanks!
pkhtml + 1 用心讨论,共获提升!
yonghuang + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

三滑稽甲苯 发表于 2022-7-28 07:37
以前我也分析过,确实是通过protobuf的,这里提供一下proto源代码
[JavaScript] 纯文本查看 复制代码
syntax = "proto3";

package bilibili.community.service.dm.v1;

//弹幕
service DM {
    // 获取分段弹幕
    rpc DmSegMobile (DmSegMobileReq) returns (DmSegMobileReply);
    // 客户端弹幕元数据 字幕、分段、防挡蒙版等
    rpc DmView (DmViewReq) returns (DmViewReply);
    // 修改弹幕配置
    rpc DmPlayerConfig (DmPlayerConfigReq) returns (Response);
    // ott弹幕列表
    rpc DmSegOtt(DmSegOttReq) returns(DmSegOttReply);
    // SDK弹幕列表
    rpc DmSegSDK(DmSegSDKReq) returns(DmSegSDKReply);
    //
    rpc DmExpoReport (DmExpoReportReq) returns (DmExpoReportRes);
}

//
message BuzzwordConfig {
    //
    repeated BuzzwordShowConfig keywords = 1;
}

//
message BuzzwordShowConfig {
    //
    string name = 1;
    //
    string schema = 2;
    //
    int32 source = 3;
    //
    int64 id = 4;
    //
    int64 buzzword_id = 5;
    //
    int32 schema_type = 6;
}

// 互动弹幕条目信息
message CommandDm {
    // 弹幕id
    int64 id = 1;
    // 对象视频cid
    int64 oid = 2;
    // 发送者mid
    string mid = 3;
    // 互动弹幕指令
    string command = 4;
    // 互动弹幕正文
    string content = 5;
    // 出现时间
    int32 progress = 6;
    // 创建时间
    string ctime = 7;
    // 发布时间
    string mtime = 8;
    // 扩展json数据
    string extra = 9;
    // 弹幕id str类型
    string idStr = 10;
}

// 弹幕属性位值
enum DMAttrBit {
    DMAttrBitProtect = 0;  // 保护弹幕
    DMAttrBitFromLive = 1; // 直播弹幕
    DMAttrHighLike = 2;    // 高赞弹幕
}

// 弹幕ai云屏蔽列表
message DanmakuAIFlag {
    // 弹幕ai云屏蔽条目
    repeated DanmakuFlag dm_flags = 1;
}

// 弹幕条目
message DanmakuElem {
    // 弹幕dmid
    int64 id = 1;
    // 弹幕出现位置(单位ms)
    int32 progress = 2;
    // 弹幕类型
    int32 mode = 3;
    // 弹幕字号
    int32 fontsize = 4;
    // 弹幕颜色
    uint32 color = 5;
    // 发送着mid hash
    string midHash = 6;
    // 弹幕正文
    string content = 7;
    // 发送时间
    int64 ctime = 8;
    // 权重 区间:[1,10]
    int32 weight = 9;
    // 动作
    string action = 10;
    // 弹幕池
    int32 pool = 11;
    // 弹幕dmid str
    string idStr = 12;
    // 弹幕属性位(bin求AND)
    // bit0:保护 bit1:直播 bit2:高赞
    int32 attr = 13;
}

// 弹幕ai云屏蔽条目
message DanmakuFlag {
    int64 dmid = 1;  // 弹幕dmid
    uint32 flag = 2; // 评分
}

// 云屏蔽配置信息
message DanmakuFlagConfig {
    // 云屏蔽等级
    int32 rec_flag = 1;
    // 云屏蔽文案
    string rec_text = 2;
    // 云屏蔽开关
    int32 rec_switch = 3;
}

// 弹幕默认配置
message DanmuDefaultPlayerConfig {
    bool player_danmaku_use_default_config = 1;    // 是否使用推荐弹幕设置
    bool player_danmaku_ai_recommended_switch = 4; // 是否开启智能云屏蔽
    int32 player_danmaku_ai_recommended_level = 5; // 智能云屏蔽等级
    bool player_danmaku_blocktop = 6;              // 是否屏蔽顶端弹幕
    bool player_danmaku_blockscroll = 7;           // 是否屏蔽滚动弹幕
    bool player_danmaku_blockbottom = 8;           // 是否屏蔽底端弹幕
    bool player_danmaku_blockcolorful = 9;         // 是否屏蔽彩色弹幕
    bool player_danmaku_blockrepeat = 10;          // 是否屏蔽重复弹幕
    bool player_danmaku_blockspecial = 11;         // 是否屏蔽高级弹幕
    float player_danmaku_opacity = 12;             // 弹幕不透明度
    float player_danmaku_scalingfactor = 13;       // 弹幕缩放比例
    float player_danmaku_domain = 14;              // 弹幕显示区域
    int32 player_danmaku_speed = 15;               // 弹幕速度
    bool inline_player_danmaku_switch = 16;        // 是否开启弹幕
    int32 player_danmaku_senior_mode_switch = 17;  //
}

// 弹幕配置
message DanmuPlayerConfig {
    bool player_danmaku_switch = 1;                // 是否开启弹幕
    bool player_danmaku_switch_save = 2;           // 是否记录弹幕开关设置
    bool player_danmaku_use_default_config = 3;    // 是否使用推荐弹幕设置
    bool player_danmaku_ai_recommended_switch = 4; // 是否开启智能云屏蔽
    int32 player_danmaku_ai_recommended_level = 5; // 智能云屏蔽等级
    bool player_danmaku_blocktop = 6;              // 是否屏蔽顶端弹幕
    bool player_danmaku_blockscroll = 7;           // 是否屏蔽滚动弹幕
    bool player_danmaku_blockbottom = 8;           // 是否屏蔽底端弹幕
    bool player_danmaku_blockcolorful = 9;         // 是否屏蔽彩色弹幕
    bool player_danmaku_blockrepeat = 10;          // 是否屏蔽重复弹幕
    bool player_danmaku_blockspecial = 11;         // 是否屏蔽高级弹幕
    float player_danmaku_opacity = 12;             // 弹幕不透明度
    float player_danmaku_scalingfactor = 13;       // 弹幕缩放比例
    float player_danmaku_domain = 14;              // 弹幕显示区域
    int32 player_danmaku_speed = 15;               // 弹幕速度
    bool player_danmaku_enableblocklist = 16;      // 是否开启屏蔽列表
    bool inline_player_danmaku_switch = 17;        // 是否开启弹幕
    int32 inline_player_danmaku_config = 18;       //
    int32 player_danmaku_ios_switch_save = 19;     //
    int32 player_danmaku_senior_mode_switch = 20;  //
}

// 弹幕显示区域自动配置
message DanmuPlayerDynamicConfig {
    // 时间
    int32 progress = 1;
    // 弹幕显示区域
    float player_danmaku_domain = 14;
}

// 弹幕配置信息
message DanmuPlayerViewConfig {
    // 弹幕默认配置
    DanmuDefaultPlayerConfig danmuku_default_player_config = 1;
    // 弹幕用户配置
    DanmuPlayerConfig danmuku_player_config = 2;
    // 弹幕显示区域自动配置列表
    repeated DanmuPlayerDynamicConfig danmuku_player_dynamic_config = 3;
}

// web端用户弹幕配置
message DanmuWebPlayerConfig {
    bool dm_switch = 1;            // 是否开启弹幕
    bool ai_switch = 2;            // 是否开启智能云屏蔽
    int32 ai_level = 3;            // 智能云屏蔽等级
    bool blocktop = 4;             // 是否屏蔽顶端弹幕
    bool blockscroll = 5;          // 是否屏蔽滚动弹幕
    bool blockbottom = 6;          // 是否屏蔽底端弹幕
    bool blockcolor = 7;           // 是否屏蔽彩色弹幕
    bool blockspecial = 8;         // 是否屏蔽重复弹幕
    bool preventshade = 9;         // 
    bool dmask = 10;               // 
    float opacity = 11;            // 
    int32 dmarea = 12;             // 
    float speedplus = 13;          // 
    float fontsize = 14;           // 弹幕字号
    bool screensync = 15;          // 
    bool speedsync = 16;           // 
    string fontfamily = 17;        // 
    bool bold = 18;                // 是否使用加粗
    int32 fontborder = 19;         // 
    string draw_type = 20;         // 弹幕渲染类型
    int32 senior_mode_switch = 21; //
}

//
message DmExpoReportReq {
    //
    string session_id = 1;
    //
    int64 oid = 2;
    //
    string spmid = 4;
}

//
message DmExpoReportRes {

}

// 修改弹幕配置-请求
message DmPlayerConfigReq {
    int64 ts = 1;                                               //
    PlayerDanmakuSwitch switch = 2;                             // 是否开启弹幕
    PlayerDanmakuSwitchSave switch_save = 3;                    // 是否记录弹幕开关设置
    PlayerDanmakuUseDefaultConfig use_default_config = 4;       // 是否使用推荐弹幕设置
    PlayerDanmakuAiRecommendedSwitch ai_recommended_switch = 5; // 是否开启智能云屏蔽
    PlayerDanmakuAiRecommendedLevel ai_recommended_level = 6;   // 智能云屏蔽等级
    PlayerDanmakuBlocktop blocktop = 7;                         // 是否屏蔽顶端弹幕
    PlayerDanmakuBlockscroll blockscroll = 8;                   // 是否屏蔽滚动弹幕
    PlayerDanmakuBlockbottom blockbottom = 9;                   // 是否屏蔽底端弹幕
    PlayerDanmakuBlockcolorful blockcolorful = 10;              // 是否屏蔽彩色弹幕
    PlayerDanmakuBlockrepeat blockrepeat = 11;                  // 是否屏蔽重复弹幕
    PlayerDanmakuBlockspecial blockspecial = 12;                // 是否屏蔽高级弹幕
    PlayerDanmakuOpacity opacity = 13;                          // 弹幕不透明度
    PlayerDanmakuScalingfactor scalingfactor = 14;              // 弹幕缩放比例
    PlayerDanmakuDomain domain = 15;                            // 弹幕显示区域
    PlayerDanmakuSpeed speed = 16;                              // 弹幕速度
    PlayerDanmakuEnableblocklist enableblocklist = 17;          // 是否开启屏蔽列表
    InlinePlayerDanmakuSwitch inlinePlayerDanmakuSwitch = 18;   // 是否开启弹幕
    PlayerDanmakuSeniorModeSwitch senior_mode_switch = 19;      //
}

//
message DmSegConfig {
    //
    int64 page_size = 1;
    //
    int64 total = 2;
}

// 获取弹幕-响应
message DmSegMobileReply {
    // 弹幕列表
    repeated DanmakuElem elems = 1;
    // 是否已关闭弹幕
    // 0:未关闭 1:已关闭
    int32 state = 2;
    // 弹幕云屏蔽ai评分值
    DanmakuAIFlag ai_flag = 3;
}

// 获取弹幕-请求
message DmSegMobileReq {
    // 稿件avid/漫画epid
    int64 pid = 1;
    // 视频cid/漫画cid
    int64 oid = 2;
    // 弹幕类型
    // 1:视频 2:漫画
    int32 type = 3;
    // 分段(6min)
    int64 segment_index = 4;
    // 是否青少年模式
    int32 teenagers_mode = 5;
}

// ott弹幕列表-响应
message DmSegOttReply {
    // 是否已关闭弹幕
    // 0:未关闭 1:已关闭
    bool closed = 1;
    // 弹幕列表
    repeated DanmakuElem elems = 2;
}

// ott弹幕列表-请求
message DmSegOttReq {
    // 稿件avid/漫画epid
    int64 pid = 1;
    // 视频cid/漫画cid
    int64 oid = 2;
    // 弹幕类型
    // 1:视频 2:漫画
    int32 type = 3;
    // 分段(6min)
    int64 segment_index = 4;
}

// 弹幕SDK-响应
message DmSegSDKReply {
    // 是否已关闭弹幕
    // 0:未关闭 1:已关闭
    bool closed = 1;
    // 弹幕列表
    repeated DanmakuElem elems = 2;
}

// 弹幕SDK-请求
message DmSegSDKReq {
    // 稿件avid/漫画epid
    int64 pid = 1;
    // 视频cid/漫画cid
    int64 oid = 2;
    // 弹幕类型
    // 1:视频 2:漫画
    int32 type = 3;
    // 分段(6min)
    int64 segment_index = 4;
}

// 客户端弹幕元数据-响应
message DmViewReply {
    // 是否已关闭弹幕
    // 0:未关闭 1:已关闭
    bool closed = 1;
    // 智能防挡弹幕蒙版信息
    VideoMask mask = 2;
    // 视频字幕
    VideoSubtitle subtitle = 3;
    // 高级弹幕专包url(bfs)
    repeated string special_dms = 4;
    // 云屏蔽配置信息
    DanmakuFlagConfig ai_flag = 5;
    // 弹幕配置信息
    DanmuPlayerViewConfig player_config = 6;
    // 弹幕发送框样式
    int32 send_box_style = 7;
    // 是否允许
    bool allow = 8;
    // check box 是否展示
    string check_box = 9;
    // check box 展示文本
    string check_box_show_msg = 10;
    // 展示文案
    string text_placeholder = 11;
    // 弹幕输入框文案
    string input_placeholder = 12;
    // 用户举报弹幕 cid维度屏蔽的正则规则
    repeated string report_filter_content = 13;
    //
    ExpoReport expo_report = 14;
    //
    BuzzwordConfig buzzword_config = 15;
    //
    repeated Expressions expressions = 16;
}

// 客户端弹幕元数据-请求
message DmViewReq {
    // 稿件avid/漫画epid
    int64 pid = 1;
    // 视频cid/漫画cid
    int64 oid = 2;
    // 弹幕类型
    // 1:视频 2:漫画
    int32 type = 3;
    // 页面spm
    string spmid = 4;
    // 是否冷启
    int32 is_hard_boot = 5;
}

// web端弹幕元数据-响应
message DmWebViewReply {
    // 是否已关闭弹幕
    // 0:未关闭 1:已关闭
    int32 state = 1;
    //
    string text = 2;
    //
    string text_side = 3;
    // 分段弹幕配置
    DmSegConfig dm_sge = 4;
    // 云屏蔽配置信息
    DanmakuFlagConfig flag = 5;
    // 高级弹幕专包url(bfs)
    repeated string special_dms = 6;
    // check box 是否展示
    bool check_box = 7;
    // 弹幕数
    int64 count = 8;
    // 互动弹幕
    repeated CommandDm commandDms = 9;
    // 用户弹幕配置
    DanmuWebPlayerConfig player_config = 10;
    // 用户举报弹幕 cid维度屏蔽
    repeated string report_filter_content = 11;
    //
    repeated Expressions expressions = 12;
}

//
message ExpoReport {
    //
    bool should_report_at_end = 1;
}

//
message Expression {
    //
    repeated string keyword = 1;
    //
    string url = 2;
    //
    repeated Period period = 3;
}

//
message Expressions {
    //
    repeated Expression data = 1;
}

//
message Period {
    //
    int64 start = 1;
    //
    int64 end = 2;
}

// 是否开启弹幕
message InlinePlayerDanmakuSwitch {bool value = 1;}
// 智能云屏蔽等级
message PlayerDanmakuAiRecommendedLevel {bool value = 1;}
// 是否开启智能云屏蔽
message PlayerDanmakuAiRecommendedSwitch {bool value = 1;}
// 是否屏蔽底端弹幕
message PlayerDanmakuBlockbottom {bool value = 1;}
// 是否屏蔽彩色弹幕
message PlayerDanmakuBlockcolorful {bool value = 1;}
// 是否屏蔽重复弹幕
message PlayerDanmakuBlockrepeat {bool value = 1;}
// 是否屏蔽滚动弹幕
message PlayerDanmakuBlockscroll {bool value = 1;}
// 是否屏蔽高级弹幕
message PlayerDanmakuBlockspecial {bool value = 1;}
// 是否屏蔽顶端弹幕
message PlayerDanmakuBlocktop {bool value = 1;}
// 弹幕显示区域
message PlayerDanmakuDomain {float value = 1;}
// 是否开启屏蔽列表
message PlayerDanmakuEnableblocklist {bool value = 1;}
// 弹幕不透明度
message PlayerDanmakuOpacity {float value = 1;}
// 弹幕缩放比例
message PlayerDanmakuScalingfactor {float value = 1;}
//
message PlayerDanmakuSeniorModeSwitch {int32 value = 1;}
// 弹幕速度
message PlayerDanmakuSpeed {int32 value = 1;}
// 是否开启弹幕
message PlayerDanmakuSwitch {bool value = 1;bool canIgnore = 2;}
// 是否记录弹幕开关设置
message PlayerDanmakuSwitchSave {bool value = 1;}
// 是否使用推荐弹幕设置
message PlayerDanmakuUseDefaultConfig {bool value = 1;}

// 修改弹幕配置-响应
message Response {
    //
    int32 code = 1;
    //
    string message = 2;
}

// 单个字幕信息
message SubtitleItem {
    // 字幕id
    int64 id = 1;
    // 字幕id str
    string id_str = 2;
    // 字幕语言代码
    string lan = 3;
    // 字幕语言
    string lan_doc = 4;
    // 字幕文件url
    string subtitle_url = 5;
    // 字幕作者信息
    UserInfo author = 6;
    // 字幕类型
    SubtitleType type = 7;
}

enum SubtitleType {
    CC = 0; // CC字幕
    AI = 1; // AI生成字幕
}

// 字幕作者信息
message UserInfo {
    // 用户mid
    int64 mid = 1;
    // 用户昵称
    string name = 2;
    // 用户性别
    string sex = 3;
    // 用户头像url
    string face = 4;
    // 用户签名
    string sign = 5;
    // 用户等级
    int32 rank = 6;
}

// 智能防挡弹幕蒙版信息
message VideoMask {
    // 视频cid
    int64 cid = 1;
    // 平台
    // 0:web端 1:客户端
    int32 plat = 2;
    // 帧率
    int32 fps = 3;
    // 间隔时间
    int64 time = 4;
    // 蒙版url
    string mask_url = 5;
}

// 视频字幕信息
message VideoSubtitle {
    // 视频原语言代码
    string lan = 1;
    // 视频原语言
    string lanDoc = 2;
    // 视频字幕列表
    repeated SubtitleItem subtitles = 3;
}

免费评分

参与人数 4吾爱币 +12 热心值 +4 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
QingYi. + 3 + 1 我很赞同!
allspark + 1 用心讨论,共获提升!
天空宫阙 + 2 + 1 用心讨论,共获提升!

查看全部评分

TheMemory 发表于 2022-7-27 22:37
XiaoZouYu 发表于 2022-7-27 22:50
RQHII 发表于 2022-7-27 23:29
学到了学到了 谢谢lz
qitianshun 发表于 2022-7-28 00:33
学到了  谢谢lz
xhzd714 发表于 2022-7-28 03:12
学到了,谢谢楼主
mestyle 发表于 2022-7-28 05:46
厉害厉害,学到了
AGLJX0651 发表于 2022-7-28 06:49
学到了,谢谢楼主。
pkhtml 发表于 2022-7-28 08:12
学习了,想学习从哪入手呀??
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表