diff --git a/app/src/main/java/com/huanchengfly/tieba/post/App.kt b/app/src/main/java/com/huanchengfly/tieba/post/App.kt index 48167446..6df9c27b 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/App.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/App.kt @@ -19,7 +19,6 @@ import androidx.annotation.RequiresApi import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDelegate import com.github.gzuliyujiang.oaid.DeviceID -import com.github.gzuliyujiang.oaid.IGetter import com.github.panpf.sketch.Sketch import com.github.panpf.sketch.SketchFactory import com.github.panpf.sketch.decode.GifAnimatedDrawableDecoder @@ -30,6 +29,7 @@ import com.github.panpf.sketch.http.OkHttpStack import com.github.panpf.sketch.request.PauseLoadWhenScrollingDrawableDecodeInterceptor import com.huanchengfly.tieba.post.activities.BaseActivity import com.huanchengfly.tieba.post.components.ClipBoardLinkDetector +import com.huanchengfly.tieba.post.components.OAIDGetter import com.huanchengfly.tieba.post.components.dialogs.LoadingDialog import com.huanchengfly.tieba.post.plugins.PluginManager import com.huanchengfly.tieba.post.plugins.interfaces.IApp @@ -48,7 +48,6 @@ import com.huanchengfly.tieba.post.utils.TiebaUtil import com.huanchengfly.tieba.post.utils.Util import com.huanchengfly.tieba.post.utils.appPreferences import com.huanchengfly.tieba.post.utils.applicationMetaData -import com.huanchengfly.tieba.post.utils.helios.Base32 import com.huanchengfly.tieba.post.utils.launchUrl import com.microsoft.appcenter.AppCenter import com.microsoft.appcenter.analytics.Analytics @@ -66,17 +65,9 @@ import org.litepal.LitePal @HiltAndroidApp -class App : Application(), IApp, IGetter, SketchFactory { +class App : Application(), IApp, SketchFactory { private val mActivityList: MutableList = mutableListOf() - override fun onOAIDGetComplete(result: String) { - oaid = Base32.encode(result.encodeToByteArray()) - } - - override fun onOAIDGetError(error: Exception) { - oaid = "" - } - @RequiresApi(api = 28) private fun setWebViewPath(context: Context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { @@ -129,7 +120,7 @@ class App : Application(), IApp, IGetter, SketchFactory { super.onCreate() LitePal.initialize(this) AccountUtil.init(this) - DeviceID.getOAID(this, this) + Config.init(this) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { setWebViewPath(this) } @@ -146,6 +137,7 @@ class App : Application(), IApp, IGetter, SketchFactory { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) ThemeUtils.init(ThemeDelegate) registerActivityLifecycleCallbacks(ClipBoardLinkDetector) + registerActivityLifecycleCallbacks(OAIDGetter) PluginManager.init(this) CoroutineScope(Dispatchers.IO).apply { launch { @@ -206,6 +198,29 @@ class App : Application(), IApp, IGetter, SketchFactory { } } + object Config { + var inited: Boolean = false + + var isOAIDSupported: Boolean = false + var statusCode: Int = -200 + var oaid: String = "" + var encodedOAID: String = "" + var isTrackLimited: Boolean = false + + fun init(context: Context) { + if (!inited) { + isOAIDSupported = DeviceID.supportedOAID(context) + if (isOAIDSupported) { + DeviceID.getOAID(context, OAIDGetter) + } else { + statusCode = -200 + isTrackLimited = false + } + inited = true + } + } + } + object ScreenInfo { @JvmField var EXACT_SCREEN_HEIGHT = 0 @@ -253,7 +268,7 @@ class App : Application(), IApp, IGetter, SketchFactory { } companion object { - val TAG = App::class.java.simpleName + const val TAG = "App" @JvmStatic var translucentBackground: Drawable? = null @@ -265,9 +280,6 @@ class App : Application(), IApp, IGetter, SketchFactory { lateinit var INSTANCE: App private set - @JvmStatic - var oaid: String = "" - val isSystemNight: Boolean get() = nightMode == Configuration.UI_MODE_NIGHT_YES @@ -616,7 +628,7 @@ class App : Application(), IApp, IGetter, SketchFactory { R.attr.colorOnAccent ) - R.color.default_color_chip -> return return getColorByAttr( + R.color.default_color_chip -> return getColorByAttr( context, R.attr.colorChip ) 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 66adb393..8fbac0f5 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 @@ -87,7 +87,7 @@ fun buildCommonRequest( lego_lib_version = "3.0.0", model = Build.MODEL, net_type = "1", - oaid = OAID(App.oaid).toJson(), + oaid = OAID().toJson(), pversion = "1.0.3", sample_id = ClientUtils.sampleId, stoken = AccountUtil.getSToken(), diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/models/OAID.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/models/OAID.kt index e11aa06f..62044bd1 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/models/OAID.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/models/OAID.kt @@ -1,15 +1,14 @@ package com.huanchengfly.tieba.post.api.models -import com.github.gzuliyujiang.oaid.DeviceID import com.google.gson.annotations.SerializedName import com.huanchengfly.tieba.post.App data class OAID( @SerializedName("v") - val encodedOAID: String, + val encodedOAID: String = App.Config.encodedOAID, @SerializedName("sc") - val statusCode: Int = 0, + val statusCode: Int = App.Config.statusCode, @SerializedName("sup") - val support: Int = if (DeviceID.supportedOAID(App.INSTANCE)) 1 else 0, - val tl: Int = 0 + val support: Int = if (App.Config.isOAIDSupported) 1 else 0, + val isTrackLimited: Int = if (App.Config.isTrackLimited) 1 else 0 ) 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 e8957bea..2c417744 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 @@ -2,6 +2,7 @@ package com.huanchengfly.tieba.post.api.retrofit import android.os.Build import com.huanchengfly.tieba.post.App +import com.huanchengfly.tieba.post.api.ClientVersion import com.huanchengfly.tieba.post.api.Header import com.huanchengfly.tieba.post.api.Param import com.huanchengfly.tieba.post.api.models.OAID @@ -140,7 +141,7 @@ object RetrofitTiebaApi { Param.FROM to { "tieba" }, Param.CLIENT_VERSION to { "12.25.1.0" }, Param.CUID_GALAXY3 to { UIDUtil.getAid() }, - Param.OAID to { OAID(App.oaid).toJson() }, + Param.OAID to { OAID().toJson() }, ), stParamInterceptor, ) @@ -158,17 +159,45 @@ object RetrofitTiebaApi { Header.CUID_GALAXY2 to { CuidUtils.getNewCuid() }, Header.CUID_GID to { "" }, Header.CUID_GALAXY3 to { UIDUtil.getAid() }, - Header.USER_AGENT to { "bdtb for Android 11.10.8.6" }, + Header.USER_AGENT to { "bdtb for Android ${ClientVersion.TIEBA_V11.version}" }, Header.X_BD_DATA_TYPE to { "protobuf" }, ), - defaultCommonParamInterceptor + CommonParamInterceptor( + defaultCommonParamInterceptor - Param.OS_VERSION + CommonParamInterceptor( Param.CUID to { CuidUtils.getNewCuid() }, Param.CUID_GALAXY2 to { CuidUtils.getNewCuid() }, Param.CUID_GID to { "" }, - Param.FROM to { "1024324o" }, - Param.CLIENT_VERSION to { "11.10.8.6" }, + Param.FROM to { "tieba" }, + Param.CLIENT_VERSION to { ClientVersion.TIEBA_V11.version }, Param.CUID_GALAXY3 to { UIDUtil.getAid() }, - Param.OAID to { OAID(App.oaid).toJson() }, + Param.OAID to { OAID().toJson() }, + ), + stParamInterceptor, + ) + } + + val OFFICIAL_PROTOBUF_TIEBA_V12_API: OfficialProtobufTiebaApi by lazy { + createProtobufApi( + "http://c.tieba.baidu.com/", + CommonHeaderInterceptor( + Header.CHARSET to { "UTF-8" }, + Header.CLIENT_TYPE to { "2" }, + Header.CLIENT_USER_TOKEN to { AccountUtil.getUid() }, + Header.COOKIE to { "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 { "bdtb for Android ${ClientVersion.TIEBA_V12.version}" }, + Header.X_BD_DATA_TYPE to { "protobuf" }, + ), + defaultCommonParamInterceptor - Param.OS_VERSION + CommonParamInterceptor( + Param.CUID to { CuidUtils.getNewCuid() }, + Param.CUID_GALAXY2 to { CuidUtils.getNewCuid() }, + Param.CUID_GID to { "" }, + Param.FROM to { "tieba" }, + Param.CLIENT_VERSION to { ClientVersion.TIEBA_V12.version }, + Param.CUID_GALAXY3 to { UIDUtil.getAid() }, + Param.OAID to { UIDUtil.getOAID() }, ), stParamInterceptor, ) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interceptors/CommonParamInterceptor.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interceptors/CommonParamInterceptor.kt index f5bb4da1..2a96131c 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interceptors/CommonParamInterceptor.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interceptors/CommonParamInterceptor.kt @@ -21,6 +21,10 @@ class CommonParamInterceptor(private val additionParams: List) return CommonParamInterceptor(additionParams + interceptor.additionParams) } + operator fun minus(name: String): CommonParamInterceptor { + return CommonParamInterceptor(additionParams.filter { it.first != name }) + } + override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() var headers = request.headers diff --git a/app/src/main/java/com/huanchengfly/tieba/post/components/OAIDGetter.kt b/app/src/main/java/com/huanchengfly/tieba/post/components/OAIDGetter.kt new file mode 100644 index 00000000..4bb3cc52 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/components/OAIDGetter.kt @@ -0,0 +1,50 @@ +package com.huanchengfly.tieba.post.components + +import android.app.Activity +import android.app.Application +import android.os.Bundle +import com.github.gzuliyujiang.oaid.DeviceID +import com.github.gzuliyujiang.oaid.IGetter +import com.huanchengfly.tieba.post.App +import com.huanchengfly.tieba.post.utils.helios.Base32 + +object OAIDGetter : Application.ActivityLifecycleCallbacks, IGetter { + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + + override fun onActivityStarted(activity: Activity) {} + + override fun onActivityResumed(activity: Activity) { + if (!App.Config.inited) { + App.Config.isOAIDSupported = DeviceID.supportedOAID(activity) + if (App.Config.isOAIDSupported) { + DeviceID.getOAID(activity, this) + } else { + App.Config.inited = true + App.Config.statusCode = -200 + App.Config.isTrackLimited = false + } + } + } + + override fun onActivityPaused(activity: Activity) {} + + override fun onActivityStopped(activity: Activity) {} + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + + override fun onActivityDestroyed(activity: Activity) {} + + override fun onOAIDGetComplete(result: String) { + App.Config.inited = true + App.Config.oaid = result + App.Config.encodedOAID = Base32.encode(result.encodeToByteArray()) + App.Config.statusCode = 0 + App.Config.isTrackLimited = false + } + + override fun onOAIDGetError(error: Exception?) { + App.Config.inited = true + App.Config.statusCode = -100 + App.Config.isTrackLimited = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.kt index 8679cb76..2187cb23 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.os.Build import android.provider.Settings import android.text.TextUtils +import com.huanchengfly.tieba.post.App import com.huanchengfly.tieba.post.App.Companion.INSTANCE import com.huanchengfly.tieba.post.toMD5 import com.huanchengfly.tieba.post.utils.helios.Base32 @@ -24,6 +25,13 @@ object UIDUtil { return androidId ?: defaultValue } + fun getOAID(): String { + if (App.Config.encodedOAID.isBlank()) return "" + val raw = "A10-${App.Config.encodedOAID}-" + val sign = Base32.encode(Hasher.hash(raw.toByteArray())) + return "$raw$sign" + } + fun getAid(): String { val raw = "com.helios" + getAndroidId("000000000") + uUID val bytes = getSHA1(raw)