Este proyecto está en progreso... ?, si tiene alguna pregunta, envíe un problema. Si lo encuentra útil, puede darle una pequeña estrella para alentarlo.
Si está interesado en el proyecto, puede unirse al canal de discusión y enviar un PR.
Lista de tareas pendientes: https://github.com/orgs/OrdinaryRoad-Project/projects/1
Registro de cambios: https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases
BarrageFly: deja volar las presas, una plataforma de procesamiento, filtrado y reenvío de presas basada en este proyecto
*Existen diferencias de plataforma
- ✅: Plataforma soportada y completada
- ☑️️: Plataforma compatible pero no implementada
- : La versión web de la plataforma no es compatible actualmente.
plataforma | Cliente de chat en vivo | Galletas | Identificación corta de sala en vivo | Enviar bombardeos | como el anfitrión | Información de la sala de transmisión en vivo* |
---|---|---|---|---|---|---|
Estación Bilibili B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Douyu Betta | ✅ | ✅ | ✅ | ✅ | ✅ | |
huya huya | ✅ | ✅ | ✅ | ✅ | ✅ | |
Douyin Douyin* | ✅ | ☑️️ | ✅ | ☑️ | ☑️️ | ✅ |
Kuaishou Kuaishou | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Tiktok* | ✅ | ✅ | ✅ | ☑️ | ☑️ | ✅ |
*Aún no es totalmente compatible (Tiktok está en prueba)
*La información de la sala de transmisión en vivo actualmente solo permite obtener el título de la sala de transmisión en vivo.
plataforma | Bombardeo | Regalo | Mensaje llamativo | Entra a la habitación | Como | cambio de estado | Estadística | noticias sociales |
---|---|---|---|---|---|---|---|---|
Estación Bilibili B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅(Número de me gusta, número actual de personas, número acumulado de espectadores) | |
Douyu Betta | ✅ | ✅ | ☑️ | ✅ | ☑️ | |||
huya huya | ✅ | ✅ | ✅ (Usuarios Premium) | ☑️ | ||||
Douyin Douyin | ✅ | ✅ | ✅ | ✅(Número de me gusta) | ✅ | ✅(número de me gusta, número actual de personas) | ✅(compartir, seguir) | |
Kuaishou Kuaishou | ✅ | ✅(Información de regalo incompleta) | ✅(Primer me gusta) | ✅(número de me gusta, número actual de personas) | ||||
tiktok | ✅ | ✅ | ✅ | ✅(Número de me gusta) | ✅ | ✅(número de me gusta, número actual de personas) | ✅(compartir, seguir) |
Para conocer los métodos integrados de la interfaz de mensajes, consulte 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
Representaciones de operación
Capture el flujo binario WebSocket del navegador y luego analice y simule el comportamiento del navegador. La ventaja de este método es que no requiere certificación del desarrollador, pero la desventaja es que no existe un documento oficial y el proceso de análisis requiere mucho tiempo y es laborioso; Y necesita adaptarse a los cambios de proceso de diferentes plataformas (no cambia con frecuencia)
En el futuro, podríamos considerar admitir protocolos abiertos para la plataforma.
JDK≥8
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Nota para los usuarios de Gradle: desde la versión
0.3.2
, en la configuración del cliente de la estación B, el método de compresión predeterminado esNORMAL_BROTLI
. Cuando use Gradle para introducirlo, también debe introducir el paquete nativo brotli4j correspondiente al sistema operativo. , ver: https://github.com /hyperxpro/Brotli4j?tab=readme-ov-file#gradle
Por ejemplo:
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 " )
Si aún no se puede utilizar después de la introducción, modifique el elemento de configuración de protover, por ejemplo, cámbielo a 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 >
La clase de prueba contiene una variedad de muestras como referencia.
Puede anular onCmdMsg(收到的所有CMD消息)
o onOtherCmdMsg(框架未处理的CMD消息)
para determinar el CMD que escuchará el tipo de CMD que el marco ha definido.
Si la clase de enumeración de mensajes que desea escuchar no está definida, puede considerar anular onUnknownCmdMsg(未知CMD消息)
Correspondencia de conversión de tipo 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
}
}
}
Ejemplo de cliente de Spring Boot
Si necesita verificar el efecto en otras plataformas, cambie
Bilibili
al inglés correspondiente a otras plataformas y modifique la firma de función de la interfaz de devolución de llamada del mensaje.
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)
ReferenciaBilibiliHandlerModeEjemplo
Ejemplo de códec de referencia
Ejemplo de estación B, otras plataformas solo necesitan modificar bilibili
Cuando utilice Gradle para introducir el módulo de codificación y decodificación de la estación B, consulte la estación #B
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-codec-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Alcance efectivo: solo el proyecto en sí, no afectará los proyectos principales que hacen referencia al proyecto.
Modifique la configuración socks5ProxyHost("127.0.0.1")
, socks5ProxyPort("1080")
en el código
Autenticación de identidad (aún no probada)
socks5ProxyUsername("username")
, socks5ProxyPassword("password")
Escanee el código QR para unirse al canal QQ/WeChat, o haga clic en el enlace para unirse al canal QQ [OrdinaryRoad]: https://pd.qq.com/s/3id0n7fvs
El código abierto no es fácil, ¡su reconocimiento y apoyo son mi mayor motivación para seguir actualizando!
fecha | Donante | Cantidad | mensaje | canal |
---|---|---|---|---|
2024-03-06 | **Rui | 88,88 | vamos hombre | ZFB |
2024-03-10 | **hao | 88,8 | Vamos jefe | ZFB |
2024-03-25 | **Ola | 188,8 | / | ZFB |
2024-04-02 | **hao | 30 | / | ZFB |
2024-04-30 | *h | 100 | El jefe es increíble | wx |
2024-11-18 | *Lei | 200 | / | wx |
... | ... | ... | ... | ... |
Descargo de responsabilidad: Sólo para uso en investigación académica. El desarrollador no es responsable de ningún abuso que viole las leyes pertinentes y cause daño.
Palabras clave: rastreador de bombardeo rastreador de bombardeo rastreador de bombardeo