实现评论发送

This commit is contained in:
czp3009 2019-02-28 15:50:33 +08:00
parent e196b5b141
commit 553db03d4d
5 changed files with 47 additions and 13 deletions

View File

@ -1,6 +1,7 @@
package com.hiczp.bilibili.api.main
import com.hiczp.bilibili.api.main.model.*
import com.hiczp.bilibili.api.retrofit.Header
import kotlinx.coroutines.Deferred
import retrofit2.http.*
@ -152,6 +153,7 @@ interface MainAPI {
*/
@POST("/x/v2/reply/add")
@FormUrlEncoded
@Headers(Header.FORCE_FORM_BODY)
fun sendReply(
@Field("from") from: Int? = null,
@Field("message") message: String,

View File

@ -20,6 +20,10 @@ object Header {
const val ACCEPT = "Accept"
const val ACCEPT_LANGUAGE = "Accept-Language"
const val ACCEPT_ENCODING = "Accept-Encoding"
//强制将公共参数加到 FormBody 上
const val FORCE_FORM_BODY_NAME = "Force-Form-Body"
const val FORCE_FORM_BODY = "$FORCE_FORM_BODY_NAME: true"
}
object Param {

View File

@ -1,5 +1,6 @@
package com.hiczp.bilibili.api.retrofit.interceptor
import com.hiczp.bilibili.api.retrofit.Header
import com.hiczp.bilibili.api.retrofit.ParamType
import com.hiczp.bilibili.api.retrofit.addAllEncoded
import com.hiczp.bilibili.api.retrofit.forEachNonNull
@ -17,53 +18,62 @@ private val logger = KotlinLogging.logger {}
* @param additionParams ParamName to ParamValueExpression
*/
class CommonParamInterceptor(
private val paramType: ParamType,
private var paramType: ParamType,
private vararg val additionParams: Pair<String, () -> String?>
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
val body = request.body()
val request = chain.request()
var headers = request.headers()
var httpUrl = request.url()
var body = request.body()
request = when {
//是否强制加到 FormBody
if (headers[Header.FORCE_FORM_BODY_NAME] != null) {
paramType = ParamType.FORM_URL_ENCODED
headers = headers.newBuilder().removeAll(Header.FORCE_FORM_BODY_NAME).build()
}
when {
//如果欲添加参数的位置为 Query 则直接添加, paramType 为 FORM_URL_ENCODED 则继续下面的判断
paramType == ParamType.QUERY -> {
val httpUrl = request.url().newBuilder().apply {
httpUrl = request.url().newBuilder().apply {
additionParams.forEachNonNull { name, value ->
addQueryParameter(name, value)
}
}.build()
request.newBuilder().url(httpUrl).build()
}
//BODY 不存在或者是空的
body == null || body.contentLength() == 0L -> {
val formBody = FormBody.Builder().apply {
body = FormBody.Builder().apply {
additionParams.forEachNonNull { name, value ->
add(name, value)
}
}.build()
request.newBuilder().method(request.method(), formBody).build()
}
//只要 BODY 为 FormBody, 那么里面一定有内容
body is FormBody -> {
val formBody = FormBody.Builder().apply {
addAllEncoded(body)
body = FormBody.Builder().addAllEncoded(body).apply {
additionParams.forEachNonNull { name, value ->
add(name, value)
}
}.build()
request.newBuilder().method(request.method(), formBody).build()
}
else -> {
logger.error {
"Cannot add params to request: ${request.method()} ${request.url()} ${body.javaClass.simpleName}"
}
request
}
}
return chain.proceed(request)
return chain.proceed(
request.newBuilder()
.headers(headers)
.url(httpUrl)
.method(request.method(), body)
.build()
)
}
}

View File

@ -1,6 +1,7 @@
package com.hiczp.bilibili.api.test
import com.hiczp.bilibili.api.BilibiliClient
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import okhttp3.logging.HttpLoggingInterceptor
import org.junit.jupiter.api.Test
@ -12,6 +13,7 @@ class LoginTest {
BilibiliClient(logLevel = HttpLoggingInterceptor.Level.BODY)
.run {
login(Config.username, Config.password)
delay(1000)
logout()
}
}

View File

@ -0,0 +1,16 @@
package com.hiczp.bilibili.api.test
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Test
class SendReplyTest {
@Test
fun sendRootReply() {
runBlocking {
bilibiliClient.mainAPI.sendReply(
oid = 9498716,
message = "这是自动发送的评论 ${System.currentTimeMillis()}"
).await()
}
}
}