هذا المشروع قيد التقدم... ، إذا كان لديك أي أسئلة، يرجى إرسال مشكلة إذا وجدت أنها مفيدة، يمكنك إعطائها نجمة صغيرة لتشجيعها.
إذا كنت مهتمًا بالمشروع، فنحن نرحب بك للانضمام إلى القناة للمناقشة وتقديم العلاقات العامة.
قائمة المهام: https://github.com/orgs/OrdinaryRoad-Project/projects/1
سجل التغيير: https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases
BarrageFly - دع القذائف تطير، وهي عبارة عن منصة لإعادة توجيه القذائف وتصفيتها ومعالجتها بناءً على هذا المشروع
* توجد اختلافات في النظام الأساسي
- ✅: المنصة مدعومة ومكتملة
- ☑️️: النظام الأساسي مدعوم ولكن لم يتم تنفيذه
- : إصدار الويب للنظام الأساسي غير مدعوم حاليًا.
منصة | LiveChatClient | ملفات تعريف الارتباط | معرف غرفة حية قصيرة | إرسال وابل | مثل المضيف | معلومات غرفة البث المباشر* |
---|---|---|---|---|---|---|
محطة بيليبيلي ب | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
دويو بيتا | ✅ | ✅ | ✅ | ✅ | ✅ | |
هويا هويا | ✅ | ✅ | ✅ | ✅ | ✅ | |
دوين دوين* | ✅ | ☑️️ | ✅ | ☑️ | ☑️️ | ✅ |
كوايشو كوايشو | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
تيك توك* | ✅ | ✅ | ✅ | ☑️ | ☑️ | ✅ |
*غير مدعوم بالكامل حتى الآن (Tiktok قيد الاختبار)
*معلومات غرفة البث المباشر حاليًا تدعم فقط الحصول على لقب غرفة البث المباشر.
منصة | وابل | هدية | رسالة لافتة للنظر | أدخل الغرفة | يحب | تغيير الوضع | إحصائيات | أخبار اجتماعية |
---|---|---|---|---|---|---|---|---|
محطة بيليبيلي ب | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅(عدد الإعجابات، العدد الحالي للأشخاص، العدد التراكمي للمشاهدين) | |
دويو بيتا | ✅ | ✅ | ☑️ | ✅ | ☑️ | |||
هويا هويا | ✅ | ✅ | ✅ (المستخدمون المميزون) | ☑️ | ||||
دوين دوين | ✅ | ✅ | ✅ | ✅(عدد الإعجابات) | ✅ | ✅(عدد الإعجابات، العدد الحالي للأشخاص) | ✅(مشاركة، متابعة) | |
كوايشو كوايشو | ✅ | ✅(معلومات الهدية غير مكتملة) | ✅(أول إعجاب) | ✅(عدد الإعجابات، العدد الحالي للأشخاص) | ||||
تيك توك | ✅ | ✅ | ✅ | ✅(عدد الإعجابات) | ✅ | ✅(عدد الإعجابات، العدد الحالي للأشخاص) | ✅(مشاركة، متابعة) |
للتعرف على الأساليب المضمنة لواجهة الرسائل، راجع https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/tree/main/live-chat-client-commons/live-chat-client- المشاعات-base/src/ main/java/tech/ordinaryroad/live/chat/client/commons/base/msg
الاداءات العملية
التقط الدفق الثنائي WebSocket للمتصفح، ثم قم بتحليل ومحاكاة سلوك المتصفح. ميزة هذه الطريقة هي أنها لا تتطلب شهادة المطور، ولكن العيب هو عدم وجود مستند رسمي، وعملية التحليل تستغرق وقتًا طويلاً وشاقة؛ ، ويحتاج إلى التكيف مع تغييرات العملية الخاصة بالأنظمة الأساسية المختلفة (لا تتغير كثيرًا)
في المستقبل، قد نفكر في دعم البروتوكولات المفتوحة للمنصة
JDK≥8
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
ملاحظة لمستخدمي Gradle: منذ الإصدار
0.3.2
، في تكوين العميل للمحطة B، تم تعيين طريقة الضغط بشكل افتراضي علىNORMAL_BROTLI
. عند استخدام Gradle لتقديمه، تحتاج أيضًا إلى تقديم الحزمة الأصلية brotli4j المطابقة لنظام التشغيل للحصول على التفاصيل ، راجع: https://github.com /hyperxpro/Brotli4j?tab=readme-ov-file#gradle
على سبيل المثال:
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 " )
إذا كان لا يزال لا يمكن استخدامه بعد المقدمة، فيرجى تعديل عنصر تكوين protover، على سبيل المثال، تغييره إلى 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 >
تحتوي فئة الاختبار على مجموعة متنوعة من العينات كمرجع
يمكنك تجاوز طريقة رد الاتصال onCmdMsg(收到的所有CMD消息)
أو onOtherCmdMsg(框架未处理的CMD消息)
لتحديد CMD للاستماع لنوع CMD الذي حدده إطار العمل.
إذا لم يتم تعريف فئة تعداد الرسائل التي تريد الاستماع إليها، فيمكنك التفكير في تجاوز طريقة onUnknownCmdMsg(未知CMD消息)
مراسلات تحويل نوع 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
}
}
}
مثال على التمهيد الربيعي للعميل
إذا كنت بحاجة إلى التحقق من التأثير على الأنظمة الأساسية الأخرى، فيرجى تغيير
Bilibili
إلى اللغة الإنجليزية المقابلة للأنظمة الأساسية الأخرى، وتعديل التوقيع الوظيفي لواجهة رد الاتصال بالرسائل.
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)
مرجع BilibiliHandlerModeExample
مثال على الترميز المرجعي
مثال على المحطة B، المنصات الأخرى تحتاج فقط إلى تعديل bilibili
عند استخدام Gradle لتقديم وحدة التشفير وفك التشفير لمحطة B، راجع محطة #B
< dependency >
< groupId >tech.ordinaryroad</ groupId >
< artifactId >live-chat-client-codec-bilibili</ artifactId >
<!-- 参考github release版本,不需要前缀`v` -->
< version >${ordinaryroad-live-chat-client.version}</ version >
</ dependency >
النطاق الفعال: المشروع نفسه فقط لن يؤثر على المشاريع الأصلية التي تشير إلى المشروع
قم بتعديل تكوين socks5ProxyHost("127.0.0.1")
و socks5ProxyPort("1080")
في الكود
مصادقة الهوية (لم يتم اختبارها بعد)
socks5ProxyUsername("username")
، socks5ProxyPassword("password")
امسح رمز الاستجابة السريعة ضوئيًا للانضمام إلى قناة QQ/WeChat، أو انقر فوق الرابط للانضمام إلى قناة QQ [OrdinaryRoad]: https://pd.qq.com/s/3id0n7fvs
المصدر المفتوح ليس بالأمر السهل، تقديركم ودعمكم هما أكبر دافع لي لمواصلة التحديث!
تاريخ | الجهة المانحة | كمية | رسالة | قناة |
---|---|---|---|---|
2024-03-06 | ** روي | 88.88 | هيا يا رجل | زفب |
2024-03-10 | ** هاو | 88.8 | هيا يا رئيس | زفب |
2024-03-25 | **موجة | 188.8 | / | زفب |
2024-04-02 | ** هاو | 30 | / | زفب |
2024-04-30 | *ح | 100 | مدرب رائع | wx |
2024-11-18 | *لي | 200 | / | wx |
... | ... | ... | ... | ... |
إخلاء المسؤولية: لاستخدام البحث الأكاديمي فقط. المطور غير مسؤول عن أي إساءة تنتهك القوانين ذات الصلة وتسبب الضرر.
الكلمات المفتاحية: زاحف الوابل زاحف الوابل زاحف الوابل