Android转发短信给QQ机器人
背景
公司同事身处不同省份,都需要访问一个甲方的系统,登录系统需要短信验证码。手机在技术手上,经常打断工作去看验证码实在是影响工作效率,因此结合前面开发的QQ机器人,结合APP实现转发短信到服务器,再由QQ机器人发到群里的功能。
前提
公网IP
非鸿蒙系统(实现方式不同)
安卓版本低于8.0(API 26)(对静态广播有限制)
目前发现的问题
APP退出时间长了以后收不到静态广播,推测是被回收掉了。
傻瓜式解决方案:APP置于前台不退出
根源式解决方案:进程保活
技术实现
BroadcastReceiver + socket + python
因为是给QQ机器人接入的新功能,所以采用socket的方式。
换个思路也可以做一个API,接收到短信以后保存到数据库里,通过python定时访问数据库检查是否有新的短信,有就发出来。考虑到验证码的时效性,这个查询的周期会比较短,一个程序定时高频率操作数据库感觉不够奈斯。
代码
Android部分
main.class随便写写就行了,反正也不用。
SmsRecevier.class
静态注册一个BroadcastReceiver,监听短信广播,然后通过socket发送给服务器。
静态注册的广播,APP退出以后会继续工作。
public class SmsRecevier extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();//通过getExtras()方法获取短信内容if (bundle != null) {Object[] pdus = (Object[]) bundle.get("pdus");//通过关键词“pdus”从Bundle实例中获取到短信字节数组—pdusif (pdus == null) {return;}SmsMessage[] messages = new SmsMessage[pdus.length];//把短信字节数组—pdus转换进->SmsMessage[]for (int i = 0; i < messages.length; i++) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {String format = bundle.getString("format");messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);} else {messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);}try {String msgStr = messages[i].getMessageBody();//短信内容SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String t1 =simpleDateFormat.format(new Date(messages[i].getTimestampMillis())) //发送时间String s1 =messages[i].getOriginatingAddress()) //发件人手机号transport(msgStr);}} catch (Exception e) {e.printStackTrace();}}}}private void transport(String m) {final String message = m + "\r\n";//数据的结尾加上换行符才可让服务器端的readline()停止阻塞try {new Thread() {@Overridepublic void run() {try {String host = "1.2.3.4";int port = 1234;Socket socket = new Socket(host, port);if (socket.isConnected()) {OutputStream outputStream = socket.getOutputStream();outputStream.write(message.getBytes("UTF-8"));outputStream.flush();outputStream.close();socket.close();}} catch (Exception e) {e.printStackTrace();}super.run();}}.start();} catch (Exception e) {e.printStackTrace();}}
}
AndroidManifest.xml
添加权限和静态注册广播
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission><application…………<receiver android:name="com.xxx.SmsRecevier" android:exported="true"><intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/><action android:name="android.intent.action.INPUT_METHOD_CHANGED" /></intent-filter></receiver></application>
这条权限不能少,没有这个权限无法读取信息内容:
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
pythton部分
和python+go-cqhttp搭建自动回复QQ机器人中的自动回复部分差不多,只是如果手机和服务器不在同一个局域网下,那么服务器上的socket监听的IP地址要写成服务器的公网地址,和BroadcastReceiver中socket发送消息的IP地址一样。
Android转发短信给QQ机器人相关推荐
- android 转发短信
通过这些代码也可以对远程手机实现短信控制.有兴趣的可以自己改一下,说一下简单的原理,要实现控制的话,必须得走一个固定的号码,固定的格式,然后通过得到此号码的内容,然后通过固定的内容,就可以了解需要做什 ...
- android 短信转发设置权限,用Tasker实现Android手机短信转发到钉钉
之前的一篇文章[<用Tasker实现Android手机短信转发到微信>](https://taskerm.com/2018/12/22/forwarded-sms-to-wechat. ...
- android实现短信自动转发
我有两张手机卡,一张专门用来绑定银行卡的,一张拿来打电话用的.但是我的手机只能装一张银行卡,现在问题来了,我出门的就要带俩手机,非常麻烦.所以我就写了一个短信转发功能app,这样就可以只带一个手机出门 ...
- Sms开源短信及消息转发器,不仅只转发短信,备用机必备神器
Sms开源短信及消息转发器,不仅只转发短信,备用机必备神器. 短信转发器--不仅只转发短信,备用机必备神器! 监控Android手机短信.来电.APP通知,并根据指定规则转发到其他手机:钉钉群自定义机 ...
- 自动转发短信安卓转iOS
安装软件 配置 安卓安装<短信转发器> 下载地址(如果某个链接不能用,就试试别的) 短信转发器 Github:https://github.com/pppscn/SmsForwarder ...
- Android之——短信的备份与还原
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47091281 眼下,Android手机中的一些软件能够实现手机短信的备份与还原操作 ...
- android 获取短信验证码倒计时
android 获取短信验证码倒计时 public class MainActivity extends Activity { private Button submit; privat ...
- android发送短信
使用android发送短信,需要先进行添加发送,读取短信新的权限: <uses-permissionandroid:name="android.permission.RECEIVE_S ...
- Android接收短信-createFromPdu
createFromPdu(byte[]) method was deprecated in API level 23. Use createFromPdu(byte[], String) inste ...
最新文章
- 一步一步自定义spinner
- Team Work(CF 932 E)[bzoj5093][Lydsy1711月赛]图的价值
- oracle的iw算法,[转载]Oracle日期周详解IW
- excel图表交互联动_深入讲解EasyShu图表与引用数据动态联动功能
- android 页面整体滑动,ScrollView 实现页面整体滑动
- 这个使用 Python 编写的 PDF 神器你值得拥有!
- 第一章节 ASP.NET Web应用程序基础(一)
- 札记:android手势识别,MotionEvent
- 【Datawhale IntelVINO学习笔记】OpenVINO音频和人体姿态识别
- 使用vue实现四级联动
- 读懂Redis源码,我总结了这7点心得
- python编程中的不等于符号_python不等于符号怎么写
- 使用flask从零构建自动化运维平台系列三
- 五猴分桃问题的数学解
- springboot 最新腾讯云短信接入的坑(包含所有操作流程)
- node 文件重命名
- golang的panic
- 下载xampp之后还用下载PHP吗,PHP 下载并安装XAMPP
- 2. Bean Validation声明式校验方法的参数、返回值
- 基于GIS简单处理世界土壤数据库(HWSD)的中国土壤数据集
热门文章
- Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战
- 专利查新报告该怎么做?
- 独家 | 蚂蚁金服漆远首谈刚完成的AI重大突破及紧缺人才,呼吁国内多点技术性强的大会,少点网红
- pyqt5 登录界面界面的设计(多窗口的设计)
- 你不知道的JavaScript--Item5 全局变量
- 米酷影视6.2.8完整版(仿首涂模板+四套首页模板)
- ps cs3 汉化包(去掉BUG版)的补充说明~回复大人Orz!
- jquery 遍历json list js取得json值。
- Spring详细教程
- Direct3D 11