Dieses Projekt ist in Bearbeitung... ?, wenn Sie Fragen haben, senden Sie bitte ein Problem. Wenn Sie es nützlich finden, können Sie ihm einen kleinen Stern geben, um es zu fördern.
Wenn Sie an dem Projekt interessiert sind, können Sie gerne dem Kanal zur Diskussion beitreten und eine PR einreichen.
ToDo-Liste: https://github.com/orgs/OrdinaryRoad-Project/projects/1
Änderungsprotokoll: https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases
BarrageFly – Let the Barrages Fly, eine auf diesem Projekt basierende Plattform zur Weiterleitung, Filterung und Verarbeitung von Sperrfeuern
*Es bestehen Plattformunterschiede
- ✅: Plattform unterstützt und fertiggestellt
- ☑️️: Plattform unterstützt, aber nicht implementiert
- : Die Webversion der Plattform wird derzeit nicht unterstützt.
Plattform | LiveChatClient | Kekse | Kurze Live-Raum-ID | Schick Sperrfeuer | Wie der Gastgeber | Informationen zum Live-Übertragungsraum* |
---|---|---|---|---|---|---|
Bilibili Station B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Douyu Betta | ✅ | ✅ | ✅ | ✅ | ✅ | |
Huya Huya | ✅ | ✅ | ✅ | ✅ | ✅ | |
Douyin Douyin* | ✅ | ☑️️ | ✅ | ☑️ | ☑️️ | ✅ |
Kuaishou Kuaishou | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
TikTok* | ✅ | ✅ | ✅ | ☑️ | ☑️ | ✅ |
*Noch nicht vollständig unterstützt (Tiktok wird getestet)
*Die Live-Übertragungsrauminformationen unterstützen derzeit nur den Erhalt des Live-Übertragungsraumtitels.
Plattform | Sperrfeuer | Geschenk | Auffällige Botschaft | Betreten Sie den Raum | Wie | Statusänderung | Statistiken | soziale Nachrichten |
---|---|---|---|---|---|---|---|---|
Bilibili Station B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅(Anzahl der Likes, aktuelle Personenzahl, kumulierte Zuschauerzahl) | |
Douyu Betta | ✅ | ✅ | ☑️ | ✅ | ☑️ | |||
Huya Huya | ✅ | ✅ | ✅ (Premium-Benutzer) | ☑️ | ||||
Douyin Douyin | ✅ | ✅ | ✅ | ✅(Anzahl der Likes) | ✅ | ✅(Anzahl der Likes, aktuelle Personenzahl) | ✅(teilen, folgen) | |
Kuaishou Kuaishou | ✅ | ✅(Unvollständige Geschenkinformationen) | ✅(Erstes Like) | ✅(Anzahl der Likes, aktuelle Personenzahl) | ||||
TikTok | ✅ | ✅ | ✅ | ✅(Anzahl der Likes) | ✅ | ✅(Anzahl der Likes, aktuelle Personenzahl) | ✅(teilen, folgen) |
Informationen zu den integrierten Methoden der Nachrichtenschnittstelle finden Sie unter 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
Operationsdarstellungen
Erfassen Sie den WebSocket-Binärstrom des Browsers und analysieren und simulieren Sie dann das Verhalten des Browsers. Der Vorteil dieser Methode besteht darin, dass keine Entwicklerzertifizierung erforderlich ist. Der Nachteil besteht jedoch darin, dass es kein offizielles Dokument gibt und der Analyseprozess zeitaufwändig und mühsam ist , und es muss sich an die Prozessänderungen verschiedener Plattformen anpassen (ändert sich nicht oft)
In Zukunft könnten wir darüber nachdenken, offene Protokolle für die Plattform zu unterstützen
JDK≥8
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Hinweis für Gradle-Benutzer: Seit Version
0.3.2
ist die Komprimierungsmethode in der Client-Konfiguration von Station B standardmäßig aufNORMAL_BROTLI
eingestellt. Wenn Sie Gradle zur Einführung verwenden, müssen Sie auch das dem Betriebssystem entsprechende brotli4j-native-Paket einführen , siehe: https://github.com /hyperxpro/Brotli4j?tab=readme-ov-file#gradle
Zum Beispiel:
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 " )
Wenn es nach der Einführung immer noch nicht verwendet werden kann, ändern Sie bitte das Protover-Konfigurationselement, beispielsweise in 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 >
Die Testklasse enthält eine Vielzahl von Beispielen als Referenz
Sie können onCmdMsg(收到的所有CMD消息)
oder onOtherCmdMsg(框架未处理的CMD消息)
überschreiben, um den CMD zu bestimmen, der auf den vom Framework definierten CMD-Typ lauscht.
Wenn die Nachrichtenaufzählungsklasse, die Sie abhören möchten, nicht definiert ist, können Sie erwägen, onUnknownCmdMsg(未知CMD消息)
zu überschreiben
ICmdMsg-Typkonvertierungskorrespondenz
@ 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-Beispiel-Client-Beispiel
Wenn Sie die Auswirkung auf anderen Plattformen überprüfen müssen, ändern Sie bitte
Bilibili
entsprechend den anderen Plattformen in Englisch und ändern Sie die Funktionssignatur der Nachrichtenrückrufschnittstelle.
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)
ReferenceBilibiliHandlerModeExample
Siehe Codec-Beispiel
Beispiel für Station B, andere Bahnsteige müssen nur bilibili
ändern
Wenn Sie Gradle verwenden, um das Codierungs- und Decodierungsmodul der B-Station einzuführen, beziehen Sie sich auf #B-Station
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-codec-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Wirksamer Geltungsbereich: Nur das Projekt selbst, keine Auswirkungen auf übergeordnete Projekte, die auf das Projekt verweisen
Ändern Sie die Konfigurationssocken5ProxyHost socks5ProxyHost("127.0.0.1")
und socks5ProxyPort("1080")
im Code
Identitätsauthentifizierung (noch nicht getestet)
socks5ProxyUsername("username")
, socks5ProxyPassword("password")
Scannen Sie den QR-Code, um dem QQ/WeChat-Kanal beizutreten, oder klicken Sie auf den Link, um dem QQ-Kanal beizutreten [OrdinaryRoad]: https://pd.qq.com/s/3id0n7fvs
Open Source ist nicht einfach, Ihre Anerkennung und Unterstützung sind meine größte Motivation, weiter zu aktualisieren!
Datum | Spender | Menge | Nachricht | Kanal |
---|---|---|---|---|
06.03.2024 | **Rui | 88,88 | Komm schon, Mann | ZFB |
10.03.2024 | **hao | 88,8 | Komm schon, Chef | ZFB |
25.03.2024 | **Welle | 188,8 | / | ZFB |
02.04.2024 | **hao | 30 | / | ZFB |
30.04.2024 | *H | 100 | Chef ist großartig | wx |
18.11.2024 | *Lei | 200 | / | wx |
... | ... | ... | ... | ... |
Haftungsausschluss: Nur für akademische Forschungszwecke. Der Entwickler ist nicht verantwortlich für Missbrauch, der gegen geltende Gesetze verstößt und Schaden verursacht.
Schlüsselwörter: Sperrraupe Sperrraupe Sperrraupe