mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-03 01:17:41 +08:00
修复:发送通道Telegram
启用Socks5支持用户密码鉴权 #172
This commit is contained in:
parent
27e3340c32
commit
42e2f03652
@ -1,6 +1,5 @@
|
|||||||
package com.idormy.sms.forwarder.utils.sender
|
package com.idormy.sms.forwarder.utils.sender
|
||||||
|
|
||||||
import android.os.Looper
|
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.google.gson.Gson
|
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.entity.setting.TelegramSetting
|
||||||
import com.idormy.sms.forwarder.utils.SendUtils
|
import com.idormy.sms.forwarder.utils.SendUtils
|
||||||
import com.idormy.sms.forwarder.utils.SettingUtils
|
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||||
import okhttp3.*
|
import com.xuexiang.xhttp2.XHttp
|
||||||
import java.io.IOException
|
import com.xuexiang.xhttp2.cache.model.CacheMode
|
||||||
import java.net.InetSocketAddress
|
import com.xuexiang.xhttp2.callback.SimpleCallBack
|
||||||
import java.net.Proxy
|
import com.xuexiang.xhttp2.exception.ApiException
|
||||||
import java.net.URLEncoder
|
import okhttp3.Credentials
|
||||||
import java.util.concurrent.TimeUnit
|
import okhttp3.Response
|
||||||
|
import okhttp3.Route
|
||||||
|
import java.net.*
|
||||||
|
|
||||||
|
|
||||||
@Suppress("PrivatePropertyName", "UNUSED_PARAMETER", "unused")
|
@Suppress("PrivatePropertyName", "UNUSED_PARAMETER", "unused")
|
||||||
class TelegramUtils {
|
class TelegramUtils private constructor() {
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
private val TAG: String = TelegramUtils::class.java.simpleName
|
private val TAG: String = TelegramUtils::class.java.simpleName
|
||||||
@ -35,52 +37,17 @@ class TelegramUtils {
|
|||||||
msgInfo.getContentForSend(SettingUtils.smsTemplate.toString())
|
msgInfo.getContentForSend(SettingUtils.smsTemplate.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
val requestUrl = if (setting.apiToken.startsWith("http")) {
|
var requestUrl = if (setting.apiToken.startsWith("http")) {
|
||||||
setting.apiToken
|
setting.apiToken
|
||||||
} else {
|
} else {
|
||||||
"https://api.telegram.org/bot" + setting.apiToken + "/sendMessage"
|
"https://api.telegram.org/bot" + setting.apiToken + "/sendMessage"
|
||||||
}
|
}
|
||||||
Log.i(TAG, "requestUrl:$requestUrl")
|
Log.i(TAG, "requestUrl:$requestUrl")
|
||||||
|
|
||||||
val clientBuilder = OkHttpClient.Builder()
|
val request = if (setting.method != null && setting.method == "GET") {
|
||||||
//设置代理
|
requestUrl += "?chat_id=" + setting.chatId + "&text=" + URLEncoder.encode(content, "UTF-8")
|
||||||
if ((setting.proxyType == Proxy.Type.HTTP || setting.proxyType == Proxy.Type.SOCKS) && !TextUtils.isEmpty(setting.proxyHost) && !TextUtils.isEmpty(setting.proxyPort)) {
|
Log.i(TAG, "requestUrl:$requestUrl")
|
||||||
//代理服务器的IP和端口号
|
XHttp.get(requestUrl)
|
||||||
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()
|
|
||||||
} else {
|
} else {
|
||||||
val bodyMap: MutableMap<String, Any> = mutableMapOf()
|
val bodyMap: MutableMap<String, Any> = mutableMapOf()
|
||||||
bodyMap["chat_id"] = setting.chatId
|
bodyMap["chat_id"] = setting.chatId
|
||||||
@ -89,43 +56,70 @@ class TelegramUtils {
|
|||||||
bodyMap["disable_web_page_preview"] = "true"
|
bodyMap["disable_web_page_preview"] = "true"
|
||||||
val requestMsg: String = Gson().toJson(bodyMap)
|
val requestMsg: String = Gson().toJson(bodyMap)
|
||||||
Log.i(TAG, "requestMsg:$requestMsg")
|
Log.i(TAG, "requestMsg:$requestMsg")
|
||||||
val requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg)
|
XHttp.post(requestUrl).upJson(requestMsg)
|
||||||
request = Request.Builder()
|
|
||||||
.url(requestUrl)
|
|
||||||
.addHeader("Content-Type", "application/json; charset=utf-8")
|
|
||||||
.post(requestBody)
|
|
||||||
.build()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
client.newCall(request).enqueue(object : Callback {
|
//设置代理
|
||||||
|
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()) }))
|
||||||
|
|
||||||
override fun onFailure(call: Call, e: IOException) {
|
//代理的鉴权账号密码
|
||||||
e.printStackTrace()
|
if (setting.proxyAuthenticator == true
|
||||||
Looper.prepare()
|
&& (!TextUtils.isEmpty(setting.proxyUsername) || !TextUtils.isEmpty(setting.proxyPassword))
|
||||||
SendUtils.updateLogs(logId, 0, e.message.toString())
|
) {
|
||||||
//XToastUtils.error("发送失败:" + e.message)
|
Log.i(TAG, "proxyUsername = ${setting.proxyUsername}, proxyPassword = ${setting.proxyPassword}")
|
||||||
Looper.loop()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Throws(IOException::class)
|
if (setting.proxyType == Proxy.Type.HTTP) {
|
||||||
override fun onResponse(call: Call, response: Response) {
|
request.okproxyAuthenticator { _: Route?, response: Response ->
|
||||||
val responseStr = response.body()?.string()
|
//设置代理服务器账号密码
|
||||||
Log.d(TAG, "Response:" + response.code() + "," + responseStr)
|
val credential = Credentials.basic(setting.proxyUsername.toString(), setting.proxyPassword.toString())
|
||||||
|
response.request().newBuilder()
|
||||||
val resp = Gson().fromJson(responseStr, TelegramResult::class.java)
|
.header("Proxy-Authorization", credential)
|
||||||
if (resp.ok == true) {
|
.build()
|
||||||
Looper.prepare()
|
}
|
||||||
SendUtils.updateLogs(logId, 2, responseStr.toString())
|
|
||||||
//XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
|
|
||||||
Looper.loop()
|
|
||||||
} else {
|
} else {
|
||||||
Looper.prepare()
|
Authenticator.setDefault(object : Authenticator() {
|
||||||
SendUtils.updateLogs(logId, 0, responseStr.toString())
|
override fun getPasswordAuthentication(): PasswordAuthentication {
|
||||||
//XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
|
return PasswordAuthentication(setting.proxyUsername.toString(), setting.proxyPassword?.toCharArray())
|
||||||
Looper.loop()
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ versions.rxbinding = "2.2.0"
|
|||||||
versions.butterknife = "10.2.3"
|
versions.butterknife = "10.2.3"
|
||||||
versions.runner = "1.4.0"
|
versions.runner = "1.4.0"
|
||||||
versions.gson = "2.9.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.leakcanary = "2.8.1"
|
||||||
versions.lifecycle = "2.2.0"
|
versions.lifecycle = "2.2.0"
|
||||||
versions.kotlin = '1.6.21'
|
versions.kotlin = '1.6.21'
|
||||||
@ -42,7 +42,7 @@ versions.xui = "1.2.0" //1.1.9
|
|||||||
versions.xupdate = "2.1.1"
|
versions.xupdate = "2.1.1"
|
||||||
versions.xaop = "1.1.0"
|
versions.xaop = "1.1.0"
|
||||||
versions.xutil = "2.0.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.xpage = "3.3.0"
|
||||||
versions.xrouter = "1.0.1"
|
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.xaop_plugin = "com.github.xuexiangjys.XAOP:xaop-plugin:$versions.xaop"
|
||||||
xlibrary.xutil_core = "com.github.xuexiangjys.XUtil:xutil-core:$versions.xutil"
|
xlibrary.xutil_core = "com.github.xuexiangjys.XUtil:xutil-core:$versions.xutil"
|
||||||
xlibrary.xutil_sub = "com.github.xuexiangjys.XUtil:xutil-sub:$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_lib = "com.github.xuexiangjys.XPage:xpage-lib:$versions.xpage"
|
||||||
xlibrary.xpage_compiler = "com.github.xuexiangjys.XPage:xpage-compiler:$versions.xpage"
|
xlibrary.xpage_compiler = "com.github.xuexiangjys.XPage:xpage-compiler:$versions.xpage"
|
||||||
xlibrary.xrouter_runtime = "com.github.xuexiangjys.XRouter:xrouter-runtime:$versions.xrouter"
|
xlibrary.xrouter_runtime = "com.github.xuexiangjys.XRouter:xrouter-runtime:$versions.xrouter"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user