Python结合Android广播与ADB日志获取手机验证码
本文介绍在Python接口测试中获取手机短信验证码的方法。通过Android端注册BroadcastReceiver监听SMS_RECEIVED广播,解析短信内容,并利用Python脚本调用adb logcat命令实时抓取日志,提取验证码字符串。该方法适用于自动化测试场景,无需手动输入验证码,提升了测试效率与准确性。
Python接口测试中获取短信验证码的方案概述
在Python接口测试场景中,如何自动获取手机收到的短信验证码是一个常见问题。
Android端短信广播监听机制
Android系统在接收到新短信时,会发出一个Action为android.provider.Telephony.SMS_RECEIVED的广播。因此,只需创建一个继承自BroadcastReceiver的类,即可方便地监听并捕获该短信广播。
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.text.TextUtils;
import android.util.Log;
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.createFromPdu((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文件中注册上述接收器,以便系统能够识别并分发短信广播。
<receiver android:name=".SmsInterceptReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
配置接收短信权限
同时,必须在AndroidManifest.xml中添加相应的权限声明,以允许应用接收短信广播。
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
Python通过ADB日志提取验证码
Python脚本主要通过执行adb logcat命令来获取Android应用截取的短信日志信息,对日志内容进行分析后,即可提取出可用的验证码。
__author__ = 'guozhenhua'
#coding=utf-8
import urllib2
import os,time
#解析短信验证码
os.system("adb logcat -c")
cmd="adb logcat -d |findstr E/SmsRec"
#time.sleep(30);
while(1):
smscode= os.popen(cmd).read()
#print smscode
if (smscode!=""):
smscode=smscode.split("验证码:")[1].split(",")[0]
break;
print "验证码是:"+smscode
代码实例扩展
以下提供相关代码的实例扩展,供参考使用。
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.text.TextUtils;
import android.util.Log;
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.createFromPdu((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());
}
}
}
}
以上即为Python结合Android广播与ADB日志获取手机验证码的完整实现方案,更多相关技术细节可关注本站其他文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









