接口请求失败后延时重试5次(可配置间隔时间)

pull/67/head
pppscn 3 years ago
parent fe718e07ff
commit 99718c0b5e

@ -75,10 +75,11 @@ dependencies {
//使ProxyBuilder //使ProxyBuilder
//implementation 'com.linkedin.dexmaker:dexmaker-mockito:2.12.1' //implementation 'com.linkedin.dexmaker:dexmaker-mockito:2.12.1'
//SDK // SDK
implementation 'com.umeng.umsdk:common:9.3.8' implementation 'com.umeng.umsdk:common:9.4.4'//
implementation 'com.umeng.umsdk:asms:1.2.2' implementation 'com.umeng.umsdk:asms:1.4.1'//
implementation 'com.umeng.umsdk:abtest:1.0.0' implementation 'com.umeng.umsdk:apm:1.4.2' // SDKcrash
implementation 'com.umeng.umsdk:abtest:1.0.0'//使U-AppABTest
//XUpdate //XUpdate
implementation 'com.github.xuexiangjys:XUpdate:2.1.0' implementation 'com.github.xuexiangjys:XUpdate:2.1.0'
@ -93,4 +94,8 @@ dependencies {
//Lombok //Lombok
compileOnly 'org.projectlombok:lombok:1.18.20' compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20' annotationProcessor 'org.projectlombok:lombok:1.18.20'
//RxJava
implementation "io.reactivex.rxjava3:rxjava:3.1.1"
} }

