Skip to content

Repository files navigation

DouyinLiveJava — 抖音直播弹幕采集 Java SDK

StarsLicenseJavaLast commit

简体中文 | English

抖音直播弹幕采集 Java 客户端:连接抖音直播间 WebSocket、解析 protobuf 消息,以事件方式分发(弹幕 / 礼物 / 进房 / 点赞 / 榜单 / 在线人数 等)。设计参考 TikTokLiveJava

关键词 / Keywords:抖音弹幕、抖音直播、弹幕采集、弹幕抓取、直播弹幕、抖音直播间消息、douyin live、douyin danmaku、barrage / bullet-screen、live chat crawler、webcast、Java SDK。

本仓库不含任何平台签名算法实现。 连接抖音 WSS 需要一个「签名服务」产出带签名的 URL,本客户端通过 HTTP 调用它(接口契约见下)。签名服务可订阅托管的 RapidAPI 网关(几分钟接入,有免费套餐可试用),也可自行提供。

架构

 ┌── 你的签名服务 (HTTP) ──┐
liveId ──> DouyinLiveClient ──> POST /sign ─────────> 返回 wssUrl + headers
│ │
└──< 连接 WSS(Java-WebSocket)<─────────┘
心跳 → gzip 解压 → protobuf 解析 → 事件分发

目录

DouyinLiveJava/
├── pom.xml # 父 pom(聚合 client + examples,统一管理依赖版本)
├── client/ # 客户端库:连接 / 解析 / 事件
│ └── src/main/proto/douyin.proto # 抖音 webcast protobuf 定义
└── examples/ # 使用示例(独立模块,依赖 client)
└── .../examples/{ChatPrinter,Authenticated,RawMessage,StatusThenConnect}Example

签名服务接口契约

客户端通过 HTTP 把 liveId 换成可连接的 WSS URL。你需要提供一个实现以下契约的服务:

请求:POST /sign Body: {"liveId":"<web_rid>", "cookie":"<可选登录态>"}
(或 GET /sign?liveId=<web_rid>)
响应:
{
"roomId": "...",
"title": "...",
"wssUrl": "wss://.../webcast/im/push/v2/?...&signature=...",
"headers": { "User-Agent": "...", "Cookie": "ttwid=..." },
"heartbeat": { "intervalMs": 10000, "payloadHex": "3a026862" }
}

liveIdlive.douyin.com/{liveId} 里的数字(web_rid)。签名 URL 有时效,断线重连应重新请求。

另外两个端点:

GET /status?uid=<数字uid> 或 ?secUid=<sec_uid>
-> {"uid","secUid","nickname","live":true,"roomId":"..."} // 查直播状态;live=false 时 roomId 为 null
GET /sign?roomId=<room_id> 或 POST /sign {"roomId":"..."}
-> 同 /sign 响应(room_id 直连,跳过进房、无需 web_rid)

典型流程:/statusroomId/sign?roomId=wssUrl → 连接(不依赖 web_rid)。

如何获取签名服务(订阅)

不想自建签名服务?直接订阅托管的 RapidAPI 网关即可,几分钟接入Basic 套餐免费,可先免费试用再按需升级:

  1. 打开订阅页 → douyin-sign-api on RapidAPI,点 Start Free Plan 免费订阅 Basic 套餐,需要更多额度再升级付费套餐;
  2. 在控制台复制你的 X-RapidAPI-Key
  3. 填进项目根目录 .env(参考 .env.example):RAPIDAPI_KEY=你的Key

接入方式由 .env 里的 key 自动推断,改配置即切换,业务代码无需改动:

