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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:07:14