Этот проект находится в стадии разработки... ?, если у вас есть какие-либо вопросы, отправьте сообщение. Если вы найдете его полезным, вы можете поставить ему небольшую звездочку, чтобы поощрить его. Спасибо.
Если вас заинтересовал проект, вы можете присоединиться к каналу для обсуждения и разместить PR.
Список дел: https://github.com/orgs/OrdinaryRoad-Project/projects/1.
Журнал изменений: https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases.
BarrageFly — Let the Barrages Fly, платформа перенаправления, фильтрации и обработки заграждений, основанная на этом проекте.
*Существуют различия в платформах
- ✅: Платформа поддерживается и завершена.
- ☑️️: Платформа поддерживается, но не реализована.
- : Веб-версия платформы в настоящее время не поддерживается.
платформа | LiveChatКлиент | Файлы cookie | Краткий идентификатор живой комнаты | Отправить заграждения | Как хозяин | Информация о комнате прямой трансляции* |
---|---|---|---|---|---|---|
Станция Билибили Б | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Доую Бетта | ✅ | ✅ | ✅ | ✅ | ✅ | |
Хуя Хуя | ✅ | ✅ | ✅ | ✅ | ✅ | |
Дуин Дуин* | ✅ | ☑️️ | ✅ | ☑️ | ☑️️ | ✅ |
Куайшоу Куайшоу | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
ТикТок* | ✅ | ✅ | ✅ | ☑️ | ☑️ | ✅ |
*Пока не полностью поддерживается (Tiktok находится на стадии тестирования)
*Информация о комнате прямой трансляции в настоящее время поддерживает только получение названия комнаты прямой трансляции.
платформа | Заградительный огонь | Подарок | Привлекательное сообщение | Войдите в комнату | Нравиться | изменение статуса | Статистика | социальные новости |
---|---|---|---|---|---|---|---|---|
Станция Билибили Б | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅(Количество лайков, текущее количество людей, совокупное количество зрителей) | |
Доую Бетта | ✅ | ✅ | ☑️ | ✅ | ☑️ | |||
Хуя Хуя | ✅ | ✅ | ✅ (Премиум-пользователи) | ☑️ | ||||
Дуин Дуин | ✅ | ✅ | ✅ | ✅(Количество лайков) | ✅ | ✅(Количество лайков, текущее количество человек) | ✅(поделиться, подписаться) | |
Куайшоу Куайшоу | ✅ | ✅(Неполная информация о подарке) | ✅(Первый лайк) | ✅(Количество лайков, текущее количество человек) | ||||
Тик Ток | ✅ | ✅ | ✅ | ✅(Количество лайков) | ✅ | ✅(Количество лайков, текущее количество человек) | ✅(поделиться, подписаться) |
О встроенных методах интерфейса сообщений см. 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
Рендеринг операций
Захватить двоичный поток 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
}
}
}
Пример клиента Spring Boot
Если вам нужно проверить эффект на других платформах, измените
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")
Отсканируйте QR-код, чтобы присоединиться к каналу 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 | / | ЗФБ |
30 апреля 2024 г. | *час | 100 | Босс потрясающий | шх |
2024-11-18 | *Лей | 200 | / | шх |
... | ... | ... | ... | ... |
Отказ от ответственности: только для академических исследований. Разработчик не несет ответственности за любые злоупотребления, нарушающие соответствующие законы и причиняющие вред.
Ключевые слова: заградительный гусеничный заграждающий гусеничный заграждающий гусеничный