diff --git a/README.md b/README.md index e1e5b8fa..a4b4a811 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # SmsForwarder (短信转发器) -[![GitHub release](https://img.shields.io/github/release/pppscn/SmsForwarder.svg)](https://github.com/pppscn/SmsForwarder/releases) [![GitHub stars](https://img.shields.io/github/stars/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/stargazers) [![GitHub forks](https://img.shields.io/github/forks/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/network/members) [![GitHub issues](https://img.shields.io/github/issues/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/issues) [![GitHub license](https://img.shields.io/github/license/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/blob/main/LICENSE) +[![GitHub release](https://img.shields.io/github/release/pppscn/SmsForwarder.svg)](https://github.com/pppscn/SmsForwarder/releases) [![GitHub stars](https://img.shields.io/github/stars/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/stargazers) [![GitHub forks](https://img.shields.io/github/forks/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/network/members) [![GitHub issues](https://img.shields.io/github/issues/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/issues) [![GitHub license](https://img.shields.io/github/license/pppscn/SmsForwarder)](https://github.com/pppscn/SmsForwarder/blob/main/LICENSE) 短信转发器——监控Android手机短信、来电、APP通知,并根据指定规则转发到其他手机:钉钉机器人、企业微信群机器人、飞书机器人、企业微信应用消息、邮箱、bark、webhook、Telegram机器人、Server酱、PushPlus、手机短信等。 @@ -82,6 +82,8 @@ - [x] 增加配置导出导入功能(一键克隆) - [x] 监听其他APP通知信息并转发 - [x] 转发到PushPlus +- [x] 转发规则上允许自定义模板(留空则取全局设置) +- [x] 转发规则上支持配置正则替换内容 -------- @@ -101,7 +103,6 @@ | 添加/编辑发送通道飞书机器人 | 增加配置导出导入功能(一键克隆) | 监听其他APP通知信息并转发 | 获取所有应用列表(方便复制APP包名)| | ![添加/编辑发送通道飞书](pic/senderfeishu.png "添加/编辑发送通道飞书") | ![增加配置导出导入功能(一键克隆)](pic/clone.png "增加配置导出导入功能(一键克隆)") | ![监听其他APP通知信息并转发](pic/app_notify.png "监听其他APP通知信息并转发") | ![获取所有应用列表(方便复制APP包名)](pic/app_list.png "获取所有应用列表(方便复制APP包名)") | - -------- ## 反馈与建议: diff --git a/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java b/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java index d79856e9..55e37667 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java @@ -227,6 +227,14 @@ public class RuleActivity extends AppCompatActivity { textSmsTemplate.setText(ruleModel.getSmsTemplate()); } + //正则替换 + @SuppressLint("UseSwitchCompatOrMaterialCode") Switch switchRegexReplace = view1.findViewById(R.id.switch_regex_replace); + EditText textRegexReplace = view1.findViewById(R.id.text_regex_replace); + if (ruleModel != null) { + switchRegexReplace.setChecked(ruleModel.getSwitchRegexReplace()); + textRegexReplace.setText(ruleModel.getRegexReplace()); + } + Button buttonRuleOk = view1.findViewById(R.id.buttonRuleOk); Button buttonRuleDel = view1.findViewById(R.id.buttonRuleDel); Button buttonRuleTest = view1.findViewById(R.id.buttonRuleTest); @@ -241,6 +249,15 @@ public class RuleActivity extends AppCompatActivity { Toast.makeText(RuleActivity.this, R.string.new_sender_first, Toast.LENGTH_LONG).show(); return; } + + //检查正则替换填写是否正确 + String regexReplace = textRegexReplace.getText().toString().trim(); + int lineNum = checkRegexReplace(regexReplace); + if (lineNum > 0) { + Toast.makeText(getBaseContext(), String.format(RuleActivity.this.getString(R.string.regex_check_tips), lineNum), Toast.LENGTH_SHORT).show(); + return; + } + int radioGroupRuleCheckId = Math.max(radioGroupRuleCheck.getCheckedRadioButtonId(), radioGroupRuleCheck2.getCheckedRadioButtonId()); Log.d(TAG, radioGroupRuleCheck.getCheckedRadioButtonId() + " " + radioGroupRuleCheck2.getCheckedRadioButtonId() + " " + radioGroupRuleCheckId); if (ruleModel == null) { @@ -252,6 +269,8 @@ public class RuleActivity extends AppCompatActivity { newRuleModel.setValue(editTextRuleValue.getText().toString().trim()); newRuleModel.setSwitchSmsTemplate(switchSmsTemplate.isChecked()); newRuleModel.setSmsTemplate(textSmsTemplate.getText().toString().trim()); + newRuleModel.setSwitchRegexReplace(switchRegexReplace.isChecked()); + newRuleModel.setRegexReplace(regexReplace); newRuleModel.setSenderId(Long.valueOf(senderId.toString())); RuleUtil.addRule(newRuleModel); initRules(); @@ -263,6 +282,8 @@ public class RuleActivity extends AppCompatActivity { ruleModel.setValue(editTextRuleValue.getText().toString().trim()); ruleModel.setSwitchSmsTemplate(switchSmsTemplate.isChecked()); ruleModel.setSmsTemplate(textSmsTemplate.getText().toString().trim()); + ruleModel.setSwitchRegexReplace(switchRegexReplace.isChecked()); + ruleModel.setRegexReplace(regexReplace); ruleModel.setSenderId(Long.valueOf(senderId.toString())); RuleUtil.updateRule(ruleModel); initRules(); @@ -288,6 +309,14 @@ public class RuleActivity extends AppCompatActivity { return; } + //检查正则替换填写是否正确 + String regexReplace = textRegexReplace.getText().toString().trim(); + int lineNum = checkRegexReplace(regexReplace); + if (lineNum > 0) { + Toast.makeText(getBaseContext(), String.format(RuleActivity.this.getString(R.string.regex_check_tips), lineNum), Toast.LENGTH_SHORT).show(); + return; + } + int radioGroupRuleCheckId = Math.max(radioGroupRuleCheck.getCheckedRadioButtonId(), radioGroupRuleCheck2.getCheckedRadioButtonId()); if (ruleModel == null) { RuleModel newRuleModel = new RuleModel(); @@ -296,6 +325,10 @@ public class RuleActivity extends AppCompatActivity { newRuleModel.setSimSlot(RuleModel.getRuleSimSlotFromCheckId(radioGroupSimSlot.getCheckedRadioButtonId())); newRuleModel.setValue(editTextRuleValue.getText().toString().trim()); newRuleModel.setSenderId(Long.valueOf(senderId.toString())); + newRuleModel.setSwitchSmsTemplate(switchSmsTemplate.isChecked()); + newRuleModel.setSmsTemplate(textSmsTemplate.getText().toString().trim()); + newRuleModel.setSwitchRegexReplace(switchRegexReplace.isChecked()); + newRuleModel.setRegexReplace(regexReplace); testRule(newRuleModel, Long.valueOf(senderId.toString())); } else { @@ -304,6 +337,10 @@ public class RuleActivity extends AppCompatActivity { ruleModel.setSimSlot(RuleModel.getRuleSimSlotFromCheckId(radioGroupSimSlot.getCheckedRadioButtonId())); ruleModel.setValue(editTextRuleValue.getText().toString().trim()); ruleModel.setSenderId(Long.valueOf(senderId.toString())); + ruleModel.setSwitchSmsTemplate(switchSmsTemplate.isChecked()); + ruleModel.setSmsTemplate(textSmsTemplate.getText().toString().trim()); + ruleModel.setSwitchRegexReplace(switchRegexReplace.isChecked()); + ruleModel.setRegexReplace(regexReplace); testRule(ruleModel, Long.valueOf(senderId.toString())); } @@ -370,6 +407,18 @@ public class RuleActivity extends AppCompatActivity { textSmsTemplate.append("{{设备名称}}"); }); + //正则替换 + final LinearLayout layout_regex_replace = view1.findViewById(R.id.layout_regex_replace); + if (ruleModel != null) { + layout_regex_replace.setVisibility(ruleModel.getSwitchRegexReplace() ? View.VISIBLE : View.GONE); + } + switchRegexReplace.setOnCheckedChangeListener((buttonView, isChecked) -> { + layout_regex_replace.setVisibility(isChecked ? View.VISIBLE : View.GONE); + if (!isChecked) { + textRegexReplace.setText(""); + } + }); + } //当更新选择的字段的时候,更新之下各个选项的状态 @@ -540,4 +589,17 @@ public class RuleActivity extends AppCompatActivity { MobclickAgent.onPause(this); } + private int checkRegexReplace(String regexReplace) { + if (regexReplace == null || regexReplace.isEmpty()) return 0; + + int lineNum = 1; + String[] lineArray = regexReplace.split("\\n"); + for (String line : lineArray) { + int position = line.indexOf("==="); + if (position < 1) return lineNum; + lineNum++; + } + + return 0; + } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java b/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java index d34096aa..875ec71d 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/RuleModel.java @@ -83,6 +83,8 @@ public class RuleModel { private String simSlot; private boolean switchSmsTemplate; private String smsTemplate; + private boolean switchRegexReplace; + private String regexReplace; public static String getRuleMatch(String filed, String check, String value, String simSlot) { String SimStr = SIM_SLOT_MAP.get(simSlot) + "卡 "; @@ -298,6 +300,10 @@ public class RuleModel { return switchSmsTemplate; } + public boolean getSwitchRegexReplace() { + return switchRegexReplace; + } + @NonNull @Override public String toString() { diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/RuleTable.java b/app/src/main/java/com/idormy/sms/forwarder/model/RuleTable.java index dd4aec7c..3173ab20 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/RuleTable.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/RuleTable.java @@ -20,5 +20,6 @@ public final class RuleTable { public static final String COLUMN_NAME_TIME = "time"; public static final String COLUMN_NAME_SIM_SLOT = "sim_slot"; public static final String COLUMN_SMS_TEMPLATE = "sms_template"; + public static final String COLUMN_REGEX_REPLACE = "regex_replace"; } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/vo/SmsVo.java b/app/src/main/java/com/idormy/sms/forwarder/model/vo/SmsVo.java index 9234a606..c785dfcf 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/vo/SmsVo.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/vo/SmsVo.java @@ -1,6 +1,7 @@ package com.idormy.sms.forwarder.model.vo; import android.annotation.SuppressLint; +import android.util.Log; import androidx.annotation.NonNull; @@ -30,22 +31,24 @@ public class SmsVo implements Serializable { } @SuppressLint("SimpleDateFormat") - public String getTitleForSend(String titleTemplate) { + public String getTitleForSend(String titleTemplate, String regexReplace) { if (titleTemplate == null || titleTemplate.isEmpty()) titleTemplate = "{{来源号码}}"; String deviceMark = SettingUtil.getAddExtraDeviceMark().trim(); String versionName = SettingUtil.getVersionName(); - return titleTemplate.replace("{{来源号码}}", mobile).replace("{{APP包名}}", mobile) + String titleForSend = titleTemplate.replace("{{来源号码}}", mobile).replace("{{APP包名}}", mobile) .replace("{{短信内容}}", content).replace("{{通知内容}}", content) .replace("{{卡槽信息}}", simInfo) .replace("{{接收时间}}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date)) .replace("{{设备名称}}", deviceMark) .replace("{{当前应用版本号}}", versionName) .trim(); + + return RegexReplace(regexReplace, titleForSend); } @SuppressLint("SimpleDateFormat") - public String getSmsVoForSend(String ruleSmsTemplate) { + public String getSmsVoForSend(String ruleSmsTemplate, String regexReplace) { String deviceMark = SettingUtil.getAddExtraDeviceMark().trim(); String customSmsTemplate = "{{来源号码}}\n{{短信内容}}\n{{卡槽信息}}\n{{接收时间}}\n{{设备名称}}"; @@ -61,13 +64,37 @@ public class SmsVo implements Serializable { } String versionName = SettingUtil.getVersionName(); - return customSmsTemplate.replace("{{来源号码}}", mobile).replace("{{APP包名}}", mobile) + String smsVoForSend = customSmsTemplate.replace("{{来源号码}}", mobile).replace("{{APP包名}}", mobile) .replace("{{短信内容}}", content).replace("{{通知内容}}", content) .replace("{{卡槽信息}}", simInfo) .replace("{{接收时间}}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date)) .replace("{{设备名称}}", deviceMark) .replace("{{当前应用版本号}}", versionName) .trim(); + + return RegexReplace(regexReplace, smsVoForSend); + } + + //正则替换内容 + private String RegexReplace(String regexReplace, String Content) { + if (regexReplace == null || regexReplace.isEmpty()) return Content; + + try { + String newContent = Content; + String[] lineArray = regexReplace.split("\\n"); + for (String line : lineArray) { + String[] lineSplit = line.split("==="); + if (lineSplit.length >= 1) { + String regex = lineSplit[0]; + String replacement = lineSplit.length >= 2 ? lineSplit[1] : ""; + newContent = newContent.replaceAll(regex, replacement); + } + } + return newContent; + } catch (Exception e) { + Log.e("RegexReplace", "获取接收手机号失败:" + e.getMessage()); + return Content; + } } @NonNull 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 985c029a..c79f654d 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 @@ -66,7 +66,8 @@ public class SendUtil { ) { long logId = LogUtil.addLog(new LogModel(type, smsVo.getMobile(), smsVo.getContent(), smsVo.getSimInfo(), ruleModel.getId())); String smsTemplate = ruleModel.getSwitchSmsTemplate() ? ruleModel.getSmsTemplate() : ""; - SendUtil.senderSendMsgNoHandError(smsVo, senderModel, logId, smsTemplate); + String regexReplace = ruleModel.getSwitchRegexReplace() ? ruleModel.getRegexReplace() : ""; + SendUtil.senderSendMsgNoHandError(smsVo, senderModel, logId, smsTemplate, regexReplace); } } } catch (Exception e) { @@ -97,17 +98,18 @@ public class SendUtil { throw new Exception("未找到发送通道"); } - for (SenderModel senderModel : senderModels - ) { - SendUtil.senderSendMsg(handError, smsVo, senderModel, 0, ""); + for (SenderModel senderModel : senderModels) { + String smsTemplate = ruleModel.getSwitchSmsTemplate() ? ruleModel.getSmsTemplate() : ""; + String regexReplace = ruleModel.getSwitchRegexReplace() ? ruleModel.getRegexReplace() : ""; + SendUtil.senderSendMsg(handError, smsVo, senderModel, 0, smsTemplate, regexReplace); } } - public static void senderSendMsgNoHandError(SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate) { - SendUtil.senderSendMsg(null, smsVo, senderModel, logId, smsTemplate); + public static void senderSendMsgNoHandError(SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate, String regexReplace) { + SendUtil.senderSendMsg(null, smsVo, senderModel, logId, smsTemplate, regexReplace); } - public static void senderSendMsg(Handler handError, SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate) { + public static void senderSendMsg(Handler handError, SmsVo smsVo, SenderModel senderModel, long logId, String smsTemplate, String regexReplace) { Log.i(TAG, "senderSendMsg smsVo:" + smsVo + "senderModel:" + senderModel); switch (senderModel.getType()) { @@ -117,7 +119,7 @@ public class SendUtil { DingDingSettingVo dingDingSettingVo = JSON.parseObject(senderModel.getJsonSetting(), DingDingSettingVo.class); if (dingDingSettingVo != null) { try { - SenderDingdingMsg.sendMsg(logId, handError, dingDingSettingVo.getToken(), dingDingSettingVo.getSecret(), dingDingSettingVo.getAtMobiles(), dingDingSettingVo.getAtAll(), smsVo.getSmsVoForSend(smsTemplate)); + SenderDingdingMsg.sendMsg(logId, handError, dingDingSettingVo.getToken(), dingDingSettingVo.getSecret(), dingDingSettingVo.getAtMobiles(), dingDingSettingVo.getAtAll(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: dingding error " + e.getMessage()); @@ -133,7 +135,7 @@ public class SendUtil { if (emailSettingVo != null) { try { SenderMailMsg.sendEmail(logId, handError, emailSettingVo.getProtocol(), emailSettingVo.getHost(), emailSettingVo.getPort(), emailSettingVo.getSsl(), emailSettingVo.getFromEmail(), emailSettingVo.getNickname(), - emailSettingVo.getPwd(), emailSettingVo.getToEmail(), smsVo.getTitleForSend(emailSettingVo.getTitle()), smsVo.getSmsVoForSend(smsTemplate)); + emailSettingVo.getPwd(), emailSettingVo.getToEmail(), smsVo.getTitleForSend(emailSettingVo.getTitle(), regexReplace), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: SenderMailMsg error " + e.getMessage()); @@ -148,7 +150,7 @@ public class SendUtil { BarkSettingVo barkSettingVo = JSON.parseObject(senderModel.getJsonSetting(), BarkSettingVo.class); if (barkSettingVo != null) { try { - SenderBarkMsg.sendMsg(logId, handError, barkSettingVo.getServer(), barkSettingVo.getIcon(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate), senderModel.getName()); + SenderBarkMsg.sendMsg(logId, handError, barkSettingVo.getServer(), barkSettingVo.getIcon(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), senderModel.getName()); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: SenderBarkMsg error " + e.getMessage()); @@ -163,7 +165,7 @@ public class SendUtil { WebNotifySettingVo webNotifySettingVo = JSON.parseObject(senderModel.getJsonSetting(), WebNotifySettingVo.class); if (webNotifySettingVo != null) { try { - SenderWebNotifyMsg.sendMsg(logId, handError, webNotifySettingVo.getWebServer(), webNotifySettingVo.getWebParams(), webNotifySettingVo.getSecret(), webNotifySettingVo.getMethod(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate)); + SenderWebNotifyMsg.sendMsg(logId, handError, webNotifySettingVo.getWebServer(), webNotifySettingVo.getWebParams(), webNotifySettingVo.getSecret(), webNotifySettingVo.getMethod(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: SenderWebNotifyMsg error " + e.getMessage()); @@ -178,7 +180,7 @@ public class SendUtil { QYWXGroupRobotSettingVo qywxGroupRobotSettingVo = JSON.parseObject(senderModel.getJsonSetting(), QYWXGroupRobotSettingVo.class); if (qywxGroupRobotSettingVo != null) { try { - SenderQyWxGroupRobotMsg.sendMsg(logId, handError, qywxGroupRobotSettingVo.getWebHook(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate)); + SenderQyWxGroupRobotMsg.sendMsg(logId, handError, qywxGroupRobotSettingVo.getWebHook(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: SenderQyWxGroupRobotMsg error " + e.getMessage()); @@ -193,7 +195,7 @@ public class SendUtil { QYWXAppSettingVo qYWXAppSettingVo = JSON.parseObject(senderModel.getJsonSetting(), QYWXAppSettingVo.class); if (qYWXAppSettingVo != null) { try { - SenderQyWxAppMsg.sendMsg(logId, handError, senderModel, qYWXAppSettingVo, smsVo.getSmsVoForSend(smsTemplate)); + SenderQyWxAppMsg.sendMsg(logId, handError, senderModel, qYWXAppSettingVo, smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: qywx_app error " + e.getMessage()); @@ -208,7 +210,7 @@ public class SendUtil { ServerChanSettingVo serverChanSettingVo = JSON.parseObject(senderModel.getJsonSetting(), ServerChanSettingVo.class); if (serverChanSettingVo != null) { try { - SenderServerChanMsg.sendMsg(logId, handError, serverChanSettingVo.getSendKey(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate)); + SenderServerChanMsg.sendMsg(logId, handError, serverChanSettingVo.getSendKey(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: SenderServerChanMsg error " + e.getMessage()); @@ -223,7 +225,7 @@ public class SendUtil { TelegramSettingVo telegramSettingVo = JSON.parseObject(senderModel.getJsonSetting(), TelegramSettingVo.class); if (telegramSettingVo != null) { try { - SenderTelegramMsg.sendMsg(logId, handError, telegramSettingVo.getApiToken(), telegramSettingVo.getChatId(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate)); + SenderTelegramMsg.sendMsg(logId, handError, telegramSettingVo.getApiToken(), telegramSettingVo.getChatId(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: SenderTelegramMsg error " + e.getMessage()); @@ -250,7 +252,7 @@ public class SendUtil { simSlot = Integer.parseInt(smsVo.getSimInfo().substring(3, 4)) - 1; Log.d(TAG, "simSlot = " + simSlot); } - SenderSmsMsg.sendMsg(logId, handError, simSlot, smsSettingVo.getMobiles(), smsSettingVo.getOnlyNoNetwork(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate)); + SenderSmsMsg.sendMsg(logId, handError, simSlot, smsSettingVo.getMobiles(), smsSettingVo.getOnlyNoNetwork(), smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: SenderSmsMsg error " + e.getMessage()); @@ -265,7 +267,7 @@ public class SendUtil { FeiShuSettingVo feiShuSettingVo = JSON.parseObject(senderModel.getJsonSetting(), FeiShuSettingVo.class); if (feiShuSettingVo != null) { try { - SenderFeishuMsg.sendMsg(logId, handError, feiShuSettingVo.getWebhook(), feiShuSettingVo.getSecret(), smsVo.getSmsVoForSend(smsTemplate)); + SenderFeishuMsg.sendMsg(logId, handError, feiShuSettingVo.getWebhook(), feiShuSettingVo.getSecret(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: feishu error " + e.getMessage()); @@ -280,7 +282,7 @@ public class SendUtil { PushPlusSettingVo pushPlusSettingVo = JSON.parseObject(senderModel.getJsonSetting(), PushPlusSettingVo.class); if (pushPlusSettingVo != null) { try { - SenderPushPlusMsg.sendMsg(logId, handError, pushPlusSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate)); + SenderPushPlusMsg.sendMsg(logId, handError, pushPlusSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace)); } catch (Exception e) { LogUtil.updateLog(logId, 0, e.getMessage()); Log.e(TAG, "senderSendMsg: feishu error " + e.getMessage()); diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/DbHelper.java b/app/src/main/java/com/idormy/sms/forwarder/utils/DbHelper.java index d11862a9..f92a55eb 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/DbHelper.java +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/DbHelper.java @@ -16,7 +16,7 @@ import java.util.List; public class DbHelper extends SQLiteOpenHelper { // If you change the database schema, you must increment the database version. public static final String TAG = "DbHelper"; - public static final int DATABASE_VERSION = 6; + public static final int DATABASE_VERSION = 7; public static final String DATABASE_NAME = "sms_forwarder.db"; private static final List SQL_CREATE_ENTRIES = @@ -104,6 +104,10 @@ public class DbHelper extends SQLiteOpenHelper { sql = "Alter table " + LogTable.LogEntry.TABLE_NAME + " add column " + RuleTable.RuleEntry.COLUMN_NAME_TYPE + " TEXT NOT NULL DEFAULT 'sms' "; db.execSQL(sql); } + if (oldVersion < 7) { //转发规则添加正则替换内容 + String sql = "Alter table " + RuleTable.RuleEntry.TABLE_NAME + " add column " + RuleTable.RuleEntry.COLUMN_REGEX_REPLACE + " TEXT NOT NULL DEFAULT '' "; + db.execSQL(sql); + } } public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleUtil.java b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleUtil.java index 4103082c..759d04dc 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleUtil.java +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleUtil.java @@ -45,6 +45,7 @@ public class RuleUtil { values.put(RuleTable.RuleEntry.COLUMN_NAME_SENDER_ID, ruleModel.getSenderId()); values.put(RuleTable.RuleEntry.COLUMN_NAME_SIM_SLOT, ruleModel.getSimSlot()); values.put(RuleTable.RuleEntry.COLUMN_SMS_TEMPLATE, ruleModel.getSmsTemplate()); + values.put(RuleTable.RuleEntry.COLUMN_REGEX_REPLACE, ruleModel.getRegexReplace()); // Insert the new row, returning the primary key value of the new row @@ -62,6 +63,7 @@ public class RuleUtil { values.put(RuleTable.RuleEntry.COLUMN_NAME_SENDER_ID, ruleModel.getSenderId()); values.put(RuleTable.RuleEntry.COLUMN_NAME_SIM_SLOT, ruleModel.getSimSlot()); values.put(RuleTable.RuleEntry.COLUMN_SMS_TEMPLATE, ruleModel.getSmsTemplate()); + values.put(RuleTable.RuleEntry.COLUMN_REGEX_REPLACE, ruleModel.getRegexReplace()); String selection = RuleTable.RuleEntry._ID + " = ? "; String[] whereArgs = {String.valueOf(ruleModel.getId())}; @@ -100,6 +102,7 @@ public class RuleUtil { RuleTable.RuleEntry.COLUMN_NAME_TIME, RuleTable.RuleEntry.COLUMN_NAME_SIM_SLOT, RuleTable.RuleEntry.COLUMN_SMS_TEMPLATE, + RuleTable.RuleEntry.COLUMN_REGEX_REPLACE, }; // Define 'where' part of query. String selection = " 1 = 1 "; @@ -163,6 +166,8 @@ public class RuleUtil { cursor.getColumnIndexOrThrow(RuleTable.RuleEntry.COLUMN_NAME_SIM_SLOT)); String smsTemplate = cursor.getString( cursor.getColumnIndexOrThrow(RuleTable.RuleEntry.COLUMN_SMS_TEMPLATE)); + String regexReplace = cursor.getString( + cursor.getColumnIndexOrThrow(RuleTable.RuleEntry.COLUMN_REGEX_REPLACE)); Log.d(TAG, "getRule: itemId" + itemId); RuleModel ruleModel = new RuleModel(); @@ -176,6 +181,8 @@ public class RuleUtil { ruleModel.setSimSlot(itemSimSlot); ruleModel.setSwitchSmsTemplate(!smsTemplate.trim().isEmpty()); ruleModel.setSmsTemplate(smsTemplate); + ruleModel.setSwitchRegexReplace(!regexReplace.trim().isEmpty()); + ruleModel.setRegexReplace(regexReplace); tRules.add(ruleModel); } diff --git a/app/src/main/res/layout/alert_dialog_setview_rule.xml b/app/src/main/res/layout/alert_dialog_setview_rule.xml index e77d4cd2..52f26cb3 100644 --- a/app/src/main/res/layout/alert_dialog_setview_rule.xml +++ b/app/src/main/res/layout/alert_dialog_setview_rule.xml @@ -275,24 +275,11 @@ android:orientation="vertical" android:visibility="gone"> - - - - - - + android:text="@string/enable_custom_templates_tips" + android:textSize="11sp" /> + + + + + + + + + + + + + + + + - - - - - - - + android:text="@string/enable_custom_templates_tips" + android:textSize="11sp" /> + + + + + + + + + + + + + + + + - - - - - - + android:text="@string/enable_custom_templates_tips" + android:textSize="11sp" /> + + + + + + + + + + + + + + + + App Secret Is at all Specified Member - + \@all Tip:Specify members receive messages, member ID list (multiple recipients with \'|\' space, maximum 1000) WebHook, e.g. https://qyapi.weixin.qq.com/cgixx?key=xxx ServerChan\'s SendKey @@ -171,6 +171,9 @@ Master switch, please grant notice first Enable custom templates Priority: custom template for forwarding rules >Global custom template >The default + Enable regular replacement content + Format: RegularExpression===ReplacementResult,One rule per line.\ne.g. (\\d{3})\\d+(\\d{4})===$1****$2 + Format check: line %d is badly formatted! Format: RegularExpression===ReplacementResult Exclude from recents After this function is enabled, manual killing of processes is effectively avoided, which helps to keep the process alive Custom templates diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a3c2b801..f2456ad9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -140,7 +140,7 @@ 应用Secret 是否@all 指定成员 - + \@all Tip:指定接收消息的成员,成员ID列表(多个接收者用‘|’分隔,最多支持1000个) 设置WebHook地址:示例:https://qyapi.weixin.qq.com/cgixx?key=xxx 设置Server酱·Turbo版的SendKey @@ -171,6 +171,9 @@ 总开关,请先授予通知使用权 启用自定义模版 优先级:转发规则的自定义模板 > 全局自定义模版 > 默认 + 启用正则替换内容 + 格式:正则表达式===替换结果,每行一个规则.\n例如:(\\d{3})\\d{4}(\\d{4})===$1****$2 + 正则替换检查:第 %d 行格式错误!格式:正则表达式===替换结果 不在最近任务列表中显示 开启后,有效避免手动误杀进程,利于保活 转发信息模版