接口请求失败后延时重试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();

@ -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,30 +49,29 @@ public class SenderBarkMsg {
} }
} }
final String requestUrl = barkServer;
Log.i(TAG, "requestUrl:" + requestUrl);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient(); OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder().url(barkServer).get().build(); final Request request = new Request.Builder().url(requestUrl).get().build();
Call call = client.newCall(request); Call call = client.newCall(request);
call.enqueue(new Callback() { call.enqueue(new Callback() {
@Override @Override
public void onFailure(Call call, final IOException e) { public void onFailure(Call call, final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.d(TAG, "onFailure" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送失败:" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
@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, "Code" + response.code() + responseStr); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"message\":\"success\"")) { if (responseStr.contains("\"message\":\"success\"")) {
@ -80,19 +79,23 @@ public class SenderBarkMsg {
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); 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);
}
} }
}); });
}).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);
} }
} }

@ -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,15 +83,20 @@ 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);
Log.i(TAG, "requestMsg:" + requestMsg);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient(); OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
textMsg);
final Request request = new Request.Builder() final Request request = new Request.Builder()
.url(token) .url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8") .addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody) .post(requestBody)
.build(); .build();
@ -100,23 +105,15 @@ public class SenderDingdingMsg {
@Override @Override
public void onFailure(Call call, final IOException e) { public void onFailure(Call call, final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.d(TAG, "onFailure" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
if (handError != null) {
android.os.Message msg = new android.os.Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送失败:" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
@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, "Code" + String.valueOf(response.code()) + responseStr); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) { if (responseStr.contains("\"errcode\":0")) {
@ -124,19 +121,22 @@ public class SenderDingdingMsg {
} 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;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送状态:" + responseStr);
msg.setData(bundle);
handError.sendMessage(msg);
Log.d(TAG, "Coxxyyde" + String.valueOf(response.code()) + 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,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,19 +54,24 @@ 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);
final String requestUrl = webhook;
Log.i(TAG, "requestUrl:" + requestUrl);
final String requestMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "requestMsg:" + requestMsg);
String textMsg = JSON.toJSONString(textMsgMap); Observable
Log.i(TAG, "textMsg:" + textMsg); .create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient(); OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
textMsg);
final Request request = new Request.Builder() final Request request = new Request.Builder()
.url(webhook) .url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8") .addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody) .post(requestBody)
.build(); .build();
@ -74,23 +80,15 @@ public class SenderFeishuMsg {
@Override @Override
public void onFailure(Call call, final IOException e) { public void onFailure(Call call, final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.d(TAG, "onFailure" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
if (handError != null) {
android.os.Message msg = new android.os.Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送失败:" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
@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, "Code" + String.valueOf(response.code()) + responseStr); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"StatusCode\":0")) { if (responseStr.contains("\"StatusCode\":0")) {
@ -98,19 +96,22 @@ public class SenderFeishuMsg {
} 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;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送状态:" + responseStr);
msg.setData(bundle);
handError.sendMessage(msg);
Log.d(TAG, "respone" + String.valueOf(response.code()) + 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,23 +1,29 @@
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);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
try { try {
//初始化框架 //初始化框架
//EmailKit.initialize(this); //EmailKit.initialize(this);
@ -41,29 +47,13 @@ public class SenderMailMsg {
@Override @Override
public void onSuccess() { public void onSuccess() {
LogUtil.updateLog(logId, 1, "发送成功"); LogUtil.updateLog(logId, 1, "发送成功");
Log.i(TAG, "发送成功"); Toast(handError, TAG, "发送成功");
if (handError != null) {
android.os.Message msg = new android.os.Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送成功");
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
@Override @Override
public void onFailure(String errMsg) { public void onFailure(String errMsg) {
LogUtil.updateLog(logId, 0, errMsg); LogUtil.updateLog(logId, 0, errMsg);
Log.i(TAG, "发送失败,错误:" + errMsg); Toast(handError, TAG, "发送失败,错误:" + errMsg);
if (handError != null) {
android.os.Message msg = new android.os.Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送失败,错误:" + errMsg);
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
}); });
@ -73,16 +63,21 @@ public class SenderMailMsg {
} catch (Exception e) { } catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, e.getMessage(), e); Log.e(TAG, e.getMessage(), e);
if (handError != null) { Toast(handError, TAG, "发送失败:" + e.getMessage());
android.os.Message msg = new android.os.Message(); emitter.onError(new RuntimeException("请求接口异常..."));
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
} }
}).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,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,14 +113,20 @@ 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);
Log.i(TAG, "requestMsg:" + requestMsg);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient(); OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), textMsg); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder() final Request request = new Request.Builder()
.url(sendUrl) .url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8") .addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody) .post(requestBody)
.build(); .build();
@ -127,21 +135,15 @@ public class SenderQyWxAppMsg {
@Override @Override
public void onFailure(Call call, final IOException e) { public void onFailure(Call call, final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.d(TAG, "onFailure" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
if (handError != null) { emitter.onError(new RuntimeException("请求接口异常..."));
android.os.Message msg = new android.os.Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送失败:" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
@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, "Code" + String.valueOf(response.code()) + " Response: " + responseStr); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) { if (responseStr.contains("\"errcode\":0")) {
@ -149,19 +151,22 @@ public class SenderQyWxAppMsg {
} 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;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送状态:" + responseStr);
msg.setData(bundle);
handError.sendMessage(msg);
Log.d(TAG, "Code" + String.valueOf(response.code()) + " Response: " + 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,20 +33,26 @@ 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);
final String requestMsg = JSON.toJSONString(textMsgMap);
Log.i(TAG, "requestMsg:" + requestMsg);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient(); OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), textMsg); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder() final Request request = new Request.Builder()
.url(webHook) .url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8") .addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody) .post(requestBody)
.build(); .build();
@ -54,22 +61,15 @@ public class SenderQyWxGroupRobotMsg {
@Override @Override
public void onFailure(Call call, final IOException e) { public void onFailure(Call call, final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.d(TAG, "onFailure" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
if (handError != null) {
android.os.Message msg = new android.os.Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送失败:" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
@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, "Code" + String.valueOf(response.code()) + responseStr); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"errcode\":0")) { if (responseStr.contains("\"errcode\":0")) {
@ -77,18 +77,22 @@ public class SenderQyWxGroupRobotMsg {
} 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;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送状态:" + responseStr);
msg.setData(bundle);
handError.sendMessage(msg);
Log.d(TAG, "Coxxyyde" + String.valueOf(response.code()) + 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,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,53 +19,48 @@ 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
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient().newBuilder().build(); OkHttpClient client = new OkHttpClient().newBuilder().build();
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM) MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("title", title) .addFormDataPart("title", title)
.addFormDataPart("desp", desp); .addFormDataPart("desp", requestMsg);
RequestBody body = builder.build(); RequestBody body = builder.build();
Request request = new Request.Builder().url(sendUrl).method("POST", body).build(); Request request = new Request.Builder().url(requestUrl).method("POST", body).build();
Call call = client.newCall(request); Call call = client.newCall(request);
call.enqueue(new Callback() { call.enqueue(new Callback() {
@Override @Override
public void onFailure(Call call, final IOException e) { public void onFailure(Call call, final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.d(TAG, "onFailure" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送失败:" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
@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, "Code" + response.code() + responseStr); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"code\":0")) { if (responseStr.contains("\"code\":0")) {
@ -71,19 +68,22 @@ public class SenderServerChanMsg {
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); 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);
}
} }
}); });
}).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);
} }
} }

@ -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,7 +21,12 @@ 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);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始发送短信...");
String res = SmsUtil.sendSms(subId, mobiles, text); String res = SmsUtil.sendSms(subId, mobiles, text);
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
@ -23,7 +34,23 @@ public class SenderSmsMsg {
LogUtil.updateLog(logId, 1, "发送成功"); LogUtil.updateLog(logId, 1, "发送成功");
} else { } else {
LogUtil.updateLog(logId, 0, res); 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,21 +36,26 @@ 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);
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient(); OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), bodyMsg); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
final Request request = new Request.Builder() final Request request = new Request.Builder()
.url(sendUrl) .url(requestUrl)
.addHeader("Content-Type", "application/json; charset=utf-8") .addHeader("Content-Type", "application/json; charset=utf-8")
.post(requestBody) .post(requestBody)
.build(); .build();
@ -59,23 +64,15 @@ public class SenderTelegramMsg {
@Override @Override
public void onFailure(Call call, final IOException e) { public void onFailure(Call call, final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.d(TAG, "onFailure" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
if (handError != null) {
Message msg = new Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送失败:" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
@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, "Code" + response.code() + responseStr); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//TODO:粗略解析是否发送成功 //TODO:粗略解析是否发送成功
if (responseStr.contains("\"ok\":true")) { if (responseStr.contains("\"ok\":true")) {
@ -83,19 +80,22 @@ public class SenderTelegramMsg {
} else { } else {
LogUtil.updateLog(logId, 0, responseStr); 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);
}
} }
}); });
}).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,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";
@ -89,6 +90,10 @@ public class SenderWebNotifyMsg {
request = new Request.Builder().url(webServer).method("POST", body).build(); request = new Request.Builder().url(webServer).method("POST", body).build();
} }
Observable
.create((ObservableEmitter<Object> emitter) -> {
Toast(handError, TAG, "开始请求接口...");
OkHttpClient client = new OkHttpClient().newBuilder() OkHttpClient client = new OkHttpClient().newBuilder()
//忽略https证书 //忽略https证书
.sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager()) .sslSocketFactory(CertUtils.getSSLSocketFactory(), CertUtils.getX509TrustManager())
@ -99,23 +104,15 @@ public class SenderWebNotifyMsg {
@Override @Override
public void onFailure(Call call, final IOException e) { public void onFailure(Call call, final IOException e) {
LogUtil.updateLog(logId, 0, e.getMessage()); LogUtil.updateLog(logId, 0, e.getMessage());
Log.d(TAG, "onFailure" + e.getMessage()); Toast(handError, TAG, "发送失败:" + e.getMessage());
emitter.onError(new RuntimeException("请求接口异常..."));
if (handError != null) {
android.os.Message msg = new android.os.Message();
msg.what = NOTIFY;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送失败:" + e.getMessage());
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
@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, "Code" + response.code() + " Response" + responseStr); Log.d(TAG, "Response" + response.code() + "" + responseStr);
Toast(handError, TAG, "发送状态:" + responseStr);
//返回http状态200即为成功 //返回http状态200即为成功
if (200 == response.code()) { if (200 == response.code()) {
@ -123,18 +120,22 @@ public class SenderWebNotifyMsg {
} 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;
Bundle bundle = new Bundle();
bundle.putString("DATA", "发送状态:" + responseStr);
msg.setData(bundle);
handError.sendMessage(msg);
}
} }
}); });
}).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);
} }

@ -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