pref: OAID

This commit is contained in:
HuanCheng65 2023-02-18 14:15:02 +08:00
parent d0c3017b67
commit 9a59e2bac4
No known key found for this signature in database
GPG Key ID: E9031EF91A805148
7 changed files with 131 additions and 29 deletions

View File

@ -19,7 +19,6 @@ import androidx.annotation.RequiresApi
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import com.github.gzuliyujiang.oaid.DeviceID import com.github.gzuliyujiang.oaid.DeviceID
import com.github.gzuliyujiang.oaid.IGetter
import com.github.panpf.sketch.Sketch import com.github.panpf.sketch.Sketch
import com.github.panpf.sketch.SketchFactory import com.github.panpf.sketch.SketchFactory
import com.github.panpf.sketch.decode.GifAnimatedDrawableDecoder 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.github.panpf.sketch.request.PauseLoadWhenScrollingDrawableDecodeInterceptor
import com.huanchengfly.tieba.post.activities.BaseActivity import com.huanchengfly.tieba.post.activities.BaseActivity
import com.huanchengfly.tieba.post.components.ClipBoardLinkDetector 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.components.dialogs.LoadingDialog
import com.huanchengfly.tieba.post.plugins.PluginManager import com.huanchengfly.tieba.post.plugins.PluginManager
import com.huanchengfly.tieba.post.plugins.interfaces.IApp 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.Util
import com.huanchengfly.tieba.post.utils.appPreferences import com.huanchengfly.tieba.post.utils.appPreferences
import com.huanchengfly.tieba.post.utils.applicationMetaData import com.huanchengfly.tieba.post.utils.applicationMetaData
import com.huanchengfly.tieba.post.utils.helios.Base32
import com.huanchengfly.tieba.post.utils.launchUrl import com.huanchengfly.tieba.post.utils.launchUrl
import com.microsoft.appcenter.AppCenter import com.microsoft.appcenter.AppCenter
import com.microsoft.appcenter.analytics.Analytics import com.microsoft.appcenter.analytics.Analytics
@ -66,17 +65,9 @@ import org.litepal.LitePal
@HiltAndroidApp @HiltAndroidApp
class App : Application(), IApp, IGetter, SketchFactory { class App : Application(), IApp, SketchFactory {
private val mActivityList: MutableList<Activity> = mutableListOf() private val mActivityList: MutableList<Activity> = mutableListOf()
override fun onOAIDGetComplete(result: String) {
oaid = Base32.encode(result.encodeToByteArray())
}
override fun onOAIDGetError(error: Exception) {
oaid = ""
}
@RequiresApi(api = 28) @RequiresApi(api = 28)
private fun setWebViewPath(context: Context) { private fun setWebViewPath(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
@ -129,7 +120,7 @@ class App : Application(), IApp, IGetter, SketchFactory {
super.onCreate() super.onCreate()
LitePal.initialize(this) LitePal.initialize(this)
AccountUtil.init(this) AccountUtil.init(this)
DeviceID.getOAID(this, this) Config.init(this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
setWebViewPath(this) setWebViewPath(this)
} }
@ -146,6 +137,7 @@ class App : Application(), IApp, IGetter, SketchFactory {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
ThemeUtils.init(ThemeDelegate) ThemeUtils.init(ThemeDelegate)
registerActivityLifecycleCallbacks(ClipBoardLinkDetector) registerActivityLifecycleCallbacks(ClipBoardLinkDetector)
registerActivityLifecycleCallbacks(OAIDGetter)
PluginManager.init(this) PluginManager.init(this)
CoroutineScope(Dispatchers.IO).apply { CoroutineScope(Dispatchers.IO).apply {
launch { 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 { object ScreenInfo {
@JvmField @JvmField
var EXACT_SCREEN_HEIGHT = 0 var EXACT_SCREEN_HEIGHT = 0
@ -253,7 +268,7 @@ class App : Application(), IApp, IGetter, SketchFactory {
} }
companion object { companion object {
val TAG = App::class.java.simpleName const val TAG = "App"
@JvmStatic @JvmStatic
var translucentBackground: Drawable? = null var translucentBackground: Drawable? = null
@ -265,9 +280,6 @@ class App : Application(), IApp, IGetter, SketchFactory {
lateinit var INSTANCE: App lateinit var INSTANCE: App
private set private set
@JvmStatic
var oaid: String = ""
val isSystemNight: Boolean val isSystemNight: Boolean
get() = nightMode == Configuration.UI_MODE_NIGHT_YES get() = nightMode == Configuration.UI_MODE_NIGHT_YES
@ -616,7 +628,7 @@ class App : Application(), IApp, IGetter, SketchFactory {
R.attr.colorOnAccent R.attr.colorOnAccent
) )
R.color.default_color_chip -> return return getColorByAttr( R.color.default_color_chip -> return getColorByAttr(
context, context,
R.attr.colorChip R.attr.colorChip
) )

View File

@ -87,7 +87,7 @@ fun buildCommonRequest(
lego_lib_version = "3.0.0", lego_lib_version = "3.0.0",
model = Build.MODEL, model = Build.MODEL,
net_type = "1", net_type = "1",
oaid = OAID(App.oaid).toJson(), oaid = OAID().toJson(),
pversion = "1.0.3", pversion = "1.0.3",
sample_id = ClientUtils.sampleId, sample_id = ClientUtils.sampleId,
stoken = AccountUtil.getSToken(), stoken = AccountUtil.getSToken(),

View File

@ -1,15 +1,14 @@
package com.huanchengfly.tieba.post.api.models package com.huanchengfly.tieba.post.api.models
import com.github.gzuliyujiang.oaid.DeviceID
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.huanchengfly.tieba.post.App import com.huanchengfly.tieba.post.App
data class OAID( data class OAID(
@SerializedName("v") @SerializedName("v")
val encodedOAID: String, val encodedOAID: String = App.Config.encodedOAID,
@SerializedName("sc") @SerializedName("sc")
val statusCode: Int = 0, val statusCode: Int = App.Config.statusCode,
@SerializedName("sup") @SerializedName("sup")
val support: Int = if (DeviceID.supportedOAID(App.INSTANCE)) 1 else 0, val support: Int = if (App.Config.isOAIDSupported) 1 else 0,
val tl: Int = 0 val isTrackLimited: Int = if (App.Config.isTrackLimited) 1 else 0
) )

View File

@ -2,6 +2,7 @@ package com.huanchengfly.tieba.post.api.retrofit
import android.os.Build import android.os.Build
import com.huanchengfly.tieba.post.App 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.Header
import com.huanchengfly.tieba.post.api.Param import com.huanchengfly.tieba.post.api.Param
import com.huanchengfly.tieba.post.api.models.OAID import com.huanchengfly.tieba.post.api.models.OAID
@ -140,7 +141,7 @@ object RetrofitTiebaApi {
Param.FROM to { "tieba" }, Param.FROM to { "tieba" },
Param.CLIENT_VERSION to { "12.25.1.0" }, Param.CLIENT_VERSION to { "12.25.1.0" },
Param.CUID_GALAXY3 to { UIDUtil.getAid() }, Param.CUID_GALAXY3 to { UIDUtil.getAid() },
Param.OAID to { OAID(App.oaid).toJson() }, Param.OAID to { OAID().toJson() },
), ),
stParamInterceptor, stParamInterceptor,
) )
@ -158,17 +159,45 @@ object RetrofitTiebaApi {
Header.CUID_GALAXY2 to { CuidUtils.getNewCuid() }, Header.CUID_GALAXY2 to { CuidUtils.getNewCuid() },
Header.CUID_GID to { "" }, Header.CUID_GID to { "" },
Header.CUID_GALAXY3 to { UIDUtil.getAid() }, 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" }, Header.X_BD_DATA_TYPE to { "protobuf" },
), ),
defaultCommonParamInterceptor + CommonParamInterceptor( defaultCommonParamInterceptor - Param.OS_VERSION + CommonParamInterceptor(
Param.CUID to { CuidUtils.getNewCuid() }, Param.CUID to { CuidUtils.getNewCuid() },
Param.CUID_GALAXY2 to { CuidUtils.getNewCuid() }, Param.CUID_GALAXY2 to { CuidUtils.getNewCuid() },
Param.CUID_GID to { "" }, Param.CUID_GID to { "" },
Param.FROM to { "1024324o" }, Param.FROM to { "tieba" },
Param.CLIENT_VERSION to { "11.10.8.6" }, Param.CLIENT_VERSION to { ClientVersion.TIEBA_V11.version },
Param.CUID_GALAXY3 to { UIDUtil.getAid() }, 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<OfficialProtobufTiebaApi>(
"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, stParamInterceptor,
) )

View File

@ -21,6 +21,10 @@ class CommonParamInterceptor(private val additionParams: List<ParamExpression>)
return CommonParamInterceptor(additionParams + interceptor.additionParams) 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 { override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request() val request = chain.request()
var headers = request.headers var headers = request.headers

View File

@ -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
}
}

View File

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.os.Build import android.os.Build
import android.provider.Settings import android.provider.Settings
import android.text.TextUtils import android.text.TextUtils
import com.huanchengfly.tieba.post.App
import com.huanchengfly.tieba.post.App.Companion.INSTANCE import com.huanchengfly.tieba.post.App.Companion.INSTANCE
import com.huanchengfly.tieba.post.toMD5 import com.huanchengfly.tieba.post.toMD5
import com.huanchengfly.tieba.post.utils.helios.Base32 import com.huanchengfly.tieba.post.utils.helios.Base32
@ -24,6 +25,13 @@ object UIDUtil {
return androidId ?: defaultValue 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 { fun getAid(): String {
val raw = "com.helios" + getAndroidId("000000000") + uUID val raw = "com.helios" + getAndroidId("000000000") + uUID
val bytes = getSHA1(raw) val bytes = getSHA1(raw)