修复:发送通道Telegram启用Socks5支持用户密码鉴权 #172

This commit is contained in:
pppscn 2022-06-24 23:01:17 +08:00
parent 27e3340c32
commit 42e2f03652
2 changed files with 75 additions and 81 deletions

View File

@ -1,6 +1,5 @@
package com.idormy.sms.forwarder.utils.sender
import android.os.Looper
import android.text.TextUtils
import android.util.Log
import com.google.gson.Gson
@ -10,15 +9,18 @@ import com.idormy.sms.forwarder.entity.result.TelegramResult
import com.idormy.sms.forwarder.entity.setting.TelegramSetting
import com.idormy.sms.forwarder.utils.SendUtils
import com.idormy.sms.forwarder.utils.SettingUtils
import okhttp3.*
import java.io.IOException
import java.net.InetSocketAddress
import java.net.Proxy
import java.net.URLEncoder
import java.util.concurrent.TimeUnit
import com.xuexiang.xhttp2.XHttp
import com.xuexiang.xhttp2.cache.model.CacheMode
import com.xuexiang.xhttp2.callback.SimpleCallBack
import com.xuexiang.xhttp2.exception.ApiException
import okhttp3.Credentials
import okhttp3.Response
import okhttp3.Route
import java.net.*
@Suppress("PrivatePropertyName", "UNUSED_PARAMETER", "unused")
class TelegramUtils {
class TelegramUtils private constructor() {
companion object {
private val TAG: String = TelegramUtils::class.java.simpleName
@ -35,52 +37,17 @@ class TelegramUtils {
msgInfo.getContentForSend(SettingUtils.smsTemplate.toString())
}
val requestUrl = if (setting.apiToken.startsWith("http")) {
var requestUrl = if (setting.apiToken.startsWith("http")) {
setting.apiToken
} else {
"https://api.telegram.org/bot" + setting.apiToken + "/sendMessage"
}
Log.i(TAG, "requestUrl:$requestUrl")
val clientBuilder = OkHttpClient.Builder()
//设置代理
if ((setting.proxyType == Proxy.Type.HTTP || setting.proxyType == Proxy.Type.SOCKS) && !TextUtils.isEmpty(setting.proxyHost) && !TextUtils.isEmpty(setting.proxyPort)) {
//代理服务器的IP和端口号
clientBuilder.proxy(Proxy(setting.proxyType, setting.proxyPort?.let { InetSocketAddress(setting.proxyHost, it.toInt()) }))
//代理的鉴权账号密码
if (setting.proxyAuthenticator == true && (!TextUtils.isEmpty(setting.proxyUsername) || !TextUtils.isEmpty(setting.proxyPassword))) {
clientBuilder.proxyAuthenticator { _: Route?, response: Response ->
//设置代理服务器账号密码
val credential = Credentials.basic(setting.proxyUsername.toString(), setting.proxyPassword.toString())
response.request().newBuilder()
.header("Proxy-Authorization", credential)
.build()
}
}
}
//设置重试拦截器
val retryTimes: Int = SettingUtils.requestRetryTimes
if (retryTimes > 0) {
val delayTime: Long = SettingUtils.requestDelayTime.toLong()
val retryInterceptor: RetryInterceptor = RetryInterceptor.Builder().executionCount(retryTimes).retryInterval(delayTime).logId(0).build()
clientBuilder.addInterceptor(retryInterceptor)
}
//设置读取超时时间
val client = clientBuilder
.readTimeout(SettingUtils.requestTimeout.toLong(), TimeUnit.SECONDS)
.writeTimeout(SettingUtils.requestTimeout.toLong(), TimeUnit.SECONDS)
.connectTimeout(SettingUtils.requestTimeout.toLong(), TimeUnit.SECONDS)
.build()
val request: Request
if (setting.method != null && setting.method == "GET") {
request = Request.Builder()
.url(requestUrl + "?chat_id=" + setting.chatId + "&text=" + URLEncoder.encode(content, "UTF-8"))
.build()
val request = if (setting.method != null && setting.method == "GET") {
requestUrl += "?chat_id=" + setting.chatId + "&text=" + URLEncoder.encode(content, "UTF-8")
Log.i(TAG, "requestUrl:$requestUrl")
XHttp.get(requestUrl)
} else {
val bodyMap: MutableMap<String, Any> = mutableMapOf()
bodyMap["chat_id"] = setting.chatId
@ -89,42 +56,69 @@ class TelegramUtils {
bodyMap["disable_web_page_preview"] = "true"
val requestMsg: String = Gson().toJson(bodyMap)
Log.i(TAG, "requestMsg:$requestMsg")
val requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg)
request = Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
XHttp.post(requestUrl).upJson(requestMsg)
}
//设置代理
if ((setting.proxyType == Proxy.Type.HTTP || setting.proxyType == Proxy.Type.SOCKS)
&& !TextUtils.isEmpty(setting.proxyHost) && !TextUtils.isEmpty(setting.proxyPort)
) {
//代理服务器的IP和端口号
request.okproxy(Proxy(setting.proxyType, setting.proxyPort?.let { InetSocketAddress(setting.proxyHost, it.toInt()) }))
//代理的鉴权账号密码
if (setting.proxyAuthenticator == true
&& (!TextUtils.isEmpty(setting.proxyUsername) || !TextUtils.isEmpty(setting.proxyPassword))
) {
Log.i(TAG, "proxyUsername = ${setting.proxyUsername}, proxyPassword = ${setting.proxyPassword}")
if (setting.proxyType == Proxy.Type.HTTP) {
request.okproxyAuthenticator { _: Route?, response: Response ->
//设置代理服务器账号密码
val credential = Credentials.basic(setting.proxyUsername.toString(), setting.proxyPassword.toString())
response.request().newBuilder()
.header("Proxy-Authorization", credential)
.build()
}
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
Looper.prepare()
SendUtils.updateLogs(logId, 0, e.message.toString())
//XToastUtils.error("发送失败:" + e.message)
Looper.loop()
}
@Throws(IOException::class)
override fun onResponse(call: Call, response: Response) {
val responseStr = response.body()?.string()
Log.d(TAG, "Response" + response.code() + "" + responseStr)
val resp = Gson().fromJson(responseStr, TelegramResult::class.java)
if (resp.ok == true) {
Looper.prepare()
SendUtils.updateLogs(logId, 2, responseStr.toString())
//XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
Looper.loop()
} else {
Looper.prepare()
SendUtils.updateLogs(logId, 0, responseStr.toString())
Authenticator.setDefault(object : Authenticator() {
override fun getPasswordAuthentication(): PasswordAuthentication {
return PasswordAuthentication(setting.proxyUsername.toString(), setting.proxyPassword?.toCharArray())
}
})
}
}
}
request.keepJson(true)
.ignoreHttpsCert()
.timeOut((SettingUtils.requestTimeout * 1000).toLong()) //超时时间10s
.cacheMode(CacheMode.NO_CACHE)
.retryCount(SettingUtils.requestRetryTimes) //超时重试的次数
.retryDelay(SettingUtils.requestDelayTime) //超时重试的延迟时间
.retryIncreaseDelay(SettingUtils.requestDelayTime) //超时重试叠加延时
.timeStamp(true)
.execute(object : SimpleCallBack<String>() {
override fun onError(e: ApiException) {
SendUtils.updateLogs(logId, 0, e.displayMessage)
Log.e(TAG, e.detailMessage)
//XToastUtils.error(e.displayMessage)
}
override fun onSuccess(response: String) {
Log.i(TAG, response)
val resp = Gson().fromJson(response, TelegramResult::class.java)
if (resp.ok == true) {
SendUtils.updateLogs(logId, 2, response)
//XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
} else {
SendUtils.updateLogs(logId, 0, response)
//XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
Looper.loop()
}
}
})
}

View File

@ -31,7 +31,7 @@ versions.rxbinding = "2.2.0"
versions.butterknife = "10.2.3"
versions.runner = "1.4.0"
versions.gson = "2.9.0"
versions.okhttp3 = "3.12.13" // API 19
versions.okhttp3 = "3.14.9" // API 19
versions.leakcanary = "2.8.1"
versions.lifecycle = "2.2.0"
versions.kotlin = '1.6.21'
@ -42,7 +42,7 @@ versions.xui = "1.2.0" //1.1.9
versions.xupdate = "2.1.1"
versions.xaop = "1.1.0"
versions.xutil = "2.0.0"
versions.xhttp2 = "2.0.4"
versions.xhttp2 = "2.0.6"//2.0.4
versions.xpage = "3.3.0"
versions.xrouter = "1.0.1"
@ -138,7 +138,7 @@ xlibrary.xaop_runtime = "com.github.xuexiangjys.XAOP:xaop-runtime:$versions.xaop
xlibrary.xaop_plugin = "com.github.xuexiangjys.XAOP:xaop-plugin:$versions.xaop"
xlibrary.xutil_core = "com.github.xuexiangjys.XUtil:xutil-core:$versions.xutil"
xlibrary.xutil_sub = "com.github.xuexiangjys.XUtil:xutil-sub:$versions.xutil"
xlibrary.xhttp2 = "com.github.xuexiangjys:XHttp2:$versions.xhttp2"
xlibrary.xhttp2 = "com.github.pppscn:XHttp2:$versions.xhttp2" //com.github.xuexiangjys:XHttp2
xlibrary.xpage_lib = "com.github.xuexiangjys.XPage:xpage-lib:$versions.xpage"
xlibrary.xpage_compiler = "com.github.xuexiangjys.XPage:xpage-compiler:$versions.xpage"
xlibrary.xrouter_runtime = "com.github.xuexiangjys.XRouter:xrouter-runtime:$versions.xrouter"