短訊轉發到微信

  • 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、目前垃圾短訊會被安卓機自帶的管家攔截,所以不需要垃圾短訊過濾( ̄▽ ̄)~*