|
|
@ -1,148 +1,146 @@
|
|
|
|
package com.idormy.sms.forwarder.sender;
|
|
|
|
package com.idormy.sms.forwarder.sender;
|
|
|
|
|
|
|
|
|
|
|
|
import android.os.Handler;
|
|
|
|
import android.os.Handler;
|
|
|
|
import android.text.TextUtils;
|
|
|
|
import android.text.TextUtils;
|
|
|
|
import android.util.Base64;
|
|
|
|
import android.util.Base64;
|
|
|
|
import android.util.Log;
|
|
|
|
import android.util.Log;
|
|
|
|
|
|
|
|
|
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
|
|
|
|
|
|
|
|
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 com.idormy.sms.forwarder.utils.SettingUtil;
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.net.URLEncoder;
|
|
|
|
import java.net.URLEncoder;
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
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.Objects;
|
|
|
|
import java.util.Objects;
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
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.Observable;
|
|
|
|
import io.reactivex.rxjava3.core.ObservableEmitter;
|
|
|
|
import io.reactivex.rxjava3.core.ObservableEmitter;
|
|
|
|
import okhttp3.Call;
|
|
|
|
import okhttp3.Call;
|
|
|
|
import okhttp3.Callback;
|
|
|
|
import okhttp3.Callback;
|
|
|
|
import okhttp3.MediaType;
|
|
|
|
import okhttp3.MediaType;
|
|
|
|
import okhttp3.OkHttpClient;
|
|
|
|
import okhttp3.OkHttpClient;
|
|
|
|
import okhttp3.Request;
|
|
|
|
import okhttp3.Request;
|
|
|
|
import okhttp3.RequestBody;
|
|
|
|
import okhttp3.RequestBody;
|
|
|
|
import okhttp3.Response;
|
|
|
|
import okhttp3.Response;
|
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"})
|
|
|
|
@SuppressWarnings({"ResultOfMethodCallIgnored", "rawtypes", "unchecked", "deprecation"})
|
|
|
|
public class SenderDingdingMsg extends SenderBaseMsg {
|
|
|
|
public class SenderDingdingMsg extends SenderBaseMsg {
|
|
|
|
|
|
|
|
|
|
|
|
static final String TAG = "SenderDingdingMsg";
|
|
|
|
static final String TAG = "SenderDingdingMsg";
|
|
|
|
|
|
|
|
|
|
|
|
public static void sendMsg(final long logId, final Handler handError, String token, String secret, String atMobiles, Boolean atAll, String content) throws Exception {
|
|
|
|
public static void sendMsg(final long logId, final Handler handError, String token, String secret, String atMobiles, Boolean atAll, String content) throws Exception {
|
|
|
|
Log.i(TAG, "sendMsg token:" + token + " secret:" + secret + " atMobiles:" + atMobiles + " atAll:" + atAll + " content:" + content);
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
Mac mac = Mac.getInstance("HmacSHA256");
|
|
|
|
Mac mac = Mac.getInstance("HmacSHA256");
|
|
|
|
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
|
|
|
|
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
|
|
|
|
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
|
|
|
|
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.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 += "×tamp=" + timestamp + "&sign=" + sign;
|
|
|
|
token += "×tamp=" + timestamp + "&sign=" + sign;
|
|
|
|
Log.i(TAG, "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", content);
|
|
|
|
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();
|
|
|
|
if (atMobiles != null) {
|
|
|
|
if (atMobiles != null) {
|
|
|
|
String[] atMobilesArray = atMobiles.split(",");
|
|
|
|
String[] atMobilesArray = atMobiles.split(",");
|
|
|
|
List<String> atMobilesList = new ArrayList<>();
|
|
|
|
List<String> atMobilesList = new ArrayList<>();
|
|
|
|
for (String atMobile : atMobilesArray
|
|
|
|
for (String atMobile : atMobilesArray
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
if (TextUtils.isDigitsOnly(atMobile)) {
|
|
|
|
if (TextUtils.isDigitsOnly(atMobile)) {
|
|
|
|
atMobilesList.add(atMobile);
|
|
|
|
atMobilesList.add(atMobile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!atMobilesList.isEmpty()) {
|
|
|
|
if (!atMobilesList.isEmpty()) {
|
|
|
|
AtMap.put("atMobiles", atMobilesList);
|
|
|
|
AtMap.put("atMobiles", atMobilesList);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AtMap.put("isAtAll", false);
|
|
|
|
AtMap.put("isAtAll", false);
|
|
|
|
if (atAll != null) {
|
|
|
|
if (atAll != null) {
|
|
|
|
AtMap.put("isAtAll", atAll);
|
|
|
|
AtMap.put("isAtAll", atAll);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
textMsgMap.put("at", AtMap);
|
|
|
|
|
|
|
|
}
|
|
|
|
textMsgMap.put("at", AtMap);
|
|
|
|
|
|
|
|
}
|
|
|
|
final String requestUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + token;
|
|
|
|
|
|
|
|
Log.i(TAG, "requestUrl:" + requestUrl);
|
|
|
|
final String requestUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + token;
|
|
|
|
final String requestMsg = JSON.toJSONString(textMsgMap);
|
|
|
|
Log.i(TAG, "requestUrl:" + requestUrl);
|
|
|
|
Log.i(TAG, "requestMsg:" + requestMsg);
|
|
|
|
final String requestMsg = JSON.toJSONString(textMsgMap);
|
|
|
|
|
|
|
|
Log.i(TAG, "requestMsg:" + requestMsg);
|
|
|
|
Observable
|
|
|
|
|
|
|
|
.create((ObservableEmitter<Object> emitter) -> {
|
|
|
|
Observable
|
|
|
|
Toast(handError, TAG, "开始请求接口...");
|
|
|
|
.create((ObservableEmitter<Object> emitter) -> {
|
|
|
|
|
|
|
|
Toast(handError, TAG, "开始请求接口...");
|
|
|
|
OkHttpClient client = new OkHttpClient();
|
|
|
|
|
|
|
|
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
|
|
|
|
OkHttpClient client = new OkHttpClient();
|
|
|
|
|
|
|
|
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
|
|
|
|
final Request request = new Request.Builder()
|
|
|
|
|
|
|
|
.url(requestUrl)
|
|
|
|
final Request request = new Request.Builder()
|
|
|
|
.addHeader("Content-Type", "application/json; charset=utf-8")
|
|
|
|
.url(requestUrl)
|
|
|
|
.post(requestBody)
|
|
|
|
.addHeader("Content-Type", "application/json; charset=utf-8")
|
|
|
|
.build();
|
|
|
|
.post(requestBody)
|
|
|
|
Call call = client.newCall(request);
|
|
|
|
.build();
|
|
|
|
call.enqueue(new Callback() {
|
|
|
|
Call call = client.newCall(request);
|
|
|
|
@Override
|
|
|
|
call.enqueue(new Callback() {
|
|
|
|
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
|
|
|
|
@Override
|
|
|
|
LogUtil.updateLog(logId, 0, e.getMessage());
|
|
|
|
public void onFailure(@NonNull Call call, @NonNull final IOException e) {
|
|
|
|
Toast(handError, TAG, "发送失败:" + e.getMessage());
|
|
|
|
LogUtil.updateLog(logId, 0, e.getMessage());
|
|
|
|
emitter.onError(new RuntimeException("请求接口异常..."));
|
|
|
|
Toast(handError, TAG, "发送失败:" + e.getMessage());
|
|
|
|
}
|
|
|
|
emitter.onError(new RuntimeException("请求接口异常..."));
|
|
|
|
|
|
|
|
}
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
|
|
|
|
@Override
|
|
|
|
final String responseStr = Objects.requireNonNull(response.body()).string();
|
|
|
|
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
|
|
|
|
Log.d(TAG, "Response:" + response.code() + "," + responseStr);
|
|
|
|
final String responseStr = Objects.requireNonNull(response.body()).string();
|
|
|
|
Toast(handError, TAG, "发送状态:" + responseStr);
|
|
|
|
Log.d(TAG, "Response:" + response.code() + "," + responseStr);
|
|
|
|
|
|
|
|
Toast(handError, TAG, "发送状态:" + responseStr);
|
|
|
|
//TODO:粗略解析是否发送成功
|
|
|
|
|
|
|
|
if (responseStr.contains("\"errcode\":0")) {
|
|
|
|
//TODO:粗略解析是否发送成功
|
|
|
|
LogUtil.updateLog(logId, 1, responseStr);
|
|
|
|
if (responseStr.contains("\"errcode\":0")) {
|
|
|
|
} else {
|
|
|
|
LogUtil.updateLog(logId, 1, responseStr);
|
|
|
|
LogUtil.updateLog(logId, 0, responseStr);
|
|
|
|
} else {
|
|
|
|
}
|
|
|
|
LogUtil.updateLog(logId, 0, responseStr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
|
|
|
|
|
|
|
|
.zipWith(Observable.just(
|
|
|
|
}).retryWhen((Observable<Throwable> errorObservable) -> errorObservable
|
|
|
|
SettingUtil.getRetryDelayTime(1),
|
|
|
|
.zipWith(Observable.just(
|
|
|
|
SettingUtil.getRetryDelayTime(2),
|
|
|
|
SettingUtil.getRetryDelayTime(1),
|
|
|
|
SettingUtil.getRetryDelayTime(3),
|
|
|
|
SettingUtil.getRetryDelayTime(2),
|
|
|
|
SettingUtil.getRetryDelayTime(4),
|
|
|
|
SettingUtil.getRetryDelayTime(3),
|
|
|
|
SettingUtil.getRetryDelayTime(5)
|
|
|
|
SettingUtil.getRetryDelayTime(4),
|
|
|
|
), (Throwable e, Integer time) -> time)
|
|
|
|
SettingUtil.getRetryDelayTime(5)
|
|
|
|
.flatMap((Integer delay) -> {
|
|
|
|
), (Throwable e, Integer time) -> time)
|
|
|
|
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
|
|
|
|
.flatMap((Integer delay) -> {
|
|
|
|
return Observable.timer(delay, TimeUnit.SECONDS);
|
|
|
|
Toast(handError, TAG, "请求接口异常," + delay + "秒后重试");
|
|
|
|
}))
|
|
|
|
return Observable.timer(delay, TimeUnit.SECONDS);
|
|
|
|
.subscribe(System.out::println);
|
|
|
|
}))
|
|
|
|
}
|
|
|
|
.subscribe(System.out::println);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|