Proyek ini sedang dalam proses... ?, jika Anda memiliki pertanyaan, silakan kirimkan masalah. Jika Anda merasa berguna, Anda dapat memberikannya bintang kecil untuk mendorongnya. Terima kasih.
Jika Anda tertarik dengan proyek ini, silakan bergabung dengan saluran ini untuk berdiskusi dan mengirimkan PR.
Daftar Yang Harus Dilakukan: https://github.com/orgs/OrdinaryRoad-Project/projects/1
Ubah log: https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases
BarrageFly - Biarkan rentetan terbang, platform penerusan, pemfilteran, dan pemrosesan rentetan berdasarkan proyek ini
*Perbedaan platform ada
- ✅: Platform didukung dan diselesaikan
- ☑️️: Platform didukung tetapi tidak diterapkan
- : Versi web platform saat ini tidak didukung.
platform | Klien Obrolan Langsung | kue | Id ruang siaran langsung pendek | Kirim serangan | Seperti tuan rumah | Informasi ruang siaran langsung* |
---|---|---|---|---|---|---|
Stasiun Bilibili B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Douyu Cupang | ✅ | ✅ | ✅ | ✅ | ✅ | |
Huya Huya | ✅ | ✅ | ✅ | ✅ | ✅ | |
Douyin Douyin* | ✅ | ☑️️ | ✅ | ☑️ | ☑️️ | ✅ |
Kuaishou Kuaishou | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
TikTok* | ✅ | ✅ | ✅ | ☑️ | ☑️ | ✅ |
*Belum didukung sepenuhnya, (Tiktok sedang dalam pengujian)
*Informasi ruang siaran langsung saat ini hanya mendukung perolehan judul ruang siaran langsung.
platform | Rentetan | Hadiah | Pesan yang menarik | Masuki ruangan | Menyukai | perubahan status | Statistik | berita sosial |
---|---|---|---|---|---|---|---|---|
Stasiun Bilibili B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅(Jumlah suka, jumlah orang saat ini, jumlah kumulatif pemirsa) | |
Douyu Cupang | ✅ | ✅ | ☑️ | ✅ | ☑️ | |||
Huya Huya | ✅ | ✅ | ✅ (Pengguna premium) | ☑️ | ||||
Douyin Douyin | ✅ | ✅ | ✅ | ✅(Jumlah suka) | ✅ | ✅(Jumlah suka, jumlah orang saat ini) | ✅(bagikan, ikuti) | |
Kuaishou Kuaishou | ✅ | ✅(Informasi hadiah tidak lengkap) | ✅(Suka pertama) | ✅(Jumlah suka, jumlah orang saat ini) | ||||
TikTok | ✅ | ✅ | ✅ | ✅(Jumlah suka) | ✅ | ✅(Jumlah suka, jumlah orang saat ini) | ✅(bagikan, ikuti) |
Untuk metode bawaan antarmuka pesan, lihat 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
Rendering operasi
Menangkap aliran biner WebSocket browser, lalu menganalisis dan mensimulasikan perilaku browser. Keuntungan metode ini adalah tidak memerlukan sertifikasi pengembang, tetapi kelemahannya adalah tidak ada dokumen resmi, proses analisis memakan waktu dan tenaga; , dan perlu beradaptasi dengan proses perubahan platform yang berbeda (tidak sering berubah)
Di masa depan, kami mungkin mempertimbangkan untuk mendukung protokol terbuka untuk platform ini
JDK≥8
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Catatan untuk pengguna Gradle: Sejak versi
0.3.2
, dalam konfigurasi klien stasiun B, metode kompresi defaultnya adalahNORMAL_BROTLI
. Saat menggunakan Gradle untuk memperkenalkannya, Anda juga perlu memperkenalkan paket asli brotli4j yang sesuai dengan sistem operasi , lihat: https://github.com /hyperxpro/Brotli4j?tab=readme-ov-file#gradle
Misalnya:
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 " )
Jika masih tidak dapat digunakan setelah pengenalan, silakan ubah item konfigurasi protover, misalnya ubah menjadi 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 >
Kelas tes berisi berbagai sampel untuk referensi
Anda dapat mengganti metode panggilan balik onCmdMsg(收到的所有CMD消息)
atau onOtherCmdMsg(框架未处理的CMD消息)
untuk menentukan CMD agar mendengarkan jenis CMD yang telah ditentukan kerangka kerja.
Jika kelas enumerasi pesan yang ingin Anda dengarkan tidak ditentukan, Anda dapat mempertimbangkan untuk mengganti metode onUnknownCmdMsg(未知CMD消息)
Korespondensi konversi jenis 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
}
}
}
Contoh klien Spring Boot contoh
Jika Anda perlu memeriksa efeknya pada platform lain, harap ubah
Bilibili
ke Bahasa Inggris yang sesuai dengan platform lain, dan ubah tanda tangan fungsi antarmuka panggilan balik pesan.
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)
ReferensiBilibiliHandlerModeContoh
Lihat contoh codec
Contoh stasiun B, platform lain hanya perlu memodifikasi bilibili
Saat menggunakan Gradle untuk memperkenalkan modul pengkodean dan dekode stasiun B, lihat stasiun #B
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-codec-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
Cakupan efektif: hanya proyek itu sendiri, tidak akan mempengaruhi proyek induk yang mereferensikan proyek tersebut
Ubah Config socks5ProxyHost("127.0.0.1")
, socks5ProxyPort("1080")
dalam kode
Otentikasi identitas (belum diuji)
socks5ProxyUsername("username")
, socks5ProxyPassword("password")
Pindai kode QR untuk bergabung dengan saluran QQ/WeChat, atau klik tautan untuk bergabung dengan saluran QQ [OrdinaryRoad]: https://pd.qq.com/s/3id0n7fvs
Open source tidaklah mudah, pengakuan dan dukungan Anda adalah motivasi terbesar saya untuk terus memperbarui!
tanggal | Donor | Jumlah | pesan | saluran |
---|---|---|---|---|
06-03-2024 | **Rui | 88,88 | Ayo kawan | ZFB |
10-03-2024 | ** hao | 88.8 | Ayolah, bos | ZFB |
25-03-2024 | **Melambai | 188.8 | / | ZFB |
02-04-2024 | ** hao | 30 | / | ZFB |
30-04-2024 | *H | 100 | Bos luar biasa | wx |
18-11-2024 | *Lei | 200 | / | wx |
... | ... | ... | ... | ... |
Penafian: Hanya untuk penelitian akademis. Pengembang tidak bertanggung jawab atas penyalahgunaan apa pun yang melanggar hukum terkait dan menyebabkan kerugian.
Kata kunci : rentetan crawler rentetan crawler rentetan crawler