用Open-AutoGLM做了个自动打卡机器人,附全过程

用Open-AutoGLM做了个自动打卡机器人,附全过程

本文记录一次真实落地实践:基于智谱开源的 Open-AutoGLM 框架,从零搭建一个能在安卓手机上自动完成企业微信/钉钉打卡任务的 AI 机器人。不讲虚的,只说你真正能复现的每一步。

1. 为什么选它做打卡机器人?

1.1 打卡这件事,其实特别适合AI Agent

你有没有遇到过这些场景?

  • 每天早上8:29手忙脚乱点开企业微信,找“工作台”→“打卡”→“立即打卡”,生怕超时;
  • 出差住酒店WiFi不稳定,App加载慢,手动操作总卡在最后一秒;
  • 连续加班后凌晨回家,第二天闹钟没响,醒来发现已迟到——而打卡系统早已关闭。

传统自动化方案(比如Auto.js、Tasker)需要你写脚本、找坐标、适配不同分辨率、处理弹窗异常……维护成本高得让人放弃。
而 Open-AutoGLM 的核心能力,刚好直击痛点:
看懂界面——不用写XPath或ID,它直接“看”截图理解当前页面;
听懂人话——你只说“在企业微信里打卡”,它自己规划路径:启动App→进工作台→点打卡→确认提交;
跨App联动——如果打卡前要先连公司VPN,它也能自动打开VPN App并点击连接;
出错能兜底——遇到登录页、验证码、网络提示,它会停住并喊你来接管。

这不是概念演示,是我在自己小米13(Android 14)和一台旧华为平板(Android 10)上实测跑通的方案。

1.2 它和普通大模型调用有本质区别

很多人以为:“不就是调个API发张图吗?”
但实际难点全在闭环控制层

  • 图片传过去,模型返回“点击坐标[520,380]”,可这个坐标在你手机上对应哪里?
  • 点完之后页面没变,是点了没反应?还是根本没点到?它怎么判断该重试还是该回退?
  • 企业微信更新后,“打卡”按钮位置变了,旧脚本全废,而它靠视觉理解,天然适配UI变化。

Open-AutoGLM 把这些底层细节都封装好了:ADB连接管理、截图归一化、坐标转换、动作安全解析、敏感页检测、人工接管钩子……你只需要专注“我要它做什么”。


2. 真实环境准备:三步搞定硬件与连接

2.1 我的实测配置(不折腾,照着买)

组件具体型号/版本备注
手机小米13(MIUI 14.0.12,Android 14)开启USB调试后无需Root,稳定支持ADB
电脑MacBook Pro M1(macOS Sonoma 14.5)Windows用户步骤几乎一致,仅命令略有差异
ADB工具platform-tools_r34.0.5-darwin.zip官方下载地址,解压后路径加入PATH
网络手机与电脑同连2.4GHz WiFi避免5GHz频段导致ADB无线连接掉线
关键提醒:别用模拟器!企业微信/钉钉对模拟器有强检测,常报“设备异常”。真机才能稳定运行。

2.2 手机端设置:5分钟完成(附避坑指南)

按顺序操作,每步都有验证点:

  1. 开启开发者模式
    设置 → 关于手机 → 连续点击“版本号”7次 → 弹出“您现在处于开发者模式”。
  2. 开启USB调试
    设置 → 更多设置 → 开发者选项 → 勾选“USB调试” → 同时勾选“USB调试(安全设置)”(此选项常被忽略,不勾选会导致ADB识别为unauthorized device)。
  3. 安装ADB Keyboard(中文输入关键!)
    • 下载 ADB Keyboard v1.1 APK
    • 手机安装后,进入:设置 → 蓝牙与设备 → 输入法 → 管理输入法 → 启用“ADB Keyboard” → 设为默认输入法
    • 验证:电脑终端执行 adb shell input text "test",手机输入框应出现“test”
  4. 授权ADB连接(首次必做)
    USB线连接手机与电脑 → 终端执行 adb devices → 手机弹出“允许USB调试”对话框 → 勾选“始终允许”并点确定 → 终端显示 xxxxxx device 即成功。
常见失败原因:手机弹窗没点“确定”,终端显示 xxxxxx unauthorized;小米/华为等品牌需额外开启“USB安装”和“USB调试(安全设置)”;macOS用户若遇command not found: adb,检查PATH是否包含platform-tools路径(如export PATH=$PATH:/Users/xxx/Downloads/platform-tools)。

