news 2026/2/24 20:18:49

AutoGLMPhone07-源码-ADB手势

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AutoGLMPhone07-源码-ADB手势

智谱AI-OpenAutoGLM-开源的手机智能体

针对智谱AI-AutoGLM-开源的手机智能体,整理代码拆解步骤,【手机手势】+【手机截屏】


1-思路整理

  • 1)先把手机和电脑的连接软件安装上【ADB(电脑安装)】+【ADBKeyboard(手机安装)】
  • 2)然后手机打开调试模式->这个电脑的应用就可以直接操作手机
  • 3)配置智谱AI-AutoGLM-开源的手机智能体的模型(模型地址/模型)
  • 4)运行智谱AI-AutoGLM-开源的手机智能体代码->直接操作手机

2-参考网址

  • 智谱AI-AutoGLM-开源的手机智能体代码:https://gitee.com/enzoism/Open-AutoGLM
  • 智谱AI-AutoGLM-开源的手机智能体模型-Phone-9B:https://ai.gitcode.com/zai-org/AutoGLM-Phone-9B
  • AutoGLM: Autonomous Foundation Agents for GUIs论文:https://arxiv.org/pdf/2411.00820
  • Android手机桥接软件ADB(电脑安装-已验证):https://dl.google.com/android/repository/platform-tools-latest-darwin.zip
  • Android手机桥接软件ADBKeyboard(手机安装-已验证):https://gitee.com/enzoism/ADBKeyBoard
  • Google 提供官方的adb/fastboot独立工具包[Win/macOS/Linux]:https://blog.csdn.net/OpenStack_/article/details/87368289
  • adb下载安装及使用教程:https://blog.csdn.net/mowang_hongci/article/details/136358631

3-动手实操

1-ADB操作-手机手势

ADB进行手机的手势操作->这一块的代码很独立,可以理解为独立的工具类

1-源码展示

