diff --git a/app/src/main/cpp/arm64-v8a/libnative.so b/app/src/main/cpp/arm64-v8a/libnative.so index 5ffdfed..f95b7a0 100755 Binary files a/app/src/main/cpp/arm64-v8a/libnative.so and b/app/src/main/cpp/arm64-v8a/libnative.so differ diff --git a/app/src/main/cpp/armeabi-v7a/libnative.so b/app/src/main/cpp/armeabi-v7a/libnative.so index 7574008..063c855 100755 Binary files a/app/src/main/cpp/armeabi-v7a/libnative.so and b/app/src/main/cpp/armeabi-v7a/libnative.so differ diff --git a/app/src/main/java/com/lizongying/mytv/Utils.kt b/app/src/main/java/com/lizongying/mytv/Utils.kt index 2e4e383..2518629 100644 --- a/app/src/main/java/com/lizongying/mytv/Utils.kt +++ b/app/src/main/java/com/lizongying/mytv/Utils.kt @@ -2,6 +2,7 @@ package com.lizongying.mytv import android.content.res.Resources import android.os.Build +import android.util.Log import android.util.TypedValue import com.google.gson.Gson import com.lizongying.mytv.api.TimeResponse @@ -18,6 +19,10 @@ import java.util.Locale object Utils { private var between: Long = 0 + private var a: String = "" + var b: String = "" + private var c: String = "" + private var listener: Request.RequestListener? = null fun getDateFormat(format: String): String { @@ -45,6 +50,31 @@ object Utils { println("Failed to retrieve timestamp from server: ${e.message}") } + var x = "" + try { + x = getNothing() + } catch (e: Exception) { + x = "" + println("a ${e.message}") + } + + if (x != "") { + try { + x = getNothing2(x) + } catch (e: Exception) { + x = "" + println("b ${e.message}") + } + } + + if (x != "") { + try { + getNothing3(x) + } catch (e: Exception) { + println("b ${e.message}") + } + } + withContext(Dispatchers.Main) { listener?.onRequestFinished(null) } @@ -88,6 +118,115 @@ object Utils { } } + private val regex = Regex("""chunk-vendors\.([^.]+)\.js""") + + private suspend fun getNothing(): String { + return withContext(Dispatchers.IO) { + val client = okhttp3.OkHttpClient.Builder() + .addInterceptor(RetryInterceptor(3)) + .build() + val request = okhttp3.Request.Builder() + .url("https://www.yangshipin.cn") + .build() + try { + client.newCall(request).execute().use { response -> + if (!response.isSuccessful) throw IOException("Unexpected code $response") + val string = response.body()?.string() + + val matchResult = string?.let { regex.find(it) } + var x = "" + if (matchResult != null) { + x = matchResult.groupValues[1] + } + x + } + } catch (e: IOException) { + throw IOException("Error during network request", e) + } + } + } + + private val regex2 = Regex(""""ysp_tx"[^:]+:"([^"]+)[^:]+:"([^"]+)""") + + private val regex3 = Regex(""""(https[^"]+wasm([^"]+))""") + + private suspend fun getNothing2(x: String): String { + return withContext(Dispatchers.IO) { + val client = okhttp3.OkHttpClient.Builder() + .addInterceptor(RetryInterceptor(3)) + .build() + + val request = okhttp3.Request.Builder() + .url("https://www.yangshipin.cn/js/chunk-vendors.$x.js") + .build() + try { + client.newCall(request).execute().use { response -> + if (!response.isSuccessful) throw IOException("Unexpected code $response") + val string = response.body()?.string() + + val matches = string?.let { regex2.findAll(it) } + + var matchResult = matches?.lastOrNull() + + if (matchResult != null) { + val (aa, bb) = matchResult.destructured + a = aa + b = bb + } + + matchResult = string?.let { regex3.find(it) } + + if (matchResult != null) { + val (cc) = matchResult.destructured + c = cc + Log.i("", "ccccc $c") + } + c + } + } catch (e: IOException) { + throw IOException("Error during network request", e) + } + } + } + + private suspend fun getNothing3(x: String): String { + return withContext(Dispatchers.IO) { + val client = okhttp3.OkHttpClient.Builder() + .addInterceptor(RetryInterceptor(3)) + .build() + + val request = okhttp3.Request.Builder() + .url("https://www.yangshipin.cn/js/chunk-vendors.$x.js") + .build() + try { + client.newCall(request).execute().use { response -> + if (!response.isSuccessful) throw IOException("Unexpected code $response") + val string = response.body()?.string() + + val matches = string?.let { regex2.findAll(it) } + + var matchResult = matches?.lastOrNull() + + if (matchResult != null) { + val (aa, bb) = matchResult.destructured + a = aa + b = bb + } + + matchResult = string?.let { regex3.find(it) } + + if (matchResult != null) { + val (cc) = matchResult.destructured + c = cc + } + c + } + } catch (e: IOException) { + throw IOException("Error during network request", e) + } + } + } + fun dpToPx(dp: Float): Int { return TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, dp, Resources.getSystem().displayMetrics diff --git a/app/src/main/java/com/lizongying/mytv/api/Encryptor.kt b/app/src/main/java/com/lizongying/mytv/api/Encryptor.kt index 047e904..c2c6848 100644 --- a/app/src/main/java/com/lizongying/mytv/api/Encryptor.kt +++ b/app/src/main/java/com/lizongying/mytv/api/Encryptor.kt @@ -13,6 +13,8 @@ class Encryptor { external fun hash2(data: ByteArray): ByteArray? + external fun hash3(data: ByteArray): ByteArray? + companion object { init { System.loadLibrary("native") diff --git a/app/src/main/java/com/lizongying/mytv/api/YSP.kt b/app/src/main/java/com/lizongying/mytv/api/YSP.kt index 06f9f98..b077dd6 100644 --- a/app/src/main/java/com/lizongying/mytv/api/YSP.kt +++ b/app/src/main/java/com/lizongying/mytv/api/YSP.kt @@ -3,6 +3,7 @@ package com.lizongying.mytv.api import android.content.Context import android.util.Log import com.lizongying.mytv.SP +import com.lizongying.mytv.Utils import com.lizongying.mytv.Utils.getDateTimestamp import com.lizongying.mytv.models.TVViewModel import java.security.MessageDigest @@ -182,13 +183,13 @@ object YSP { private fun getAuthSignature(): String { val e = - "appid=${appid}&guid=${guid}&pid=${livepid}&rand_str=${randStr}".toByteArray() - val hashedData = encryptor.hash2(e) ?: return "" + "appid=${appid}&guid=${guid}&pid=${livepid}&rand_str=${randStr}${Utils.b}".toByteArray() + val hashedData = encryptor.hash3(e) ?: return "" return hashedData.let { it -> it.joinToString("") { "%02x".format(it) } } } fun getAuthSignature(e: String): String { - val hashedData = encryptor.hash2(e.toByteArray()) ?: return "" + val hashedData = encryptor.hash3("$e${Utils.b}".toByteArray()) ?: return "" return hashedData.let { it -> it.joinToString("") { "%02x".format(it) } } } } \ No newline at end of file