2.3 无线ADB连接(告别线缆束缚)

USB线虽稳,但每天插拔麻烦。我最终切换为WiFi连接,全程无感:

# 1. 先用USB连接,启用TCP/IP模式 adb tcpip 5555 # 2. 断开USB线,查看手机IP(设置 → WLAN → 点击当前网络 → IP地址) # 我的手机IP是 192.168.31.123 # 3. 电脑执行连接(替换为你的真实IP) adb connect 192.168.31.123:5555 # 4. 验证(断开USB后仍显示device即成功) adb devices # 输出示例:192.168.31.123:5555 device 
成功后,手机可放桌面任意位置,机器人远程操控。实测延迟<100ms,完全不影响打卡流程。

3. 部署Open-AutoGLM控制端:一行命令启动

3.1 克隆代码并安装依赖

# 克隆官方仓库(注意:不是fork,用原版确保最新修复) git clone https://github.com/zai-org/Open-AutoGLM cd Open-AutoGLM # 创建虚拟环境(推荐,避免包冲突) python3 -m venv venv source venv/bin/activate # macOS/Linux # venv\Scripts\activate # Windows # 安装核心依赖(requirements.txt已预置所有必需项) pip install -r requirements.txt pip install -e . # 安装为可编辑包,便于后续调试 
依赖说明:adb-shell:轻量ADB封装,比原生adb命令更易集成;Pillow:高效处理截图缩放与base64编码;openai:兼容OpenAI API格式,方便对接各类大模型服务;pydantic:严格校验配置,减少运行时错误。

3.2 获取可用的AI模型服务(两种方式)

Open-AutoGLM本身不提供模型,需自行部署或调用云服务。我实测了两种最省心的方案:

方案A:使用智谱官方托管API(推荐新手)
  • 访问 Zhipu AI Console 注册账号;
  • 创建API Key(免费额度足够日常打卡);
  • 模型选择 autoglm-phone-9b(专为手机Agent优化的9B视觉语言模型);
  • API Endpoint:https://open.bigmodel.cn/api/paas/v4/chat/completions
优势:零部署、免GPU、响应快(首token<0.3s);
❌ 注意:需科学上网,国内用户可考虑方案B。
方案B:本地vLLM部署(适合有显卡用户)
# 1. 安装vLLM(需NVIDIA GPU,显存≥12GB) pip install vllm # 2. 启动模型服务(以autoglm-phone-9b为例) python -m vllm.entrypoints.openai.api_server \ --model zai-org/AutoGLM-Phone-9B \ --tensor-parallel-size 1 \ --max-model-len 4096 \ --port 8000 # 3. 服务启动后,API地址即为 http://localhost:8000/v1 
优势:数据不出本地、响应更稳定、可离线运行;
提示:模型权重需从HuggingFace下载(zai-org/AutoGLM-Phone-9B),首次加载约15分钟。

3.3 配置环境变量(让命令更简洁)

为避免每次运行都输长参数,我设置了环境变量:

# macOS/Linux 写入 ~/.zshrc 或 ~/.bash_profile echo 'export PHONE_AGENT_BASE_URL="https://open.bigmodel.cn/api/paas/v4/chat/completions"' >> ~/.zshrc echo 'export PHONE_AGENT_MODEL="autoglm-phone-9b"' >> ~/.zshrc echo 'export PHONE_AGENT_API_KEY="your_api_key_here"' >> ~/.zshrc echo 'export PHONE_AGENT_DEVICE_ID="192.168.31.123:5555"' >> ~/.zshrc source ~/.zshrc # Windows 用户在系统环境变量中添加同名变量 
设置后,main.py会自动读取,无需再传--base-url等参数。

4. 打卡机器人实战:从指令到完成的完整链路

4.1 最简启动命令(验证通路)

先跑通最基础流程,确认环境无误:

# 在Open-AutoGLM根目录下执行 python main.py "打开企业微信,进入工作台,找到打卡应用并点击立即打卡" 
正常输出应包含:
Step 1: Taking screenshot...
Step 1: Sending to model...
<think>当前在手机桌面,需要启动企业微信</think>
<answer>do(action="Launch", app="企业微信")</answer>
Step 1: Executing Tap on [520, 380]...

...(后续步骤)
Task finished: 打卡成功!

4.2 我的打卡指令优化(提升成功率的关键)

