You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3创建二进制短信经ADB发送时buffer模块不可调用报错如何解决

问题根因

抛出TypeError: 'module' object is not callable的直接原因是:

  1. Python3标准库不存在顶层可直接调用的buffer构造方法,你代码里写的import buffer导入的是一个模块对象,模块本身不能像函数/类一样被调用,传入字节数组执行实例化操作时必然触发该异常
  2. 如果你是从Python2代码迁移到Python3,Python2中内置的buffer类型在Python3版本中已经被废弃,功能被bytearray、memoryview、io.BytesIO拆分替代,不存在同名的顶层可调用对象。
修复步骤
  1. 删除代码中错误的import buffer导入语句,不需要额外安装任何名为buffer的第三方库,Python3内置能力完全可以满足二进制数据处理需求
  2. 二进制字节数组处理直接使用内置类型实现:
    • 十六进制字符串转字节数组直接用bytearray.fromhex(你的十六进制字符串)完成
    • 如果需要内存缓冲区做读写、指针偏移操作,从标准库io模块导入BytesIO使用
  3. 调整原有编码、分段逻辑适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:06:30