Yyds.Auto 是一个基于 ROOT/SHELL 权限的 Python 安卓自动化框架。脚本在设备端独立运行,通过 from yyds_auto import * 导入所有 API。支持英文和中文两套函数名,按键精灵用户也能轻松上手。
| 1 | from yyds_auto import * |
| 2 | |
| 3 | # 获取屏幕尺寸 |
| 4 | w, h = device_get_screen_size() |
| 5 | print(f"屏幕: {w}x{h}") |
| 6 | |
| 7 | # 点击屏幕中心 |
| 8 | click(w // 2, h // 2) |
| 9 | |
| 10 | # OCR 识别屏幕文字 |
| 11 | results = ocr() |
| 12 | for r in results: |
| 13 | print(r.text, r.x, r.y) |
| 1 | from yyds_auto import * |
| 2 | |
| 3 | # 获取屏幕尺寸 |
| 4 | 宽, 高 = 屏幕尺寸() |
| 5 | print(f"屏幕: {宽}x{高}") |
| 6 | |
| 7 | # 点击屏幕中心 |
| 8 | 点击(宽 // 2, 高 // 2) |
| 9 | |
| 10 | # OCR 识别屏幕文字 |
| 11 | 结果 = 文字识别() |
| 12 | for r in 结果: |
| 13 | print(r.text, r.x, r.y) |
最少两个文件即可运行。完整说明见左侧「工程创建」。
| 1 | my_project/ |
| 2 | ├── main.py # 脚本入口(必需) |
| 3 | ├── project.config # 工程配置(必需) |
| 4 | ├── ui.yml # App 配置界面(推荐) |
| 5 | ├── requirements.txt # pip 依赖(可选) |
| 6 | └── res/ # 找图/模型资源(可选) |
第一次只走这三步。打包 APK 是之后分发用的,不是入门步骤。
手机安装 App,用 ROOT 或 ADB 拉起引擎,确认 61140 可访问。细节见「第一次运行」。
桌面点「加载示例工程」,再点「推送并运行」。不要从打包 APK 开始。
日志在设备悬浮窗和 IDE 底部。停止用 IDE 或 App 的停止按钮。
工程是一组推到手机上运行的脚本文件。最少只要 main.py + project.config。推送后位于设备 /storage/emulated/0/Yyds.Py/工程名/。
打开「脚本项目」,选一个空目录新建,或点「加载示例工程」。会生成 main.py 与 project.config。
在 Yyds.Auto 首页的工程列表里新建。工程直接落在设备 /storage/emulated/0/Yyds.Py/。
打开开发助手,选中在线设备后点「新建项目」。名称仅支持字母、数字、下划线、中划线。
运行必需的是 main.py 与 project.config;其余为推荐或 IDE 辅助文件。
| 1 | my_project/ |
| 2 | ├── main.py # 脚本入口(必需) |
| 3 | ├── project.config # 工程配置(必需) |
| 4 | ├── ui.yml # App 配置界面(推荐) |
| 5 | ├── requirements.txt # pip 依赖(可选) |
| 6 | └── res/ # 找图/模型资源(可选) |
| 7 | └── button.png |
| 文件 | 是否必需 | 作用 |
|---|---|---|
| main.py | 必需 | 入口脚本。推送并运行时执行这个文件。 |
| project.config | 必需 | INI 配置:工程名、版本、调试设备 IP。 |
| ui.yml | 推荐 | App 内展示的开关/输入框。脚本用 读取配置("check-enable") 读取。 |
| requirements.txt | 可选 | pip 依赖列表,推送到设备后可在 Pip 面板安装。 |
| res/ | 可选 | 找图模板等资源,路径相对工程目录。 |
INI 格式,# 开头为注释。PROJECT_NAME 与 PROJECT_VERSION 必填。PC 调试填 DEBUG_DEVICE_IP;USB 可先 adb forward tcp:61140 tcp:61140 再填 127.0.0.1。
| 1 | [default] |
| 2 | PROJECT_NAME=my_project |
| 3 | PROJECT_VERSION=1.0 |
| 4 | # USB: adb forward tcp:61140 tcp:61140 then 127.0.0.1 |
| 5 | DEBUG_DEVICE_IP= |
| 6 | PACK_KEY_WITH_VERSION=false |
没有 ui.yml 也能运行。有则在 App「工程配置」页显示表单。脚本用 读取配置("check-enable") 读取。电脑运行读 ui.yml 默认值。完整说明见「工程配置」。
| 1 | text-notice: |
| 2 | value: "示例工程" |
| 3 | color: "#008305" |
| 4 | size: 16 |
| 5 | |
| 6 | check-enable: |
| 7 | title: "启用功能" |
| 8 | value: true |
| 9 | |
| 10 | select-mode: |
| 11 | title: "运行模式" |
| 12 | value: ["快速演示", "完整流程"] |
| 13 | |
| 14 | edit-user: |
| 15 | title: "账号" |
| 16 | value: "demo" |
推送到手机后目录为 /storage/emulated/0/Yyds.Py/<工程名>/。开机自启应等 61140 起来后请求 GET http://127.0.0.1:61140/project/start?name=工程名。
脚本在手机上跑,不在电脑上跑。先让引擎起来,再用桌面加载示例并推送并运行。设备脚本一律 from yyds_auto import *。
安装 Yyds.Auto App。有 ROOT 时 App 会拉起 yyds.keep → yyds.auto 与 yyds.py(端口 61140)。无 ROOT 时用 ADB/SHELL 激活。引擎没起来时,任何 click / ocr 都会失败。
手机本机访问 http://127.0.0.1:61140/project/list 有 JSON 即表示 61140 已起来。
| 1 | # on the phone (or adb shell) |
| 2 | wget -qO- http://127.0.0.1:61140/project/list |
| 3 | |
| 4 | # USB from the PC |
| 5 | adb forward tcp:61140 tcp:61140 |
| 6 | wget -qO- http://127.0.0.1:61140/project/list |
adb forward tcp:61140 tcp:61140
同一网段,填 App / 桌面列表里的手机 IP
USB:电脑执行 adb forward tcp:61140 tcp:61140,DEBUG_DEVICE_IP 填 127.0.0.1。不要填局域网 IP。
WiFi:电脑与手机同一网段,DEBUG_DEVICE_IP 填手机 IP(App 或桌面设备列表可见)。
桌面 YY畅控 → 加载示例工程 → 选中设备 → 推送并运行。网页控制台等会了再换。
桌面「脚本项目」里点加载示例,得到带 main.py 的入门工程。
把工程推到手机 /storage/emulated/0/Yyds.Py/ 并启动。设备上应弹出 toast。
print 出现在设备悬浮窗,也出现在桌面 IDE 底部日志。
停止:桌面或 App 点停止。不要用杀进程当日常手段。打包独立 APK 是分发步骤,不是第一次运行。
设备脚本用 from yyds_auto import *(click / 点击)。d = yyds_auto.connect(); d.click() 是 PC 端 OOP SDK,不能当设备裸函数抄。
引擎起来后把这段放进 main.py 再推送。找不到字就改超时或换更短的词。息屏时先点不了。
open_app 打开设置后,wait_and_click_text 点高亮这一行。
| 1 | from yyds_auto import * |
| 2 | |
| 3 | open_app("com.android.settings") |
| 4 | if wait_and_click_text("设置", timeout=10): |
| 5 | toast("clicked") |
| 6 | else: |
| 7 | toast("text not found") |
wget -qO- http://127.0.0.1:61140/project/list 失败就先激活,不要改脚本。import yyds_auto 失败:脚本必须推到设备跑。电脑上要装 yyds-auto 或配置 shims extraPaths,那是 PC 调试,不是设备运行时。[OCR] Umi-OCR 即成功。adb forward tcp:61140 tcp:61140 且 IP 为 127.0.0.1。所有英文 API 都有对应的中文别名,from yyds_auto import * 后即可直接使用。中文和英文函数完全等价,参数和返回值一致,可以混合使用。
| 分类 | 中文 | 英文 |
|---|---|---|
| 触摸 | 点击 / 双击 / 长按 / 滑动 | click / click_double / long_press / swipe |
| 按键 | 返回键 / 主页键 / 确认键 | key_back / key_home / key_confirm |
| OCR | 截图 / 文字识别 / 屏幕找字 | screenshot / ocr / screen_ocr_x |
| 找图 | 找图 / 屏幕找图 / 找图点击 | screen_find_image / screen_find_image_x / find_image_click |
| 大漠 | 锁图 / 区域找图 / 找色 RRGGBB | lock_screen / find_pic region / find_color hex |
| 找色 | 找色 / 取色 / 多点取色 | find_color / get_color / get_multi_color |
| 界面节点 | 控件匹配 / 控件存在 | ui_match / ui_exist |
| 工程配置 | 读取配置 / 写入配置 / 重载配置 | read_config / write_config |
| 对话框 | 确认 / 询问 / 提示 | confirm / ask / toast |
| 等待 | 等待文字 / 等待控件 / 等待图片 | wait_for_text / wait_for_ui / wait_for_image |
| 应用 | 打开应用 / 关闭应用 / 是否在应用内 | open_app / stop_app / is_in_app |
| 输入 | 输入文字 / 智能输入 / 复制到剪贴板 | input_text / x_input_text / set_clipboard |
| 设备 | 屏幕尺寸 / 设备型号 / 前台包名 | device_get_screen_size / device_model / device_foreground_package |
| 系统 | 执行命令 / 提示 / 等待 | shell / toast / sleep |
| 网络 | 网页GET / 网页POST / WebSocket连接 | http_get / http_post / websocket_connect |
| 1 | from yyds_auto import * |
| 2 | |
| 3 | # 打开微信 |
| 4 | 打开应用(常用应用["微信"]) |
| 5 | 睡眠(3) |
| 6 | |
| 7 | # 等待首页加载 |
| 8 | 等待文字("微信", "通讯录", timeout=15) |
| 9 | |
| 10 | # 点击发现 |
| 11 | 文字点击("发现") |
| 12 | 睡眠(1) |
| 13 | |
| 14 | # 滑动查找朋友圈 |
| 15 | 滑动找字并点击("朋友圈") |
| 16 | |
| 17 | # 截图保存 |
| 18 | 截图("/sdcard/朋友圈.png") |
| 19 | 提示("操作完成!") |
用过大漠插件的人可以直接按 FindPic / FindColor / LockDisplay 的习惯写。锁一帧再连找,比每次截屏快。找不到时 if r: 为假。透明 PNG、设计稿缩放继续能用。
| 大漠 | Yyds.Auto |
|---|---|
| LockDisplay / UnLockDisplay | 锁图() / 解锁图() |
| FindPic(x1,y1,x2,y2,"a.bmp|b.bmp",sim) | 找图(x1,y1,x2,y2,"img/a.png|img/b.png", 相似度=0.9) |
| FindColor(..., "ff0000-101010") | 找色(x1,y1,x2,y2,"ff0000-101010") |
| Ocr | 文字识别() |
| LeftClick / KeyPress / Delay | 点击 / 按键 / 睡眠 |
| dm.FindPic / dm.FindColor / dm.LockDisplay | from yyds_auto import dm |
点中心用 点击目标(r);点左上角用 点击(r.x, r.y),和 FindPic 的 intX/intY 一样。
| 1 | from yyds_auto import * |
| 2 | |
| 3 | 锁图() |
| 4 | r = 找图(0, 0, 1080, 2400, "img/开始.png|img/开始.jpg", 相似度=0.9) |
| 5 | if r: |
| 6 | 点击目标(r) |
| 7 | c = 找色(0, 0, 200, 80, "ff0000-101010") |
| 8 | if c: |
| 9 | 点击(c.x, c.y) |
| 10 | 解锁图() |
| 11 | |
| 12 | from yyds_auto import dm |
| 13 | dm.LockDisplay() |
| 14 | idx, x, y = dm.FindPic(0, 0, 1080, 2400, "img/开始.png", "000000", 0.9, 0) |
| 15 | if idx >= 0: |
| 16 | dm.MoveTo(x, y) |
| 17 | dm.LeftClick() |
| 18 | dm.UnLockDisplay() |
下面每一条的名字、中文别名和签名都从设备运行时生成。手机上直接调用函数。电脑上若标了 d.名字,就是同一个英文方法。改 API 只改 python-shims,然后运行 python tools/sync_script_api.py。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
展开后加载参数说明和使用案例。
文字识别() 默认走手机 PP-OCR。电脑开着 Umi-OCR 时,可以把截图送到电脑识别(更快)。截图仍在手机上取,只是识别在电脑上算。本机 Python 和设备 Python 都能接;Umi 没开则回退手机 OCR。
1224。脚本 IDE 页头 开发配置 → Umi-OCR(电脑识别)。失焦即保存到工程 project.config 和设备 /sdcard/Yyds.Py/umi_ocr.json。
| 谁在跑脚本 | 地址 | 端口 |
|---|---|---|
| 本机 Python | 127.0.0.1 | 1224 |
| 设备 Python | 电脑局域网 IP | 1224 |
跑文字识别时日志应出现:
| [OCR] Umi-OCR http://127.0.0.1:1224 21 块 |
若写成「Umi-OCR 不可用,回退设备 OCR」,检查 Umi 是否在跑、主机是否允许局域网、IP/端口是否填对。也可用环境变量 YYDS_UMI_OCR=http://主机:端口,或 YYDS_UMI_OCR=0 关掉。
API 不变:结果 = 文字识别(),可选 x,y,w,h 做区域识别。打包 APK 会带上 project.config 里的地址。
| 1 | [default] |
| 2 | PROJECT_NAME=demo |
| 3 | UMI_OCR_HOST=192.168.1.8 |
| 4 | UMI_OCR_PORT=1224 |
拉远程配置、卡密、公告、上报、云控指令。返回 HttpResult:r.状态码 / r.文本 / r.取JSON();if r: 表示 2xx。失败不抛异常。
App 已内置 requests 与 websocket,脚本也可直接 import requests / import websocket。
工程配置是跑之前给操作员填的表单,不是找别人 App 里的按钮(那是「界面节点」)。在 Script IDE 打开 ui.yml 用设计器画组件,推到手机后出现在 App「工程配置」。脚本用 读取配置("check-enable") 读取。
电脑「运行文件」读工程目录里 ui.yml 的默认值。手机运行优先用 App 已保存的 JSON。
在 main.py 里输入 读取配置(" 会补全当前工程的键。命令盘可「插入全部 读取配置()」。示例工程还有 确认.py / 询问.py。
对话框在运行中问用户一句,出现在手机悬浮层上。和工程配置表单不是一回事。
提示() 闪一下就继续。确认() 等到点确定/取消才往下走。询问() 等到输入或取消。
部分机型需打开「悬浮窗」权限。加载示例工程后可单独运行 确认.py / 询问.py。
Yyds.Auto App 内置悬浮控制台,脚本运行时可在屏幕上显示日志、提供停止按钮。脚本中使用 <code>print()</code> 输出的内容会自动显示在悬浮窗中。
| 1 | # print 输出会显示在悬浮控制台 |
| 2 | print("当前步骤: 打开微信") |
| 3 | |
| 4 | # toast 会同时显示系统提示 |
| 5 | toast("操作完成!") |
| 6 | |
| 7 | # toast_print 同时输出到控制台和系统提示 |
| 8 | toast_print("找到目标,准备点击") |
Yyds.Auto 采用设备端独立运行架构,Python 脚本直接在 Android 设备上执行,无需 PC 连接。
PC 控制台 ↔ 设备:ADB 端口转发
设备重启后要自动跑脚本,必须先拉起引擎,再启动工程。官方 Magisk 模块只做第一层;指定工程需要自己写一个很小的模块(或 service.d 脚本)。同一套 zip 可用于 Magisk / KernelSU / APatch。
App 首页「开机自启动」安装官方模块 yyds_autostart。开机执行 service.sh,拉起 yyds.keep,再派生 yyds.auto(端口 49009)和 yyds.py(端口 61140)。
等 61140 开始监听后,请求 GET http://127.0.0.1:61140/project/start?name=工程名。工程目录位于 /storage/emulated/0/Yyds.Py/工程名/。
打开 Yyds.Auto App → 首页「开机自启动」卡片 → 安装。兼容 Magisk / KernelSU / APatch,重启后生效。日志:/data/local/tmp/yyds_autostart.log。官方模块不会自动运行任何工程。
用 service.sh(late_start,非阻塞),不要用 post-fs-data.sh。后者会卡住开机,且此时 zygote / PackageManager / 用户数据都还没好。脚本里用 MODDIR=${0%/*} 取模块目录,换行必须是 UNIX LF(Windows 记事本的 CRLF 会直接跑失败)。
| 1 | my_project_autostart/ |
| 2 | ├── module.prop |
| 3 | └── service.sh |
| 1 | id=yyds_my_project_autostart |
| 2 | name=Yyds.Auto 开机启动 my_project |
| 3 | version=v1.0 |
| 4 | versionCode=1 |
| 5 | author=you |
| 6 | description=开机等待引擎就绪后启动工程 my_project |
把 PROJECT= 改成设备上的工程目录名。Magisk 模块脚本跑在 BusyBox ash standalone,自带 wget。
| 1 | #!/system/bin/sh |
| 2 | # Magisk / KernelSU / APatch late_start service.sh |
| 3 | # 等 yyds.py:61140 就绪后启动指定工程 |
| 4 | MODDIR=${0%/*} |
| 5 | LOG=/data/local/tmp/yyds_project_autostart.log |
| 6 | PROJECT=my_project |
| 7 | API=http://127.0.0.1:61140 |
| 8 | |
| 9 | log() { |
| 10 | echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG" |
| 11 | } |
| 12 | |
| 13 | port_listening() { |
| 14 | PORT_HEX=$(printf '%04X' "$1" 2>/dev/null) |
| 15 | [ -n "$PORT_HEX" ] || return 1 |
| 16 | grep -E -q "^[[:space:]]*[0-9]+:[[:space:]]+[0-9A-Fa-f]+:$PORT_HEX[[:space:]]" /proc/net/tcp /proc/net/tcp6 2>/dev/null |
| 17 | } |
| 18 | |
| 19 | log "=== 工程自启触发 project=$PROJECT ===" |
| 20 | |
| 21 | WAIT=0 |
| 22 | while [ "$(getprop sys.boot_completed)" != "1" ] && [ $WAIT -lt 120 ]; do |
| 23 | sleep 2 |
| 24 | WAIT=$((WAIT + 2)) |
| 25 | done |
| 26 | |
| 27 | # FBE: 用户数据解密前 /sdcard 不可用 |
| 28 | WAIT=0 |
| 29 | while [ ! -d /sdcard/Android ] && [ $WAIT -lt 60 ]; do |
| 30 | sleep 2 |
| 31 | WAIT=$((WAIT + 2)) |
| 32 | done |
| 33 | log "boot_completed=1" |
| 34 | |
| 35 | WAIT=0 |
| 36 | while ! port_listening 61140 && [ $WAIT -lt 180 ]; do |
| 37 | sleep 2 |
| 38 | WAIT=$((WAIT + 2)) |
| 39 | done |
| 40 | if ! port_listening 61140; then |
| 41 | log "错误: 61140 未就绪。请先在 App 首页安装开机自启动官方模块" |
| 42 | exit 1 |
| 43 | fi |
| 44 | |
| 45 | # 可选:唤醒屏幕(脚本要点击 UI 时再打开) |
| 46 | # input keyevent 224 |
| 47 | # svc power stayon true |
| 48 | |
| 49 | log "引擎就绪,启动工程 $PROJECT" |
| 50 | wget -qO- -T 8 "$API/project/start?name=$PROJECT" >> "$LOG" 2>&1 |
| 51 | log "=== 完成 ===" |
zip 根目录必须直接是 module.prop 和 service.sh,不要再套一层文件夹。用 Magisk / KernelSU / APatch App 从本地安装即可,不需要 META-INF。
| 1 | # 1. 在电脑上、模块目录内打包(zip 根必须直接是这两个文件) |
| 2 | zip -r yyds_my_project_autostart.zip module.prop service.sh |
| 3 | |
| 4 | # 2. 推到手机后安装,或在 Magisk/KSU/APatch App 里「从本地安装」 |
| 5 | # magisk --install-module /sdcard/Download/yyds_my_project_autostart.zip |
| 6 | # /data/adb/ksu/bin/ksud module install /sdcard/Download/yyds_my_project_autostart.zip |
| 7 | # /data/adb/apd module install /sdcard/Download/yyds_my_project_autostart.zip |
不想打 zip 的话,把同样的脚本放到 /data/adb/service.d/yyds_my_project.sh,然后 chmod 755。下次开机同样会跑。做成模块的好处是能在 Magisk 里一键开关(模块目录放空文件 disable 即停用)。
| 1 | cp service.sh /data/adb/service.d/yyds_my_project.sh |
| 2 | chmod 755 /data/adb/service.d/yyds_my_project.sh |
/data/local/tmp/yyds_autostart.log,再看工程自启日志 /data/local/tmp/yyds_project_autostart.log/data/adb/modules/yyds_my_project_autostart/ 下没有 disable 文件ls /sdcard/Yyds.Py/,工程名必须和目录名一致。中文名需要 URL 编码wget -qO- http://127.0.0.1:61140/project/listinput keyevent 224(唤醒)或 svc power stayon true^[a-zA-Z][a-zA-Z0-9._-]+$,例如 yyds_my_project_autostart,不能有空格、不能以数字开头