Ce projet est en cours... ?, si vous avez des questions, n'hésitez pas à soumettre un problème. Si vous le trouvez utile, vous pouvez lui donner une petite étoile pour l'encourager.
Si vous êtes intéressé par le projet, vous êtes invités à rejoindre la chaîne pour discuter et soumettre un PR.
Liste de tâches : https://github.com/orgs/OrdinaryRoad-Project/projects/1
Journal des modifications : https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases
BarrageFly - Let the barrages fly, une plateforme d'acheminement, de filtrage et de traitement de barrage basée sur ce projet
*Il existe des différences entre les plateformes
- ✅ : Plateforme supportée et complétée
- ☑️️ : Plateforme prise en charge mais non implémentée
- : La version web de la plateforme n'est actuellement pas supportée.
plate-forme | LiveChatClient | Cookies | ID de salle en direct court | Envoyer des barrages | Comme l'hôte | Informations sur la salle de diffusion en direct* |
---|---|---|---|---|---|---|
Bilibili Station B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Douyu Betta | ✅ | ✅ | ✅ | ✅ | ✅ | |
Huya Huya | ✅ | ✅ | ✅ | ✅ | ✅ | |
Douyin Douyin* | ✅ | ☑️️ | ✅ | ☑️ | ☑️️ | ✅ |
Kuaishou Kuaishou | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Tik Tok* | ✅ | ✅ | ✅ | ☑️ | ☑️ | ✅ |
*Pas encore entièrement pris en charge (Tiktok est en cours de test)
*Les informations sur la salle de diffusion en direct ne prennent actuellement en charge que l'obtention du titre de la salle de diffusion en direct.
plate-forme | Barrage | Cadeau | Message accrocheur | Entrez dans la pièce | Comme | changement de statut | Statistiques | actualités sociales |
---|---|---|---|---|---|---|---|---|
Bilibili Station B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅(Nombre de likes, nombre actuel de personnes, nombre cumulé de téléspectateurs) | |
Douyu Betta | ✅ | ✅ | ☑️ | ✅ | ☑️ | |||
Huya Huya | ✅ | ✅ | ✅ (Utilisateurs Premium) | ☑️ | ||||
Douyin Douyin | ✅ | ✅ | ✅ | ✅(Nombre de j'aime) | ✅ | ✅(Nombre de likes, nombre actuel de personnes) | ✅(partager, suivre) | |
Kuaishou Kuaishou | ✅ | ✅(Informations incomplètes sur le cadeau) | ✅(Premier j'aime) | ✅(Nombre de likes, nombre actuel de personnes) | ||||
Tik Tok | ✅ | ✅ | ✅ | ✅(Nombre de j'aime) | ✅ | ✅(Nombre de likes, nombre actuel de personnes) | ✅(partager, suivre) |
Pour les méthodes intégrées de l'interface de message, voir 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
Rendus d'opération
Capturez le flux binaire WebSocket du navigateur, puis analysez et simulez le comportement du navigateur ; l'avantage de cette méthode est qu'elle ne nécessite pas de certification du développeur, mais l'inconvénient est qu'il n'y a pas de document officiel, le processus d'analyse est long et laborieux. , et il doit s'adapter aux changements de processus des différentes plates-formes (ne change pas souvent)
À l'avenir, nous pourrions envisager de prendre en charge des protocoles ouverts pour la plateforme
JDK≥8
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Note pour les utilisateurs de Gradle : Depuis la version
0.3.2
, dans la configuration client de la station B, la méthode de compression est par défautNORMAL_BROTLI
. Lorsque vous utilisez Gradle pour l'introduire, vous devez également introduire le package natif brotli4j correspondant au système d'exploitation pour plus de détails. , voir : https://github.com /hyperxpro/Brotli4j?tab=readme-ov-file#gradle
Par exemple:
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 " )
S'il ne peut toujours pas être utilisé après l'introduction, veuillez modifier l'élément de configuration du protover, par exemple, changez-le en 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 classe de test contient une variété d'échantillons pour référence
Vous pouvez remplacer onCmdMsg(收到的所有CMD消息)
ou onOtherCmdMsg(框架未处理的CMD消息)
pour déterminer le CMD à écouter pour le type CMD défini par l'infrastructure.
Si la classe d'énumération des messages que vous souhaitez écouter n'est pas définie, vous pouvez envisager de remplacer onUnknownCmdMsg(未知CMD消息)
Correspondance de conversion de type 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
}
}
}
Exemple de client-exemple Spring Boot
Si vous devez vérifier l'effet sur d'autres plateformes, veuillez changer
Bilibili
en anglais correspondant aux autres plateformes et modifier la signature de fonction de l'interface de rappel de message.
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)
RéférenceBilibiliHandlerModeExemple
Reportez-vous à l'exemple de codec
Exemple de station B, les autres quais n'ont qu'à modifier bilibili
Lorsque vous utilisez Gradle pour introduire le module d'encodage et de décodage de la station B, reportez-vous à la station #B
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-codec-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Portée effective : seul le projet lui-même n'affectera pas les projets parents qui font référence au projet
Modifier Config socks5ProxyHost("127.0.0.1")
, socks5ProxyPort("1080")
dans le code
Authentification d'identité (pas encore testée)
socks5ProxyUsername("username")
, socks5ProxyPassword("password")
Scannez le code QR pour rejoindre la chaîne QQ/WeChat, ou cliquez sur le lien pour rejoindre la chaîne QQ [OrdinaryRoad] : https://pd.qq.com/s/3id0n7fvs
L'open source n'est pas facile, votre reconnaissance et votre soutien sont ma plus grande motivation pour continuer à mettre à jour !
date | Donneur | Montant | message | canal |
---|---|---|---|---|
2024-03-06 | **Rui | 88,88 | Allez mec | ZFB |
2024-03-10 | **hao | 88,8 | Allez, patron | ZFB |
2024-03-25 | **Vague | 188,8 | / | ZFB |
2024-04-02 | **hao | 30 | / | ZFB |
2024-04-30 | *h | 100 | Le patron est génial | wx |
2024-11-18 | *Lei | 200 | / | wx |
... | ... | ... | ... | ... |
Avis de non-responsabilité : réservé à la recherche universitaire. Le développeur n'est pas responsable de tout abus qui viole les lois en vigueur et cause un préjudice.
Mots-clés : barrage sur chenilles barrage sur chenilles barrage sur chenilles