Compare commits
3 Commits
9521e9d5c8
...
590c54b777
Author | SHA1 | Date | |
---|---|---|---|
590c54b777 | |||
ac7f076721 | |||
91fe70c1b8 |
@ -1,32 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.yutou</groupId>
|
||||
<artifactId>bilibili</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>biliapi</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>io.reactivex.rxjava3</groupId>
|
||||
<artifactId>rxjava</artifactId>
|
||||
<version>3.1.8</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.aayushatharva.brotli4j</groupId>
|
||||
<artifactId>brotli4j</artifactId>
|
||||
<version>1.16.0</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
@ -1,192 +0,0 @@
|
||||
package com.yutou;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.bili.api.LiveApi;
|
||||
import com.yutou.bili.api.UserApi;
|
||||
import com.yutou.bili.bean.live.LiveRoomConfig;
|
||||
import com.yutou.bili.bean.live.LiveRoomPlayInfo;
|
||||
import com.yutou.bili.bean.live.SpiBean;
|
||||
import com.yutou.bili.bean.login.LoginCookie;
|
||||
import com.yutou.bili.bean.login.UserInfoBean;
|
||||
import com.yutou.bili.enums.LiveProtocol;
|
||||
import com.yutou.bili.enums.LiveVideoCodec;
|
||||
import com.yutou.bili.enums.LiveVideoDefinition;
|
||||
import com.yutou.bili.enums.LiveVideoFormat;
|
||||
import com.yutou.bili.net.BiliLiveNetApiManager;
|
||||
import com.yutou.bili.net.BiliLoginNetApiManager;
|
||||
import com.yutou.bili.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.bili.net.BiliUserNetApiManager;
|
||||
import com.yutou.bili.net.WebSocketManager;
|
||||
import com.yutou.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.okhttp.HttpCallback;
|
||||
import com.yutou.okhttp.HttpLoggingInterceptor;
|
||||
import com.yutou.utils.Log;
|
||||
import jakarta.xml.bind.DatatypeConverter;
|
||||
import okhttp3.Headers;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
HttpLoggingInterceptor.setLog(false);
|
||||
HttpLoggingInterceptor.setLog(true);
|
||||
// getPlayUrl();
|
||||
LiveRoomConfig config=new LiveRoomConfig();
|
||||
LoginCookie cookie = BiliBiliLoginDatabase.getInstance().get();
|
||||
config.setLogin(true);
|
||||
config.setUid(cookie.getDedeUserID());
|
||||
config.setRoomId(String.valueOf(855204));
|
||||
config.setRoomId(String.valueOf(22642754));
|
||||
config.setRoomId(String.valueOf(81004));
|
||||
WebSocketManager.getInstance().addRoom(config);
|
||||
}
|
||||
|
||||
|
||||
public static void testSocket(SpiBean spi) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
// json.put("roomid", "32805602");
|
||||
json.put("roomid", "855204");
|
||||
json.put("protover", "3");
|
||||
json.put("platform", "web");
|
||||
json.put("type", 2);
|
||||
json.put("buvid",spi.getB_3());
|
||||
json.put("key", "aaaabbb");
|
||||
Log.i(json);
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
// outputStream.write(toLH(json.toString().length() + 16));
|
||||
outputStream.write(new byte[]{0, 0, 1, 68, 0, 16, 0, 1, 0, 0, 0, 7, 0, 0, 0, 1});
|
||||
outputStream.write(json.toJSONString().getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.flush();
|
||||
System.out.println("\n\n\n");
|
||||
String str = DatatypeConverter.printHexBinary(outputStream.toByteArray());
|
||||
for (int i = 0; i < str.length(); i = i + 4) {
|
||||
if (i % 32 == 0 && i != 0) {
|
||||
System.out.println();
|
||||
}
|
||||
if (str.length() - i > 4) {
|
||||
System.out.print(str.substring(i, i + 4) + " ");
|
||||
} else {
|
||||
System.out.println(str.substring(i));
|
||||
}
|
||||
}
|
||||
System.out.println("\n\n\n");
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void getPlayUrl() {
|
||||
BiliLiveNetApiManager
|
||||
.getInstance()
|
||||
.getApi(new IHttpApiCheckCallback<LiveApi>() {
|
||||
@Override
|
||||
public void onSuccess(LiveApi api) {
|
||||
String roomId = "32805602";
|
||||
String mid = "68057278";
|
||||
|
||||
// roomId="42062";
|
||||
|
||||
api.getLiveRoomPlayInfo(
|
||||
roomId,
|
||||
LiveProtocol.getAll(),
|
||||
LiveVideoFormat.getAll(),
|
||||
LiveVideoCodec.getAll(),
|
||||
LiveVideoDefinition.ORIGINAL.getValue()
|
||||
).enqueue(new HttpCallback<>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers, int code, String status, LiveRoomPlayInfo response, String rawResponse) {
|
||||
LiveRoomPlayInfo.Codec codec = response.getPlayurlInfo().getPlayurl().getStream().get(0).getFormat().get(0).getCodec().get(0);
|
||||
|
||||
LiveRoomConfig config = new LiveRoomConfig();
|
||||
config.setUid("0");
|
||||
config.setRoomId(roomId);
|
||||
config.setMid(mid);
|
||||
config.setLogin(false);
|
||||
WebSocketManager.getInstance().addRoom(config);
|
||||
|
||||
/*String url = codec.getUrlInfo().get(0).getHost() + codec.getBaseUrl() + codec.getUrlInfo().get(0).getExtra();
|
||||
System.out.println("下载url = " + url);
|
||||
api.downloadLive(url).enqueue(new FileCallback<>(response) {
|
||||
@Override
|
||||
public void onStart(LiveRoomPlayInfo bean) {
|
||||
System.out.println("开始下载");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onDownload(Headers headers, LiveRoomPlayInfo bean, long len, long total) {
|
||||
System.out.println("下载中:"+len+"|"+total);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish(LiveRoomPlayInfo bean) {
|
||||
System.out.println("下载结束");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(LiveRoomPlayInfo bean, Throwable throwable) {
|
||||
System.out.println("下载失败");
|
||||
}
|
||||
});*/
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String error) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void login(String username, String password) {
|
||||
BiliLoginNetApiManager.getInstance().login(new HttpCallback<LoginCookie>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers, int code, String status, LoginCookie response, String rawResponse) {
|
||||
System.out.println("headers = " + headers + ", code = " + code + ", status = " + status + ", response = " + response + ", rawResponse = " + rawResponse);
|
||||
if (code == BiliLoginNetApiManager.LOGIN_SUCCESS) {
|
||||
BiliBiliLoginDatabase.getInstance().initData(response).close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void getUserInfo() {
|
||||
BiliUserNetApiManager.getInstance().getUserApi(new IHttpApiCheckCallback<UserApi>() {
|
||||
@Override
|
||||
public void onSuccess(UserApi api) {
|
||||
api.getUserInfo().enqueue(new HttpCallback<UserInfoBean>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers, int code, String status, UserInfoBean response, String rawResponse) {
|
||||
System.out.println("response = " + rawResponse);
|
||||
System.out.println(response);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String error) {
|
||||
System.out.println("code = " + code + ", error = " + error);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
package com.yutou.bili.bean.live;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LiveRoomConfig {
|
||||
String uid;
|
||||
String roomId;
|
||||
String mid;//真实房间id
|
||||
boolean isLogin;
|
||||
LiveDanmuInfo liveInfo;
|
||||
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
package com.yutou.bili.databases;
|
||||
|
||||
import com.yutou.bili.bean.login.LoginCookie;
|
||||
import com.yutou.databases.SQLiteManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class BiliBiliLoginDatabase extends SQLiteManager {
|
||||
LoginCookie cookie;
|
||||
private static BiliBiliLoginDatabase instance;
|
||||
|
||||
private BiliBiliLoginDatabase(Class<LoginCookie> tClass) {
|
||||
try {
|
||||
cookie = new LoginCookie();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
init();
|
||||
}
|
||||
|
||||
public static BiliBiliLoginDatabase getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new BiliBiliLoginDatabase(LoginCookie.class);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
public BiliBiliLoginDatabase initData(LoginCookie cookie) {
|
||||
this.cookie = cookie;
|
||||
for (BuildSqlTable table : build.getTable()) {
|
||||
cookie.setTableName(table.getName());
|
||||
add(cookie);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public LoginCookie get() {
|
||||
List<LoginCookie> list = super.get(cookie.getTableName(), LoginCookie.class);
|
||||
if (!list.isEmpty()) {
|
||||
return list.get(0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected LoginCookie getDataBean() {
|
||||
return new LoginCookie();
|
||||
}
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
@ -1,39 +0,0 @@
|
||||
package com.yutou.bili.net;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.bili.api.LiveApi;
|
||||
import com.yutou.bili.bean.login.LoginCookie;
|
||||
import com.yutou.bili.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.okhttp.api.BaseApi;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class BiliLiveNetApiManager extends BaseApi {
|
||||
private static BiliLiveNetApiManager instance;
|
||||
|
||||
public static BiliLiveNetApiManager getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new BiliLiveNetApiManager("https://api.live.bilibili.com");
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
private BiliLiveNetApiManager(String URL) {
|
||||
super(URL);
|
||||
}
|
||||
|
||||
public void getApi(IHttpApiCheckCallback<LiveApi> callback) {
|
||||
LoginCookie cookie = BiliBiliLoginDatabase.getInstance().get();
|
||||
if (cookie != null) {
|
||||
useCookie(JSONObject.parseObject(JSONObject.toJSONString(cookie)));
|
||||
}
|
||||
HashMap<String,String> header=new HashMap<>();
|
||||
header.put("Accept-Language", "zh-CN,zh;q=0.8");
|
||||
header.put("Referer", "https://live.bilibili.com");
|
||||
header.put("Connection", "keep-alive");
|
||||
header.put("Upgrade-Insecure-Requests", "1");
|
||||
addHeader(header);
|
||||
callback.onSuccess(createApi(LiveApi.class));
|
||||
}
|
||||
}
|
@ -1,248 +0,0 @@
|
||||
package com.yutou.bili.net;
|
||||
|
||||
import com.aayushatharva.brotli4j.Brotli4jLoader;
|
||||
import com.aayushatharva.brotli4j.decoder.Decoder;
|
||||
import com.aayushatharva.brotli4j.decoder.DecoderJNI;
|
||||
import com.aayushatharva.brotli4j.decoder.DirectDecompress;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.bili.api.LiveApi;
|
||||
import com.yutou.bili.bean.live.LiveDanmuInfo;
|
||||
import com.yutou.bili.bean.live.LiveRoomConfig;
|
||||
import com.yutou.bili.bean.websocket.WebSocketBody;
|
||||
import com.yutou.bili.bean.websocket.WebSocketHeader;
|
||||
import com.yutou.bili.bean.websocket.live.WSData;
|
||||
import com.yutou.bili.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.bili.utils.BiliUserUtils;
|
||||
import com.yutou.bili.utils.BytesUtils;
|
||||
import com.yutou.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.okhttp.HttpCallback;
|
||||
import com.yutou.utils.Log;
|
||||
import okhttp3.Headers;
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
public class WebSocketManager {
|
||||
private static WebSocketManager instance;
|
||||
Map<LiveRoomConfig, WebSocketClientTh> roomMap;
|
||||
|
||||
private WebSocketManager() {
|
||||
roomMap = new HashMap<>();
|
||||
}
|
||||
|
||||
public static WebSocketManager getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new WebSocketManager();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public void addRoom(LiveRoomConfig roomConfig) {
|
||||
BiliLiveNetApiManager.getInstance().getApi(new IHttpApiCheckCallback<LiveApi>() {
|
||||
@Override
|
||||
public void onSuccess(LiveApi api) {
|
||||
api.getLiveRoomDanmuInfo(roomConfig.getRoomId()).enqueue(new HttpCallback<LiveDanmuInfo>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers, int code, String status, LiveDanmuInfo response, String rawResponse) {
|
||||
if (!response.getHostList().isEmpty()) {
|
||||
LiveDanmuInfo.Host host = response.getHostList().get(0);
|
||||
String url = "wss://" + host.getHost() + ":" + host.getWssPort() + "/sub";
|
||||
// url="ws://127.0.0.1:8765";
|
||||
try {
|
||||
roomConfig.setLiveInfo(response);
|
||||
new WebSocketClientTh(new URI(url), roomConfig);
|
||||
} catch (URISyntaxException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String error) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static class WebSocketClientTh extends WebSocketClient {
|
||||
private LiveRoomConfig roomConfig;
|
||||
private HeartbeatTask heartbeatTask;
|
||||
|
||||
|
||||
public WebSocketClientTh(URI serverUri, LiveRoomConfig roomId) {
|
||||
super(serverUri);
|
||||
this.roomConfig = roomId;
|
||||
heartbeatTask = new HeartbeatTask();
|
||||
connect();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOpen(ServerHandshake serverHandshake) {
|
||||
WebSocketManager.getInstance().roomMap.put(roomConfig, this);
|
||||
heartbeatTask.setSocket(this);
|
||||
heartbeatTask.sendInitAuthData();
|
||||
new Timer().schedule(heartbeatTask, 1000, 30000);
|
||||
System.out.println("WebSocketClientTh.onOpen");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(String s) {
|
||||
System.out.println("s = " + s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(ByteBuffer bytes) {
|
||||
System.out.println("WebSocketClientTh.onMessage");
|
||||
super.onMessage(bytes);
|
||||
decompress(bytes.array());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose(int i, String s, boolean b) {
|
||||
System.out.println("WebSocketClientTh.onClose");
|
||||
System.out.println("i = " + i + ", s = " + s + ", b = " + b);
|
||||
WebSocketManager.getInstance().roomMap.remove(roomConfig);
|
||||
heartbeatTask.cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception e) {
|
||||
System.out.println("WebSocketClientTh.onError");
|
||||
e.printStackTrace();
|
||||
WebSocketManager.getInstance().roomMap.remove(roomConfig);
|
||||
heartbeatTask.cancel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 解压缩
|
||||
*
|
||||
* @param data 待压缩的数据
|
||||
*/
|
||||
public void decompress(byte[] data) {
|
||||
byte[] bytes = new byte[data.length - 16];
|
||||
WebSocketHeader header = new WebSocketHeader(data);
|
||||
System.arraycopy(data, header.getHeaderSize(), bytes, 0, data.length - header.getHeaderSize());
|
||||
System.out.println("数据大小:" + header.getDataSize() + " 协议:" + header.getAgree() + " 头部大小:" + header.getHeaderSize() + " 命令:" + header.getCmdData());
|
||||
switch (header.getAgree()) {
|
||||
case 0:
|
||||
case 1:
|
||||
danmu(bytes);
|
||||
break;
|
||||
default:
|
||||
unzipDanmu(bytes, header.getAgree() == 3);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void danmu(byte[] bytes) {
|
||||
Log.i("未压缩:" + new String(bytes));
|
||||
}
|
||||
|
||||
private void unzipDanmu(byte[] bytes, boolean useHeader) {
|
||||
try {
|
||||
Brotli4jLoader.ensureAvailability();
|
||||
DirectDecompress directDecompress = Decoder.decompress(bytes);
|
||||
if (directDecompress.getResultStatus() == DecoderJNI.Status.DONE) {
|
||||
WebSocketBody body = new WebSocketBody(directDecompress.getDecompressedData());
|
||||
Log.i("3协议:" + useHeader + " 命令数:" + body.getBodyList().size());
|
||||
for (JSONObject json : body.getBodyList()) {
|
||||
Log.i("解压:" + WSData.parse(json));
|
||||
}
|
||||
System.out.println();
|
||||
System.out.println();
|
||||
} else {
|
||||
Log.e(new RuntimeException("解压失败"));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private class HeartbeatTask extends TimerTask {
|
||||
WebSocketClientTh socket;
|
||||
|
||||
public void setSocket(WebSocketClientTh socket) {
|
||||
this.socket = socket;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
// com.yutou.bilibili.Tools.Log.i("-------发送心跳--------");
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
outputStream.write(BytesUtils.toLH("[object Object]".length() + 16));
|
||||
outputStream.write(new byte[]{0, 16, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1});
|
||||
outputStream.write("[object Object]".getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.flush();
|
||||
socket.send(outputStream.toByteArray());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void sendInitAuthData() {
|
||||
JSONObject json = new JSONObject();
|
||||
if (roomConfig.isLogin()) {
|
||||
json.put("uid", Long.parseLong(roomConfig.getUid()));
|
||||
|
||||
} else {
|
||||
json.put("uid", 0);
|
||||
}
|
||||
BiliUserUtils.getBuvid(new IHttpApiCheckCallback<String>() {
|
||||
@Override
|
||||
public void onSuccess(String api) {
|
||||
try {
|
||||
json.put("roomid", Long.parseLong(roomConfig.getRoomId()));
|
||||
json.put("protover", 3);
|
||||
json.put("buvid", api);
|
||||
json.put("platform", "web");
|
||||
json.put("type", 2);
|
||||
json.put("key", roomConfig.getLiveInfo().getToken());
|
||||
byte[] bytes = {0, 16, 0, 1, 0, 0, 0, 7, 0, 0, 0, 1};
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
System.out.println("bytes.length = " + bytes.length);
|
||||
Log.i(json);
|
||||
outputStream.write(BytesUtils.toLH(json.toString().length() + 16));
|
||||
outputStream.write(bytes);
|
||||
outputStream.write(json.toJSONString().getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.flush();
|
||||
BytesUtils.printHex(outputStream.toByteArray());
|
||||
System.out.println(socket.isOpen());
|
||||
socket.send(outputStream.toByteArray());
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String error) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
package com.yutou.bili.utils;
|
||||
|
||||
import com.yutou.bili.api.UserApi;
|
||||
import com.yutou.bili.bean.live.SpiBean;
|
||||
import com.yutou.bili.net.BiliUserNetApiManager;
|
||||
import com.yutou.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.okhttp.HttpCallback;
|
||||
import com.yutou.utils.RedisTools;
|
||||
import okhttp3.Headers;
|
||||
|
||||
public class BiliUserUtils {
|
||||
public static void getBuvid(IHttpApiCheckCallback<String> callback) {
|
||||
String buvid= RedisTools.get(RedisTools.BILI_USER_BUVID);
|
||||
if(buvid!=null){
|
||||
callback.onSuccess(buvid);
|
||||
return;
|
||||
}
|
||||
BiliUserNetApiManager.getInstance().getUserApi(new IHttpApiCheckCallback<UserApi>() {
|
||||
@Override
|
||||
public void onSuccess(UserApi api) {
|
||||
api.getFingerSpi().enqueue(new HttpCallback<SpiBean>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers, int code, String status, SpiBean response, String rawResponse) {
|
||||
RedisTools.set(RedisTools.BILI_USER_BUVID,response.getB_3());
|
||||
callback.onSuccess(response.getB_3());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String error) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.yutou</groupId>
|
||||
<artifactId>bilibili</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>common</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>4.12.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.squareup.retrofit2/retrofit -->
|
||||
<dependency>
|
||||
<groupId>com.squareup.retrofit2</groupId>
|
||||
<artifactId>retrofit</artifactId>
|
||||
<version>2.11.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
@ -1,17 +0,0 @@
|
||||
package com.yutou.databases;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.alibaba.fastjson2.JSONWriter;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AbsDatabasesBean {
|
||||
String tableName;
|
||||
|
||||
|
||||
public JSONObject toJson() {
|
||||
JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(this, JSONWriter.Feature.WriteMapNullValue));
|
||||
json.remove("tableName");
|
||||
return json;
|
||||
}
|
||||
}
|
@ -1,302 +0,0 @@
|
||||
package com.yutou.databases;
|
||||
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.utils.Log;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Field;
|
||||
import java.sql.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class SQLiteManager {
|
||||
protected Connection conn;
|
||||
private String url = "jdbc:sqlite:";
|
||||
private File sql;
|
||||
@Getter
|
||||
public BuildSql build;
|
||||
|
||||
public void init() {
|
||||
AbsDatabasesBean data = getDataBean();
|
||||
List<BuildSqlItem> items = new ArrayList<>();
|
||||
Field[] fields = data.getClass().getDeclaredFields();
|
||||
for (Field field : fields) {
|
||||
String name = field.getAnnotation(JSONField.class).name();
|
||||
if (name.equals("tableName")) continue;
|
||||
String type = BuildSqlItem.TYPE_STRING;
|
||||
if (field.getType() == int.class) {
|
||||
type = BuildSqlItem.TYPE_INT;
|
||||
} else if (field.getType() == String.class) {
|
||||
type = BuildSqlItem.TYPE_STRING;
|
||||
} else if (field.getType() == Date.class) {
|
||||
type = BuildSqlItem.TYPE_TIME;
|
||||
}
|
||||
items.add(BuildSqlItem.create().setName(name).setType(type).setNull(true).setKey(false));
|
||||
}
|
||||
BuildSql sql = BuildSql.create()
|
||||
.setFileName("bilibili_login.db")
|
||||
.setTable(BuildSqlTable.create().setName(data.getTableName()).setItem(items));
|
||||
build(sql);
|
||||
}
|
||||
|
||||
|
||||
public void startBatch() {
|
||||
try {
|
||||
conn.setAutoCommit(false);
|
||||
} catch (SQLException e) {
|
||||
Log.e(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void closeBatch() {
|
||||
try {
|
||||
conn.setAutoCommit(true);
|
||||
} catch (SQLException e) {
|
||||
Log.e(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void close() {
|
||||
try {
|
||||
conn.close();
|
||||
} catch (SQLException throwables) {
|
||||
throwables.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void commit() {
|
||||
try {
|
||||
conn.commit();
|
||||
} catch (SQLException e) {
|
||||
Log.e(e);
|
||||
}
|
||||
}
|
||||
|
||||
public <T extends AbsDatabasesBean> void add(T t) {
|
||||
try {
|
||||
Statement statement = conn.createStatement();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
StringBuilder value = new StringBuilder();
|
||||
sb.append("INSERT INTO `").append(t.getTableName()).append("` ");
|
||||
sb.append("(");
|
||||
value.append("(");
|
||||
for (String key : t.toJson().keySet()) {
|
||||
sb.append("`").append(key).append("`,");
|
||||
value.append("'").append(t.toJson().get(key)).append("',");
|
||||
}
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
value.deleteCharAt(value.length() - 1);
|
||||
value.append(")");
|
||||
sb.append(") VALUES ");
|
||||
sb.append(value);
|
||||
statement.executeUpdate(sb.toString());
|
||||
statement.close();
|
||||
} catch (SQLException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public <T extends AbsDatabasesBean> List<T> get(String table, Class<T> tClass) {
|
||||
List<T> list = new ArrayList<>();
|
||||
try {
|
||||
Statement statement = conn.createStatement();
|
||||
String sql = "SELECT * FROM `" + table + "`";
|
||||
ResultSet resultSet = statement.executeQuery(sql);
|
||||
while (resultSet.next()) {
|
||||
JSONObject json = new JSONObject();
|
||||
for (int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
|
||||
String name = resultSet.getMetaData().getColumnName(i + 1);
|
||||
json.put(name, resultSet.getObject(name));
|
||||
}
|
||||
list.add(json.to(tClass));
|
||||
}
|
||||
resultSet.close();
|
||||
statement.closeOnCompletion();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
private void createSql(BuildSql build) {
|
||||
try {
|
||||
sql.mkdirs();
|
||||
sql.delete();
|
||||
conn = DriverManager.getConnection(url + sql.getAbsolutePath());
|
||||
} catch (Exception e) {
|
||||
Log.e(e);
|
||||
}
|
||||
startBatch();
|
||||
for (BuildSqlTable table : build.getTable()) {
|
||||
Log.i("创建表:" + table.getName());
|
||||
createSqlOfTable(table);
|
||||
}
|
||||
closeBatch();
|
||||
}
|
||||
|
||||
private void createSqlOfTable(BuildSqlTable table) {
|
||||
String tableName = table.getName();
|
||||
try {
|
||||
Statement statement = conn.createStatement();
|
||||
List<BuildSqlItem> items = table.getItem();
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("CREATE TABLE `")
|
||||
.append(tableName)
|
||||
.append("` (");
|
||||
for (BuildSqlItem item : items) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
String type = switch (item.getType()) {
|
||||
case "int" -> " INTEGER ";
|
||||
case "TIME" -> " NUMERIC ";
|
||||
default -> " TEXT ";
|
||||
};
|
||||
builder.append("`")
|
||||
.append(item.getName())
|
||||
.append("`")
|
||||
.append(type)
|
||||
.append(item.isNull() ? "" : " NOT NULL ")
|
||||
.append(item.isKey() ? " PRIMARY KEY AUTOINCREMENT " : "")
|
||||
.append(",");
|
||||
sql.append(builder.toString());
|
||||
}
|
||||
sql.append(");");
|
||||
System.out.println("创建表 > " + sql.toString());
|
||||
statement.execute(sql.toString().replace(",);", ");"));
|
||||
statement.closeOnCompletion();
|
||||
} catch (Exception e) {
|
||||
Log.e(e);
|
||||
}
|
||||
}
|
||||
|
||||
protected void build(BuildSql buildSql) {
|
||||
try {
|
||||
this.build = buildSql;
|
||||
Class.forName("org.sqlite.JDBC");
|
||||
sql = new File("databases" + File.separator + buildSql.getFileName());
|
||||
if (!sql.exists()) {
|
||||
createSql(buildSql);
|
||||
} else {
|
||||
conn = DriverManager.getConnection(url + sql.getAbsolutePath());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(e);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean setDB(String fileName) {
|
||||
try {
|
||||
Class.forName("org.sqlite.JDBC");
|
||||
sql = new File("db" + File.separator + fileName);
|
||||
if (sql.exists()) {
|
||||
if (conn != null && !conn.isClosed()) {
|
||||
conn.close();
|
||||
}
|
||||
conn = DriverManager.getConnection(url + sql.getAbsolutePath());
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
protected abstract AbsDatabasesBean getDataBean();
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class BuildSql {
|
||||
String fileName;
|
||||
List<BuildSqlTable> table;
|
||||
|
||||
public static BuildSql create() {
|
||||
return new BuildSql();
|
||||
}
|
||||
|
||||
public BuildSql setFileName(String fileName) {
|
||||
this.fileName = fileName;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BuildSql setTable(List<BuildSqlTable> table) {
|
||||
this.table = table;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BuildSql setTable(BuildSqlTable... table) {
|
||||
this.table = List.of(table);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class BuildSqlTable {
|
||||
String name;
|
||||
List<BuildSqlItem> item;
|
||||
|
||||
public static BuildSqlTable create() {
|
||||
return new BuildSqlTable();
|
||||
}
|
||||
|
||||
public BuildSqlTable setName(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BuildSqlTable setItem(List<BuildSqlItem> item) {
|
||||
this.item = item;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BuildSqlTable setItem(BuildSqlItem... item) {
|
||||
this.item = List.of(item);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class BuildSqlItem {
|
||||
public static final String TYPE_INT = "init";
|
||||
public static final String TYPE_STRING = "String";
|
||||
public static final String TYPE_TIME = "TIME";
|
||||
|
||||
|
||||
String name;
|
||||
String type;
|
||||
boolean isNull;
|
||||
boolean isKey;
|
||||
|
||||
public static BuildSqlItem create() {
|
||||
return new BuildSqlItem();
|
||||
}
|
||||
|
||||
public BuildSqlItem setName(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BuildSqlItem setType(String type) {
|
||||
this.type = type;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BuildSqlItem setNull(boolean aNull) {
|
||||
isNull = aNull;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BuildSqlItem setKey(boolean key) {
|
||||
isKey = key;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
74
pom.xml
74
pom.xml
@ -14,14 +14,9 @@
|
||||
<packaging>pom</packaging>
|
||||
<name>bilibili</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
<modules>
|
||||
<module>biliapi</module>
|
||||
<module>qqbot</module>
|
||||
<module>common</module>
|
||||
</modules>
|
||||
<properties>
|
||||
<java.version>21</java.version>
|
||||
<kotlin.version>1.6.10</kotlin.version>
|
||||
<kotlin.version>1.7.22</kotlin.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
@ -32,11 +27,6 @@
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web-services</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.mysql</groupId>
|
||||
<artifactId>mysql-connector-j</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
@ -77,11 +67,6 @@
|
||||
<artifactId>Java-WebSocket</artifactId>
|
||||
<version>1.5.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mybatis.spring.boot</groupId>
|
||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||
<version>2.2.2</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
@ -110,22 +95,36 @@
|
||||
<artifactId>jedis</artifactId>
|
||||
<version>4.2.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.yutou</groupId>
|
||||
<artifactId>common</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
<groupId>io.reactivex.rxjava3</groupId>
|
||||
<artifactId>rxjava</artifactId>
|
||||
<version>3.1.8</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.yutou</groupId>
|
||||
<artifactId>qqbot</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
<groupId>com.aayushatharva.brotli4j</groupId>
|
||||
<artifactId>brotli4j</artifactId>
|
||||
<version>1.16.0</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>4.12.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.squareup.retrofit2/retrofit -->
|
||||
<dependency>
|
||||
<groupId>com.squareup.retrofit2</groupId>
|
||||
<artifactId>retrofit</artifactId>
|
||||
<version>2.11.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
|
||||
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
|
||||
<outputDirectory>${project.basedir}/target/classes</outputDirectory>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
@ -146,27 +145,6 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-maven-plugin</artifactId>
|
||||
<version>${kotlin.version}</version>
|
||||
|
||||
<executions>
|
||||
<execution>
|
||||
<id>compile</id>
|
||||
<goals>
|
||||
<goal>compile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
|
||||
<execution>
|
||||
<id>test-compile</id>
|
||||
<goals>
|
||||
<goal>test-compile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
@ -174,7 +152,7 @@
|
||||
<!--使用-Dloader.path需要在打包的时候增加<layout>ZIP</layout>,不指定的话-Dloader.path不生效-->
|
||||
<layout>ZIP</layout>
|
||||
<!-- 指定该jar包启动时的主类[建议] -->
|
||||
<mainClass>com.yutou.bilibili.BilibiliApplication</mainClass>
|
||||
<mainClass>com.yutou.BilibiliApplication</mainClass>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
@ -193,8 +171,8 @@
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>7</source>
|
||||
<target>7</target>
|
||||
<source>21</source>
|
||||
<target>21</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
@ -1,29 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.yutou</groupId>
|
||||
<artifactId>bilibili</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>qqbot</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
|
||||
|
||||
<!-- <dependency>
|
||||
<groupId>com.yutou</groupId>
|
||||
<artifactId>common</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>-->
|
||||
</dependencies>
|
||||
</project>
|
17
src/main/java/com/yutou/BilibiliApplication.java
Normal file
17
src/main/java/com/yutou/BilibiliApplication.java
Normal file
@ -0,0 +1,17 @@
|
||||
package com.yutou;
|
||||
|
||||
import com.yutou.common.okhttp.HttpLoggingInterceptor;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication()
|
||||
public class BilibiliApplication {
|
||||
|
||||
public static String version = "0.8.4";
|
||||
|
||||
public static void main(String[] args) {
|
||||
HttpLoggingInterceptor.setLog(false);
|
||||
SpringApplication.run(BilibiliApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
169
src/main/java/com/yutou/biliapi/Main.java
Normal file
169
src/main/java/com/yutou/biliapi/Main.java
Normal file
@ -0,0 +1,169 @@
|
||||
package com.yutou.biliapi;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.biliapi.api.UserApi;
|
||||
import com.yutou.biliapi.bean.live.SpiBean;
|
||||
import com.yutou.biliapi.bean.login.LoginCookieDatabaseBean;
|
||||
import com.yutou.biliapi.bean.login.LoginUserDatabaseBean;
|
||||
import com.yutou.biliapi.bean.login.UserInfoBean;
|
||||
import com.yutou.biliapi.net.BiliLoginNetApiManager;
|
||||
import com.yutou.biliapi.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.biliapi.net.BiliUserNetApiManager;
|
||||
import com.yutou.common.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.common.okhttp.HttpBody;
|
||||
import com.yutou.common.okhttp.HttpCallback;
|
||||
import com.yutou.common.okhttp.HttpLoggingInterceptor;
|
||||
import com.yutou.common.utils.Log;
|
||||
import jakarta.xml.bind.DatatypeConverter;
|
||||
import okhttp3.Headers;
|
||||
import retrofit2.Response;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
// HttpLoggingInterceptor.setLog(false);
|
||||
// HttpLoggingInterceptor.setLog(true);
|
||||
// login();
|
||||
}
|
||||
|
||||
|
||||
public static void testSocket(SpiBean spi) {
|
||||
try {
|
||||
JSONObject json = new JSONObject();
|
||||
// json.put("roomid", "32805602");
|
||||
json.put("roomid", "855204");
|
||||
json.put("protover", "3");
|
||||
json.put("platform", "web");
|
||||
json.put("type", 2);
|
||||
json.put("buvid", spi.getB_3());
|
||||
json.put("key", "aaaabbb");
|
||||
Log.i(json);
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
// outputStream.write(toLH(json.toString().length() + 16));
|
||||
outputStream.write(new byte[]{0, 0, 1, 68, 0, 16, 0, 1, 0, 0, 0, 7, 0, 0, 0, 1});
|
||||
outputStream.write(json.toJSONString().getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.flush();
|
||||
System.out.println("\n\n\n");
|
||||
String str = DatatypeConverter.printHexBinary(outputStream.toByteArray());
|
||||
for (int i = 0; i < str.length(); i = i + 4) {
|
||||
if (i % 32 == 0 && i != 0) {
|
||||
System.out.println();
|
||||
}
|
||||
if (str.length() - i > 4) {
|
||||
System.out.print(str.substring(i, i + 4) + " ");
|
||||
} else {
|
||||
System.out.println(str.substring(i));
|
||||
}
|
||||
}
|
||||
System.out.println("\n\n\n");
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void getPlayUrl() {
|
||||
// BiliLiveNetApiManager
|
||||
// .getInstance()
|
||||
// .getApi(new IHttpApiCheckCallback<LiveApi>() {
|
||||
// @Override
|
||||
// public void onSuccess(LiveApi api) {
|
||||
// String roomId = "32805602";
|
||||
// String mid = "68057278";
|
||||
//
|
||||
// // roomId="42062";
|
||||
//
|
||||
// api.getLiveRoomPlayInfo(
|
||||
// roomId,
|
||||
// LiveProtocol.getAll(),
|
||||
// LiveVideoFormat.getAll(),
|
||||
// LiveVideoCodec.getAll(),
|
||||
// LiveVideoDefinition.ORIGINAL.getValue()
|
||||
// ).enqueue(new HttpCallback<>() {
|
||||
// @Override
|
||||
// public void onResponse(Headers headers, int code, String status, LiveRoomPlayInfo response, String rawResponse) {
|
||||
// LiveRoomPlayInfo.Codec codec = response.getPlayurlInfo().getPlayurl().getStream().get(0).getFormat().get(0).getCodec().get(0);
|
||||
//
|
||||
// LiveRoomConfig config = new LiveRoomConfig();
|
||||
// config.setUid("0");
|
||||
// config.setRoomId(roomId);
|
||||
// config.setMid(mid);
|
||||
// config.setLogin(false);
|
||||
// WebSocketManager.getInstance().addRoom(config);
|
||||
//
|
||||
// /*String url = codec.getUrlInfo().get(0).getHost() + codec.getBaseUrl() + codec.getUrlInfo().get(0).getExtra();
|
||||
// System.out.println("下载url = " + url);
|
||||
// api.downloadLive(url).enqueue(new FileCallback<>(response) {
|
||||
// @Override
|
||||
// public void onStart(LiveRoomPlayInfo bean) {
|
||||
// System.out.println("开始下载");
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public boolean onDownload(Headers headers, LiveRoomPlayInfo bean, long len, long total) {
|
||||
// System.out.println("下载中:"+len+"|"+total);
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onFinish(LiveRoomPlayInfo bean) {
|
||||
// System.out.println("下载结束");
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onFailure(LiveRoomPlayInfo bean, Throwable throwable) {
|
||||
// System.out.println("下载失败");
|
||||
// }
|
||||
// });*/
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onFailure(Throwable throwable) {
|
||||
//
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onError(int code, String error) {
|
||||
//
|
||||
// }
|
||||
// });
|
||||
}
|
||||
|
||||
public static void login() {
|
||||
BiliLoginNetApiManager.getInstance().login(new HttpCallback<LoginCookieDatabaseBean>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers, int code, String status, LoginCookieDatabaseBean response, String rawResponse) {
|
||||
System.out.println("二维码地址: "+rawResponse);
|
||||
if (code == BiliLoginNetApiManager.LOGIN_SUCCESS) {
|
||||
Response<HttpBody<UserInfoBean>> execute = null;
|
||||
try {
|
||||
execute = BiliUserNetApiManager.getInstance().getUserApi(response).getUserInfo().execute();
|
||||
if (execute.isSuccessful()) {
|
||||
if (execute.body() != null) {
|
||||
UserInfoBean data = execute.body().getData();
|
||||
LoginUserDatabaseBean userBean=new LoginUserDatabaseBean(data);
|
||||
BiliBiliLoginDatabase.getInstance().initData(response,userBean).close();
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -1,9 +1,10 @@
|
||||
package com.yutou.bili.api;
|
||||
package com.yutou.biliapi.api;
|
||||
|
||||
import com.yutou.bili.bean.live.*;
|
||||
import com.yutou.okhttp.BaseBean;
|
||||
import com.yutou.okhttp.FileBody;
|
||||
import com.yutou.okhttp.HttpBody;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.biliapi.bean.live.*;
|
||||
import com.yutou.common.okhttp.BaseBean;
|
||||
import com.yutou.common.okhttp.FileBody;
|
||||
import com.yutou.common.okhttp.HttpBody;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.http.*;
|
||||
|
||||
@ -30,10 +31,10 @@ public interface LiveApi {
|
||||
/**
|
||||
* 获取直播间信息
|
||||
* @param id 直播间id
|
||||
* @param protocol 直播协议 {@link com.yutou.bili.enums.LiveProtocol}
|
||||
* @param format 格式 {@link com.yutou.bili.enums.LiveVideoFormat}
|
||||
* @param codec 编码 {@link com.yutou.bili.enums.LiveVideoCodec}
|
||||
* @param qn 清晰度 {@link com.yutou.bili.enums.LiveVideoDefinition}
|
||||
* @param protocol 直播协议 {@link com.yutou.biliapi.enums.LiveProtocol}
|
||||
* @param format 格式 {@link com.yutou.biliapi.enums.LiveVideoFormat}
|
||||
* @param codec 编码 {@link com.yutou.biliapi.enums.LiveVideoCodec}
|
||||
* @param qn 清晰度 {@link com.yutou.biliapi.enums.LiveVideoDefinition}
|
||||
* @return
|
||||
*/
|
||||
@GET("/xlive/web-room/v2/index/getRoomPlayInfo")
|
||||
@ -50,4 +51,12 @@ public interface LiveApi {
|
||||
|
||||
@GET("/xlive/web-room/v1/index/getDanmuInfo")
|
||||
Call<HttpBody<LiveDanmuInfo>> getLiveRoomDanmuInfo(@Query("id")String id);
|
||||
|
||||
@GET("/xlive/web-room/v1/giftPanel/giftConfig?platform=pc")
|
||||
Call<HttpBody<BaseBean>> getLiveGiftConfig();
|
||||
|
||||
@POST("/room/v1/Room/get_status_info_by_uids")
|
||||
Call<HttpBody<BaseBean>> getLiveRoomStatus( @Body
|
||||
JSONObject uids);
|
||||
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package com.yutou.bili.api;
|
||||
package com.yutou.biliapi.api;
|
||||
|
||||
import com.yutou.bili.bean.login.CheckCookieBean;
|
||||
import com.yutou.bili.bean.login.LoginInfoBean;
|
||||
import com.yutou.bili.bean.login.QRCodeGenerateBean;
|
||||
import com.yutou.okhttp.HttpBody;
|
||||
import com.yutou.biliapi.bean.login.CheckCookieBean;
|
||||
import com.yutou.biliapi.bean.login.LoginInfoBean;
|
||||
import com.yutou.biliapi.bean.login.QRCodeGenerateBean;
|
||||
import com.yutou.common.okhttp.HttpBody;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.Query;
|
@ -1,8 +1,8 @@
|
||||
package com.yutou.bili.api;
|
||||
package com.yutou.biliapi.api;
|
||||
|
||||
import com.yutou.bili.bean.live.SpiBean;
|
||||
import com.yutou.bili.bean.login.UserInfoBean;
|
||||
import com.yutou.okhttp.HttpBody;
|
||||
import com.yutou.biliapi.bean.live.SpiBean;
|
||||
import com.yutou.biliapi.bean.login.UserInfoBean;
|
||||
import com.yutou.common.okhttp.HttpBody;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.http.GET;
|
||||
|
@ -0,0 +1,82 @@
|
||||
package com.yutou.biliapi.bean.live;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class LiveAnchorInfo {
|
||||
/**
|
||||
* {
|
||||
* "title": "挑战最难魂系",
|
||||
* "room_id": 7688602,
|
||||
* "uid": 269415357,
|
||||
* "online": 43171,
|
||||
* "live_time": 1729049421,
|
||||
* "live_status": 1,
|
||||
* "short_id": 0,
|
||||
* "area": 6,
|
||||
* "area_name": "生活娱乐",
|
||||
* "area_v2_id": 745,
|
||||
* "area_v2_name": "虚拟Gamer",
|
||||
* "area_v2_parent_name": "虚拟主播",
|
||||
* "area_v2_parent_id": 9,
|
||||
* "uname": "花花Haya",
|
||||
* "face": "https://i0.hdslb.com/bfs/face/a269de03af269453d14eaf0dc7cc23240d69da6c.jpg",
|
||||
* "tag_name": "日常,学习,萌宠,厨艺,手机直播",
|
||||
* "tags": "唱见,虚拟主播,虚拟up主",
|
||||
* "cover_from_user": "https://i0.hdslb.com/bfs/live/new_room_cover/925b98639a8d3b62462bc699c6dbb833e27e17d5.jpg",
|
||||
* "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe101614360000076886025wzvg0.jpg",
|
||||
* "lock_till": "0000-00-00 00:00:00",
|
||||
* "hidden_till": "0000-00-00 00:00:00",
|
||||
* "broadcast_type": 0
|
||||
* }
|
||||
*/
|
||||
@JSONField(name = "title")
|
||||
private String title;
|
||||
@JSONField(name = "room_id")
|
||||
private BigInteger roomId;
|
||||
@JSONField(name = "uid")
|
||||
private BigInteger uid;
|
||||
@JSONField(name = "online")
|
||||
private int online;
|
||||
@JSONField(name = "live_time")
|
||||
private long liveTime;
|
||||
@JSONField(name = "live_status")
|
||||
private int liveStatus;
|
||||
@JSONField(name = "short_id")
|
||||
private int shortId;
|
||||
@JSONField(name = "area")
|
||||
private int area;
|
||||
@JSONField(name = "area_name")
|
||||
private String areaName;
|
||||
@JSONField(name = "area_v2_id")
|
||||
private int areaV2Id;
|
||||
@JSONField(name = "area_v2_name")
|
||||
private String areaV2Name;
|
||||
@JSONField(name = "area_v2_parent_id")
|
||||
private int areaV2ParentId;
|
||||
@JSONField(name = "area_v2_parent_name")
|
||||
private String areaV2ParentName;
|
||||
@JSONField(name = "uname")
|
||||
private String uname;
|
||||
@JSONField(name = "face")
|
||||
private String face;//头像
|
||||
@JSONField(name = "cover_from_user")
|
||||
private String coverFromUser;//直播封面
|
||||
@JSONField(name = "tag_name")
|
||||
private String tagName;
|
||||
@JSONField(name = "tags")
|
||||
private String tags;
|
||||
@JSONField(name = "keyframe")
|
||||
private String keyframe;//直播关键帧
|
||||
@JSONField(name = "lock_till")
|
||||
private Date lockTill;
|
||||
@JSONField(name = "hidden_till")
|
||||
private Date hiddenTill;
|
||||
@JSONField(name = "broadcast_type")
|
||||
private int broadcastType;
|
||||
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.bean.live;
|
||||
package com.yutou.biliapi.bean.live;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import lombok.Data;
|
@ -0,0 +1,57 @@
|
||||
package com.yutou.biliapi.bean.live;
|
||||
|
||||
import com.yutou.biliapi.bean.live.database.LiveConfigDatabaseBean;
|
||||
import com.yutou.biliapi.databases.BiliLiveConfigDatabase;
|
||||
import lombok.Data;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Objects;
|
||||
|
||||
@Data
|
||||
public class LiveRoomConfig {
|
||||
String loginUid;
|
||||
BigInteger roomId;
|
||||
String anchorName;
|
||||
boolean isLogin;
|
||||
String rootPath="live";
|
||||
LiveDanmuInfo liveInfo;
|
||||
LiveRoomInfo roomInfo;
|
||||
|
||||
public String getLoginUid() {
|
||||
if("null".equals(loginUid)){
|
||||
loginUid=null;
|
||||
}
|
||||
return loginUid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
LiveRoomConfig that = (LiveRoomConfig) o;
|
||||
return Objects.equals(roomId, that.roomId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(roomId);
|
||||
}
|
||||
|
||||
public static LiveRoomConfig buildConfig(String roomId){
|
||||
BiliLiveConfigDatabase database = new BiliLiveConfigDatabase();
|
||||
LiveConfigDatabaseBean bean = database.getConfig(new BigInteger(roomId));
|
||||
|
||||
LiveRoomConfig config = new LiveRoomConfig();
|
||||
config.setLoginUid(bean.getRecordUid());
|
||||
config.setRoomId(bean.getRoomId());
|
||||
config.setAnchorName(bean.getAnchorName());
|
||||
config.setLogin(StringUtils.hasText(bean.getRecordUid()));
|
||||
config.setRootPath(bean.getRecordPath());
|
||||
return config;
|
||||
}
|
||||
}
|
@ -1,17 +1,18 @@
|
||||
package com.yutou.bili.bean.live;
|
||||
package com.yutou.biliapi.bean.live;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class LiveRoomInfo {
|
||||
@JSONField(name = "uid")
|
||||
private int uid;
|
||||
private BigInteger uid;
|
||||
|
||||
@JSONField(name = "room_id")
|
||||
private int roomId;
|
||||
private BigInteger roomId;
|
||||
|
||||
@JSONField(name = "short_id")
|
||||
private int shortId;
|
@ -1,23 +1,24 @@
|
||||
package com.yutou.bili.bean.live;
|
||||
package com.yutou.biliapi.bean.live;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.okhttp.BaseBean;
|
||||
import com.yutou.common.okhttp.BaseBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LiveRoomPlayInfo extends BaseBean {
|
||||
@JSONField(name = "room_id")
|
||||
private int roomId;
|
||||
private BigInteger roomId;
|
||||
|
||||
@JSONField(name = "short_id")
|
||||
private int shortId;
|
||||
|
||||
@JSONField(name = "uid")
|
||||
private int uid;
|
||||
private BigInteger uid;
|
||||
|
||||
@JSONField(name = "is_hidden")
|
||||
private boolean isHidden;
|
@ -1,8 +1,10 @@
|
||||
package com.yutou.bili.bean.live;
|
||||
package com.yutou.biliapi.bean.live;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
@Data
|
||||
public class LiveRoomStatus {
|
||||
@JSONField(name = "roomStatus")
|
||||
@ -27,7 +29,7 @@ public class LiveRoomStatus {
|
||||
private int online;
|
||||
|
||||
@JSONField(name = "roomid")
|
||||
private int roomid;
|
||||
private BigInteger roomid;
|
||||
|
||||
@JSONField(name = "broadcast_type")
|
||||
private int broadcastType;
|
@ -1,10 +1,11 @@
|
||||
package com.yutou.bili.bean.live;
|
||||
package com.yutou.biliapi.bean.live;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.okhttp.BaseBean;
|
||||
import com.yutou.common.okhttp.BaseBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ -40,7 +41,7 @@ public class MasterInfoBean extends BaseBean {
|
||||
@Data
|
||||
public static class Info {
|
||||
@JSONField(name = "uid")
|
||||
private int uid;
|
||||
private BigInteger uid;
|
||||
|
||||
@JSONField(name = "uname")
|
||||
private String uname;
|
@ -1,6 +1,6 @@
|
||||
package com.yutou.bili.bean.live;
|
||||
package com.yutou.biliapi.bean.live;
|
||||
|
||||
import com.yutou.okhttp.BaseBean;
|
||||
import com.yutou.common.okhttp.BaseBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
@ -0,0 +1,81 @@
|
||||
package com.yutou.biliapi.bean.live.database;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LiveConfigDatabaseBean extends AbsDatabasesBean {
|
||||
@JSONField(name = "live_room_id")
|
||||
private BigInteger roomId;
|
||||
@JSONField(name = "anchorUid")
|
||||
private BigInteger anchorUid;
|
||||
@JSONField(name = "anchorName")
|
||||
private String anchorName;
|
||||
@JSONField(name = "anchorFace")
|
||||
private String anchorFace;
|
||||
@JSONField(name = "recordLive")
|
||||
private boolean isRecordLive;
|
||||
@JSONField(name = "recordDanmu")
|
||||
private boolean isRecordDanmu;
|
||||
@JSONField(name = "keyword")
|
||||
private List<String> keywordList;
|
||||
@JSONField(name = "recordPath")
|
||||
private String recordPath="live";
|
||||
@JSONField(name = "recordUid")
|
||||
private String recordUid;
|
||||
@JSONField(name = "recordLiveModel")
|
||||
private int recordLiveModel;//0 - ffmpeg 1 - java
|
||||
@JSONField(name = "recordDanmuDate")
|
||||
private String recordDanmuDate="* * *";// * * * 分 时 星期 | 周日是1
|
||||
@JSONField(name = "recordLiveDate")
|
||||
private String recordLiveDate="* * *";// * * * 分 时 星期 | 周日是1
|
||||
|
||||
|
||||
public LiveConfigDatabaseBean() {
|
||||
super("live_config",System.currentTimeMillis());
|
||||
}
|
||||
public boolean checkRecordDanmuTime(){
|
||||
return checkRecordTime(recordDanmuDate);
|
||||
}
|
||||
public boolean checkRecordLiveTime(){
|
||||
return checkRecordTime(recordLiveDate);
|
||||
}
|
||||
private boolean checkRecordTime(String recordDate){
|
||||
int _length = recordDate.length();
|
||||
boolean isFullDate=(_length-recordDate.replace("*","").length())==3;
|
||||
if(isFullDate){
|
||||
return true;
|
||||
}
|
||||
String[] split=recordDate.split(" ");
|
||||
String minute=split[0];
|
||||
String hour=split[1];
|
||||
String day=split[2];
|
||||
boolean isFullMinute= "*".equals(minute);
|
||||
boolean isFullHour= "*".equals(hour);
|
||||
boolean isFullDay= "*".equals(day);
|
||||
Calendar today=Calendar.getInstance();
|
||||
if(!isFullDay){
|
||||
if(today.get(Calendar.DAY_OF_WEEK)!=Integer.parseInt(day)){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(!isFullHour) {
|
||||
if (today.get(Calendar.HOUR_OF_DAY) != Integer.parseInt(hour)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(!isFullMinute){
|
||||
if(today.get(Calendar.MINUTE)!=Integer.parseInt(minute)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
package com.yutou.biliapi.bean.live.database;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.biliapi.bean.websocket.live.WSDanmuData;
|
||||
import com.yutou.bilibili.datas.DanmuData;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LiveDanmuDatabaseBean extends AbsDatabasesBean {
|
||||
@JSONField(name = "id")
|
||||
int id;
|
||||
@JSONField(name = "danmu")
|
||||
private String danmu;
|
||||
@JSONField(name = "model")
|
||||
private int model;// 1~3 滚动弹幕 4 底端弹幕 5 顶端弹幕 6 逆向弹幕 7 精准定位 8 高级弹幕
|
||||
@JSONField(name = "fontSize")
|
||||
private int fontSize;
|
||||
@JSONField(name = "color")
|
||||
private String fontColor;
|
||||
@JSONField(name = "time")
|
||||
private long time;
|
||||
@JSONField(name = "uid")
|
||||
private BigInteger uid;
|
||||
@JSONField(name = "uname")
|
||||
private String uname;
|
||||
|
||||
|
||||
public LiveDanmuDatabaseBean() {
|
||||
super("danmu", System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public LiveDanmuDatabaseBean(WSDanmuData danmu) {
|
||||
super("danmu", danmu.getWs_timer());
|
||||
this.danmu = danmu.getDanmu();
|
||||
model = danmu.getModel();
|
||||
fontSize = danmu.getFontSize();
|
||||
fontColor = danmu.getFontColor();
|
||||
time = danmu.getTime();
|
||||
uid = danmu.getUid();
|
||||
uname = danmu.getUname();
|
||||
}
|
||||
|
||||
public DanmuData createDanmuData() {
|
||||
DanmuData data = new DanmuData();
|
||||
data.setId(id);
|
||||
data.setDanmu(danmu);
|
||||
data.setModel(model);
|
||||
data.setFontSize(fontSize);
|
||||
data.setFontColor(fontColor);
|
||||
data.setTime(time);
|
||||
return data;
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
package com.yutou.biliapi.bean.live.database;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.biliapi.bean.websocket.live.WSSendGift;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LiveGiftDatabaseBean extends AbsDatabasesBean {
|
||||
@JSONField(name = "id")
|
||||
int id;
|
||||
@JSONField(name = "gift_id")
|
||||
private int giftId;
|
||||
@JSONField(name = "gift_name")
|
||||
private String giftName;
|
||||
@JSONField(name = "price")
|
||||
private long price;
|
||||
@JSONField(name = "coin_type")
|
||||
private String coinType;
|
||||
@JSONField(name = "icon")
|
||||
private String icon;
|
||||
@JSONField(name = "gift_num")
|
||||
private int giftNum;
|
||||
@JSONField(name = "sender_uid")
|
||||
private long senderUid;
|
||||
@JSONField(name = "sender_name")
|
||||
private String senderName;
|
||||
@JSONField(name = "sender_face")
|
||||
private String senderFace;
|
||||
@JSONField(name = "send_time")
|
||||
private long sendTime;
|
||||
@JSONField(name = "action")
|
||||
private String action;
|
||||
|
||||
|
||||
public LiveGiftDatabaseBean() {
|
||||
super("gift",System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public LiveGiftDatabaseBean(WSSendGift gift) {
|
||||
super("gift",gift.getWs_timer());
|
||||
giftId = gift.getData().getGiftId();
|
||||
giftName = gift.getData().getGiftName();
|
||||
price = gift.getData().getPrice();
|
||||
coinType = gift.getData().getCoinType();
|
||||
icon = gift.getData().getGiftInfo().getWebp();
|
||||
if (gift.getData().getComboSend() != null) {
|
||||
giftNum = gift.getData().getComboSend().getGiftNum();
|
||||
} else {
|
||||
giftNum = 1;
|
||||
}
|
||||
senderUid = gift.getData().getSenderUinfo().getUid();
|
||||
senderName = gift.getData().getSenderUinfo().getBase().getName();
|
||||
senderFace = gift.getData().getSenderUinfo().getBase().getFace();
|
||||
sendTime = gift.getData().getTimestamp();
|
||||
action = gift.getData().getAction();
|
||||
}
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.yutou.biliapi.bean.live.database;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.biliapi.bean.live.LiveRoomInfo;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LiveInfoDatabaseBean extends AbsDatabasesBean {
|
||||
@JSONField(name = "id")
|
||||
int id;
|
||||
@JSONField(name = "roomId")
|
||||
private BigInteger roomId;
|
||||
@JSONField(name = "anchorUid")
|
||||
private BigInteger anchorUid;
|
||||
@JSONField(name = "title")
|
||||
private String title;
|
||||
@JSONField(name = "record_time_start")
|
||||
private long recordTimeStart;
|
||||
@JSONField(name = "record_time_end")
|
||||
private long recordTimeEnd;
|
||||
@JSONField(name = "cover")
|
||||
private String cover;
|
||||
@JSONField(name = "room_info")
|
||||
private String roomInfo;
|
||||
|
||||
public LiveInfoDatabaseBean(LiveRoomInfo info) {
|
||||
super("info", System.currentTimeMillis());
|
||||
roomId = info.getRoomId();
|
||||
roomInfo = JSONObject.toJSONString(info);
|
||||
recordTimeStart = System.currentTimeMillis();
|
||||
anchorUid = info.getUid();
|
||||
title = info.getTitle();
|
||||
cover = info.getUserCover();
|
||||
}
|
||||
|
||||
|
||||
public LiveInfoDatabaseBean() {
|
||||
super("info", System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
List<Field> list = new LiveInfoDatabaseBean().getFields();
|
||||
for (Field field : list) {
|
||||
System.out.println(field.getName());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package com.yutou.biliapi.bean.live.database;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.biliapi.bean.websocket.live.WSInteractWord;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LiveInteractWordDatabaseBean extends AbsDatabasesBean {
|
||||
@JSONField(name = "id")
|
||||
int id;
|
||||
@JSONField(name = "uid")
|
||||
private long uid;
|
||||
@JSONField(name = "type")
|
||||
private int type; //1为进场,2为关注
|
||||
@JSONField(name = "room_id")
|
||||
private long roomId;
|
||||
@JSONField(name = "timer")
|
||||
private long timer;
|
||||
@JSONField(name = "uname")
|
||||
private String uname;
|
||||
@JSONField(name = "uname_color")
|
||||
private String uname_color;
|
||||
@JSONField(name = "face")
|
||||
private String face;
|
||||
|
||||
public LiveInteractWordDatabaseBean() {
|
||||
super("InteractWord",System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public LiveInteractWordDatabaseBean(WSInteractWord bean) {
|
||||
super("InteractWord", bean.getWs_timer());
|
||||
uid = bean.getUid();
|
||||
type = bean.getType();
|
||||
roomId = bean.getRoomId();
|
||||
timer = bean.getTimer();
|
||||
uname = bean.getUname();
|
||||
uname_color = bean.getUname_color();
|
||||
face = bean.getFace();
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.yutou.biliapi.bean.live.database;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.biliapi.bean.websocket.live.WSData;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LiveSourceDatabaseBean extends AbsDatabasesBean {
|
||||
@JSONField(name = "id")
|
||||
int id;
|
||||
@JSONField(name = "type")
|
||||
private String type;
|
||||
@JSONField(name = "json")
|
||||
private String json;
|
||||
|
||||
public LiveSourceDatabaseBean() {
|
||||
super("source",System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public LiveSourceDatabaseBean(WSData bean) {
|
||||
super("source",bean.getWs_timer());
|
||||
this.json = bean.getJson();
|
||||
type = bean.getCmd();
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package com.yutou.biliapi.bean.live.database;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.biliapi.bean.websocket.live.WSSuperChatMessage;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LiveSuperChatDatabaseBean extends AbsDatabasesBean {
|
||||
@JSONField(name = "id")
|
||||
private int id;
|
||||
@JSONField(name = "price")
|
||||
private long price;
|
||||
@JSONField(name = "uid")
|
||||
private long uid;
|
||||
@JSONField(name = "start_time")
|
||||
private long start_time;
|
||||
@JSONField(name = "end_time")
|
||||
private long end_time;
|
||||
@JSONField(name = "message")
|
||||
private String message;
|
||||
@JSONField(name = "message_trans")
|
||||
private String message_trans;
|
||||
@JSONField(name = "message_font_color")
|
||||
private String message_font_color;
|
||||
|
||||
public LiveSuperChatDatabaseBean() {
|
||||
super("superChat",System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public LiveSuperChatDatabaseBean(WSSuperChatMessage bean) {
|
||||
super("superChat",bean.getWs_timer());
|
||||
price = bean.getPrice();
|
||||
uid = bean.getUid();
|
||||
start_time = bean.getStart_time();
|
||||
end_time = bean.getEnd_time();
|
||||
message = bean.getMessage();
|
||||
message_trans = bean.getMessage_trans();
|
||||
message_font_color = bean.getMessage_font_color();
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.yutou.biliapi.bean.live.database;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LiveVideoDatabaseBean extends AbsDatabasesBean {
|
||||
@JSONField(name = "info")
|
||||
String roomInfoJson;
|
||||
@JSONField(name = "start_time")
|
||||
Date startTime;
|
||||
@JSONField(name = "path")
|
||||
String path;
|
||||
|
||||
public LiveVideoDatabaseBean() {
|
||||
super("live_video", System.currentTimeMillis());
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
package com.yutou.bili.bean.login;
|
||||
package com.yutou.biliapi.bean.login;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.okhttp.BaseBean;
|
||||
import com.yutou.common.okhttp.BaseBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
@ -1,14 +1,14 @@
|
||||
package com.yutou.bili.bean.login;
|
||||
package com.yutou.biliapi.bean.login;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.yutou.databases.AbsDatabasesBean;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LoginCookie extends AbsDatabasesBean {
|
||||
public class LoginCookieDatabaseBean extends AbsDatabasesBean {
|
||||
|
||||
@JSONField(name = "SESSDATA")
|
||||
String sessdta;
|
||||
@JSONField(name = "Path")
|
||||
@ -28,7 +28,11 @@ public class LoginCookie extends AbsDatabasesBean {
|
||||
@JSONField(name = "gourl")
|
||||
String gourl;
|
||||
|
||||
public LoginCookie() {
|
||||
setTableName("login_cookie");
|
||||
public LoginCookieDatabaseBean() {
|
||||
super("login_cookie", System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public String toCookieString() {
|
||||
return "SESSDATA=" + sessdta + "; Path=" + path + "; DedeUserID=" + dedeUserID + "; DedeUserID__ckMd5=" + dedeUserIDCkMd5 + "; bili_jct=" + biliJct + "; Expires=" + expires + "; Domain=" + domain + "; sid=" + sid + "; gourl=" + gourl;
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
package com.yutou.bili.bean.login;
|
||||
package com.yutou.biliapi.bean.login;
|
||||
|
||||
import com.yutou.okhttp.BaseBean;
|
||||
import com.yutou.common.okhttp.BaseBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
@ -0,0 +1,44 @@
|
||||
package com.yutou.biliapi.bean.login;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.alibaba.fastjson2.util.DateUtils;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LoginUserDatabaseBean extends AbsDatabasesBean {
|
||||
UserInfoBean userInfo;
|
||||
|
||||
public LoginUserDatabaseBean(UserInfoBean userInfo) {
|
||||
super("login_user",System.currentTimeMillis());
|
||||
this.userInfo=userInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject toJson() {
|
||||
if(userInfo==null){
|
||||
return new JSONObject();
|
||||
}
|
||||
JSONObject json= JSONObject.parseObject(JSONObject.toJSONString(userInfo));
|
||||
json.put("sql_time", DateUtils.format(getSql_time(), "yyyy-MM-dd HH:mm:ss.SSS"));
|
||||
return json;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Field> getFields() {
|
||||
List<Field> fields = new ArrayList<>(List.of(UserInfoBean.class.getDeclaredFields()));
|
||||
for (Field field : super.getFields()) {
|
||||
if(!field.getName().contains("userInfo")){
|
||||
fields.add(field);
|
||||
}
|
||||
}
|
||||
return fields;
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
package com.yutou.bili.bean.login;
|
||||
package com.yutou.biliapi.bean.login;
|
||||
|
||||
|
||||
import com.yutou.okhttp.BaseBean;
|
||||
import com.yutou.common.okhttp.BaseBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
@ -1,12 +1,12 @@
|
||||
package com.yutou.bili.bean.login;
|
||||
package com.yutou.biliapi.bean.login;
|
||||
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.yutou.okhttp.BaseBean;
|
||||
import com.yutou.common.okhttp.BaseBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Date;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ -32,7 +32,7 @@ public class UserInfoBean extends BaseBean {
|
||||
private LevelInfo levelInfo;
|
||||
|
||||
@JSONField(name = "mid")
|
||||
private long mid;
|
||||
private BigInteger mid;
|
||||
|
||||
@JSONField(name = "mobile_verified")
|
||||
private int mobileVerified;
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.bean.websocket;
|
||||
package com.yutou.biliapi.bean.websocket;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import lombok.Data;
|
@ -1,6 +1,6 @@
|
||||
package com.yutou.bili.bean.websocket;
|
||||
package com.yutou.biliapi.bean.websocket;
|
||||
|
||||
import com.yutou.bili.utils.BytesUtils;
|
||||
import com.yutou.biliapi.utils.BytesUtils;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
@ -1,11 +1,13 @@
|
||||
package com.yutou.bili.bean.websocket.live;
|
||||
package com.yutou.biliapi.bean.websocket.live;
|
||||
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.utils.Log;
|
||||
import com.yutou.common.utils.Log;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* 弹幕信息
|
||||
* <a href="https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/live/message_stream.md#%E5%BC%B9%E5%B9%95">弹幕</a>
|
||||
@ -21,7 +23,7 @@ public class WSDanmuData extends WSData {
|
||||
private long time;
|
||||
private String uCode;
|
||||
private String danmu;
|
||||
private long uid;
|
||||
private BigInteger uid;
|
||||
private String uname;
|
||||
private WSUserMedal medal;
|
||||
|
||||
@ -34,7 +36,7 @@ public class WSDanmuData extends WSData {
|
||||
setTime(infoData.getJSONArray(0).getLong(4));
|
||||
setUCode(infoData.getJSONArray(0).getString(7));
|
||||
setDanmu(infoData.getString(1));
|
||||
setUid(infoData.getJSONArray(2).getInteger(0));
|
||||
setUid(infoData.getJSONArray(2).getBigInteger(0));
|
||||
setUname(infoData.getJSONArray(2).getString(1));
|
||||
try {
|
||||
medal = WSUserMedal.create(infoData.getJSONArray(3));
|
@ -1,10 +1,12 @@
|
||||
package com.yutou.bili.bean.websocket.live;
|
||||
package com.yutou.biliapi.bean.websocket.live;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.common.inter.ISqlDatabaseBean;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class WSData implements Serializable {
|
||||
@Data
|
||||
public class WSData implements Serializable, ISqlDatabaseBean {
|
||||
public String cmd;
|
||||
public String jsonSrc;
|
||||
public long ws_timer;
|
||||
@ -39,4 +41,9 @@ public class WSData implements Serializable {
|
||||
default -> new WSData(json);
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getJson(){
|
||||
return jsonSrc;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.bean.websocket.live;
|
||||
package com.yutou.biliapi.bean.websocket.live;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import lombok.Data;
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.bean.websocket.live;
|
||||
package com.yutou.biliapi.bean.websocket.live;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import lombok.Data;
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.bean.websocket.live;
|
||||
package com.yutou.biliapi.bean.websocket.live;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import lombok.Data;
|
||||
@ -14,14 +14,14 @@ import org.springframework.util.StringUtils;
|
||||
public class WSInteractWord extends WSData {
|
||||
public final static int TYPE_ENTER = 1;
|
||||
public final static int TYPE_FOLLOW = 2;
|
||||
private long uid;
|
||||
private int type; //1为进场,2为关注
|
||||
private long roomId;
|
||||
private long timer;
|
||||
private WSUserMedal medal;
|
||||
private long uid;
|
||||
private String uname;
|
||||
private String uname_color;
|
||||
private String face;
|
||||
private WSUserMedal medal;
|
||||
|
||||
|
||||
public WSInteractWord(JSONObject json) {
|
@ -1,7 +1,7 @@
|
||||
package com.yutou.bili.bean.websocket.live;
|
||||
package com.yutou.biliapi.bean.websocket.live;
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import com.yutou.okhttp.BaseBean;
|
||||
import com.yutou.common.okhttp.BaseBean;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.bean.websocket.live;
|
||||
package com.yutou.biliapi.bean.websocket.live;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
@ -76,7 +76,7 @@ public class WSSendGift extends WSData {
|
||||
@JSONField(name = "float_sc_resource_id")
|
||||
private long floatScResourceID;
|
||||
@JSONField(name = "giftId")
|
||||
private long giftID;
|
||||
private int giftId;
|
||||
@JSONField(name = "giftName")
|
||||
private String giftName;
|
||||
@JSONField(name = "giftType")
|
||||
@ -150,7 +150,7 @@ public class WSSendGift extends WSData {
|
||||
}
|
||||
|
||||
@lombok.Data
|
||||
public static class FaceEffectV2 implements Serializable{
|
||||
public static class FaceEffectV2 implements Serializable {
|
||||
@JSONField(name = "id")
|
||||
private long id;
|
||||
@JSONField(name = "type")
|
||||
@ -158,7 +158,7 @@ public class WSSendGift extends WSData {
|
||||
}
|
||||
|
||||
@lombok.Data
|
||||
public static class GiftInfo implements Serializable{
|
||||
public static class GiftInfo implements Serializable {
|
||||
@JSONField(name = "effect_id")
|
||||
private long effectID;
|
||||
@JSONField(name = "has_imaged_gift")
|
||||
@ -224,6 +224,7 @@ public class WSSendGift extends WSData {
|
||||
@JSONField(name = "name")
|
||||
private String name;
|
||||
}
|
||||
|
||||
@lombok.Data
|
||||
public static class ComboSend implements Serializable {
|
||||
@JSONField(name = "action")
|
||||
@ -231,13 +232,13 @@ public class WSSendGift extends WSData {
|
||||
@JSONField(name = "combo_id")
|
||||
private String comboID;
|
||||
@JSONField(name = "combo_num")
|
||||
private long comboNum;
|
||||
private int comboNum;
|
||||
@JSONField(name = "gift_id")
|
||||
private long giftID;
|
||||
@JSONField(name = "gift_name")
|
||||
private String giftName;
|
||||
@JSONField(name = "gift_num")
|
||||
private long giftNum;
|
||||
private int giftNum;
|
||||
@JSONField(name = "uid")
|
||||
private long uid;
|
||||
@JSONField(name = "uname")
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.bean.websocket.live;
|
||||
package com.yutou.biliapi.bean.websocket.live;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import lombok.Data;
|
||||
@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* 超级留言
|
||||
* <a href="https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/live/message_stream.md#%E9%86%92%E7%9B%AE%E7%95%99%E8%A8%80">醒目留言</a>
|
||||
* <a href="https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/live/message_stream.md#%E9%86%92%E7%9B%AE%E7%95%99%E8%A8%80-super_chat_message">醒目留言</a>
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.bean.websocket.live;
|
||||
package com.yutou.biliapi.bean.websocket.live;
|
||||
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import lombok.Data;
|
@ -0,0 +1,79 @@
|
||||
package com.yutou.biliapi.databases;
|
||||
|
||||
import com.yutou.biliapi.bean.login.LoginCookieDatabaseBean;
|
||||
import com.yutou.biliapi.bean.login.LoginUserDatabaseBean;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import com.yutou.common.databases.SQLiteManager;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
public class BiliBiliLoginDatabase extends SQLiteManager {
|
||||
LoginCookieDatabaseBean cookie;
|
||||
private static BiliBiliLoginDatabase instance;
|
||||
|
||||
private BiliBiliLoginDatabase(Class<LoginCookieDatabaseBean> tClass) {
|
||||
try {
|
||||
cookie = new LoginCookieDatabaseBean();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
init();
|
||||
}
|
||||
|
||||
public static BiliBiliLoginDatabase getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new BiliBiliLoginDatabase(LoginCookieDatabaseBean.class);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
public BiliBiliLoginDatabase initData(LoginCookieDatabaseBean cookie, LoginUserDatabaseBean user) {
|
||||
this.cookie = cookie;
|
||||
cookie.setTableName(getDataBean().get(0).getTableName());
|
||||
add(cookie);
|
||||
add(user);
|
||||
return this;
|
||||
}
|
||||
|
||||
public LoginCookieDatabaseBean getCookie(String userId) {
|
||||
List<LoginCookieDatabaseBean> list = super.get(cookie.getTableName(), LoginCookieDatabaseBean.class);
|
||||
if (userId == null && !list.isEmpty()) {
|
||||
return list.getFirst();
|
||||
}
|
||||
for (LoginCookieDatabaseBean bean : list) {
|
||||
if (bean.getDedeUserID().equals(userId)) {
|
||||
return bean;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public LoginUserDatabaseBean getUser(String userId) {
|
||||
List<LoginUserDatabaseBean> list = super.get(cookie.getTableName(), LoginUserDatabaseBean.class);
|
||||
if (userId == null && !list.isEmpty()) {
|
||||
return list.getFirst();
|
||||
}
|
||||
for (LoginUserDatabaseBean bean : list) {
|
||||
if (bean.getUserInfo().getMid().equals(new BigInteger(userId))) {
|
||||
return bean;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFileName() {
|
||||
return "old_bilibili_login.db";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbsDatabasesBean> getDataBean() {
|
||||
return List.of(new LoginCookieDatabaseBean(), new LoginUserDatabaseBean(null));
|
||||
}
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
@ -0,0 +1,74 @@
|
||||
package com.yutou.biliapi.databases;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.biliapi.bean.live.LiveRoomConfig;
|
||||
import com.yutou.biliapi.bean.live.database.LiveConfigDatabaseBean;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import com.yutou.common.databases.SQLiteManager;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
public class BiliLiveConfigDatabase extends SQLiteManager {
|
||||
String fileName;
|
||||
|
||||
public BiliLiveConfigDatabase() {
|
||||
this.fileName = "live_config.db";
|
||||
init();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbsDatabasesBean> getDataBean() {
|
||||
return List.of(new LiveConfigDatabaseBean());
|
||||
}
|
||||
|
||||
public void setConfig(LiveConfigDatabaseBean bean) {
|
||||
LiveConfigDatabaseBean config = getConfig(bean.getRoomId());
|
||||
if (config == null) {
|
||||
add(bean);
|
||||
return;
|
||||
}
|
||||
bean.setSql_time(config.getSql_time());
|
||||
update(bean);
|
||||
}
|
||||
|
||||
public LiveConfigDatabaseBean getConfig(BigInteger roomId) {
|
||||
List<LiveConfigDatabaseBean> list = get(getDataBean().get(0).getTableName(), LiveConfigDatabaseBean.class);
|
||||
if (list.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
for (LiveConfigDatabaseBean bean : list) {
|
||||
if (Objects.equals(bean.getRoomId(), roomId)) {
|
||||
return bean;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean deleteConfig(BigInteger roomId) {
|
||||
LiveConfigDatabaseBean config = getConfig(roomId);
|
||||
if (config == null) {
|
||||
return false;
|
||||
}
|
||||
return delete(config);
|
||||
}
|
||||
|
||||
public List<LiveConfigDatabaseBean> getAllConfig() {
|
||||
List<LiveConfigDatabaseBean> list = get(getDataBean().get(0).getTableName(), LiveConfigDatabaseBean.class);
|
||||
if (list.isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
}
|
143
src/main/java/com/yutou/biliapi/databases/BiliLiveDatabase.java
Normal file
143
src/main/java/com/yutou/biliapi/databases/BiliLiveDatabase.java
Normal file
@ -0,0 +1,143 @@
|
||||
package com.yutou.biliapi.databases;
|
||||
|
||||
import com.alibaba.fastjson2.util.DateUtils;
|
||||
import com.yutou.biliapi.bean.live.*;
|
||||
import com.yutou.biliapi.bean.live.database.*;
|
||||
import com.yutou.biliapi.bean.websocket.live.*;
|
||||
import com.yutou.bilibili.Tools.DateFormatUtils;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import com.yutou.common.databases.SQLiteManager;
|
||||
import com.yutou.common.okhttp.HttpDownloadUtils;
|
||||
import org.apache.poi.ss.usermodel.DataFormat;
|
||||
|
||||
import java.io.File;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import static com.alibaba.fastjson2.util.DateUtils.DateTimeFormatPattern.DATE_FORMAT_10_DASH;
|
||||
|
||||
public class BiliLiveDatabase extends SQLiteManager {
|
||||
LiveRoomConfig config;
|
||||
String fileName;
|
||||
File rootPath;
|
||||
|
||||
public BiliLiveDatabase(LiveRoomConfig roomConfig, String path) {
|
||||
this.config = roomConfig;
|
||||
rootPath = new File(path).getParentFile();
|
||||
fileName =path;
|
||||
init();
|
||||
}
|
||||
|
||||
public BiliLiveDatabase(LiveRoomConfig roomConfig) {
|
||||
String time = DateUtils.format(new Date().getTime(), DATE_FORMAT_10_DASH);
|
||||
rootPath = new File(roomConfig.getRootPath() + File.separator + roomConfig.getAnchorName() + File.separator + time + File.separator + roomConfig.getRoomInfo().getTitle());
|
||||
config = roomConfig;
|
||||
if (!rootPath.exists()) {
|
||||
rootPath.mkdirs();
|
||||
}
|
||||
fileName = rootPath.getAbsolutePath() + File.separator + "live.db";
|
||||
init();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
super.init();
|
||||
if(config.getRoomInfo()!=null) {
|
||||
HttpDownloadUtils.download(new HttpDownloadUtils.Builder().setUrl(config.getRoomInfo().getUserCover())
|
||||
.setPath(rootPath.getAbsolutePath())
|
||||
.setFileName("poster.jpg"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbsDatabasesBean> getDataBean() {
|
||||
return List.of(
|
||||
new LiveInfoDatabaseBean(),
|
||||
new LiveDanmuDatabaseBean(),
|
||||
new LiveGiftDatabaseBean(),
|
||||
new LiveInteractWordDatabaseBean(),
|
||||
new LiveSuperChatDatabaseBean(),
|
||||
new LiveSourceDatabaseBean(),
|
||||
new LiveVideoDatabaseBean()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
super.close();
|
||||
}
|
||||
|
||||
public void addLiveInfo(LiveVideoDatabaseBean info) {
|
||||
createInfo(info);
|
||||
}
|
||||
|
||||
public List<LiveVideoDatabaseBean> getLiveInfos() {
|
||||
return get(new LiveVideoDatabaseBean().getTableName(), LiveVideoDatabaseBean.class);
|
||||
}
|
||||
|
||||
private void addData(WSData bean) {
|
||||
if (bean instanceof WSDanmuData) {
|
||||
add(new LiveDanmuDatabaseBean((WSDanmuData) bean));
|
||||
} else if (bean instanceof WSInteractWord) {
|
||||
add(new LiveInteractWordDatabaseBean((WSInteractWord) bean));
|
||||
} else if (bean instanceof WSSendGift) {
|
||||
add(new LiveGiftDatabaseBean((WSSendGift) bean));
|
||||
} else if (bean instanceof WSSuperChatMessage) {
|
||||
add(new LiveSuperChatDatabaseBean((WSSuperChatMessage) bean));
|
||||
}
|
||||
}
|
||||
|
||||
public void addSource(WSData bean) {
|
||||
System.out.println("BiliLiveDatabase.addSource");
|
||||
add(new LiveSourceDatabaseBean(bean));
|
||||
addData(bean);
|
||||
}
|
||||
|
||||
private void createInfo(LiveVideoDatabaseBean bean) {
|
||||
String format = DateFormatUtils.format(bean.getSql_time());
|
||||
if (get(bean.getTableName(), " `sql_time` = '" + format + "'", LiveVideoDatabaseBean.class).isEmpty()) {
|
||||
add(bean);
|
||||
} else {
|
||||
update(bean);
|
||||
}
|
||||
}
|
||||
|
||||
public <T extends AbsDatabasesBean> List<T> getOfTime(String startTime, String entTime, Class<T> clazz) {
|
||||
String tableName = null;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String where = null;
|
||||
if (startTime != null) {
|
||||
sb.append(" `sql_time` >= ").append("\"").append(startTime).append("\"");
|
||||
}
|
||||
if (entTime != null) {
|
||||
if (!sb.isEmpty()) {
|
||||
sb.append(" and ");
|
||||
}
|
||||
sb.append(" `sql_time` <= ").append("\"").append(entTime).append("\"");
|
||||
}
|
||||
if (!sb.isEmpty()) {
|
||||
where = sb.toString();
|
||||
}
|
||||
for (AbsDatabasesBean bean : getDataBean()) {
|
||||
if (bean.getClass() == clazz) {
|
||||
tableName = bean.getTableName();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return super.get(tableName, where, clazz);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
/* List<LiveDanmuDatabaseBean> list = getInstance().get(-1, 1727515148800L, LiveDanmuDatabaseBean.class);
|
||||
for (LiveDanmuDatabaseBean bean : list) {
|
||||
System.out.println(bean.getSql_time() + "|" + bean);
|
||||
}*/
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.enums;
|
||||
package com.yutou.biliapi.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.enums;
|
||||
package com.yutou.biliapi.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.enums;
|
||||
package com.yutou.biliapi.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.yutou.bili.enums;
|
||||
package com.yutou.biliapi.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
@ -1,10 +1,9 @@
|
||||
package com.yutou.bili.net;
|
||||
package com.yutou.biliapi.net;
|
||||
|
||||
import com.yutou.bili.bean.login.CheckCookieBean;
|
||||
import com.yutou.bili.bean.login.LoginInfoBean;
|
||||
import com.yutou.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.okhttp.HttpCallback;
|
||||
import com.yutou.utils.RSAUtils;
|
||||
import com.yutou.biliapi.bean.login.CheckCookieBean;
|
||||
import com.yutou.common.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.common.okhttp.HttpCallback;
|
||||
import com.yutou.common.utils.RSAUtils;
|
||||
import okhttp3.Headers;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
@ -30,7 +29,7 @@ public class BiliCookieManager {
|
||||
"-----END PUBLIC KEY-----";
|
||||
|
||||
public void checkCookie(IHttpApiCheckCallback<Integer> callback){
|
||||
BiliLoginNetApiManager.getInstance().getLoginApi(true)
|
||||
BiliLoginNetApiManager.getInstance().getLoginApi(null)
|
||||
.checkCookie().enqueue(new HttpCallback<CheckCookieBean>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers, int code, String status, CheckCookieBean response, String rawResponse) {
|
@ -0,0 +1,71 @@
|
||||
package com.yutou.biliapi.net;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.biliapi.api.LiveApi;
|
||||
import com.yutou.biliapi.bean.live.LiveAnchorInfo;
|
||||
import com.yutou.biliapi.bean.login.LoginCookieDatabaseBean;
|
||||
import com.yutou.biliapi.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.common.okhttp.api.BaseApi;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.math.BigInteger;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class BiliLiveNetApiManager extends BaseApi {
|
||||
private static BiliLiveNetApiManager instance;
|
||||
|
||||
public static BiliLiveNetApiManager getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new BiliLiveNetApiManager("https://api.live.bilibili.com");
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
private BiliLiveNetApiManager(String URL) {
|
||||
super(URL);
|
||||
}
|
||||
|
||||
public LiveApi getApi(String loginUid) {
|
||||
if(StringUtils.hasText(loginUid)) {
|
||||
LoginCookieDatabaseBean cookie = BiliBiliLoginDatabase.getInstance().getCookie(loginUid);
|
||||
if (cookie != null) {
|
||||
useCookie(JSONObject.parseObject(JSONObject.toJSONString(cookie)));
|
||||
}
|
||||
}
|
||||
HashMap<String, String> header = new HashMap<>();
|
||||
header.put("Accept-Language", "zh-CN,zh;q=0.8");
|
||||
header.put("Referer", "https://live.bilibili.com");
|
||||
header.put("Connection", "keep-alive");
|
||||
header.put("Upgrade-Insecure-Requests", "1");
|
||||
addHeader(header);
|
||||
return createApi(LiveApi.class);
|
||||
}
|
||||
|
||||
public Map<BigInteger, LiveAnchorInfo> getAnchorInfos(String loginUid,List<BigInteger> anchorIds) {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("uids", anchorIds);
|
||||
try {
|
||||
String src = getApi(loginUid).getLiveRoomStatus(json).execute().body().getSrc();
|
||||
json = JSONObject.parseObject(src);
|
||||
if (json.getInteger("code") == 0) {
|
||||
Map<BigInteger, LiveAnchorInfo> map = new HashMap<>();
|
||||
JSONObject data = json.getJSONObject("data");
|
||||
for (String key : data.keySet()) {
|
||||
LiveAnchorInfo info = JSONObject.parseObject(data.getString(key), LiveAnchorInfo.class);
|
||||
map.put(new BigInteger(key), info);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
return new HashMap<>();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
}
|
||||
}
|
@ -1,14 +1,14 @@
|
||||
package com.yutou.bili.net;
|
||||
package com.yutou.biliapi.net;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.bili.api.LoginApi;
|
||||
import com.yutou.bili.bean.login.LoginCookie;
|
||||
import com.yutou.bili.bean.login.LoginInfoBean;
|
||||
import com.yutou.bili.bean.login.QRCodeGenerateBean;
|
||||
import com.yutou.bili.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.okhttp.HttpBody;
|
||||
import com.yutou.okhttp.HttpCallback;
|
||||
import com.yutou.okhttp.api.BaseApi;
|
||||
import com.yutou.biliapi.api.LoginApi;
|
||||
import com.yutou.biliapi.bean.login.LoginCookieDatabaseBean;
|
||||
import com.yutou.biliapi.bean.login.LoginInfoBean;
|
||||
import com.yutou.biliapi.bean.login.QRCodeGenerateBean;
|
||||
import com.yutou.biliapi.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.common.okhttp.HttpBody;
|
||||
import com.yutou.common.okhttp.HttpCallback;
|
||||
import com.yutou.common.okhttp.api.BaseApi;
|
||||
import okhttp3.Headers;
|
||||
import org.springframework.util.StringUtils;
|
||||
import retrofit2.Response;
|
||||
@ -38,12 +38,12 @@ public class BiliLoginNetApiManager extends BaseApi {
|
||||
}
|
||||
|
||||
public LoginApi getLoginApi() {
|
||||
return getLoginApi(false);
|
||||
return getLoginApi(null);
|
||||
}
|
||||
|
||||
public LoginApi getLoginApi(boolean isCookie) {
|
||||
if (isCookie) {
|
||||
LoginCookie cookie = BiliBiliLoginDatabase.getInstance().get();
|
||||
public LoginApi getLoginApi(String loginUid) {
|
||||
if (StringUtils.hasText(loginUid)) {
|
||||
LoginCookieDatabaseBean cookie = BiliBiliLoginDatabase.getInstance().getCookie(loginUid);
|
||||
if (cookie != null) {
|
||||
useCookie(JSONObject.parseObject(JSONObject.toJSONString(cookie)));
|
||||
}
|
||||
@ -51,12 +51,7 @@ public class BiliLoginNetApiManager extends BaseApi {
|
||||
return loginApi;
|
||||
}
|
||||
|
||||
public void login(HttpCallback<LoginCookie> callback) {
|
||||
LoginCookie cookie = BiliBiliLoginDatabase.getInstance().get();
|
||||
if (cookie != null) {
|
||||
callback.onResponse(null, LOGIN_SUCCESS, null, cookie, null);
|
||||
return;
|
||||
}
|
||||
public void login(HttpCallback<LoginCookieDatabaseBean> callback) {
|
||||
loginApi.getQRCodeGenerate().enqueue(new HttpCallback<QRCodeGenerateBean>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers, int code, String status, QRCodeGenerateBean response, String rawResponse) {
|
||||
@ -74,7 +69,7 @@ public class BiliLoginNetApiManager extends BaseApi {
|
||||
});
|
||||
}
|
||||
|
||||
private void waitLogin(String oauthKey, HttpCallback<LoginCookie> callback) {
|
||||
private void waitLogin(String oauthKey, HttpCallback<LoginCookieDatabaseBean> callback) {
|
||||
long time = System.currentTimeMillis();
|
||||
new Timer().schedule(new TimerTask() {
|
||||
@Override
|
||||
@ -110,7 +105,7 @@ public class BiliLoginNetApiManager extends BaseApi {
|
||||
}
|
||||
if (!list.isEmpty()) {
|
||||
ck.put("gourl", bd);
|
||||
LoginCookie cookie = JSONObject.parseObject(ck.toString(), LoginCookie.class);
|
||||
LoginCookieDatabaseBean cookie = JSONObject.parseObject(ck.toString(), LoginCookieDatabaseBean.class);
|
||||
cancel();
|
||||
callback.onResponse(headers, LOGIN_SUCCESS, "ok", cookie, ck.toString());
|
||||
|
@ -1,14 +1,13 @@
|
||||
package com.yutou.bili.net;
|
||||
package com.yutou.biliapi.net;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.bili.api.UserApi;
|
||||
import com.yutou.bili.bean.login.LoginCookie;
|
||||
import com.yutou.bili.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.okhttp.api.BaseApi;
|
||||
import com.yutou.biliapi.api.UserApi;
|
||||
import com.yutou.biliapi.bean.login.LoginCookieDatabaseBean;
|
||||
import com.yutou.biliapi.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.common.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.common.okhttp.api.BaseApi;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
public class BiliUserNetApiManager extends BaseApi {
|
||||
public static final int LOGIN_LOGOUT = 1;
|
||||
@ -26,8 +25,7 @@ public class BiliUserNetApiManager extends BaseApi {
|
||||
return manager;
|
||||
}
|
||||
|
||||
public void getUserApi(IHttpApiCheckCallback<UserApi> callback) {
|
||||
LoginCookie cookie = BiliBiliLoginDatabase.getInstance().get();
|
||||
public UserApi getUserApi(LoginCookieDatabaseBean cookie) {
|
||||
if (cookie != null) {
|
||||
HashMap<String, String> headers = new HashMap<>();
|
||||
JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(cookie));
|
||||
@ -37,10 +35,8 @@ public class BiliUserNetApiManager extends BaseApi {
|
||||
}
|
||||
headers.put("Cookie", ck.toString());
|
||||
setHeaders(headers);
|
||||
callback.onSuccess(createApi(UserApi.class));
|
||||
} else {
|
||||
callback.onError(LOGIN_LOGOUT, "未登录");
|
||||
}
|
||||
return createApi(UserApi.class);
|
||||
}
|
||||
|
||||
}
|
308
src/main/java/com/yutou/biliapi/net/WebSocketManager.java
Normal file
308
src/main/java/com/yutou/biliapi/net/WebSocketManager.java
Normal file
@ -0,0 +1,308 @@
|
||||
package com.yutou.biliapi.net;
|
||||
|
||||
import com.aayushatharva.brotli4j.Brotli4jLoader;
|
||||
import com.aayushatharva.brotli4j.decoder.Decoder;
|
||||
import com.aayushatharva.brotli4j.decoder.DecoderJNI;
|
||||
import com.aayushatharva.brotli4j.decoder.DirectDecompress;
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.biliapi.api.LiveApi;
|
||||
import com.yutou.biliapi.bean.live.LiveDanmuInfo;
|
||||
import com.yutou.biliapi.bean.live.LiveRoomConfig;
|
||||
import com.yutou.biliapi.bean.live.LiveRoomInfo;
|
||||
import com.yutou.biliapi.bean.websocket.WebSocketBody;
|
||||
import com.yutou.biliapi.bean.websocket.WebSocketHeader;
|
||||
import com.yutou.biliapi.bean.websocket.live.WSData;
|
||||
import com.yutou.biliapi.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.biliapi.databases.BiliLiveDatabase;
|
||||
import com.yutou.biliapi.utils.BiliUserUtils;
|
||||
import com.yutou.biliapi.utils.BytesUtils;
|
||||
import com.yutou.common.okhttp.HttpBody;
|
||||
import com.yutou.common.okhttp.HttpCallback;
|
||||
import com.yutou.common.utils.Log;
|
||||
import okhttp3.Headers;
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
import retrofit2.Response;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.math.BigInteger;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class WebSocketManager {
|
||||
ThreadPoolExecutor executor;
|
||||
private static WebSocketManager instance;
|
||||
Map<LiveRoomConfig, DanmuTask> roomMap;
|
||||
private final List<String> userStopList = new ArrayList<>();//手动停止列表
|
||||
|
||||
private WebSocketManager() {
|
||||
roomMap = new HashMap<>();
|
||||
executor = new ThreadPoolExecutor(2, 4, Long.MAX_VALUE, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));
|
||||
}
|
||||
|
||||
public static WebSocketManager getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new WebSocketManager();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public boolean checkRoom(LiveRoomConfig roomConfig) {
|
||||
return roomMap.containsKey(roomConfig);
|
||||
}
|
||||
|
||||
public JSONArray getLiveRoomList() {
|
||||
JSONArray array = new JSONArray();
|
||||
array.addAll(roomMap.keySet());
|
||||
return array;
|
||||
}
|
||||
|
||||
public void addRoom(LiveRoomConfig roomConfig, boolean isUser) {
|
||||
if (!isUser && userStopList.contains(roomConfig.getRoomId().toString())) {
|
||||
return;
|
||||
}
|
||||
if (checkRoom(roomConfig)) {
|
||||
return;
|
||||
}
|
||||
if (isUser) {
|
||||
userStopList.remove(roomConfig.getRoomId().toString());
|
||||
}
|
||||
DanmuTask task = new DanmuTask(roomConfig);
|
||||
roomMap.put(roomConfig, task);
|
||||
System.out.println("添加websocket任务");
|
||||
executor.execute(task);
|
||||
}
|
||||
|
||||
public void stopRoom(String roomId, boolean isUser) {
|
||||
LiveRoomConfig roomConfig=new LiveRoomConfig();
|
||||
roomConfig.setRoomId(new BigInteger(roomId));
|
||||
if (checkRoom(roomConfig)) {
|
||||
roomMap.get(roomConfig).close();
|
||||
roomMap.remove(roomConfig);
|
||||
}
|
||||
if (isUser) {
|
||||
userStopList.add(roomConfig.getRoomId().toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static class DanmuTask implements Runnable {
|
||||
LiveRoomConfig roomConfig;
|
||||
WebSocketClientTh client;
|
||||
|
||||
public DanmuTask(LiveRoomConfig config) {
|
||||
this.roomConfig = config;
|
||||
WebSocketManager.getInstance().roomMap.put(roomConfig, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
LiveApi api = BiliLiveNetApiManager.getInstance().getApi(roomConfig.getLoginUid());
|
||||
Response<HttpBody<LiveRoomInfo>> execute = null;
|
||||
try {
|
||||
execute = api.getRoomInfo(roomConfig.getRoomId().toString()).execute();
|
||||
if (execute.isSuccessful()) {
|
||||
roomConfig.setRoomInfo(execute.body() != null ? execute.body().getData() : null);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
api.getLiveRoomDanmuInfo(String.valueOf(roomConfig.getRoomId())).enqueue(new HttpCallback<LiveDanmuInfo>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers, int code, String status, LiveDanmuInfo response, String rawResponse) {
|
||||
if (!response.getHostList().isEmpty()) {
|
||||
LiveDanmuInfo.Host host = response.getHostList().get(0);
|
||||
String url = "wss://" + host.getHost() + ":" + host.getWssPort() + "/sub";
|
||||
// url="ws://127.0.0.1:8765";
|
||||
try {
|
||||
roomConfig.setLiveInfo(response);
|
||||
client = new WebSocketClientTh(new URI(url), roomConfig);
|
||||
} catch (URISyntaxException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void close() {
|
||||
client.close();
|
||||
}
|
||||
}
|
||||
|
||||
private static class WebSocketClientTh extends WebSocketClient {
|
||||
private LiveRoomConfig roomConfig;
|
||||
private HeartbeatTask heartbeatTask;
|
||||
BiliLiveDatabase liveDatabase;
|
||||
private boolean itTmp = true;
|
||||
|
||||
public WebSocketClientTh(URI serverUri, LiveRoomConfig roomId) {
|
||||
super(serverUri);
|
||||
System.out.println("WebSocketClientTh.WebSocketClientTh : " + serverUri);
|
||||
this.roomConfig = roomId;
|
||||
liveDatabase = new BiliLiveDatabase(roomConfig);
|
||||
Brotli4jLoader.ensureAvailability();
|
||||
heartbeatTask = new HeartbeatTask();
|
||||
connect();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOpen(ServerHandshake serverHandshake) {
|
||||
heartbeatTask.setSocket(this);
|
||||
heartbeatTask.sendInitAuthData();
|
||||
new Timer().schedule(heartbeatTask, 1000, 30000);
|
||||
System.out.println("WebSocketClientTh.onOpen");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(String s) {
|
||||
System.out.println("s = " + s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(ByteBuffer bytes) {
|
||||
System.out.println("WebSocketClientTh.onMessage: " + roomConfig.getAnchorName());
|
||||
super.onMessage(bytes);
|
||||
decompress(bytes.array());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose(int i, String s, boolean b) {
|
||||
System.out.println("WebSocketClientTh.onClose");
|
||||
System.out.println("i = " + i + ", s = " + s + ", b = " + b);
|
||||
WebSocketManager.getInstance().roomMap.remove(roomConfig);
|
||||
heartbeatTask.cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception e) {
|
||||
System.out.println("WebSocketClientTh.onError");
|
||||
e.printStackTrace();
|
||||
WebSocketManager.getInstance().roomMap.remove(roomConfig);
|
||||
heartbeatTask.cancel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 解压缩
|
||||
*
|
||||
* @param data 待压缩的数据
|
||||
*/
|
||||
public void decompress(byte[] data) {
|
||||
byte[] bytes = new byte[data.length - 16];
|
||||
WebSocketHeader header = new WebSocketHeader(data);
|
||||
System.arraycopy(data, header.getHeaderSize(), bytes, 0, data.length - header.getHeaderSize());
|
||||
// System.out.println("数据大小:" + header.getDataSize() + " 协议:" + header.getAgree() + " 头部大小:" + header.getHeaderSize() + " 命令:" + header.getCmdData());
|
||||
switch (header.getAgree()) {
|
||||
case 0:
|
||||
case 1:
|
||||
danmu(bytes);
|
||||
break;
|
||||
default:
|
||||
unzipDanmu(bytes, header.getAgree() == 3);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void danmu(byte[] bytes) {
|
||||
Log.i("未压缩:" + new String(bytes));
|
||||
}
|
||||
|
||||
private void unzipDanmu(byte[] bytes, boolean useHeader) {
|
||||
try {
|
||||
|
||||
DirectDecompress directDecompress = Decoder.decompress(bytes);
|
||||
if (directDecompress.getResultStatus() == DecoderJNI.Status.DONE) {
|
||||
WebSocketBody body = new WebSocketBody(directDecompress.getDecompressedData());
|
||||
// Log.i("协议:" + useHeader + " 命令数:" + body.getBodyList().size());
|
||||
for (JSONObject json : body.getBodyList()) {
|
||||
WSData parse = WSData.parse(json);
|
||||
liveDatabase.addSource(parse);
|
||||
// Log.i("解压:" + parse);
|
||||
}
|
||||
// System.out.println();
|
||||
// System.out.println();
|
||||
} else {
|
||||
Log.e(new RuntimeException("解压失败"));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private class HeartbeatTask extends TimerTask {
|
||||
WebSocketClientTh socket;
|
||||
|
||||
public void setSocket(WebSocketClientTh socket) {
|
||||
this.socket = socket;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
// com.yutou.bilibili.Tools.Log.i("-------发送心跳--------");
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
outputStream.write(BytesUtils.toLH("[object Object]".length() + 16));
|
||||
outputStream.write(new byte[]{0, 16, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1});
|
||||
outputStream.write("[object Object]".getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.flush();
|
||||
socket.send(outputStream.toByteArray());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void sendInitAuthData() {
|
||||
JSONObject json = new JSONObject();
|
||||
if (roomConfig.isLogin()) {
|
||||
json.put("uid", new BigInteger(roomConfig.getLoginUid()));
|
||||
|
||||
} else {
|
||||
json.put("uid", 0);
|
||||
}
|
||||
String buvid = BiliUserUtils.getBuvid(BiliBiliLoginDatabase.getInstance().getCookie(roomConfig.getLoginUid()));
|
||||
if (buvid != null) {
|
||||
try {
|
||||
json.put("roomid", roomConfig.getRoomId());
|
||||
json.put("protover", 3);
|
||||
json.put("buvid", buvid);
|
||||
json.put("platform", "web");
|
||||
json.put("type", 2);
|
||||
json.put("key", roomConfig.getLiveInfo().getToken());
|
||||
byte[] bytes = {0, 16, 0, 1, 0, 0, 0, 7, 0, 0, 0, 1};
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
System.out.println("bytes.length = " + bytes.length);
|
||||
Log.i(json);
|
||||
outputStream.write(BytesUtils.toLH(json.toString().length() + 16));
|
||||
outputStream.write(bytes);
|
||||
outputStream.write(json.toJSONString().getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.flush();
|
||||
// BytesUtils.printHex(outputStream.toByteArray());
|
||||
System.out.println(socket.isOpen());
|
||||
socket.send(outputStream.toByteArray());
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
32
src/main/java/com/yutou/biliapi/utils/BiliUserUtils.java
Normal file
32
src/main/java/com/yutou/biliapi/utils/BiliUserUtils.java
Normal file
@ -0,0 +1,32 @@
|
||||
package com.yutou.biliapi.utils;
|
||||
|
||||
import com.yutou.biliapi.api.UserApi;
|
||||
import com.yutou.biliapi.bean.live.SpiBean;
|
||||
import com.yutou.biliapi.bean.login.LoginCookieDatabaseBean;
|
||||
import com.yutou.biliapi.net.BiliUserNetApiManager;
|
||||
import com.yutou.common.inter.IHttpApiCheckCallback;
|
||||
import com.yutou.common.okhttp.HttpBody;
|
||||
import com.yutou.common.okhttp.HttpCallback;
|
||||
import com.yutou.common.utils.RedisTools;
|
||||
import okhttp3.Headers;
|
||||
import retrofit2.Response;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class BiliUserUtils {
|
||||
public static String getBuvid(LoginCookieDatabaseBean cookie) {
|
||||
Response<HttpBody<SpiBean>> execute = null;
|
||||
try {
|
||||
execute = BiliUserNetApiManager.getInstance().getUserApi(cookie).getFingerSpi().execute();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
if (execute.isSuccessful()) {
|
||||
if (execute.body() != null) {
|
||||
return execute.body().getData().getB_3();
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
package com.yutou.bili.utils;
|
||||
package com.yutou.biliapi.utils;
|
||||
|
||||
import com.yutou.utils.Log;
|
||||
import com.yutou.common.utils.Log;
|
||||
import jakarta.xml.bind.DatatypeConverter;
|
||||
|
||||
public class BytesUtils {
|
@ -1,12 +1,10 @@
|
||||
package com.yutou.bili.utils;
|
||||
package com.yutou.biliapi.utils;
|
||||
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class LiveHeartBeat {
|
@ -1,7 +0,0 @@
|
||||
package com.yutou.bilibili.BiliBili.Datas;
|
||||
|
||||
public class AppData {
|
||||
public static String FFMPEG="";
|
||||
public static String BILIBILI_HEADERS = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36 Referer:https://live.bilibili.com";
|
||||
public static boolean LIVE_SAVE_FFMPEG=false;
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package com.yutou.bilibili.BiliBili.Datas;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class BiliBiliUpData {
|
||||
int id;
|
||||
String name;
|
||||
String url;
|
||||
int roomId;
|
||||
boolean offlineListening;
|
||||
boolean enable;
|
||||
boolean saveDanmu;
|
||||
|
||||
public void setOfflineListening(int offlineListening) {
|
||||
this.offlineListening = offlineListening==1;
|
||||
}
|
||||
|
||||
public void setEnable(int enable) {
|
||||
this.enable = enable==1;
|
||||
}
|
||||
|
||||
public void setSaveDanmu(int saveDanmu) {
|
||||
this.saveDanmu = saveDanmu==1;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
package com.yutou.bilibili.BiliBili.Datas;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class GiftData {
|
||||
int id;
|
||||
int price;
|
||||
String name;
|
||||
String desc;
|
||||
String rights;
|
||||
String icon;
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
package com.yutou.bilibili.BiliBili.Datas;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class LiveData {
|
||||
public static final String INTERACT_WORD="INTERACT_WORD";//普通用户进直播间
|
||||
public static final String ENTRY_EFFECT="ENTRY_EFFECT";//舰长进直播间
|
||||
public static final String DANMU_MSG="DANMU_MSG";//普通弹幕
|
||||
public static final String SEND_GIFT="SEND_GIFT";//送礼
|
||||
public static final String COMBO_SEND="COMBO_SEND";//礼物连击
|
||||
public static final String SUPER_CHAT_MESSAGE="SUPER_CHAT_MESSAGE";//SC
|
||||
public static final String NOTICE_MSG="NOTICE_MSG";//系统通知
|
||||
public static final String GUARD_BUY="GUARD_BUY";//购买、续费舰长等
|
||||
public static final String UNKNOWN_MESSAGE="UNKNOWN_MESSAGE";//未记录的事件
|
||||
int id;
|
||||
int roomId;
|
||||
int uid;
|
||||
String type;
|
||||
String msg;
|
||||
String giftName;
|
||||
int giftIndex;
|
||||
int giftId;
|
||||
int price;
|
||||
int priceOfCommission;
|
||||
Date subTime;
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
package com.yutou.bilibili.BiliBili.Datas;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class LiveInfo {
|
||||
int id;
|
||||
int roomId;
|
||||
int popular;
|
||||
int userIndex;
|
||||
int vipUserIndex;
|
||||
Date subTime;
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
package com.yutou.bilibili;
|
||||
|
||||
import com.yutou.bilibili.QQBot.QQBotManager;
|
||||
import com.yutou.bilibili.Tools.ExcelUtils;
|
||||
import com.yutou.bilibili.Tools.ServiceTools;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
@Import({ServiceTools.class, ExcelUtils.class, QQBotManager.class})
|
||||
@SpringBootApplication
|
||||
public class BilibiliApplication {
|
||||
|
||||
public static String version="0.8.4";
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(BilibiliApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package com.yutou.bilibili.Controllers;
|
||||
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.biliapi.bean.live.database.LiveConfigDatabaseBean;
|
||||
import com.yutou.bilibili.datas.ResultData;
|
||||
import com.yutou.bilibili.datas.ReturnCode;
|
||||
import com.yutou.bilibili.services.LiveConfigService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/live/config/")
|
||||
public class LiveConfigController {
|
||||
@Resource
|
||||
LiveConfigService configService;
|
||||
|
||||
@RequestMapping(value = "set", method = RequestMethod.POST)
|
||||
@ResponseBody
|
||||
public JSONObject setConfig(String url, LiveConfigDatabaseBean bean) {
|
||||
LiveConfigDatabaseBean config = configService.addConfig(url, bean);
|
||||
if (config != null) {
|
||||
return ResultData.success(config.toJson());
|
||||
}
|
||||
return ResultData.fail(ReturnCode.RC999);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "update", method = RequestMethod.POST)
|
||||
@ResponseBody
|
||||
public JSONObject updateConfig(String roomId, LiveConfigDatabaseBean bean) {
|
||||
LiveConfigDatabaseBean config = configService.updateConfig(new BigInteger(roomId), bean);
|
||||
if (config != null) {
|
||||
return ResultData.success(config.toJson());
|
||||
}
|
||||
return ResultData.fail(ReturnCode.RC999);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "get", method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public JSONObject getConfig(String roomId) {
|
||||
if ("0".equals(roomId) || !StringUtils.hasText(roomId)) {
|
||||
return ResultData.fail(ReturnCode.RC999);
|
||||
}
|
||||
LiveConfigDatabaseBean config = configService.getConfig(new BigInteger(roomId));
|
||||
if (config != null) {
|
||||
return ResultData.success(config.toJson());
|
||||
}
|
||||
return ResultData.fail(ReturnCode.RC999);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "all", method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public JSONObject getAllConfig() {
|
||||
List<LiveConfigDatabaseBean> config = configService.getAllConfig();
|
||||
if (config != null) {
|
||||
return ResultData.success(JSONArray.parseArray(JSONArray.toJSONString(config)));
|
||||
}
|
||||
return ResultData.fail(ReturnCode.RC999);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "delete", method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public JSONObject deleteConfig(BigInteger roomId) {
|
||||
if (roomId.equals(BigInteger.ZERO)) {
|
||||
return ResultData.fail(ReturnCode.RC999);
|
||||
}
|
||||
boolean flag = configService.deleteConfig(roomId);
|
||||
if (flag) {
|
||||
return ResultData.success(ReturnCode.RC100);
|
||||
}
|
||||
return ResultData.fail(ReturnCode.RC999);
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package com.yutou.bilibili.Controllers;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.biliapi.bean.live.LiveRoomConfig;
|
||||
import com.yutou.biliapi.net.WebSocketManager;
|
||||
import com.yutou.bilibili.datas.ResultData;
|
||||
import com.yutou.bilibili.datas.ReturnCode;
|
||||
import com.yutou.bilibili.services.LiveDanmuService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
@Controller
|
||||
public class LiveDanmuController {
|
||||
@Resource
|
||||
LiveDanmuService service;
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/live/danmu/list")
|
||||
public JSONObject getLiveDanmuList() {
|
||||
return ResultData.success(service.getLiveRoomList());
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/live/danmu/stop")
|
||||
public JSONObject stopLiveDanmu(String roomId) {
|
||||
service.stop(roomId);
|
||||
return ResultData.success(ReturnCode.RC100);
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/live/danmu/start")
|
||||
public JSONObject startLiveDanmu(String roomId) {
|
||||
service.start(roomId);
|
||||
return ResultData.success(ReturnCode.RC100);
|
||||
}
|
||||
@ResponseBody
|
||||
@RequestMapping("/live/danmu/file/list")
|
||||
public JSONObject getDanmuList(String roomId) {
|
||||
return ResultData.success(service.getDanmuFileList(roomId));
|
||||
}
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package com.yutou.bilibili.Controllers;
|
||||
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.biliapi.bean.live.database.LiveConfigDatabaseBean;
|
||||
import com.yutou.biliapi.databases.BiliLiveConfigDatabase;
|
||||
import com.yutou.biliapi.net.WebSocketManager;
|
||||
import com.yutou.bilibili.datas.ResultData;
|
||||
import com.yutou.bilibili.datas.ReturnCode;
|
||||
import com.yutou.bilibili.services.LiveVideoService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Controller
|
||||
public class LiveVideoController {
|
||||
@Resource
|
||||
LiveVideoService videoService;
|
||||
|
||||
@RequestMapping("/live/video/list")
|
||||
@ResponseBody
|
||||
public JSONObject getLiveVideoList() {
|
||||
return ResultData.success(videoService.getDownloadTasks());
|
||||
}
|
||||
|
||||
@RequestMapping("/live/video/stop")
|
||||
@ResponseBody
|
||||
public JSONObject stopDownload(String roomId) {
|
||||
videoService.stop(roomId, true);
|
||||
return ResultData.success(true);
|
||||
}
|
||||
|
||||
@RequestMapping("/live/video/start")
|
||||
@ResponseBody
|
||||
public JSONObject startDownload(String roomId) {
|
||||
BiliLiveConfigDatabase liveConfigDatabase = new BiliLiveConfigDatabase();
|
||||
List<LiveConfigDatabaseBean> list = liveConfigDatabase.getAllConfig();
|
||||
for (LiveConfigDatabaseBean bean : list) {
|
||||
if (bean.getRoomId().toString().equals(roomId)) {
|
||||
videoService.start(bean, true);
|
||||
return ResultData.success(true);
|
||||
}
|
||||
}
|
||||
return ResultData.fail(ReturnCode.RC999);
|
||||
}
|
||||
}
|
@ -1,133 +0,0 @@
|
||||
package com.yutou.bilibili.Controllers;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.bilibili.BiliBili.Datas.AppData;
|
||||
import com.yutou.bilibili.QQBot.QQBotManager;
|
||||
import com.yutou.bilibili.Services.ISystemConfigService;
|
||||
import com.yutou.bilibili.Tools.Config;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLDecoder;
|
||||
|
||||
@Controller
|
||||
public class SystemConfigController {
|
||||
@Resource
|
||||
ISystemConfigService configService;
|
||||
|
||||
@RequestMapping("/system/get/config.do")
|
||||
@ResponseBody
|
||||
public JSONObject getRegUser() {
|
||||
JSONObject json = new JSONObject();
|
||||
JSONObject data = new JSONObject();
|
||||
String reg = configService.getConfig(Config.USER_REG);
|
||||
String bLive = configService.getConfig(Config.BILI_LIVE_FLAG);
|
||||
if (reg == null) {
|
||||
reg = "0";
|
||||
}
|
||||
if (bLive == null) {
|
||||
bLive = "0";
|
||||
}
|
||||
data.put(Config.USER_REG, reg);
|
||||
data.put(Config.BILI_LIVE_FLAG, bLive);
|
||||
json.put("code", 0);
|
||||
json.put("data", data);
|
||||
return json;
|
||||
}
|
||||
|
||||
@RequestMapping("/system/set/config.do")
|
||||
@ResponseBody
|
||||
public JSONObject setConfig(String key, String value) {
|
||||
configService.setConfig(key, value);
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("code", 0);
|
||||
json.put("msg", "ok");
|
||||
return json;
|
||||
}
|
||||
|
||||
@RequestMapping("/system/public/reg.do")
|
||||
@ResponseBody
|
||||
public JSONObject getRegModel() {
|
||||
JSONObject json = new JSONObject();
|
||||
JSONObject data = new JSONObject();
|
||||
String reg = configService.getConfig(Config.USER_REG);
|
||||
boolean model = false;
|
||||
if (reg == null) {
|
||||
reg = "0";
|
||||
}
|
||||
if (reg.equals("1")) {
|
||||
model = true;
|
||||
}
|
||||
data.put(Config.USER_REG, model);
|
||||
json.put("code", 0);
|
||||
json.put("data", data);
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/system/set/ffmpeg.do")
|
||||
public JSONObject setFFmpeg(String ffmpeg) throws UnsupportedEncodingException {
|
||||
ffmpeg = URLDecoder.decode(ffmpeg, "UTF-8");
|
||||
configService.setConfig(Config.SYSTEM_VIDEO_FFMPEG, ffmpeg);
|
||||
AppData.FFMPEG = ffmpeg;
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("code", 0);
|
||||
json.put("msg", "ok");
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/system/get/ffmpeg.do")
|
||||
public JSONObject getFFmpeg() {
|
||||
JSONObject json = new JSONObject();
|
||||
JSONObject data = new JSONObject();
|
||||
String reg = configService.getConfig(Config.SYSTEM_VIDEO_FFMPEG);
|
||||
data.put(Config.SYSTEM_VIDEO_FFMPEG, reg);
|
||||
json.put("code", 0);
|
||||
json.put("data", data);
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/system/set/savelive.do")
|
||||
public JSONObject setSaveLive(String model) throws UnsupportedEncodingException {
|
||||
JSONObject json = new JSONObject();
|
||||
if (StringUtils.isEmpty(configService.getConfig(Config.SYSTEM_VIDEO_FFMPEG))) {
|
||||
json.put("code", 404);
|
||||
json.put("msg", "请先设置FFmpeg路径");
|
||||
return json;
|
||||
}
|
||||
model = URLDecoder.decode(model, "UTF-8");
|
||||
configService.setConfig(Config.SYSTEM_VIDEO_SAVE_MODEL, model);
|
||||
AppData.LIVE_SAVE_FFMPEG = model.equals("ffmpeg");
|
||||
json.put("code", 0);
|
||||
json.put("msg", "ok");
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/system/get/savelive.do")
|
||||
public JSONObject getSaveLiveModel() {
|
||||
JSONObject json = new JSONObject();
|
||||
JSONObject data = new JSONObject();
|
||||
String reg = configService.getConfig(Config.SYSTEM_VIDEO_SAVE_MODEL);
|
||||
System.out.println(reg);
|
||||
data.put(Config.SYSTEM_VIDEO_SAVE_MODEL, (!StringUtils.isEmpty(reg) && reg.equals("ffmpeg")));
|
||||
json.put("code", 0);
|
||||
json.put("data", data);
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/system/qq/login.do")
|
||||
public JSONObject loginQQ() {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("code", 0);
|
||||
json.put("msg", "ok");
|
||||
return json;
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.yutou.bilibili.Controllers;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
@Controller
|
||||
public class TestControllers {
|
||||
@RequestMapping("/root/test")
|
||||
@ResponseBody
|
||||
public String test(){
|
||||
return "hello world";
|
||||
}
|
||||
}
|
@ -1,184 +0,0 @@
|
||||
package com.yutou.bilibili.Controllers;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.bilibili.Services.ISystemConfigService;
|
||||
import com.yutou.bilibili.Services.IUserService;
|
||||
import com.yutou.bilibili.Tools.Config;
|
||||
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo;
|
||||
import com.yutou.bilibili.mybatis.model.UBiliUp;
|
||||
import com.yutou.bilibili.mybatis.model.UUser;
|
||||
import com.yutou.utils.AppTools;
|
||||
import com.yutou.utils.RedisTools;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
|
||||
@Controller
|
||||
public class UserController {
|
||||
@Resource
|
||||
IUserService service;
|
||||
|
||||
@Resource
|
||||
ISystemConfigService configService;
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/user/reg.do")
|
||||
public JSONObject reg(UUser user, HttpServletResponse response) {
|
||||
JSONObject json = new JSONObject();
|
||||
String isReg = configService.getConfig(Config.USER_REG);
|
||||
if (isReg != null) {
|
||||
if (isReg.equals("0")) {
|
||||
json.put("code", -2);
|
||||
json.put("msg", "当前系统禁止注册");
|
||||
return json;
|
||||
}
|
||||
}
|
||||
user.setPower("[1,2,3,5,6,7]");
|
||||
user.setSubtime(new Date());
|
||||
user.setLogintoken(UUID.randomUUID().toString());
|
||||
RedisTools.set(user.getLogintoken(), user.getId() + "", 30 * 24 * 60);
|
||||
AppTools.setCookie(response, "login", user.getLogintoken(), -1);
|
||||
boolean flag = service.reg(user);
|
||||
if (flag) {
|
||||
json.put("code", 0);
|
||||
json.put("msg", "注册成功");
|
||||
} else {
|
||||
json.put("code", -1);
|
||||
json.put("msg", "该用户已存在或无法注册");
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/user/login.do")
|
||||
public JSONObject login(UUser user, HttpServletResponse response) {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("code", 0);
|
||||
if (service.login(user.getUser(), user.getPassword())) {
|
||||
user = service.getUser(user.getUser());
|
||||
//user.setLogintoken(UUID.randomUUID().toString());
|
||||
RedisTools.set(user.getLogintoken(), user.getId() + "", 30 * 24 * 60);
|
||||
AppTools.setCookie(response, "login", user.getLogintoken(), -1);
|
||||
json.put("msg", "登陆成功");
|
||||
json.put("power", user.getPower());
|
||||
} else {
|
||||
json.put("code", -1);
|
||||
json.put("msg", "登陆失败");
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/user/logout.do")
|
||||
public JSONObject logout(HttpServletRequest request, HttpServletResponse response) {
|
||||
JSONObject json = new JSONObject();
|
||||
String token = AppTools.getLoginToken(request);
|
||||
if (StringUtils.isEmpty(token)) {
|
||||
json.put("code", -1);
|
||||
json.put("msg", "注销失败");
|
||||
} else {
|
||||
UUser user = service.getUserToToken(token);
|
||||
if (user != null) {
|
||||
RedisTools.remove(user.getLogintoken());
|
||||
user.setLogintoken("");
|
||||
service.update(user);
|
||||
AppTools.deleteCookie(request, response, "login");
|
||||
json.put("code", 0);
|
||||
json.put("msg", "注销成功");
|
||||
} else {
|
||||
json.put("code", -2);
|
||||
json.put("msg", "注销失败");
|
||||
}
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/user/set/update.do")
|
||||
public JSONObject update(UUser user, HttpServletRequest request) {
|
||||
JSONObject json = new JSONObject();
|
||||
String token = AppTools.getLoginToken(request);
|
||||
if (StringUtils.isEmpty(token)) {
|
||||
json.put("code", -1);
|
||||
json.put("msg", "未登录");
|
||||
} else {
|
||||
UUser loginUser = service.getUserToUid(Integer.parseInt(RedisTools.get(token)));
|
||||
if (loginUser != null) {
|
||||
user.setLogintoken("");
|
||||
user.setId(loginUser.getId());
|
||||
user.setPower(loginUser.getPower());
|
||||
user.setBiliCookie(loginUser.getBiliCookie());
|
||||
user.setSubtime(loginUser.getSubtime());
|
||||
user.setPassword(AppTools.getMD5(user.getPassword()));
|
||||
service.update(user);
|
||||
json.put("code", 0);
|
||||
json.put("msg", "修改成功");
|
||||
} else {
|
||||
json.put("code", -2);
|
||||
json.put("msg", "修改失败");
|
||||
}
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/user/up/list.do")
|
||||
public JSONObject uplist(HttpServletRequest request) {
|
||||
JSONObject json = new JSONObject();
|
||||
String token = AppTools.getLoginToken(request);
|
||||
if (StringUtils.isEmpty(token)) {
|
||||
json.put("code", "-1");
|
||||
json.put("msg", "未登录");
|
||||
} else {
|
||||
json.put("code", 0);
|
||||
json.put("msg", "ok");
|
||||
json.put("data", service.getUserUp(Integer.parseInt(RedisTools.get(token))));
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/user/up/set/add.do")
|
||||
public JSONObject addUp(HttpServletRequest request, BilibiliUpInfo info) {
|
||||
JSONObject json = new JSONObject();
|
||||
return json;
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/user/get/test.do")
|
||||
public JSONObject testUser(HttpServletRequest request) {
|
||||
JSONObject json = new JSONObject();
|
||||
String token = AppTools.getLoginToken(request);
|
||||
if (StringUtils.isEmpty(token)) {
|
||||
json.put("code", -1);
|
||||
json.put("msg", "未登录");
|
||||
} else {
|
||||
UUser user = service.getUserToUid(Integer.parseInt(RedisTools.get(token)));
|
||||
if (user == null) {
|
||||
json.put("code", -2);
|
||||
json.put("msg", "未登录");
|
||||
return json;
|
||||
}
|
||||
JSONArray powers = JSONArray.parseArray(user.getPower());
|
||||
JSONObject ujson = JSONObject.parseObject(JSONObject.toJSONString(user));
|
||||
ujson.remove("logintoken");
|
||||
ujson.remove("biliCookie");
|
||||
ujson.remove("password");
|
||||
ujson.remove("subtime");
|
||||
ujson.put("power", powers);
|
||||
json.put("code", 0);
|
||||
json.put("data", ujson);
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package com.yutou.bilibili.Controllers;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.bilibili.Tools.FileServerUtils;
|
||||
import com.yutou.bilibili.Tools.Tools;
|
||||
import com.yutou.bilibili.datas.ResultData;
|
||||
import com.yutou.bilibili.datas.VideoFilePath;
|
||||
import com.yutou.bilibili.services.LiveVideoService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.core.io.FileSystemResource;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
@Controller
|
||||
public class VideoFileController {
|
||||
@Resource
|
||||
LiveVideoService videoService;
|
||||
|
||||
@ResponseBody
|
||||
@RequestMapping("/file/list")
|
||||
public JSONObject getFileList(String roomId) {
|
||||
List<VideoFilePath> list;
|
||||
if (StringUtils.hasText(roomId)) {
|
||||
list = videoService.getVideoPath(roomId);
|
||||
} else {
|
||||
list = videoService.getAllVideoPath();
|
||||
}
|
||||
return ResultData.success(list);
|
||||
}
|
||||
@RequestMapping("/file/{base64}")
|
||||
@ResponseBody
|
||||
public ResponseEntity<FileSystemResource> getFile(@PathVariable String base64) {
|
||||
File file = FileServerUtils.toFile(base64);
|
||||
System.out.println(file.getAbsolutePath());
|
||||
return Tools.getFile(file);
|
||||
}
|
||||
|
||||
}
|
@ -1,212 +0,0 @@
|
||||
package com.yutou.bilibili.QQBot;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.napcat.QQDatabase;
|
||||
import com.yutou.napcat.QQNumberManager;
|
||||
import com.yutou.napcat.handle.BaseHandle;
|
||||
import com.yutou.napcat.handle.MessageHandleBuild;
|
||||
import com.yutou.napcat.handle.Reply;
|
||||
import com.yutou.napcat.handle.Text;
|
||||
import com.yutou.napcat.http.NapCatApi;
|
||||
import com.yutou.napcat.model.FriendBean;
|
||||
import com.yutou.napcat.model.GroupBean;
|
||||
import com.yutou.napcat.model.SendMessageResponse;
|
||||
import com.yutou.okhttp.HttpBody;
|
||||
import com.yutou.okhttp.HttpCallback;
|
||||
import com.yutou.utils.ConfigTools;
|
||||
import okhttp3.Headers;
|
||||
import retrofit2.Response;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class QQBotManager {
|
||||
|
||||
public static Long defGroup = 891655174L;
|
||||
public static Long defQQ = 583819556L;
|
||||
|
||||
|
||||
private static QQBotManager botManager = null;
|
||||
private static final long qqGroup = 891655174L;
|
||||
private boolean isLogin = false;
|
||||
private static boolean isInit = false;
|
||||
|
||||
|
||||
private QQBotManager() {
|
||||
Boolean isRun = ConfigTools.load(ConfigTools.CONFIG, "qq_bot", Boolean.class);
|
||||
if (isRun != null && isRun) {
|
||||
isLogin = true;
|
||||
init();
|
||||
}
|
||||
}
|
||||
|
||||
private void init() {
|
||||
NapCatApi.getGroupApi().getGroupList().enqueue(new HttpCallback<List<GroupBean>>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers,int code, String status, List<GroupBean> response, String rawResponse) {
|
||||
for (GroupBean groupBean : response) {
|
||||
QQDatabase.addGroup(groupBean.getGroupId(), groupBean);
|
||||
QQNumberManager.getManager().addNumber(groupBean.getGroupId(), true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
|
||||
}
|
||||
});
|
||||
NapCatApi.getFriendApi().getFriendList().enqueue(new HttpCallback<List<FriendBean>>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers,int code, String status, List<FriendBean> response, String rawResponse) {
|
||||
for (FriendBean friendBean : response) {
|
||||
QQDatabase.addUser(friendBean.getUserId(), friendBean);
|
||||
QQNumberManager.getManager().addNumber(friendBean.getUserId(), false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
|
||||
}
|
||||
});
|
||||
NapCatApi.getUtilsApi().getLoginInfo().enqueue(new HttpCallback<FriendBean>() {
|
||||
@Override
|
||||
public void onResponse(Headers headers,int code, String status, FriendBean response, String rawResponse) {
|
||||
QQDatabase.setMe(response);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
|
||||
}
|
||||
});
|
||||
isInit = true;
|
||||
}
|
||||
|
||||
public synchronized static QQBotManager getInstance() {
|
||||
if (botManager == null && !isInit) {
|
||||
botManager = new QQBotManager();
|
||||
}
|
||||
return botManager;
|
||||
}
|
||||
|
||||
|
||||
private String getNotLoginQQ() {
|
||||
return "没有登录QQ";
|
||||
}
|
||||
|
||||
public SendMessageResponse sendPrivateMessage(Long qq, BaseHandle<?>... items) {
|
||||
return sendMessage(true, qq, items);
|
||||
}
|
||||
|
||||
private SendMessageResponse sendGroupMessage(Long group, BaseHandle<?>... items) {
|
||||
return sendMessage(false, group, items);
|
||||
}
|
||||
|
||||
public SendMessageResponse sendMessage(boolean user, Long qq, String msg) {
|
||||
return sendMessage(user, qq, new Text(msg));
|
||||
}
|
||||
|
||||
public SendMessageResponse sendMessage(Long qq, BaseHandle<?>... items) {
|
||||
return sendMessage(QQDatabase.checkFriend(qq), qq, Arrays.asList(items));
|
||||
}
|
||||
|
||||
public SendMessageResponse sendMessage(boolean isUser, Long qq, BaseHandle<?>... items) {
|
||||
return sendMessage(isUser, qq, Arrays.asList(items));
|
||||
}
|
||||
|
||||
public SendMessageResponse sendMessage(boolean isUser, Long qq, List<BaseHandle<?>> items) {
|
||||
try {
|
||||
if(!ConfigTools.load(ConfigTools.CONFIG,ConfigTools.QQ, Boolean.class)){
|
||||
return null;
|
||||
}
|
||||
MessageHandleBuild handleBuild = MessageHandleBuild
|
||||
.create()
|
||||
.setGroup(!isUser)
|
||||
.setQQNumber(qq);
|
||||
for (BaseHandle<?> item : items) {
|
||||
if (item.getData() == null) {
|
||||
continue;
|
||||
}
|
||||
if (item instanceof Reply) {
|
||||
if (((Reply) item).getData().getId() == -1) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
handleBuild.add(item);
|
||||
}
|
||||
Response<HttpBody<SendMessageResponse>> response;
|
||||
if (isUser) {
|
||||
response = NapCatApi.getMessageApi().sendPrivateMsg(
|
||||
handleBuild.build()
|
||||
).execute();
|
||||
} else {
|
||||
response = NapCatApi.getMessageApi().sendGroupMsg(
|
||||
handleBuild.build()
|
||||
).execute();
|
||||
}
|
||||
if (response.body() != null) {
|
||||
return response.body().getData();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
SendMessageResponse response = new SendMessageResponse();
|
||||
response.setId(-1);
|
||||
response.setE(e.getMessage());
|
||||
return response;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String sendMessage(String text) {
|
||||
|
||||
return getNotLoginQQ();
|
||||
}
|
||||
|
||||
public SendMessageResponse sendMessage(Long group, String text) {
|
||||
return sendMessage(QQDatabase.checkFriend(group), group, new Text(text));
|
||||
}
|
||||
|
||||
public void sendMessage(Long group, StringBuilder builder) {
|
||||
if (QQNumberManager.getManager().isGroup(group)) {
|
||||
System.out.println("发群");
|
||||
} else {
|
||||
System.out.println("发个人");
|
||||
}
|
||||
}
|
||||
|
||||
public void sendMessage(File imageFile, Long qq, String text) {
|
||||
sendMessage(imageFile, qq, null, text);
|
||||
}
|
||||
|
||||
public void sendMessage(File imageFile, Long qq, String replyMessageId, String text) {
|
||||
|
||||
}
|
||||
|
||||
public void sendMessage(File imageFile, String text) {
|
||||
}
|
||||
|
||||
public void sendMessage(List<File> imgs, Long qq, String text) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("t1", 3234567890L);
|
||||
System.out.println("json = " + json);
|
||||
|
||||
String tmp = json.toString();
|
||||
JSONObject json2 = JSONObject.parseObject(tmp);
|
||||
System.out.println("json2 = " + json2);
|
||||
}
|
||||
|
||||
|
||||
public boolean isLogin() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
package com.yutou.bilibili.Services;
|
||||
|
||||
public interface ISystemConfigService {
|
||||
String getConfig(String key);
|
||||
void setConfig(String key,String value);
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
package com.yutou.bilibili.Services;
|
||||
|
||||
import com.yutou.bilibili.mybatis.model.UBiliUp;
|
||||
import com.yutou.bilibili.mybatis.model.UUser;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface IUserService {
|
||||
boolean login(String uname,String password);
|
||||
boolean reg(UUser user);
|
||||
boolean addUp(UBiliUp up);
|
||||
boolean removeUp(UUser user,UBiliUp up);
|
||||
boolean update(UUser user);
|
||||
UUser getUser(String uname);
|
||||
UUser getUserToUid(Integer uid);
|
||||
UUser getUserToToken(String token);
|
||||
List<UBiliUp> getUserUp(int uid);
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
package com.yutou.bilibili.Services.impl;
|
||||
|
||||
import com.yutou.bilibili.Services.ISystemConfigService;
|
||||
import com.yutou.bilibili.mybatis.dao.SConfigDao;
|
||||
import com.yutou.bilibili.mybatis.model.SConfig;
|
||||
import com.yutou.bilibili.mybatis.model.SConfigExample;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service("SystemConfigService")
|
||||
public class SystemConfigImpl implements ISystemConfigService {
|
||||
@Resource
|
||||
SConfigDao configDao;
|
||||
@Override
|
||||
public String getConfig(String key) {
|
||||
SConfigExample example=new SConfigExample();
|
||||
example.createCriteria().andConfigkeyEqualTo(key);
|
||||
List<SConfig> list=configDao.selectByExample(example);
|
||||
if(list.isEmpty()) {
|
||||
return null;
|
||||
}else{
|
||||
return list.get(0).getConfigvalue();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setConfig(String key, String value) {
|
||||
SConfig config=new SConfig();
|
||||
if(getConfig(key)!=null){
|
||||
SConfigExample example=new SConfigExample();
|
||||
example.createCriteria().andConfigkeyEqualTo(key);
|
||||
config=configDao.selectByExample(example).get(0);
|
||||
config.setConfigvalue(value);
|
||||
configDao.updateByPrimaryKey(config);
|
||||
}else {
|
||||
config.setConfigkey(key);
|
||||
config.setConfigvalue(value);
|
||||
configDao.insert(config);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,110 +0,0 @@
|
||||
package com.yutou.bilibili.Services.impl;
|
||||
|
||||
import com.yutou.bilibili.Services.IUserService;
|
||||
import com.yutou.bilibili.mybatis.dao.UBiliUpDao;
|
||||
import com.yutou.bilibili.mybatis.dao.UUserDao;
|
||||
import com.yutou.bilibili.mybatis.model.UBiliUp;
|
||||
import com.yutou.bilibili.mybatis.model.UBiliUpExample;
|
||||
import com.yutou.bilibili.mybatis.model.UUser;
|
||||
import com.yutou.bilibili.mybatis.model.UUserExample;
|
||||
import com.yutou.utils.AppTools;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service("UserService")
|
||||
public class UserServiceImpl implements IUserService {
|
||||
@Resource
|
||||
UUserDao userDao;
|
||||
@Resource
|
||||
UBiliUpDao upDao;
|
||||
@Override
|
||||
public boolean login(String uname, String password) {
|
||||
UUserExample example=new UUserExample();
|
||||
String _password= AppTools.getMD5 (password);
|
||||
example.createCriteria().andUserEqualTo(uname).andPasswordEqualTo(_password);
|
||||
return !userDao.selectByExample(example).isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean reg(UUser user) {
|
||||
if(checkUser(user.getUser())){
|
||||
return false;
|
||||
}
|
||||
user.setPassword(AppTools.getMD5 (user.getPassword()));
|
||||
return userDao.insert(user)>0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addUp(UBiliUp up) {
|
||||
if(checkUP(up.getUid(),up.getRoomid())){
|
||||
return false;
|
||||
}
|
||||
return upDao.insert(up)>0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeUp(UUser user, UBiliUp up) {
|
||||
if(checkUP(up.getUid(),up.getRoomid())){
|
||||
return false;
|
||||
}
|
||||
return upDao.deleteByPrimaryKey(up.getId())>0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean update(UUser user) {
|
||||
return userDao.updateByPrimaryKey(user)>0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUser getUser(String uname) {
|
||||
UUserExample example=new UUserExample();
|
||||
example.createCriteria().andUserEqualTo(uname);
|
||||
List<UUser> list=userDao.selectByExample(example);
|
||||
if(list.isEmpty()){
|
||||
return null;
|
||||
}else{
|
||||
return list.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUser getUserToUid(Integer uid) {
|
||||
return userDao.selectByPrimaryKey(uid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UBiliUp> getUserUp(int uid) {
|
||||
UBiliUpExample example=new UBiliUpExample();
|
||||
example.createCriteria().andUidEqualTo(uid);
|
||||
return upDao.selectByExample(example);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUser getUserToToken(String token) {
|
||||
if(StringUtils.isEmpty(token)){
|
||||
return null;
|
||||
}
|
||||
UUserExample example=new UUserExample();
|
||||
example.createCriteria().andLogintokenEqualTo(token);
|
||||
List<UUser> list=userDao.selectByExample(example);
|
||||
if(list.isEmpty()){
|
||||
return null;
|
||||
}else{
|
||||
return list.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean checkUser(String uname){
|
||||
UUserExample example=new UUserExample();
|
||||
example.createCriteria().andUserEqualTo(uname);
|
||||
return !userDao.selectByExample(example).isEmpty();
|
||||
}
|
||||
public boolean checkUP(int uid,int roomId){
|
||||
UBiliUpExample example=new UBiliUpExample();
|
||||
example.createCriteria().andUidEqualTo(uid).andRoomidEqualTo(roomId);
|
||||
return !upDao.selectByExample(example).isEmpty();
|
||||
}
|
||||
}
|
@ -1,8 +1,20 @@
|
||||
package com.yutou.bilibili.Test;
|
||||
|
||||
import com.yutou.bilibili.Tools.AESTools;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
@Controller
|
||||
public class TestController {
|
||||
|
||||
@RequestMapping("/test")
|
||||
@ResponseBody
|
||||
public String test() {
|
||||
return "f";
|
||||
}
|
||||
@RequestMapping("/test2")
|
||||
@ResponseBody
|
||||
public String test2() {
|
||||
return AESTools.encrypt("f");
|
||||
}
|
||||
}
|
||||
|
52
src/main/java/com/yutou/bilibili/Tools/AESTools.java
Normal file
52
src/main/java/com/yutou/bilibili/Tools/AESTools.java
Normal file
@ -0,0 +1,52 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.KeyGenerator;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Base64;
|
||||
|
||||
public class AESTools {
|
||||
private static final String key="fJjSoOM7tDIQN0Ne";
|
||||
private static final String model="AES/ECB/PKCS5Padding";
|
||||
|
||||
/**
|
||||
* 加密
|
||||
* @param value 原文
|
||||
* @return 密文
|
||||
*/
|
||||
public static String encrypt(String value){
|
||||
try {
|
||||
KeyGenerator generator=KeyGenerator.getInstance("AES");
|
||||
generator.init(128);
|
||||
Cipher cipher=Cipher.getInstance(model);
|
||||
cipher.init(Cipher.ENCRYPT_MODE,new SecretKeySpec(key.getBytes(),"AES"));
|
||||
byte[] bytes=cipher.doFinal(value.getBytes(StandardCharsets.UTF_8));
|
||||
return new String(Base64.getEncoder().encode(bytes));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解密
|
||||
* @param value 密文
|
||||
* @return 原文
|
||||
*/
|
||||
public static String decrypt(String value){
|
||||
try {
|
||||
KeyGenerator generator=KeyGenerator.getInstance("AES");
|
||||
generator.init(128);
|
||||
Cipher cipher=Cipher.getInstance(model);
|
||||
cipher.init(Cipher.DECRYPT_MODE,new SecretKeySpec(key.getBytes(),"AES"));
|
||||
byte[] encodeBytes=Base64.getDecoder().decode(value);
|
||||
byte[] bytes=cipher.doFinal(encodeBytes);
|
||||
return new String(bytes);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.yutou.bilibili.Services.IUserService;
|
||||
import com.yutou.bilibili.mybatis.dao.PermissionDao;
|
||||
import com.yutou.bilibili.mybatis.model.Permission;
|
||||
import com.yutou.bilibili.mybatis.model.PermissionExample;
|
||||
import com.yutou.bilibili.mybatis.model.UUser;
|
||||
import com.yutou.utils.AppTools;
|
||||
import com.yutou.utils.Log;
|
||||
import com.yutou.utils.RedisTools;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.*;
|
||||
import jakarta.servlet.annotation.WebFilter;
|
||||
import jakarta.servlet.http.Cookie;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
@WebFilter
|
||||
public class APIFilter implements Filter {
|
||||
@Resource
|
||||
IUserService service;
|
||||
@Resource
|
||||
PermissionDao permissionDao;
|
||||
|
||||
@Override
|
||||
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||
HttpServletRequest request = (HttpServletRequest) servletRequest;
|
||||
HttpServletResponse response = (HttpServletResponse) servletResponse;
|
||||
String token = request.getParameter("token");
|
||||
if (StringUtils.isEmpty(token)) {
|
||||
Cookie cookie = AppTools.getCookie(request, "login");
|
||||
if (cookie != null) {
|
||||
token = cookie.getValue();
|
||||
}
|
||||
}
|
||||
String tmp = request.getRequestURI();
|
||||
if (tmp.contains("/user/login.do")
|
||||
|| tmp.contains("/user/reg.do")
|
||||
|| tmp.contains("/user/logout.do")
|
||||
|| tmp.contains("/user/get/test.do")
|
||||
|| tmp.contains("/system/public/reg.do")
|
||||
|| tmp.contains("/favicon.ico")
|
||||
) {
|
||||
filterChain.doFilter(servletRequest, servletResponse);
|
||||
} else {
|
||||
if (StringUtils.isEmpty(token)) {
|
||||
response.sendRedirect("/");
|
||||
return;
|
||||
}
|
||||
UUser user = service.getUserToUid(Integer.parseInt(RedisTools.get(token)));
|
||||
if (user == null) {
|
||||
response.sendRedirect("/");
|
||||
} else {
|
||||
String url = null;
|
||||
try {
|
||||
url = tmp.split(tmp.split("/")[tmp.split("/").length - 1])[0];
|
||||
} catch (Exception e) {
|
||||
Log.e(e);
|
||||
Log.i("无权限请求:" + tmp);
|
||||
return;
|
||||
}
|
||||
JSONArray powers = JSONArray.parseArray(user.getPower());
|
||||
if (powers.toJavaList(Integer.class).contains(-1)) {
|
||||
filterChain.doFilter(servletRequest, servletResponse);
|
||||
} else {
|
||||
PermissionExample pExample = new PermissionExample();
|
||||
pExample.createCriteria().andUrlEqualTo(url);
|
||||
List<Permission> permissions = permissionDao.selectByExample(pExample);
|
||||
if (permissions != null && permissions.size() > 0) {
|
||||
if (powers.toJavaList(Integer.class).contains(permissions.get(0).getId())) {
|
||||
filterChain.doFilter(servletRequest, servletResponse);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,14 +1,19 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.yutou.utils.Log;
|
||||
import com.yutou.bilibili.services.SystemService;
|
||||
import com.yutou.common.utils.Log;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.event.ContextClosedEvent;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class ApplicationClose implements ApplicationListener<ContextClosedEvent> {
|
||||
@Resource
|
||||
SystemService systemConfigService;
|
||||
@Override
|
||||
public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
|
||||
Log.i("服务结束");
|
||||
systemConfigService.stop();
|
||||
}
|
||||
}
|
||||
|
@ -1,22 +1,13 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.yutou.bilibili.BiliBili.Datas.AppData;
|
||||
import com.yutou.bilibili.BiliBili.Datas.LiveData;
|
||||
import com.yutou.bilibili.Services.ISystemConfigService;
|
||||
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliLiveInfo;
|
||||
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo;
|
||||
import com.yutou.bilibili.services.SystemService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.boot.ApplicationArguments;
|
||||
import org.springframework.boot.ApplicationRunner;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.ParsePosition;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* 服务启动后执行
|
||||
@ -24,73 +15,13 @@ import java.util.TimerTask;
|
||||
@Component
|
||||
public class ApplicationInit implements ApplicationRunner {
|
||||
@Resource
|
||||
ISystemConfigService configService;
|
||||
private Timer timer;
|
||||
|
||||
SystemService systemConfigService;
|
||||
|
||||
@Override
|
||||
public void run(ApplicationArguments args) throws Exception {
|
||||
AppData.FFMPEG = configService.getConfig(Config.SYSTEM_VIDEO_FFMPEG);
|
||||
AppData.LIVE_SAVE_FFMPEG = configService.getConfig(Config.SYSTEM_VIDEO_SAVE_MODEL) != null && configService.getConfig(Config.SYSTEM_VIDEO_SAVE_MODEL).equals("ffmpeg");
|
||||
startTimer();
|
||||
Logger logger = Logger.getLogger("ApplicationInit");
|
||||
logger.log(Level.INFO, "服务启动后执行");
|
||||
systemConfigService.start();
|
||||
}
|
||||
|
||||
private void startTimer() {
|
||||
if (timer == null) {
|
||||
timer = new Timer();
|
||||
timer.schedule(new TimerTask() {
|
||||
String oldTime = "";
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
Date date = new Date();
|
||||
String time = new SimpleDateFormat("HH:mm").format(date);
|
||||
if (time.equals(oldTime)) {
|
||||
return;
|
||||
}
|
||||
checkLive();
|
||||
oldTime = time;
|
||||
switch (time) {
|
||||
case "00:00":
|
||||
|
||||
break;
|
||||
case "01:00":
|
||||
case "02:00":
|
||||
case "03:00":
|
||||
case "04:00":
|
||||
case "05:00":
|
||||
case "06:00":
|
||||
case "07:00":
|
||||
case "08:00":
|
||||
case "09:00":
|
||||
case "10:00":
|
||||
case "11:00":
|
||||
case "12:00":
|
||||
case "13:00":
|
||||
case "14:00":
|
||||
case "15:00":
|
||||
case "16:00":
|
||||
case "17:00":
|
||||
case "18:00":
|
||||
case "19:00":
|
||||
case "20:00":
|
||||
case "21:00":
|
||||
case "22:00":
|
||||
case "23:00":
|
||||
case "23:59":
|
||||
saveData(time);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void checkLive() {
|
||||
|
||||
}
|
||||
}, 0, 2 * 60 * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
public void saveData(String time) {
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.yutou.bilibili.BiliBili.Datas.DanmuData;
|
||||
import com.yutou.bilibili.datas.DanmuData;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
@ -17,7 +17,7 @@ public class AssTools {
|
||||
private final Date startTime;
|
||||
private int y = 0;
|
||||
private List<String> filters = new ArrayList<>();
|
||||
private String alpha="80";
|
||||
private String alpha="100";
|
||||
|
||||
/**
|
||||
* 弹幕转换ass
|
||||
@ -140,7 +140,7 @@ public class AssTools {
|
||||
y,
|
||||
x2,
|
||||
y,
|
||||
danmuData.getFontColorHex(),
|
||||
danmuData.getFontColor(),
|
||||
alpha,
|
||||
danmuData.getDanmu()
|
||||
);
|
||||
|
@ -1,8 +0,0 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
public class Config {
|
||||
public static final String USER_REG="userReg";
|
||||
public static final String BILI_LIVE_FLAG="biliLive";
|
||||
public static final String SYSTEM_VIDEO_FFMPEG="ffmpeg_path";
|
||||
public static final String SYSTEM_VIDEO_SAVE_MODEL="save_live_model";
|
||||
}
|
@ -1,66 +0,0 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.yutou.bilibili.BiliBili.Datas.DanmuData;
|
||||
import com.yutou.bilibili.sqlite.BiliBiliLiveDatabasesManager;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.nio.file.attribute.FileTime;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class DanmuTools {
|
||||
public static File danmuToAss(File live, File danmu, boolean useFileNameData, String... filterDanmu) {
|
||||
BiliBiliLiveDatabasesManager manager = new BiliBiliLiveDatabasesManager();
|
||||
try {
|
||||
FileTime creationTime = Files.readAttributes(Paths.get(live.getAbsolutePath()), BasicFileAttributes.class).creationTime();
|
||||
FileTime lastModifiedTime = Files.readAttributes(Paths.get(live.getAbsolutePath()), BasicFileAttributes.class).lastModifiedTime();
|
||||
Date startTime;
|
||||
if (useFileNameData) {
|
||||
startTime = getLiveDate(live.getName());
|
||||
} else {
|
||||
startTime = new Date(creationTime.toMillis());
|
||||
}
|
||||
manager.init(danmu);
|
||||
List<DanmuData> danmuData = manager.queryDanmu(startTime, new Date(lastModifiedTime.toMillis()));
|
||||
AssTools assTools = new AssTools(live.getName(), startTime);
|
||||
assTools.addFilter(filterDanmu);
|
||||
assTools.setAlpha(128);
|
||||
for (DanmuData danmuDatum : danmuData) {
|
||||
assTools.addDanmu(danmuDatum);
|
||||
}
|
||||
assTools.saveDanmu(live.getAbsolutePath().replace(live.getName().substring(live.getName().lastIndexOf(".")), ".ass"));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
manager.close();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Date getLiveDate(String fileName) {
|
||||
Pattern pattern = Pattern.compile("(\\[.*\\]).");
|
||||
Matcher matcher = pattern.matcher(fileName);
|
||||
if (matcher.find()) {
|
||||
String str = matcher.group(1);
|
||||
try {
|
||||
return new SimpleDateFormat("[yyyy-MM-dd HHmmss]").parse(str);
|
||||
} catch (ParseException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
File live = new File("Z:\\download\\演唱会or录播\\2022年2月11日Liyuu_1st演唱会\\[2022-02-11 163454]5265.mp4");
|
||||
File danmu = new File("Z:\\download\\演唱会or录播\\2022年2月11日Liyuu_1st演唱会\\[2022-02-11]5265.db");
|
||||
danmuToAss(live, danmu,true, "老板大气!点点红包抽礼物!");
|
||||
}
|
||||
}
|
22
src/main/java/com/yutou/bilibili/Tools/DateFormatUtils.java
Normal file
22
src/main/java/com/yutou/bilibili/Tools/DateFormatUtils.java
Normal file
@ -0,0 +1,22 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
public class DateFormatUtils {
|
||||
public static String format(Date date,String format){
|
||||
return new SimpleDateFormat(format).format(date);
|
||||
}
|
||||
public static String format(long time,String format){
|
||||
return new SimpleDateFormat(format).format(new Date(time));
|
||||
}
|
||||
public static String format(long time){
|
||||
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(time));
|
||||
}
|
||||
public static String format(Date date){
|
||||
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(date);
|
||||
}
|
||||
public static String format(){
|
||||
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
|
||||
}
|
||||
}
|
@ -1,155 +0,0 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.yutou.bilibili.mybatis.Bili.mybatis.dao.BilibiliLiveDataDao;
|
||||
import com.yutou.bilibili.mybatis.Bili.mybatis.dao.BilibiliLiveInfoDao;
|
||||
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliLiveData;
|
||||
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliLiveInfo;
|
||||
import com.yutou.utils.AppTools;
|
||||
import com.yutou.utils.Log;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.apache.poi.ss.usermodel.*;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import static com.yutou.bilibili.BiliBili.Datas.LiveData.*;
|
||||
|
||||
public class ExcelUtils implements ApplicationContextAware {
|
||||
|
||||
@Resource
|
||||
BilibiliLiveDataDao dataDao;
|
||||
@Resource
|
||||
BilibiliLiveInfoDao infoDao;
|
||||
|
||||
public static File getInstance(int roomId, Date startTime, Date endTime,String fileName) {
|
||||
ExcelUtils utils = new ExcelUtils();
|
||||
long timer=System.currentTimeMillis();
|
||||
Log.i("开始注入bean");
|
||||
utils.dataDao = getBean(BilibiliLiveDataDao.class);
|
||||
utils.infoDao = getBean(BilibiliLiveInfoDao.class);
|
||||
Log.i("注入完毕:"+(System.currentTimeMillis()-timer));
|
||||
return utils.initTable(roomId, startTime, endTime,fileName);
|
||||
}
|
||||
|
||||
public ExcelUtils() {
|
||||
|
||||
}
|
||||
|
||||
private File initTable(int roomId, Date startTime, Date endTime,String fileName) {
|
||||
long timer=System.currentTimeMillis();
|
||||
Log.i("进入统计:"+timer);
|
||||
Workbook workbook = new XSSFWorkbook();
|
||||
Sheet liveData = workbook.createSheet("直播数据");
|
||||
Sheet liveInfo = workbook.createSheet("小时统计");
|
||||
Row dataRow = liveData.createRow(0);
|
||||
Row infoRow = liveInfo.createRow(0);
|
||||
createCell(dataRow.createCell(0), "id");
|
||||
createCell(dataRow.createCell(1), "uid");
|
||||
createCell(dataRow.createCell(2), "roomId");
|
||||
createCell(dataRow.createCell(3), "类型");
|
||||
createCell(dataRow.createCell(4), "内容");
|
||||
createCell(dataRow.createCell(5), "礼物id");
|
||||
createCell(dataRow.createCell(6), "礼物名称");
|
||||
createCell(dataRow.createCell(7), "礼物数量");
|
||||
createCell(dataRow.createCell(8), "金瓜子");
|
||||
createCell(dataRow.createCell(9), "时间");
|
||||
|
||||
createCell(infoRow.createCell(0), "id");
|
||||
createCell(infoRow.createCell(1), "房间号");
|
||||
createCell(infoRow.createCell(2), "人气");
|
||||
createCell(infoRow.createCell(3), "普通用户入场数量");
|
||||
createCell(infoRow.createCell(4), "舰长入场数量");
|
||||
createCell(infoRow.createCell(5), "送礼人数");
|
||||
createCell(infoRow.createCell(6), "记录时间");
|
||||
|
||||
Log.i("表头插入完毕:"+(System.currentTimeMillis()-timer));
|
||||
List<BilibiliLiveData> dataList = dataDao.queryLiveData(roomId, startTime, endTime, new String[]{
|
||||
INTERACT_WORD,
|
||||
ENTRY_EFFECT,
|
||||
DANMU_MSG,
|
||||
SEND_GIFT,
|
||||
COMBO_SEND,
|
||||
SUPER_CHAT_MESSAGE,
|
||||
NOTICE_MSG,
|
||||
GUARD_BUY,
|
||||
UNKNOWN_MESSAGE
|
||||
});
|
||||
List<BilibiliLiveInfo> infoList = infoDao.queryTimeOfRoomid(roomId, startTime, endTime);
|
||||
int index = 1;
|
||||
for (BilibiliLiveData data : dataList) {
|
||||
dataRow = liveData.createRow(index++);
|
||||
createCell(dataRow.createCell(0), data.getId());
|
||||
createCell(dataRow.createCell(1), data.getUid());
|
||||
createCell(dataRow.createCell(2), data.getRoomid());
|
||||
createCell(dataRow.createCell(3), data.getType());
|
||||
createCell(dataRow.createCell(4), data.getMsg());
|
||||
createCell(dataRow.createCell(5), data.getGiftid());
|
||||
createCell(dataRow.createCell(6), data.getGiftname());
|
||||
createCell(dataRow.createCell(7), data.getGiftindex());
|
||||
createCell(dataRow.createCell(8), data.getPrice());
|
||||
createCell(dataRow.createCell(9), AppTools.getToDayTimeToString(data.getSubtime()));
|
||||
}
|
||||
index = 1;
|
||||
for (BilibiliLiveInfo info : infoList) {
|
||||
infoRow = liveInfo.createRow(index++);
|
||||
createCell(infoRow.createCell(0), info.getId());
|
||||
createCell(infoRow.createCell(1), info.getRoomid());
|
||||
createCell(infoRow.createCell(2), info.getPopular());
|
||||
createCell(infoRow.createCell(3), info.getUserindex());
|
||||
createCell(infoRow.createCell(4), info.getVipuserindex());
|
||||
createCell(infoRow.createCell(5), info.getGiftuser());
|
||||
createCell(infoRow.createCell(6), AppTools.getToDayTimeToString(info.getSubtime()));
|
||||
}
|
||||
Log.i("数据填充完毕:"+(System.currentTimeMillis()-timer));
|
||||
try {
|
||||
if(!new File("excel").exists()){
|
||||
new File("excel").mkdirs();
|
||||
}
|
||||
File file = new File("excel"+File.separator+fileName+".tmp");
|
||||
FileOutputStream fileOutputStream = new FileOutputStream(file);
|
||||
workbook.write(fileOutputStream);
|
||||
workbook.close();
|
||||
Log.i("文件写入完毕:"+(System.currentTimeMillis()-timer));
|
||||
file.renameTo(new File("excel"+File.separator+fileName));
|
||||
return file;
|
||||
} catch (Exception e) {
|
||||
Log.e(e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void createCell(Cell cell, Object data) {
|
||||
if (data == null)
|
||||
data = 0;
|
||||
if (data instanceof String) {
|
||||
cell.setCellType(CellType.STRING);
|
||||
cell.setCellValue((String) data);
|
||||
} else {
|
||||
cell.setCellType(CellType.NUMERIC);
|
||||
|
||||
cell.setCellValue((int) data);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private static ApplicationContext applicationContext;
|
||||
|
||||
@Override
|
||||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||
if (ExcelUtils.applicationContext == null) {
|
||||
ExcelUtils.applicationContext = applicationContext;
|
||||
}
|
||||
}
|
||||
|
||||
public static <T> T getBean(Class<T> clazz) {
|
||||
return applicationContext.getBean(clazz);
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.yutou.utils.AppTools;
|
||||
import com.yutou.utils.Log;
|
||||
import com.yutou.common.utils.AppTools;
|
||||
import com.yutou.common.utils.Log;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
|
18
src/main/java/com/yutou/bilibili/Tools/FileServerUtils.java
Normal file
18
src/main/java/com/yutou/bilibili/Tools/FileServerUtils.java
Normal file
@ -0,0 +1,18 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.yutou.common.utils.Base64Tools;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URLDecoder;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
public class FileServerUtils {
|
||||
public static String toUrl(String file) {
|
||||
return "/file/" + URLEncoder.encode(Base64Tools.encode(file), StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
public static File toFile(String base64) {
|
||||
return new File(URLDecoder.decode(Base64Tools.decode(base64), StandardCharsets.UTF_8));
|
||||
}
|
||||
}
|
@ -1,262 +0,0 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.yutou.bilibili.interfaces.DownloadInterface;
|
||||
import com.yutou.utils.Log;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class HttpTools {
|
||||
private static final int HttpRequestIndex = 3;
|
||||
|
||||
public static String get(String url) {
|
||||
return https_get(url, null);
|
||||
}
|
||||
|
||||
public static String post(final String url, final byte[] body) {
|
||||
return http_post(url, body, 0, null);
|
||||
}
|
||||
|
||||
public static File syncDownload(final String url, final String saveName) {
|
||||
return new HttpTools().http_syncDownload(url, saveName);
|
||||
}
|
||||
|
||||
public static String https_get(String url, Map<String, String> header) {
|
||||
try {
|
||||
URLConnection connection;
|
||||
connection = new URL(url).openConnection();
|
||||
connection.setConnectTimeout(60*1000);
|
||||
connection.setReadTimeout(60*1000);
|
||||
connection.setRequestProperty("User-Agent", getExtUa());
|
||||
if (header != null) {
|
||||
for (String key : header.keySet()) {
|
||||
connection.addRequestProperty(key, header.get(key));
|
||||
}
|
||||
}
|
||||
connection.connect();
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
StringBuilder str = new StringBuilder();
|
||||
String tmp;
|
||||
while ((tmp = reader.readLine()) != null) {
|
||||
str.append(tmp).append("\n");
|
||||
}
|
||||
reader.close();
|
||||
return str.toString();
|
||||
} catch (Exception e) {
|
||||
System.err.println("error url = " + url);
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String http_post(String url, byte[] body, int index, Map<String, String> headers) {
|
||||
String tmp;
|
||||
StringBuilder str = new StringBuilder();
|
||||
try {
|
||||
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
||||
connection.setRequestMethod("POST");
|
||||
if (headers != null) {
|
||||
for (String key : headers.keySet()) {
|
||||
connection.addRequestProperty(key, headers.get(key));
|
||||
}
|
||||
}
|
||||
connection.setDoOutput(true);
|
||||
connection.setDoInput(true);
|
||||
connection.addRequestProperty("User-Agent", getExtUa());
|
||||
connection.setConnectTimeout(5 * 1000);
|
||||
connection.setReadTimeout(10 * 1000);
|
||||
//connection.addRequestProperty("Connection", "keep-alive");
|
||||
//connection.addRequestProperty("User-Agent", getExtUa());
|
||||
connection.addRequestProperty("content-type", "application/json");
|
||||
//connection.addRequestProperty("charset", "UTF-8");
|
||||
OutputStream outputStream = connection.getOutputStream();
|
||||
//System.out.println(new String(body));
|
||||
outputStream.write(body);
|
||||
outputStream.flush();
|
||||
outputStream.close();
|
||||
connection.connect();
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
while ((tmp = reader.readLine()) != null) {
|
||||
str.append(tmp);
|
||||
}
|
||||
String finalStr = str.toString();
|
||||
|
||||
connection.disconnect();
|
||||
reader.close();
|
||||
return finalStr;
|
||||
} catch (Exception e) {
|
||||
if (index < HttpRequestIndex) {
|
||||
return http_post(url, body, index + 1, headers);
|
||||
} else {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String getExtUa() {
|
||||
return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36";
|
||||
}
|
||||
|
||||
private static String getKuKuUA() {
|
||||
return "/KUKU_APP(Android/#/cn.kuku.sdk/ttsdk17228/29401/A-2.9.4.01.KUSDK/868139039134314/fcddf839c8c135fa/F4:60:E2:AB:25:1A/460019406520644/+8618569400341/#/9/Redmi 6 Pro/xiaomi/1736/76fda4d6-cd6b-485f-987b-8d347b007f24/#/KUKU/Native/92972ea9651fbd2e)";
|
||||
}
|
||||
|
||||
public static String toUrlParams(JSONObject json) {
|
||||
StringBuilder string = new StringBuilder();
|
||||
Set<String> keys = json.keySet();
|
||||
for (String key : keys) {
|
||||
try {
|
||||
string.append("&").append(key).append("=").append(URLEncoder.encode(json.getString(key),"utf-8"));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
try {
|
||||
string.append("&").append(URLEncoder.encode(key, "utf-8")).append("=");
|
||||
// string += "&" + key + "=";
|
||||
} catch (Exception e1) {
|
||||
string.append("&").append(key).append("=");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string = new StringBuilder(string.substring(1, string.length()).replaceAll(" ", ""));
|
||||
return string.toString();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("pid", "102");
|
||||
json.put("gid", "100584");
|
||||
json.put("gameKey", "0gha58u1c9FjZkeAsEmYIzTvp");
|
||||
json.put("access_token", "659c-S1gV0DwMXdYjPDlSrSLNYOvA8qUoCSvmdFEHvZugKgNX4Z2BCwF18A7W2gRdG7WiWfKsbZgF6YssZHhaozksI9RBn2QQFTXzmAHtbMd4ginEEtwdKmPCM4JbJGg1ollqoNE0PcGENpa4F3e7EdSOa_JFyE6XyUQN1iurJU3F8MZfLlTIcTR9USYoHX15vsAkCht_0mrapZblkeY1_8HFrmK8rlenbZLxccy7PrMz5eZ9uPPDJL5OYiEahyrtLENB8SVmlGofJfQw8wUjN8_XVZSfLMujdwz24");
|
||||
String url = "http://192.168.1.156:9020/Faxing/reg?" +
|
||||
"&tpyeCode=dimai" +
|
||||
"®ParamJson=" + json.toJSONString();
|
||||
/* ExecutorService service= Executors.newCachedThreadPool();
|
||||
for (int i = 0; i < 3000; i++) {
|
||||
service.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
get(url);
|
||||
}
|
||||
});
|
||||
}*/
|
||||
}
|
||||
|
||||
private static String donwloadPath = "tmp" + File.separator;
|
||||
|
||||
public synchronized static void download(final String url, final String saveName, final DownloadInterface downloadInterface) {
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
File jar = null;
|
||||
try {
|
||||
File savePath = new File(donwloadPath);
|
||||
if (!savePath.exists()) {
|
||||
savePath.mkdirs();
|
||||
}
|
||||
Log.i("DOWNLOAD", "下载文件:" + url + " 保存文件:" + saveName);
|
||||
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
||||
connection.addRequestProperty("User-Agent", getExtUa());
|
||||
// Log.i(TAG,"获取到网络请求:"+connection.getResponseCode());
|
||||
|
||||
|
||||
InputStream inputStream = connection.getInputStream();
|
||||
jar = new File(donwloadPath + saveName + "_tmp.tmp");
|
||||
jar.createNewFile();
|
||||
Log.i("DOWNLOAD", "临时保存文件:" + jar.getAbsolutePath());
|
||||
OutputStream outputStream = new FileOutputStream(jar);
|
||||
byte[] bytes = new byte[1024];
|
||||
double size = connection.getContentLength();
|
||||
double downSize = 0;
|
||||
int len;
|
||||
while ((len = inputStream.read(bytes)) > 0) {
|
||||
outputStream.write(bytes, 0, len);
|
||||
downSize += len;
|
||||
if (downloadInterface != null) {
|
||||
downloadInterface.onDownloading(downSize, size);
|
||||
}
|
||||
}
|
||||
outputStream.close();
|
||||
inputStream.close();
|
||||
File oldJar = new File(donwloadPath + saveName);
|
||||
if (oldJar.exists()) {
|
||||
oldJar.delete();
|
||||
}
|
||||
jar.renameTo(oldJar);
|
||||
Log.i("DOWNLOAD", "实际保存:" + oldJar.getAbsolutePath() + " " + oldJar.getName());
|
||||
if (downloadInterface != null) {
|
||||
downloadInterface.onDownload(oldJar);
|
||||
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
if (jar != null) {
|
||||
jar.delete();
|
||||
}
|
||||
if (downloadInterface != null) {
|
||||
downloadInterface.onError(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
public synchronized File http_syncDownload(final String url, final String saveName) {
|
||||
if (StringUtils.isEmpty(url)) {
|
||||
return null;
|
||||
}
|
||||
File jar = null;
|
||||
try {
|
||||
File savePath = new File(donwloadPath);
|
||||
if (!savePath.exists()) {
|
||||
savePath.mkdirs();
|
||||
}
|
||||
Log.i("DOWNLOAD", "下载文件:" + url + " 保存文件:" + saveName);
|
||||
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
||||
connection.addRequestProperty("User-Agent", getExtUa());
|
||||
// Log.i(TAG,"获取到网络请求:"+connection.getResponseCode());
|
||||
|
||||
|
||||
InputStream inputStream = connection.getInputStream();
|
||||
jar = new File(donwloadPath + saveName + "_tmp.tmp");
|
||||
jar.createNewFile();
|
||||
Log.i("DOWNLOAD", "临时保存文件:" + jar.getAbsolutePath());
|
||||
OutputStream outputStream = new FileOutputStream(jar);
|
||||
byte[] bytes = new byte[1024];
|
||||
double size = connection.getContentLength();
|
||||
double downSize = 0;
|
||||
int len;
|
||||
while ((len = inputStream.read(bytes)) > 0) {
|
||||
outputStream.write(bytes, 0, len);
|
||||
downSize += len;
|
||||
}
|
||||
outputStream.close();
|
||||
inputStream.close();
|
||||
File oldJar = new File(donwloadPath + saveName);
|
||||
if (oldJar.exists()) {
|
||||
oldJar.delete();
|
||||
}
|
||||
connection.disconnect();
|
||||
jar.renameTo(oldJar);
|
||||
Log.i("DOWNLOAD", "实际保存:" + oldJar.getAbsolutePath() + " " + oldJar.getName());
|
||||
return oldJar;
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
if (jar != null) {
|
||||
jar.delete();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,70 +0,0 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.yutou.bilibili.Services.IUserService;
|
||||
import com.yutou.bilibili.mybatis.dao.PermissionDao;
|
||||
import com.yutou.bilibili.mybatis.model.Permission;
|
||||
import com.yutou.bilibili.mybatis.model.PermissionExample;
|
||||
import com.yutou.bilibili.mybatis.model.UUser;
|
||||
import com.yutou.utils.Log;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ServiceTools implements ApplicationContextAware {
|
||||
private static ApplicationContext applicationContext = null;
|
||||
@Resource
|
||||
IUserService userService;
|
||||
@Resource
|
||||
PermissionDao permissionDao;
|
||||
|
||||
public static ServiceTools getInstance() {
|
||||
ServiceTools tools=new ServiceTools();
|
||||
tools.userService=getBean(IUserService.class);
|
||||
tools.permissionDao=getBean(PermissionDao.class);
|
||||
return tools;
|
||||
}
|
||||
|
||||
|
||||
public boolean auth(HttpServletRequest request, String uname, String path) {
|
||||
UUser user = userService.getUser(uname);
|
||||
String tmp = request.getRequestURI();
|
||||
String url = null;
|
||||
try {
|
||||
url = tmp.split(tmp.split("/")[tmp.split("/").length - 1])[0];
|
||||
} catch (Exception e) {
|
||||
Log.e(e);
|
||||
Log.i("无权限请求:" + tmp);
|
||||
return false;
|
||||
}
|
||||
JSONArray powers = JSONArray.parseArray(user.getPower());
|
||||
if (powers.toJavaList(Integer.class).contains(-1)) {
|
||||
return true;
|
||||
} else {
|
||||
PermissionExample pExample = new PermissionExample();
|
||||
pExample.createCriteria().andUrlEqualTo(url);
|
||||
List<Permission> permissions = permissionDao.selectByExample(pExample);
|
||||
if (permissions != null && permissions.size() > 0) {
|
||||
if (powers.toJavaList(Integer.class).contains(permissions.get(0).getId())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||
if (ServiceTools.applicationContext == null) {
|
||||
ServiceTools.applicationContext = applicationContext;
|
||||
}
|
||||
}
|
||||
|
||||
public static <T> T getBean(Class<T> clazz) {
|
||||
return applicationContext.getBean(clazz);
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
public class TestMain {
|
||||
public static void main(String[] args) {
|
||||
new TestMain();
|
||||
}
|
||||
|
||||
public TestMain() {
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
package com.yutou.bilibili.Tools;
|
||||
|
||||
import com.yutou.bilibili.interfaces.DownloadInterface;
|
||||
import com.yutou.utils.Log;
|
||||
import com.yutou.common.utils.Log;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.springframework.core.io.FileSystemResource;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
@ -13,11 +13,11 @@ import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLDecoder;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.file.*;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.security.MessageDigest;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Base64;
|
||||
import java.util.Date;
|
||||
import java.util.Random;
|
||||
import java.util.*;
|
||||
|
||||
public class Tools {
|
||||
|
||||
@ -40,13 +40,13 @@ public class Tools {
|
||||
*/
|
||||
public static String getRemoteAddress(HttpServletRequest request) {
|
||||
String ip = request.getHeader("x-forwarded-for");
|
||||
if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {
|
||||
if (ip == null || ip.isEmpty() || ip.equalsIgnoreCase("unknown")) {
|
||||
ip = request.getHeader("Proxy-Client-IP");
|
||||
}
|
||||
if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {
|
||||
if (ip == null || ip.isEmpty() || ip.equalsIgnoreCase("unknown")) {
|
||||
ip = request.getHeader("WL-Proxy-Client-IP");
|
||||
}
|
||||
if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {
|
||||
if (ip == null || ip.isEmpty() || ip.equalsIgnoreCase("unknown")) {
|
||||
ip = request.getRemoteAddr();
|
||||
}
|
||||
return ip;
|
||||
@ -203,4 +203,24 @@ public class Tools {
|
||||
public static String getToDayTime() {
|
||||
return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
|
||||
}
|
||||
|
||||
//扫描文件夹
|
||||
public static List<File> scanFile(File file){
|
||||
List<File> list = new ArrayList<>();
|
||||
FileVisitor<Path> visitor = new SimpleFileVisitor<>() {
|
||||
@Override
|
||||
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
||||
if ("live.db".equals(file.toFile().getName())) {
|
||||
list.add(file.toFile());
|
||||
}
|
||||
return super.visitFile(file, attrs);
|
||||
}
|
||||
};
|
||||
try {
|
||||
Files.walkFileTree(Paths.get(file.getAbsolutePath()), EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, visitor);
|
||||
return list;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,46 @@
|
||||
package com.yutou.bilibili.databases;
|
||||
|
||||
import com.yutou.bilibili.datas.SystemConfigDatabaseBean;
|
||||
import com.yutou.common.databases.AbsDatabasesBean;
|
||||
import com.yutou.common.databases.SQLiteManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class SystemConfigDatabases extends SQLiteManager {
|
||||
@Override
|
||||
public String getFileName() {
|
||||
return "system_config.db";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbsDatabasesBean> getDataBean() {
|
||||
return List.of(new SystemConfigDatabaseBean());
|
||||
}
|
||||
|
||||
public SystemConfigDatabases() {
|
||||
super();
|
||||
init();
|
||||
}
|
||||
|
||||
public void setConfig(SystemConfigDatabaseBean bean) {
|
||||
SystemConfigDatabaseBean config = getConfig();
|
||||
if (config == null) {
|
||||
add(bean);
|
||||
} else {
|
||||
bean.setSql_time(config.getSql_time());
|
||||
update(bean);
|
||||
}
|
||||
}
|
||||
|
||||
public SystemConfigDatabaseBean getConfig() {
|
||||
List<SystemConfigDatabaseBean> list = get(getDataBean().get(0).getTableName(), SystemConfigDatabaseBean.class);
|
||||
if (list.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return list.get(0);
|
||||
}
|
||||
|
||||
public SystemConfigDatabaseBean getDefaultConfig() {
|
||||
return new SystemConfigDatabaseBean();
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user