Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions code/code.ino
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ struct Config {
PushChannel pushChannels[MAX_PUSH_CHANNELS]; // 多推送通道
String webUser; // Web管理账号
String webPass; // Web管理密码
String numberBlackList; // 号码黑名单(换行符分隔)
};

// 默认Web管理账号密码
Expand Down Expand Up @@ -124,6 +125,7 @@ void saveConfig() {
preferences.putString("adminPhone", config.adminPhone);
preferences.putString("webUser", config.webUser);
preferences.putString("webPass", config.webPass);
preferences.putString("numBlkList", config.numberBlackList);

// 保存推送通道配置
for (int i = 0; i < MAX_PUSH_CHANNELS; i++) {
Expand Down Expand Up @@ -152,6 +154,7 @@ void loadConfig() {
config.adminPhone = preferences.getString("adminPhone", "");
config.webUser = preferences.getString("webUser", DEFAULT_WEB_USER);
config.webPass = preferences.getString("webPass", DEFAULT_WEB_PASS);
config.numberBlackList = preferences.getString("numBlkList", "");

// 加载推送通道配置
for (int i = 0; i < MAX_PUSH_CHANNELS; i++) {
Expand Down Expand Up @@ -327,6 +330,15 @@ const char* htmlPage = R"rawliteral(
</div>
</div>

<div class="section">
<div class="section-title">🚫 号码黑名单</div>
<div class="hint" style="margin-bottom:15px;">每行一个号码,来自黑名单号码的短信将被忽略。</div>
<div class="form-group">
<label>黑名单号码</label>
<textarea name="numberBlackList" rows="5">%NUMBER_BLACK_LIST%</textarea>
</div>
</div>

<button type="submit">💾 保存配置</button>
</form>
</div>
Expand Down Expand Up @@ -742,6 +754,7 @@ void handleRoot() {
html.replace("%SMTP_PASS%", config.smtpPass);
html.replace("%SMTP_SEND_TO%", config.smtpSendTo);
html.replace("%ADMIN_PHONE%", config.adminPhone);
html.replace("%NUMBER_BLACK_LIST%", config.numberBlackList);

// 生成推送通道HTML
String channelsHtml = "";
Expand Down Expand Up @@ -1530,6 +1543,7 @@ void handleSave() {
config.smtpPass = server.arg("smtpPass");
config.smtpSendTo = server.arg("smtpSendTo");
config.adminPhone = server.arg("adminPhone");
config.numberBlackList = server.arg("numberBlackList");

// 保存推送通道配置
for (int i = 0; i < MAX_PUSH_CHANNELS; i++) {
Expand Down Expand Up @@ -1720,6 +1734,34 @@ void resetModule() {
}


// 检查发送者是否在号码黑名单中
bool isInNumberBlackList(const char* sender) {
if (config.numberBlackList.length() == 0) return false;

String originalSender = String(sender);
bool has86 = originalSender.startsWith("+86");
String strippedSender = has86 ? originalSender.substring(3) : "";

int listLen = (int)config.numberBlackList.length();

int start = 0;
while (start <= listLen) {
int end = config.numberBlackList.indexOf('\n', start);
if (end == -1) end = listLen;

String line = config.numberBlackList.substring(start, end);
line.trim();

if (line.length() > 0 && (line.equals(originalSender) || (has86 && line.equals(strippedSender)))) {
return true;
}

start = end + 1;
}

return false;
}

// 检查发送者是否为管理员
bool isAdmin(const char* sender) {
if (config.adminPhone.length() == 0) return false;
Expand Down Expand Up @@ -2302,6 +2344,12 @@ void processSmsContent(const char* sender, const char* text, const char* timesta
Serial.println("内容: " + String(text));
Serial.println("====================");

// 检查是否在号码黑名单中
if (isInNumberBlackList(sender)) {
Serial.println("发送者在号码黑名单中,忽略该短信");
return;
}

// 检查是否为管理员命令
if (isAdmin(sender)) {
Serial.println("收到管理员短信,检查命令...");
Expand Down Expand Up @@ -2540,6 +2588,8 @@ void setup() {
Serial.println("网络已注册");
// ========== 模组初始化完成 ==========

// 扫描所有信道以连接信号最强的 AP,防止在 mesh 组网这类场景中连接到弱 AP
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
// 连接WiFi(支持隐藏SSID)
// 参数: ssid, password, channel(0=自动), bssid(nullptr=自动), connect(true=连接隐藏网络)
WiFi.begin(WIFI_SSID, WIFI_PASS, 0, nullptr, true);
Expand Down
Loading