@ -11,11 +11,11 @@ import android.widget.LinearLayout;
import android.widget.Switch; import android.widget.Switch;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.idormy.sms.forwarder.utils.KeepAliveUtils; import com.idormy.sms.forwarder.utils.KeepAliveUtils;
import com.idormy.sms.forwarder.utils.SettingUtil; import com.idormy.sms.forwarder.utils.SettingUtil;
import androidx.appcompat.app.AppCompatActivity;
public class SettingActivity extends AppCompatActivity { public class SettingActivity extends AppCompatActivity {
private String TAG = "SettingActivity"; private String TAG = "SettingActivity";
@ -41,6 +41,17 @@ public class SettingActivity extends AppCompatActivity {
EditText et_battery_level_alarm = (EditText) findViewById(R.id.et_battery_level_alarm); EditText et_battery_level_alarm = (EditText) findViewById(R.id.et_battery_level_alarm);
editBatteryLevelAlarm(et_battery_level_alarm); editBatteryLevelAlarm(et_battery_level_alarm);
EditText et_retry_delay_time1 = (EditText) findViewById(R.id.et_retry_delay_time1);
editRetryDelayTime(et_retry_delay_time1, 1);
EditText et_retry_delay_time2 = (EditText) findViewById(R.id.et_retry_delay_time2);
editRetryDelayTime(et_retry_delay_time2, 2);
EditText et_retry_delay_time3 = (EditText) findViewById(R.id.et_retry_delay_time3);
editRetryDelayTime(et_retry_delay_time3, 3);
EditText et_retry_delay_time4 = (EditText) findViewById(R.id.et_retry_delay_time4);
editRetryDelayTime(et_retry_delay_time4, 4);
EditText et_retry_delay_time5 = (EditText) findViewById(R.id.et_retry_delay_time5);
editRetryDelayTime(et_retry_delay_time5, 5);
Switch switch_sms_template = (Switch) findViewById(R.id.switch_sms_template); Switch switch_sms_template = (Switch) findViewById(R.id.switch_sms_template);
switchSmsTemplate(switch_sms_template); switchSmsTemplate(switch_sms_template);
@ -147,6 +158,27 @@ public class SettingActivity extends AppCompatActivity {
}); });
} }
//接口请求失败重试
private void editRetryDelayTime(final EditText et_retry_delay_time, final int index) {
et_retry_delay_time.setText(SettingUtil.getRetryDelayTime(index));
et_retry_delay_time.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
SettingUtil.setRetryDelayTime(index, Integer.parseInt(et_retry_delay_time.getText().toString()));
}
});
}
//设置转发时启用自定义模版 //设置转发时启用自定义模版
private void switchSmsTemplate(Switch switch_sms_template) { private void switchSmsTemplate(Switch switch_sms_template) {
boolean isOn = SettingUtil.getSwitchSmsTemplate(); boolean isOn = SettingUtil.getSwitchSmsTemplate();
@ -250,7 +282,7 @@ public class SettingActivity extends AppCompatActivity {
public void batterySetting(View view) { public void batterySetting(View view) {
if (KeepAliveUtils.isIgnoreBatteryOptimization(this)) { if (KeepAliveUtils.isIgnoreBatteryOptimization(this)) {
Toast.makeText(this,R.string.isIgnored,Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.isIgnored, Toast.LENGTH_SHORT).show();
} else { } else {
KeepAliveUtils.ignoreBatteryOptimization(this); KeepAliveUtils.ignoreBatteryOptimization(this);
} }

@ -1,26 +1,26 @@
package com.idormy.sms.forwarder.sender; package com.idormy.sms.forwarder.sender;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message;
import android.util.Log; import android.util.Log;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY; public class SenderBarkMsg extends SenderBaseMsg {
public class SenderBarkMsg {
static String TAG = "SenderBarkMsg"; static String TAG = "SenderBarkMsg";
@ -49,50 +49,53 @@ public class SenderBarkMsg {
} }
} }
OkHttpClient client = new OkHttpClient(); final String requestUrl = barkServer;
final Request request = new Request.Builder().url(barkServer).get().build(); Log.i(TAG, "requestUrl:" + requestUrl);
Call call = client.newCall(request);
call.enqueue(new Callback() { Observable
@Override .create((ObservableEmitter<Object> emitter) -> {
public void onFailure(Call call, final IOException e) { Toast(handError, TAG, "开始请求接口...");
LogUtil.updateLog(logId, 0, e.getMessage());
Log.d(TAG, "onFailure" + e.getMessage()); OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder().url(requestUrl).get().build();
if (handError != null) { Call call = client.newCall(request);
Message msg = new Message(); call.enqueue(new Callback() {
msg.what = NOTIFY; @Override
Bundle bundle = new Bundle(); public void onFailure(Call call, final IOException e) {
bundle.putString("DATA", "发送失败:" + e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
msg.setData(bundle); Toast(handError, TAG, "发送失败:" + e.getMessage());
handError.sendMessage(msg); emitter.onError(new RuntimeException("请求接口异常..."));
} }
} @Override
public void onResponse(Call call, Response response) throws IOException {
final String responseStr = response.body().string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"message\":\"success\"")) {
LogUtil.updateLog(logId, 1, 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);
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseStr = response.body().string();
Log.d(TAG, "Code" + response.code() + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"message\":\"success\"")) {
LogUtil.updateLog(logId, 1, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送状态:" + responseStr);
msg.setData(bundle);
handError.sendMessage(msg);
Log.d(TAG, "Response" + response.code() + responseStr);
}
}
});
} }
} }

@ -0,0 +1,23 @@
package com.idormy.sms.forwarder.sender;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class SenderBaseMsg {
public static void Toast(final Handler handError, final String Tag, String data) {
Log.i(Tag, data);
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", Tag + ":" + data);
msg.setData(bundle);
handError.sendMessage(msg);
}
}
}

@ -1,6 +1,5 @@
package com.idormy.sms.forwarder.sender; package com.idormy.sms.forwarder.sender;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Base64; import android.util.Base64;
@ -8,6 +7,7 @@ import android.util.Log;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
@ -15,10 +15,13 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.MediaType; import okhttp3.MediaType;
@ -27,20 +30,17 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY; public class SenderDingdingMsg extends SenderBaseMsg {
public class SenderDingdingMsg {
static String TAG = "SenderDingdingMsg"; static String TAG = "SenderDingdingMsg";
public static void sendMsg(final long logId, final Handler handError, String token, String secret, String atMobiles, Boolean atAll, String msg) throws Exception { public static void sendMsg(final long logId, final Handler handError, String token, String secret, String atMobiles, Boolean atAll, String content) throws Exception {
Log.i(TAG, "sendMsg token:" + token + " secret:" + secret + " atMobiles:" + atMobiles + " atAll:" + atAll + " msg:" + msg); Log.i(TAG, "sendMsg token:" + token + " secret:" + secret + " atMobiles:" + atMobiles + " atAll:" + atAll + " content:" + content);
if (token == null || token.isEmpty()) { if (token == null || token.isEmpty()) {
return; return;
} }
token = "https://oapi.dingtalk.com/robot/send?access_token=" + token;
if (secret != null && !secret.isEmpty()) { if (secret != null && !secret.isEmpty()) {
Long timestamp = System.currentTimeMillis(); Long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + secret; String stringToSign = timestamp + "\n" + secret;
@ -49,13 +49,13 @@ public class SenderDingdingMsg {
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
String sign = URLEncoder.encode(new String(Base64.encode(signData, Base64.NO_WRAP)), "UTF-8"); String sign = URLEncoder.encode(new String(Base64.encode(signData, Base64.NO_WRAP)), "UTF-8");
token += "&timestamp=" + timestamp + "&sign=" + sign; token += "&timestamp=" + timestamp + "&sign=" + sign;
Log.i(TAG, "webhook_token:" + token); Log.i(TAG, "token:" + token);
} }
Map textMsgMap = new HashMap(); Map textMsgMap = new HashMap();
textMsgMap.put("msgtype", "text"); textMsgMap.put("msgtype", "text");
Map textText = new HashMap(); Map textText = new HashMap();
textText.put("content", msg); textText.put("content", content);
textMsgMap.put("text", textText); textMsgMap.put("text", textText);
if (atMobiles != null || atAll != null) { if (atMobiles != null || atAll != null) {
Map AtMap = new HashMap(); Map AtMap = new HashMap();
@ -83,60 +83,60 @@ public class SenderDingdingMsg {
textMsgMap.put("at", AtMap); textMsgMap.put("at", AtMap);
} }
String textMsg = JSON.toJSONString(textMsgMap); final String requestUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + token;
Log.i(TAG, "textMsg:" + textMsg); Log.i(TAG, "requestUrl:" + requestUrl);
final String requestMsg = JSON.toJSONString(textMsgMap);
OkHttpClient client = new OkHttpClient(); Log.i(TAG, "requestMsg:" + requestMsg);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"),
textMsg); Observable
.create((ObservableEmitter<Object> emitter) -> {
final Request request = new Request.Builder() Toast(handError, TAG, "开始请求接口...");
.url(token)
.addHeader("Content-Type", "application/json; charset=utf-8") OkHttpClient client = new OkHttpClient();
.post(requestBody) RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
.build();
Call call = client.newCall(request); final Request request = new Request.Builder()
call.enqueue(new Callback() { .url(requestUrl)
@Override .addHeader("Content-Type", "application/json; charset=utf-8")
public void onFailure(Call call, final IOException e) { .post(requestBody)
LogUtil.updateLog(logId, 0, e.getMessage()); .build();
Log.d(TAG, "onFailure" + e.getMessage()); Call call = client.newCall(request);
call.enqueue(new Callback() {
if (handError != null) { @Override
android.os.Message msg = new android.os.Message(); public void onFailure(Call call, final IOException e) {
msg.what = NOTIFY; LogUtil.updateLog(logId, 0, e.getMessage());
Bundle bundle = new Bundle(); Toast(handError, TAG, "发送失败:" + e.getMessage());
bundle.putString("DATA", "发送失败:" + e.getMessage()); emitter.onError(new RuntimeException("请求接口异常..."));
msg.setData(bundle); }
handError.sendMessage(msg);
} @Override
public void onResponse(Call call, Response response) throws IOException {
} final String responseStr = response.body().string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(Call call, Response response) throws IOException {
final String responseStr = response.body().string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Code" + String.valueOf(response.code()) + responseStr); if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 1, responseStr);
//TODO:粗略解析是否发送成功 } else {
if (responseStr.contains("\"errcode\":0")) { LogUtil.updateLog(logId, 0, responseStr);
LogUtil.updateLog(logId, 1, responseStr); }
} else { }
LogUtil.updateLog(logId, 0, responseStr); });
}
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
if (handError != null) { .zipWith(Observable.just(
android.os.Message msg = new android.os.Message(); SettingUtil.getRetryDelayTime(1),
msg.what = NOTIFY; SettingUtil.getRetryDelayTime(2),
Bundle bundle = new Bundle(); SettingUtil.getRetryDelayTime(3),
bundle.putString("DATA", "发送状态:" + responseStr); SettingUtil.getRetryDelayTime(4),
msg.setData(bundle); SettingUtil.getRetryDelayTime(5)
handError.sendMessage(msg); ), (Throwable e, Integer time) -> time)
Log.d(TAG, "Coxxyyde" + String.valueOf(response.code()) + responseStr); .flatMap((Integer delay) -> {
} Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
} }))
}); .subscribe(System.out::println);
} }

@ -1,23 +1,24 @@
package com.idormy.sms.forwarder.sender; package com.idormy.sms.forwarder.sender;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.util.Base64; import android.util.Base64;
import android.util.Log; import android.util.Log;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.MediaType; import okhttp3.MediaType;
@ -26,12 +27,12 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
public class SenderFeishuMsg { public class SenderFeishuMsg extends SenderBaseMsg {
static String TAG = "SenderFeishuMsg"; static String TAG = "SenderFeishuMsg";
public static void sendMsg(final long logId, final Handler handError, String webhook, String secret, String msg) throws Exception { public static void sendMsg(final long logId, final Handler handError, String webhook, String secret, String content) throws Exception {
Log.i(TAG, "sendMsg webhook:" + webhook + " secret:" + secret + " msg:" + msg); Log.i(TAG, "sendMsg webhook:" + webhook + " secret:" + secret + " content:" + content);
if (webhook == null || webhook.isEmpty()) { if (webhook == null || webhook.isEmpty()) {
return; return;
@ -53,64 +54,64 @@ public class SenderFeishuMsg {
//组装报文 //组装报文
textMsgMap.put("msg_type", "text"); textMsgMap.put("msg_type", "text");
Map content = new HashMap(); Map contentMap = new HashMap();
content.put("text", msg); contentMap.put("text", content);
textMsgMap.put("content", content); textMsgMap.put("content", contentMap);
String textMsg = JSON.toJSONString(textMsgMap); final String requestUrl = webhook;
Log.i(TAG, "textMsg:" + textMsg); Log.i(TAG, "requestUrl:" + requestUrl);
final String requestMsg = JSON.toJSONString(textMsgMap);
OkHttpClient client = new OkHttpClient(); Log.i(TAG, "requestMsg:" + requestMsg);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"),
textMsg); Observable
.create((ObservableEmitter<Object> emitter) -> {
final Request request = new Request.Builder() Toast(handError, TAG, "开始请求接口...");
.url(webhook)
.addHeader("Content-Type", "application/json; charset=utf-8") OkHttpClient client = new OkHttpClient();
.post(requestBody) RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
.build();
Call call = client.newCall(request); final Request request = new Request.Builder()
call.enqueue(new Callback() { .url(requestUrl)
@Override .addHeader("Content-Type", "application/json; charset=utf-8")
public void onFailure(Call call, final IOException e) { .post(requestBody)
LogUtil.updateLog(logId, 0, e.getMessage()); .build();
Log.d(TAG, "onFailure" + e.getMessage()); Call call = client.newCall(request);
call.enqueue(new Callback() {
if (handError != null) { @Override
android.os.Message msg = new android.os.Message(); public void onFailure(Call call, final IOException e) {
msg.what = NOTIFY; LogUtil.updateLog(logId, 0, e.getMessage());
Bundle bundle = new Bundle(); Toast(handError, TAG, "发送失败:" + e.getMessage());
bundle.putString("DATA", "发送失败:" + e.getMessage()); emitter.onError(new RuntimeException("请求接口异常..."));
msg.setData(bundle); }
handError.sendMessage(msg);
} @Override
public void onResponse(Call call, Response response) throws IOException {
} final String responseStr = response.body().string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(Call call, Response response) throws IOException {
final String responseStr = response.body().string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Code" + String.valueOf(response.code()) + responseStr); if (responseStr.contains("\"StatusCode\":0")) {
LogUtil.updateLog(logId, 1, responseStr);
//TODO:粗略解析是否发送成功 } else {
if (responseStr.contains("\"StatusCode\":0")) { LogUtil.updateLog(logId, 0, responseStr);
LogUtil.updateLog(logId, 1, responseStr); }
} else { }
LogUtil.updateLog(logId, 0, responseStr); });
}
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
if (handError != null) { .zipWith(Observable.just(
android.os.Message msg = new android.os.Message(); SettingUtil.getRetryDelayTime(1),
msg.what = NOTIFY; SettingUtil.getRetryDelayTime(2),
Bundle bundle = new Bundle(); SettingUtil.getRetryDelayTime(3),
bundle.putString("DATA", "发送状态:" + responseStr); SettingUtil.getRetryDelayTime(4),
msg.setData(bundle); SettingUtil.getRetryDelayTime(5)
handError.sendMessage(msg); ), (Throwable e, Integer time) -> time)
Log.d(TAG, "respone" + String.valueOf(response.code()) + responseStr); .flatMap((Integer delay) -> {
} Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
} }))
}); .subscribe(System.out::println);
} }
} }

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

@ -1,5 +1,7 @@
package com.idormy.sms.forwarder.sender; package com.idormy.sms.forwarder.sender;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
@ -9,11 +11,15 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.idormy.sms.forwarder.MyApplication; import com.idormy.sms.forwarder.MyApplication;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.MediaType; import okhttp3.MediaType;
@ -22,9 +28,7 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY; public class SenderQyWxAppMsg extends SenderBaseMsg {
public class SenderQyWxAppMsg {
static String TAG = "SenderQyWxAppMsg"; static String TAG = "SenderQyWxAppMsg";
@ -99,8 +103,6 @@ public class SenderQyWxAppMsg {
//发送文本消息 //发送文本消息
public static void sendTextMsg(final long logId, final Handler handError, String agentID, String toUser, String content) { public static void sendTextMsg(final long logId, final Handler handError, String agentID, String toUser, String content) {
String sendUrl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + MyApplication.QyWxAccessToken;
Log.d(TAG, "sendUrl" + sendUrl);
Map textMsgMap = new HashMap(); Map textMsgMap = new HashMap();
textMsgMap.put("touser", toUser); textMsgMap.put("touser", toUser);
@ -111,57 +113,60 @@ public class SenderQyWxAppMsg {
textText.put("content", content); textText.put("content", content);
textMsgMap.put("text", textText); textMsgMap.put("text", textText);
String textMsg = JSON.toJSONString(textMsgMap); final String requestUrl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + MyApplication.QyWxAccessToken;
Log.d(TAG, "textMsg" + textMsg); Log.i(TAG, "requestUrl:" + requestUrl);
final String requestMsg = JSON.toJSONString(textMsgMap);
OkHttpClient client = new OkHttpClient(); Log.i(TAG, "requestMsg:" + requestMsg);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), textMsg);
Observable
final Request request = new Request.Builder() .create((ObservableEmitter<Object> emitter) -> {
.url(sendUrl) Toast(handError, TAG, "开始请求接口...");
.addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody) OkHttpClient client = new OkHttpClient();
.build(); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
Call call = client.newCall(request);
call.enqueue(new Callback() { final Request request = new Request.Builder()
@Override .url(requestUrl)
public void onFailure(Call call, final IOException e) { .addHeader("Content-Type", "application/json; charset=utf-8")
LogUtil.updateLog(logId, 0, e.getMessage()); .post(requestBody)
Log.d(TAG, "onFailure" + e.getMessage()); .build();
if (handError != null) { Call call = client.newCall(request);
android.os.Message msg = new android.os.Message(); call.enqueue(new Callback() {
msg.what = NOTIFY; @Override
Bundle bundle = new Bundle(); public void onFailure(Call call, final IOException e) {
bundle.putString("DATA", "发送失败:" + e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
msg.setData(bundle); Toast(handError, TAG, "发送失败:" + e.getMessage());
handError.sendMessage(msg); emitter.onError(new RuntimeException("请求接口异常..."));
} }
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseStr = response.body().string();
Log.d(TAG, "Code" + String.valueOf(response.code()) + " Response: " + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 1, responseStr);
} else {
LogUtil.updateLog(logId, 0, responseStr);
}
if (handError != null) {
android.os.Message msg = new android.os.Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送状态:" + responseStr);
msg.setData(bundle);
handError.sendMessage(msg);
Log.d(TAG, "Code" + String.valueOf(response.code()) + " Response: " + responseStr);
}
} @Override
}); public void onResponse(Call call, Response response) throws IOException {
final String responseStr = response.body().string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 1, 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);
} }
} }

@ -1,16 +1,19 @@
package com.idormy.sms.forwarder.sender; package com.idormy.sms.forwarder.sender;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.util.Log; import android.util.Log;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.MediaType; import okhttp3.MediaType;
@ -19,9 +22,7 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY; public class SenderQyWxGroupRobotMsg extends SenderBaseMsg {
public class SenderQyWxGroupRobotMsg {
static String TAG = "SenderQyWxGroupRobotMsg"; static String TAG = "SenderQyWxGroupRobotMsg";
@ -32,63 +33,66 @@ public class SenderQyWxGroupRobotMsg {
return; return;
} }
//String textMsg = "{ \"msgtype\": \"text\", \"text\": {\"content\": \"" + from + " : " + content + "\"}}";
Map textMsgMap = new HashMap(); Map textMsgMap = new HashMap();
textMsgMap.put("msgtype", "text"); textMsgMap.put("msgtype", "text");
Map textText = new HashMap(); Map textText = new HashMap();
textText.put("content", content); textText.put("content", content);
textMsgMap.put("text", textText); textMsgMap.put("text", textText);
String textMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "textMsg:" + textMsg); final String requestUrl = webHook;
Log.i(TAG, "requestUrl:" + requestUrl);
OkHttpClient client = new OkHttpClient(); final String requestMsg = JSON.toJSONString(textMsgMap);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), textMsg); Log.i(TAG, "requestMsg:" + requestMsg);
final Request request = new Request.Builder() Observable
.url(webHook) .create((ObservableEmitter<Object> emitter) -> {
.addHeader("Content-Type", "application/json; charset=utf-8") Toast(handError, TAG, "开始请求接口...");
.post(requestBody)
.build(); OkHttpClient client = new OkHttpClient();
Call call = client.newCall(request); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
call.enqueue(new Callback() {
@Override final Request request = new Request.Builder()
public void onFailure(Call call, final IOException e) { .url(requestUrl)
LogUtil.updateLog(logId, 0, e.getMessage()); .addHeader("Content-Type", "application/json; charset=utf-8")
Log.d(TAG, "onFailure" + e.getMessage()); .post(requestBody)
.build();
if (handError != null) { Call call = client.newCall(request);
android.os.Message msg = new android.os.Message(); call.enqueue(new Callback() {
msg.what = NOTIFY; @Override
Bundle bundle = new Bundle(); public void onFailure(Call call, final IOException e) {
bundle.putString("DATA", "发送失败:" + e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
msg.setData(bundle); Toast(handError, TAG, "发送失败:" + e.getMessage());
handError.sendMessage(msg); emitter.onError(new RuntimeException("请求接口异常..."));
} }
}
@Override
@Override public void onResponse(Call call, Response response) throws IOException {
public void onResponse(Call call, Response response) throws IOException { final String responseStr = response.body().string();
final String responseStr = response.body().string(); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Log.d(TAG, "Code" + String.valueOf(response.code()) + responseStr); Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) { if (responseStr.contains("\"errcode\":0")) {
LogUtil.updateLog(logId, 1, responseStr); LogUtil.updateLog(logId, 1, responseStr);
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); LogUtil.updateLog(logId, 0, responseStr);
} }
}
if (handError != null) { });
android.os.Message msg = new android.os.Message();
msg.what = NOTIFY; }).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
Bundle bundle = new Bundle(); .zipWith(Observable.just(
bundle.putString("DATA", "发送状态:" + responseStr); SettingUtil.getRetryDelayTime(1),
msg.setData(bundle); SettingUtil.getRetryDelayTime(2),
handError.sendMessage(msg); SettingUtil.getRetryDelayTime(3),
Log.d(TAG, "Coxxyyde" + String.valueOf(response.code()) + responseStr); 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);
} }
} }

@ -1,14 +1,16 @@
package com.idormy.sms.forwarder.sender; package com.idormy.sms.forwarder.sender;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message;
import android.util.Log; import android.util.Log;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.MultipartBody; import okhttp3.MultipartBody;
@ -17,73 +19,71 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY; public class SenderServerChanMsg extends SenderBaseMsg {
public class SenderServerChanMsg {
static String TAG = "SenderServerChanMsg"; static String TAG = "SenderServerChanMsg";
public static void sendMsg(final long logId, final Handler handError, String sendKey, String title, String desp) throws Exception { public static void sendMsg(final long logId, final Handler handError, final String sendKey, final String title, final String desp) throws Exception {
Log.i(TAG, "sendMsg sendKey:" + sendKey + " title:" + title + " desp:" + desp); Log.i(TAG, "sendMsg sendKey:" + sendKey + " title:" + title + " desp:" + desp);
if (sendKey == null || sendKey.isEmpty()) { if (sendKey == null || sendKey.isEmpty()) {
return; return;
} }
final String requestUrl = "https://sctapi.ftqq.com/" + sendKey + ".send";
Log.i(TAG, "requestUrl:" + requestUrl);
//特殊处理避免标题重复 //特殊处理避免标题重复
desp = desp.replaceFirst("^" + title + "(.*)", "").trim(); final String requestMsg = desp.replaceFirst("^" + title + "(.*)", "").trim();
Log.i(TAG, "requestMsg:" + requestMsg);
String sendUrl = "https://sctapi.ftqq.com/" + sendKey + ".send";
Observable
OkHttpClient client = new OkHttpClient().newBuilder().build(); .create((ObservableEmitter<Object> emitter) -> {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM) Toast(handError, TAG, "开始请求接口...");
.addFormDataPart("title", title)
.addFormDataPart("desp", desp); OkHttpClient client = new OkHttpClient().newBuilder().build();
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM)
RequestBody body = builder.build(); .addFormDataPart("title", title)
Request request = new Request.Builder().url(sendUrl).method("POST", body).build(); .addFormDataPart("desp", requestMsg);
Call call = client.newCall(request);
call.enqueue(new Callback() { RequestBody body = builder.build();
@Override Request request = new Request.Builder().url(requestUrl).method("POST", body).build();
public void onFailure(Call call, final IOException e) { Call call = client.newCall(request);
LogUtil.updateLog(logId, 0, e.getMessage()); call.enqueue(new Callback() {
Log.d(TAG, "onFailure" + e.getMessage()); @Override
public void onFailure(Call call, final IOException e) {
if (handError != null) { LogUtil.updateLog(logId, 0, e.getMessage());
Message msg = new Message(); Toast(handError, TAG, "发送失败:" + e.getMessage());
msg.what = NOTIFY; emitter.onError(new RuntimeException("请求接口异常..."));
Bundle bundle = new Bundle(); }
bundle.putString("DATA", "发送失败:" + e.getMessage());
msg.setData(bundle); @Override
handError.sendMessage(msg); public void onResponse(Call call, Response response) throws IOException {
} final String responseStr = response.body().string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
} Toast(handError, TAG, "发送状态:" + responseStr);
@Override //TODO:粗略解析是否发送成功
public void onResponse(Call call, Response response) throws IOException { if (responseStr.contains("\"code\":0")) {
final String responseStr = response.body().string(); LogUtil.updateLog(logId, 1, responseStr);
Log.d(TAG, "Code" + response.code() + responseStr); } else {
LogUtil.updateLog(logId, 0, responseStr);
//TODO:粗略解析是否发送成功 }
if (responseStr.contains("\"code\":0")) { }
LogUtil.updateLog(logId, 1, responseStr); });
} else {
LogUtil.updateLog(logId, 0, responseStr); }).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
} .zipWith(Observable.just(
SettingUtil.getRetryDelayTime(1),
if (handError != null) { SettingUtil.getRetryDelayTime(2),
Message msg = new Message(); SettingUtil.getRetryDelayTime(3),
msg.what = NOTIFY; SettingUtil.getRetryDelayTime(4),
Bundle bundle = new Bundle(); SettingUtil.getRetryDelayTime(5)
bundle.putString("DATA", "发送状态:" + responseStr); ), (Throwable e, Integer time) -> time)
msg.setData(bundle); .flatMap((Integer delay) -> {
handError.sendMessage(msg); Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
Log.d(TAG, "Response" + response.code() + responseStr); return Observable.timer(delay, TimeUnit.SECONDS);
} }))
.subscribe(System.out::println);
}
});
} }
} }

@ -4,10 +4,16 @@ import android.os.Handler;
import android.util.Log; import android.util.Log;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import com.idormy.sms.forwarder.utils.SimUtil; import com.idormy.sms.forwarder.utils.SimUtil;
import com.idormy.sms.forwarder.utils.SmsUtil; import com.idormy.sms.forwarder.utils.SmsUtil;
public class SenderSmsMsg { import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
public class SenderSmsMsg extends SenderBaseMsg {
static String TAG = "SenderSmsMsg"; static String TAG = "SenderSmsMsg";
@ -15,15 +21,36 @@ public class SenderSmsMsg {
Log.i(TAG, "sendMsg simSlot:" + simSlot + " mobiles:" + mobiles + " onlyNoNetwork:" + onlyNoNetwork + " from:" + from + " text:" + text); Log.i(TAG, "sendMsg simSlot:" + simSlot + " mobiles:" + mobiles + " onlyNoNetwork:" + onlyNoNetwork + " from:" + from + " text:" + text);
//TODOsimSlot转subId //TODOsimSlot转subId
int subId = SimUtil.getSubscriptionIdBySimId(simSlot); final int subId = SimUtil.getSubscriptionIdBySimId(simSlot);
String res = SmsUtil.sendSms(subId, mobiles, text);
Observable
//TODO:粗略解析是否发送成功 .create((ObservableEmitter<Object> emitter) -> {
if (res == null) { Toast(handError, TAG, "开始发送短信...");
LogUtil.updateLog(logId, 1, "发送成功");
} else { String res = SmsUtil.sendSms(subId, mobiles, text);
LogUtil.updateLog(logId, 0, res);
} //TODO:粗略解析是否发送成功
if (res == null) {
LogUtil.updateLog(logId, 1, "发送成功");
} else {
LogUtil.updateLog(logId, 0, res);
Toast(handError, TAG, "短信发送失败");
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);
} }
} }

@ -1,17 +1,19 @@
package com.idormy.sms.forwarder.sender; package com.idormy.sms.forwarder.sender;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message;
import android.util.Log; import android.util.Log;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.MediaType; import okhttp3.MediaType;
@ -20,9 +22,7 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY; public class SenderTelegramMsg extends SenderBaseMsg {
public class SenderTelegramMsg {
static String TAG = "SenderTelegramMsg"; static String TAG = "SenderTelegramMsg";
@ -36,66 +36,66 @@ public class SenderTelegramMsg {
//特殊处理避免标题重复 //特殊处理避免标题重复
text = text.replaceFirst("^" + from + "(.*)", "").replaceAll("#", "井").trim(); text = text.replaceFirst("^" + from + "(.*)", "").replaceAll("#", "井").trim();
String sendUrl = "https://api.telegram.org/bot" + apiToken + "/sendMessage"; final String requestUrl = "https://api.telegram.org/bot" + apiToken + "/sendMessage";
Log.d(TAG, "sendUrl" + sendUrl); Log.i(TAG, "requestUrl:" + requestUrl);
Map bodyMap = new HashMap(); Map bodyMap = new HashMap();
bodyMap.put("chat_id", chatId); bodyMap.put("chat_id", chatId);
bodyMap.put("text", text); bodyMap.put("text", text);
bodyMap.put("parse_mode", "HTML"); bodyMap.put("parse_mode", "HTML");
String bodyMsg = JSON.toJSONString(bodyMap);
Log.d(TAG, "body" + bodyMsg); final String requestMsg = JSON.toJSONString(bodyMap);
Log.i(TAG, "requestMsg:" + requestMsg);
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), bodyMsg); Observable
.create((ObservableEmitter<Object> emitter) -> {
final Request request = new Request.Builder() Toast(handError, TAG, "开始请求接口...");
.url(sendUrl)
.addHeader("Content-Type", "application/json; charset=utf-8") OkHttpClient client = new OkHttpClient();
.post(requestBody) RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
.build();
Call call = client.newCall(request); final Request request = new Request.Builder()
call.enqueue(new Callback() { .url(requestUrl)
@Override .addHeader("Content-Type", "application/json; charset=utf-8")
public void onFailure(Call call, final IOException e) { .post(requestBody)
LogUtil.updateLog(logId, 0, e.getMessage()); .build();
Log.d(TAG, "onFailure" + e.getMessage()); Call call = client.newCall(request);
call.enqueue(new Callback() {
if (handError != null) { @Override
Message msg = new Message(); public void onFailure(Call call, final IOException e) {
msg.what = NOTIFY; LogUtil.updateLog(logId, 0, e.getMessage());
Bundle bundle = new Bundle(); Toast(handError, TAG, "发送失败:" + e.getMessage());
bundle.putString("DATA", "发送失败:" + e.getMessage()); emitter.onError(new RuntimeException("请求接口异常..."));
msg.setData(bundle); }
handError.sendMessage(msg);
} @Override
public void onResponse(Call call, Response response) throws IOException {
} final String responseStr = response.body().string();
Log.d(TAG, "Response" + response.code() + "" + responseStr);
@Override Toast(handError, TAG, "发送状态:" + responseStr);
public void onResponse(Call call, Response response) throws IOException {
final String responseStr = response.body().string(); //TODO:粗略解析是否发送成功
Log.d(TAG, "Code" + response.code() + responseStr); if (responseStr.contains("\"ok\":true")) {
LogUtil.updateLog(logId, 1, responseStr);
//TODO:粗略解析是否发送成功 } else {
if (responseStr.contains("\"ok\":true")) { LogUtil.updateLog(logId, 0, responseStr);
LogUtil.updateLog(logId, 1, responseStr); }
} else { }
LogUtil.updateLog(logId, 0, responseStr); });
}
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
if (handError != null) { .zipWith(Observable.just(
Message msg = new Message(); SettingUtil.getRetryDelayTime(1),
msg.what = NOTIFY; SettingUtil.getRetryDelayTime(2),
Bundle bundle = new Bundle(); SettingUtil.getRetryDelayTime(3),
bundle.putString("DATA", "发送状态:" + responseStr); SettingUtil.getRetryDelayTime(4),
msg.setData(bundle); SettingUtil.getRetryDelayTime(5)
handError.sendMessage(msg); ), (Throwable e, Integer time) -> time)
Log.d(TAG, "Response" + response.code() + responseStr); .flatMap((Integer delay) -> {
} Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
} }))
}); .subscribe(System.out::println);
} }
} }

@ -1,19 +1,22 @@
package com.idormy.sms.forwarder.sender; package com.idormy.sms.forwarder.sender;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.util.Base64; import android.util.Base64;
import android.util.Log; import android.util.Log;
import com.idormy.sms.forwarder.utils.CertUtils; import com.idormy.sms.forwarder.utils.CertUtils;
import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
import okhttp3.MediaType; import okhttp3.MediaType;
@ -23,9 +26,7 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import static com.idormy.sms.forwarder.SenderActivity.NOTIFY; public class SenderWebNotifyMsg extends SenderBaseMsg {
public class SenderWebNotifyMsg {
static String TAG = "SenderWebNotifyMsg"; static String TAG = "SenderWebNotifyMsg";
@ -58,17 +59,17 @@ public class SenderWebNotifyMsg {
Log.d(TAG, "method = GET, Url = " + webServer); Log.d(TAG, "method = GET, Url = " + webServer);
request = new Request.Builder().url(webServer).get().build(); request = new Request.Builder().url(webServer).get().build();
} else if (webParams != null && webParams.contains("[msg]")){ } else if (webParams != null && webParams.contains("[msg]")) {
String bodyMsg; String bodyMsg;
String Content_Type = "application/x-www-form-urlencoded"; String Content_Type = "application/x-www-form-urlencoded";
if (webParams.startsWith("{")){ if (webParams.startsWith("{")) {
bodyMsg = content.replace("\n","\\n"); bodyMsg = content.replace("\n", "\\n");
bodyMsg = webParams.replace("[msg]",bodyMsg); bodyMsg = webParams.replace("[msg]", bodyMsg);
Content_Type = "application/json;charset=utf-8"; Content_Type = "application/json;charset=utf-8";
}else{ } else {
bodyMsg = webParams.replace("[msg]",URLEncoder.encode(content, "UTF-8")); bodyMsg = webParams.replace("[msg]", URLEncoder.encode(content, "UTF-8"));
} }
RequestBody body = RequestBody.create(MediaType.parse(Content_Type), bodyMsg); RequestBody body = RequestBody.create(MediaType.parse(Content_Type), bodyMsg);
request = new Request.Builder() request = new Request.Builder()
.url(webServer) .url(webServer)
.addHeader("Content-Type", Content_Type) .addHeader("Content-Type", Content_Type)
@ -89,52 +90,52 @@ public class SenderWebNotifyMsg {
request = new Request.Builder().url(webServer).method("POST", body).build(); request = new Request.Builder().url(webServer).method("POST", body).build();
} }
OkHttpClient client = new OkHttpClient().newBuilder() Observable
//忽略https证书 .create((ObservableEmitter<Object> emitter) -> {
.sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager()) Toast(handError, TAG, "开始请求接口...");
.hostnameVerifier(CertUtils.getHostnameVerifier())
.build(); OkHttpClient client = new OkHttpClient().newBuilder()
Call call = client.newCall(request); //忽略https证书
call.enqueue(new Callback() { .sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager())
@Override .hostnameVerifier(CertUtils.getHostnameVerifier())
public void onFailure(Call call, final IOException e) { .build();
LogUtil.updateLog(logId, 0, e.getMessage()); Call call = client.newCall(request);
Log.d(TAG, "onFailure" + e.getMessage()); call.enqueue(new Callback() {
@Override
if (handError != null) { public void onFailure(Call call, final IOException e) {
android.os.Message msg = new android.os.Message(); LogUtil.updateLog(logId, 0, e.getMessage());
msg.what = NOTIFY; Toast(handError, TAG, "发送失败:" + e.getMessage());
Bundle bundle = new Bundle(); emitter.onError(new RuntimeException("请求接口异常..."));
bundle.putString("DATA", "发送失败:" + e.getMessage()); }
msg.setData(bundle);
handError.sendMessage(msg); @Override
} public void onResponse(Call call, Response response) throws IOException {
final String responseStr = response.body().string();
} Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
@Override
public void onResponse(Call call, Response response) throws IOException { //返回http状态200即为成功
final String responseStr = response.body().string(); if (200 == response.code()) {
Log.d(TAG, "Code" + response.code() + " Response" + responseStr); LogUtil.updateLog(logId, 1, responseStr);
} else {
//返回http状态200即为成功 LogUtil.updateLog(logId, 0, responseStr);
if (200 == response.code()) { }
LogUtil.updateLog(logId, 1, responseStr); }
} else { });
LogUtil.updateLog(logId, 0, responseStr);
} }).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
.zipWith(Observable.just(
if (handError != null) { SettingUtil.getRetryDelayTime(1),
android.os.Message msg = new android.os.Message(); SettingUtil.getRetryDelayTime(2),
msg.what = NOTIFY; SettingUtil.getRetryDelayTime(3),
Bundle bundle = new Bundle(); SettingUtil.getRetryDelayTime(4),
bundle.putString("DATA", "发送状态:" + responseStr); SettingUtil.getRetryDelayTime(5)
msg.setData(bundle); ), (Throwable e, Integer time) -> time)
handError.sendMessage(msg); .flatMap((Integer delay) -> {
} Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
return Observable.timer(delay, TimeUnit.SECONDS);
} }))
}); .subscribe(System.out::println);
} }

