mirror of
https://github.com/pppscn/SmsForwarder
synced 2024-11-19 15:25:45 +00:00
优化:发送通道webhook
支持HTTP基本认证 【格式:http://username:password@domain.com/uri】 #175
优化:发送通道`企业微信应用`获取access_token失败时记录错误日志 优化:发送通道`短信`发送权限未授权/仅当无网络启用时记录错误日志
This commit is contained in:
parent
3d2406a44b
commit
f142f8d958
@ -7,8 +7,10 @@ import java.security.cert.X509Certificate
|
||||
import java.util.*
|
||||
import javax.net.ssl.*
|
||||
|
||||
@Suppress("unused")
|
||||
@SuppressLint("ALL")
|
||||
object CertUtils {
|
||||
|
||||
//获取这个SSLSocketFactory
|
||||
val sSLSocketFactory: SSLSocketFactory
|
||||
get() = try {
|
||||
|
@ -84,9 +84,8 @@ class BarkUtils {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -95,10 +94,8 @@ class BarkUtils {
|
||||
val resp = Gson().fromJson(response, BarkResult::class.java)
|
||||
if (resp.code == 200L) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -95,9 +95,8 @@ class DingtalkUtils private constructor() {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -106,10 +105,8 @@ class DingtalkUtils private constructor() {
|
||||
val resp = Gson().fromJson(response, DingtalkResult::class.java)
|
||||
if (resp.errcode == 0L) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,14 +141,12 @@ class EmailUtils {
|
||||
|
||||
MailSender.getInstance().sendMail(mail, object : MailSender.OnMailSendListener {
|
||||
override fun onError(e: Throwable) {
|
||||
SendUtils.updateLogs(logId, 0, e.message.toString())
|
||||
Log.e("MailSender", e.message.toString())
|
||||
//XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message.toString())
|
||||
SendUtils.updateLogs(logId, 0, e.message.toString())
|
||||
}
|
||||
|
||||
override fun onSuccess() {
|
||||
SendUtils.updateLogs(logId, 2, ResUtils.getString(R.string.request_succeeded))
|
||||
//XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -143,9 +143,8 @@ class FeishuUtils private constructor() {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -154,10 +153,8 @@ class FeishuUtils private constructor() {
|
||||
val resp = Gson().fromJson(response, FeishuResult::class.java)
|
||||
if (resp.code == 0L) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -62,9 +62,8 @@ class GotifyUtils {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -73,10 +72,8 @@ class GotifyUtils {
|
||||
val resp = Gson().fromJson(response, GotifyResult::class.java)
|
||||
if (resp?.id != null) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,9 +79,8 @@ class PushplusUtils private constructor() {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -90,10 +89,8 @@ class PushplusUtils private constructor() {
|
||||
val resp = Gson().fromJson(response, PushplusResult::class.java)
|
||||
if (resp.code == 200L) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,88 +0,0 @@
|
||||
package com.idormy.sms.forwarder.utils.sender
|
||||
|
||||
import android.util.Log
|
||||
import okhttp3.Interceptor
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import java.io.IOException
|
||||
import java.io.InterruptedIOException
|
||||
|
||||
class RetryInterceptor internal constructor(builder: Builder) : Interceptor {
|
||||
//重试的间隔
|
||||
private val retryInterval: Long
|
||||
|
||||
//更新记录ID
|
||||
private val logId: Long
|
||||
|
||||
//最大重试次数
|
||||
private val executionCount: Int
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun intercept(chain: Interceptor.Chain): Response {
|
||||
var retryTimes = 0
|
||||
val request = chain.request()
|
||||
var response: Response
|
||||
do {
|
||||
if (retryTimes > 0 && retryInterval > 0) {
|
||||
val delayTime = retryTimes * retryInterval
|
||||
try {
|
||||
Log.w(TAG, "第 $retryTimes 次重试,休眠 $delayTime 秒")
|
||||
Thread.sleep(delayTime * 1000)
|
||||
} catch (e: InterruptedException) {
|
||||
Thread.currentThread().interrupt()
|
||||
throw InterruptedIOException(e.message)
|
||||
}
|
||||
}
|
||||
response = doRequest(chain, request, retryTimes)!!
|
||||
retryTimes++
|
||||
} while ((!response.isSuccessful) && retryTimes <= executionCount)
|
||||
|
||||
return response
|
||||
}
|
||||
|
||||
private fun doRequest(chain: Interceptor.Chain, request: Request, retryTimes: Int): Response? {
|
||||
var response: Response? = null
|
||||
try {
|
||||
response = chain.proceed(request)
|
||||
} catch (e: Exception) {
|
||||
val resp = if (retryTimes > 0) "第" + retryTimes + "次重试:" + e.message else e.message!!
|
||||
//LogUtils.updateLog(logId, 1, resp);
|
||||
Log.w(TAG, resp)
|
||||
}
|
||||
return response
|
||||
}
|
||||
|
||||
class Builder {
|
||||
var executionCount = 3
|
||||
var retryInterval: Long = 1000
|
||||
var logId: Long = 0
|
||||
fun executionCount(executionCount: Int): Builder {
|
||||
this.executionCount = executionCount
|
||||
return this
|
||||
}
|
||||
|
||||
fun retryInterval(retryInterval: Long): Builder {
|
||||
this.retryInterval = retryInterval
|
||||
return this
|
||||
}
|
||||
|
||||
fun logId(logId: Long): Builder {
|
||||
this.logId = logId
|
||||
return this
|
||||
}
|
||||
|
||||
fun build(): RetryInterceptor {
|
||||
return RetryInterceptor(this)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "RetryInterceptor"
|
||||
}
|
||||
|
||||
init {
|
||||
executionCount = builder.executionCount
|
||||
retryInterval = builder.retryInterval
|
||||
logId = builder.logId
|
||||
}
|
||||
}
|
@ -57,9 +57,8 @@ class ServerchanUtils {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -68,10 +67,8 @@ class ServerchanUtils {
|
||||
val resp = Gson().fromJson(response, ServerchanResult::class.java)
|
||||
if (resp?.code == 0L) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,12 @@ class SmsUtils {
|
||||
) {
|
||||
//仅当无网络时启用 && 判断是否真实有网络
|
||||
if (setting.onlyNoNetwork == true && NetworkUtils.isHaveInternet() && NetworkUtils.isAvailableByPing()) {
|
||||
SendUtils.updateLogs(logId, 0, ResUtils.getString(R.string.OnlyNoNetwork))
|
||||
return
|
||||
}
|
||||
|
||||
if (ActivityCompat.checkSelfPermission(XUtil.getContext(), Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
|
||||
SendUtils.updateLogs(logId, 0, ResUtils.getString(R.string.no_sms_sending_permission))
|
||||
return
|
||||
}
|
||||
|
||||
@ -50,18 +56,11 @@ class SmsUtils {
|
||||
|
||||
//TODO:取不到卡槽信息时,采用默认卡槽发送
|
||||
val mSubscriptionId: Int = App.SimInfoList[simSlotIndex]?.mSubscriptionId ?: -1
|
||||
|
||||
if (ActivityCompat.checkSelfPermission(XUtil.getContext(), Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
|
||||
//XToastUtils.error(ResUtils.getString(R.string.no_sms_sending_permission))
|
||||
return
|
||||
}
|
||||
val res: String? = PhoneUtils.sendSms(mSubscriptionId, setting.mobiles, content)
|
||||
if (res == null) {
|
||||
SendUtils.updateLogs(logId, 2, ResUtils.getString(R.string.request_succeeded))
|
||||
//XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
|
||||
} else {
|
||||
SendUtils.updateLogs(logId, 0, res)
|
||||
//XToastUtils.error(ResUtils.getString(R.string.request_failed) + res)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,9 +110,8 @@ class TelegramUtils private constructor() {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -121,10 +120,8 @@ class TelegramUtils private constructor() {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.idormy.sms.forwarder.utils.sender
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Looper
|
||||
import android.text.TextUtils
|
||||
import android.util.Base64
|
||||
import android.util.Log
|
||||
@ -9,17 +8,17 @@ import com.google.gson.Gson
|
||||
import com.idormy.sms.forwarder.database.entity.Rule
|
||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||
import com.idormy.sms.forwarder.entity.setting.WebhookSetting
|
||||
import com.idormy.sms.forwarder.utils.CertUtils
|
||||
import com.idormy.sms.forwarder.utils.SendUtils
|
||||
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||
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 com.xuexiang.xutil.app.AppUtils
|
||||
import okhttp3.*
|
||||
import java.io.IOException
|
||||
import java.net.URLEncoder
|
||||
import java.nio.charset.StandardCharsets
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import java.util.concurrent.TimeUnit
|
||||
import javax.crypto.Mac
|
||||
import javax.crypto.spec.SecretKeySpec
|
||||
|
||||
@ -42,8 +41,8 @@ class WebhookUtils {
|
||||
msgInfo.getContentForSend(SettingUtils.smsTemplate.toString())
|
||||
}
|
||||
|
||||
var webServer: String = setting.webServer //推送地址
|
||||
Log.i(TAG, "requestUrl:$webServer")
|
||||
var requestUrl: String = setting.webServer //推送地址
|
||||
Log.i(TAG, "requestUrl:$requestUrl")
|
||||
|
||||
val timestamp = System.currentTimeMillis()
|
||||
val orgContent: String = msgInfo.content
|
||||
@ -62,16 +61,25 @@ class WebhookUtils {
|
||||
}
|
||||
|
||||
var webParams = setting.webParams?.trim()
|
||||
val requestBuilder: Request.Builder
|
||||
if (setting.method == "GET" && TextUtils.isEmpty(webParams)) {
|
||||
setting.webServer += (if (setting.webServer.contains("?")) "&" else "?") + "from=" + URLEncoder.encode(from, "UTF-8")
|
||||
webServer += "&content=" + URLEncoder.encode(content, "UTF-8")
|
||||
if (!TextUtils.isEmpty(setting.secret)) {
|
||||
webServer += "×tamp=$timestamp"
|
||||
webServer += "&sign=$sign"
|
||||
|
||||
//支持HTTP基本认证(Basic Authentication)
|
||||
val regex = "^(https?://)([^:]+):([^@]+)@(.+)"
|
||||
val matches = Regex(regex, RegexOption.IGNORE_CASE).findAll(requestUrl).toList().flatMap(MatchResult::groupValues)
|
||||
Log.i(TAG, "matches = $matches")
|
||||
if (matches.isNotEmpty()) {
|
||||
requestUrl = matches[1] + matches[4]
|
||||
Log.i(TAG, "requestUrl:$requestUrl")
|
||||
}
|
||||
Log.d(TAG, "method = GET, Url = $webServer")
|
||||
requestBuilder = Request.Builder().url(webServer).get()
|
||||
|
||||
val request = if (setting.method == "GET" && TextUtils.isEmpty(webParams)) {
|
||||
setting.webServer += (if (setting.webServer.contains("?")) "&" else "?") + "from=" + URLEncoder.encode(from, "UTF-8")
|
||||
requestUrl += "&content=" + URLEncoder.encode(content, "UTF-8")
|
||||
if (!TextUtils.isEmpty(sign)) {
|
||||
requestUrl += "×tamp=$timestamp"
|
||||
requestUrl += "&sign=$sign"
|
||||
}
|
||||
Log.d(TAG, "method = GET, Url = $requestUrl")
|
||||
XHttp.get(requestUrl).keepJson(true)
|
||||
} else if (setting.method == "GET" && !TextUtils.isEmpty(webParams)) {
|
||||
webParams = webParams.toString().replace("[from]", URLEncoder.encode(from, "UTF-8"))
|
||||
.replace("[content]", URLEncoder.encode(content, "UTF-8"))
|
||||
@ -87,15 +95,15 @@ class WebhookUtils {
|
||||
webParams = webParams.replace("[timestamp]", timestamp.toString())
|
||||
.replace("[sign]", URLEncoder.encode(sign, "UTF-8"))
|
||||
}
|
||||
webServer += (if (webServer.contains("?")) "&" else "?") + webParams
|
||||
Log.d(TAG, "method = GET, Url = $webServer")
|
||||
requestBuilder = Request.Builder().url(webServer).get()
|
||||
} else if (webParams != null && !TextUtils.isEmpty(webParams)) {
|
||||
val bodyMsg: String
|
||||
var contentType = "application/x-www-form-urlencoded"
|
||||
if (webParams.startsWith("{")) {
|
||||
contentType = "application/json;charset=utf-8"
|
||||
bodyMsg = webParams.replace("[from]", from)
|
||||
requestUrl += if (webParams.startsWith("/")) {
|
||||
webParams
|
||||
} else {
|
||||
(if (requestUrl.contains("?")) "&" else "?") + webParams
|
||||
}
|
||||
Log.d(TAG, "method = GET, Url = $requestUrl")
|
||||
XHttp.get(requestUrl).keepJson(true)
|
||||
} else if (webParams != null && webParams.isNotEmpty() && webParams.startsWith("{")) {
|
||||
val bodyMsg = webParams.replace("[from]", from)
|
||||
.replace("[content]", escapeJson(content))
|
||||
.replace("[msg]", escapeJson(content))
|
||||
.replace("[org_content]", escapeJson(orgContent))
|
||||
@ -106,90 +114,63 @@ class WebhookUtils {
|
||||
.replace("[receive_time]", receiveTime)
|
||||
.replace("[timestamp]", timestamp.toString())
|
||||
.replace("[sign]", sign)
|
||||
Log.d(TAG, "method = POST, Url = $requestUrl, bodyMsg = $bodyMsg")
|
||||
XHttp.post(requestUrl).keepJson(true).upJson(bodyMsg)
|
||||
} else {
|
||||
bodyMsg = webParams.replace("[from]", URLEncoder.encode(from, "UTF-8"))
|
||||
.replace("[content]", URLEncoder.encode(content, "UTF-8"))
|
||||
.replace("[msg]", URLEncoder.encode(content, "UTF-8"))
|
||||
.replace("[org_content]", URLEncoder.encode(orgContent, "UTF-8"))
|
||||
.replace("[device_mark]", URLEncoder.encode(deviceMark, "UTF-8"))
|
||||
.replace("[app_version]", URLEncoder.encode(appVersion, "UTF-8"))
|
||||
.replace("[title]", URLEncoder.encode(simInfo, "UTF-8"))
|
||||
.replace("[card_slot]", URLEncoder.encode(simInfo, "UTF-8"))
|
||||
.replace("[receive_time]", URLEncoder.encode(receiveTime, "UTF-8"))
|
||||
.replace("[timestamp]", URLEncoder.encode(timestamp.toString(), "UTF-8"))
|
||||
.replace("[sign]", URLEncoder.encode(sign, "UTF-8"))
|
||||
}
|
||||
val body = RequestBody.create(MediaType.parse(contentType), bodyMsg)
|
||||
requestBuilder = Request.Builder()
|
||||
.url(webServer)
|
||||
.addHeader("Content-Type", contentType)
|
||||
.method("POST", body)
|
||||
Log.d(TAG, "method = POST webParams, Body = $bodyMsg")
|
||||
} else {
|
||||
val builder = MultipartBody.Builder().setType(MultipartBody.FORM)
|
||||
.addFormDataPart("from", from)
|
||||
.addFormDataPart("content", content)
|
||||
if (!TextUtils.isEmpty(setting.secret)) {
|
||||
builder.addFormDataPart("timestamp", timestamp.toString())
|
||||
builder.addFormDataPart("sign", sign)
|
||||
}
|
||||
val body: RequestBody = builder.build()
|
||||
Log.d(TAG, "method = POST, Body = $body")
|
||||
requestBuilder = Request.Builder().url(webServer).method("POST", body)
|
||||
if (webParams == null || webParams.isEmpty()) {
|
||||
webParams = "from=[from]&content=[content]×tamp=[timestamp]"
|
||||
if (!TextUtils.isEmpty(sign)) webParams += "&sign=[sign]"
|
||||
}
|
||||
|
||||
val postRequest = XHttp.post(requestUrl).keepJson(true)
|
||||
webParams.split("&").forEach {
|
||||
val param = it.split("=")
|
||||
if (param.size == 2) {
|
||||
postRequest.params(param[0], param[1].replace("[from]", from)
|
||||
.replace("[content]", content)
|
||||
.replace("[msg]", content)
|
||||
.replace("[org_content]", orgContent)
|
||||
.replace("[device_mark]", deviceMark)
|
||||
.replace("[app_version]", appVersion)
|
||||
.replace("[title]", simInfo)
|
||||
.replace("[card_slot]", simInfo)
|
||||
.replace("[receive_time]", receiveTime)
|
||||
.replace("[timestamp]", timestamp.toString())
|
||||
.replace("[sign]", sign))
|
||||
}
|
||||
}
|
||||
postRequest
|
||||
}
|
||||
|
||||
//添加headers
|
||||
for ((key, value) in setting.headers?.entries!!) {
|
||||
requestBuilder.addHeader(key, value)
|
||||
request.headers(key, value)
|
||||
}
|
||||
|
||||
val clientBuilder = OkHttpClient.Builder()
|
||||
|
||||
//设置重试拦截器
|
||||
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)
|
||||
//支持HTTP基本认证(Basic Authentication)
|
||||
if (matches.isNotEmpty()) {
|
||||
request.addInterceptor(BasicAuthInterceptor(matches[2], matches[3]))
|
||||
}
|
||||
|
||||
//忽略https证书
|
||||
CertUtils.x509TrustManager?.let { clientBuilder.sslSocketFactory(CertUtils.sSLSocketFactory, it).hostnameVerifier(CertUtils.hostnameVerifier) }
|
||||
request.ignoreHttpsCert() //忽略https证书
|
||||
.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>() {
|
||||
|
||||
//设置读取超时时间
|
||||
val client = clientBuilder
|
||||
.readTimeout(SettingUtils.requestTimeout.toLong(), TimeUnit.SECONDS)
|
||||
.writeTimeout(SettingUtils.requestTimeout.toLong(), TimeUnit.SECONDS)
|
||||
.connectTimeout(SettingUtils.requestTimeout.toLong(), TimeUnit.SECONDS)
|
||||
.build()
|
||||
|
||||
client.newCall(requestBuilder.build()).enqueue(object : Callback {
|
||||
override fun onFailure(call: Call, e: IOException) {
|
||||
//解决在子线程中调用Toast的异常情况处理
|
||||
if (Looper.myLooper() == null) Looper.prepare()
|
||||
e.printStackTrace()
|
||||
SendUtils.updateLogs(logId, 0, e.message.toString())
|
||||
//XToastUtils.error(ResUtils.getString(R.string.request_failed) + e.message)
|
||||
Looper.loop()
|
||||
override fun onError(e: ApiException) {
|
||||
Log.e(TAG, e.detailMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun onResponse(call: Call, response: Response) {
|
||||
val responseStr = response.body().toString()
|
||||
Log.d(TAG, "Response:" + response.code() + "," + responseStr)
|
||||
override fun onSuccess(response: String) {
|
||||
Log.i(TAG, response)
|
||||
SendUtils.updateLogs(logId, 2, response)
|
||||
}
|
||||
|
||||
//返回http状态200即为成功
|
||||
if (200 == response.code()) {
|
||||
if (Looper.myLooper() == null) Looper.prepare()
|
||||
SendUtils.updateLogs(logId, 2, responseStr)
|
||||
//XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
|
||||
Looper.loop()
|
||||
} else {
|
||||
if (Looper.myLooper() == null) Looper.prepare()
|
||||
SendUtils.updateLogs(logId, 0, responseStr)
|
||||
//XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
|
||||
Looper.loop()
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package com.idormy.sms.forwarder.utils.sender
|
||||
import android.text.TextUtils
|
||||
import android.util.Log
|
||||
import com.google.gson.Gson
|
||||
import com.idormy.sms.forwarder.R
|
||||
import com.idormy.sms.forwarder.database.entity.Rule
|
||||
import com.idormy.sms.forwarder.entity.MsgInfo
|
||||
import com.idormy.sms.forwarder.entity.result.DingtalkResult
|
||||
@ -15,6 +16,7 @@ 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 com.xuexiang.xui.utils.ResUtils.getString
|
||||
|
||||
@Suppress("PrivatePropertyName", "UNUSED_PARAMETER")
|
||||
class WeworkAgentUtils private constructor() {
|
||||
@ -48,9 +50,8 @@ class WeworkAgentUtils private constructor() {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -62,7 +63,7 @@ class WeworkAgentUtils private constructor() {
|
||||
MMKVUtils.put("expires_in_" + setting.agentID, System.currentTimeMillis() + ((resp.expires_in ?: 7200) - 120) * 1000L) //提前2分钟过期
|
||||
sendTextMsg(setting, msgInfo, rule, logId)
|
||||
} else {
|
||||
//XToastUtils.error(String.format(getString(R.string.request_failed_tips), response))
|
||||
SendUtils.updateLogs(logId, 0, String.format(getString(R.string.request_failed_tips), response))
|
||||
}
|
||||
}
|
||||
|
||||
@ -107,9 +108,8 @@ class WeworkAgentUtils private constructor() {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -118,10 +118,8 @@ class WeworkAgentUtils private constructor() {
|
||||
val resp = Gson().fromJson(response, DingtalkResult::class.java)
|
||||
if (resp.errcode == 0L) {
|
||||
SendUtils.updateLogs(logId, 2, response)
|
||||
//XToastUtils.success(getString(R.string.request_succeeded))
|
||||
} else {
|
||||
SendUtils.updateLogs(logId, 0, response)
|
||||
//XToastUtils.error(getString(R.string.request_failed) + response)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -56,9 +56,8 @@ class WeworkRobotUtils private constructor() {
|
||||
.execute(object : SimpleCallBack<String>() {
|
||||
|
||||
override fun onError(e: ApiException) {
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
Log.e(TAG, e.detailMessage)
|
||||
//XToastUtils.error(e.displayMessage)
|
||||
SendUtils.updateLogs(logId, 0, e.displayMessage)
|
||||
}
|
||||
|
||||
override fun onSuccess(response: String) {
|
||||
@ -67,10 +66,8 @@ class WeworkRobotUtils private constructor() {
|
||||
val resp = Gson().fromJson(response, WeworkRobotResult::class.java)
|
||||
if (resp.errcode == 0L) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user