diff --git a/README.md b/README.md index 43618cdc..1f9cf3b7 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,8 @@ Android手机监听短信并根据指定规则转发到其他手机:钉钉机 - [x] 转发到webhook(支持:单个web页面([向设置的url发送POST请求](doc/POST_WEB.md))) - [x] 转发到企业微信群机器人 - [x] 转发到企业微信应用消息 +- [x] 转发到ServerChan(Server酱·Turbo版) +- [x] 转发到Telegram机器人 - [x] 在线检测新版本、升级 - [x] 清理缓存 - [x] 兼容6.xx、7.xx、8.xx、9.xx、10.xx @@ -89,12 +91,14 @@ Android手机监听短信并根据指定规则转发到其他手机:钉钉机 | ![添加/编辑发送方邮箱](pic/sendersetemail.jpg "添加/编辑发送方邮箱") | ![添加/编辑发送方Bark](pic/sendersetbark.jpg "添加/编辑发送方Bark") | | 添加/编辑发送方网页通知 | 添加/编辑发送方企业微信群机器人 | | ![添加/编辑发送方网页通知](pic/sendersetwebnotify.jpg "添加/编辑发送方网页通知") | ![添加/编辑发送方企业微信群机器人](pic/sendersetqywechat.jpg "添加/编辑发送方企业微信群机器人") | +| 添加/编辑发送方Telegram机器人 | 添加/编辑发送方Server酱·Turbo版 | +| ![添加/编辑发送方Telegram机器人](pic/sendertelegram.jpg "添加/编辑发送方Telegram机器人") | ![添加/编辑发送方Server酱·Turbo版](pic/senderserverchan.jpg "添加/编辑发送方Server酱·Turbo版") | | 添加/编辑发送方企业微信应用 | 应用设置 | | ![添加/编辑发送方企业微信应用](pic/sendersetqywxapp.jpg "添加/编辑发送方企业微信应用") | ![应用设置](pic/setting.jpg "应用设置") | | 关于/在线升级 | 支持正则匹配规则 & 支持卡槽匹配规则 | | ![在线升级](pic/update.jpg "在线升级") | ![支持正则匹配规则 & 支持卡槽匹配规则](pic/regex.jpg "支持正则匹配规则 & 支持卡槽匹配规则") | -| 转发短信模板增加卡槽标识 | 添加/编辑发送方Server酱·Turbo版 | -| ![转发短信模板增加卡槽标识](pic/siminfo.jpg "转发短信模板增加卡槽标识") | ![添加/编辑发送方Server酱·Turbo版](pic/sendersetbark.jpg "添加/编辑发送方Server酱·Turbo版") | +| 转发短信模板增加卡槽标识 | | +| ![转发短信模板增加卡槽标识](pic/siminfo.jpg "转发短信模板增加卡槽标识") | | -------- @@ -117,6 +121,7 @@ Android手机监听短信并根据指定规则转发到其他手机:钉钉机 + [v1.5.2](app/release/SmsForwarder_release_20210311_1.5.2.apk) 支持标注卡槽号码(优先使用)、设备信息;自定义转发信息模版 + [v1.6.0](app/release/SmsForwarder_release_20210312_1.6.0.apk) 优化获取SIM信息(兼容高版本Android) & 自动填写设备备注 & 自动填充卡槽信息到SIM1备注/SIM2备注 & 支持卡槽匹配规则 & 支持正则匹配规则 + [v1.6.1](app/release/SmsForwarder_release_20210312_1.6.1.apk) 新增转发到Server酱·Turbo版 + + [v1.6.2](app/release/SmsForwarder_release_20210312_1.6.2.apk) 新增转发到Telegram机器人 -------- diff --git a/app/release/SmsForwarder_release_20210312_1.6.2.apk b/app/release/SmsForwarder_release_20210312_1.6.2.apk new file mode 100644 index 00000000..3673285b Binary files /dev/null and b/app/release/SmsForwarder_release_20210312_1.6.2.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 50b71be6..d276d06f 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -10,9 +10,9 @@ { "type": "SINGLE", "filters": [], - "versionCode": 17, - "versionName": "1.6.1", - "outputFile": "SmsForwarder_release_20210312_1.6.1.apk" + "versionCode": 18, + "versionName": "1.6.2", + "outputFile": "SmsForwarder_release_20210312_1.6.2.apk" } ] } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/FrontService.java b/app/src/main/java/com/idormy/sms/forwarder/FrontService.java index 772643ee..993b31f7 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/FrontService.java +++ b/app/src/main/java/com/idormy/sms/forwarder/FrontService.java @@ -30,7 +30,7 @@ public class FrontService extends Service { if (romType == OSUtils.ROM_TYPE.MIUI_ROM) { builder.setContentTitle("短信转发器"); } - builder.setContentText("根据规则转发到钉钉/微信/邮箱/bark/Server酱/webhook等"); + builder.setContentText("根据规则转发到钉钉/微信/邮箱/bark/Server酱/Telegram/webhook等"); Intent intent = new Intent(this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity (this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); diff --git a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java index b2e2b0ce..2ca78ae8 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java @@ -28,6 +28,7 @@ import com.idormy.sms.forwarder.model.vo.EmailSettingVo; import com.idormy.sms.forwarder.model.vo.QYWXAppSettingVo; import com.idormy.sms.forwarder.model.vo.QYWXGroupRobotSettingVo; import com.idormy.sms.forwarder.model.vo.ServerChanSettingVo; +import com.idormy.sms.forwarder.model.vo.TelegramSettingVo; import com.idormy.sms.forwarder.model.vo.WebNotifySettingVo; import com.idormy.sms.forwarder.sender.SenderBarkMsg; import com.idormy.sms.forwarder.sender.SenderDingdingMsg; @@ -35,6 +36,7 @@ import com.idormy.sms.forwarder.sender.SenderMailMsg; import com.idormy.sms.forwarder.sender.SenderQyWxAppMsg; import com.idormy.sms.forwarder.sender.SenderQyWxGroupRobotMsg; import com.idormy.sms.forwarder.sender.SenderServerChanMsg; +import com.idormy.sms.forwarder.sender.SenderTelegramMsg; import com.idormy.sms.forwarder.sender.SenderUtil; import com.idormy.sms.forwarder.sender.SenderWebNotifyMsg; import com.umeng.analytics.MobclickAgent; @@ -51,6 +53,7 @@ import static com.idormy.sms.forwarder.model.SenderModel.TYPE_EMAIL; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_APP; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_GROUP_ROBOT; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_SERVER_CHAN; +import static com.idormy.sms.forwarder.model.SenderModel.TYPE_TELEGRAM; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_WEB_NOTIFY; public class SenderActivity extends AppCompatActivity { @@ -127,6 +130,9 @@ public class SenderActivity extends AppCompatActivity { case TYPE_SERVER_CHAN: setServerChan(senderModel); break; + case TYPE_TELEGRAM: + setTelegram(senderModel); + break; default: Toast.makeText(SenderActivity.this, "异常的发送方类型,自动删除!", Toast.LENGTH_LONG).show(); if (senderModel != null) { @@ -208,6 +214,9 @@ public class SenderActivity extends AppCompatActivity { case TYPE_SERVER_CHAN: setServerChan(null); break; + case TYPE_TELEGRAM: + setTelegram(null); + break; default: Toast.makeText(SenderActivity.this, "暂不支持这种转发!", Toast.LENGTH_LONG).show(); break; @@ -947,6 +956,104 @@ public class SenderActivity extends AppCompatActivity { }); } + //Telegram机器人 + private void setTelegram(final SenderModel senderModel) { + TelegramSettingVo telegramSettingVo = null; + //try phrase json setting + if (senderModel != null) { + String jsonSettingStr = senderModel.getJsonSetting(); + if (jsonSettingStr != null) { + telegramSettingVo = JSON.parseObject(jsonSettingStr, TelegramSettingVo.class); + } + } + + final AlertDialog.Builder alertDialog71 = new AlertDialog.Builder(SenderActivity.this); + View view1 = View.inflate(SenderActivity.this, R.layout.alert_dialog_setview_telegram, null); + + final EditText editTextTelegramName = view1.findViewById(R.id.editTextTelegramName); + if (senderModel != null) editTextTelegramName.setText(senderModel.getName()); + final EditText editTextTelegramApiToken = view1.findViewById(R.id.editTextTelegramApiToken); + if (telegramSettingVo != null) + editTextTelegramApiToken.setText(telegramSettingVo.getApiToken()); + final EditText editTextTelegramChatId = view1.findViewById(R.id.editTextTelegramChatId); + if (telegramSettingVo != null) + editTextTelegramChatId.setText(telegramSettingVo.getChatId()); + + Button buttonTelegramOk = view1.findViewById(R.id.buttonTelegramOk); + Button buttonTelegramDel = view1.findViewById(R.id.buttonTelegramDel); + Button buttonTelegramTest = view1.findViewById(R.id.buttonTelegramTest); + alertDialog71 + .setTitle(R.string.settelegramtitle) + .setIcon(R.mipmap.telegram) + .setView(view1) + .create(); + final AlertDialog show = alertDialog71.show(); + + buttonTelegramOk.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + if (senderModel == null) { + SenderModel newSenderModel = new SenderModel(); + newSenderModel.setName(editTextTelegramName.getText().toString()); + newSenderModel.setType(TYPE_TELEGRAM); + newSenderModel.setStatus(STATUS_ON); + TelegramSettingVo telegramSettingVoNew = new TelegramSettingVo( + editTextTelegramApiToken.getText().toString(), + editTextTelegramChatId.getText().toString() + ); + newSenderModel.setJsonSetting(JSON.toJSONString(telegramSettingVoNew)); + SenderUtil.addSender(newSenderModel); + initSenders(); + adapter.add(senderModels); + } else { + senderModel.setName(editTextTelegramName.getText().toString()); + senderModel.setType(TYPE_TELEGRAM); + senderModel.setStatus(STATUS_ON); + TelegramSettingVo telegramSettingVoNew = new TelegramSettingVo( + editTextTelegramApiToken.getText().toString(), + editTextTelegramChatId.getText().toString() + ); + senderModel.setJsonSetting(JSON.toJSONString(telegramSettingVoNew)); + SenderUtil.updateSender(senderModel); + initSenders(); + adapter.update(senderModels); + } + + show.dismiss(); + + } + }); + buttonTelegramDel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (senderModel != null) { + SenderUtil.delSender(senderModel.getId()); + initSenders(); + adapter.del(senderModels); + } + show.dismiss(); + } + }); + buttonTelegramTest.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String apiToken = editTextTelegramApiToken.getText().toString(); + String chatId = editTextTelegramChatId.getText().toString(); + if (!apiToken.isEmpty() && !chatId.isEmpty()) { + try { + SenderTelegramMsg.sendMsg(handler, apiToken, chatId, "19999999999", "【京东】验证码为387481(切勿将验证码告知他人),请在页面中输入完成验证,如有问题请点击 ihelp.jd.com 联系京东客服"); + } catch (Exception e) { + Toast.makeText(SenderActivity.this, "发送失败:" + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); + } + } else { + Toast.makeText(SenderActivity.this, "机器人的ApiToken 和 被通知人的ChatId 都不能为空", Toast.LENGTH_LONG).show(); + } + } + }); + } + @Override protected void onDestroy() { Log.d(TAG, "onDestroy"); diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/SenderModel.java b/app/src/main/java/com/idormy/sms/forwarder/model/SenderModel.java index 6c9ba179..ce77aecb 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/SenderModel.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/SenderModel.java @@ -13,6 +13,7 @@ public class SenderModel { public static final int TYPE_QYWX_GROUP_ROBOT = 4; public static final int TYPE_QYWX_APP = 5; public static final int TYPE_SERVER_CHAN = 6; + public static final int TYPE_TELEGRAM = 7; private Long id; private String name; private int status; @@ -48,6 +49,8 @@ public class SenderModel { return R.mipmap.qywxapp; case (TYPE_SERVER_CHAN): return R.mipmap.serverchan; + case (TYPE_TELEGRAM): + return R.mipmap.telegram; default: return R.mipmap.sms; } @@ -109,6 +112,8 @@ public class SenderModel { return R.mipmap.qywxapp; case (TYPE_SERVER_CHAN): return R.mipmap.serverchan; + case (TYPE_TELEGRAM): + return R.mipmap.telegram; default: return R.mipmap.sms; diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/vo/ServerChanSettingVo.java b/app/src/main/java/com/idormy/sms/forwarder/model/vo/ServerChanSettingVo.java index c71b9b43..1f3475a0 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/vo/ServerChanSettingVo.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/vo/ServerChanSettingVo.java @@ -3,20 +3,20 @@ package com.idormy.sms.forwarder.model.vo; import java.io.Serializable; public class ServerChanSettingVo implements Serializable { - private String send_key; + private String sendKey; public ServerChanSettingVo() { } - public ServerChanSettingVo(String send_key) { - this.send_key = send_key; + public ServerChanSettingVo(String sendKey) { + this.sendKey = sendKey; } public String getSendKey() { - return send_key; + return sendKey; } - public void setSendKey(String send_key) { - this.send_key = send_key; + public void setSendKey(String sendKey) { + this.sendKey = sendKey; } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/vo/TelegramSettingVo.java b/app/src/main/java/com/idormy/sms/forwarder/model/vo/TelegramSettingVo.java new file mode 100644 index 00000000..e413fb77 --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/model/vo/TelegramSettingVo.java @@ -0,0 +1,32 @@ +package com.idormy.sms.forwarder.model.vo; + +import java.io.Serializable; + +public class TelegramSettingVo implements Serializable { + private String apiToken; + private String chatId; + + public TelegramSettingVo() { + } + + public TelegramSettingVo(String apiToken, String chatId) { + this.apiToken = apiToken; + this.chatId = chatId; + } + + public String getApiToken() { + return apiToken; + } + + public void setApiToken(String apiToken) { + this.apiToken = apiToken; + } + + public String getChatId() { + return chatId; + } + + public void setChatId(String chatId) { + this.chatId = chatId; + } +} diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java index 8d2fde3a..7c1625f7 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java +++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java @@ -15,6 +15,7 @@ import com.idormy.sms.forwarder.model.vo.QYWXAppSettingVo; import com.idormy.sms.forwarder.model.vo.QYWXGroupRobotSettingVo; import com.idormy.sms.forwarder.model.vo.ServerChanSettingVo; import com.idormy.sms.forwarder.model.vo.SmsVo; +import com.idormy.sms.forwarder.model.vo.TelegramSettingVo; import com.idormy.sms.forwarder.model.vo.WebNotifySettingVo; import com.idormy.sms.forwarder.utils.LogUtil; import com.idormy.sms.forwarder.utils.RuleUtil; @@ -27,6 +28,7 @@ import static com.idormy.sms.forwarder.model.SenderModel.TYPE_EMAIL; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_APP; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_QYWX_GROUP_ROBOT; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_SERVER_CHAN; +import static com.idormy.sms.forwarder.model.SenderModel.TYPE_TELEGRAM; import static com.idormy.sms.forwarder.model.SenderModel.TYPE_WEB_NOTIFY; public class SendUtil { @@ -200,6 +202,20 @@ public class SendUtil { } break; + case TYPE_TELEGRAM: + //try phrase json setting + if (senderModel.getJsonSetting() != null) { + TelegramSettingVo telegramSettingVo = JSON.parseObject(senderModel.getJsonSetting(), TelegramSettingVo.class); + if (telegramSettingVo != null) { + try { + SenderTelegramMsg.sendMsg(handError, telegramSettingVo.getApiToken(), telegramSettingVo.getChatId(), smsVo.getMobile(), smsVo.getSmsVoForSend()); + } catch (Exception e) { + Log.e(TAG, "senderSendMsg: SenderTelegramMsg error " + e.getMessage()); + } + } + } + break; + default: break; } diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java new file mode 100644 index 00000000..c5edfd31 --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java @@ -0,0 +1,92 @@ +package com.idormy.sms.forwarder.sender; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; + +import com.alibaba.fastjson.JSON; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +import static com.idormy.sms.forwarder.SenderActivity.NOTIFY; + +public class SenderTelegramMsg { + + static String TAG = "SenderTelegramMsg"; + + public static void sendMsg(final Handler handError, String apiToken, String chatId, String from, String text) throws Exception { + Log.i(TAG, "sendMsg apiToken:" + apiToken + " chatId:" + chatId + " text:" + text); + + if (apiToken == null || apiToken.isEmpty()) { + return; + } + + //特殊处理避免标题重复 + text = text.replaceFirst("^" + from + "(.*)", "").trim(); + + String sendUrl = "https://api.telegram.org/bot" + apiToken + "/sendMessage"; + Log.d(TAG, "sendUrl:" + sendUrl); + + Map bodyMap = new HashMap(); + bodyMap.put("chat_id", chatId); + bodyMap.put("text", text.trim()); + bodyMap.put("parse_mode", "HTML"); + String bodyMsg = JSON.toJSONString(bodyMap); + Log.d(TAG, "body:" + bodyMsg); + + OkHttpClient client = new OkHttpClient(); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), bodyMsg); + + final Request request = new Request.Builder() + .url(sendUrl) + .addHeader("Content-Type", "application/json; charset=utf-8") + .post(requestBody) + .build(); + Call call = client.newCall(request); + call.enqueue(new Callback() { + @Override + public void onFailure(Call call, final IOException e) { + Log.d(TAG, "onFailure:" + e.getMessage()); + + 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 + public void onResponse(Call call, Response response) throws IOException { + final String responseStr = response.body().string(); + Log.d(TAG, "Code:" + response.code() + 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); + } + + } + }); + } + +} diff --git a/app/src/main/res/layout/alert_dialog_setview_telegram.xml b/app/src/main/res/layout/alert_dialog_setview_telegram.xml new file mode 100644 index 00000000..ea1986e9 --- /dev/null +++ b/app/src/main/res/layout/alert_dialog_setview_telegram.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +