商家自动化任务自动分析短信重要事情源码-东方仙盟 短信分析代码package com.fairyalliance.smartanswer; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.Telephony; import android.util.Log; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Locale; // 规则实体【修正增加level】 class SmsRuleItem { public String data_id; //规则id public ListString numberRegexList; public ListString bodyRegexList; /** 预警紧急等级 */ public int level; } // 短信输出记录实体 class SmsRecordItem { public String smsAddress; public String smsBody; public long smsDateTs; public int level; /** 预警紧急等级 */ public String rule_id; //规则id } /** * 独立静态短信规则短信读取工具模块 * 【注意】本类仅做纯数据处理不启动后台、不注册广播上层Activity/Service负责调用、权限申请、网络请求、后台保活 */ public final class CyberWinEnterpriseAutoSmsRuleHelper { private static final String TAG cwSmsRuleHelper; private static final Gson GSON new Gson(); // 全局静态变量内存中保存服务器下发全部规则 public static ListSmsRuleItem GLOBAL_SMS_RULES new ArrayList(); private CyberWinEnterpriseAutoSmsRuleHelper() { // 禁止实例化纯静态类 } /** * 函数1从服务器下载并加载规则到全局静态变量 GLOBAL_SMS_RULES * param jsonStr 服务器返回完整JSON字符串 * return true解析成功false解析失败 */ public static boolean loadRuleFromServer(String localHttpApi) { new Thread(() - { try { //规整本地标准时间 SimpleDateFormat dateFormat new SimpleDateFormat(yyyy-MM-dd HH:mm:ss, Locale.getDefault()); String nowTime dateFormat.format(System.currentTimeMillis()); //替换填写你本地电脑内网固定IP你搭建好的接口路径例http://192.168.1.105:8080/callnotify //原生GET请求携带来电号码时间两个参数推送到本地服务 URL url new URL(localHttpApi client_timenowTimemer_id77store_id72eco_typephonecall); HttpURLConnection conn (HttpURLConnection) url.openConnection(); conn.setRequestMethod(GET); conn.setConnectTimeout(3000); int code conn.getResponseCode(); writelog(本地推送,下载规则,时间nowTime返回状态码code); String responseBody ; InputStream is null; try { if(code 200 code 300){ is conn.getInputStream(); }else{ is conn.getErrorStream(); // 错误状态码拿错误流 } // 流转字符串 BufferedReader br new BufferedReader(new InputStreamReader(is,UTF-8)); StringBuilder sb new StringBuilder(); String line; while ((line br.readLine()) ! null) { sb.append(line); } responseBody sb.toString(); br.close(); writelog(本地推送,下载规则,时间nowTime返回数据responseBody); loadRuleFromServerJson(responseBody); conn.disconnect(); } catch (Exception e) { writelog(本地推送,失败,推送本地服务异常e.getMessage()); } }).start(); } /** * 函数1从服务器下载并加载规则到全局静态变量 GLOBAL_SMS_RULES * param jsonStr 服务器返回完整JSON字符串 * return true解析成功false解析失败 */ public static boolean loadRuleFromServerJson(String jsonStr) { if (jsonStr null || jsonStr.trim().isEmpty()) { Log.e(TAG, loadRuleFromServerJson: json为空); return false; } try { Type listType new TypeTokenListSmsRuleItem() {}.getType(); ListSmsRuleItem tempList GSON.fromJson(jsonStr, listType); if(tempList null){ return false; } // 赋值给全局静态变量 GLOBAL_SMS_RULES.clear(); GLOBAL_SMS_RULES.addAll(tempList); Log.i(TAG, 加载规则完成共 GLOBAL_SMS_RULES.size() 条规则); return true; } catch (Exception e) { Log.e(TAG, 解析规则JSON异常, e); return false; } } /** * 函数2读取短信按【时间区间最大读取条数】读取倒序最新短信优先 * * param context 上下文需要READ_SMS权限 * param maxReadCount 最多读取多少条例如300传0代表不限制条数 * param startTimeTs 开始时间戳(毫秒)传null不限制开始从现在往前读 * param endTimeTs 结束时间戳(毫秒)传null不限制结束 * return 原始读取到的短信列表未过滤原始全部短信 */ public static ListSmsRecordItem readSmsList(Context context, int maxReadCount, Long startTimeTs, Long endTimeTs) { ListSmsRecordItem result new ArrayList(); ContentResolver resolver context.getContentResolver(); Uri smsUri Telephony.Sms.CONTENT_URI; // 查询字段 String[] projection { Telephony.Sms.ADDRESS, Telephony.Sms.BODY, Telephony.Sms.DATE }; // where条件拼装时间过滤 StringBuilder whereSb new StringBuilder(); ListString whereArgsList new ArrayList(); if(startTimeTs ! null){ whereSb.append(Telephony.Sms.DATE).append( ? ); whereArgsList.add(String.valueOf(startTimeTs)); } if(endTimeTs ! null){ if(whereSb.length()0){ whereSb.append( AND ); } whereSb.append(Telephony.Sms.DATE).append( ? ); whereArgsList.add(String.valueOf(endTimeTs)); } String selection whereSb.length()0 ? whereSb.toString() : null; String[] selectionArgs whereArgsList.isEmpty() ? null : whereArgsList.toArray(new String[0]); // ORDER BY date DESC最新短信排在最前面 String sortOrder Telephony.Sms.DATE DESC; Cursor cursor null; try { cursor resolver.query(smsUri, projection, selection, selectionArgs, sortOrder); if(cursor null){ return result; } int idxAddr cursor.getColumnIndex(Telephony.Sms.ADDRESS); int idxBody cursor.getColumnIndex(Telephony.Sms.BODY); int idxDate cursor.getColumnIndex(Telephony.Sms.DATE); while (cursor.moveToNext()){ // 达到最大读取条数直接退出循环 if(maxReadCount 0 result.size() maxReadCount){ break; } SmsRecordItem item new SmsRecordItem(); item.smsAddress cursor.getString(idxAddr); item.smsBody cursor.getString(idxBody); item.smsDateTs cursor.getLong(idxDate); result.add(item); } } catch (Exception e) { Log.e(TAG,读取短信数据库异常,e); } finally { if(cursor ! null){ cursor.close(); } } return result; } /** * 附加工具方法使用【全局GLOBAL_SMS_RULES】对短信做正则匹配过滤 * 输入原始短信列表输出命中规则的短信 命中的规则等级 * param rawSmsList readSmsList返回原始短信 * return 命中结果对象你上层可拿level做预警 */ public static ListSmsMatchResult filterSmsByGlobalRule(ListSmsRecordItem rawSmsList){ ListSmsMatchResult out new ArrayList(); for(SmsRecordItem sms : rawSmsList){ for(SmsRuleItem rule : GLOBAL_SMS_RULES){ boolean matchNumber matchAnyRegex(sms.smsAddress, rule.numberRegexList); boolean matchBody matchAnyRegex(sms.smsBody, rule.bodyRegexList); // 这里逻辑号码正则命中 并且 内容正则命中才判定命中你可以改成OR按需修改 if(matchNumber matchBody){ SmsMatchResult mr new SmsMatchResult(); mr.sms sms; mr.ruleLevel rule.level; out.add(mr); break; //一条短信命中一条规则就跳出避免重复 } } } return out; } /** * 工具判断文本是否匹配列表中任意一条正则 */ private static boolean matchAnyRegex(String text, ListString regexList){ if(text null || regexList null || regexList.isEmpty()){ return false; } for(String reg : regexList){ try{ if(Pattern.compile(reg).matcher(text).find()){ return true; } }catch (Exception e){ Log.w(TAG,正则表达式错误reg,e); } } return false; } // 输出匹配结果实体携带短信命中规则等级 public static class SmsMatchResult{ public SmsRecordItem sms; public int ruleLevel; } }人人皆为创造者共创方能共成长每个人都是使用者也是创造者是数字世界的消费者更是价值的生产者与分享者。在智能时代的浪潮里单打独斗的发展模式早已落幕唯有开放连接、创意共创、利益共享才能让个体价值汇聚成生态合力让技术与创意双向奔赴实现平台与伙伴的快速成长、共赢致远。原创永久分成共赴星辰大海原创创意共创、永久收益分成是东方仙盟始终坚守的核心理念。我们坚信每一份原创智慧都值得被尊重与回馈以永久分成锚定共创初心让创意者长期享有价值红利携手万千伙伴向着科技星辰大海笃定前行拥抱硅基 生命与数字智能交融的未来共筑跨越时代的数字文明共同体。东方仙盟拥抱知识开源共筑数字新生态在全球化与数字化浪潮中东方仙盟始终秉持开放协作、知识共享的理念积极拥抱开源技术与开放标准。我们相信唯有打破技术壁垒、汇聚全球智慧才能真正推动行业的可持续发展。开源赋能中小商户通过将前端异常检测、跨系统数据互联等核心能力开源化东方仙盟为全球中小商户提供了低成本、高可靠的技术解决方案让更多商家能够平等享受数字转型的红利。共建行业标准我们积极参与国际技术社区与全球开发者、合作伙伴共同制定开放协议 与技术规范推动跨境零售、文旅、餐饮等多业态的系统互联互通构建更加公平、高效的数字生态。知识普惠共促发展通过开源社区 、技术文档与培训体系东方仙盟致力于将前沿技术转化为可落地的行业实践赋能全球合作伙伴共同培育创新人才推动数字经济 的普惠式增长阿雪技术观在科技发展浪潮中我们不妨积极投身技术共享。不满足于做受益者更要主动担当贡献者 。无论是分享代码、撰写技术博客还是参与开源项目 维护改进每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地我们携手在此探索硅基 生命为科技进步添砖加瓦。Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Dont just be the one reaping all the benefits; step up and be a contributor too. Whether youre tossing out your code snippets , hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome place where we all come together. Were gonna team up and explore the whole silicon - based life thing, and in the process, well be fueling the growth of technology