如何用Python结合ADB与PyAutoGUI正确执行USSD代码?
解决方案
问题1:末尾#号未显示
tel URI中#是特殊字符,会被解析器当作分隔符截断,必须进行URL编码,替换为%23才能正常传递。
问题2:仅呼叫不执行USSD
android.intent.action.CALL会直接发起语音呼叫,而USSD需要在拨号盘完成号码输入后触发执行。可以改用android.intent.action.DIAL打开拨号盘并填充编码后的号码,再模拟按下拨号键;或者直接通过adb模拟拨号盘输入流程,避免URI解析问题。
修正后的代码示例
方式1:修正URI并触发执行
import random import pyautogui import time # 替换#为URL编码的%23 phone_number = "*133*" + str(random.randint(100, 999)) + "%23" # 打开拨号盘并填充编码后的号码 pyautogui.typewrite(f"adb shell am start -a android.intent.action.DIAL -d tel:{phone_number}") pyautogui.press('enter') time.sleep(2) # 等待拨号盘加载完成 # 模拟按下拨号键执行USSD pyautogui.typewrite("adb shell input keyevent KEYCODE_CALL") pyautogui.press('enter')
方式2:直接模拟拨号盘输入(更可靠)
跳过URI解析,直接通过adb模拟在拨号盘逐个输入字符并拨号:
import random import pyautogui import time # 生成完整USSD代码 ussd_code = "*133*" + str(random.randint(100, 999)) + "#" # 打开电话应用 pyautogui.typewrite("adb shell am start -n com.android.dialer/com.android.dialer.main.impl.MainActivity") pyautogui.press('enter') time.sleep(2) # 逐个输入USSD字符 for char in ussd_code: pyautogui.typewrite(f"adb shell input text '{char}'") pyautogui.press('enter') time.sleep(0.1) # 触发拨号执行USSD pyautogui.typewrite("adb shell input keyevent KEYCODE_CALL") pyautogui.press('enter')
额外优化建议
用subprocess模块直接执行adb命令,比PyAutoGUI模拟键盘输入更稳定,避免输入法干扰:
import subprocess import random import time ussd_code = "*133*" + str(random.randint(100, 999)) + "#" # 打开拨号盘 subprocess.run(["adb", "shell", "am", "start", "-a", "android.intent.action.DIAL"]) time.sleep(2) # 输入USSD代码 subprocess.run(["adb", "shell", "input", "text", ussd_code]) # 执行拨号 subprocess.run(["adb", "shell", "input", "keyevent", "KEYCODE_CALL"])
内容的提问来源于stack exchange,提问作者Moon Canon
相关产品推荐
相关产品推荐

