From 72ea245c7f06c861406eea5f8ab682f092d5afbb Mon Sep 17 00:00:00 2001 From: czp Date: Wed, 7 Mar 2018 09:31:44 +0800 Subject: [PATCH] =?UTF-8?q?BilibiliAPI=20=E7=8E=B0=E5=9C=A8=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E8=87=AA=E5=AE=9A=E4=B9=89=E6=98=AF=E5=90=A6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=B7=E6=96=B0=20Token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hiczp/bilibili/api/BilibiliAPI.java | 14 ++- ....java => AutoRefreshTokenInterceptor.java} | 12 +- .../hiczp/bilibili/api/live/LiveService.java | 11 +- .../api/live/entity/AppSmallTVEntity.java | 119 +++++++++++++++--- .../api/live/entity/BulletScreenEntity.java | 3 +- 5 files changed, 136 insertions(+), 23 deletions(-) rename src/main/java/com/hiczp/bilibili/api/interceptor/{RefreshTokenInterceptor.java => AutoRefreshTokenInterceptor.java} (80%) diff --git a/src/main/java/com/hiczp/bilibili/api/BilibiliAPI.java b/src/main/java/com/hiczp/bilibili/api/BilibiliAPI.java index f5bc25e..1d647d1 100644 --- a/src/main/java/com/hiczp/bilibili/api/BilibiliAPI.java +++ b/src/main/java/com/hiczp/bilibili/api/BilibiliAPI.java @@ -40,6 +40,8 @@ public class BilibiliAPI implements BilibiliServiceProvider, BilibiliCaptchaProv private final BilibiliClientProperties bilibiliClientProperties; private final BilibiliAccount bilibiliAccount; + private Boolean autoRefreshToken = true; + //用于阻止进行多次错误的 refreshToken 操作 private String invalidToken; private String invalidRefreshToken; @@ -142,8 +144,9 @@ public class BilibiliAPI implements BilibiliServiceProvider, BilibiliCaptchaProv () -> "trace_id", () -> new SimpleDateFormat("yyyyMMddHHmm000ss").format(new Date()) )) .addInterceptor(new AddAppKeyInterceptor(bilibiliClientProperties)) - .addInterceptor(new RefreshTokenInterceptor( + .addInterceptor(new AutoRefreshTokenInterceptor( this, + autoRefreshToken, ServerErrorCode.Common.UNAUTHORIZED, ServerErrorCode.Live.USER_NO_LOGIN, ServerErrorCode.Live.PLEASE_LOGIN, @@ -401,4 +404,13 @@ public class BilibiliAPI implements BilibiliServiceProvider, BilibiliCaptchaProv public BilibiliAccount getBilibiliAccount() { return bilibiliAccount; } + + public boolean isAutoRefreshToken() { + return autoRefreshToken; + } + + public BilibiliAPI setAutoRefreshToken(boolean autoRefreshToken) { + this.autoRefreshToken = autoRefreshToken; + return this; + } } diff --git a/src/main/java/com/hiczp/bilibili/api/interceptor/RefreshTokenInterceptor.java b/src/main/java/com/hiczp/bilibili/api/interceptor/AutoRefreshTokenInterceptor.java similarity index 80% rename from src/main/java/com/hiczp/bilibili/api/interceptor/RefreshTokenInterceptor.java rename to src/main/java/com/hiczp/bilibili/api/interceptor/AutoRefreshTokenInterceptor.java index e30db62..87df1d3 100644 --- a/src/main/java/com/hiczp/bilibili/api/interceptor/RefreshTokenInterceptor.java +++ b/src/main/java/com/hiczp/bilibili/api/interceptor/AutoRefreshTokenInterceptor.java @@ -13,14 +13,16 @@ import java.io.IOException; import java.util.stream.IntStream; //自动刷新 token -public class RefreshTokenInterceptor implements Interceptor { - private static final Logger LOGGER = LoggerFactory.getLogger(RefreshTokenInterceptor.class); +public class AutoRefreshTokenInterceptor implements Interceptor { + private static final Logger LOGGER = LoggerFactory.getLogger(AutoRefreshTokenInterceptor.class); private BilibiliAPI bilibiliAPI; + private Boolean autoRefreshToken; private int[] codes; - public RefreshTokenInterceptor(BilibiliAPI bilibiliAPI, int... codes) { + public AutoRefreshTokenInterceptor(BilibiliAPI bilibiliAPI, Boolean autoRefreshToken, int... codes) { this.bilibiliAPI = bilibiliAPI; + this.autoRefreshToken = autoRefreshToken; this.codes = codes; } @@ -28,6 +30,10 @@ public class RefreshTokenInterceptor implements Interceptor { public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); + if (!autoRefreshToken) { + return response; + } + JsonObject jsonObject = InterceptorHelper.getJsonInBody(response); JsonElement codeElement = jsonObject.get("code"); if (codeElement == null) { diff --git a/src/main/java/com/hiczp/bilibili/api/live/LiveService.java b/src/main/java/com/hiczp/bilibili/api/live/LiveService.java index f60b4be..24b4c59 100644 --- a/src/main/java/com/hiczp/bilibili/api/live/LiveService.java +++ b/src/main/java/com/hiczp/bilibili/api/live/LiveService.java @@ -32,7 +32,7 @@ public interface LiveService { @POST("feed/v1/feed/isFollowed") Call isFollowed(@Query("follow") long hostUserId); - //该 API 意义不明 + //该 API 意义不明(似乎跟什么 每日背包任务 有关) @GET("AppBag/sendDaily") Call sendDaily(); @@ -40,16 +40,19 @@ public interface LiveService { @GET("AppIndex/getAllItem") Call getAllItem(); - //该 API 的返回值意义不明确, 所有房间似乎都一样, 且返回的 code 为 -400 + //查看可用的小电视抽奖 + //当目标房间没有可用的小电视抽奖时返回 -400 @GET("AppSmallTV/index") - Call getAppSmallTV(); + Call getAppSmallTV(@Query("roomid") long roomId); + //TODO 参与抽奖 + //TODO 查看抽奖结果 //获得所有头衔的列表 //这里的 Title 是头衔的意思 @GET("appUser/getTitle") Call getTitle(); - //这个 API 不是很明确, 所有房间都一样, 可能和什么活动有关 + //这个 API 不是很明确, 似乎和 节奏风暴 有关系 @GET("SpecialGift/room/{roomId}") Call getSpecialGift(@Path("roomId") long roomId); diff --git a/src/main/java/com/hiczp/bilibili/api/live/entity/AppSmallTVEntity.java b/src/main/java/com/hiczp/bilibili/api/live/entity/AppSmallTVEntity.java index 004ccaa..dad6391 100644 --- a/src/main/java/com/hiczp/bilibili/api/live/entity/AppSmallTVEntity.java +++ b/src/main/java/com/hiczp/bilibili/api/live/entity/AppSmallTVEntity.java @@ -2,19 +2,24 @@ package com.hiczp.bilibili.api.live.entity; import com.google.gson.annotations.SerializedName; +import java.util.List; + public class AppSmallTVEntity { /** - * code : -400 - * message : no - * data : {"status":-1} + * code : 0 + * msg : OK + * message : OK + * data : {"lastid":0,"join":[{"id":39674,"dtime":32}],"unjoin":[{"id":39674,"dtime":32}]} */ @SerializedName("code") private int code; + @SerializedName("msg") + private String msg; @SerializedName("message") private String message; @SerializedName("data") - private DataEntity data; + private Data data; public int getCode() { return code; @@ -24,6 +29,14 @@ public class AppSmallTVEntity { this.code = code; } + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + public String getMessage() { return message; } @@ -32,28 +45,106 @@ public class AppSmallTVEntity { this.message = message; } - public DataEntity getData() { + public Data getData() { return data; } - public void setData(DataEntity data) { + public void setData(Data data) { this.data = data; } - public static class DataEntity { + public static class Data { /** - * status : -1 + * lastid : 0 + * join : [{"id":39674,"dtime":32}] + * unjoin : [{"id":39674,"dtime":32}] */ - @SerializedName("status") - private int status; + @SerializedName("lastid") + private int lastid; + @SerializedName("join") + private List join; + @SerializedName("unjoin") + private List unjoin; - public int getStatus() { - return status; + public int getLastid() { + return lastid; } - public void setStatus(int status) { - this.status = status; + public void setLastid(int lastid) { + this.lastid = lastid; + } + + public List getJoin() { + return join; + } + + public void setJoin(List join) { + this.join = join; + } + + public List getUnjoin() { + return unjoin; + } + + public void setUnjoin(List unjoin) { + this.unjoin = unjoin; + } + + public static class Join { + /** + * id : 39674 + * dtime : 32 + */ + + @SerializedName("id") + private int id; + @SerializedName("dtime") + private int dtime; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getDtime() { + return dtime; + } + + public void setDtime(int dtime) { + this.dtime = dtime; + } + } + + public static class Unjoin { + /** + * id : 39674 + * dtime : 32 + */ + + @SerializedName("id") + private int id; + @SerializedName("dtime") + private int dtime; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getDtime() { + return dtime; + } + + public void setDtime(int dtime) { + this.dtime = dtime; + } } } } diff --git a/src/main/java/com/hiczp/bilibili/api/live/entity/BulletScreenEntity.java b/src/main/java/com/hiczp/bilibili/api/live/entity/BulletScreenEntity.java index b20d267..636441f 100644 --- a/src/main/java/com/hiczp/bilibili/api/live/entity/BulletScreenEntity.java +++ b/src/main/java/com/hiczp/bilibili/api/live/entity/BulletScreenEntity.java @@ -7,7 +7,8 @@ public class BulletScreenEntity { private long mid; - //弹幕长度限制为 LiveRoomInfoEntity.getData().getMsgLength(), 但是实际上所有房间的弹幕长度限制都是 20 + //弹幕长度限制为 LiveRoomInfoEntity.getData().getMsgLength(), 对于每个用户而言, 每个房间都一样 + //通过完成 B站 有关任务, 获得成就, 可以加大这个限制(舰长, 老爷等可以直接加大限制), 最长好像是 40 个字 @SerializedName("msg") private String message;