diff --git a/src/main/java/com/yutou/qqbot/bilibili/BiliBiliUtils.java b/src/main/java/com/yutou/qqbot/bilibili/BiliBiliUtils.java index 5b61484..a2bd46c 100644 --- a/src/main/java/com/yutou/qqbot/bilibili/BiliBiliUtils.java +++ b/src/main/java/com/yutou/qqbot/bilibili/BiliBiliUtils.java @@ -71,6 +71,54 @@ public class BiliBiliUtils { return null; } + public JSONObject http_login_getSid(String url) { + try { + Log.i("调用url = "+url); + HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection(); + setConnection(null,connection); + connection.setRequestMethod("GET"); + connection.connect(); + BufferedInputStream stream = new BufferedInputStream(connection.getInputStream()); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] bytes = new byte[1024]; + int len; + while ((len = stream.read(bytes)) != -1) { + outputStream.write(bytes, 0, len); + outputStream.flush(); + } + List cookie = null; + if (connection.getHeaderFields().containsKey("Set-Cookie")) { + cookie = connection.getHeaderFields().get("Set-Cookie"); + } + String str = outputStream.toString(StandardCharsets.UTF_8); + outputStream.close(); + try { + JSONObject json = JSON.parseObject(str); + if(cookie!=null){ + StringBuilder ck=new StringBuilder(); + for (String key : cookie) { + ck.append(";").append(key); + } + json.put("cookie",ck.toString()); + } + return json; + } catch (Exception e) { + JSONObject json = new JSONObject(); + json.put("html", str); + return json; + } finally { + + stream.close(); + connection.disconnect(); + } + + } catch (IOException e) { + //com.yutou.bilibili.Tools.Log.e(e); + e.printStackTrace(); + } + return null; + } + public JSONObject http_post(String url, String body) { return http(url, HTTP.POST, body, RET_MODEL.JSON); } @@ -318,7 +366,9 @@ public class BiliBiliUtils { connection.setRequestProperty("Referer", "https://www.bilibili.com"); connection.addRequestProperty("Connection", "keep-alive"); connection.addRequestProperty("Upgrade-Insecure-Requests", "1"); - connection.addRequestProperty("Cookie", cookie); + if(!StringUtils.isEmpty(cookie)) { + connection.addRequestProperty("Cookie", cookie); + } connection.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"); } diff --git a/src/main/java/com/yutou/qqbot/bilibili/BiliLogin.java b/src/main/java/com/yutou/qqbot/bilibili/BiliLogin.java index c8dbf72..f2101d3 100644 --- a/src/main/java/com/yutou/qqbot/bilibili/BiliLogin.java +++ b/src/main/java/com/yutou/qqbot/bilibili/BiliLogin.java @@ -4,16 +4,14 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.yutou.qqbot.QQBotManager; -import com.yutou.qqbot.utlis.ConfigTools; -import com.yutou.qqbot.utlis.HttpTools; -import com.yutou.qqbot.utlis.QRCodeUtils; -import com.yutou.qqbot.utlis.StringUtils; +import com.yutou.qqbot.utlis.*; import java.io.File; import java.nio.charset.StandardCharsets; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; +import java.text.ParseException; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.*; public class BiliLogin { @@ -27,11 +25,12 @@ public class BiliLogin { } public JSONObject login() { - JSONObject login = JSON.parseObject(HttpTools.get("https://passport.bilibili.com/qrcode/getLoginUrl")); + JSONObject login = JSON.parseObject(HttpTools.get("https://passport.bilibili.com/x/passport-login/web/qrcode/generate")); JSONObject json = new JSONObject(); + System.out.println("login = " + login); json.put("code", login.getInteger("code")); json.put("url", login.getJSONObject("data").getString("url")); - new Thread(() -> waitLogin(login.getJSONObject("data").getString("oauthKey"))).start(); + new Thread(() -> waitLogin(login.getJSONObject("data").getString("qrcode_key"))).start(); return json; } @@ -43,47 +42,39 @@ public class BiliLogin { public void waitLogin(String oauthKey) { long time = System.currentTimeMillis(); - String bd = "gourl=https%3A%2F%2Fpassport.bilibili.com%2Fajax%2FminiLogin%2Fredirect&oauthKey=" + oauthKey; new Timer().schedule(new TimerTask() { @Override public void run() { + String bd = "gourl=https%3A%2F%2Fpassport.bilibili.com%2Fajax%2FminiLogin%2Fredirect&oauthKey=" + oauthKey; if ((System.currentTimeMillis() - time) > 5 * 60 * 1000) { cancel(); return; } - JSONObject json = JSON.parseObject(HttpTools.post("https://passport.bilibili.com/qrcode/getLoginInfo", bd.getBytes(StandardCharsets.UTF_8))); - if (json.containsKey("code") && json.getInteger("code") == 0) { - System.out.println("json = " + json); - String _url = json.getJSONObject("data").getString("url"); - Map map = HttpTools.getUrlParams(_url); + JSONObject json = biliUtils.http_login_getSid("https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=" + oauthKey); + Log.i("B站登陆",json.toJSONString()); + if (json.getInteger("code") == 0 && json.getJSONObject("data").getInteger("code") == 0) { - JSONObject cookie = new JSONObject(); - JSONArray array = new JSONArray(); - for (String key : map.keySet()) { - cookie.put(key, map.get(key)); + String[] split = json.getString("cookie").split(";"); + JSONObject ck = new JSONObject(); + for (String string : split) { + if (!ck.containsKey(string) && !StringUtils.isEmpty(string) && string.contains("=")) { + String key = string.split("=")[0].trim(); + String value = string.split("=")[1].trim(); + if (key.contains("Expires")) { + SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMMM yyyy HH:mm:ss z", Locale.ENGLISH); + sdf.setTimeZone(TimeZone.getDefault()); + Date date = sdf.parse(value, new ParsePosition(0)); + value = String.valueOf(date.getTime() / 1000); + } + ck.put(key, value); + } } - System.out.println(array); - if (biliUtils == null) { - biliUtils = BiliBiliUtils.getInstance(qq); - } - assert biliUtils != null; - - JSONObject tmp = biliUtils.http_post(_url, ""); - System.out.println("tmp = " + tmp); - if (tmp == null) { - cancel(); - return; - } - String sid = tmp.getString("cookie"); - sid = sid.split("sid=")[1]; - sid = sid.split(";")[0]; - cookie.put("sid", sid); - cookie.put("Domain", ".bilibili.com"); - ConfigTools.saveFile(new File(qq + "_bilibili.cookie"), cookie.toJSONString()); + ck.put("gourl", bd); + ConfigTools.saveFile(new File(qq + "_bilibili.cookie"), ck.toJSONString()); cancel(); } } - }, 0, 3000); + }, 1000, 3000); } @@ -104,11 +95,15 @@ public class BiliLogin { } - public static void main(String[] args) { + public static void main(String[] args) throws ParseException { + String http = "{\"code\":0,\"message\":\"0\",\"ttl\":1,\"data\":{\"url\":\"https://passport.biligame.com/x/passport-login/web/crossDomain?DedeUserID=96300&DedeUserID__ckMd5=c506a12068157a3a&Expires=1720252437&SESSDATA=c383a8e0,1720252437,9ba5c*11CjCBp3_j-6zYtK27tzUVrmFZNgjyeDW6pcdfmRBJU5cVfz4OhVmujjKCZsGAkXL6ll8SVnplZ2JONlBleHdFOGgzUzNJYUxIbzJwRVhTYVM2LWVuQnJyQVQxQnRWTUFZbUYybV95Y1RELTdGeF9mNlpXV3RDTjdsMVBaYkhxZGZyblRkTUJCMGV3IIEC&bili_jct=e786885293c24eb7198dc0538b56d6d8&gourl=https%3A%2F%2Fwww.bilibili.com\",\"refresh_token\":\"347b83e7c4a1e24f4681f06f28f71b11\",\"timestamp\":1704700437058,\"code\":0,\"message\":\"\"},\"cookie\":\";SESSDATA=c383a8e0%2C1720252437%2C9ba5c%2A11CjCBp3_j-6zYtK27tzUVrmFZNgjyeDW6pcdfmRBJU5cVfz4OhVmujjKCZsGAkXL6ll8SVnplZ2JONlBleHdFOGgzUzNJYUxIbzJwRVhTYVM2LWVuQnJyQVQxQnRWTUFZbUYybV95Y1RELTdGeF9mNlpXV3RDTjdsMVBaYkhxZGZyblRkTUJCMGV3IIEC; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT; HttpOnly; Secure;bili_jct=e786885293c24eb7198dc0538b56d6d8; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT;DedeUserID=96300; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT;DedeUserID__ckMd5=c506a12068157a3a; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT;sid=ger7871m; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT\"}"; + JSONObject body = JSON.parseObject(http); BiliLogin login = new BiliLogin(583819556L); boolean testLogin = login.testLogin(); System.out.println("testLogin = " + testLogin); - // JSONObject json = login.login(); + System.out.println(BiliBiliUtils.getInstance(583819556L).getLoginInfo()); + //JSONObject json = login.login(); + //System.out.println("json = " + json); // QRCodeUtils.createQRCode("bili_login", json.getString("url")); } }