相信大家在做自动化测试的时候,都会遇到一个问题就是获取短信验证码。
有的公司的短信验证码是存到数据库的,有的公司的短信验证码是存到日志里面的,但是有些短信验证码是开发都拿不到,没办法提供保存方法的。
如何获取到短信验证码,得到了三种方法,可能不全,请大神指出。
卡猫 (要付费)
安卓的短信广播
第三方接码平台 (要付费)
下面就来分享下
如何通过安卓的广播拿到短信验证码
Android在收到短信后会发送一个Action为android.provider.Telephony.SMS_RECEIVED的广播,所以我们只需要写个类继承BroadcastReceiver就可以很容易地监听到短信。
小编是这样做的
首先安装个android studio,然后新建个工程,建好工程之后到工程-->app-->src-->main-->java-->com.example.xxx.myapplication 下新建个文件,文件名是SmsInterceptReceiver ,输入如下代码,如果你拷贝之后发现有些类的名称是红色的,说明你没有导包,mac 是按住alt+enter然后添加包 ,windows的快捷键请自行百度。
package com.example.getsms;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
/**
* Created by xxx on 17/3/28.
*/
public class SmsInterceptReceiver extends BroadcastReceiver {
private final String TAG = "SmsRec";
private static final String SMS_EXTRA_NAME ="pdus";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String message = "";
Log.e(TAG, "free message " );
Bundle extras = intent.getExtras();
if ( extras != null ) {
try {
Object[] smsExtra = (Object[]) extras.get( SMS_EXTRA_NAME );
ContentResolver contentResolver = context.getContentResolver();
Log.e(TAG, "free message " );
for ( int i = 0; i < smsExtra.length; ++i ) {
SmsMessage sms = SmsMessage.((byte[]) smsExtra[i]);
String body = sms.getMessageBody().toString();
message += body;
}
Log.e(TAG, "free message : " + message);
} catch (Exception e) {
// TODO: handle exception
Log.e(TAG, e.getMessage());
}
}
}
}
AndroidManifest.xml(这个文件在java同级目录res下)里注册一下接收器:
下面的代码添加到activity标签同级的下方即可
<receiver android:name=".SmsInterceptReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
添加权限(还是上面这个xml文件,搞不清就问下你们安卓开发):
下面这个代码我这里是添加在application标签上面的
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
手机要连上电脑,打开USB调试。adb devices查看手机有没有连接上,准备工作做好之后,点击android studio 页面上的绿色三角按钮运行即可。运行成功的话手机上会有个你自己建的工程名蓝色标题的页面。
python 代码,主要通过adb log来获取apk包所截取的短信信息,然后进行分析后既可使用。
#coding=utf-8
import os
def GetCodeFromSms():
os.system("adb logcat -c")
cmd = ' adb logcat -d |grep E/SmsRec'
while(1):
smscode = os.popen(cmd).read()
print smscode
if (smscode!=""):
smscode = smscode.split("验证码:")[1].split(",")[0]
break;
print "验证码是:"+smscode
if __name__ == '__main__':
GetCodeFromSms()
因为小编用的是mac,所以过滤用的grep,如果你是windows,改成findstr。
文件小编是放在终端的文件夹里面,运行python文件,通过接口给被链接手机发验证码或者是用其他手机给被连接手机发送验证码进行测试。就可以在终端看见输出验证码,然后根据自己需求拿出来即可。
E/SmsRec (12345): free message
E/SmsRec (12345): free message
E/SmsRec (12345): free message : 验证码:654321
验证码是:654321
至于为什么会多出来几个free message,是因为写java那段代码的开发用Log.e调试用的。E/ 是错误消息的意思,但是可以显示出来就好。D/ 是debug 消息,I/是一般消息 W/警告消息 V/ 是各种乱七八槽的消息
有的公司的短信验证码是存到数据库的,有的公司的短信验证码是存到日志里面的,但是有些短信验证码是开发都拿不到,没办法提供保存方法的。
如何获取到短信验证码,得到了三种方法,可能不全,请大神指出。
卡猫 (要付费)
安卓的短信广播
第三方接码平台 (要付费)
下面就来分享下
如何通过安卓的广播拿到短信验证码
Android在收到短信后会发送一个Action为android.provider.Telephony.SMS_RECEIVED的广播,所以我们只需要写个类继承BroadcastReceiver就可以很容易地监听到短信。
小编是这样做的
首先安装个android studio,然后新建个工程,建好工程之后到工程-->app-->src-->main-->java-->com.example.xxx.myapplication 下新建个文件,文件名是SmsInterceptReceiver ,输入如下代码,如果你拷贝之后发现有些类的名称是红色的,说明你没有导包,mac 是按住alt+enter然后添加包 ,windows的快捷键请自行百度。
package com.example.getsms;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
/**
* Created by xxx on 17/3/28.
*/
public class SmsInterceptReceiver extends BroadcastReceiver {
private final String TAG = "SmsRec";
private static final String SMS_EXTRA_NAME ="pdus";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String message = "";
Log.e(TAG, "free message " );
Bundle extras = intent.getExtras();
if ( extras != null ) {
try {
Object[] smsExtra = (Object[]) extras.get( SMS_EXTRA_NAME );
ContentResolver contentResolver = context.getContentResolver();
Log.e(TAG, "free message " );
for ( int i = 0; i < smsExtra.length; ++i ) {
SmsMessage sms = SmsMessage.((byte[]) smsExtra[i]);
String body = sms.getMessageBody().toString();
message += body;
}
Log.e(TAG, "free message : " + message);
} catch (Exception e) {
// TODO: handle exception
Log.e(TAG, e.getMessage());
}
}
}
}
AndroidManifest.xml(这个文件在java同级目录res下)里注册一下接收器:
下面的代码添加到activity标签同级的下方即可
<receiver android:name=".SmsInterceptReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
添加权限(还是上面这个xml文件,搞不清就问下你们安卓开发):
下面这个代码我这里是添加在application标签上面的
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
手机要连上电脑,打开USB调试。adb devices查看手机有没有连接上,准备工作做好之后,点击android studio 页面上的绿色三角按钮运行即可。运行成功的话手机上会有个你自己建的工程名蓝色标题的页面。
python 代码,主要通过adb log来获取apk包所截取的短信信息,然后进行分析后既可使用。
#coding=utf-8
import os
def GetCodeFromSms():
os.system("adb logcat -c")
cmd = ' adb logcat -d |grep E/SmsRec'
while(1):
smscode = os.popen(cmd).read()
print smscode
if (smscode!=""):
smscode = smscode.split("验证码:")[1].split(",")[0]
break;
print "验证码是:"+smscode
if __name__ == '__main__':
GetCodeFromSms()
因为小编用的是mac,所以过滤用的grep,如果你是windows,改成findstr。
文件小编是放在终端的文件夹里面,运行python文件,通过接口给被链接手机发验证码或者是用其他手机给被连接手机发送验证码进行测试。就可以在终端看见输出验证码,然后根据自己需求拿出来即可。
E/SmsRec (12345): free message
E/SmsRec (12345): free message
E/SmsRec (12345): free message : 验证码:654321
验证码是:654321
至于为什么会多出来几个free message,是因为写java那段代码的开发用Log.e调试用的。E/ 是错误消息的意思,但是可以显示出来就好。D/ 是debug 消息,I/是一般消息 W/警告消息 V/ 是各种乱七八槽的消息