From 43c152d8eb2ad9de7082b6cee0a2d5ae8c19d21a Mon Sep 17 00:00:00 2001 From: czp Date: Sat, 3 Mar 2018 20:36:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20BilibiliAPI.getSsoUrl=20?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E8=A3=85=E5=A1=AB=E5=8F=82?= =?UTF-8?q?=E6=95=B0=20gourl=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- src/main/java/com/hiczp/bilibili/api/BilibiliAPI.java | 3 ++- .../java/com/hiczp/bilibili/api/passport/SsoService.java | 1 + src/test/java/com/hiczp/bilibili/api/test/SsoTest.java | 7 ++++++- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 75146d7..4bb1a43 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ LoginException 在 accessToken 错误或过期时抛出 这个带验证码的登录接口也会继续抛出 CaptchaMismatchException, 如果验证码输入错误的话. ### SSO -通过 SSO API 可以将 accessToken 转为 cookie, 用 cookie 就可以访问 B站的 Web API. +通过 SSO API 可以将 accessToken 转为 cookie, 用 cookie 就可以访问 B站 的 Web API. B站客户端内置的 WebView 就是通过这种方式来工作的(WebView 访问页面时, 处于登录状态). @@ -160,15 +160,15 @@ B站客户端内置的 WebView 就是通过这种方式来工作的(WebView 访 如果只想得到用于进行 SSO 操作的那条 URL, 可以这么做 final String goUrl = "https://account.bilibili.com/account/home"; - bilibiliAPI.getSsoUrl(); + bilibiliAPI.getSsoUrl(goUrl); 返回值是一个 HttpUrl, 里面 url 的值差不多是这样的 - https://passport.bilibili.com/api/login/sso?access_key=13c346c203de77dfac8b67b169f3029b&appkey=1d8b6e7d45233436&build=515000&mobi_app=android&platform=android&ts=1519895404&sign=ee05f96c636e7745c38918fe343469ee + https://passport.bilibili.com/api/login/sso?access_key=c3bf6002bd2e539f5bfce56308f14789&appkey=1d8b6e7d45233436&build=515000&gourl=https%3A%2F%2Faccount.bilibili.com%2Faccount%2Fhome&mobi_app=android&platform=android&ts=1520079995&sign=654e2d00aa827aa1d7acef6fbeb9ee70 如果 access_key 是正确的话, 这个 url 访问一下就登录 B站 了. -如果想跟 B站 客户端一样弄一个什么内嵌 WebView 的话, 这个 API 就可以派上用场(只需要在 WebView 初始化完毕后让 WebView 去访问这个 url, 就登陆了)(goUrl 可以是任意值, 全部的 302 重定向完成后将进入这个地址). +如果想跟 B站 客户端一样弄一个什么内嵌 WebView 的话, 这个 API 就可以派上用场(只需要在 WebView 初始化完毕后让 WebView 去访问这个 url, 就登陆了)(goUrl 可以是任意值, 全部的 302 重定向完成后将进入这个地址, 如果 goUrl 不存在或为空则将跳转到B站首页). ### Web API 上文讲到, 通过 SSO API, 可以将 token 转为 cookie, 在本项目中, Web API 封装在 BilibiliWebAPI 中, 可以通过如下方式得到一个已经登录了的 BilibiliWebAPI 实例 diff --git a/src/main/java/com/hiczp/bilibili/api/BilibiliAPI.java b/src/main/java/com/hiczp/bilibili/api/BilibiliAPI.java index 1f721a7..e25256d 100644 --- a/src/main/java/com/hiczp/bilibili/api/BilibiliAPI.java +++ b/src/main/java/com/hiczp/bilibili/api/BilibiliAPI.java @@ -231,7 +231,7 @@ public class BilibiliAPI implements BilibiliServiceProvider, BilibiliCaptchaProv CancelRequestInterceptor cancelRequestInterceptor = new CancelRequestInterceptor(); try { getSsoService(new SimpleCookieJar(), Collections.singletonList(cancelRequestInterceptor), HttpLoggingInterceptor.Level.BASIC) - .sso(null) + .sso(goUrl) .execute(); } catch (IOException ignored) { @@ -241,6 +241,7 @@ public class BilibiliAPI implements BilibiliServiceProvider, BilibiliCaptchaProv @Override public Map> toCookies() throws IOException { + //用这个地址是因为这个地址一定不会改变(在 B站 未来的更新中)并且很省流量 return toCookies(BaseUrlDefinition.PASSPORT + "api/oauth2/getKey"); } diff --git a/src/main/java/com/hiczp/bilibili/api/passport/SsoService.java b/src/main/java/com/hiczp/bilibili/api/passport/SsoService.java index 51990d9..0b46ff7 100644 --- a/src/main/java/com/hiczp/bilibili/api/passport/SsoService.java +++ b/src/main/java/com/hiczp/bilibili/api/passport/SsoService.java @@ -9,6 +9,7 @@ import javax.annotation.Nullable; //sso 很特别, 它可能返回的是一个 HTML 页面, 所以单独分出来 //sso 会经过两次 302 跳转, 需要保存其中的 cookie, 然后才能抵达最终页面并且进入 cookie 登录状态 +//如果 gourl 为 null, 则会跳转到 B站 首页 public interface SsoService { @GET("api/login/sso") Call sso(@Nullable @Query("gourl") String goUrl); diff --git a/src/test/java/com/hiczp/bilibili/api/test/SsoTest.java b/src/test/java/com/hiczp/bilibili/api/test/SsoTest.java index f2ce613..bd3007a 100644 --- a/src/test/java/com/hiczp/bilibili/api/test/SsoTest.java +++ b/src/test/java/com/hiczp/bilibili/api/test/SsoTest.java @@ -14,7 +14,12 @@ public class SsoTest { private static final BilibiliAPI BILIBILI_API = Config.getBilibiliAPI(); @Test - public void test() throws Exception { + public void getSsoUrlTest() { + LOGGER.info("SSO Url: {}", BILIBILI_API.getSsoUrl("https://account.bilibili.com/account/home")); + } + + @Test + public void toCookiesTest() throws Exception { Map> cookiesMap = BILIBILI_API.toCookies(); StringBuilder stringBuilder = new StringBuilder(); cookiesMap.forEach((domain, cookies) -> {