原始指令“打卡”太模糊,AI可能误判。我通过三次迭代,总结出高成功率指令模板:

指令写法问题优化后指令效果
“打卡”未指定App,AI可能打开钉钉或飞书“在企业微信中完成上班打卡”明确App与动作
“打开企业微信打卡”未说明打卡类型(上班/下班/外勤)“在企业微信工作台中,点击‘打卡’应用,选择‘上班打卡’并提交”指定路径与选项
上述指令企业微信新版UI将“打卡”改名为“考勤打卡”“在企业微信工作台中,找到‘考勤打卡’应用,点击进入后选择‘上班打卡’并确认提交”匹配真实UI文案
实测数据:优化后单次打卡成功率从72%提升至99.3%(100次测试仅1次因网络抖动失败)。

4.3 完整打卡过程拆解(以企业微信为例)

下面是我截取的真实日志,标注了每一步发生了什么:

Step 1: Taking screenshot... Step 1: Sending to model... <think>当前在手机桌面,需要启动企业微信。查找图标文字“企业微信”或“WeWork”。</think> <answer>do(action="Tap", element=[520, 380])</answer> Step 1: Executing Tap on [520, 380]... Step 2: Taking screenshot... <think>已进入企业微信首页,顶部有“工作台”Tab。点击“工作台”进入。</think> <answer>do(action="Tap", element=[500, 180])</answer> Step 2: Executing Tap on [500, 180]... Step 3: Taking screenshot... <think>当前在工作台页面,滚动查找“考勤打卡”应用图标。图标下方文字为“考勤打卡”。</think> <answer>do(action="Swipe", start=[500, 2000], end=[500, 800])</answer> Step 3: Executing Swipe... Step 4: Taking screenshot... <think>已看到“考勤打卡”图标,位于屏幕中部偏右。点击该图标。</think> <answer>do(action="Tap", element=[780, 1250])</answer> Step 4: Executing Tap on [780, 1250]... Step 5: Taking screenshot... <think>进入考勤打卡页面,有“上班打卡”按钮。按钮文字清晰可见,点击它。</think> <answer>do(action="Tap", element=[540, 1620])</answer> Step 5: Executing Tap on [540, 1620]... Step 6: Taking screenshot... <think>弹出打卡确认框,有“确定打卡”按钮。点击确认。</think> <answer>do(action="Tap", element=[540, 1980])</answer> Step 6: Executing Tap on [540, 1980]... Step 7: Taking screenshot... <think>打卡成功页面显示“打卡成功”绿色提示。任务完成。</think> <answer>finish(message="打卡成功!")</answer> Task finished: 打卡成功! 
关键观察:AI全程基于实时截图决策,非硬编码坐标;滑动(Swipe)操作自动计算起止点,适配不同屏幕高度;最终finish()前,它会主动验证结果页文案,而非盲目点击后就结束。

4.4 处理常见异常场景(我的实战经验)

场景1:企业微信要求重新登录
  • 现象:Step 2截图显示登录页,AI输出do(action="Take_over", message="请手动登录企业微信")
  • 应对:机器人暂停,我在手机上输入账号密码,点“登录” → 回车确认 → 机器人继续执行。
场景2:打卡页面加载慢
  • 现象:Step 4截图为空白或半加载状态,AI连续3次Wait后仍无按钮;
  • 应对:在phone_agent/config/prompts_zh.py中,将页面未加载最多Wait三次规则改为五次,并增加Wait(duration=3000)毫秒级等待。
场景3:定位服务未开启(外勤打卡必需)
  • 现象:Step 5点击“上班打卡”后,弹出系统提示“请开启定位服务”;
  • 应对:提前在手机设置中开启“定位服务”+“企业微信”权限;或修改指令为:“先开启手机定位,再在企业微信中完成上班打卡”。
核心原则:把AI当实习生,不是全自动流水线。给它明确指令、预置好环境、留好接管入口,成功率远高于追求100%无人值守。

5. 进阶技巧:让机器人更聪明、更省心

5.1 定制化Prompt(3行代码提升鲁棒性)

默认Prompt对“打卡”理解较泛。我在phone_agent/config/prompts_zh.py中微调了系统提示词:

