이 프로젝트는 진행 중입니다... ?, 질문이 있으시면 이슈를 제출해 주세요. 유용하다고 생각하시면 작은 별표를 남겨주시면 감사하겠습니다.
프로젝트에 관심이 있으시면 채널에 참여하여 토론하고 PR을 제출해 주시기 바랍니다.
할 일 목록: https://github.com/orgs/OrdinaryRoad-Project/projects/1
변경 로그: https://github.com/OrdinaryRoad-Project/ordinaryroad-live-chat-client/releases
BarrageFly - 이 프로젝트를 기반으로 한 사격 포워딩, 필터링 및 처리 플랫폼인 Let the barrages fly
*플랫폼 차이가 존재합니다
- ✅: 플랫폼 지원 및 완료
- ✓️️: 플랫폼이 지원되지만 구현되지 않음
- : 현재 웹 버전의 플랫폼은 지원되지 않습니다.
플랫폼 | 라이브챗클라이언트 | 쿠키 | 짧은 라이브 룸 ID | 포격을 보내세요 | 호스트처럼 | 생방송실 정보* |
---|---|---|---|---|---|---|
빌리빌리 스테이션 B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
도유베타 | ✅ | ✅ | ✅ | ✅ | ✅ | |
후야 후야 | ✅ | ✅ | ✅ | ✅ | ✅ | |
두인 두인* | ✅ | ✔️️ | ✅ | ✔️ | ✔️️ | ✅ |
콰이쇼우 콰이쇼우 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
틱톡* | ✅ | ✅ | ✅ | ✔️ | ✔️ | ✅ |
*아직 완전히 지원되지 않습니다. (Tiktok은 테스트 중입니다.)
*현재 생방송 방 정보는 생방송 방 타이틀 획득만 지원합니다.
플랫폼 | 연발 사격 | 선물 | 눈길을 끄는 메시지 | 방에 들어가세요 | 좋다 | 상태 변화 | 통계 | 소셜 뉴스 |
---|---|---|---|---|---|---|---|---|
빌리빌리 스테이션 B | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅(좋아요수, 현재인원수, 누적시청자수) | |
도유베타 | ✅ | ✅ | ✔️ | ✅ | ✔️ | |||
후야 후야 | ✅ | ✅ | ✅ (프리미엄 사용자) | ✔️ | ||||
두인두인 | ✅ | ✅ | ✅ | ✅(좋아요 수) | ✅ | ✅(좋아요 수, 현재 인원수) | ✅(공유, 팔로우) | |
콰이쇼우 콰이쇼우 | ✅ | ✅(선물 정보가 불완전합니다) | ✅(첫번째 좋아요) | ✅(좋아요 수, 현재 인원수) | ||||
틱톡 | ✅ | ✅ | ✅ | ✅(좋아요 수) | ✅ | ✅(좋아요 수, 현재 인원수) | ✅(공유, 팔로우) |
메시지 인터페이스의 내장 메서드는 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)
참조BilibiliHandlerMode예제
참조 코덱 예시
스테이션 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 | 어서 와라 | ZFB |
2024-03-10 | **하오 | 88.8 | 어서 오십시오, 보스 | ZFB |
2024-03-25 | **파도 | 188.8 | / | ZFB |
2024-04-02 | **하오 | 30 | / | ZFB |
2024-04-30 | *시간 | 100 | 사장님 대단해요 | wx |
2024-11-18 | *레이 | 200 | / | wx |
... | ... | ... | ... | ... |
면책 조항: 학술 연구 용도로만 사용됩니다. 관련법을 위반하고 피해를 입히는 악용에 대해서는 개발자가 책임을 지지 않습니다.
키워드: 사격 크롤러 사격 크롤러 사격 크롤러