短訊轉發到微信
- 2020 年 3 月 18 日
- 筆記
前言
因為有了更好的流量套餐,所以多出一張電話卡只能放到備用安卓機上,但是換下來的卡還綁定着一些東西,偶爾要收收驗證碼什麼的,因此就想到開發一款短訊轉發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 + 'r錯誤信息:' + 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 + "n短訊內容:" + _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 + 'r錯誤信息:' + result.errmsg, { duration: 'long', type: 'div' }); } } }); } </script> </body> </html>
七、權限
1、應用獲取短訊權限,並在手機內給與獲取短訊權限
2、關閉驗證碼保護
不關閉這個的話軟件無法監聽含有驗證碼的短訊
八、成果
最後
1、因為監聽短訊的方法目前只支持安卓,所以ios只能參考思路
2、筆者備用安卓機系統為4.0.4,挺低了,版本往上的應該都支持
3、目前垃圾短訊會被安卓機自帶的管家攔截,所以不需要垃圾短訊過濾( ̄▽ ̄)~*