"""Android自动化设备控制工具。"""importsubprocessimporttimefromphone_agent.config.appsimportAPP_PACKAGESfromphone_agent.config.timingimportTIMING_CONFIGdefget_current_app(device_id:str|None=None)->str:""" 获取当前聚焦的应用名称。 Args: device_id: 可选的ADB设备ID,用于多设备环境。 Returns: 如果识别到应用则返回应用名称,否则返回"System Home"。 """adb_prefix=_get_adb_prefix(device_id)result=subprocess.run(adb_prefix+["shell","dumpsys","window"],capture_output=True,text=True)output=result.stdout# 解析窗口焦点信息forlineinoutput.split("\n"):if"mCurrentFocus"inlineor"mFocusedApp"inline:forapp_name,packageinAPP_PACKAGES.items():ifpackageinline:returnapp_namereturn"System Home"deftap(x:int,y:int,device_id:str|None=None,delay:float|None=None)->None:""" 在指定坐标位置点击。 Args: x: X坐标。 y: Y坐标。 device_id: 可选的ADB设备ID。 delay: 点击后延迟时间(秒)。如果为None,则使用配置的默认值。 """ifdelayisNone:delay=TIMING_CONFIG.device.default_tap_delay adb_prefix=_get_adb_prefix(device_id)subprocess.run(adb_prefix+["shell","input","tap",str(x),str(y)],capture_output=True)time.sleep(delay)defdouble_tap(x:int,y:int,device_id:str|None=None,delay:float|None=None)->None:""" 在指定坐标位置双击。 Args: x: X坐标。 y: Y坐标。 device_id: 可选的ADB设备ID。 delay: 双击后延迟时间(秒)。如果为None,则使用配置的默认值。 """ifdelayisNone:delay=TIMING_CONFIG.device.default_double_tap_delay adb_prefix=_get_adb_prefix(device_id)subprocess.run(adb_prefix+["shell","input","tap",str(x),str(y)],capture_output=True)time.sleep(TIMING_CONFIG.device.double_tap_interval)subprocess.run(adb_prefix+["shell","input","tap",str(x),str(y)],capture_output=True)time.sleep(delay)deflong_press(x:int,y:int,duration_ms:int=3000,device_id:str|None=None,delay:float|None=None,)->None:""" 长按指定坐标位置。 Args: x: X坐标。 y: Y坐标。 duration_ms: 按压持续时间(毫秒)。 device_id: 可选的ADB设备ID。 delay: 长按后延迟时间(秒)。如果为None,则使用配置的默认值。 """ifdelayisNone:delay=TIMING_CONFIG.device.default_long_press_delay adb_prefix=_get_adb_prefix(device_id)subprocess.run(adb_prefix+["shell","input","swipe",str(x),str(y),str(x),str(y),str(duration_ms)],capture_output=True,)time.sleep(delay)defswipe(start_x:int,start_y:int,end_x:int,end_y:int,duration_ms:int|None=None,device_id:str|None=None,delay:float|None=None,)->None:""" 从起始坐标滑动到结束坐标。 Args: start_x: 起始X坐标。 start_y: 起始Y坐标。 end_x: 结束X坐标。 end_y: 结束Y坐标。 duration_ms: 滑动持续时间(毫秒),如果为None则自动计算。 device_id: 可选的ADB设备ID。 delay: 滑动后延迟时间(秒)。如果为None,则使用配置的默认值。 """ifdelayisNone:delay=TIMING_CONFIG.device.default_swipe_delay adb_prefix=_get_adb_prefix(device_id)ifduration_msisNone:# 根据距离计算持续时间dist_sq=(start_x-end_x)**2+(start_y-end_y)**2duration_ms=int(dist_sq/1000)duration_ms=max(1000,min(duration_ms,2000))# 限制在1000-2000毫秒之间subprocess.run(adb_prefix+["shell","input","swipe",str(start_x),str(start_y),str(end_x),str(end_y),str(duration_ms),],capture_output=True,)time.sleep(delay)defback(device_id:str|None=None,delay:float|None=None)->None:""" 按下返回键。 Args: device_id: 可选的ADB设备ID。 delay: 按下返回键后的延迟时间(秒)。如果为None,则使用配置的默认值。 """ifdelayisNone:delay=TIMING_CONFIG.device.default_back_delay adb_prefix=_get_adb_prefix(device_id)subprocess.run(adb_prefix+["shell","input","keyevent","4"],capture_output=True)time.sleep(delay)defhome(device_id:str|None=None,delay:float|None=None)->None:""" 按下主页键。 Args: device_id: 可选的ADB设备ID。 delay: 按下主页键后的延迟时间(秒)。如果为None,则使用配置的默认值。 """ifdelayisNone:delay=TIMING_CONFIG.device.default_home_delay adb_prefix=_get_adb_prefix(device_id)subprocess.run(adb_prefix+["shell","input","keyevent","KEYCODE_HOME"],capture_output=True)time.sleep(delay)deflaunch_app(app_name:str,device_id:str|None=None,delay:float|None=None)->bool:""" 通过应用名称启动应用。 Args: app_name: 应用名称(必须存在于APP_PACKAGES中)。 device_id: 可选的ADB设备ID。 delay: 启动后的延迟时间(秒)。如果为None,则使用配置的默认值。 Returns: 如果成功启动应用返回True,否则返回False(应用未找到)。 """ifdelayisNone:delay=TIMING_CONFIG.device.default_launch_delayifapp_namenotinAPP_PACKAGES:returnFalseadb_prefix=_get_adb_prefix(device_id)package=APP_PACKAGES[app_name]subprocess.run(adb_prefix+["shell","monkey","-p",package,"-c","android.intent.category.LAUNCHER","1",],capture_output=True,)time.sleep(delay)returnTruedef_get_adb_prefix(device_id:str|None)->list:"""获取带有可选设备标识符的ADB命令前缀。"""ifdevice_id:return["adb","-s",device_id]return["adb"]

2-测试代码

