このプロジェクトは進行中です... ?、ご質問がございましたら、問題を送信してください。役に立った場合は、小さなスターを付けていただければ幸いです。
このプロジェクトにご興味がございましたら、ぜひディスカッション用のチャンネルに参加し、PR を送信してください。
ToDo リスト: https://github.com/orgs/OrdinaryRoad-Project/projects/1
変更ログ: https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases
BarrageFly - 弾幕を飛ばしましょう。このプロジェクトに基づいた弾幕の転送、フィルタリング、処理プラットフォームです。
*プラットフォームの違いが存在します
- ✅: プラットフォームがサポートされ、完成しました
- ☑️️: プラットフォームはサポートされていますが、実装されていません
- : プラットフォームの Web バージョンは現在サポートされていません。
プラットフォーム | ライブチャットクライアント | クッキー | 短いライブルームID | 弾幕を送る | ホストのように | 生放送ルームのご案内* |
---|---|---|---|---|---|---|
ビリビリステーションB | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
ドウユベタ | ✅ | ✅ | ✅ | ✅ | ✅ | |
フヤフヤ | ✅ | ✅ | ✅ | ✅ | ✅ | |
ドゥイン ドゥイン* | ✅ | ☑️️ | ✅ | ☑️ | ☑️️ | ✅ |
クアイショウ クアイショウ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
TikTok* | ✅ | ✅ | ✅ | ☑️ | ☑️ | ✅ |
*まだ完全にはサポートされていません(Tiktokはテスト中です)
※ライブ配信ルーム情報は現在ライブ配信ルームタイトルの取得のみ対応しております。
プラットフォーム | 弾幕 | 贈り物 | 目を引くメッセージ | 部屋に入る | のように | ステータス変化 | 統計 | ソーシャルニュース |
---|---|---|---|---|---|---|---|---|
ビリビリステーションB | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅(いいね数、現在の人数、累計閲覧者数) | |
ドウユベタ | ✅ | ✅ | ☑️ | ✅ | ☑️ | |||
フヤフヤ | ✅ | ✅ | ✅ (プレミアムユーザー) | ☑️ | ||||
ドゥイン ドゥイン | ✅ | ✅ | ✅ | ✅(いいね数) | ✅ | ✅(いいね数、現在の人数) | ✅(シェア、フォロー) | |
クアイショウ クアイショウ | ✅ | ✅(プレゼント情報が不完全) | ✅(最初のいいね) | ✅(いいね数、現在の人数) | ||||
TikTok | ✅ | ✅ | ✅ | ✅(いいね数) | ✅ | ✅(いいね数、現在の人数) | ✅(シェア、フォロー) |
メッセージ インターフェイスの組み込みメソッドについては、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
操作レンダリング
ブラウザの WebSocket バイナリ ストリームをキャプチャし、ブラウザの動作を分析してシミュレーションします。この方法の利点は、開発者の認定が必要ないことですが、欠点は、公式ドキュメントがなく、分析プロセスに時間がかかり、手間がかかることです。 、異なるプラットフォームのプロセス変更に適応する必要があります (頻繁には変更されません)
将来的には、プラットフォームのオープン プロトコルのサポートを検討する可能性があります。
JDK≧8
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Gradle ユーザー向けの注意事項: バージョン
0.3.2
以降、ステーション B のクライアント構成では、圧縮方式がデフォルトでNORMAL_BROTLI
になります。Gradle を使用して導入する場合は、オペレーティング システムに対応する brotli4j ネイティブ パッケージも導入する必要があります。 、参照: https://github.com /hyperxpro/Brotli4j?tab=readme-ov-file#gradle
例えば:
val liveChatClientBrotliVersion = " 1.16.0 "
// Windows
implementation( " com.aayushatharva.brotli4j:native-windows-x86_64: $l iveChatClientBrotliVersion " )
implementation( " com.aayushatharva.brotli4j:native-windows-aarch64: $l iveChatClientBrotliVersion " )
// Linux
implementation( " com.aayushatharva.brotli4j:native-linux-armv7: $l iveChatClientBrotliVersion " )
implementation( " com.aayushatharva.brotli4j:native-linux-aarch64: $l iveChatClientBrotliVersion " )
implementation( " com.aayushatharva.brotli4j:native-linux-x86_64: $l iveChatClientBrotliVersion " )
implementation( " com.aayushatharva.brotli4j:native-linux-s390x: $l iveChatClientBrotliVersion " )
implementation( " com.aayushatharva.brotli4j:native-linux-riscv64: $l iveChatClientBrotliVersion " )
implementation( " com.aayushatharva.brotli4j:native-linux-ppc64le: $l iveChatClientBrotliVersion " )
// Mac
implementation( " com.aayushatharva.brotli4j:native-osx-aarch64: $l iveChatClientBrotliVersion " )
implementation( " com.aayushatharva.brotli4j:native-osx-x86_64: $l iveChatClientBrotliVersion " )
導入後も使用できない場合は、プロトオーバー設定項目を修正してください。例えば、 NORMAL_ZLIB
: BilibiliLiveChatClientConfig.builder().protover(ProtoverEnum.NORMAL_ZLIB).roomId("xxx").build()
に変更してください。
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-douyu</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-huya</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-douyin</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-kuaishou</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
テスト クラスには、参照用のさまざまなサンプルが含まれています
onCmdMsg(收到的所有CMD消息)
またはonOtherCmdMsg(框架未处理的CMD消息)
コールバック メソッドをオーバーライドして、フレームワークが定義した CMD タイプをリッスンする CMD を決定できます。
リッスンしたいメッセージ列挙クラスが定義されていない場合は、 onUnknownCmdMsg(未知CMD消息)
メソッドをオーバーライドすることを検討できます。
ICmdMsg型変換対応
@ Override
public void onOtherCmdMsg ( BilibiliCmdEnum cmd , ICmdMsg < BilibiliCmdEnum > cmdMsg ) {
switch ( cmd ) {
case GUARD_BUY : {
// 有人上舰
MessageMsg messageMsg = ( MessageMsg ) cmdMsg ;
...
break ;
}
case SUPER_CHAT_MESSAGE_DELETE : {
// 删除醒目留言
MessageMsg messageMsg = ( MessageMsg ) cmdMsg ;
...
break ;
}
default : {
// ignore
}
}
}
Spring Boot サンプル client-example
他のプラットフォームでの効果を確認する必要がある場合は、
Bilibili
他のプラットフォームに対応した英語に変更し、メッセージ コールバック インターフェイスの関数シグネチャを変更してください。
public class ClientModeExample {
public static void main ( String [] args ) {
String cookie = System . getenv ( "cookie" );
// 1. 创建配置
BilibiliLiveChatClientConfig config = BilibiliLiveChatClientConfig . builder ()
// TODO 消息转发地址
. forwardWebsocketUri ( "" )
// TODO 浏览器Cookie
. cookie ( cookie )
// TODO 直播间id(支持短id)
. roomId ( 7777 )
. build ();
// 2. 创建Client并传入配置、添加消息回调
BilibiliLiveChatClient client = new BilibiliLiveChatClient ( config , new IBilibiliMsgListener () {
@ Override
public void onDanmuMsg ( BilibiliBinaryFrameHandler binaryFrameHandler , DanmuMsgMsg msg ) {
IBilibiliMsgListener . super . onDanmuMsg ( binaryFrameHandler , msg );
System . out . printf ( "%s 收到弹幕 %s %s(%s):%s n " , binaryFrameHandler . getRoomId (), msg . getBadgeLevel () != 0 ? msg . getBadgeLevel () + msg . getBadgeName () : "" , msg . getUsername (), msg . getUid (), msg . getContent ());
}
@ Override
public void onGiftMsg ( BilibiliBinaryFrameHandler binaryFrameHandler , SendGiftMsg msg ) {
IBilibiliMsgListener . super . onGiftMsg ( binaryFrameHandler , msg );
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 ());
}
@ Override
public void onSuperChatMsg ( BilibiliBinaryFrameHandler binaryFrameHandler , SuperChatMessageMsg msg ) {
IBilibiliMsgListener . super . onSuperChatMsg ( binaryFrameHandler , msg );
System . out . printf ( "%s 收到醒目留言 %s(%s):%s n " , binaryFrameHandler . getRoomId (), msg . getUsername (), msg . getUid (), msg . getContent ());
}
@ Override
public void onEnterRoomMsg ( InteractWordMsg msg ) {
System . out . printf ( "%s %s(%s) 进入直播间n " , msg . getBadgeLevel () != 0 ? msg . getBadgeLevel () + msg . getBadgeName () : "" , msg . getUsername (), msg . getUid ());
}
@ Override
public void onLikeMsg ( BilibiliBinaryFrameHandler binaryFrameHandler , LikeInfoV3ClickMsg msg ) {
IBilibiliMsgListener . super . onLikeMsg ( binaryFrameHandler , msg );
System . out . printf ( "%s 收到点赞 %s %s(%s) n " , binaryFrameHandler . getRoomId (), msg . getBadgeLevel () != 0 ? msg . getBadgeLevel () + msg . getBadgeName () : "" , msg . getUsername (), msg . getUid ());
}
@ Override
public void onLiveStatusMsg ( BilibiliBinaryFrameHandler binaryFrameHandler , BilibiliLiveStatusChangeMsg msg ) {
IBilibiliMsgListener . super . onLiveStatusMsg ( binaryFrameHandler , msg );
System . out . printf ( "%s 状态变化 %s n " , binaryFrameHandler . getRoomId (), msg . getLiveStatusAction ());
}
@ Override
public void onRoomStatsMsg ( BilibiliBinaryFrameHandler binaryFrameHandler , BilibiliRoomStatsMsg msg ) {
IBilibiliMsgListener . super . onRoomStatsMsg ( binaryFrameHandler , msg );
System . out . printf ( "%s 统计信息 累计点赞数: %s, 当前观看人数: %s, 累计观看人数: %s n " , binaryFrameHandler . getRoomId (), msg . getLikedCount (), msg . getWatchingCount (), msg . getWatchedCount ());
}
});
// 添加客户端连接状态回调
client . addStatusChangeListener (( evt , oldStatus , newStatus ) -> {
if ( newStatus == ClientStatusEnums . CONNECTED ) {
// TODO 要发送的弹幕内容,请注意控制发送频率;框架内置支持设置发送弹幕的最少时间间隔,小于时将忽略该次发送
client . sendDanmu ( "666666" + RandomUtil . randomNumbers ( 1 ));
}
});
// 3. 开始监听直播间
client . connect ();
}
}
void connect(Runnable success, Consumer<Throwable> failed)
void connect(Runnable success)
void connect()
void disconnect(boolean cancelReconnect)
void disconnect()
void destroy()
void send(Object msg, Runnable success, Consumer<Throwable> failed)
void send(Object msg, Runnable success)
void send(Object msg, Consumer<Throwable> failed)
void send(Object msg)
void sendDanmu(Object danmu, Runnable success, Consumer<Throwable> failed)
void sendDanmu(Object danmu, Runnable success)
void sendDanmu(Object danmu, Consumer<Throwable> failed)
void sendDanmu(Object danmu)
void clickLike(int count, Runnable success, Consumer<Throwable> failed)
void clickLike(int count, Runnable success)
void clickLike(int count, Consumer<Throwable> failed)
void clickLike(int count)
boolean addMsgListener(MsgListener msgListener)
boolean addMsgListeners(List<MsgListener> msgListeners)
boolean removeMsgListener(MsgListener msgListener)
boolean removeMsgListeners(List<MsgListener> msgListeners)
ClientStatusEnums getStatus()
void addStatusChangeListener(IClientStatusChangeListener listener)
void removeStatusChangeListener(IClientStatusChangeListener listener)
参考BilibiliHandlerModeの例
コーデック例を参照
ステーション B の例、他のプラットフォームはbilibili
変更するだけで済みます
Gradleを利用してBステーションのエンコード・デコードモジュールを導入する場合は#Bステーションを参照
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-codec-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
有効範囲: プロジェクト自体のみ。プロジェクトを参照する親プロジェクトには影響しません。
コード内の設定socks5ProxyHost("127.0.0.1")
、 socks5ProxyPort("1080")
を変更します。
ID 認証 (まだテストされていません)
socks5ProxyUsername("username")
、 socks5ProxyPassword("password")
QR コードをスキャンして QQ/WeChat チャネルに参加するか、リンクをクリックして QQ チャネル [OrdinaryRoad]: https://pd.qq.com/s/3id0n7fvs に参加します。
オープンソースは簡単ではありません。皆さんの認識とサポートが、更新を続ける私の最大の動機です。
日付 | ドナー | 額 | メッセージ | チャネル |
---|---|---|---|---|
2024-03-06 | **るい | 88.88 | さあ、男 | ZFB |
2024-03-10 | **ハオ | 88.8 | さあ、ボス | ZFB |
2024-03-25 | **波 | 188.8 | / | ZFB |
2024-04-02 | **ハオ | 30 | / | ZFB |
2024-04-30 | *h | 100 | 上司は素晴らしいです | wx |
2024-11-18 | *レイ | 200 | / | wx |
... | ... | ... | ... | ... |
免責事項: 学術研究のみに使用します。開発者は、関連法に違反し、損害を引き起こす悪用に対して責任を負いません。
キーワード: 弾幕クローラー 弾幕クローラー 弾幕クローラー