From 494923ad33a84cdcf7c63673ba9c043928c40c07 Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Thu, 20 Jul 2023 15:32:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E7=89=88=E5=9B=9E=E8=B4=B4=20?= =?UTF-8?q?API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/huanchengfly/tieba/post/api/Enums.kt | 3 +- .../tieba/post/api/HttpConstant.kt | 2 + .../tieba/post/api/ProtobufRequest.kt | 66 ++++++++++++++-- .../tieba/post/api/interfaces/ITiebaApi.kt | 7 +- .../api/interfaces/impls/MixedTiebaApiImpl.kt | 68 +++++++++++----- .../post/api/retrofit/RetrofitTiebaApi.kt | 60 ++++++++++++++ .../interfaces/OfficialProtobufTiebaApi.kt | 6 ++ .../protos/AddPost/AddPostRequestData.proto | 78 +++++++++---------- 8 files changed, 225 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/Enums.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/Enums.kt index 25a9dde5..6ff9ab87 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/Enums.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/Enums.kt @@ -2,7 +2,8 @@ package com.huanchengfly.tieba.post.api enum class ClientVersion(val version: String) { TIEBA_V11("11.10.8.6"), - TIEBA_V12("12.25.1.0"); + TIEBA_V12("12.25.1.0"), + TIEBA_V12_POST("12.35.1.0"); override fun toString(): String { return version diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/HttpConstant.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/HttpConstant.kt index 67573603..8d6d69ee 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/HttpConstant.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/HttpConstant.kt @@ -69,6 +69,7 @@ object Param { const val CUID_GALAXY3 = "c3_aid" const val OAID = "oaid" const val CUID_GID = "cuid_gid" + const val DEVICE_SCORE = "device_score" const val EVENT_DAY = "event_day" const val EXTRA = "extra" const val FIRST_INSTALL_TIME = "first_install_time" @@ -89,4 +90,5 @@ object Param { const val STOKEN = "stoken" const val SWAN_GAME_VER = "swan_game_ver" const val TIMESTAMP = "timestamp" + const val Z_ID = "z_id" } \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/ProtobufRequest.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/ProtobufRequest.kt index 1f8a163a..576c2a04 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/ProtobufRequest.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/ProtobufRequest.kt @@ -14,6 +14,7 @@ import com.huanchengfly.tieba.post.utils.AccountUtil import com.huanchengfly.tieba.post.utils.CacheUtil.base64Encode import com.huanchengfly.tieba.post.utils.ClientUtils import com.huanchengfly.tieba.post.utils.CuidUtils +import com.huanchengfly.tieba.post.utils.DeviceUtils import com.huanchengfly.tieba.post.utils.MobileInfoUtil import com.huanchengfly.tieba.post.utils.UIDUtil import com.squareup.wire.Message @@ -32,7 +33,7 @@ fun buildProtobufRequestBody( return MyMultipartBody.Builder(BOUNDARY) .apply { setType(MyMultipartBody.FORM) - if (clientVersion != ClientVersion.TIEBA_V12) { + if (clientVersion != ClientVersion.TIEBA_V12 && clientVersion != ClientVersion.TIEBA_V12_POST) { addFormDataPart(Param.CLIENT_VERSION, clientVersion.version) } if (needSToken) { @@ -68,9 +69,10 @@ fun buildAppPosInfo(): AppPosInfo { fun buildCommonRequest( context: Context = App.INSTANCE, - clientVersion: ClientVersion = ClientVersion.TIEBA_V11 + clientVersion: ClientVersion = ClientVersion.TIEBA_V11, + tbs: String? = null, ): CommonRequest = when (clientVersion) { - ClientVersion.TIEBA_V11 -> + ClientVersion.TIEBA_V11 -> { CommonRequest( BDUSS = AccountUtil.getBduss(), _client_id = ClientUtils.clientId ?: RetrofitTiebaApi.randomClientId, @@ -94,8 +96,9 @@ fun buildCommonRequest( sample_id = ClientUtils.sampleId, stoken = AccountUtil.getSToken(), ) + } - ClientVersion.TIEBA_V12 -> + ClientVersion.TIEBA_V12 -> { CommonRequest( BDUSS = AccountUtil.getBduss(), _client_id = ClientUtils.clientId ?: RetrofitTiebaApi.randomClientId, @@ -139,6 +142,59 @@ fun buildCommonRequest( start_type = 1, stoken = AccountUtil.getSToken(), swan_game_ver = "1038000", - user_agent = getUserAgent("tieba/${ClientVersion.TIEBA_V12}") + user_agent = getUserAgent("tieba/${clientVersion.version}") ) + } + + ClientVersion.TIEBA_V12_POST -> { + CommonRequest( + BDUSS = AccountUtil.getBduss(), + _client_id = ClientUtils.clientId ?: RetrofitTiebaApi.randomClientId, + _client_type = 2, + _client_version = clientVersion.version, + _os_version = "${Build.VERSION.SDK_INT}", // TODO + _phone_imei = MobileInfoUtil.getIMEI(context), + _timestamp = System.currentTimeMillis(), + active_timestamp = ClientUtils.activeTimestamp, + android_id = UIDUtil.getAndroidId("000"), + applist = "", + brand = Build.BRAND, + c3_aid = UIDUtil.getAid(), + cmode = 1, + cuid = CuidUtils.getNewCuid(), + cuid_galaxy2 = CuidUtils.getNewCuid(), + cuid_gid = "", + device_score = "${DeviceUtils.getDeviceScore()}", + event_day = SimpleDateFormat("yyyyMdd", Locale.getDefault()).format( + Date( + System.currentTimeMillis() + ) + ), + extra = "", + first_install_time = App.Config.appFirstInstallTime, + framework_ver = "3340042", + from = "1020031h", + is_teenager = 0, + last_update_time = App.Config.appLastUpdateTime, + lego_lib_version = "3.0.0", + model = Build.MODEL, + net_type = 1, + oaid = App.Config.encodedOAID, + personalized_rec_switch = 1, + pversion = "1.0.3", + q_type = 0, + sample_id = ClientUtils.sampleId, + scr_dip = App.ScreenInfo.DENSITY.toDouble(), + scr_h = getScreenHeight(), + scr_w = getScreenWidth(), + sdk_ver = "2.34.0", + start_scheme = "", + start_type = 1, + stoken = AccountUtil.getSToken(), + swan_game_ver = "1038000", + tbs = tbs, + user_agent = getUserAgent("tieba/${clientVersion.version}"), + z_id = AccountUtil.getAccountInfo { zid } + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/ITiebaApi.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/ITiebaApi.kt index 49740c36..c6e4706b 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/ITiebaApi.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/ITiebaApi.kt @@ -4,6 +4,7 @@ import com.huanchengfly.tieba.post.api.ForumSortType import com.huanchengfly.tieba.post.api.SearchThreadFilter import com.huanchengfly.tieba.post.api.SearchThreadOrder import com.huanchengfly.tieba.post.api.models.* +import com.huanchengfly.tieba.post.api.models.protos.addPost.AddPostResponse import com.huanchengfly.tieba.post.api.models.protos.forumRecommend.ForumRecommendResponse import com.huanchengfly.tieba.post.api.models.protos.frsPage.FrsPageResponse import com.huanchengfly.tieba.post.api.models.protos.hotThreadList.HotThreadListResponse @@ -1243,10 +1244,12 @@ interface ITiebaApi { forumId: String, forumName: String, threadId: String, - tbs: String, + tbs: String? = null, + nameShow: String? = null, postId: String? = null, + subPostId: String? = null, replyUserId: String? = null - ): Flow + ): Flow /** * 用户信息(Flow) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/impls/MixedTiebaApiImpl.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/impls/MixedTiebaApiImpl.kt index 59986e19..44188250 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/impls/MixedTiebaApiImpl.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/interfaces/impls/MixedTiebaApiImpl.kt @@ -16,7 +16,6 @@ import com.huanchengfly.tieba.post.api.buildProtobufRequestBody import com.huanchengfly.tieba.post.api.getScreenHeight import com.huanchengfly.tieba.post.api.getScreenWidth import com.huanchengfly.tieba.post.api.interfaces.ITiebaApi -import com.huanchengfly.tieba.post.api.models.AddPostBean import com.huanchengfly.tieba.post.api.models.AgreeBean import com.huanchengfly.tieba.post.api.models.CheckReportBean import com.huanchengfly.tieba.post.api.models.CollectDataBean @@ -49,6 +48,9 @@ import com.huanchengfly.tieba.post.api.models.UserLikeForumBean import com.huanchengfly.tieba.post.api.models.UserPostBean import com.huanchengfly.tieba.post.api.models.WebReplyResultBean import com.huanchengfly.tieba.post.api.models.WebUploadPicBean +import com.huanchengfly.tieba.post.api.models.protos.addPost.AddPostRequest +import com.huanchengfly.tieba.post.api.models.protos.addPost.AddPostRequestData +import com.huanchengfly.tieba.post.api.models.protos.addPost.AddPostResponse import com.huanchengfly.tieba.post.api.models.protos.forumRecommend.ForumRecommendRequest import com.huanchengfly.tieba.post.api.models.protos.forumRecommend.ForumRecommendRequestData import com.huanchengfly.tieba.post.api.models.protos.forumRecommend.ForumRecommendResponse @@ -996,25 +998,55 @@ object MixedTiebaApiImpl : ITiebaApi { forumId: String, forumName: String, threadId: String, - tbs: String, + tbs: String?, + nameShow: String?, postId: String?, + subPostId: String?, replyUserId: String? - ): Flow { - return RetrofitTiebaApi.OFFICIAL_TIEBA_API.addPostFlow( - content, - forumId, - forumName, - tbs, - threadId, - quoteId = postId, - replyUserId = replyUserId ?: if (postId == null) "null" else "", - repostId = postId, - is_addition = if (postId == null) null else "0", - is_barrage = if (postId == null) "0" else null, - is_giftpost = if (postId == null) null else "0", - is_twzhibo_thread = if (postId == null) null else "0", - post_from = if (postId == null) "3" else "11" - ) + ): Flow { + return RetrofitTiebaApi.OFFICIAL_PROTOBUF_TIEBA_POST_API + .addPostFlow( + buildProtobufRequestBody( + AddPostRequest( + AddPostRequestData( + anonymous = "1", + barrage_time = "0".takeIf { postId.isNullOrEmpty() }, + can_no_forum = "0", + common = buildCommonRequest( + clientVersion = ClientVersion.TIEBA_V12_POST, + tbs = tbs ?: AccountUtil.getAccountInfo { this.tbs } + ), + content = content, + entrance_type = "0", + fid = forumId, + floor_num = "0".takeIf { postId.isNullOrEmpty() }, + is_ad = "0", + is_addition = "0".takeIf { postId.isNullOrEmpty() }, + is_barrage = "0".takeIf { postId.isNullOrEmpty() }, + is_feedback = "0", + is_giftpost = "0".takeIf { postId.isNullOrEmpty() }, + is_pictxt = "0", + is_show_bless = 0, + is_twzhibo_thread = "0".takeIf { postId.isNullOrEmpty() }, + name_show = nameShow ?: AccountUtil.getAccountInfo { this.nameShow } + .orEmpty(), + new_vcode = "1", + post_from = if (postId.isNullOrEmpty() && subPostId.isNullOrEmpty()) "13" else if (subPostId.isNullOrEmpty()) "0" else null, + quote_id = postId, + reply_uid = replyUserId.takeIf { !postId.isNullOrEmpty() }, + repostid = postId, + sub_post_id = subPostId, + show_custom_figure = 0, + takephoto_num = "0", + tid = threadId, + v_fid = "".takeIf { postId.isNullOrEmpty() }, + v_fname = "".takeIf { postId.isNullOrEmpty() }, + vcode_tag = "12", + ) + ), + clientVersion = ClientVersion.TIEBA_V12_POST + ) + ) } override fun userProfileFlow(uid: Long): Flow { diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt index 228c618b..2b4c03a3 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt @@ -32,6 +32,7 @@ import com.huanchengfly.tieba.post.utils.AccountUtil import com.huanchengfly.tieba.post.utils.CacheUtil.base64Encode import com.huanchengfly.tieba.post.utils.ClientUtils import com.huanchengfly.tieba.post.utils.CuidUtils +import com.huanchengfly.tieba.post.utils.DeviceUtils import com.huanchengfly.tieba.post.utils.MobileInfoUtil import com.huanchengfly.tieba.post.utils.UIDUtil import okhttp3.ConnectionPool @@ -225,6 +226,65 @@ object RetrofitTiebaApi { ) } + val OFFICIAL_PROTOBUF_TIEBA_POST_API: OfficialProtobufTiebaApi by lazy { + createProtobufApi( + "https://tiebac.baidu.com/", + CommonHeaderInterceptor( + Header.CHARSET to { "UTF-8" }, +// Header.CLIENT_TYPE to { "2" }, + Header.CLIENT_USER_TOKEN to { AccountUtil.getUid() }, + Header.COOKIE to { + "BAIDUZID=${ + AccountUtil.getAccountInfo { zid }.orEmpty() + };CUID=${CuidUtils.getNewCuid()};ka=open;TBBRAND=${Build.MODEL};" + }, + Header.CUID to { CuidUtils.getNewCuid() }, + Header.CUID_GALAXY2 to { CuidUtils.getNewCuid() }, + Header.CUID_GID to { "" }, + Header.CUID_GALAXY3 to { UIDUtil.getAid() }, + Header.USER_AGENT to { getUserAgent("tieba/${ClientVersion.TIEBA_V12_POST.version}") }, + Header.X_BD_DATA_TYPE to { "protobuf" }, + ), + defaultCommonParamInterceptor - Param.OS_VERSION + CommonParamInterceptor( + Param.CLIENT_VERSION to { ClientVersion.TIEBA_V12_POST.version }, + Param.ACTIVE_TIMESTAMP to { ClientUtils.activeTimestamp.toString() }, + Param.ANDROID_ID to { base64Encode(UIDUtil.getAndroidId("000")) }, + Param.BAIDU_ID to { ClientUtils.baiduId }, + Param.BRAND to { Build.BRAND }, + Param.CUID_GALAXY3 to { UIDUtil.getAid() }, + Param.CMODE to { "1" }, + Param.CUID to { CuidUtils.getNewCuid() }, + Param.CUID_GALAXY2 to { CuidUtils.getNewCuid() }, + Param.CUID_GID to { "" }, + Param.DEVICE_SCORE to { "${DeviceUtils.getDeviceScore()}" }, + Param.EVENT_DAY to { + SimpleDateFormat("yyyyMdd", Locale.getDefault()).format( + Date( + System.currentTimeMillis() + ) + ) + }, + Param.EXTRA to { "" }, + Param.FIRST_INSTALL_TIME to { App.Config.appFirstInstallTime.toString() }, + Param.FRAMEWORK_VER to { "3340042" }, + Param.FROM to { "tieba" }, + Param.IS_TEENAGER to { "0" }, + Param.LAST_UPDATE_TIME to { App.Config.appLastUpdateTime.toString() }, + Param.MAC to { "02:00:00:00:00:00" }, + "naws_game_ver" to { "1038000" }, + Param.OAID to { OAID().toJson() }, + "personalized_rec_switch" to { "1" }, + Param.SAMPLE_ID to { ClientUtils.sampleId }, + Param.SDK_VER to { "2.34.0" }, + Param.START_SCHEME to { "" }, + Param.START_TYPE to { "1" }, + Param.STOKEN to { AccountUtil.getSToken() }, + Param.Z_ID to { AccountUtil.getAccountInfo { zid }.orEmpty() }, + ), + stParamInterceptor, + ) + } + val SOFIRE_API: SofireApi by lazy { Retrofit.Builder() .baseUrl("https://sofire.baidu.com/") diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interfaces/OfficialProtobufTiebaApi.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interfaces/OfficialProtobufTiebaApi.kt index fd7a182b..b8f20ec7 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interfaces/OfficialProtobufTiebaApi.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interfaces/OfficialProtobufTiebaApi.kt @@ -1,5 +1,6 @@ package com.huanchengfly.tieba.post.api.retrofit.interfaces +import com.huanchengfly.tieba.post.api.models.protos.addPost.AddPostResponse import com.huanchengfly.tieba.post.api.models.protos.forumRecommend.ForumRecommendResponse import com.huanchengfly.tieba.post.api.models.protos.frsPage.FrsPageResponse import com.huanchengfly.tieba.post.api.models.protos.hotThreadList.HotThreadListResponse @@ -67,4 +68,9 @@ interface OfficialProtobufTiebaApi { fun pbFloorFlow( @Body body: MyMultipartBody, ): Flow + + @POST("/c/c/post/add?cmd=309731&format=protobuf") + fun addPostFlow( + @Body body: MyMultipartBody, + ): Flow } \ No newline at end of file diff --git a/app/src/main/protos/AddPost/AddPostRequestData.proto b/app/src/main/protos/AddPost/AddPostRequestData.proto index 0278411c..83d3b069 100644 --- a/app/src/main/protos/AddPost/AddPostRequestData.proto +++ b/app/src/main/protos/AddPost/AddPostRequestData.proto @@ -7,23 +7,23 @@ option java_package = "com.huanchengfly.tieba.post.api.models.protos.addPost"; import "CommonRequest.proto"; message AddPostRequestData { - CommonRequest common = 1; - string authsid = 2; - string sig = 3; - string tbs = 4; - string video_other = 5; - string anonymous = 6; - string can_no_forum = 7; - string is_feedback = 8; - string takephoto_num = 9; - string entrance_type = 10; - string voice_md5 = 11; - string during_time = 12; - string vcode = 13; - string vcode_md5 = 14; - string vcode_type = 15; - string vcode_tag = 16; - string topic_id = 17; + CommonRequest common = 1; + string authsid = 2; + string sig = 3; + string tbs = 4; + string video_other = 5; + string anonymous = 6; + string can_no_forum = 7; + string is_feedback = 8; + string takephoto_num = 9; + string entrance_type = 10; + string voice_md5 = 11; + string during_time = 12; + string vcode = 13; + string vcode_md5 = 14; + string vcode_type = 15; + string vcode_tag = 16; + string topic_id = 17; string new_vcode = 18; string content = 19; optional string reply_uid = 20; @@ -37,8 +37,8 @@ message AddPostRequestData { optional string v_fid = 28; optional string v_fname = 29; string kw = 30; - string is_barrage = 31; - string barrage_time = 32; + optional string is_barrage = 31; + optional string barrage_time = 32; string st_param = 33; string ptype = 34; string ori_ugc_nid = 35; @@ -46,29 +46,29 @@ message AddPostRequestData { string ori_ugc_tid = 37; string ori_ugc_type = 38; string is_location = 39; - string lat = 40; - string lng = 41; - string name = 42; - string sn = 43; - string from_fourm_id = 44; + string lat = 40; + string lng = 41; + string name = 42; + string sn = 43; + string from_fourm_id = 44; string tid = 45; optional string quote_id = 46; - string is_twzhibo_thread = 47; - string floor_num = 48; + optional string is_twzhibo_thread = 47; + optional string floor_num = 48; optional string repostid = 49; - string sub_post_id = 50; - string is_ad = 51; - string is_addition = 52; - string is_giftpost = 53; - string st_type = 54; - string post_from = 55; - string real_lat = 56; - string real_lng = 57; - string name_show = 58; - string is_works = 59; - string is_pictxt = 60; - string is_story = 61; - string jid = 62; + optional string sub_post_id = 50; + string is_ad = 51; + optional string is_addition = 52; + optional string is_giftpost = 53; + string st_type = 54; + optional string post_from = 55; + string real_lat = 56; + string real_lng = 57; + string name_show = 58; + string is_works = 59; + string is_pictxt = 60; + string is_story = 61; + string jid = 62; string jfrom = 63; optional int32 show_custom_figure = 64; string from_category_id = 65;