#!/usr/bin/env python3# -*- coding: utf-8 -*-""" device_operation模块的真实使用案例测试 测试所有设备操作手势,包括启动QQ音乐应用 """importosimportsysimporttimefromphone_agent.adb.device_operation_util.device_operation_utilimportlaunch_app,get_current_app,tap,double_tap,long_press,swipe,back,home# 添加当前目录到Python路径sys.path.insert(0,os.path.dirname(os.path.abspath(__file__)))# 定义APP_PACKAGES字典的一部分,仅包含需要的部分APP_PACKAGES={"QQ音乐":"com.tencent.qqmusic",}deftest_device_operations():"""测试所有设备操作手势"""print("开始测试设备操作...")try:# 1. 测试启动QQ音乐print("\n1. 测试启动QQ音乐...")success=launch_app("QQ音乐")ifsuccess:print("成功启动QQ音乐")else:print("启动QQ音乐失败")# 等待应用启动time.sleep(3)# 2. 测试获取当前应用print("\n2. 测试获取当前应用...")current_app=get_current_app()print(f"当前应用:{current_app}")# 3. 测试点击操作 (假设在QQ音乐主界面某个位置点击)print("\n3. 测试点击操作...")# 在屏幕中心附近点击tap(500,500)print("执行点击操作 (500, 500)")# 等待操作完成time.sleep(2)# 4. 测试双击操作print("\n4. 测试双击操作...")# 在屏幕中心附近双击double_tap(500,500)print("执行双击操作 (500, 500)")# 等待操作完成time.sleep(2)# 5. 测试长按操作print("\n5. 测试长按操作...")# 在屏幕中心附近长按long_press(500,500,duration_ms=2000)print("执行长按操作 (500, 500),持续2秒")# 等待操作完成time.sleep(2)# 6. 测试滑动操作print("\n6. 测试滑动操作...")# 从屏幕上方中间向下滑动swipe(500,300,500,800,duration_ms=1000)print("执行滑动操作: 从(500, 300)到(500, 800),持续1秒")# 等待操作完成time.sleep(2)# 7. 测试返回键print("\n7. 测试返回键...")back()print("执行返回键操作")# 等待操作完成time.sleep(2)# 8. 测试主页键print("\n8. 测试主页键...")home()print("执行主页键操作")# 等待操作完成time.sleep(2)# 9. 再次测试启动QQ音乐print("\n9. 再次测试启动QQ音乐...")success=launch_app("QQ音乐")ifsuccess:print("成功启动QQ音乐")else:print("启动QQ音乐失败")# 等待应用启动time.sleep(3)print("\n所有设备操作测试完成!")exceptExceptionase:print(f"测试过程中出现错误:{e}")raiseif__name__=="__main__":test_device_operations()
  • 打印结果
开始测试设备操作...1. 测试启动QQ音乐... 成功启动QQ音乐2. 测试获取当前应用... 当前应用: QQ音乐3. 测试点击操作... 执行点击操作(500,500)4. 测试双击操作... 执行双击操作(500,500)5. 测试长按操作... 执行长按操作(500,500),持续2秒6. 测试滑动操作... 执行滑动操作: 从(500,300)(500,800),持续1秒7. 测试返回键... 执行返回键操作8. 测试主页键... 执行主页键操作9. 再次测试启动QQ音乐... 成功启动QQ音乐 所有设备操作测试完成!

2-ADB操作-手机截屏

1-源码展示

一个独立的工具类方法,直接可以进行屏幕截屏

