[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82880":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":15,"starSnapshotCount":15,"syncStatus":28,"lastSyncTime":29,"discoverSource":30},82880,"adb-gopay","ANGJustinl\u002Fadb-gopay","ANGJustinl","GoPay 自动化","",null,"Python",90,55,61,0,4,18,1,5.24,"MIT License",false,"main",true,[],"2026-06-12 02:04:28","# adb-gopay 使用教程\n\n这是一个基于 `adb`、Android UI dump 和可选 OCR 的 GoPay 自动化工具。\n\n需要准备：\n\n* 一个NexSMS接码账号\n* 开启adb的蓝叠模拟器(默认端口是[http:\u002F\u002Flocalhost:5555](http:\u002F\u002Flocalhost:5555\u002F)), 然后安装了Gopay APP\n\n目前的主流程包括：\n\n- 冷启动前自动清理 `com.gojek.gopay`\n- 自动拒绝首次位置权限引导\n- 自动进入手机号输入页\n- 通过 NexSMS 购买印尼号码并等待 OTP\n- OTP 后继续填写名称\n- 进入 `Profil` -> `Pengaturan & keamanan` -> `Perlindungan akun`\n- 点击 `Pasang PIN`，完成 PIN 和二次确认\n- 如果 PIN 后跳到 WhatsApp OTP，会切到 `Coba Metode Lainnya`，再改走 `OTP via SMS`\n\n# 省流:\n```powershell\npython -m adb_accessibility_assistant run-gopay --config config.gopay.yaml --mute --retry-on-otp-timeout\n```\n\n## 目录说明\n\n- [config.gopay.yaml](.\u002Fconfig.gopay.yaml)：GoPay 主配置\n- [config.example.yaml](.\u002Fconfig.example.yaml)：通用辅助模式示例配置\n- [run-assistant.ps1](.\u002Frun-assistant.ps1)：自动使用本地 `.venv` 的 PowerShell 启动脚本\n- [adb_accessibility_assistant](.\u002Fadb_accessibility_assistant)：主程序源码\n\n## 环境要求\n\n- Windows\n- Python 3.12+\n- 已安装并可直接执行 `adb`\n- BlueStacks 或真实 Android 设备\n- 安装仓库内的 `ADBKeyboard.apk`，方便稳定输入文本\n\n如果没有安装 `pyttsx3`，命令行运行时请带 `--mute`。\n\n## 安装\n\n```powershell\npython -m venv .venv\n.venv\\Scripts\\Activate.ps1\npython -m pip install -r requirements.txt\n```\n\n如果你不想每次手动激活虚拟环境，也可以使用项目自带脚本：\n\n```powershell\n.\\run-assistant.ps1 doctor --config config.gopay.yaml --mute\n.\\run-assistant.ps1 gopay-to-phone-input --config config.gopay.yaml --mute\n.\\run-assistant.ps1 run-gopay --config config.gopay.yaml --mute --retry-on-otp-timeout\n```\n\n## 启动前检查\n\n先确认设备在线：\n\n```powershell\nadb devices\n```\n\n再执行环境自检：\n\n```powershell\npython -m adb_accessibility_assistant doctor --config config.gopay.yaml --mute\n```\n\n如果这里看不到设备，后面的 GoPay 流程都不会成功。\n\n## 配置说明\n\n### 1. GoPay 主配置\n\n[config.gopay.yaml](.\u002Fconfig.gopay.yaml) 是完整流程使用的配置文件。\n\n最关键的字段有：\n\n- `adb_path`：`adb` 可执行文件路径\n- `device_serial`：设备序列号，多设备时建议填写\n- `target_package`：默认是 `com.gojek.gopay`\n- `reset_app_on_start`：默认 `true`，每次启动前都清空应用数据\n- `nexsms.api_key`：你的 NexSMS API Key\n- `nexsms.proxy`：代理地址，默认空字符串，不走代理\n- `nexsms.country_name`：默认 `Indonesia`\n- `nexsms.default_price`：价格接口失效时的兜底价格\n- `nexsms.same_number_retry_limit`：OTP 超时后，同一号码可整体重试的次数\n- `credential.pin_length`：PIN 长度，当前默认 6\n- `flow.credentials_path`：成功后写入账号信息的输出文件\n\n默认策略是：\n\n- 只购买印尼号码\n- 优先使用平台返回的最低真实价格\n- OTP 超时时优先复用同一个手机号继续等，直到达到重试上限或号码快过期\n\n### 2. 通用辅助配置\n\n[config.example.yaml](.\u002Fconfig.example.yaml) 主要给这些命令用：\n\n- `scan`\n- `tap-text`\n- `auto-step`\n- `auto-loop`\n- `assist`\n- `gui`\n\n## 快速开始\n\n### 1. 只自动打开到手机号输入页\n\n这条命令会：\n\n- 清空 GoPay 本地数据\n- 重新启动 App\n- 自动拒绝首次位置权限引导\n- 自动点击 landing 页 CTA\n- 停在手机号输入页\n\n```powershell\npython -m adb_accessibility_assistant gopay-to-phone-input --config config.gopay.yaml --mute\n```\n\n适合先验证 ADB、页面识别和基础点击是否正常。\n\n### 2. 运行完整注册流程\n\n```powershell\npython -m adb_accessibility_assistant run-gopay --config config.gopay.yaml --mute --retry-on-otp-timeout\n```\n\n这条命令会从干净状态完整执行 GoPay 流程，并在 OTP 超时时自动重试。\n\n如果你不想启用 OTP 超时后的自动重试，可以去掉 `--retry-on-otp-timeout`：\n\n```powershell\npython -m adb_accessibility_assistant run-gopay --config config.gopay.yaml --mute\n```\n\n如果你已经有一个现成手机号，想直接复用：\n\n```powershell\npython -m adb_accessibility_assistant run-gopay --config config.gopay.yaml --mute --phone +62857xxxxxxxx\n```\n\n## 常用命令\n\n### GoPay 专用命令\n\n```powershell\npython -m adb_accessibility_assistant gopay-register --config config.gopay.yaml --mute\npython -m adb_accessibility_assistant gopay-to-phone-input --config config.gopay.yaml --mute\npython -m adb_accessibility_assistant gopay-inspect --config config.gopay.yaml --mute\npython -m adb_accessibility_assistant gopay-next --config config.gopay.yaml --mute\npython -m adb_accessibility_assistant gopay-tap \"OTP via SMS\" --config config.gopay.yaml --mute\npython -m adb_accessibility_assistant gopay-input 85712345678 --config config.gopay.yaml --mute\npython -m adb_accessibility_assistant run-gopay --config config.gopay.yaml --mute --retry-on-otp-timeout\n```\n\n说明：\n\n- `gopay-register`：运行 GoPay 状态机主流程\n- `gopay-to-phone-input`：只走到手机号页并停住\n- `gopay-inspect`：识别当前 GoPay 页面，并把快照保存到 `artifacts\u002Fgopay`\n- `gopay-next`：在当前已识别页面上尝试点下一步\n- `gopay-tap`：按 `content-desc` 文字直接点击\n- `gopay-input`：在手机号页输入号码并尝试点 `Lanjut`\n- `run-gopay`：完整端到端执行，包含 NexSMS 买号、OTP 轮询、PIN 设置和后续页面跳转\n\n### 通用辅助命令\n\n```powershell\npython -m adb_accessibility_assistant doctor --config config.example.yaml --mute\npython -m adb_accessibility_assistant start-app --config config.example.yaml --mute\npython -m adb_accessibility_assistant scan --config config.example.yaml --mute\npython -m adb_accessibility_assistant dump-ui --config config.example.yaml --mute\npython -m adb_accessibility_assistant tap-text \"Oke, lanjut\" --config config.example.yaml --mute\npython -m adb_accessibility_assistant auto-step --config config.example.yaml --mute\npython -m adb_accessibility_assistant auto-loop --config config.example.yaml --mute --max-steps 10\npython -m adb_accessibility_assistant assist --config config.example.yaml --mute\npython -m adb_accessibility_assistant gui --config config.example.yaml --mute\n```\n\n## BlueStacks 设备型号管理\n\n项目现在提供两种 BlueStacks 机型管理方式：\n\n- 直接改 [bluestacks.conf](\u003C\u002FC:\u002FProgramData\u002FBlueStacks_nxt\u002Fbluestacks.conf>) 里的实例字段\n- 通过 BlueStacks 播放器外部顶部菜单的 `设置 -> 手机` 页面切换预设机型\n\n### 1. 直接改 bluestacks.conf\n\n先查看当前实例：\n\n```powershell\npython -m adb_accessibility_assistant bluestacks-device-show\npython -m adb_accessibility_assistant bluestacks-device-show --instance Rvc64\n```\n\n更新某个实例的设备资料：\n\n```powershell\npython -m adb_accessibility_assistant bluestacks-device-set --instance Rvc64 --brand samsung --manufacturer samsung --model SM-S918B\n```\n\n如果 BlueStacks 正在运行，需要先停掉，或者让命令代为关闭：\n\n```powershell\npython -m adb_accessibility_assistant bluestacks-device-set --instance Rvc64 --brand samsung --manufacturer samsung --model SM-S918B --stop-if-running\n```\n\n只预览改动、不落盘：\n\n```powershell\npython -m adb_accessibility_assistant bluestacks-device-set --instance Rvc64 --model SM-S918B --dry-run\n```\n\n注意：\n\n- 每次正式写入前，命令都会自动创建 `bluestacks.conf.\u003C时间戳>.bak` 备份\n- 改的是实例级字段，不是全局字段\n- 写入后需要重新启动对应实例，新的机型字段才会生效\n\n### 2. 通过播放器 UI 切换预设机型\n\n这条命令走的是已经验证过的 BlueStacks 外部播放器路径：\n\n- 顶部三横线菜单\n- `设置`\n- `手机`\n- 预设机型下拉框\n- `储存变更`\n\n切到下一个预设：\n\n```powershell\npython -m adb_accessibility_assistant bluestacks-preset-switch --instance Rvc64\n```\n\n明确切到某个预设：\n\n```powershell\npython -m adb_accessibility_assistant bluestacks-preset-switch --instance Rvc64 --preset \"Samsung Galaxy S20+\"\n```\n\n如果窗口标题不是默认值，可以显式指定：\n\n```powershell\npython -m adb_accessibility_assistant bluestacks-preset-switch --instance Rvc64 --window-title \"BlueStacks App Player 1\" --preset \"XIAOMI 11T PRO\"\n```\n\n默认会在保存后回读 `bluestacks.conf`，再通过 `adb getprop` 验证运行时机型。如果只想切换、不做 ADB 验证：\n\n```powershell\npython -m adb_accessibility_assistant bluestacks-preset-switch --instance Rvc64 --no-verify-adb\n```\n\n注意：\n\n- 这条命令依赖 Windows 桌面会话和可见的 BlueStacks 窗口\n- 当前实现优先适配 BlueStacks 5 的默认播放器布局\n- `--preset` 的查找方式是沿下拉框向前循环，所以预设名需要和界面显示文本一致\n\n## HTTP API\n\n如果你需要让别的程序远程调用这套流程，可以启动内置 API server：\n\n```powershell\npython -m adb_accessibility_assistant api-server --config config.gopay.yaml --host 127.0.0.1 --port 8787 --mute\n```\n\n这会启动一个单机 HTTP 服务。它的特点是：\n\n- 任务按队列串行执行，适合单设备\u002F单模拟器场景\n- 支持后台执行\n- 支持查询任务状态\n- 支持取消正在运行的任务\n- 支持把最终结果回调到你的业务系统\n\n### API 端点\n\n- `GET \u002Fapi\u002Fhealth`：健康检查\n- `GET \u002Fapi\u002Ftasks`：查看任务列表\n- `GET \u002Fapi\u002Ftasks\u002F{task_id}`：查看单个任务详情\n- `POST \u002Fapi\u002Ftasks\u002F{task_id}\u002Fcancel`：取消任务\n- `POST \u002Fapi\u002Ftasks\u002Frun-gopay`：提交完整 GoPay 注册任务\n- `POST \u002Fapi\u002Ftasks\u002Fprepare-phone-input`：提交“只走到手机号页”的任务\n- `POST \u002Fapi\u002Ftasks\u002Finspect`：提交当前页面识别任务\n- `POST \u002Fapi\u002Ftasks`：通用提交入口，手动指定 `task_type`\n\n### 提交完整注册任务\n\n```powershell\ncurl -X POST http:\u002F\u002F127.0.0.1:8787\u002Fapi\u002Ftasks\u002Frun-gopay ^\n  -H \"Content-Type: application\u002Fjson\" ^\n  -d \"{\\\"retry_on_otp_timeout\\\": true, \\\"max_steps\\\": 200, \\\"callback_url\\\": \\\"http:\u002F\u002F127.0.0.1:9000\u002Fcallback\\\"}\"\n```\n\n请求体支持的常用字段：\n\n- `config_path`：可选。不传就使用启动 `api-server` 时的 `--config`\n- `adb_path`：可选，覆盖默认 adb 路径\n- `device_serial`：可选，覆盖默认设备序列号\n- `mute`：可选，默认继承 server 启动参数\n- `max_steps`：最大步骤数\n- `poll_timeout`：OTP 等待超时秒数\n- `step_delay`：步骤间隔秒数\n- `retry_on_otp_timeout`：OTP 超时后是否自动重试\n- `phone`：直接复用现成手机号\n- `callback_url`：任务状态变化回调地址\n- `callback_headers`：回调请求附加 HTTP 头\n- `metadata`：业务侧自定义字段，会原样带回\n\n### 只走到手机号页\n\n```powershell\ncurl -X POST http:\u002F\u002F127.0.0.1:8787\u002Fapi\u002Ftasks\u002Fprepare-phone-input ^\n  -H \"Content-Type: application\u002Fjson\" ^\n  -d \"{\\\"max_steps\\\": 10}\"\n```\n\n### 页面识别\n\n```powershell\ncurl -X POST http:\u002F\u002F127.0.0.1:8787\u002Fapi\u002Ftasks\u002Finspect ^\n  -H \"Content-Type: application\u002Fjson\" ^\n  -d \"{\\\"save_dir\\\": \\\"artifacts\u002Fgopay\\\"}\"\n```\n\n### 查询任务\n\n```powershell\ncurl http:\u002F\u002F127.0.0.1:8787\u002Fapi\u002Ftasks\ncurl http:\u002F\u002F127.0.0.1:8787\u002Fapi\u002Ftasks\u002F\u003Ctask_id>\n```\n\n### 取消任务\n\n```powershell\ncurl -X POST http:\u002F\u002F127.0.0.1:8787\u002Fapi\u002Ftasks\u002F\u003Ctask_id>\u002Fcancel\n```\n\n### 回调格式\n\n如果提交任务时带了 `callback_url`，server 会在这些状态变化时回调：\n\n- `task.queued`\n- `task.started`\n- `task.succeeded`\n- `task.failed`\n- `task.canceled`\n\n回调是一个 `POST` JSON，请求体结构大致如下：\n\n```json\n{\n  \"event\": \"task.succeeded\",\n  \"event_at\": \"2026-06-01T09:00:00+00:00\",\n  \"task\": {\n    \"task_id\": \"8c4b7d8d9e8f4d20b91dcb3a1f4b5c6d\",\n    \"task_type\": \"run-gopay\",\n    \"status\": \"succeeded\",\n    \"request\": {\n      \"retry_on_otp_timeout\": true,\n      \"config_path\": \"config.gopay.yaml\"\n    },\n    \"metadata\": {\n      \"order_id\": \"A10001\"\n    },\n    \"result\": {\n      \"ok\": true,\n      \"status\": \"success\",\n      \"state\": \"registration_complete\",\n      \"message\": \"Registration completed successfully.\",\n      \"data\": {\n        \"username\": \"Abcdefgh\",\n        \"phone\": \"+62857xxxxxxx\"\n      }\n    },\n    \"logs\": [\n      \"State: waiting_phone_input\",\n      \"Getting phone number from NexSMS...\"\n    ]\n  }\n}\n```\n\n注意：\n\n- 这是单进程内存队列，重启 API server 后旧任务状态不会保留\n- 同一时间只适合控制一台设备\n- 如果回调地址不可达，任务本身不会因此失败，只会在任务日志里记一条 callback 失败信息\n\n## 典型使用流程\n\n推荐先按这个顺序测试：\n\n1. `doctor`，确认 `adb`、设备、OCR 正常\n2. `gopay-to-phone-input`，确认基础启动和页面识别正常\n3. `gopay-inspect`，确认当前页识别结果和 `artifacts\u002Fgopay\u002F*.json` 快照正常\n4. `run-gopay --retry-on-otp-timeout`，执行完整流程\n\n如果某一步页面识别不对，先不要继续硬跑，先保存当前截图，再执行：\n\n```powershell\npython -m adb_accessibility_assistant gopay-inspect --config config.gopay.yaml --mute\n```\n\n然后查看 `artifacts\u002Fgopay` 目录下生成的页面快照。\n\n## 输出文件\n\n运行过程中常见输出：\n\n- `artifacts\u002Fgopay\u002F*.json`：当前页面识别快照\n- `artifacts\u002Fnexsms_activations.sqlite3`：本地号码复用数据库\n- `credentials.json`：注册成功后输出的账号信息\n\n## 常见问题\n\n### 1. 启动就提示 `no devices\u002Femulators found`\n\n说明 `adb` 当前看不到设备。先检查：\n\n```powershell\nadb devices\n```\n\n如果 BlueStacks 开着但看不到，通常需要重连 ADB 或重启模拟器。\n\n### 2. 页面识别错了\n\n先执行：\n\n```powershell\npython -m adb_accessibility_assistant gopay-inspect --config config.gopay.yaml --mute\n```\n\n再把当前截图和 `artifacts\u002Fgopay` 里的最新 JSON 一起看。很多页面问题不是 OCR，而是 UI dump 文本变化。\n\n### 3. OTP 超时\n\n如果你是完整流程，建议加上：\n\n```powershell\n--retry-on-otp-timeout\n```\n\n当前逻辑会优先尝试复用同一个号码继续等；只有达到重试上限或号码剩余有效期太短时，才会放弃旧号并换新号。\n\n### 4. 为什么命令都建议带 `--mute`\n\n因为当前环境如果没安装 `pyttsx3`，不开 `--mute` 可能直接初始化失败。最稳妥的默认用法就是带 `--mute`。\n\n## 友情链接\n[LINUX DO - 新的理想型社区](https:\u002F\u002Flinux.do\u002F)\n","adb-gopay 是一个基于 `adb`、Android UI dump 和可选 OCR 的 GoPay 自动化工具。该项目的核心功能包括自动清理应用数据、拒绝首次位置权限引导、自动输入手机号码并处理 OTP 验证，以及设置 PIN 码等。它通过 NexSMS 购买印尼号码，并支持在 OTP 超时时自动重试。技术上，该工具使用 Python 编写，依赖于 ADB 和 BlueStacks 或真实 Android 设备进行操作。适合需要批量注册或测试 GoPay 应用的场景，能够显著提高效率和减少手动操作。",2,"2026-06-11 04:09:31","CREATED_QUERY"]