使用Python结合ADB发送希伯来语WhatsApp消息报错求助
问题:ADB输入希伯来语到WhatsApp触发NullPointerException
- 已实现Python结合ADB向WhatsApp发送英文消息正常,但发送希伯来语消息时触发错误
- 测试确认安卓手机默认短信APP可正常发送希伯来语消息
- 当前现象:希伯来语内容未被输入,程序直接跳转到下一个联系人
代码实现
import subprocess import time def run_adb_command(command): subprocess.run(command, shell=True, encoding='utf-8') def open_whatsapp_with_message(code, number, message): url = f'https://api.whatsapp.com/send?phone={code}{number}' command = f'adb shell am start -a android.intent.action.VIEW -d "{url}"' run_adb_command(command) time.sleep(3) input_command = f'adb shell input text "{message}"' print(input_command) run_adb_command(input_command) time.sleep(1) keyevent_command = 'adb shell input keyevent' run_adb_command(f'{keyevent_command} 21') run_adb_command(f'{keyevent_command} 21') time.sleep(1) run_adb_command(f'{keyevent_command} 21') run_adb_command(f'{keyevent_command} 21') run_adb_command(f'{keyevent_command} 66') def process_numbers(numbers): code = "+" message = "בדיקה" for number in numbers: open_whatsapp_with_message(code, number, message) time.sleep(5) # Add a delay between each iteration # Example usage number_list = ["12345678", "87654321"] process_numbers(number_list)
报错信息
java.lang.NullPointerException: Attempt to get length of null array at com.android.commands.input.Input$InputText.sendText(Input.java:168) at com.android.commands.input.Input$InputText.run(Input.java:140) at com.android.commands.input.Input.onRun(Input.java:107) at com.android.internal.os.BaseCommand.run(BaseCommand.java:60) at com.android.commands.input.Input.main(Input.java:71) at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:409)
解决方案
方案1:将希伯来语文本转义为Unicode编码
ADB的input text命令对非ASCII字符的解析依赖Unicode转义格式,直接传入原始希伯来语会导致编码解析失败。修改消息转义逻辑:
# 替换原input_command生成代码 message_escaped = message.encode('unicode-escape').decode('utf-8').replace('"', '\\"') input_command = f'adb shell input text "{message_escaped}"'
方案2:使用剪贴板粘贴(更稳定推荐)
剪贴板对Unicode文本支持更完善,避免input text的编码问题,步骤如下:
- 将消息写入安卓系统剪贴板
- 在WhatsApp输入框触发粘贴操作
修改open_whatsapp_with_message函数中的输入部分:
# 替换原input_command相关代码 keyevent_command = 'adb shell input keyevent' # 设置剪贴板内容 clipboard_command = f'adb shell am broadcast -a android.intent.action.CLIPBOARD --es text "{message}"' run_adb_command(clipboard_command) time.sleep(0.5) # 触发粘贴(Ctrl+V) run_adb_command(f'{keyevent_command} 29') # 按下左Ctrl run_adb_command(f'{keyevent_command} 118') # 按下V run_adb_command(f'{keyevent_command} 29') # 释放左Ctrl time.sleep(1)
原因说明:ADB底层的input text命令在处理RTL(从右到左)语言时存在编码解析缺陷,导致NullPointerException;剪贴板方式直接传递完整Unicode文本,兼容性和稳定性更好。
内容的提问来源于stack exchange,提问作者eitan
相关产品推荐
相关产品推荐