# 在SYSTEM_PROMPT末尾追加(原文件第42行附近) """ 补充规则: - 若任务涉及“打卡”,必须确认当前时间是否在打卡有效时段内(通常为8:00-9:00),否则先提醒用户。 - 若页面出现“网络异常”、“加载失败”等提示,优先执行“Back”返回重试,而非强行点击。 - 对“企业微信”和“钉钉”两个App,优先使用其官方名称,不接受“企微”、“DD”等缩写。 """ 
效果:机器人开始主动判断时间,早于8:00会输出finish(message="当前时间未到打卡时段,请稍后再试"),避免无效操作。

5.2 自动化定时触发(Mac/Linux一键部署)

用系统cron实现每天8:29自动打卡:

# 编辑定时任务 crontab -e # 添加以下行(每天8:29执行) 29 8 * * * cd /path/to/Open-AutoGLM && source venv/bin/activate && python main.py "在企业微信中完成上班打卡" >> /tmp/checkin.log 2>&1 
验证:crontab -l 查看任务,tail -f /tmp/checkin.log 实时监控日志。

5.3 多设备并行打卡(家庭/团队场景)

我家有两部手机(我的小米13 + 爱人的iPhone SE),她用钉钉打卡。Open-AutoGLM支持多设备并发:

# 终端1:运行小米13打卡 PHONE_AGENT_DEVICE_ID="192.168.31.123:5555" python main.py "在企业微信中完成上班打卡" # 终端2:运行iPhone SE打卡(需搭配WebDriverAgent,此处略,重点展示思路) PHONE_AGENT_DEVICE_ID="192.168.31.124:8100" python main.py "在钉钉中完成上班打卡" 
提示:iPhone需额外部署WebDriverAgent并配置iOS-ADB桥接,复杂度较高,建议安卓设备优先。

6. 性能与稳定性实测报告

6.1 关键指标(基于100次连续打卡)

指标数据说明
平均耗时28.4秒/次从命令执行到Task finished,含5次ADB截图+3次模型推理
首屏响应<1.2秒Step 1截图上传后,AI思考开始时间
成功率99.3%1次失败因WiFi瞬时中断,重试即成功
内存占用186MB(峰值)Python进程,无GPU显存占用
ADB稳定性100%无线连接下未发生掉线

6.2 与传统方案对比

方案开发耗时维护成本UI变更适应性多App支持学习门槛
Auto.js脚本8小时+高(每次UI更新需重找坐标)中(需单独写逻辑)中(需学JS)
Tasker+AutoTools12小时+极高(配置繁杂)高(可视化逻辑难调试)
Open-AutoGLM2小时低(指令微调即可)优(视觉理解)优(内置50+App映射)低(自然语言)
结论:对非专业开发者,Open-AutoGLM是目前综合体验最优解——它把AI的“智能”和工程的“可靠”结合得恰到好处。

7. 总结:这不只是个打卡工具,而是你的手机AI助理起点

7.1 我收获的远不止“自动打卡”

  • 重新理解AI Agent的本质:它不是更聪明的脚本,而是具备“感知-决策-执行-反馈”闭环的数字员工;
  • 掌握多模态落地的关键:图像不是装饰,是决策依据;文本不是指令,是任务上下文;
  • 验证了开源框架的生产力:从克隆到跑通,我只用了不到半天,这在过去不可想象。

7.2 下一步,我想让它做的5件事

  1. 会议提醒+自动入会:检测日历事件,到点自动打开腾讯会议并点击“加入会议”;
  2. 消息聚合摘要:每天早8点,汇总企业微信未读消息,用AI生成3句话日报;
  3. 报销单自动填写:拍照发票,OCR识别后自动填入钉钉报销表单;
  4. App健康监测:定期检查企业微信/钉钉更新,自动下载APK并静默安装;
  5. 跨设备协同:手机打卡成功后,自动在Mac桌面弹出通知,并同步到Notion数据库。
最后说一句:技术的价值,不在于它多炫酷,而在于它能否安静地解决你每天重复的烦恼。当你不再为打卡焦虑,那个多出来的30秒,或许就是一杯热咖啡的时间。

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 ZEEKLOG星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Read more

SteamVR Unity插件:为什么它是VR开发的首选解决方案

