优化:发送失败重试简化配置、机制优化(手动请求时不重试)

pull/115/head
pppscn 2 years ago
parent c011f6f811
commit 3f8f37c59b

@ -1,5 +1,6 @@
package com.idormy.sms.forwarder;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
@ -29,6 +30,7 @@ public class MyApplication extends Application {
//是否关闭页面提示
public static boolean showHelpTip = true;
SharedPreferencesHelper sharedPreferencesHelper;
@SuppressLint("StaticFieldLeak")
private static Context context;
@Override

@ -102,15 +102,8 @@ public class SettingActivity extends AppCompatActivity {
batterySetting(findViewById(R.id.switch_battery_setting));
//不在最近任务列表中显示
switchExcludeFromRecents(findViewById(R.id.switch_exclude_from_recents));
//是否开启失败重试
switchRetryDelay(findViewById(R.id.switch_retry_delay));
//接口请求失败重试时间间隔
editRetryDelayTime(findViewById(R.id.et_retry_delay_time1), 1);
editRetryDelayTime(findViewById(R.id.et_retry_delay_time2), 2);
editRetryDelayTime(findViewById(R.id.et_retry_delay_time3), 3);
editRetryDelayTime(findViewById(R.id.et_retry_delay_time4), 4);
editRetryDelayTime(findViewById(R.id.et_retry_delay_time5), 5);
editRetryDelayTime(findViewById(R.id.et_retry_times), findViewById(R.id.et_delay_time));
//设备备注
editAddExtraDeviceMark(findViewById(R.id.et_add_extra_device_mark));
@ -589,32 +582,31 @@ public class SettingActivity extends AppCompatActivity {
});
}
//是否开启失败重试
@SuppressLint("UseSwitchCompatOrMaterialCode")
private void switchRetryDelay(Switch switch_retry_delay) {
switch_retry_delay.setChecked(SettingUtil.getSwitchRetryDelay());
switch_retry_delay.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked
&& SettingUtil.getRetryDelayTime(1) == 0
&& SettingUtil.getRetryDelayTime(2) == 0
&& SettingUtil.getRetryDelayTime(3) == 0
&& SettingUtil.getRetryDelayTime(4) == 0
&& SettingUtil.getRetryDelayTime(5) == 0) {
Toast.makeText(context, "所有间隔时间都为0无法启用", Toast.LENGTH_SHORT).show();
SettingUtil.switchRetryDelay(false);
return;
//接口请求失败重试时间间隔
private void editRetryDelayTime(final EditText et_retry_times, final EditText et_delay_time) {
et_retry_times.setText(String.valueOf(SettingUtil.getRetryTimes()));
et_retry_times.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
SettingUtil.switchRetryDelay(isChecked);
Log.d(TAG, "switchRetryDelay:" + isChecked);
});
}
//接口请求失败重试时间间隔
private void editRetryDelayTime(final EditText et_retry_delay_time, final int index) {
et_retry_delay_time.setText(String.valueOf(SettingUtil.getRetryDelayTime(index)));
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String retryTimes = et_retry_times.getText().toString().trim();
if (!retryTimes.isEmpty()) {
SettingUtil.setRetryTimes(Integer.parseInt(retryTimes));
} else {
SettingUtil.setRetryTimes(0);
}
}
});
et_retry_delay_time.addTextChangedListener(new TextWatcher() {
et_delay_time.setText(String.valueOf(SettingUtil.getDelayTime()));
et_delay_time.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@ -625,20 +617,11 @@ public class SettingActivity extends AppCompatActivity {
@Override
public void afterTextChanged(Editable s) {
String delayTime = et_retry_delay_time.getText().toString().trim();
String delayTime = et_delay_time.getText().toString().trim();
if (!delayTime.isEmpty()) {
SettingUtil.setRetryDelayTime(index, Integer.parseInt(delayTime));
SettingUtil.setDelayTime(Integer.parseInt(delayTime));
} else {
SettingUtil.setRetryDelayTime(index, 0);
}
if (SettingUtil.getRetryDelayTime(1) == 0
&& SettingUtil.getRetryDelayTime(2) == 0
&& SettingUtil.getRetryDelayTime(3) == 0
&& SettingUtil.getRetryDelayTime(4) == 0
&& SettingUtil.getRetryDelayTime(5) == 0) {
Toast.makeText(context, "所有间隔时间都为0自动禁用失败重试", Toast.LENGTH_SHORT).show();
SettingUtil.switchRetryDelay(false);
SettingUtil.setDelayTime(1);
}
}
});

@ -40,12 +40,17 @@ import com.idormy.sms.forwarder.model.vo.WebNotifySettingVo;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.NetUtil;
import com.idormy.sms.forwarder.utils.RuleUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
public class SendUtil {
private static final String TAG = "SendUtil";
@ -128,7 +133,7 @@ public class SendUtil {
for (SenderModel senderModel : senderModels) {
String smsTemplate = ruleModel.getSwitchSmsTemplate() ? ruleModel.getSmsTemplate() : "";
String regexReplace = ruleModel.getSwitchRegexReplace() ? ruleModel.getRegexReplace() : "";
SendUtil.senderSendMsg(handler, smsVo, senderModel, logVo.getId(), smsTemplate, regexReplace);
SendUtil.senderSendMsg(handler, null, smsVo, senderModel, logVo.getId(), smsTemplate, regexReplace);
}
}
} catch (Exception e) {
@ -162,15 +167,47 @@ public class SendUtil {
for (SenderModel senderModel : senderModels) {
String smsTemplate = ruleModel.getSwitchSmsTemplate() ? ruleModel.getSmsTemplate() : "";
String regexReplace = ruleModel.getSwitchRegexReplace() ? ruleModel.getRegexReplace() : "";
SendUtil.senderSendMsg(handError, smsVo, senderModel, 0, smsTemplate, regexReplace);
SendUtil.senderSendMsg(handError, null, smsVo, senderModel, 0, smsTemplate, regexReplace);
}
}
@SuppressWarnings("ResultOfMethodCallIgnored")
public static void senderSendMsgNoHandError(SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate, String regexReplace) {
SendUtil.senderSendMsg(null, smsVo, senderModel, logId, smsTemplate, regexReplace);
//网络请求+重试比较耗时,创建子线程处理
// new Thread(new Runnable() {
// @Override
// public void run() {
//是否需要失败重试
int retryTimes = SettingUtil.getRetryTimes();
if (retryTimes < 1) {
SendUtil.senderSendMsg(null, null, smsVo, senderModel, logId, smsTemplate, regexReplace);
return;
}
try {
int delayTime = SettingUtil.getDelayTime();
Observable
.create(emitter -> {
Log.w(TAG, "RxJava 开始请求接口...");
SendUtil.senderSendMsg(null, emitter, smsVo, senderModel, logId, smsTemplate, regexReplace);
})
.retryWhen(attempts -> attempts.zipWith(Observable.range(1, retryTimes), (n, i) -> i).flatMap(i -> {
long delay = (long) i * delayTime;
Log.w(TAG, "RxJava 请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}).concatWith(Observable.error(new RuntimeException("请求接口失败,已重试 " + retryTimes + " 次"))))
.subscribe(
(i) -> System.out.println("onNext with " + i),
(error) -> System.out.println("OnError with " + error)
);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
// }
// }).start();//启动线程
}
public static void senderSendMsg(Handler handError, SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate, String regexReplace) {
public static void senderSendMsg(Handler handError, ObservableEmitter<Object> emitter, SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate, String regexReplace) {
Log.i(TAG, "senderSendMsg smsVo:" + smsVo.toString() + "senderModel:" + senderModel.toString());
@ -187,7 +224,7 @@ public class SendUtil {
DingDingSettingVo dingDingSettingVo = JSON.parseObject(senderModel.getJsonSetting(), DingDingSettingVo.class);
if (dingDingSettingVo != null) {
try {
SenderDingdingMsg.sendMsg(logId, handError, dingDingSettingVo.getToken(), dingDingSettingVo.getSecret(), dingDingSettingVo.getAtMobiles(), dingDingSettingVo.getAtAll(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
SenderDingdingMsg.sendMsg(logId, handError, emitter, dingDingSettingVo.getToken(), dingDingSettingVo.getSecret(), dingDingSettingVo.getAtMobiles(), dingDingSettingVo.getAtAll(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: dingding error " + e.getMessage());
@ -202,7 +239,7 @@ public class SendUtil {
EmailSettingVo emailSettingVo = JSON.parseObject(senderModel.getJsonSetting(), EmailSettingVo.class);
if (emailSettingVo != null) {
try {
SenderMailMsg.sendEmail(logId, handError, emailSettingVo.getProtocol(), emailSettingVo.getHost(), emailSettingVo.getPort(), emailSettingVo.getSsl(), emailSettingVo.getFromEmail(), emailSettingVo.getNickname(),
SenderMailMsg.sendEmail(logId, handError, emitter, emailSettingVo.getProtocol(), emailSettingVo.getHost(), emailSettingVo.getPort(), emailSettingVo.getSsl(), emailSettingVo.getFromEmail(), emailSettingVo.getNickname(),
emailSettingVo.getPwd(), emailSettingVo.getToEmail(), smsVo.getTitleForSend(emailSettingVo.getTitle(), regexReplace), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
@ -218,7 +255,7 @@ public class SendUtil {
BarkSettingVo barkSettingVo = JSON.parseObject(senderModel.getJsonSetting(), BarkSettingVo.class);
if (barkSettingVo != null) {
try {
SenderBarkMsg.sendMsg(logId, handError, barkSettingVo.getServer(), barkSettingVo.getIcon(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), senderModel.getName());
SenderBarkMsg.sendMsg(logId, handError, emitter, barkSettingVo.getServer(), barkSettingVo.getIcon(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), senderModel.getName());
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderBarkMsg error " + e.getMessage());
@ -233,7 +270,7 @@ public class SendUtil {
WebNotifySettingVo webNotifySettingVo = JSON.parseObject(senderModel.getJsonSetting(), WebNotifySettingVo.class);
if (webNotifySettingVo != null) {
try {
SenderWebNotifyMsg.sendMsg(logId, handError, webNotifySettingVo.getWebServer(), webNotifySettingVo.getWebParams(), webNotifySettingVo.getSecret(), webNotifySettingVo.getMethod(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
SenderWebNotifyMsg.sendMsg(logId, handError, emitter, webNotifySettingVo.getWebServer(), webNotifySettingVo.getWebParams(), webNotifySettingVo.getSecret(), webNotifySettingVo.getMethod(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderWebNotifyMsg error " + e.getMessage());
@ -248,7 +285,7 @@ public class SendUtil {
QYWXGroupRobotSettingVo qywxGroupRobotSettingVo = JSON.parseObject(senderModel.getJsonSetting(), QYWXGroupRobotSettingVo.class);
if (qywxGroupRobotSettingVo != null) {
try {
SenderQyWxGroupRobotMsg.sendMsg(logId, handError, qywxGroupRobotSettingVo.getWebHook(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
SenderQyWxGroupRobotMsg.sendMsg(logId, handError, emitter, qywxGroupRobotSettingVo.getWebHook(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderQyWxGroupRobotMsg error " + e.getMessage());
@ -263,7 +300,7 @@ public class SendUtil {
QYWXAppSettingVo qYWXAppSettingVo = JSON.parseObject(senderModel.getJsonSetting(), QYWXAppSettingVo.class);
if (qYWXAppSettingVo != null) {
try {
SenderQyWxAppMsg.sendMsg(logId, handError, senderModel, qYWXAppSettingVo, smsVo.getSmsVoForSend(smsTemplate, regexReplace));
SenderQyWxAppMsg.sendMsg(logId, handError, emitter, senderModel, qYWXAppSettingVo, smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: qywx_app error " + e.getMessage());
@ -278,7 +315,7 @@ public class SendUtil {
ServerChanSettingVo serverChanSettingVo = JSON.parseObject(senderModel.getJsonSetting(), ServerChanSettingVo.class);
if (serverChanSettingVo != null) {
try {
SenderServerChanMsg.sendMsg(logId, handError, serverChanSettingVo.getSendKey(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
SenderServerChanMsg.sendMsg(logId, handError, emitter, serverChanSettingVo.getSendKey(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderServerChanMsg error " + e.getMessage());
@ -293,7 +330,7 @@ public class SendUtil {
TelegramSettingVo telegramSettingVo = JSON.parseObject(senderModel.getJsonSetting(), TelegramSettingVo.class);
if (telegramSettingVo != null) {
try {
SenderTelegramMsg.sendMsg(logId, handError, telegramSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), telegramSettingVo.getMethod());
SenderTelegramMsg.sendMsg(logId, handError, emitter, telegramSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), telegramSettingVo.getMethod());
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderTelegramMsg error " + e.getMessage());
@ -335,7 +372,7 @@ public class SendUtil {
FeiShuSettingVo feiShuSettingVo = JSON.parseObject(senderModel.getJsonSetting(), FeiShuSettingVo.class);
if (feiShuSettingVo != null) {
try {
SenderFeishuMsg.sendMsg(logId, handError, feiShuSettingVo.getWebhook(), feiShuSettingVo.getSecret(), smsVo.getMobile(), smsVo.getDate(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
SenderFeishuMsg.sendMsg(logId, handError, emitter, feiShuSettingVo.getWebhook(), feiShuSettingVo.getSecret(), smsVo.getMobile(), smsVo.getDate(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: feishu error " + e.getMessage());
@ -350,7 +387,7 @@ public class SendUtil {
PushPlusSettingVo pushPlusSettingVo = JSON.parseObject(senderModel.getJsonSetting(), PushPlusSettingVo.class);
if (pushPlusSettingVo != null) {
try {
SenderPushPlusMsg.sendMsg(logId, handError, pushPlusSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
SenderPushPlusMsg.sendMsg(logId, handError, emitter, pushPlusSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: feishu error " + e.getMessage());
@ -365,7 +402,7 @@ public class SendUtil {
GotifySettingVo gotifySettingVo = JSON.parseObject(senderModel.getJsonSetting(), GotifySettingVo.class);
if (gotifySettingVo != null) {
try {
SenderGotifyMsg.sendMsg(logId, handError, gotifySettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
SenderGotifyMsg.sendMsg(logId, handError, emitter, gotifySettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: gotify error " + e.getMessage());

@ -6,16 +6,13 @@ import android.util.Log;
import androidx.annotation.NonNull;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
@ -23,12 +20,11 @@ import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class SenderBarkMsg extends SenderBaseMsg {
static final String TAG = "SenderBarkMsg";
public static void sendMsg(final long logId, final Handler handError, String barkServer, String barkIcon, String from, String content, String groupName) throws Exception {
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, String barkServer, String barkIcon, String from, String content, String groupName) throws Exception {
Log.i(TAG, "sendMsg barkServer:" + barkServer + " from:" + from + " content:" + content);
if (barkServer == null || barkServer.isEmpty()) {
@ -59,49 +55,31 @@ public class SenderBarkMsg extends SenderBaseMsg {
final String requestUrl = barkServer;
Log.i(TAG, "requestUrl:" + requestUrl);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder().url(requestUrl).get().build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"message\":\"success\"")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder().url(requestUrl).get().build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"message\":\"success\"")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}

@ -20,4 +20,5 @@ public class SenderBaseMsg {
handError.sendMessage(msg);
}
}
}
}

@ -9,7 +9,6 @@ import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException;
import java.net.URLEncoder;
@ -19,12 +18,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
@ -34,12 +31,12 @@ import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"})
@SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderDingdingMsg extends SenderBaseMsg {
static final String TAG = "SenderDingdingMsg";
public static void sendMsg(final long logId, final Handler handError, String token, String secret, String atMobiles, Boolean atAll, String content) throws Exception {
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, String token, String secret, String atMobiles, Boolean atAll, String content) throws Exception {
Log.i(TAG, "sendMsg token:" + token + " secret:" + secret + " atMobiles:" + atMobiles + " atAll:" + atAll + " content:" + content);
if (token == null || token.isEmpty()) {
@ -91,55 +88,38 @@ public class SenderDingdingMsg extends SenderBaseMsg {
final String requestMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "requestMsg:" + requestMsg);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}

@ -18,12 +18,10 @@ import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
@ -33,6 +31,7 @@ import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderFeishuMsg extends SenderBaseMsg {
static final String TAG = "SenderFeishuMsg";
@ -90,8 +89,8 @@ public class SenderFeishuMsg extends SenderBaseMsg {
" }\n" +
"}";
@SuppressWarnings("rawtypes")
public static void sendMsg(final long logId, final Handler handError, String webhook, String secret, String from, Date date, String content) throws Exception {
//@SuppressWarnings("rawtypes")
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, String webhook, String secret, String from, Date date, String content) throws Exception {
Log.i(TAG, "sendMsg webhook:" + webhook + " secret:" + secret + " content:" + content);
if (webhook == null || webhook.isEmpty()) {
@ -121,60 +120,42 @@ public class SenderFeishuMsg extends SenderBaseMsg {
textMsgMap.put("msg_type", "interactive");
textMsgMap.put("card", "${CARD_BODY}");
final String requestUrl = webhook;
Log.i(TAG, "requestUrl:" + requestUrl);
Log.i(TAG, "requestUrl:" + webhook);
final String requestMsg = JSON.toJSONString(textMsgMap).replace("\"${CARD_BODY}\"", buildMsg(from, date, content));
Log.i(TAG, "requestMsg:" + requestMsg);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient();
@SuppressWarnings("deprecation") RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"StatusCode\":0")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
OkHttpClient client = new OkHttpClient();
@SuppressWarnings("deprecation") RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder()
.url(webhook)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"StatusCode\":0")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}
private static String buildMsg(String from, Date date, String content) {

@ -11,6 +11,7 @@ import com.idormy.sms.forwarder.utils.LogUtil;
import java.io.IOException;
import java.util.Objects;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
@ -23,7 +24,7 @@ public class SenderGotifyMsg extends SenderBaseMsg {
static final String TAG = "SenderGotifyMsg";
public static void sendMsg(final long logId, final Handler handError, GotifySettingVo gotifySettingVo, String title, String message) throws Exception {
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, GotifySettingVo gotifySettingVo, String title, String message) throws Exception {
//具体消息内容
if (message == null || message.isEmpty()) return;
@ -45,6 +46,7 @@ public class SenderGotifyMsg extends SenderBaseMsg {
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new RuntimeException("RxJava 请求接口异常..."));
}
@Override

@ -3,88 +3,69 @@ package com.idormy.sms.forwarder.sender;
import android.os.Handler;
import android.util.Log;
import com.idormy.sms.forwarder.MyApplication;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import com.smailnet.emailkit.Draft;
import com.smailnet.emailkit.EmailKit;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class SenderMailMsg extends SenderBaseMsg {
private static final String TAG = "SenderMailMsg";
public static void sendEmail(final long logId, final Handler handError, final String protocol, final String host, final String port, final boolean ssl, final String fromEmail, final String nickname, final String pwd, final String toAdd, final String title, final String content) {
public static void sendEmail(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, final String protocol, final String host, final String port, final boolean ssl, final String fromEmail, final String nickname, final String pwd, final String toAdd, final String title, final String content) {
Log.d(TAG, "sendEmail: protocol:" + protocol + " host:" + host + " port:" + port + " ssl:" + ssl + " fromEmail:" + fromEmail + " nickname:" + nickname + " pwd:" + pwd + " toAdd:" + toAdd);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
try {
//初始化框架
//EmailKit.initialize(this);
//配置发件人邮件服务器参数
EmailKit.Config config = new EmailKit.Config()
.setSMTP(host, Integer.parseInt(port), ssl) //设置SMTP服务器主机地址、端口和是否开启ssl
.setAccount(fromEmail) //发件人邮箱
.setPassword(pwd); //密码或授权码
//多个收件人邮箱
Set<String> toSet = new HashSet<>(Arrays.asList(toAdd.replace("", ",").split(",")));
//设置一封草稿邮件
Draft draft = new Draft()
.setNickname(nickname) //发件人昵称
.setTo(toSet) //收件人邮箱
.setSubject(title) //邮件主题
.setText(content); //邮件正文
//使用SMTP服务发送邮件
EmailKit.useSMTPService(config)
.send(draft, new EmailKit.GetSendCallback() {
@Override
public void onSuccess() {
LogUtil.updateLog(logId, 2, "发送成功");
Toast(handError, TAG, "发送成功");
}
@Override
public void onFailure(String errMsg) {
LogUtil.updateLog(logId, 0, errMsg);
Toast(handError, TAG, "发送失败,错误:" + errMsg);
}
});
//销毁框架
EmailKit.destroy();
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, e.getMessage(), e);
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
try {
//初始化框架
EmailKit.initialize(MyApplication.getContext());
//配置发件人邮件服务器参数
EmailKit.Config config = new EmailKit.Config()
.setSMTP(host, Integer.parseInt(port), ssl) //设置SMTP服务器主机地址、端口和是否开启ssl
.setAccount(fromEmail) //发件人邮箱
.setPassword(pwd); //密码或授权码
//多个收件人邮箱
Set<String> toSet = new HashSet<>(Arrays.asList(toAdd.replace("", ",").split(",")));
//设置一封草稿邮件
Draft draft = new Draft()
.setNickname(nickname) //发件人昵称
.setTo(toSet) //收件人邮箱
.setSubject(title) //邮件主题
.setText(content); //邮件正文
//使用SMTP服务发送邮件
EmailKit.useSMTPService(config)
.send(draft, new EmailKit.GetSendCallback() {
@Override
public void onSuccess() {
LogUtil.updateLog(logId, 2, "发送成功");
Toast(handError, TAG, "发送成功");
}
@Override
public void onFailure(String errMsg) {
LogUtil.updateLog(logId, 0, errMsg);
Toast(handError, TAG, "发送失败,错误:" + errMsg);
}
});
//销毁框架
EmailKit.destroy();
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, e.getMessage(), e);
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
}
}

@ -8,15 +8,12 @@ import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.model.vo.PushPlusSettingVo;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
@ -26,12 +23,12 @@ import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"})
@SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderPushPlusMsg extends SenderBaseMsg {
static final String TAG = "SenderPushPlusMsg";
public static void sendMsg(final long logId, final Handler handError, PushPlusSettingVo pushPlusSettingVo, String title, String content) throws Exception {
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, PushPlusSettingVo pushPlusSettingVo, String title, String content) throws Exception {
//用户令牌
String token = pushPlusSettingVo.getToken();
@ -77,55 +74,38 @@ public class SenderPushPlusMsg extends SenderBaseMsg {
final String requestMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "requestMsg:" + requestMsg);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"code\":200")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"code\":200")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}
}

@ -14,15 +14,12 @@ import com.alibaba.fastjson.JSONObject;
import com.idormy.sms.forwarder.model.SenderModel;
import com.idormy.sms.forwarder.model.vo.QYWXAppSettingVo;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
@ -32,12 +29,12 @@ import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@SuppressWarnings({"rawtypes", "unchecked", "deprecation", "ResultOfMethodCallIgnored"})
@SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderQyWxAppMsg extends SenderBaseMsg {
static final String TAG = "SenderQyWxAppMsg";
public static void sendMsg(final long logId, final Handler handError, final SenderModel senderModel, final QYWXAppSettingVo qYWXAppSettingVo, String content) throws Exception {
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, final SenderModel senderModel, final QYWXAppSettingVo qYWXAppSettingVo, String content) throws Exception {
if (qYWXAppSettingVo == null) {
Toast(handError, TAG, "参数错误");
@ -56,101 +53,82 @@ public class SenderQyWxAppMsg extends SenderBaseMsg {
return;
}
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
//TODO:获取有效access_token
String accessToken = qYWXAppSettingVo.getAccessToken();
if (accessToken == null || accessToken.isEmpty()) {
String getTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?";
getTokenUrl += "corpid=" + corpID;
getTokenUrl += "&corpsecret=" + secret;
Log.d(TAG, "getTokenUrl" + getTokenUrl);
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder().url(getTokenUrl).get().build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
qYWXAppSettingVo.setAccessToken("");
qYWXAppSettingVo.setExpiresIn(0L);
if (senderModel != null) {
senderModel.setJsonSetting(JSON.toJSONString(qYWXAppSettingVo));
SenderUtil.updateSender(senderModel);
}
Log.d(TAG, "onFailure" + e.getMessage());
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "获取access_token失败" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
emitter.onError(new RuntimeException("请求接口异常..."));
}
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String json = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Code" + response.code() + " Response: " + json);
JSONObject jsonObject = JSON.parseObject(json);
int errcode = jsonObject.getInteger("errcode");
if (errcode == 0) {
String access_token = jsonObject.getString("access_token");
long expires_in = System.currentTimeMillis() + (jsonObject.getInteger("expires_in") - 120) * 1000L; //提前2分钟过期
Log.d(TAG, "access_token" + access_token);
Log.d(TAG, "expires_in" + expires_in);
qYWXAppSettingVo.setAccessToken(access_token);
qYWXAppSettingVo.setExpiresIn(expires_in);
if (senderModel != null) {
senderModel.setJsonSetting(JSON.toJSONString(qYWXAppSettingVo));
SenderUtil.updateSender(senderModel);
}
sendTextMsg(emitter, logId, handError, agentID, toUser, content, access_token);
} else {
String errmsg = jsonObject.getString("errmsg");
LogUtil.updateLog(logId, 0, errmsg);
Log.d(TAG, "onFailure" + errmsg);
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "获取access_token失败" + errmsg);
msg.setData(bundle);
handError.sendMessage(msg);
}
emitter.onError(new RuntimeException("请求接口异常..."));
}
}
});
} else {
sendTextMsg(emitter, logId, handError, agentID, toUser, content, accessToken);
//TODO:获取有效access_token
String accessToken = qYWXAppSettingVo.getAccessToken();
if (accessToken == null || accessToken.isEmpty()) {
String getTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?";
getTokenUrl += "corpid=" + corpID;
getTokenUrl += "&corpsecret=" + secret;
Log.d(TAG, "getTokenUrl" + getTokenUrl);
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder().url(getTokenUrl).get().build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
qYWXAppSettingVo.setAccessToken("");
qYWXAppSettingVo.setExpiresIn(0L);
if (senderModel != null) {
senderModel.setJsonSetting(JSON.toJSONString(qYWXAppSettingVo));
SenderUtil.updateSender(senderModel);
}
Log.d(TAG, "onFailure" + e.getMessage());
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "获取access_token失败" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String json = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Code" + response.code() + " Response: " + json);
JSONObject jsonObject = JSON.parseObject(json);
int errcode = jsonObject.getInteger("errcode");
if (errcode == 0) {
String access_token = jsonObject.getString("access_token");
long expires_in = System.currentTimeMillis() + (jsonObject.getInteger("expires_in") - 120) * 1000L; //提前2分钟过期
Log.d(TAG, "access_token" + access_token);
Log.d(TAG, "expires_in" + expires_in);
qYWXAppSettingVo.setAccessToken(access_token);
qYWXAppSettingVo.setExpiresIn(expires_in);
if (senderModel != null) {
senderModel.setJsonSetting(JSON.toJSONString(qYWXAppSettingVo));
SenderUtil.updateSender(senderModel);
}
sendTextMsg(emitter, logId, handError, agentID, toUser, content, access_token);
} else {
String errmsg = jsonObject.getString("errmsg");
LogUtil.updateLog(logId, 0, errmsg);
Log.d(TAG, "onFailure" + errmsg);
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "获取access_token失败" + errmsg);
msg.setData(bundle);
handError.sendMessage(msg);
}
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
}
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
});
} else {
sendTextMsg(emitter, logId, handError, agentID, toUser, content, accessToken);
}
}
@ -186,7 +164,7 @@ public class SenderQyWxAppMsg extends SenderBaseMsg {
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
@Override

@ -7,15 +7,12 @@ import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
@ -25,12 +22,12 @@ import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@SuppressWarnings({"rawtypes", "unchecked", "deprecation", "ResultOfMethodCallIgnored"})
@SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderQyWxGroupRobotMsg extends SenderBaseMsg {
static final String TAG = "SenderQyWxGroupRobotMsg";
public static void sendMsg(final long logId, final Handler handError, String webHook, String from, String content) throws Exception {
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, String webHook, String from, String content) throws Exception {
Log.i(TAG, "sendMsg webHook:" + webHook + " from:" + from + " content:" + content);
if (webHook == null || webHook.isEmpty()) {
@ -43,60 +40,42 @@ public class SenderQyWxGroupRobotMsg extends SenderBaseMsg {
textText.put("content", content);
textMsgMap.put("text", textText);
final String requestUrl = webHook;
Log.i(TAG, "requestUrl:" + requestUrl);
Log.i(TAG, "requestUrl:" + webHook);
final String requestMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "requestMsg:" + requestMsg);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder()
.url(webHook)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}
}

@ -6,13 +6,10 @@ import android.util.Log;
import androidx.annotation.NonNull;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
@ -22,12 +19,11 @@ import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class SenderServerChanMsg extends SenderBaseMsg {
static final String TAG = "SenderServerChanMsg";
public static void sendMsg(final long logId, final Handler handError, final String sendKey, final String title, final String desp) throws Exception {
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, final String sendKey, final String title, final String desp) throws Exception {
Log.i(TAG, "sendMsg sendKey:" + sendKey + " title:" + title + " desp:" + desp);
if (sendKey == null || sendKey.isEmpty()) {
@ -40,54 +36,37 @@ public class SenderServerChanMsg extends SenderBaseMsg {
final String requestMsg = desp.replaceFirst("^" + title + "(.*)", "").trim();
Log.i(TAG, "requestMsg:" + requestMsg);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient().newBuilder().build();
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("title", title)
.addFormDataPart("desp", requestMsg);
RequestBody body = builder.build();
Request request = new Request.Builder().url(requestUrl).method("POST", body).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"code\":0")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
OkHttpClient client = new OkHttpClient().newBuilder().build();
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("title", title)
.addFormDataPart("desp", requestMsg);
RequestBody body = builder.build();
Request request = new Request.Builder().url(requestUrl).method("POST", body).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"code\":0")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}
}

@ -9,7 +9,6 @@ import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.model.vo.TelegramSettingVo;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException;
import java.net.InetSocketAddress;
@ -19,7 +18,6 @@ import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Authenticator;
import okhttp3.Call;
@ -32,12 +30,12 @@ import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@SuppressWarnings({"rawtypes", "unchecked", "deprecation", "ResultOfMethodCallIgnored"})
@SuppressWarnings({"rawtypes", "unchecked", "deprecation"})
public class SenderTelegramMsg extends SenderBaseMsg {
static final String TAG = "SenderTelegramMsg";
public static void sendMsg(final long logId, final Handler handError, TelegramSettingVo telegramSettingVo, final String from, final String text, final String method) throws Exception {
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, TelegramSettingVo telegramSettingVo, final String from, final String text, final String method) throws Exception {
Log.i(TAG, "sendMsg telegramSettingVo:" + telegramSettingVo.toString() + " text:" + text);
String apiToken = telegramSettingVo.getApiToken();
@ -64,106 +62,90 @@ public class SenderTelegramMsg extends SenderBaseMsg {
final String proxyUsername = telegramSettingVo.getProxyUsername();
final String proxyPassword = telegramSettingVo.getProxyPassword();
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
try {
Proxy proxy = null;
Authenticator proxyAuthenticator = null;
if ((proxyType == Proxy.Type.HTTP || proxyType == Proxy.Type.SOCKS) && !TextUtils.isEmpty(proxyHost) && !TextUtils.isEmpty(proxyPort)) {
proxy = new Proxy(proxyType, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort)));
if (needProxyAuthenticator && (!TextUtils.isEmpty(proxyUsername) || !TextUtils.isEmpty(proxyPassword))) {
proxyAuthenticator = (route, response) -> {
String credential = Credentials.basic("jesse", "password1");
return response.request().newBuilder()
.header("Authorization", credential)
.build();
};
}
}
OkHttpClient client;
if (proxy != null && proxyAuthenticator != null) {
client = new OkHttpClient().newBuilder().proxy(proxy).proxyAuthenticator(proxyAuthenticator)
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
} else if (proxy != null) {
client = new OkHttpClient().newBuilder().proxy(proxy)
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
} else {
client = new OkHttpClient().newBuilder()
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
}
final Request request;
if (method.equals("GET")) {
request = new Request.Builder()
.url(requestUrl + "?chat_id=" + chatId + "&text=" + finalText)
.build();
} else {
Map bodyMap = new HashMap();
bodyMap.put("chat_id", chatId);
bodyMap.put("text", finalText);
bodyMap.put("parse_mode", "HTML");
String requestMsg = JSON.toJSONString(bodyMap);
Log.i(TAG, "requestMsg:" + requestMsg);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
}
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"ok\":true")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, e.getMessage(), e);
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
try {
Proxy proxy = null;
Authenticator proxyAuthenticator = null;
if ((proxyType == Proxy.Type.HTTP || proxyType == Proxy.Type.SOCKS) && !TextUtils.isEmpty(proxyHost) && !TextUtils.isEmpty(proxyPort)) {
proxy = new Proxy(proxyType, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort)));
if (needProxyAuthenticator && (!TextUtils.isEmpty(proxyUsername) || !TextUtils.isEmpty(proxyPassword))) {
proxyAuthenticator = (route, response) -> {
String credential = Credentials.basic("jesse", "password1");
return response.request().newBuilder()
.header("Authorization", credential)
.build();
};
}
}
OkHttpClient client;
if (proxy != null && proxyAuthenticator != null) {
client = new OkHttpClient().newBuilder().proxy(proxy).proxyAuthenticator(proxyAuthenticator)
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
} else if (proxy != null) {
client = new OkHttpClient().newBuilder().proxy(proxy)
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
} else {
client = new OkHttpClient().newBuilder()
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
}
final Request request;
if (method.equals("GET")) {
request = new Request.Builder()
.url(requestUrl + "?chat_id=" + chatId + "&text=" + finalText)
.build();
} else {
Map bodyMap = new HashMap();
bodyMap.put("chat_id", chatId);
bodyMap.put("text", finalText);
bodyMap.put("parse_mode", "HTML");
String requestMsg = JSON.toJSONString(bodyMap);
Log.i(TAG, "requestMsg:" + requestMsg);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
request = new Request.Builder()
.url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody)
.build();
}
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"ok\":true")) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
}
});
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, e.getMessage(), e);
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
}
}

@ -8,18 +8,15 @@ import androidx.annotation.NonNull;
import com.idormy.sms.forwarder.utils.CertUtils;
import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call;
import okhttp3.Callback;
@ -30,12 +27,12 @@ import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@SuppressWarnings({"deprecation", "ResultOfMethodCallIgnored"})
@SuppressWarnings({"deprecation"})
public class SenderWebNotifyMsg extends SenderBaseMsg {
static final String TAG = "SenderWebNotifyMsg";
public static void sendMsg(final long logId, final Handler handError, String webServer, String webParams, String secret, String method, String from, String content) throws Exception {
public static void sendMsg(final long logId, final Handler handError, final ObservableEmitter<Object> emitter, String webServer, String webParams, String secret, String method, String from, String content) throws Exception {
Log.i(TAG, "sendMsg webServer:" + webServer + " webParams:" + webParams + " from:" + from + " content:" + content);
if (webServer == null || webServer.isEmpty()) {
@ -95,53 +92,35 @@ public class SenderWebNotifyMsg extends SenderBaseMsg {
request = new Request.Builder().url(webServer).method("POST", body).build();
}
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient().newBuilder()
//忽略https证书
.sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager())
.hostnameVerifier(CertUtils.getHostnameVerifier())
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//返回http状态200即为成功
if (200 == response.code()) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
SettingUtil.getRetryDelayTime(2),
SettingUtil.getRetryDelayTime(3),
SettingUtil.getRetryDelayTime(4),
SettingUtil.getRetryDelayTime(5)
), (Throwable e, Integer time) -> time)
.flatMap((Integer delay) -> {
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
}))
.subscribe(System.out::println);
}
OkHttpClient client = new OkHttpClient().newBuilder()
//忽略https证书
.sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager())
.hostnameVerifier(CertUtils.getHostnameVerifier())
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Toast(handError, TAG, "发送失败:" + e.getMessage());
if (emitter != null) emitter.onError(new Exception("RxJava 请求接口异常..."));
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
final String responseStr = Objects.requireNonNull(response.body()).string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//返回http状态200即为成功
if (200 == response.code()) {
LogUtil.updateLog(logId, 2, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
}
});
}
}
}

@ -21,12 +21,8 @@ public class Define {
public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_CURRENT = "tsms_msg_key_string_battery_level_current";
public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_ALARM = "tsms_msg_key_string_battery_level_alarm";
public static final String SP_MSG_KEY_STRING_BATTERY_LEVEL_MAX = "tsms_msg_key_string_battery_level_max";
public static final String SP_MSG_KEY_STRING_ENABLE_RETRY_DELAY = "tsms_msg_key_switch_retry_delay";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME1 = "tsms_msg_key_string_retry_delay_time1";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME2 = "tsms_msg_key_string_retry_delay_time2";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME3 = "tsms_msg_key_string_retry_delay_time3";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME4 = "tsms_msg_key_string_retry_delay_time4";
public static final String SP_MSG_KEY_STRING_RETRY_DELAY_TIME5 = "tsms_msg_key_string_retry_delay_time5";
public static final String SP_MSG_KEY_STRING_RETRY_TIMES = "tsms_msg_key_retry_times";
public static final String SP_MSG_KEY_STRING_DELAY_TIME = "tsms_msg_key_delay_time";
public static final String SP_MSG_KEY_STRING_ENABLE_SMSHUB_API = "tsms_msg_key_string_enable_smshub_api";
public static final String SP_MSG_KEY_STRING_SMSHUB_API_URL = "tsms_msg_key_string_smshub_api_url";
public static final String SP_MSG_KEY_STRING_ENABLE_HTTP_SERVER = "tsms_msg_key_string_enable_http_server";

@ -178,34 +178,6 @@ public class SettingUtil {
return !sp_setting.getBoolean("option_save_history_on", false);
}
//接口请求失败重试
private static String getRetryDelayTimeKey(int index) {
switch (index) {
case 1:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME1;
case 2:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME2;
case 3:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME3;
case 4:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME4;
case 5:
default:
return Define.SP_MSG_KEY_STRING_RETRY_DELAY_TIME5;
}
}
public static int getRetryDelayTime(int index) {
String key = getRetryDelayTimeKey(index);
return sp_setting.getInt(key, (int) Math.pow(2, (index - 1)));
}
public static void setRetryDelayTime(int index, int retry_delay_time) {
String key = getRetryDelayTimeKey(index);
Log.d(TAG, "retry_delay_time_" + index + " :" + retry_delay_time);
sp_setting.edit().putInt(key, retry_delay_time).apply();
}
public static String getPrevNoticeHash(String key) {
return sp_setting.getString(key, "");
}
@ -238,14 +210,6 @@ public class SettingUtil {
return sp_setting.getString(Define.SP_MSG_KEY_STRING_SMSHUB_API_URL, "http://xxx.com/send_api");
}
public static void switchRetryDelay(Boolean switchSmsTemplate) {
sp_setting.edit().putBoolean(Define.SP_MSG_KEY_STRING_ENABLE_RETRY_DELAY, switchSmsTemplate).apply();
}
public static boolean getSwitchRetryDelay() {
return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_RETRY_DELAY, false);
}
public static void switchCallType1(Boolean switchCallType) {
sp_setting.edit().putBoolean(Define.SP_MSG_KEY_STRING_ENABLE_CALL_TYPE_1, switchCallType).apply();
}
@ -270,6 +234,22 @@ public class SettingUtil {
return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_CALL_TYPE_3, true);
}
public static int getRetryTimes() {
return sp_setting.getInt(Define.SP_MSG_KEY_STRING_RETRY_TIMES, 0);
}
public static void setRetryTimes(int retry_times) {
sp_setting.edit().putInt(Define.SP_MSG_KEY_STRING_RETRY_TIMES, retry_times).apply();
}
public static int getDelayTime() {
return sp_setting.getInt(Define.SP_MSG_KEY_STRING_DELAY_TIME, 1);
}
public static void setDelayTime(int delay_time) {
sp_setting.edit().putInt(Define.SP_MSG_KEY_STRING_DELAY_TIME, delay_time).apply();
}
//获取当前版本名称
public static String getVersionName() {
// 获取PackageManager的实例

@ -657,95 +657,56 @@
tools:ignore="SmallSp" />
</LinearLayout>
<LinearLayout
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:layout_marginStart="20dp"
android:text="@string/retry"
android:textStyle="bold" />
<EditText
android:id="@+id/et_retry_delay_time1"
android:layout_width="30dp"
android:layout_height="36dp"
android:layout_marginStart="3dp"
android:autofillHints=""
android:digits="0123456789"
android:inputType="number"
android:maxLength="3"
android:maxLines="1"
android:text=""
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
<EditText
android:id="@+id/et_retry_delay_time2"
android:layout_width="30dp"
android:layout_height="36dp"
android:layout_marginStart="3dp"
android:autofillHints=""
android:digits="0123456789"
android:inputType="number"
android:maxLength="3"
android:maxLines="1"
android:text=""
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
<EditText
android:id="@+id/et_retry_delay_time3"
android:layout_width="30dp"
android:layout_height="36dp"
android:layout_marginStart="3dp"
android:autofillHints=""
android:digits="0123456789"
android:inputType="number"
android:maxLength="3"
android:maxLines="1"
android:text=""
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
<EditText
android:id="@+id/et_retry_delay_time4"
android:layout_width="30dp"
android:layout_height="36dp"
android:layout_marginStart="3dp"
android:autofillHints=""
android:digits="0123456789"
android:inputType="number"
android:maxLength="3"
android:maxLines="1"
android:text=""
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
<EditText
android:id="@+id/et_retry_delay_time5"
android:layout_width="30dp"
android:layout_height="36dp"
android:layout_marginStart="3dp"
android:autofillHints=""
android:digits="0123456789"
android:inputType="number"
android:maxLength="3"
android:maxLines="1"
android:text=""
android:textAlignment="center"
android:textSize="12sp"
tools:ignore="LabelFor" />
</LinearLayout>
<EditText
android:id="@+id/et_retry_times"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autofillHints=""
android:ems="2"
android:inputType="number"
android:maxLines="1"
android:text="@string/_0"
android:textAlignment="center"
tools:ignore="LabelFor" />
<Switch
android:id="@+id/switch_retry_delay"
android:layout_width="0dp"
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:textSize="16sp"
tools:ignore="UseSwitchCompatOrMaterialXml" />
android:text="@string/times"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:text="@string/interval"
android:textStyle="bold" />
<EditText
android:id="@+id/et_delay_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autofillHints=""
android:ems="2"
android:inputType="number"
android:maxLines="1"
android:text="@string/_1"
android:textAlignment="center"
tools:ignore="LabelFor" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/seconds"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout

@ -100,8 +100,6 @@
<string name="setpushplustitle">PushPlus Settings</string>
<string name="setgotifytitle">Gotify Settings</string>
<string name="test_phone_num">19999999999</string>
<string name="test_content">Test content @</string>
<string name="test_sms">【JD】code 387481, ihelp.jd.com</string>
<string name="test_group_name">Test Group Name</string>
<string name="failed_to_fwd">Failed to fwd</string>
<string name="invalid_name">Sender name cannot be blank</string>
@ -174,7 +172,7 @@
<string name="low_power_alarm_threshold">Low power alarm threshold</string>
<string name="low_power_alarm_threshold_tips">Value range: 0100. Left blank or 0 is disabled</string>
<string name="retry_interval">Retry interval (seconds)</string>
<string name="retry_interval_tips">Retry five times after it fails</string>
<string name="retry_interval_tips">Disabled when times = 0, the interval is incremented</string>
<string name="forward_sms">Forward sms</string>
<string name="forward_sms_tips">Main switch, requires permissions to read and sned SMS messages, especially verification SMS texts.</string>
<string name="forward_missed_calls">Forward calls log</string>
@ -302,6 +300,7 @@
<string name="feishu">FeiShu Bot</string>
<string name="pushplus">PushPlus</string>
<string name="gotify">Gotify</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
<string name="_3">3</string>
@ -329,4 +328,10 @@
<string name="keep_alive_tips">It is recommended to open each authorization or setting, do not disable the notification bar, to avoid the APP service being killed</string>
<string name="custom_settings">Custom settings</string>
<string name="custom_settings_tips">If the automatic acquisition fails, please fill in the remarks manually; after clearing, it will be automatically acquired again!</string>
<string name="times">times</string>
<string name="interval">Interval</string>
<string name="seconds">seconds</string>
<string name="retry">Retry</string>
<string name="test_sender_sms">[Test Channel] Congratulations, the sending channel test is successful, please continue to add forwarding rules!</string>
<string name="test_sim_info" tools:ignore="Typos">SIM1_TestOperator_18888888888</string>
</resources>

@ -100,8 +100,6 @@
<string name="setpushplustitle">设置PushPlus</string>
<string name="setgotifytitle">设置Gotify</string>
<string name="test_phone_num">19999999999</string>
<string name="test_content">测试内容(content)@</string>
<string name="test_sms">【京东】验证码为387481切勿将验证码告知他人请在页面中输入完成验证如有问题请点击 ihelp.jd.com 联系京东客服</string>
<string name="test_group_name">测试分组</string>
<string name="failed_to_fwd">发送失败:</string>
<string name="invalid_name">通道名称不能为空</string>
@ -173,8 +171,8 @@
<string name="carrier_mobile">运营商_手机号</string>
<string name="low_power_alarm_threshold">电量预警阈值(%)</string>
<string name="low_power_alarm_threshold_tips">取值范围01000禁用</string>
<string name="retry_interval">失败重试间隔(秒)</string>
<string name="retry_interval_tips">接口请求失败后将重试5</string>
<string name="retry_interval">请求接口失败重试</string>
<string name="retry_interval_tips">数=0时禁用间隔逐次递增</string>
<string name="forward_sms">转发短信广播</string>
<string name="forward_sms_tips">总开关,请授予读取短信、通知类短信、发送短信等权限</string>
<string name="forward_missed_calls">转发通话记录</string>
@ -301,6 +299,7 @@
<string name="feishu">飞书机器人</string>
<string name="pushplus">PushPlus</string>
<string name="gotify">Gotify</string>
<string name="_0">0</string>
<string name="_1">1</string>
<string name="_2">2</string>
<string name="_3">3</string>
@ -328,4 +327,10 @@
<string name="keep_alive_tips">建议开启每一项授权或设置不要禁用通知栏避免APP服务被杀</string>
<string name="custom_settings">个性设置</string>
<string name="custom_settings_tips">如果自动获取失败,请手动填写备注信息;清空后将再次自动获取!</string>
<string name="times"></string>
<string name="interval">间隔</string>
<string name="seconds"></string>
<string name="retry">重试</string>
<string name="test_sender_sms">【测试通道】恭喜您,该发送通道测试成功,请继续添加转发规则!</string>
<string name="test_sim_info" tools:ignore="Typos">SIM1_测试运营商_18888888888</string>
</resources>

Loading…
Cancel
Save