.env 中的 key接入方式baseUrl鉴权头
RAPIDAPI_KEY 非空RapidAPI 网关(推荐·免费试用)https://douyin-sign-api.p.rapidapi.comx-rapidapi-key / x-rapidapi-host
留空自建 / 本地SIGN_URL(默认 http://localhost:18080

端点路径差异由 SDK 内部处理:RapidAPI 为 /api/v1/douyin/sign/api/v1/douyin/sign/status;自建为 /sign/status

代码里也可显式指定接入方式:SignProvider.rapidApi("你的Key")SignProvider.selfHosted("http://localhost:18080")

快速开始

mvn clean package # 构建 client 库 + examples(protoc 构建期生成 protobuf 类)# 运行前确保签名服务在运行(默认 http://localhost:18080,用 SIGN_URL 覆盖)
java -jar examples/target/douyin-live-examples.jar 640801847218
# 其它示例用 -cp 指定类名
java -cp examples/target/douyin-live-examples.jar com.douyinlive.examples.RawMessageExample 640801847218

用 JitPack 引入依赖

JitPack

无需手动构建,通过 JitPack 直接引入 douyin-live-client

Maven —— 先加仓库,再加依赖(注意多模块仓库 groupId 形如 com.github.用户.仓库):

<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependency>
<groupId>com.github.lulajax.DouyinLiveJava</groupId>
<artifactId>douyin-live-client</artifactId>
<version>v1.0.0</version>
</dependency>

Gradle

repositories { maven { url 'https://jitpack.io' } }
dependencies { implementation 'com.github.lulajax.DouyinLiveJava:douyin-live-client:v1.0.0' }

版本号用 Release 的 tag(如 v1.0.0),也可用 main-SNAPSHOT 取主分支最新构建。

作为库使用

// 按 .env 自动选择接入方式(RapidAPI / 自建);也可换成 SignProvider.rapidApi("你的Key")SignProviderprovider = SignProvider.fromConfig(System::getenv);
DouyinLiveClientclient = newDouyinLiveClient("640801847218", provider);
client.addListener(newDouyinLiveListener() {
@OverridepublicvoidonChat(ChatEvente) { System.out.println(e.user().nickname() + ": " + e.content()); }
@OverridepublicvoidonGift(GiftEvente) { /* ... */ }
@OverridepublicvoidonRoomRank(RoomRankEvente) { /* 在线榜单 */ }
@OverridepublicvoidonUnknown(Stringmethod, ByteStringpayload) { /* 自行解析其它消息 */ }
});
client.connect();

先查直播状态,再用 room_id 直连

SignProviderprovider = SignProvider.fromConfig(System::getenv);
SignClientsign = newSignClient(provider);
StatusResultst = sign.statusBySecUid("MS4w..."); // 或 sign.statusByUid("<数字uid>")if (st.live) {
DouyinLiveClientclient = DouyinLiveClient.byRoomId(st.roomId, provider);
client.addListener(/* ... */);
client.connect(); // room_id 直连,无需 web_rid
}

支持的事件

回调消息
onChat弹幕
onGift礼物
onMember进房
onLike点赞
onSocial关注 / 分享
onFansclub粉丝团
onRoomUserSeq在线 / 累计观看人数
onRoomStats房间统计
onControl直播控制(status=3 即直播结束)
onRoomRank在线榜单
onEmojiChat表情弹幕
onRoomMessage系统提示
onUnknown其它未单独映射的消息(method + 原始 payload)

新增消息类型:在 MessageRouter 的 switch 里按 method 加分支并补一个回调即可。

登录态(可选)

匿名连接能收到大部分弹幕;通过签名服务传入登录态 Cookie(尤其 sessionid)可收到更完整的事件。客户端侧:

newDouyinLiveClient(liveId, provider, "sessionid=xxx; ..."); // provider 见上;Cookie 也可走环境变量 DOUYIN_COOKIE

Cookie 是敏感登录凭证,请勿提交进代码库。

协议说明

douyin.proto 为抖音 webcast 协议的 protobuf 定义,构建期由 protoc(protoc-jar-maven-plugin)生成 Java 类。

免责声明

本项目仅供学习与技术研究使用。使用者须遵守抖音相关服务条款及适用法律法规,不得用于侵犯他人权益或任何商业滥用;因使用本项目产生的后果由使用者自行承担。

本仓库不包含、不提供任何平台签名算法实现;连接所需的签名服务由使用者自行提供。

联系我

问题、建议或合作,欢迎提 Issue,或发送邮件至 lulajax@163.com

赞赏

如果这个项目对你有帮助,点个 Star ⭐ 就是很好的鼓励;愿意的话,也可以扫码请我喝杯咖啡 ☕:

微信赞赏码

License

MIT

About

抖音直播弹幕采集 Java SDK | Douyin live danmaku/barrage capture client — 连接抖音直播间 WebSocket、解析 protobuf,事件分发弹幕/礼物/进房/点赞/榜单/在线人数。Douyin/TikTok live stream chat crawler in Java.

Topics

Resources

Stars

11 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages