Open-AutoGLM Python API调用实战教学
1. 为什么需要Python API?——告别命令行,拥抱工程化集成
你可能已经试过用python main.py --device-id ... --base-url ... "打开小红书搜美食"这种方式让AI接管手机。它很酷,但只适合快速验证。一旦你想把AutoGLM能力嵌入自己的项目——比如做一个自动测试平台、一个电商APP批量上架工具,或者一个企业级RPA流程引擎,命令行就显得力不从心了。
Python API就是为此而生的。它不是简单的封装,而是把整个Phone Agent的能力拆解成可编程、可组合、可调试的模块:你可以精确控制ADB连接生命周期,动态切换设备,分步执行操作规划,甚至在关键步骤插入人工确认逻辑。它让AI手机助理从“玩具”变成“生产级组件”。
本文不讲怎么部署服务器、不重复配置ADB的细节,而是聚焦在如何用Python代码真正驾驭Open-AutoGLM。你会学到:
- 如何用几行代码建立稳定、可管理的设备连接;
- 如何绕过命令行限制,实现多指令链式调用与状态感知;
- 如何捕获并处理真实场景中的异常(如弹窗拦截、验证码卡点);
- 如何把AI操作日志、截图、中间状态变成可分析的数据流。
全程使用真实可运行的代码,所有示例均基于官方phone_agent模块设计,无需魔改源码。
2. 环境准备:轻量起步,专注API本身
前提说明:本文默认你已完成基础环境搭建——云服务端模型已启动(监听
http://<ip>:8800/v1),本地电脑已安装ADB并能识别手机,且Open-AutoGLM代码已克隆并完成pip install -e .安装。若尚未完成,请先参考官方文档完成前置步骤。
本节只做最小必要准备,避免冗余干扰:
2.1 创建独立开发环境
# 新建项目目录,隔离依赖 mkdir autoglm-api-demo && cd autoglm-api-demo python -m venv venv source venv/bin/activate # macOS/Linux # venv\Scripts\activate # Windows2.2 安装核心依赖(仅需两项)
pip install requests pillow # requests用于HTTP通信,pillow用于后续截图分析 # 注意:无需重复安装open-autoglm!因为已通过pip install -e .全局安装2.3 验证基础连通性
在终端执行以下命令,确认你的环境已就绪:
adb devices # 应看到类似 "ABC123456789 device" 的输出 curl -s http://<你的云服务器IP>:8800/health | jq . # 若有返回{"status":"healthy"}即服务正常(无jq可省略|jq)此时,你已站在API调用的起跑线上。接下来,我们不再敲命令,而是写代码。
3. 核心API详解:从连接到执行的四层抽象
Open-AutoGLM的Python API并非扁平接口,而是按职责清晰分层。理解这四层,是写出健壮代码的关键。
3.1 第一层:设备连接管理(ADBConnection)
这是所有操作的地基。它不直接执行AI任务,而是为你提供对Android设备的底层控制权。
from phone_agent.adb import ADBConnection # 创建连接管理器(单例,推荐全局复用) conn = ADBConnection() # 方式1:USB直连(最稳定) success, msg = conn.connect("ABC123456789") # 设备ID来自 adb devices print(f"USB连接: {msg}") # 成功时输出 "Connected to ABC123456789 via USB" # 方式2:WiFi远程连接(需提前 adb tcpip 5555) success, msg = conn.connect("192.168.1.100:5555") print(f"WiFi连接: {msg}") # 查看当前所有连接 devices = conn.list_connected_devices() for d in devices: print(f"ID: {d.device_id}, 类型: {d.connection_type.value}, 状态: {d.status}")关键洞察:ADBConnection不是“一次连接,永久有效”。它会主动检测设备在线状态,并在断开时抛出明确异常(如DeviceDisconnectedError),这让你能编写带重连逻辑的容错代码,而非依赖命令行的“一锤子买卖”。
3.2 第二层:屏幕感知与交互(ScreenCapture与InputController)
这一层解决“AI看到什么”和“AI能做什么”的问题。它们是视觉语言模型的“手”和“眼”。
from phone_agent.screen import ScreenCapture from phone_agent.input import InputController # 初始化(需传入已连接的ADB实例) capture = ScreenCapture(conn) input_ctrl = InputController(conn) # 1. 截图:获取当前屏幕快照(返回PIL.Image对象,可直接显示或分析) screenshot = capture.take_screenshot() screenshot.save("current_screen.png") # 保存供调试 print(f"截图尺寸: {screenshot.size}") # 例如 (1080, 2400) # 2. 点击:模拟手指点击(坐标为屏幕像素,原点在左上角) input_ctrl.tap(540, 1200) # 点击屏幕中央偏下位置 # 3. 滑动:模拟手指滑动(用于翻页、拖拽) input_ctrl.swipe(start_x=540, start_y=2000, end_x=540, end_y=500, duration_ms=800) # 4. 输入文本:依赖ADB Keyboard,自动处理输入法切换 input_ctrl.type_text("小红书")实战技巧:不要硬编码坐标!真实项目中,应结合OCR或目标检测模型,从screenshot中动态计算按钮位置。ScreenCapture返回的PIL图像,正是你接入自定义CV模型的理想入口。
3.3 第三层:AI任务调度(PhoneAgentClient)
这是真正的“大脑”接口。它将自然语言指令翻译为一系列可执行的屏幕操作。
from phone_agent.client import PhoneAgentClient # 初始化客户端(指向你的云服务) client = PhoneAgentClient( base_url="http://192.168.1.200:8800/v1", # 云服务器地址 model="autoglm-phone-9b", # 模型名称,必须与服务端一致 timeout=300 # 超时设长些,复杂任务可能需2分钟 ) # 发送指令(同步阻塞调用) try: result = client.execute_task( instruction="打开小红书,搜索'北京美食',进入第一个笔记,点赞并收藏", device_id="ABC123456789" # 明确指定设备 ) print("任务完成!") print(f"总步骤数: {len(result.steps)}") print(f"最终状态: {result.status}") # 'success', 'failed', 'human_intervention_needed' except Exception as e: print(f"任务执行异常: {e}")返回值解析:result是一个结构化对象,包含:
steps: 每一步操作的详细日志(如"action": "click", "target": "搜索框", "coordinates": [320, 150])screenshots: 关键步骤的截图Base64编码(可解码为图片)final_screenshot: 任务结束时的屏幕快照error: 如果失败,此处有具体错误原因(如"无法定位'搜索框'元素")
这比命令行输出的纯文本日志强大得多——它是可编程的数据。
3.4 第四层:高级工作流(TaskOrchestrator)
当单一指令不够,你需要编排多个AI任务、插入人工判断、或根据中间结果分支决策时,TaskOrchestrator就是你的指挥中心。
from phone_agent.workflow import TaskOrchestrator orchestrator = TaskOrchestrator(client, conn) # 定义一个带条件分支的工作流 def workflow_for_app_install(): # 步骤1:检查APP是否已安装 is_installed = orchestrator.run_adb_command("pm list packages | grep com.xiaohongshu") if "com.xiaohongshu" in is_installed: print("小红书已安装,跳过下载") # 直接执行搜索任务 return client.execute_task("打开小红书,搜索'北京美食'") else: print("小红书未安装,开始下载APK...") # 步骤2:下载并安装APK(此处为示意,实际需提供APK路径) orchestrator.run_adb_command("adb install xhs.apk") # 步骤3:等待安装完成并启动 orchestrator.run_adb_command("adb shell am start -n com.xiaohongshu/.activity.SplashActivity") # 步骤4:执行搜索 return client.execute_task("搜索'北京美食'") # 执行工作流 result = workflow_for_app_install() print(f"工作流结果: {result.status}")价值所在:它把adb命令、client调用、Python逻辑无缝融合,让你能构建出真正复杂的自动化流水线,而不仅仅是“发个指令等结果”。
4. 实战案例:构建一个防误触的“抖音关注助手”
现在,我们将前三节的知识融会贯通,写一个真实可用的小工具:它接收一个抖音号,自动完成“打开抖音→搜索该账号→进入主页→点击关注”,并在关键节点(如出现登录弹窗、验证码)暂停,等待人工确认。
4.1 完整可运行代码
#!/usr/bin/env python3 # 文件名: tiktok_follower.py import time from phone_agent.adb import ADBConnection from phone_agent.client import PhoneAgentClient from phone_agent.workflow import TaskOrchestrator def safe_follow_tiktok(douyin_id: str, device_id: str, server_url: str): """ 安全关注抖音账号的工作流 Args: douyin_id: 抖音号,如 "dycwo11nt61d" device_id: ADB设备ID server_url: 云服务地址,如 "http://192.168.1.200:8800/v1" """ # 初始化所有组件 conn = ADBConnection() client = PhoneAgentClient(base_url=server_url, model="autoglm-phone-9b") orchestrator = TaskOrchestrator(client, conn) try: # 1. 建立设备连接 print("正在连接设备...") success, msg = conn.connect(device_id) if not success: raise RuntimeError(f"设备连接失败: {msg}") print(f" 已连接: {msg}") # 2. 启动抖音(确保APP在前台) print("正在启动抖音...") orchestrator.run_adb_command("adb shell am force-stop com.ss.android.ugc.aweme") time.sleep(2) orchestrator.run_adb_command("adb shell am start -n com.ss.android.ugc.aweme/.main.MainActivity") time.sleep(5) # 等待APP加载 # 3. 执行核心关注任务 print(f"正在执行关注任务: {douyin_id}") result = client.execute_task( instruction=f"在抖音中搜索抖音号 '{douyin_id}',进入其主页,点击关注按钮", device_id=device_id, # 关键参数:启用人工接管 human_intervention_enabled=True ) if result.status == "human_intervention_needed": print(" 需要人工介入!") print(f"原因: {result.error}") print("请手动处理后,按回车键继续...") input() # 等待用户按键 # 用户处理完后,继续执行剩余步骤(可选) # result = client.resume_task(result.task_id) print(f" 任务状态: {result.status}") if result.status == "success": print(f" 已成功关注 '{douyin_id}'!") print(f"共执行 {len(result.steps)} 步操作") else: print(f"❌ 任务失败: {result.error}") except Exception as e: print(f"❌ 执行过程中发生严重错误: {e}") finally: # 无论成功失败,都断开连接 conn.disconnect(device_id) print("🔌 连接已断开") if __name__ == "__main__": # 配置你的参数 DEVICE_ID = "ABC123456789" # 替换为你的设备ID SERVER_URL = "http://192.168.1.200:8800/v1" # 替换为你的服务器地址 # 开始关注 safe_follow_tiktok("dycwo11nt61d", DEVICE_ID, SERVER_URL)4.2 代码亮点解析
- 防御性编程:每一步都检查返回值,用
try/except包裹,确保异常不会导致设备连接悬空。 - 状态感知:
human_intervention_enabled=True参数是关键。当AI遇到无法处理的弹窗(如登录框、短信验证码),它不会强行点击,而是优雅地暂停,并将控制权交还给你。 - 资源清理:
finally块确保conn.disconnect()一定会被执行,避免ADB连接泄漏。 - 可读性强:函数命名、注释、打印信息全部面向开发者,一眼就能看懂流程。
运行此脚本,你将获得一个具备“人类判断力”的自动化工具,远超简单脚本的价值。
5. 调试与排错:让API调用不再“黑盒”
API调用失败时,别急着重装。掌握以下调试方法,90%的问题都能快速定位。
5.1 分层排查法(推荐顺序)
| 层级 | 检查项 | 快速验证命令/代码 | 典型症状 |
|---|---|---|---|
| 设备层 | ADB是否在线 | adb devices | list_connected_devices()返回空列表 |
| 网络层 | 云服务是否可达 | curl -v http://<ip>:8800/health | PhoneAgentClient初始化时报ConnectionError |
| 模型层 | 模型是否加载成功 | curl http://<ip>:8800/v1/models | execute_task返回ModelNotReadyError |
| 指令层 | 指令是否清晰无歧义 | 在命令行用python main.py ... "指令"测试 | result.error提示"无法理解指令" |
5.2 日志增强技巧
官方日志较简略。在client.execute_task()前,添加以下代码,获取更详细的上下文:
import logging logging.basicConfig(level=logging.DEBUG) # 开启DEBUG日志 # 或者,只对特定模块开启 logging.getLogger("phone_agent.client").setLevel(logging.DEBUG)这将打印出完整的HTTP请求头、请求体、响应体,让你看清AI到底收到了什么、又返回了什么。
5.3 常见报错与解决方案
DeviceDisconnectedError: Device ABC123456789 is offline
→ 原因:手机被拔掉、USB线松动、WiFi断开。
→ 解决:运行conn.connect(device_id)重新连接,或检查物理连接。requests.exceptions.Timeout: HTTPConnectionPool... Read timed out
→ 原因:云服务器负载高、网络延迟大、或任务过于复杂超时。
→ 解决:增大timeout参数(如timeout=600),或优化指令(如拆分为“先打开APP,再搜索”两步)。result.status == "failed" and "element not found" in result.error
→ 原因:APP界面与训练数据差异大,AI无法定位目标元素。
→ 解决:提供更精确的指令(如“点击右上角的放大镜图标”),或使用ScreenCapture截图后,用OpenCV辅助定位。
6. 总结:从API使用者到AI Agent架构师
通过本文的实战,你应该已经明白:Open-AutoGLM的Python API,远不止是命令行的替代品。它是一套面向工程实践的AI Agent开发框架。
- 你学会了分层思维:从设备连接、屏幕交互、AI调度到工作流编排,每一层都职责分明,可单独测试、可自由组合。
- 你掌握了生产级实践:异常处理、状态感知、资源清理、日志调试——这些不是锦上添花,而是让自动化真正落地的基石。
- 你拥有了扩展能力:
ScreenCapture返回的PIL图像,是接入你自己的CV模型的入口;TaskOrchestrator的灵活性,让你能构建出任何业务所需的自动化流水线。
下一步,你可以:
- 将
TikTokFollower封装为Flask Web API,让非技术人员也能通过网页提交任务; - 结合
ScreenCapture与OCR库(如PaddleOCR),实现“读取屏幕上文字并决策”的增强能力; - 将
result.steps存入数据库,构建自动化操作的审计日志系统。
AI操作手机,不再是科幻。它是一段段可调试、可维护、可进化的Python代码。而你,已经拿到了那把钥匙。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。