Python3创建二进制短信经ADB发送时buffer模块不可调用报错如何解决
问题根因
抛出TypeError: 'module' object is not callable的直接原因是:
- Python3标准库不存在顶层可直接调用的
buffer构造方法,你代码里写的import buffer导入的是一个模块对象,模块本身不能像函数/类一样被调用,传入字节数组执行实例化操作时必然触发该异常 - 如果你是从Python2代码迁移到Python3,Python2中内置的
buffer类型在Python3版本中已经被废弃,功能被bytearray、memoryview、io.BytesIO拆分替代,不存在同名的顶层可调用对象。
修复步骤
- 删除代码中错误的
import buffer导入语句,不需要额外安装任何名为buffer的第三方库,Python3内置能力完全可以满足二进制数据处理需求 - 二进制字节数组处理直接使用内置类型实现:
- 十六进制字符串转字节数组直接用
bytearray.fromhex(你的十六进制字符串)完成 - 如果需要内存缓冲区做读写、指针偏移操作,从标准库
io模块导入BytesIO使用
- 十六进制字符串转字节数组直接用
- 调整原有编码、分段逻辑适配Python3的字节处理规则,核心修复后的可运行代码参考如下:
import base64 import subprocess import time from io import BytesIO # 替换为你实际构造的十六进制字符串 raw_hex_str = "你的十六进制消息内容" # 直接构造字节数组,不需要调用不存在的buffer构造器 raw_bytes = bytearray.fromhex(raw_hex_str) # 初始化内存缓冲做分段处理 buf = BytesIO(raw_bytes) # 按短信单段字节长度拆分做base64编码,长度可根据你实际的协议要求调整 segment1 = base64.b64encode(buf.read(140)) segment2 = base64.b64encode(buf.read()) # 打印解码后的分段内容 print("消息分段1:", segment1.decode("utf-8")) print("消息分段2:", segment2.decode("utf-8")) # 定义接收号码、最终短信内容 recv_number = "目标手机号" sms_body = (segment1 + segment2).decode("utf-8") # 原有ADB发送逻辑 subprocess.run(["adb", "start-server"], capture_output=True) # 唤起系统短信发送界面 subprocess.run( [ "adb", "shell", "am", "start", "-a", "android.intent.action.SENDTO", "-d", f"sms:{recv_number}", "--es", "sms_body", sms_body ], capture_output=True ) # 等待界面加载完成 time.sleep(1.5) # 模拟按键触发发送,KEYCODE_ENTER对应键值66,部分定制系统可能需要调整键值 subprocess.run(["adb", "shell", "input", "keyevent", "66"], capture_output=True) print("短信发送指令已执行")
注意事项
- 不要通过pip安装任何名为
buffer的第三方包修复该问题,这类包大多是多年未更新的Python2时代遗留包,在Python3环境下会触发更多兼容性问题 - 如果不需要做缓冲读写指针偏移操作,甚至可以完全不使用
BytesIO,直接对bytearray做切片就能完成短信分段,代码会更简洁。
内容的提问来源于stack exchange,提问作者mtgsoftworks
相关产品推荐
相关产品推荐