"""Android设备屏幕截图工具。"""importbase64importosimportsubprocessimporttempfileimportuuidfromdataclassesimportdataclassfromioimportBytesIOfromPILimportImage@dataclassclassScreenshot:"""表示已捕获的截图。"""base64_data:strwidth:intheight:intis_sensitive:bool=Falsedefget_screenshot(device_id:str|None=None,timeout:int=10)->Screenshot:""" 从连接的Android设备捕获屏幕截图。 参数: device_id: 可选的ADB设备ID,用于多设备环境。 timeout: 截图操作的超时时间(秒)。 返回: 包含base64数据和尺寸的Screenshot对象。 注意: 如果截图失败(例如在支付页面等敏感屏幕),将返回一张黑色占位图,并设置is_sensitive=True。 """temp_path=os.path.join(tempfile.gettempdir(),f"screenshot_{uuid.uuid4()}.png")adb_prefix=_get_adb_prefix(device_id)try:# 执行截图命令result=subprocess.run(adb_prefix+["shell","screencap","-p","/sdcard/tmp.png"],capture_output=True,text=True,timeout=timeout,)# 检查截图失败情况(如敏感屏幕)output=result.stdout+result.stderrif"Status: -1"inoutputor"Failed"inoutput:return_create_fallback_screenshot(is_sensitive=True)# 将截图拉取到本地临时路径subprocess.run(adb_prefix+["pull","/sdcard/tmp.png",temp_path],capture_output=True,text=True,timeout=5,)ifnotos.path.exists(temp_path):return_create_fallback_screenshot(is_sensitive=False)# 读取并编码图像img=Image.open(temp_path)width,height=img.size buffered=BytesIO()img.save(buffered,format="PNG")base64_data=base64.b64encode(buffered.getvalue()).decode("utf-8")# 清理临时文件os.remove(temp_path)returnScreenshot(base64_data=base64_data,width=width,height=height,is_sensitive=False)exceptExceptionase:print(f"截图错误:{e}")return_create_fallback_screenshot(is_sensitive=False)def_get_adb_prefix(device_id:str|None)->list:"""获取带有可选设备标识符的ADB命令前缀。"""ifdevice_id:return["adb","-s",device_id]return["adb"]def_create_fallback_screenshot(is_sensitive:bool)->Screenshot:"""当截图失败时创建一张黑色占位图。"""default_width,default_height=1080,2400black_img=Image.new("RGB",(default_width,default_height),color="black")buffered=BytesIO()black_img.save(buffered,format="PNG")base64_data=base64.b64encode(buffered.getvalue()).decode("utf-8")returnScreenshot(base64_data=base64_data,width=default_width,height=default_height,is_sensitive=is_sensitive,)

2-测试代码

fromphone_agent.adb.screenshot_util.screenshot_utilimportget_screenshotif__name__=='__main__':screenshot=get_screenshot()print(f"截图宽度:{screenshot.width}")print(f"截图高度:{screenshot.height}")print(f"截图是否敏感:{screenshot.is_sensitive}")
  • 日志打印
截图宽度:1176截图高度:2400截图是否敏感: False

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/21 21:28:00

闲鱼数据采集实战手册:零基础5分钟搭建自动化爬虫系统

闲鱼数据采集实战手册:零基础5分钟搭建自动化爬虫系统 【免费下载链接】xianyu_spider 闲鱼APP数据爬虫 项目地址: https://gitcode.com/gh_mirrors/xia/xianyu_spider 想要高效获取闲鱼平台海量商品信息?这款基于uiautomator2框架的智能数据采集…

作者头像 李华
网站建设 2026/2/21 4:39:53

Cats Blender插件终极指南:如何在10分钟内完成VRChat模型优化?

Cats Blender插件终极指南:如何在10分钟内完成VRChat模型优化? 【免费下载链接】cats-blender-plugin 项目地址: https://gitcode.com/gh_mirrors/cats/cats-blender-plugin 你是否曾经花费数小时处理模型导入问题,却依然无法让模型在…

作者头像 李华
网站建设 2026/2/20 18:26:43

Sketch MeaXure:颠覆传统设计标注的智能协作解决方案

Sketch MeaXure:颠覆传统设计标注的智能协作解决方案 【免费下载链接】sketch-meaxure 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-meaxure 在现代设计工作流中,Sketch MeaXure作为一款革命性的设计标注插件,彻底解决了设计…

作者头像 李华
网站建设 2026/2/20 5:28:18

爬取某省2019年的疫情数据

1.明确目标 爬取某省2019年的疫情数据: 网站:www.ncovdata.spbeen.com 2.项目创建: 要求说明 使用scrapy命令新建爬虫项目,名称为ncovdata,打开终端,在终端创建项目 scrapy startproject ncovdata3.创建spider文件…

作者头像 李华
网站建设 2026/2/17 10:31:15

DS4Windows终极指南:让PlayStation手柄在PC上完美运行

DS4Windows终极指南:让PlayStation手柄在PC上完美运行 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否遇到过PS5手柄连接电脑后游戏无法识别?或者按键错乱、…

作者头像 李华
网站建设 2026/2/20 22:59:38

魔兽争霸3高效优化指南:专业玩家的180帧稳定方案

魔兽争霸3高效优化指南:专业玩家的180帧稳定方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 前言:优化目标与预期效果 游…

作者头像 李华