@ -94,7 +94,6 @@ public class FrontService extends Service {
int batteryLevel = getBatteryLevel(); int batteryLevel = getBatteryLevel();
System.out.println("当前剩余电量:" + batteryLevel + "%"); System.out.println("当前剩余电量:" + batteryLevel + "%");
int batteryLevelAlarm = Integer.parseInt(SettingUtil.getBatteryLevelAlarm()); int batteryLevelAlarm = Integer.parseInt(SettingUtil.getBatteryLevelAlarm());
System.out.println(alarmTimes[0]);
if (alarmTimes[0] <= 1 && batteryLevelAlarm > 0 && batteryLevelAlarm <= 100 && batteryLevel == batteryLevelAlarm) { if (alarmTimes[0] <= 1 && batteryLevelAlarm > 0 && batteryLevelAlarm <= 100 && batteryLevel == batteryLevelAlarm) {
Date date = new Date(); Date date = new Date();
String msg = "当前剩余电量:" + batteryLevel + "%,已经到达低电量预警阈值,请及时充电!"; String msg = "当前剩余电量:" + batteryLevel + "%,已经到达低电量预警阈值,请及时充电!";

@ -11,6 +11,11 @@ public class Define {
public static String SP_MSG_KEY_SWITCH_SMS_TEMPLATE = "tsms_msg_key_switch_sms_template"; public static String SP_MSG_KEY_SWITCH_SMS_TEMPLATE = "tsms_msg_key_switch_sms_template";
public static String SP_MSG_KEY_STRING_SMS_TEMPLATE = "tsms_msg_key_string_sms_template"; public static String SP_MSG_KEY_STRING_SMS_TEMPLATE = "tsms_msg_key_string_sms_template";
public static String SP_MSG_KEY_STRING_BATTERY_LEVEL_ALARM = "tsms_msg_key_string_battery_level_alarm"; public static String SP_MSG_KEY_STRING_BATTERY_LEVEL_ALARM = "tsms_msg_key_string_battery_level_alarm";
public static String SP_MSG_KEY_STRING_RETRY_DELAY_TIME1 = "tsms_msg_key_string_retry_delay_time1";
public static String SP_MSG_KEY_STRING_RETRY_DELAY_TIME2 = "tsms_msg_key_string_retry_delay_time2";
public static String SP_MSG_KEY_STRING_RETRY_DELAY_TIME3 = "tsms_msg_key_string_retry_delay_time3";
public static String SP_MSG_KEY_STRING_RETRY_DELAY_TIME4 = "tsms_msg_key_string_retry_delay_time4";
public static String SP_MSG_KEY_STRING_RETRY_DELAY_TIME5 = "tsms_msg_key_string_retry_delay_time5";
public static String SP_MSG = "forwarder_msg"; public static String SP_MSG = "forwarder_msg";
public static String SP_MSG_SET_KEY = "forwarder_msg_set_key"; public static String SP_MSG_SET_KEY = "forwarder_msg_set_key";

@ -114,4 +114,33 @@ public class SettingUtil {
public static boolean saveMsgHistory() { public static boolean saveMsgHistory() {
return sp_setting.getBoolean("option_save_history_on", false); 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();
}
} }

@ -31,6 +31,7 @@
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
android:ems="16" android:ems="16"
android:inputType="" android:inputType=""
android:maxLines="1"
android:text="" /> android:text="" />
</LinearLayout> </LinearLayout>
@ -70,6 +71,7 @@
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
android:ems="16" android:ems="16"
android:inputType="" android:inputType=""
android:maxLines="1"
android:text="" /> android:text="" />
</LinearLayout> </LinearLayout>
@ -109,6 +111,7 @@
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
android:ems="16" android:ems="16"
android:inputType="" android:inputType=""
android:maxLines="1"
android:text="" /> android:text="" />
</LinearLayout> </LinearLayout>
@ -130,7 +133,7 @@
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="低电量预警阈值" android:text="低电量预警阈值(%)"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <TextView
@ -153,6 +156,96 @@
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:background="@android:color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="15dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="每次重试间隔(秒)"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end"
android:text="接口请求失败后将重试5次"
android:textSize="9dp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/et_retry_delay_time1"
android:layout_width="42dp"
android:layout_height="48dp"
android:layout_marginLeft="5dp"
android:ems="16"
android:inputType="number"
android:maxLines="1"
android:textAlignment="center"
android:text="" />
<EditText
android:id="@+id/et_retry_delay_time2"
android:layout_width="42dp"
android:layout_height="48dp"
android:layout_marginLeft="5dp"
android:ems="16"
android:inputType="number"
android:maxLines="1"
android:textAlignment="center"
android:text="" />
<EditText
android:id="@+id/et_retry_delay_time3"
android:layout_width="42dp"
android:layout_height="48dp"
android:layout_marginLeft="5dp"
android:ems="16"
android:inputType="number"
android:maxLines="1"
android:textAlignment="center"
android:text="" />
<EditText
android:id="@+id/et_retry_delay_time4"
android:layout_width="42dp"
android:layout_height="48dp"
android:layout_marginLeft="5dp"
android:ems="16"
android:inputType="number"
android:maxLines="1"
android:textAlignment="center"
android:text="" />
<EditText
android:id="@+id/et_retry_delay_time5"
android:layout_width="42dp"
android:layout_height="48dp"
android:layout_marginLeft="5dp"
android:ems="16"
android:inputType="number"
android:maxLines="1"
android:textAlignment="center"
android:text="" />
</LinearLayout>
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

@ -47,7 +47,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ems="14" android:ems="14"
android:inputType="textPassword" android:inputType=""
android:text="" /> android:text="" />
</LinearLayout> </LinearLayout>

Loading…
Cancel
Save