1. 定义ip列表
2. 引入并定义retrofit
3. 请求
4. 正则匹配
implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Retrofit 核心库
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
import okhttp3.ResponseBody
import retrofit2.Retrofit
import retrofit2.http.GET
import retrofit2.http.Url
object IpUtils {
/**
* Ip列表
*/
private val urls = listOf(
"http://httpbin.org/ip",
"http://ip-api.com/json",
"http://ipecho.net/plain",
"http://checkip.dyndns.org/",
"http://ifconfig.me/ip"
)
/**
* 入口方法
*/
suspend fun getIp(): String? {
val retrofit = Retrofit.Builder().baseUrl("http://www.baidu.com")//占位防止retrofit报错
.build()
val apiService = retrofit.create(ApiService::class.java)
return request(urls, apiService, 0)
}
/**
* 请求
*/
private suspend fun request(
urls: List<String>, apiService: ApiService, index: Int
): String? {
if (index >= urls.size) {
return null
}
val url = urls[index]
try {
val response = apiService.getIpResponse(url).string()
val ip = extractIP(response)
if (ip.isNotEmpty()) {
return ip
}
} catch (e: Exception) {
e.printStackTrace()
}
return request(urls, apiService, index + 1)
}
/**
* 正则匹配IP
*/
private fun extractIP(response: String): String {
val ipRegex = Regex("(\\d{1,3}\\.){3}\\d{1,3}")
val matchResult = ipRegex.find(response)
return matchResult?.value ?: ""
}
}
interface ApiService {
@GET
suspend fun getIpResponse(@Url url: String): ResponseBody
}
参考:ip列表引用这里