在当今快速发展的虚拟现实领域,SteamVR Unity插件以其卓越的多平台兼容性和强大的功能集成,成为了众多开发者的首选工具。这款由Valve官方维护的插件不仅简化了VR开发流程,更提供了完整的输入处理和交互系统,让开发者能够专注于创造沉浸式体验而非底层技术细节。 【免费下载链接】steamvr_unity_pluginSteamVR Unity Plugin - Documentation at: https://valvesoftware.github.io/steamvr_unity_plugin/ 项目地址: https://gitcode.com/gh_mirrors/st/steamvr_unity_plugin 快速启动:五分钟完成环境搭建 准备工作清单 * Unity编辑器:5.4及以上版本,推荐使用2019 LTS * SteamVR运行时:确保从Steam平台正确安装 * 插件获取:通过GitCode仓库获取最新版本 安装步骤详解 第一步:获取插件源码 git clone

高飞团队新作!基于高阶CBF的端到端无人机,实现7.5m/s丛林穿越,突破RL安全瓶颈

高飞团队新作!基于高阶CBF的端到端无人机,实现7.5m/s丛林穿越,突破RL安全瓶颈

「强化学习高速避障新范式」 目录 01  主要方法  1. 训练阶段:基于物理先验的奖励塑形 1. Dijkstra全局引导奖励 2. 基于控制障碍函数的安全惩罚  2. 部署阶段:基于高阶控制障碍函数的实时滤波 02  实验结果  1.仿真训练与消融实验  2.基准测试  3.实机飞行验证 03  总结 在无人机高速避障领域,Ego-Planner等传统的模块化规划方法受限于感知-规划-控制的累积延迟,往往难以兼顾高速与安全;而RL等纯端到端的强化学习虽然敏捷,却因缺乏理论上的安全保障而被视为黑盒。 浙江大学高飞老师团队的这项工作,最令人振奋之处在于巧妙地构建了一套混合架构。 * 在训练阶段,利用 Dijkstra 势场 引导 RL 智能体跳出局部极小值陷阱 ,实现了全局可达性; * 在部署阶段,则引入了基于 高阶控制障碍函数(HOCBF)的安全滤波器,将神经网络输出的动作实时投影到可行域内。 这种设计不仅在数学上给出了碰撞避免的严谨证明,更在实测中实现了高达 7.5m/s

Stable Diffusion【实战技巧】:利用Reference Only实现多场景人脸一致

1. 为什么我们需要人脸一致性技术 在AI绘画创作中,最让人头疼的问题之一就是无法保持角色形象的一致性。想象一下,你正在为小说创作插图,或者为游戏设计角色,每次生成的图片中人物长相都不一样,这简直是一场灾难。我刚开始用Stable Diffusion时就经常遇到这个问题,生成十张图能有十张不同的脸,根本没法用在连续性的创作中。 传统方法中,固定Seed值是最简单的尝试。我实测过这个方法,确实能让生成的人物看起来相似,但问题在于它会把整个画面都固定住 - 包括姿势、背景、服装所有细节。这就好比拍照时用了同样的底片,只是稍微调了下颜色,完全达不到"同一个人在不同场景"的需求。 LORA模型是另一个常见选择,但实际操作中我发现几个痛点:首先,训练一个高质量的LORA需要大量素材和调参经验,对新手很不友好;其次,现成的LORA模型效果参差不齐,很多模型即使把权重调到1,生成的脸还是会有明显差异。更不用说当你想混合多个LORA特征时,结果往往惨不忍睹。 2. Reference Only功能的核心优势 ControlNet的Reference Only功能简直是解决这个痛点的神器。它

探索RISC-V处理器FPGA实现:高性能开源核心的硬件部署实践

探索RISC-V处理器FPGA实现:高性能开源核心的硬件部署实践 【免费下载链接】XiangShanOpen-source high-performance RISC-V processor 项目地址: https://gitcode.com/GitHub_Trending/xia/XiangShan 在嵌入式系统开发中,如何快速验证RISC-V架构的设计创新?如何在FPGA平台上实现高性能处理器原型?这些问题一直困扰着硬件工程师。本文将以香山(XiangShan)开源处理器为研究对象,通过实验方式探索基于FPGA的RISC-V部署与验证全流程,为开源处理器的硬件实现提供实践参考。 环境适配指南:从源码到FPGA原型的准备工作 开发环境配置 香山处理器采用Chisel语言(硬件构造语言)编写,需要先配置Scala开发环境。以下是基础环境准备步骤: # 克隆项目代码(适用场景:首次获取香山源码) git clone https://gitcode.com/GitHub_Trending/xia/XiangShan # 进入项目目录 cd XiangShan # 安装项目依赖