• 短信转发到微信


    前言

    因为有了更好的流量套餐,所以多出一张电话卡只能放到备用安卓机上,但是换下来的卡还绑定着一些东西,偶尔要收收验证码什么的,因此就想到开发一款短信转发App。功能很简单,就用H5开发。
    一开始打算这款App同时满足收发功能,直到偶然间在张大妈看见有大佬用 树莓派+企业微信 做了一个短信转发,瞬间膜拜。那么,服务器就由马老板买单了(~ ̄▽ ̄)~

    正文

    一、注册企业微信

    注册地址:企业微信
    之所以不用服务号,订阅号是因为比较麻烦,注册时都需要绑定身份证等,能简单点就简单点。

    注册好后手机下载企业微信App,把自己的微信号拉入新建的企业里面去,并且扫描二维码关注 微工作台
    以后就可以卸载企业微信,用正常的微信接受消息

    二、创建程序

    应用管理=》自建=》创建一个程序,名称随意

    三、获取以下参数

    1、我的企业=》企业ID

    2、应用管理=》自建的程序=》AgentId 和 Secret

    3、通讯录=》点击一个用户查看详情=》账号

    四、用HBuilder新建5+APP Mui项目

    在项目内新建一个jquery

    五、新建SMS.js

    var callbacks = [];
    var receiver;
    var filter;
    var main;
    var isInit = false;
    var isRegistered = false;
    var isOlderVersion = false;
    
    //plusReady封装,若使用mui,可直接使用mui.plusReady()方法;  
    var plusReady = function(callback) {
    	if (window.plus) {
    		callback();
    	} else {
    		document.addEventListener("plusready", function() {
    			callback();
    		}, false);
    	}
    }
    
    /**  
     * 初始化  
     */
    var init = function(callback) {
    	//仅支持Android版本  
    	if (plus.os.name !== 'Android') {
    		return;
    	}
    	try {
    		var version = plus.runtime.innerVersion.split('.');
    		isOlderVersion = parseInt(version[version.length - 1]) < 22298;
    		main = plus.android.runtimeMainActivity();
    		var Intent = plus.android.importClass('android.content.Intent');
    		var IntentFilter = plus.android.importClass('android.content.IntentFilter');
    		var SmsMessage = plus.android.importClass('android.telephony.SmsMessage');
    		var receiverClass = 'io.dcloud.feature.internal.reflect.BroadcastReceiver';
    		if (isOlderVersion) {
    			receiverClass = 'io.dcloud.feature.internal.a.a';
    		}
    		filter = new IntentFilter();
    		var onReceiveCallback = function(context, intent) {
    			try {
    				var action = intent.getAction();
    				if (action == "android.provider.Telephony.SMS_RECEIVED") {
    					var pdus = intent.getSerializableExtra("pdus");
    					var msgs = [];
    					for (var i = 0, len = pdus.length; i < len; i++) {
    						msgs.push(SmsMessage.createFromPdu(pdus[i]));
    					}
    					for (var i = 0, len = callbacks.length; i < len; i++) {
    						callbacks[i](msgs);
    					}
    				}
    			} catch (e) {}
    		}
    		receiver = plus.android.implements(receiverClass, {
    			a: onReceiveCallback,
    			onReceive: onReceiveCallback
    		});
    		filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    		callback && callback();
    	} catch (e) {}
    }
    
    //注册短信监听  
    var register = function(callback) {
    	callbacks.push(callback);
    	if (!isInit) {
    		isInit = isRegistered = true;
    		mui.plusReady(function() {
    			init(function() {
    				setTimeout(function() {
    					//                  console.log('registerReceiver');  
    					try {
    						if (isOlderVersion) {
    							main.a(receiver, filter);
    						} else {
    							main.registerReceiver(receiver, filter); //注册监听  
    						}
    					} catch (e) {}
    				}, 300);
    			});
    		});
    	} else if (!isRegistered) {
    		//      console.log('registerReceiver');  
    		try {
    			if (isOlderVersion) {
    				main.a(receiver, filter);
    			} else {
    				main.registerReceiver(receiver, filter); //注册监听  
    			}
    		} catch (e) {}
    	}
    };
    //注销监听,在登录成功或从登录页跳转到其它页面后调用  
    var unregister = function(callback, remove) {
    	for (var i = 0, len = callbacks.length; i < len; i++) {
    		if (callbacks[i] === callback) {
    			callbacks.splice(i, 1);
    		}
    	}
    	if (remove && !callbacks.length) {
    		if (main && isRegistered) {
    			try {
    				if (isOlderVersion) {
    					main.a(receiver);
    				} else {
    					main.unregisterReceiver(receiver);
    				}
    			} catch (e) {}
    			isRegistered = false;
    			//          console.log('unregisterReceiver');  
    		}
    	}
    };
    
    

    六、Index主页

    把上面的四个参数填入进去,并把js引用路径进行调整

    <!DOCTYPE html>
    <html class="ui-page-login">
    	<head>
    		<meta charset="utf-8">
    		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    		<title></title>
    		<link href="css/mui.min.css" rel="stylesheet" />
    		<link href="css/style.css" rel="stylesheet" />
    		<style>
    			.title {
    				margin-top: 0;
    				margin-bottom: 0;
    				padding-left: 0;
    			}
    			.SMS .Phone {
    				font-family: 'Helvetica Neue', Helvetica, sans-serif;
    				font-size: 17px;
    				line-height: 21px;
    				color: #000;
    			}
    
    			.SMS .Context {
    				text-overflow: ellipsis;
    				overflow: hidden;
    				white-space: nowrap;
    			}
    
    			.SMS .Context.Active {
    				white-space: initial
    			}
    		</style>
    	</head>
    	<body>
    		<header class="mui-bar mui-bar-nav mui-bar-transparent">
    			<ul class="title">
    				<li class="mui-table-view-cell">
    					信使
    					<div id="sendSwitch" class="mui-switch mui-switch-mini mui-active">
    						<div class="mui-switch-handle"></div>
    					</div>
    				</li>
    			</ul>
    		</header>
    		<div class="mui-content">
    			<ul class="mui-table-view" id="SMSList">
    			</ul>
    		</div>
    		<script src="js/mui.min.js"></script>
    		<script src="js/mui.enterfocus.js"></script>
    		<script src="JavaScript/Jquery/Jquery-3.4.1.min.js"></script>
    		<script src="js/SMS.js"></script>
    		<script>
    			var _corpid = ""; //企业ID
    			var _corpsecret = ""; //Secret
    			var _touser="";//用户账号
    			var _agentid=1000000;//AgentId
    			
    			var _sendSwitch = true;
    			var _SMSList = {}; //待发送信息集合
    			var _token = "";
    			$(function() {
    				//获取开关状态
    				mui(".title").on("tap", "#sendSwitch", function() {
    					var isActive = document.getElementById("sendSwitch").classList.contains("mui-active");
    					if (isActive) {
    						_sendSwitch = true;
    					} else {
    						_sendSwitch = false;
    					}
    				});
    				//短信点击事件
    				mui("#SMSList").on("tap", ".SMS", function() {
    					var isActive = $(".Active");
    					if (isActive) {
    						isActive.removeClass("Active")
    					}
    					$(this).children('.Context').addClass("Active");
    				});
    				//获取token
    				getToken()
    			})
    
    			//****************************短信监听 开始****************************+
    			var handleSMS = function(msgs) {
    				if (_sendSwitch == false)
    					return;
    				for (var i = 0, len = msgs.length; i < len; i++) {
    					var phone = msgs[i].getDisplayOriginatingAddress(); //获取来源手机号
    					var content = msgs[i].getDisplayMessageBody(); //获取短信内容
    
    					//储存短信内容进行拼接,产生会话模式
    					if (_SMSList[phone] == undefined)
    						_SMSList[phone] = content;
    					else
    						_SMSList[phone] += content;
    					//延迟执行
    					setTimeout(function() {
    						SendSMS(phone)
    					}, 3000);
    				}
    			};
    
    			//登录页面注册短信监听事件  
    			register(handleSMS);
    			//****************************短信监听 结束****************************
    			//获取token
    			function getToken() {
    				$.ajax({
    					url: "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + _corpid + "&corpsecret=" + _corpsecret,
    					dataType: "json",
    					success: function(result) {
    						if (result.errcode == 0) {
    							_token = result.access_token;
    							return result.access_token;
    						} else {
    							var smsHtml = '<li class="mui-table-view-cell SMS"><p class="Phone">' + result.errcode +
    								'</p><p class="Context">' +
    								result.errmsg + '</p></li>'
    							$("#SMSList").prepend(smsHtml)
    							mui.toast('获取token失败,错误码:' + result.errcode + '
    错误信息:' + result.errmsg, {
    								duration: 'long',
    								type: 'div'
    							});
    						}
    					}
    				});
    			}
    			//发送短信
    			function SendSMS(phone) {
    				//如果已被发送则无需再次发送
    				if (_SMSList[phone] == undefined)
    					return;
    				//拼接参数
    				var data = {
    					"touser": _touser,
    					"msgtype": "text",
    					"agentid": _agentid,
    					"text": {
    						"content": "发信人:" + phone + "
    短信内容:" + _SMSList[phone]
    					},
    					"safe": 0
    				}
    				//在APP中显示短信
    				var smsHtml = '<li class="mui-table-view-cell SMS"><p class="Phone">' + phone + '</p><p class="Context">' +
    					_SMSList[phone] + '</p></li>'
    				$("#SMSList").prepend(smsHtml)
    				delete _SMSList[phone];
    				$.ajax({
    					type: 'POST',
    					url: "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + _token,
    					data: JSON.stringify(data),
    					dataType: "json",
    					success: function(result) {
    						if (result.errcode == 42001) {
    							getToken()
    							SendSMS(phone)
    						} else if (result.errcode == 0) {
    							mui.toast('转发成功', {
    								duration: 'long',
    								type: 'div'
    							});
    						} else {
    							var smsHtml = '<li class="mui-table-view-cell SMS"><p class="Phone">' + result.errcode +
    								'</p><p class="Context">' +
    								result.errmsg + '</p></li>'
    							$("#SMSList").prepend(smsHtml)
    							mui.toast('发送信息失败,错误码:' + result.errcode + '
    错误信息:' + result.errmsg, {
    								duration: 'long',
    								type: 'div'
    							});
    						}
    					}
    				});
    			}
    		</script>
    	</body>
    
    </html>
    
    

    七、权限

    1、应用获取短信权限,并在手机内给与获取短信权限

    2、关闭验证码保护
    不关闭这个的话软件无法监听含有验证码的短信

    八、成果

    最后

    1、因为监听短信的方法目前只支持安卓,所以ios只能参考思路
    2、笔者备用安卓机系统为4.0.4,挺低了,版本往上的应该都支持
    3、目前垃圾短信会被安卓机自带的管家拦截,所以不需要垃圾短信过滤( ̄▽ ̄)~*

  • 相关阅读:
    jquery 触发别的元素事件,并且传递参数
    jquery中的trigger和triggerHandler区别
    jquery 触发别的元素事件
    jquery 禁止页面form提交的通用方法
    对象序列化反序列化例子
    Access数据库访问助手类
    SQL Update 语句中使用别名
    C# 启动和结束进程
    ACCESS查询当天数据的SQL语句(DateDiff函数)
    解决Access数据库 不可识别的数据库格式 ***.accdb
  • 原文地址:https://www.cnblogs.com/NBDWDYS2214143926/p/12515899.html
Copyright © 2020-2023  润新知