diff --git a/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt index cdaf73c..09b8384 100644 --- a/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt @@ -11,6 +11,7 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import space.mori.chzzk_bot.chatbot.chzzk.Connector.getChannel import space.mori.chzzk_bot.chatbot.discord.Discord +import space.mori.chzzk_bot.chatbot.utils.refreshAccessToken import space.mori.chzzk_bot.common.events.* import space.mori.chzzk_bot.common.models.User import space.mori.chzzk_bot.common.services.LiveStatusService @@ -221,14 +222,13 @@ class UserHandler( throw RuntimeException("AccessToken or RefreshToken is not valid.") } try { - - client = Connector.getClient(user.accessToken!!, user.refreshToken!!) + val tokens = Connector.client.refreshAccessToken(user.refreshToken!!) + client = Connector.getClient(tokens.first, tokens.second) + UserService.setRefreshToken(user, tokens.first, tokens.second) client.loginAsync().join() client.refreshTokenAsync().join() - UserService.setRefreshToken(user, client.loginResult.accessToken(), client.loginResult.refreshToken()) - listener = ChzzkSessionBuilder(client).buildUserSession() listener.createAndConnectAsync().join() diff --git a/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/utils/accessTokenRefresh.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/utils/accessTokenRefresh.kt new file mode 100644 index 0000000..c8eb9ac --- /dev/null +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/utils/accessTokenRefresh.kt @@ -0,0 +1,55 @@ +package space.mori.chzzk_bot.chatbot.utils + +import com.google.gson.Gson +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import space.mori.chzzk_bot.common.utils.client +import xyz.r2turntrue.chzzk4j.ChzzkClient +import java.io.IOException + +val client = OkHttpClient.Builder() + .addNetworkInterceptor { chain -> + chain.proceed( + chain.request() + .newBuilder() + .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36") + .build() + ) + } + .build() +val gson = Gson() + +data class RefreshTokenResponse( + val accessToken: String, + val refreshToken: String, + val expiresIn: Int, + val tokenType: String = "Bearer", + val scope: String +) + +fun ChzzkClient.refreshAccessToken(refreshToken: String): Pair { + val url = "https://openapi.chzzk.naver.com/auth/v1/token" + val request = Request.Builder() + .url(url) + .header("Content-Type", "application/json") + .post(gson.toJson(mapOf( + "grantType" to "refresh_token", + "refreshToken" to refreshToken, + "clientId" to this.apiClientId, + "clientSecret" to this.apiSecret + )).toRequestBody()) + .build() + + client.newCall(request).execute().use { response -> + try { + if(!response.isSuccessful) throw IOException("Unexpected code ${response.code}") + val body = response.body?.string() + val data = gson.fromJson(body, RefreshTokenResponse::class.java) + + return Pair(data.accessToken, data.refreshToken) + } catch(e: Exception) { + throw e + } + } +} \ No newline at end of file