{"id":15014255,"url":"https://github.com/ordinaryroad-project/ordinaryroad-live-chat-client","last_synced_at":"2025-05-16T18:05:13.029Z","repository":{"id":190325370,"uuid":"682385657","full_name":"OrdinaryRoad-Project/ordinaryroad-live-chat-client","owner":"OrdinaryRoad-Project","description":"(2024最新版) 一个基于Netty的通用直播间弹幕客户端，支持网络代理，支持弹幕发送*、为主播点赞*，已支持B站、斗鱼、虎牙、抖音、快手；BarrageFly——让弹幕飞，基于该项目的一个弹幕转发、过滤、处理平台；支持多平台直播间弹幕监听(弹幕抓取 弹幕爬取 弹幕爬虫)","archived":false,"fork":false,"pushed_at":"2024-10-29T08:24:38.000Z","size":5363,"stargazers_count":235,"open_issues_count":6,"forks_count":52,"subscribers_count":6,"default_branch":"main","last_synced_at":"2024-10-29T09:23:57.793Z","etag":null,"topics":["bilibili","chat","client","danmu","douyin","douyu","huya","java","kuaishou","live","netty","websocket"],"latest_commit_sha":null,"homepage":"https://barragefly.ordinaryroad.tech","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OrdinaryRoad-Project.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-24T04:07:42.000Z","updated_at":"2024-10-29T08:24:42.000Z","dependencies_parsed_at":"2024-01-12T10:34:21.020Z","dependency_job_id":"aaf73572-53cc-422c-a333-a9eb50fee257","html_url":"https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client","commit_stats":{"total_commits":531,"total_committers":5,"mean_commits":106.2,"dds":"0.039548022598870025","last_synced_commit":"5fdd6448a96162058ad8d3fbf8c2b691c2691c39"},"previous_names":["ordinaryroad-project/ordinaryroad-live-chat-client"],"tags_count":52,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OrdinaryRoad-Project%2Fordinaryroad-live-chat-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OrdinaryRoad-Project%2Fordinaryroad-live-chat-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OrdinaryRoad-Project%2Fordinaryroad-live-chat-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OrdinaryRoad-Project%2Fordinaryroad-live-chat-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OrdinaryRoad-Project","download_url":"https://codeload.github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248598148,"owners_count":21131026,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bilibili","chat","client","danmu","douyin","douyu","huya","java","kuaishou","live","netty","websocket"],"created_at":"2024-09-24T19:45:22.813Z","updated_at":"2025-05-16T18:05:13.016Z","avatar_url":"https://github.com/OrdinaryRoad-Project.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ordinaryroad-live-chat-client\n\n[![license](https://img.shields.io/github/license/OrdinaryRoad-Project/ordinaryroad-live-chat-client)](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client?tab=MIT-1-ov-file#readme) [![release](https://img.shields.io/github/v/release/OrdinaryRoad-Project/ordinaryroad-live-chat-client?include_prereleases)](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases) [![Maven Central](https://img.shields.io/maven-central/v/tech.ordinaryroad/live-chat-client)](https://central.sonatype.com/artifact/tech.ordinaryroad/live-chat-client/versions)\n\n\u003e This project is in progress... 👨‍💻，有问题欢迎[提交issuse](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/issues/new/choose)，\n\u003e 觉得有用的话可以点个小星星⭐️鼓励一下，感谢\n\u003e\n\u003e 如果对项目感兴趣也欢迎[加入频道](#交流讨论)交流讨论，\n\u003e 提交PR\n\u003e\n\u003e ToDo List: [https://github.com/orgs/OrdinaryRoad-Project/projects/1](https://github.com/orgs/OrdinaryRoad-Project/projects/1)\n\u003e\n\u003e **更新日志：**[https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases)\n\u003e\n\u003e [⭐BarrageFly——让弹幕飞](https://barragefly.ordinaryroad.tech/)，基于该项目的一个弹幕转发、过滤、处理平台\n---\n\n## 项目特色\n\n- Feature 0: Netty\n- Feature 1: 消息中的未知属性统一放到单独的MAP中（JSON格式消息）\n- Feature 2: 支持自动重连\n- Feature 3: 支持同时监听多个直播间\n- Feature 4: 支持短直播间id\n- Feature 5*: 支持弹幕发送、为主播点赞\n- Feature 6*: 内置收到弹幕、收到礼物、收到醒目留言、用户入房、收到点赞、状态变化、统计信息、社交消息回调\n- Feature 7: 内置插件：消息转发\n- Feature 8: 支持单独引入编解码模块\n- Feature 9: 支持网络代理\n- Feature 10*: 解析直播间信息\n- Feature 11*: 浏览器模式（监听浏览器直播间页面）\n\n\u003e *存在平台差异\n\u003e - ✅: 平台支持且已完成\n\u003e - ☑️️: 平台支持但未实现\n\u003e - ❌: 平台网页端暂不支持\n\n## 平台适配情况表\n\n| 平台                | LiveChatClient | Cookie | 短直播间id | 发送弹幕 | 为主播点赞 |\n|-------------------|----------------|--------|--------|------|-------|\n| Bilibili B站       | ✅              | ✅      | ✅      | ✅    | ✅     |\n| Douyu 斗鱼          | ✅              | ✅      | ✅      | ✅    | ❌     |\n| Huya 虎牙           | ✅              | ✅      | ✅      | ✅    | ❌     |\n| Douyin 抖音*        | ✅              | ☑️️    | ✅      | ☑️   | ☑️️   |\n| Douyin 抖音(浏览器模式)* | ✅              | ☑️️    | ✅      | ☑️   | ☑️️   |\n| Kuaishou 快手       | ✅              | ✅      | ✅      | ✅    | ✅     |\n| Tiktok*           | ✅              | ✅      | ✅      | ☑️   | ☑️    |\n| Tiktok(浏览器模式)*    | ✅              |        |        | ️    | ️     |\n| Twitch*           | ✅              |        |        | ️    |       |\n\n\u003e *暂未完全支持（Tiktok、Twitch在测试中，如果需要适配新平台可联系频道主）\n\n## 平台直播间信息适配情况表\n\n| 平台          | 房间标题 | 房间描述 | 房间直播状态 | 房间直播流地址 |\n|-------------|------|------|--------|---------|\n| Bilibili B站 | ✅    |      | ✅      | ✅       |\n| Douyu 斗鱼    | ✅    |      | ✅      | ✅       |\n| Huya 虎牙     | ✅    |      | ✅      | ✅       |\n| Douyin 抖音   | ✅    |      | ✅      | ✅       |\n| Kuaishou 快手 | ✅    | ✅    | ✅      | ✅       |\n\n## 平台直播间消息适配情况表\n\n| 平台          | 弹幕 | 礼物        | 醒目留言 | 进入房间    | 点赞      | 状态变化 | 统计信息               | 社交消息     |\n|-------------|----|-----------|------|---------|---------|------|--------------------|----------|\n| Bilibili B站 | ✅  | ✅         | ✅    | ✅       | ✅       | ✅    | ✅（点赞数、当前人数、累计观看人数） |          |\n| Douyu 斗鱼    | ✅  | ✅         | ✅    | ✅       | ❌       | ☑️   | ❌                  |          |\n| Huya 虎牙     | ✅  | ✅         | ❌    | ✅（高级用户） | ❌       | ☑️   | ❌                  |          |\n| Douyin 抖音   | ✅  | ✅         | ❌    | ✅       | ✅（点赞个数） | ✅    | ✅（点赞数、当前人数）        | ✅（分享、关注） |\n| Kuaishou 快手 | ✅  | ✅（礼物信息不全） | ❌    | ❌       | ✅（首次点赞） | ❌    | ✅（点赞数、当前人数）        |          |\n| Tiktok      | ✅  | ✅         | ❌    | ✅       | ✅（点赞个数） | ✅    | ✅（点赞数、当前人数）        | ✅（分享、关注） |\n\n消息接口内置的方法见 [https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/tree/main/live-chat-client-commons/live-chat-client-commons-base/src/main/java/tech/ordinaryroad/live/chat/client/commons/base/msg](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/tree/main/live-chat-client-commons/live-chat-client-commons-base/src/main/java/tech/ordinaryroad/live/chat/client/commons/base/msg)\n\n运行效果图\n![运行效果](assets/运行效果.png)\n\n---\n\n## 0 原理\n\n抓取浏览器的WebSocket二进制流，然后分析模拟浏览器的行为；这种方式的优点是不需要开发者认证，缺点是没有官方文档，分析过程比较费时费力，并且需要适配不同平台的流程变化（不会经常变化）\n\n\u003e 新增浏览器模式，直接监听直播间弹幕流，无需模拟浏览器\n\n以后可能会考虑支持平台的开放协议\n\n## 1 安装\n\n\u003e JDK ≥ 8\n\n### B站\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003etech.ordinaryroad\u003c/groupId\u003e\n    \u003cartifactId\u003elive-chat-client-bilibili\u003c/artifactId\u003e\n    \u003c!-- 参考github release版本，不需要前缀`v` --\u003e\n    \u003cversion\u003e${ordinaryroad-live-chat-client.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n\u003e Gradle用户注意：自从`0.3.2`版本开始，B站Client配置中，压缩方式默认为`NORMAL_BROTLI`，当使用Gradle引入时，还需要引入操作系统对应的brotli4j native包，详见：https://github.com/hyperxpro/Brotli4j?tab=readme-ov-file#gradle\n\n例如：\n\n```groovy\nval liveChatClientBrotliVersion = \"1.16.0\"\n// Windows\nimplementation(\"com.aayushatharva.brotli4j:native-windows-x86_64:$liveChatClientBrotliVersion\")\nimplementation(\"com.aayushatharva.brotli4j:native-windows-aarch64:$liveChatClientBrotliVersion\")\n// Linux\nimplementation(\"com.aayushatharva.brotli4j:native-linux-armv7:$liveChatClientBrotliVersion\")\nimplementation(\"com.aayushatharva.brotli4j:native-linux-aarch64:$liveChatClientBrotliVersion\")\nimplementation(\"com.aayushatharva.brotli4j:native-linux-x86_64:$liveChatClientBrotliVersion\")\nimplementation(\"com.aayushatharva.brotli4j:native-linux-s390x:$liveChatClientBrotliVersion\")\nimplementation(\"com.aayushatharva.brotli4j:native-linux-riscv64:$liveChatClientBrotliVersion\")\nimplementation(\"com.aayushatharva.brotli4j:native-linux-ppc64le:$liveChatClientBrotliVersion\")\n// Mac\nimplementation(\"com.aayushatharva.brotli4j:native-osx-aarch64:$liveChatClientBrotliVersion\")\nimplementation(\"com.aayushatharva.brotli4j:native-osx-x86_64:$liveChatClientBrotliVersion\")\n```\n\n如果引入后仍无法使用，请修改protover配置项，例如改为`NORMAL_ZLIB`：`BilibiliLiveChatClientConfig.builder().protover(ProtoverEnum.NORMAL_ZLIB).roomId(\"xxx\").build()`\n\n### 斗鱼\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003etech.ordinaryroad\u003c/groupId\u003e\n    \u003cartifactId\u003elive-chat-client-douyu\u003c/artifactId\u003e\n    \u003c!-- 参考github release版本，不需要前缀`v` --\u003e\n    \u003cversion\u003e${ordinaryroad-live-chat-client.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### 虎牙\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003etech.ordinaryroad\u003c/groupId\u003e\n    \u003cartifactId\u003elive-chat-client-huya\u003c/artifactId\u003e\n    \u003c!-- 参考github release版本，不需要前缀`v` --\u003e\n    \u003cversion\u003e${ordinaryroad-live-chat-client.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### 抖音\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003etech.ordinaryroad\u003c/groupId\u003e\n    \u003cartifactId\u003elive-chat-client-douyin\u003c/artifactId\u003e\n    \u003c!-- 参考github release版本，不需要前缀`v` --\u003e\n    \u003cversion\u003e${ordinaryroad-live-chat-client.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n\u003e 注意，如果`StringEscapeUtils.unescapeJson`出现报错，尝试手动引入`\"org.apache.commons:commons-lang3:3.17.0\"`\n\n### 快手\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003etech.ordinaryroad\u003c/groupId\u003e\n    \u003cartifactId\u003elive-chat-client-kuaishou\u003c/artifactId\u003e\n    \u003c!-- 参考github release版本，不需要前缀`v` --\u003e\n    \u003cversion\u003e${ordinaryroad-live-chat-client.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## 2 使用\n\n\u003e 测试类包含了多种样例，可供参考\n\n### 2.0 不同平台的CMD定义\n\n- B站：[BilibiliCmdEnum](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/blob/main/live-chat-client-codec/live-chat-client-codec-bilibili/src/main/java/tech/ordinaryroad/live/chat/client/codec/bilibili/constant/BilibiliCmdEnum.java)\n- 斗鱼：[DouyuCmdEnum](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/blob/main/live-chat-client-codec/live-chat-client-codec-douyu/src/main/java/tech/ordinaryroad/live/chat/client/codec/douyu/constant/DouyuCmdEnum.java)\n- 虎牙：[HuyaCmdEnum](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/blob/main/live-chat-client-codec/live-chat-client-codec-huya/src/main/java/tech/ordinaryroad/live/chat/client/codec/huya/constant/HuyaCmdEnum.java)\n- 抖音：[DouyinCmdEnum](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/blob/main/live-chat-client-codec/live-chat-client-codec-douyin/src/main/java/tech/ordinaryroad/live/chat/client/codec/douyin/constant/DouyinCmdEnum.java)\n- 快手：[PayloadTypeOuterClass](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/blob/main/live-chat-client-codec/live-chat-client-codec-kuaishou/src/main/java/tech/ordinaryroad/live/chat/client/codec/kuaishou/protobuf/PayloadTypeOuterClass.java)\n\n可以重写`onCmdMsg(收到的所有CMD消息)`或`onOtherCmdMsg(框架未处理的CMD消息)`回调方法，判断CMD来监听框架已经定义的CMD类型\n\n如果要监听的消息枚举类中未定义，可以考虑重写`onUnknownCmdMsg(未知CMD消息)`方法\n\nICmdMsg类型转换对应关系\n\n- B站：MessageMsg\n- 斗鱼：DouyuCmdMsg\n- 虎牙：WSPushMessage 或 WSMsgItem\n- 抖音：DouyinCmdMsg\n- 快手：KuaishouCmdMsg\n\n```java\n\n@Override\npublic void onOtherCmdMsg(BilibiliCmdEnum cmd, ICmdMsg\u003cBilibiliCmdEnum\u003e cmdMsg) {\n    switch (cmd) {\n        case GUARD_BUY: {\n            // 有人上舰\n            MessageMsg messageMsg = (MessageMsg) cmdMsg;\n                ...\n            break;\n        }\n        case SUPER_CHAT_MESSAGE_DELETE: {\n            // 删除醒目留言\n            MessageMsg messageMsg = (MessageMsg) cmdMsg;\n                ...\n            break;\n        }\n        default: {\n            // ignore\n        }\n    }\n}\n```\n\n### 2.1 Client模式\n\n\u003e Spring Boot 示例 [client-example](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/tree/main/live-chat-client-examples/client-example)\n\n1. 创建配置\n2. 创建Client并传入配置、添加消息回调\n3. 开始监听直播间\n\n\u003e 如果需要查看其他平台的效果，请将`Bilibili`改为其他平台对应的英文，并修改消息回调接口的函数签名\n\n```java\npublic class ClientModeExample {\n    public static void main(String[] args) {\n        String cookie = System.getenv(\"cookie\");\n        // 1. 创建配置\n        BilibiliLiveChatClientConfig config = BilibiliLiveChatClientConfig.builder()\n                // TODO 消息转发地址\n                .forwardWebsocketUri(\"\")\n                // TODO 浏览器Cookie\n                .cookie(cookie)\n                // TODO 直播间id（支持短id）\n                .roomId(7777)\n                .build();\n\n        // 2. 创建Client并传入配置、添加消息回调\n        BilibiliLiveChatClient client = new BilibiliLiveChatClient(config, new IBilibiliMsgListener() {\n            @Override\n            public void onDanmuMsg(BilibiliBinaryFrameHandler binaryFrameHandler, DanmuMsgMsg msg) {\n                IBilibiliMsgListener.super.onDanmuMsg(binaryFrameHandler, msg);\n                System.out.printf(\"%s 收到弹幕 %s %s(%s)：%s\\n\", binaryFrameHandler.getRoomId(), msg.getBadgeLevel() != 0 ? msg.getBadgeLevel() + msg.getBadgeName() : \"\", msg.getUsername(), msg.getUid(), msg.getContent());\n            }\n\n            @Override\n            public void onGiftMsg(BilibiliBinaryFrameHandler binaryFrameHandler, SendGiftMsg msg) {\n                IBilibiliMsgListener.super.onGiftMsg(binaryFrameHandler, msg);\n                System.out.printf(\"%s 收到礼物 %s %s(%s) %s %s(%s)x%s(%s)\\n\", binaryFrameHandler.getRoomId(), msg.getBadgeLevel() != 0 ? msg.getBadgeLevel() + msg.getBadgeName() : \"\", msg.getUsername(), msg.getUid(), msg.getData().getAction(), msg.getGiftName(), msg.getGiftId(), msg.getGiftCount(), msg.getGiftPrice());\n            }\n\n            @Override\n            public void onSuperChatMsg(BilibiliBinaryFrameHandler binaryFrameHandler, SuperChatMessageMsg msg) {\n                IBilibiliMsgListener.super.onSuperChatMsg(binaryFrameHandler, msg);\n                System.out.printf(\"%s 收到醒目留言 %s(%s)：%s\\n\", binaryFrameHandler.getRoomId(), msg.getUsername(), msg.getUid(), msg.getContent());\n            }\n\n            @Override\n            public void onEnterRoomMsg(InteractWordMsg msg) {\n                System.out.printf(\"%s %s(%s) 进入直播间\\n\", msg.getBadgeLevel() != 0 ? msg.getBadgeLevel() + msg.getBadgeName() : \"\", msg.getUsername(), msg.getUid());\n            }\n\n            @Override\n            public void onLikeMsg(BilibiliBinaryFrameHandler binaryFrameHandler, LikeInfoV3ClickMsg msg) {\n                IBilibiliMsgListener.super.onLikeMsg(binaryFrameHandler, msg);\n                System.out.printf(\"%s 收到点赞 %s %s(%s)\\n\", binaryFrameHandler.getRoomId(), msg.getBadgeLevel() != 0 ? msg.getBadgeLevel() + msg.getBadgeName() : \"\", msg.getUsername(), msg.getUid());\n            }\n\n            @Override\n            public void onLiveStatusMsg(BilibiliBinaryFrameHandler binaryFrameHandler, BilibiliLiveStatusChangeMsg msg) {\n                IBilibiliMsgListener.super.onLiveStatusMsg(binaryFrameHandler, msg);\n                System.out.printf(\"%s 状态变化 %s\\n\", binaryFrameHandler.getRoomId(), msg.getLiveStatusAction());\n            }\n\n            @Override\n            public void onRoomStatsMsg(BilibiliBinaryFrameHandler binaryFrameHandler, BilibiliRoomStatsMsg msg) {\n                IBilibiliMsgListener.super.onRoomStatsMsg(binaryFrameHandler, msg);\n                System.out.printf(\"%s 统计信息 累计点赞数: %s, 当前观看人数: %s, 累计观看人数: %s\\n\", binaryFrameHandler.getRoomId(), msg.getLikedCount(), msg.getWatchingCount(), msg.getWatchedCount());\n            }\n        });\n\n        // 添加客户端连接状态回调\n        client.addStatusChangeListener((evt, oldStatus, newStatus) -\u003e {\n            if (newStatus == ClientStatusEnums.CONNECTED) {\n                // TODO 要发送的弹幕内容，请注意控制发送频率；框架内置支持设置发送弹幕的最少时间间隔，小于时将忽略该次发送\n                client.sendDanmu(\"666666\" + RandomUtil.randomNumbers(1));\n            }\n        });\n\n        // 3. 开始监听直播间\n        client.connect();\n    }\n}\n```\n\n#### 2.1.1 Client相关API\n\n- 连接\n    - `void connect(Runnable success, Consumer\u003cThrowable\u003e failed)`\n    - `void connect(Runnable success)`\n    - `void connect()`\n- 断开连接\n    - `void disconnect(boolean cancelReconnect)`\n    - `void disconnect()`\n- 销毁\n    - `void destroy()`\n- 发送消息\n    - `void send(Object msg, Runnable success, Consumer\u003cThrowable\u003e failed)`\n    - `void send(Object msg, Runnable success)`\n    - `void send(Object msg, Consumer\u003cThrowable\u003e failed)`\n    - `void send(Object msg)`\n- 发送弹幕\n    - `void sendDanmu(Object danmu, Runnable success, Consumer\u003cThrowable\u003e failed)`\n    - `void sendDanmu(Object danmu, Runnable success)`\n    - `void sendDanmu(Object danmu, Consumer\u003cThrowable\u003e failed)`\n    - `void sendDanmu(Object danmu)`\n- 为主播点赞\n    - `void clickLike(int count, Runnable success, Consumer\u003cThrowable\u003e failed)`\n    - `void clickLike(int count, Runnable success)`\n    - `void clickLike(int count, Consumer\u003cThrowable\u003e failed)`\n    - `void clickLike(int count)`\n- 添加消息监听器\n    - `boolean addMsgListener(MsgListener msgListener)`\n    - `boolean addMsgListeners(List\u003cMsgListener\u003e msgListeners)`\n- 移除消息监听器\n    - `boolean removeMsgListener(MsgListener msgListener)`\n    - `boolean removeMsgListeners(List\u003cMsgListener\u003e msgListeners)`\n- 获取当前状态\n    - `ClientStatusEnums getStatus()`\n- 添加状态变化监听器\n    - `void addStatusChangeListener(IClientStatusChangeListener listener)`\n- 移除状态变化监听器\n    - `void removeStatusChangeListener(IClientStatusChangeListener listener)`\n- 获取 Client 配置信息\n    - `BaseLiveChatClientConfig getConfig()`\n- 获取房间信息\n    - `IRoomInitResult getRoomInitResult()`\n- 添加插件\n    - `void addPlugin(IPlugin... plugins);`\n- 移除插件\n    - `void removePlugin(IPlugin... plugins);`\n\n#### 2.1.2 房间信息 IRoomInitResult 相关 API\n\n- 获取房间标题\n    - `String getTitle()`\n- 获取房间描述\n    - `String getDescription()`\n- 获取房间直播状态\n    - `RoomLiveStatusEnum getRoomLiveStatus()`\n- 获取房间直播流地址\n    - `List\u003cIRoomLiveStreamInfo\u003e getRoomLiveStreamUrls(RoomLiveStreamQualityEnum... qualities)`\n    - `Map\u003cRoomLiveStreamQualityEnum, List\u003cString\u003e\u003e getRoomLiveStreamUrlMap(RoomLiveStreamQualityEnum... qualities)`\n\n### 2.2 高级模式\n\n\u003e 参考 [BilibiliHandlerModeExample](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/tree/main/live-chat-client-examples/handler-example/src/main/java/tech/ordinaryroad/live/chat/client/example/handler/BilibiliHandlerModeExample.java)\n\n### 2.3 单独引入编解码模块\n\n\u003e 参考 [codec-example](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/tree/main/live-chat-client-examples/codec-example/src/main/java/tech/ordinaryroad/live/chat/client/example/codec/BilibiliCodecExample.java)\n\nB站示例，其他平台只需修改`bilibili`即可\n\u003e 使用Gradle引入B站编解码模块时，参考[#B站](#B站)\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003etech.ordinaryroad\u003c/groupId\u003e\n    \u003cartifactId\u003elive-chat-client-codec-bilibili\u003c/artifactId\u003e\n    \u003c!-- 参考github release版本，不需要前缀`v` --\u003e\n    \u003cversion\u003e${ordinaryroad-live-chat-client.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### 2.4 设置代理\n\n\u003e 生效范围：仅项目自身，不会影响引用该项目的父项目\n\n在代码中修改Config`socks5ProxyHost(\"127.0.0.1\")`, `socks5ProxyPort(\"1080\")`\n\n身份认证（暂未测试）\n\n- `socks5ProxyUsername(\"username\")`, `socks5ProxyPassword(\"password\")`\n\n### 2.5 插件\n\n目前内置插件有\n\n- 消息转发 [https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/tree/main/live-chat-client-plugins/live-chat-client-plugin-forward](https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/tree/main/live-chat-client-plugins/live-chat-client-plugin-forward)\n\n### 2.6 浏览器模式\n\n默认使用Chrome浏览器，下载地址如下\n\n| 平台     | 系统        | 下载地址                                                                                                  |\n|--------|-----------|-------------------------------------------------------------------------------------------------------|\n| chrome | linux64   | https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.49/linux64/chrome-linux64.zip     \n| chrome | mac-arm64 | https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.49/mac-arm64/chrome-mac-arm64.zip \n| chrome | mac-x64   | https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.49/mac-x64/chrome-mac-x64.zip     \n| chrome | win32     | https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.49/win32/chrome-win32.zip         \n| chrome | win64     | https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.49/win64/chrome-win64.zip         \n\n\n\u003e 参考`tech.ordinaryroad.live.chat.client.douyin.browser.DouyinBrowserLiveChatClientTest`\n\n\n```java\n// 1. 创建Config\nDouyinBrowserLiveChatClientConfig config = DouyinBrowserLiveChatClientConfig.builder()\n        .cookie(cookie)\n        // 与辉同行\n        .roomId(\"646454278948\")\n        .build();\n\n// 2. 创建Client并传入配置、添加消息回调\nDouyinBrowserLiveChatClient client = new DouyinBrowserLiveChatClient(config);\n\n// 3. 连接，将自动打开Chrome浏览器\nclient.connect();\n```\n\n## 交流讨论\n\n觉得有用的话可以点个小星星⭐️鼓励一下，感谢\n\n扫描二维码加入QQ/微信频道，或点击链接加入QQ频道【OrdinaryRoad】：https://pd.qq.com/s/3id0n7fvs\n\n\u003cimg src=\"assets/QQ频道.jpg\" width=\"200px\"\u003e\n\u003cimg src=\"assets/微信频道.jpg\" width=\"200px\"\u003e\n\n## 捐赠\n\n\u003e 开源不易，您的认可与支持是我不断更新的最大动力！\n\u003e\n\u003e \u003cimg src=\"assets/donate_alipay.jpg\" width=\"200px\"\u003e\u003cimg src=\"assets/donate_vxpay.png\" width=\"200px\"\u003e\u003cimg src=\"assets/donate_qqpay.png\" width=\"200px\"\u003e\n\n| 日期         | 捐赠人 |    金额 | 留言      | 渠道  |\n|------------|----:|------:|:--------|-----|\n| 2024-03-06 | **睿 | 88.88 | 佬 加油    | ZFB |\n| 2024-03-10 | **豪 |  88.8 | 大佬加油    | ZFB |\n| 2024-03-25 | **波 | 188.8 | /       | ZFB |\n| 2024-04-02 | **豪 |    30 | /       | ZFB |\n| 2024-04-30 |  *h |   100 | 大佬牛逼    | WX  |\n| 2024-11-18 |  *磊 |   200 | /       | WX  |\n| 2025-01-04 |  *n |  18.8 | 天冷喝咖啡☕️ | QQ  |\n| 2025-01-14 |  *n |  28.8 | 加油️     | QQ  |                    \n| ...        | ... |   ... | ...     | ... |\n\n## Star History\n\n\u003ca href=\"https://star-history.com/#OrdinaryRoad-Project/ordinaryroad-live-chat-client\u0026Date\"\u003e\n\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=OrdinaryRoad-Project/ordinaryroad-live-chat-client\u0026type=Date\u0026theme=dark\" /\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=OrdinaryRoad-Project/ordinaryroad-live-chat-client\u0026type=Date\" /\u003e\n    \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=OrdinaryRoad-Project/ordinaryroad-live-chat-client\u0026type=Date\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n\n## 感谢\n\n- [douyu-crawler-demo](https://github.com/cj1128/douyu-crawler-demo)（斗鱼登录状态的请求包构建）\n- [Kain-90/huya-danmu](https://github.com/Kain-90/huya-danmu)\n  （虎牙流程参考，最新lib库[vplayerUI.js](https://a.msstatic.com/huya/h5player/room/2309271152/vplayerUI.js)、[taf-signal.global.0.0.4.prod.js](https://hd2.huya.com/fedbasic/huyabaselibs/taf-signal/taf-signal.global.0.0.4.prod.js)）\n- [saermart/DouyinLiveWebFetcher](https://github.com/saermart/DouyinLiveWebFetcher)（抖音流程参考）\n- https://blog.ordinaryroad.tech/1/article/1743829866426630144 （快手直播间WebSocket的Protobuf协议分析）\n\n## 免责声明\n\n免责声明：仅供学术研究使用。对于违反相关法律、造成危害的滥用行为，开发者不负任何责任。\n\n## 另附各个平台的开放平台地址\n\n- B站开放平台：https://openhome.bilibili.com\n- 斗鱼开放平台：https://open.douyu.com\n- 虎牙开放平台：https://open.huya.com\n- 快手开放平台：https://open.kuaishou.com\n- 抖音开放平台：https://open.douyin.com\n\n---\nKeywords: 弹幕抓取 弹幕爬取 弹幕爬虫\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fordinaryroad-project%2Fordinaryroad-live-chat-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fordinaryroad-project%2Fordinaryroad-live-chat-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fordinaryroad-project%2Fordinaryroad-live-chat-client/lists"}