Este projeto está em andamento... ?, se você tiver alguma dúvida, envie um problema. Se achar útil, você pode dar uma estrelinha para encorajá-lo.
Se você estiver interessado no projeto, fique à vontade para entrar no canal para discussão e enviar um PR.
Lista de tarefas: https://github.com/orgs/OrdinaryRoad-Project/projects/1
Registro de alterações: https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases
BarrageFly - Deixe as barragens voarem, uma plataforma de encaminhamento, filtragem e processamento de barragens baseada neste projeto
*Existem diferenças de plataforma
- ✅: Plataforma suportada e concluída
- ☑️️: Plataforma suportada, mas não implementada
- : A versão web da plataforma não é suportada atualmente.
plataforma | Cliente de chat ao vivo | Biscoitos | ID curto da sala ao vivo | Enviar barragens | Como o anfitrião | Informações da sala de transmissão ao vivo* |
---|---|---|---|---|---|---|
Estação B de Bilibili | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Douyu Betta | ✅ | ✅ | ✅ | ✅ | ✅ | |
Huya Huya | ✅ | ✅ | ✅ | ✅ | ✅ | |
Douyin Douyin* | ✅ | ☑️️ | ✅ | ☑️ | ☑️️ | ✅ |
Kuaishou Kuaishou | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
TikTok* | ✅ | ✅ | ✅ | ☑️ | ☑️ | ✅ |
*Ainda não totalmente compatível (o Tiktok está em teste)
*As informações da sala de transmissão ao vivo atualmente suportam apenas a obtenção do título da sala de transmissão ao vivo.
plataforma | Barragem | Presente | Mensagem atraente | Entre na sala | Como | mudança de status | Estatísticas | notícias sociais |
---|---|---|---|---|---|---|---|---|
Estação B de Bilibili | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅(Número de curtidas, número atual de pessoas, número acumulado de espectadores) | |
Douyu Betta | ✅ | ✅ | ☑️ | ✅ | ☑️ | |||
Huya Huya | ✅ | ✅ | ✅ (usuários premium) | ☑️ | ||||
Douyin Douyin | ✅ | ✅ | ✅ | ✅(Número de curtidas) | ✅ | ✅(número de curtidas, número atual de pessoas) | ✅(compartilhe, siga) | |
Kuaishou Kuaishou | ✅ | ✅(Informações incompletas sobre o presente) | ✅(Primeira curtida) | ✅(número de curtidas, número atual de pessoas) | ||||
TikTok | ✅ | ✅ | ✅ | ✅(Número de curtidas) | ✅ | ✅(número de curtidas, número atual de pessoas) | ✅(compartilhe, siga) |
Para os métodos integrados da interface de mensagem, 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
Renderizações de operação
Capture o fluxo binário WebSocket do navegador e depois analise e simule o comportamento do navegador. A vantagem desse método é que não requer certificação do desenvolvedor, mas a desvantagem é que não existe um documento oficial, o processo de análise é demorado e trabalhoso; , e precisa se adaptar às mudanças de processo de diferentes plataformas (não muda com frequência)
No futuro, poderemos considerar o suporte a protocolos abertos para a 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 usuários do Gradle: Desde a versão
0.3.2
, na configuração do cliente da estação B, o método de compactação é padronizado comoNORMAL_BROTLI
. Ao usar o Gradle para apresentá-lo, você também precisa apresentar o pacote nativo brotli4j correspondente ao sistema operacional. , consulte: https://github.com /hyperxpro/Brotli4j?tab=readme-ov-file#gradle
Por exemplo:
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 " )
Se ainda não puder ser usado após a introdução, modifique o item de configuração protover, por exemplo, altere-o para 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 >
A classe de teste contém uma variedade de amostras para referência
Você pode substituir onCmdMsg(收到的所有CMD消息)
ou onOtherCmdMsg(框架未处理的CMD消息)
para determinar o CMD para escutar o tipo de CMD que a estrutura definiu.
Se a classe de enumeração de mensagens que você deseja ouvir não estiver definida, considere substituir onUnknownCmdMsg(未知CMD消息)
Correspondência de conversão 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
}
}
}
Exemplo de cliente-exemplo do Spring Boot
Se você precisar verificar o efeito em outras plataformas, altere
Bilibili
para o inglês correspondente a outras plataformas e modifique a assinatura da função da interface de retorno de chamada da mensagem.
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)
ReferênciaBilibiliHandlerModeExample
Exemplo de codec de referência
Exemplo de estação B, outras plataformas só precisam modificar bilibili
Ao usar o Gradle para introduzir o módulo de codificação e decodificação da estação B, consulte a estação #B
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-codec-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Escopo efetivo: apenas o projeto em si não afetará os projetos pais que fazem referência ao projeto
Modifique Config socks5ProxyHost("127.0.0.1")
, socks5ProxyPort("1080")
no código
Autenticação de identidade (ainda não testada)
socks5ProxyUsername("username")
, socks5ProxyPassword("password")
Digitalize o código QR para entrar no canal QQ/WeChat ou clique no link para entrar no canal QQ [OrdinaryRoad]: https://pd.qq.com/s/3id0n7fvs
Código aberto não é fácil, seu reconhecimento e apoio são minha maior motivação para continuar atualizando!
data | Doador | Quantia | mensagem | canal |
---|---|---|---|---|
06/03/2024 | **Rui | 88,88 | Vamos cara | ZFB |
10/03/2024 | **hao | 88,8 | Vamos, chefe | ZFB |
25/03/2024 | **Aceno | 188,8 | / | ZFB |
02/04/2024 | **hao | 30 | / | ZFB |
30/04/2024 | *h | 100 | Chefe é incrível | wx |
18/11/2024 | * Lei | 200 | / | wx |
... | ... | ... | ... | ... |
Isenção de responsabilidade: apenas para uso em pesquisa acadêmica. O desenvolvedor não é responsável por qualquer abuso que viole as leis relevantes e cause danos.
Palavras-chave: rastreador de barragem rastreador de barragem rastreador de barragem