苏州高端网站建设咨询,网站建设基本完成,wordpress zhai主题,卖产品怎么做网站智谱AI-OpenAutoGLM-开源的手机智能体针对智谱AI-AutoGLM-开源的手机智能体#xff0c;整理代码拆解步骤#xff0c;【手机手势】【手机截屏】1-思路整理
1#xff09;先把手机和电脑的连接软件安装上【ADB(电脑安装)】【ADBKeyboard(手机安装)】2#xff09;然后手机打开调…智谱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-9Bhttps://ai.gitcode.com/zai-org/AutoGLM-Phone-9BAutoGLM: Autonomous Foundation Agents for GUIs论文https://arxiv.org/pdf/2411.00820Android手机桥接软件ADB(电脑安装-已验证)https://dl.google.com/android/repository/platform-tools-latest-darwin.zipAndroid手机桥接软件ADBKeyboard(手机安装-已验证)https://gitee.com/enzoism/ADBKeyBoardGoogle 提供官方的adb/fastboot独立工具包[Win/macOS/Linux]https://blog.csdn.net/OpenStack_/article/details/87368289adb下载安装及使用教程https://blog.csdn.net/mowang_hongci/article/details/1363586313-动手实操1-ADB操作-手机手势ADB进行手机的手势操作-这一块的代码很独立可以理解为独立的工具类1-源码展示Android自动化设备控制工具。importsubprocessimporttimefromphone_agent.config.appsimportAPP_PACKAGESfromphone_agent.config.timingimportTIMING_CONFIGdefget_current_app(device_id:str|NoneNone)-str: 获取当前聚焦的应用名称。 Args: device_id: 可选的ADB设备ID用于多设备环境。 Returns: 如果识别到应用则返回应用名称否则返回System Home。 adb_prefix_get_adb_prefix(device_id)resultsubprocess.run(adb_prefix[shell,dumpsys,window],capture_outputTrue,textTrue)outputresult.stdout# 解析窗口焦点信息forlineinoutput.split(\n):ifmCurrentFocusinlineormFocusedAppinline:forapp_name,packageinAPP_PACKAGES.items():ifpackageinline:returnapp_namereturnSystem Homedeftap(x:int,y:int,device_id:str|NoneNone,delay:float|NoneNone)-None: 在指定坐标位置点击。 Args: x: X坐标。 y: Y坐标。 device_id: 可选的ADB设备ID。 delay: 点击后延迟时间秒。如果为None则使用配置的默认值。 ifdelayisNone:delayTIMING_CONFIG.device.default_tap_delay adb_prefix_get_adb_prefix(device_id)subprocess.run(adb_prefix[shell,input,tap,str(x),str(y)],capture_outputTrue)time.sleep(delay)defdouble_tap(x:int,y:int,device_id:str|NoneNone,delay:float|NoneNone)-None: 在指定坐标位置双击。 Args: x: X坐标。 y: Y坐标。 device_id: 可选的ADB设备ID。 delay: 双击后延迟时间秒。如果为None则使用配置的默认值。 ifdelayisNone:delayTIMING_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_outputTrue)time.sleep(TIMING_CONFIG.device.double_tap_interval)subprocess.run(adb_prefix[shell,input,tap,str(x),str(y)],capture_outputTrue)time.sleep(delay)deflong_press(x:int,y:int,duration_ms:int3000,device_id:str|NoneNone,delay:float|NoneNone,)-None: 长按指定坐标位置。 Args: x: X坐标。 y: Y坐标。 duration_ms: 按压持续时间毫秒。 device_id: 可选的ADB设备ID。 delay: 长按后延迟时间秒。如果为None则使用配置的默认值。 ifdelayisNone:delayTIMING_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_outputTrue,)time.sleep(delay)defswipe(start_x:int,start_y:int,end_x:int,end_y:int,duration_ms:int|NoneNone,device_id:str|NoneNone,delay:float|NoneNone,)-None: 从起始坐标滑动到结束坐标。 Args: start_x: 起始X坐标。 start_y: 起始Y坐标。 end_x: 结束X坐标。 end_y: 结束Y坐标。 duration_ms: 滑动持续时间毫秒如果为None则自动计算。 device_id: 可选的ADB设备ID。 delay: 滑动后延迟时间秒。如果为None则使用配置的默认值。 ifdelayisNone:delayTIMING_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_msint(dist_sq/1000)duration_msmax(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_outputTrue,)time.sleep(delay)defback(device_id:str|NoneNone,delay:float|NoneNone)-None: 按下返回键。 Args: device_id: 可选的ADB设备ID。 delay: 按下返回键后的延迟时间秒。如果为None则使用配置的默认值。 ifdelayisNone:delayTIMING_CONFIG.device.default_back_delay adb_prefix_get_adb_prefix(device_id)subprocess.run(adb_prefix[shell,input,keyevent,4],capture_outputTrue)time.sleep(delay)defhome(device_id:str|NoneNone,delay:float|NoneNone)-None: 按下主页键。 Args: device_id: 可选的ADB设备ID。 delay: 按下主页键后的延迟时间秒。如果为None则使用配置的默认值。 ifdelayisNone:delayTIMING_CONFIG.device.default_home_delay adb_prefix_get_adb_prefix(device_id)subprocess.run(adb_prefix[shell,input,keyevent,KEYCODE_HOME],capture_outputTrue)time.sleep(delay)deflaunch_app(app_name:str,device_id:str|NoneNone,delay:float|NoneNone)-bool: 通过应用名称启动应用。 Args: app_name: 应用名称必须存在于APP_PACKAGES中。 device_id: 可选的ADB设备ID。 delay: 启动后的延迟时间秒。如果为None则使用配置的默认值。 Returns: 如果成功启动应用返回True否则返回False应用未找到。 ifdelayisNone:delayTIMING_CONFIG.device.default_launch_delayifapp_namenotinAPP_PACKAGES:returnFalseadb_prefix_get_adb_prefix(device_id)packageAPP_PACKAGES[app_name]subprocess.run(adb_prefix[shell,monkey,-p,package,-c,android.intent.category.LAUNCHER,1,],capture_outputTrue,)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音乐...)successlaunch_app(QQ音乐)ifsuccess:print(成功启动QQ音乐)else:print(启动QQ音乐失败)# 等待应用启动time.sleep(3)# 2. 测试获取当前应用print(\n2. 测试获取当前应用...)current_appget_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_ms2000)print(执行长按操作 (500, 500)持续2秒)# 等待操作完成time.sleep(2)# 6. 测试滑动操作print(\n6. 测试滑动操作...)# 从屏幕上方中间向下滑动swipe(500,300,500,800,duration_ms1000)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音乐...)successlaunch_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设备屏幕截图工具。importbase64importosimportsubprocessimporttempfileimportuuidfromdataclassesimportdataclassfromioimportBytesIOfromPILimportImagedataclassclassScreenshot:表示已捕获的截图。base64_data:strwidth:intheight:intis_sensitive:boolFalsedefget_screenshot(device_id:str|NoneNone,timeout:int10)-Screenshot: 从连接的Android设备捕获屏幕截图。 参数: device_id: 可选的ADB设备ID用于多设备环境。 timeout: 截图操作的超时时间秒。 返回: 包含base64数据和尺寸的Screenshot对象。 注意: 如果截图失败例如在支付页面等敏感屏幕将返回一张黑色占位图并设置is_sensitiveTrue。 temp_pathos.path.join(tempfile.gettempdir(),fscreenshot_{uuid.uuid4()}.png)adb_prefix_get_adb_prefix(device_id)try:# 执行截图命令resultsubprocess.run(adb_prefix[shell,screencap,-p,/sdcard/tmp.png],capture_outputTrue,textTrue,timeouttimeout,)# 检查截图失败情况如敏感屏幕outputresult.stdoutresult.stderrifStatus: -1inoutputorFailedinoutput:return_create_fallback_screenshot(is_sensitiveTrue)# 将截图拉取到本地临时路径subprocess.run(adb_prefix[pull,/sdcard/tmp.png,temp_path],capture_outputTrue,textTrue,timeout5,)ifnotos.path.exists(temp_path):return_create_fallback_screenshot(is_sensitiveFalse)# 读取并编码图像imgImage.open(temp_path)width,heightimg.size bufferedBytesIO()img.save(buffered,formatPNG)base64_database64.b64encode(buffered.getvalue()).decode(utf-8)# 清理临时文件os.remove(temp_path)returnScreenshot(base64_database64_data,widthwidth,heightheight,is_sensitiveFalse)exceptExceptionase:print(f截图错误:{e})return_create_fallback_screenshot(is_sensitiveFalse)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_height1080,2400black_imgImage.new(RGB,(default_width,default_height),colorblack)bufferedBytesIO()black_img.save(buffered,formatPNG)base64_database64.b64encode(buffered.getvalue()).decode(utf-8)returnScreenshot(base64_database64_data,widthdefault_width,heightdefault_height,is_sensitiveis_sensitive,)2-测试代码fromphone_agent.adb.screenshot_util.screenshot_utilimportget_screenshotif__name____main__:screenshotget_screenshot()print(f截图宽度:{screenshot.width})print(f截图高度:{screenshot.height})print(f截图是否敏感:{screenshot.is_sensitive})日志打印截图宽度:1176截图高度:2400截图是否敏感: False