visionclaw 0.1.195-beta.0 → 0.1.195-dev.feat-e2e-test-system.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/command-handlers.d.ts.map +1 -1
- package/dist/agent/command-handlers.js +17 -0
- package/dist/agent/command-handlers.js.map +1 -1
- package/dist/builtin-skills/catalog/equity-research/SKILL.md +256 -0
- package/dist/builtin-skills/catalog/financial-modeling/SKILL.md +186 -0
- package/dist/builtin-skills/catalog/investment-banking/SKILL.md +213 -0
- package/dist/builtin-skills/catalog/private-equity/SKILL.md +282 -0
- package/dist/builtin-skills/catalog/wealth-management/SKILL.md +252 -0
- package/dist/channels/interface.d.ts +9 -0
- package/dist/channels/interface.d.ts.map +1 -1
- package/dist/channels/manager.d.ts.map +1 -1
- package/dist/channels/manager.js +3 -0
- package/dist/channels/manager.js.map +1 -1
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +7 -1
- package/dist/channels/telegram.js.map +1 -1
- package/dist/config/types.d.ts +6 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +10 -0
- package/dist/config/types.js.map +1 -1
- package/dist/e2e/artifacts.d.ts +8 -0
- package/dist/e2e/artifacts.d.ts.map +1 -0
- package/dist/e2e/artifacts.js +35 -0
- package/dist/e2e/artifacts.js.map +1 -0
- package/dist/e2e/cleanup.d.ts +8 -0
- package/dist/e2e/cleanup.d.ts.map +1 -0
- package/dist/e2e/cleanup.js +108 -0
- package/dist/e2e/cleanup.js.map +1 -0
- package/dist/e2e/cli.d.ts +4 -0
- package/dist/e2e/cli.d.ts.map +1 -0
- package/dist/e2e/cli.js +16 -0
- package/dist/e2e/cli.js.map +1 -0
- package/dist/e2e/index.d.ts +5 -0
- package/dist/e2e/index.d.ts.map +1 -0
- package/dist/e2e/index.js +4 -0
- package/dist/e2e/index.js.map +1 -0
- package/dist/e2e/local-test-server.d.ts +7 -0
- package/dist/e2e/local-test-server.d.ts.map +1 -0
- package/dist/e2e/local-test-server.js +75 -0
- package/dist/e2e/local-test-server.js.map +1 -0
- package/dist/e2e/oauth-setup-store.d.ts +28 -0
- package/dist/e2e/oauth-setup-store.d.ts.map +1 -0
- package/dist/e2e/oauth-setup-store.js +56 -0
- package/dist/e2e/oauth-setup-store.js.map +1 -0
- package/dist/e2e/parser.d.ts +4 -0
- package/dist/e2e/parser.d.ts.map +1 -0
- package/dist/e2e/parser.js +52 -0
- package/dist/e2e/parser.js.map +1 -0
- package/dist/e2e/registry.d.ts +3 -0
- package/dist/e2e/registry.d.ts.map +1 -0
- package/dist/e2e/registry.js +44 -0
- package/dist/e2e/registry.js.map +1 -0
- package/dist/e2e/reporter.d.ts +6 -0
- package/dist/e2e/reporter.d.ts.map +1 -0
- package/dist/e2e/reporter.js +56 -0
- package/dist/e2e/reporter.js.map +1 -0
- package/dist/e2e/runner.d.ts +4 -0
- package/dist/e2e/runner.d.ts.map +1 -0
- package/dist/e2e/runner.js +116 -0
- package/dist/e2e/runner.js.map +1 -0
- package/dist/e2e/setup-google-guest.d.ts +19 -0
- package/dist/e2e/setup-google-guest.d.ts.map +1 -0
- package/dist/e2e/setup-google-guest.js +205 -0
- package/dist/e2e/setup-google-guest.js.map +1 -0
- package/dist/e2e/suite-utils.d.ts +19 -0
- package/dist/e2e/suite-utils.d.ts.map +1 -0
- package/dist/e2e/suite-utils.js +60 -0
- package/dist/e2e/suite-utils.js.map +1 -0
- package/dist/e2e/suites/agent.d.ts +3 -0
- package/dist/e2e/suites/agent.d.ts.map +1 -0
- package/dist/e2e/suites/agent.js +33 -0
- package/dist/e2e/suites/agent.js.map +1 -0
- package/dist/e2e/suites/browser.d.ts +3 -0
- package/dist/e2e/suites/browser.d.ts.map +1 -0
- package/dist/e2e/suites/browser.js +58 -0
- package/dist/e2e/suites/browser.js.map +1 -0
- package/dist/e2e/suites/cua.d.ts +3 -0
- package/dist/e2e/suites/cua.d.ts.map +1 -0
- package/dist/e2e/suites/cua.js +68 -0
- package/dist/e2e/suites/cua.js.map +1 -0
- package/dist/e2e/suites/google.d.ts +3 -0
- package/dist/e2e/suites/google.d.ts.map +1 -0
- package/dist/e2e/suites/google.js +145 -0
- package/dist/e2e/suites/google.js.map +1 -0
- package/dist/e2e/suites/memory.d.ts +3 -0
- package/dist/e2e/suites/memory.d.ts.map +1 -0
- package/dist/e2e/suites/memory.js +50 -0
- package/dist/e2e/suites/memory.js.map +1 -0
- package/dist/e2e/suites/obs.d.ts +3 -0
- package/dist/e2e/suites/obs.d.ts.map +1 -0
- package/dist/e2e/suites/obs.js +29 -0
- package/dist/e2e/suites/obs.js.map +1 -0
- package/dist/e2e/suites/self.d.ts +3 -0
- package/dist/e2e/suites/self.d.ts.map +1 -0
- package/dist/e2e/suites/self.js +65 -0
- package/dist/e2e/suites/self.js.map +1 -0
- package/dist/e2e/suites/upgrade.d.ts +3 -0
- package/dist/e2e/suites/upgrade.d.ts.map +1 -0
- package/dist/e2e/suites/upgrade.js +31 -0
- package/dist/e2e/suites/upgrade.js.map +1 -0
- package/dist/e2e/types.d.ts +91 -0
- package/dist/e2e/types.d.ts.map +1 -0
- package/dist/e2e/types.js +2 -0
- package/dist/e2e/types.js.map +1 -0
- package/dist/index.js.map +1 -1
- package/dist/service/daemon.d.ts +1 -0
- package/dist/service/daemon.d.ts.map +1 -1
- package/dist/service/daemon.js +110 -15
- package/dist/service/daemon.js.map +1 -1
- package/dist/tools/upgrade.d.ts +8 -0
- package/dist/tools/upgrade.d.ts.map +1 -1
- package/dist/tools/upgrade.js +64 -8
- package/dist/tools/upgrade.js.map +1 -1
- package/dist-agent/bundle.cjs +32037 -30064
- package/package.json +1 -1
- package/dist/agent/applied-credential-signature.d.ts +0 -53
- package/dist/agent/applied-credential-signature.d.ts.map +0 -1
- package/dist/agent/applied-credential-signature.js +0 -137
- package/dist/agent/applied-credential-signature.js.map +0 -1
- package/dist/agent/engines/claude/cli-resolver.d.ts +0 -16
- package/dist/agent/engines/claude/cli-resolver.d.ts.map +0 -1
- package/dist/agent/engines/claude/cli-resolver.js +0 -83
- package/dist/agent/engines/claude/cli-resolver.js.map +0 -1
- package/dist/agent/engines/claude/session-browser-policy.d.ts +0 -9
- package/dist/agent/engines/claude/session-browser-policy.d.ts.map +0 -1
- package/dist/agent/engines/claude/session-browser-policy.js +0 -49
- package/dist/agent/engines/claude/session-browser-policy.js.map +0 -1
- package/dist/agent/engines/claude/session.d.ts +0 -304
- package/dist/agent/engines/claude/session.d.ts.map +0 -1
- package/dist/agent/engines/claude/session.js +0 -1233
- package/dist/agent/engines/claude/session.js.map +0 -1
- package/dist/agent/engines/client-factory.d.ts +0 -63
- package/dist/agent/engines/client-factory.d.ts.map +0 -1
- package/dist/agent/engines/client-factory.js +0 -382
- package/dist/agent/engines/client-factory.js.map +0 -1
- package/dist/agent/engines/engine-factory.d.ts +0 -5
- package/dist/agent/engines/engine-factory.d.ts.map +0 -1
- package/dist/agent/engines/engine-factory.js +0 -7
- package/dist/agent/engines/engine-factory.js.map +0 -1
- package/dist/agent/engines/engine.d.ts +0 -8
- package/dist/agent/engines/engine.d.ts.map +0 -1
- package/dist/agent/engines/engine.js +0 -15
- package/dist/agent/engines/engine.js.map +0 -1
- package/dist/agent/engines/openai/file-session.d.ts +0 -19
- package/dist/agent/engines/openai/file-session.d.ts.map +0 -1
- package/dist/agent/engines/openai/file-session.js +0 -78
- package/dist/agent/engines/openai/file-session.js.map +0 -1
- package/dist/agent/engines/openai/file-tools.d.ts +0 -35
- package/dist/agent/engines/openai/file-tools.d.ts.map +0 -1
- package/dist/agent/engines/openai/file-tools.js +0 -194
- package/dist/agent/engines/openai/file-tools.js.map +0 -1
- package/dist/agent/engines/openai/session.d.ts +0 -55
- package/dist/agent/engines/openai/session.d.ts.map +0 -1
- package/dist/agent/engines/openai/session.js +0 -447
- package/dist/agent/engines/openai/session.js.map +0 -1
- package/dist/agent/engines/openai/tools.d.ts +0 -15
- package/dist/agent/engines/openai/tools.d.ts.map +0 -1
- package/dist/agent/engines/openai/tools.js +0 -221
- package/dist/agent/engines/openai/tools.js.map +0 -1
- package/dist/agent/engines/pi/session.d.ts +0 -54
- package/dist/agent/engines/pi/session.d.ts.map +0 -1
- package/dist/agent/engines/pi/session.js +0 -397
- package/dist/agent/engines/pi/session.js.map +0 -1
- package/dist/agent/engines/pi/tools.d.ts +0 -19
- package/dist/agent/engines/pi/tools.d.ts.map +0 -1
- package/dist/agent/engines/pi/tools.js +0 -127
- package/dist/agent/engines/pi/tools.js.map +0 -1
- package/dist/agent/engines/session-types.d.ts +0 -153
- package/dist/agent/engines/session-types.d.ts.map +0 -1
- package/dist/agent/engines/session-types.js +0 -2
- package/dist/agent/engines/session-types.js.map +0 -1
- package/dist/agent/engines/system-prompt-log.d.ts +0 -9
- package/dist/agent/engines/system-prompt-log.d.ts.map +0 -1
- package/dist/agent/engines/system-prompt-log.js +0 -46
- package/dist/agent/engines/system-prompt-log.js.map +0 -1
- package/dist/agent/model-provider.d.ts +0 -103
- package/dist/agent/model-provider.d.ts.map +0 -1
- package/dist/agent/model-provider.js +0 -540
- package/dist/agent/model-provider.js.map +0 -1
- package/dist/agent/transcript/transcript-backfill.d.ts +0 -54
- package/dist/agent/transcript/transcript-backfill.d.ts.map +0 -1
- package/dist/agent/transcript/transcript-backfill.js +0 -604
- package/dist/agent/transcript/transcript-backfill.js.map +0 -1
- package/dist/agent/transcript/transcript-indexer.d.ts +0 -273
- package/dist/agent/transcript/transcript-indexer.d.ts.map +0 -1
- package/dist/agent/transcript/transcript-indexer.js +0 -1217
- package/dist/agent/transcript/transcript-indexer.js.map +0 -1
- package/dist/agent/transcript/transcript-memory-migrations.d.ts +0 -25
- package/dist/agent/transcript/transcript-memory-migrations.d.ts.map +0 -1
- package/dist/agent/transcript/transcript-memory-migrations.js +0 -87
- package/dist/agent/transcript/transcript-memory-migrations.js.map +0 -1
- package/dist/agent/transcript-memory-migrations.d.ts +0 -25
- package/dist/agent/transcript-memory-migrations.d.ts.map +0 -1
- package/dist/agent/transcript-memory-migrations.js +0 -87
- package/dist/agent/transcript-memory-migrations.js.map +0 -1
- package/dist/agent/tunnel-credential-handler.d.ts +0 -90
- package/dist/agent/tunnel-credential-handler.d.ts.map +0 -1
- package/dist/agent/tunnel-credential-handler.js +0 -162
- package/dist/agent/tunnel-credential-handler.js.map +0 -1
- package/dist/agent/usage/usage-backfill-handler.d.ts +0 -18
- package/dist/agent/usage/usage-backfill-handler.d.ts.map +0 -1
- package/dist/agent/usage/usage-backfill-handler.js +0 -69
- package/dist/agent/usage/usage-backfill-handler.js.map +0 -1
- package/dist/agent/usage/usage-gate.d.ts +0 -25
- package/dist/agent/usage/usage-gate.d.ts.map +0 -1
- package/dist/agent/usage/usage-gate.js +0 -83
- package/dist/agent/usage/usage-gate.js.map +0 -1
- package/dist/agent/usage/usage-handler.d.ts +0 -7
- package/dist/agent/usage/usage-handler.d.ts.map +0 -1
- package/dist/agent/usage/usage-handler.js +0 -28
- package/dist/agent/usage/usage-handler.js.map +0 -1
- package/dist/agent/usage/usage-report-builder.d.ts +0 -26
- package/dist/agent/usage/usage-report-builder.d.ts.map +0 -1
- package/dist/agent/usage/usage-report-builder.js +0 -80
- package/dist/agent/usage/usage-report-builder.js.map +0 -1
- package/dist/agent/usage/usage-report-queue.d.ts +0 -26
- package/dist/agent/usage/usage-report-queue.d.ts.map +0 -1
- package/dist/agent/usage/usage-report-queue.js +0 -199
- package/dist/agent/usage/usage-report-queue.js.map +0 -1
- package/dist/agent/usage/usage-report-types.d.ts +0 -41
- package/dist/agent/usage/usage-report-types.d.ts.map +0 -1
- package/dist/agent/usage/usage-report-types.js +0 -2
- package/dist/agent/usage/usage-report-types.js.map +0 -1
- package/dist/agent/usage/usage-reporter.d.ts +0 -31
- package/dist/agent/usage/usage-reporter.d.ts.map +0 -1
- package/dist/agent/usage/usage-reporter.js +0 -102
- package/dist/agent/usage/usage-reporter.js.map +0 -1
- package/dist/agent/usage-backfill-handler.d.ts +0 -18
- package/dist/agent/usage-backfill-handler.d.ts.map +0 -1
- package/dist/agent/usage-backfill-handler.js +0 -69
- package/dist/agent/usage-backfill-handler.js.map +0 -1
- package/dist/agent/usage-gate.d.ts +0 -25
- package/dist/agent/usage-gate.d.ts.map +0 -1
- package/dist/agent/usage-gate.js +0 -83
- package/dist/agent/usage-gate.js.map +0 -1
- package/dist/agent/usage-report-builder.d.ts +0 -26
- package/dist/agent/usage-report-builder.d.ts.map +0 -1
- package/dist/agent/usage-report-builder.js +0 -80
- package/dist/agent/usage-report-builder.js.map +0 -1
- package/dist/agent/usage-report-queue.d.ts +0 -26
- package/dist/agent/usage-report-queue.d.ts.map +0 -1
- package/dist/agent/usage-report-queue.js +0 -199
- package/dist/agent/usage-report-queue.js.map +0 -1
- package/dist/agent/usage-report-types.d.ts +0 -41
- package/dist/agent/usage-report-types.d.ts.map +0 -1
- package/dist/agent/usage-report-types.js +0 -2
- package/dist/agent/usage-report-types.js.map +0 -1
- package/dist/agent/usage-reporter.d.ts +0 -31
- package/dist/agent/usage-reporter.d.ts.map +0 -1
- package/dist/agent/usage-reporter.js +0 -102
- package/dist/agent/usage-reporter.js.map +0 -1
- package/dist/agent/wake-cycle-tool-tracker.d.ts +0 -39
- package/dist/agent/wake-cycle-tool-tracker.d.ts.map +0 -1
- package/dist/agent/wake-cycle-tool-tracker.js +0 -72
- package/dist/agent/wake-cycle-tool-tracker.js.map +0 -1
- package/dist/billing/payg-handler.d.ts +0 -29
- package/dist/billing/payg-handler.d.ts.map +0 -1
- package/dist/billing/payg-handler.js +0 -92
- package/dist/billing/payg-handler.js.map +0 -1
- package/dist/billing/payment-handler.d.ts +0 -24
- package/dist/billing/payment-handler.d.ts.map +0 -1
- package/dist/billing/payment-handler.js +0 -101
- package/dist/billing/payment-handler.js.map +0 -1
- package/dist/builtin-skills/catalog/phone-adb-automation/SKILL.md +0 -412
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_input.sh +0 -132
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_launch.sh +0 -166
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_screenshot.sh +0 -87
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_security_kbd.py +0 -174
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_setup.sh +0 -274
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_swipe.sh +0 -111
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_tap.sh +0 -87
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_ui_parse.py +0 -176
- package/dist/builtin-skills/catalog/phone-adb-automation/phone_wake_unlock.sh +0 -67
- package/dist/builtin-skills/transcribe-audio/SKILL.md +0 -122
- package/dist/data-processing/convert-demo-cli.d.ts +0 -7
- package/dist/data-processing/convert-demo-cli.d.ts.map +0 -1
- package/dist/data-processing/convert-demo-cli.js +0 -30
- package/dist/data-processing/convert-demo-cli.js.map +0 -1
- package/dist/data-processing/convert-demo.d.ts +0 -26
- package/dist/data-processing/convert-demo.d.ts.map +0 -1
- package/dist/data-processing/convert-demo.js +0 -233
- package/dist/data-processing/convert-demo.js.map +0 -1
- package/dist/obs/rdp/icons/icons/app_windows.svg +0 -4
- package/dist/obs/rdp/icons/icons/clip_get.svg +0 -4
- package/dist/obs/rdp/icons/icons/clip_send.svg +0 -4
- package/dist/obs/rdp/icons/icons/clip_shared.svg +0 -4
- package/dist/obs/rdp/icons/icons/clipboard.svg +0 -4
- package/dist/obs/rdp/icons/icons/clipboard_shared.svg +0 -4
- package/dist/obs/rdp/icons/icons/control.svg +0 -4
- package/dist/obs/rdp/icons/icons/desktop.svg +0 -4
- package/dist/obs/rdp/icons/icons/display.svg +0 -4
- package/dist/obs/rdp/icons/icons/launchpad.svg +0 -4
- package/dist/obs/rdp/icons/icons/mission_control.svg +0 -4
- package/dist/obs/rdp/icons/icons/screenshot.svg +0 -4
- package/dist/obs/rdp/icons/icons/zoom_actual.svg +0 -4
- package/dist/obs/rdp/icons/icons/zoom_fit.svg +0 -4
- package/dist/obs/rdp/icons/icons/zoom_in.svg +0 -4
- package/dist/obs/rdp/icons/icons/zoom_out.svg +0 -4
- package/dist/obs/tunnel-telemetry.d.ts +0 -46
- package/dist/obs/tunnel-telemetry.d.ts.map +0 -1
- package/dist/obs/tunnel-telemetry.js +0 -70
- package/dist/obs/tunnel-telemetry.js.map +0 -1
- package/dist/onboarding/cloudflared-cert.d.ts +0 -15
- package/dist/onboarding/cloudflared-cert.d.ts.map +0 -1
- package/dist/onboarding/cloudflared-cert.js +0 -57
- package/dist/onboarding/cloudflared-cert.js.map +0 -1
- package/dist/onboarding/playwriter-extension.d.ts +0 -19
- package/dist/onboarding/playwriter-extension.d.ts.map +0 -1
- package/dist/onboarding/playwriter-extension.js +0 -246
- package/dist/onboarding/playwriter-extension.js.map +0 -1
- package/dist/realtime/websocket.d.ts +0 -7
- package/dist/realtime/websocket.d.ts.map +0 -1
- package/dist/realtime/websocket.js +0 -65
- package/dist/realtime/websocket.js.map +0 -1
- package/dist/service/gbox-tun.d.ts +0 -14
- package/dist/service/gbox-tun.d.ts.map +0 -1
- package/dist/service/gbox-tun.js +0 -315
- package/dist/service/gbox-tun.js.map +0 -1
- package/dist/skills/installed.d.ts +0 -11
- package/dist/skills/installed.d.ts.map +0 -1
- package/dist/skills/installed.js +0 -35
- package/dist/skills/installed.js.map +0 -1
- package/dist/tools/coordinate-resolver.d.ts +0 -30
- package/dist/tools/coordinate-resolver.d.ts.map +0 -1
- package/dist/tools/coordinate-resolver.js +0 -104
- package/dist/tools/coordinate-resolver.js.map +0 -1
- package/dist/utils/playwriter-relay.d.ts +0 -9
- package/dist/utils/playwriter-relay.d.ts.map +0 -1
- package/dist/utils/playwriter-relay.js +0 -77
- package/dist/utils/playwriter-relay.js.map +0 -1
- package/dist/utils/wechat-monitor.d.ts +0 -21
- package/dist/utils/wechat-monitor.d.ts.map +0 -1
- package/dist/utils/wechat-monitor.js +0 -88
- package/dist/utils/wechat-monitor.js.map +0 -1
- package/dist-agent/realtime/assets/index.html +0 -1058
- package/dist-agent/realtime/assets/samples/alloy.mp3 +0 -0
- package/dist-agent/realtime/assets/samples/ash.mp3 +0 -0
- package/dist-agent/realtime/assets/samples/ballad.mp3 +0 -0
- package/dist-agent/realtime/assets/samples/cedar.mp3 +0 -0
- package/dist-agent/realtime/assets/samples/coral.mp3 +0 -0
- package/dist-agent/realtime/assets/samples/echo.mp3 +0 -0
- package/dist-agent/realtime/assets/samples/marin.mp3 +0 -0
- package/dist-agent/realtime/assets/samples/sage.mp3 +0 -0
- package/dist-agent/realtime/assets/samples/shimmer.mp3 +0 -0
- package/dist-agent/realtime/assets/samples/verse.mp3 +0 -0
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# phone_input.sh - Input text on Android phone via ADB
|
|
3
|
-
#
|
|
4
|
-
# Usage:
|
|
5
|
-
# bash phone_input.sh <text> [options]
|
|
6
|
-
#
|
|
7
|
-
# Options:
|
|
8
|
-
# -d DEVICE_ID Target specific device
|
|
9
|
-
# -m METHOD Input method: "direct" (default), "adbkbd", "clipboard"
|
|
10
|
-
# -e Send Enter key after input
|
|
11
|
-
# -c Clear existing text first (select all + delete)
|
|
12
|
-
# -q Quiet mode
|
|
13
|
-
#
|
|
14
|
-
# Methods:
|
|
15
|
-
# direct - adb shell input text (English/numbers only)
|
|
16
|
-
# adbkbd - ADBKeyboard broadcast (supports Chinese, requires ADBKeyboard app)
|
|
17
|
-
# clipboard - Set clipboard + paste (requires Android 10+, may not work on all devices)
|
|
18
|
-
#
|
|
19
|
-
# Notes:
|
|
20
|
-
# - Direct method does NOT support Chinese/CJK characters
|
|
21
|
-
# - Special characters (spaces, quotes) are escaped automatically
|
|
22
|
-
# - For Chinese input, install ADBKeyboard and use -m adbkbd
|
|
23
|
-
#
|
|
24
|
-
# Examples:
|
|
25
|
-
# bash phone_input.sh "hello world" # English text
|
|
26
|
-
# bash phone_input.sh "hello" -e # Type and press Enter
|
|
27
|
-
# bash phone_input.sh "你好" -m adbkbd # Chinese via ADBKeyboard
|
|
28
|
-
# bash phone_input.sh "new text" -c # Clear field first, then type
|
|
29
|
-
|
|
30
|
-
set -euo pipefail
|
|
31
|
-
|
|
32
|
-
DEVICE=""
|
|
33
|
-
METHOD="direct"
|
|
34
|
-
ENTER=false
|
|
35
|
-
CLEAR=false
|
|
36
|
-
QUIET=false
|
|
37
|
-
|
|
38
|
-
# Parse args
|
|
39
|
-
POSITIONAL=()
|
|
40
|
-
ARGV=("$@")
|
|
41
|
-
i=0
|
|
42
|
-
while [ $i -lt ${#ARGV[@]} ]; do
|
|
43
|
-
case "${ARGV[$i]}" in
|
|
44
|
-
-d) DEVICE="${ARGV[$((i+1))]}"; i=$((i+2)) ;;
|
|
45
|
-
-m) METHOD="${ARGV[$((i+1))]}"; i=$((i+2)) ;;
|
|
46
|
-
-e) ENTER=true; i=$((i+1)) ;;
|
|
47
|
-
-c) CLEAR=true; i=$((i+1)) ;;
|
|
48
|
-
-q) QUIET=true; i=$((i+1)) ;;
|
|
49
|
-
-*) echo "Unknown option: ${ARGV[$i]}" >&2; exit 1 ;;
|
|
50
|
-
*) POSITIONAL+=("${ARGV[$i]}"); i=$((i+1)) ;;
|
|
51
|
-
esac
|
|
52
|
-
done
|
|
53
|
-
|
|
54
|
-
if [ ${#POSITIONAL[@]} -eq 0 ]; then
|
|
55
|
-
echo "Usage: $0 <text> [-d device] [-m method] [-e] [-c] [-q]" >&2
|
|
56
|
-
exit 1
|
|
57
|
-
fi
|
|
58
|
-
|
|
59
|
-
TEXT="${POSITIONAL[0]}"
|
|
60
|
-
|
|
61
|
-
ADB_CMD="adb"
|
|
62
|
-
if [ -n "$DEVICE" ]; then
|
|
63
|
-
ADB_CMD="adb -s $DEVICE"
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
info() { $QUIET || echo "[phone_input] $*" >&2; }
|
|
67
|
-
warn() { echo "[phone_input] WARNING: $*" >&2; }
|
|
68
|
-
error() { echo "[phone_input] ERROR: $*" >&2; }
|
|
69
|
-
|
|
70
|
-
# Clear existing text if requested
|
|
71
|
-
if $CLEAR; then
|
|
72
|
-
info "Clearing existing text..."
|
|
73
|
-
# Select all (Ctrl+A) then delete
|
|
74
|
-
$ADB_CMD shell input keyevent KEYCODE_MOVE_HOME
|
|
75
|
-
$ADB_CMD shell input keyevent --longpress KEYCODE_SHIFT_LEFT KEYCODE_MOVE_END 2>/dev/null || true
|
|
76
|
-
$ADB_CMD shell input keyevent KEYCODE_DEL
|
|
77
|
-
sleep 0.3
|
|
78
|
-
fi
|
|
79
|
-
|
|
80
|
-
case "$METHOD" in
|
|
81
|
-
direct)
|
|
82
|
-
# Escape special characters for adb shell input text
|
|
83
|
-
# Replace spaces with %s, & with \&, etc.
|
|
84
|
-
ESCAPED=$(echo "$TEXT" | sed 's/ /%s/g; s/&/\\&/g; s/</\\</g; s/>/\\>/g; s/(/\\(/g; s/)/\\)/g; s/|/\\|/g; s/;/\\;/g; s/"/\\"/g; s/'"'"'/\\'"'"'/g')
|
|
85
|
-
info "Typing (direct): $TEXT"
|
|
86
|
-
$ADB_CMD shell input text "$ESCAPED"
|
|
87
|
-
;;
|
|
88
|
-
adbkbd)
|
|
89
|
-
info "Typing (ADBKeyboard): $TEXT"
|
|
90
|
-
# Check if ADBKeyboard is available; auto-install if missing
|
|
91
|
-
if ! $ADB_CMD shell ime list -s 2>/dev/null | grep -q "adbkeyboard"; then
|
|
92
|
-
warn "ADBKeyboard not found. Attempting auto-install..."
|
|
93
|
-
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
94
|
-
if [ -f "$SCRIPT_DIR/phone_setup.sh" ]; then
|
|
95
|
-
bash "$SCRIPT_DIR/phone_setup.sh" ${DEVICE:+-d "$DEVICE"} -q || {
|
|
96
|
-
error "Auto-install failed. Run manually: bash phone_setup.sh"
|
|
97
|
-
exit 1
|
|
98
|
-
}
|
|
99
|
-
info "ADBKeyboard auto-installed successfully"
|
|
100
|
-
else
|
|
101
|
-
echo "ERROR: ADBKeyboard not installed. Run phone_setup.sh first:" >&2
|
|
102
|
-
echo " bash phone_setup.sh" >&2
|
|
103
|
-
exit 1
|
|
104
|
-
fi
|
|
105
|
-
fi
|
|
106
|
-
$ADB_CMD shell am broadcast -a ADB_INPUT_TEXT --es msg "$TEXT" 2>/dev/null
|
|
107
|
-
;;
|
|
108
|
-
clipboard)
|
|
109
|
-
info "Typing (clipboard): $TEXT"
|
|
110
|
-
# Try to set clipboard and paste
|
|
111
|
-
$ADB_CMD shell "echo '$TEXT' | cmd clipboard set_text" 2>/dev/null || {
|
|
112
|
-
echo "ERROR: Clipboard method not supported on this device" >&2
|
|
113
|
-
exit 1
|
|
114
|
-
}
|
|
115
|
-
# Paste: Ctrl+V
|
|
116
|
-
$ADB_CMD shell input keyevent 279 # KEYCODE_PASTE
|
|
117
|
-
;;
|
|
118
|
-
*)
|
|
119
|
-
echo "ERROR: Unknown method '$METHOD'. Use: direct, adbkbd, clipboard" >&2
|
|
120
|
-
exit 1
|
|
121
|
-
;;
|
|
122
|
-
esac
|
|
123
|
-
|
|
124
|
-
# Press Enter if requested
|
|
125
|
-
if $ENTER; then
|
|
126
|
-
sleep 0.2
|
|
127
|
-
$ADB_CMD shell input keyevent KEYCODE_ENTER
|
|
128
|
-
info "Pressed Enter"
|
|
129
|
-
fi
|
|
130
|
-
|
|
131
|
-
info "Done."
|
|
132
|
-
echo "input_ok"
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# phone_launch.sh - Launch an Android app by name alias or package name
|
|
3
|
-
#
|
|
4
|
-
# Usage:
|
|
5
|
-
# bash phone_launch.sh <app_name_or_package> [options]
|
|
6
|
-
#
|
|
7
|
-
# Options:
|
|
8
|
-
# -d DEVICE_ID Target specific device
|
|
9
|
-
# -l List all known app aliases
|
|
10
|
-
# -q Quiet mode
|
|
11
|
-
#
|
|
12
|
-
# Supports common Chinese app aliases (case-insensitive):
|
|
13
|
-
# wechat, wecom, meituan, ctrip, xiaohongshu/xhs, bilibili,
|
|
14
|
-
# baidu, boss/bosszhipin, doubao, taobao, alipay, jd, didi,
|
|
15
|
-
# douyin/tiktok, kuaishou, zhihu, ele, pinduoduo/pdd, gaode/amap
|
|
16
|
-
#
|
|
17
|
-
# Examples:
|
|
18
|
-
# bash phone_launch.sh wechat
|
|
19
|
-
# bash phone_launch.sh com.tencent.mm
|
|
20
|
-
# bash phone_launch.sh -l
|
|
21
|
-
|
|
22
|
-
set -eo pipefail
|
|
23
|
-
|
|
24
|
-
DEVICE=""
|
|
25
|
-
QUIET=false
|
|
26
|
-
LIST=false
|
|
27
|
-
|
|
28
|
-
# Parse options manually to allow "phone_launch.sh <app> -d DEV" order
|
|
29
|
-
ARGV=()
|
|
30
|
-
i=1
|
|
31
|
-
while [ $i -le $# ]; do
|
|
32
|
-
arg="${!i}"
|
|
33
|
-
case "$arg" in
|
|
34
|
-
-d) i=$((i+1)); DEVICE="${!i}" ;;
|
|
35
|
-
-l) LIST=true ;;
|
|
36
|
-
-q) QUIET=true ;;
|
|
37
|
-
-h|--help) head -21 "$0" | tail -16; exit 0 ;;
|
|
38
|
-
-*) echo "Unknown option: $arg" >&2; exit 1 ;;
|
|
39
|
-
*) ARGV+=("$arg") ;;
|
|
40
|
-
esac
|
|
41
|
-
i=$((i+1))
|
|
42
|
-
done
|
|
43
|
-
|
|
44
|
-
# App alias -> package name lookup (bash 3.2 compatible)
|
|
45
|
-
resolve_app() {
|
|
46
|
-
local app
|
|
47
|
-
app=$(echo "$1" | tr '[:upper:]' '[:lower:]')
|
|
48
|
-
case "$app" in
|
|
49
|
-
wechat|weixin) echo "com.tencent.mm" ;;
|
|
50
|
-
wecom|qiyeweixin) echo "com.tencent.wework" ;;
|
|
51
|
-
meituan) echo "com.sankuai.meituan" ;;
|
|
52
|
-
ctrip|xiecheng) echo "ctrip.android.view" ;;
|
|
53
|
-
xiaohongshu|xhs) echo "com.xingin.xhs" ;;
|
|
54
|
-
bilibili) echo "tv.danmaku.bili" ;;
|
|
55
|
-
baidu) echo "com.baidu.searchbox" ;;
|
|
56
|
-
boss|bosszhipin) echo "com.hpbr.bosszhipin" ;;
|
|
57
|
-
doubao) echo "com.larus.nova" ;;
|
|
58
|
-
taobao) echo "com.taobao.taobao" ;;
|
|
59
|
-
alipay|zhifubao) echo "com.eg.android.AlipayGphone" ;;
|
|
60
|
-
jd|jingdong) echo "com.jingdong.app.mall" ;;
|
|
61
|
-
didi) echo "com.sdu.didi.psnger" ;;
|
|
62
|
-
douyin|tiktok) echo "com.ss.android.ugc.aweme" ;;
|
|
63
|
-
kuaishou) echo "com.smile.gifmaker" ;;
|
|
64
|
-
zhihu) echo "com.zhihu.android" ;;
|
|
65
|
-
ele|eleme) echo "me.ele" ;;
|
|
66
|
-
pinduoduo|pdd) echo "com.xunmeng.pinduoduo" ;;
|
|
67
|
-
gaode|amap) echo "com.autonavi.minimap" ;;
|
|
68
|
-
qq) echo "com.tencent.mobileqq" ;;
|
|
69
|
-
wps) echo "cn.wps.moffice_eng" ;;
|
|
70
|
-
settings) echo "com.android.settings" ;;
|
|
71
|
-
camera) echo "com.android.camera" ;;
|
|
72
|
-
chrome) echo "com.android.chrome" ;;
|
|
73
|
-
calendar) echo "com.google.android.calendar" ;;
|
|
74
|
-
maps) echo "com.google.android.apps.maps" ;;
|
|
75
|
-
phone) echo "com.android.dialer" ;;
|
|
76
|
-
contacts) echo "com.android.contacts" ;;
|
|
77
|
-
messages) echo "com.google.android.apps.messaging" ;;
|
|
78
|
-
gallery) echo "com.miui.gallery" ;;
|
|
79
|
-
files) echo "com.android.fileexplorer" ;;
|
|
80
|
-
*) echo "" ;;
|
|
81
|
-
esac
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
list_aliases() {
|
|
85
|
-
cat <<'ALIASES'
|
|
86
|
-
Known app aliases:
|
|
87
|
-
alipay/zhifubao -> com.eg.android.AlipayGphone
|
|
88
|
-
amap/gaode -> com.autonavi.minimap
|
|
89
|
-
baidu -> com.baidu.searchbox
|
|
90
|
-
bilibili -> tv.danmaku.bili
|
|
91
|
-
boss/bosszhipin -> com.hpbr.bosszhipin
|
|
92
|
-
calendar -> com.google.android.calendar
|
|
93
|
-
camera -> com.android.camera
|
|
94
|
-
chrome -> com.android.chrome
|
|
95
|
-
contacts -> com.android.contacts
|
|
96
|
-
ctrip/xiecheng -> ctrip.android.view
|
|
97
|
-
didi -> com.sdu.didi.psnger
|
|
98
|
-
doubao -> com.larus.nova
|
|
99
|
-
douyin/tiktok -> com.ss.android.ugc.aweme
|
|
100
|
-
ele/eleme -> me.ele
|
|
101
|
-
files -> com.android.fileexplorer
|
|
102
|
-
gallery -> com.miui.gallery
|
|
103
|
-
jd/jingdong -> com.jingdong.app.mall
|
|
104
|
-
kuaishou -> com.smile.gifmaker
|
|
105
|
-
maps -> com.google.android.apps.maps
|
|
106
|
-
meituan -> com.sankuai.meituan
|
|
107
|
-
messages -> com.google.android.apps.messaging
|
|
108
|
-
phone -> com.android.dialer
|
|
109
|
-
pinduoduo/pdd -> com.xunmeng.pinduoduo
|
|
110
|
-
qq -> com.tencent.mobileqq
|
|
111
|
-
settings -> com.android.settings
|
|
112
|
-
taobao -> com.taobao.taobao
|
|
113
|
-
wechat/weixin -> com.tencent.mm
|
|
114
|
-
wecom/qiyeweixin -> com.tencent.wework
|
|
115
|
-
wps -> cn.wps.moffice_eng
|
|
116
|
-
xiaohongshu/xhs -> com.xingin.xhs
|
|
117
|
-
zhihu -> com.zhihu.android
|
|
118
|
-
ALIASES
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if $LIST; then
|
|
122
|
-
list_aliases
|
|
123
|
-
exit 0
|
|
124
|
-
fi
|
|
125
|
-
|
|
126
|
-
if [ ${#ARGV[@]} -eq 0 ]; then
|
|
127
|
-
echo "Usage: $0 <app_name_or_package> [-d device] [-l] [-q]" >&2
|
|
128
|
-
exit 1
|
|
129
|
-
fi
|
|
130
|
-
|
|
131
|
-
APP_INPUT="${ARGV[0]}"
|
|
132
|
-
|
|
133
|
-
ADB_CMD="adb"
|
|
134
|
-
if [ -n "$DEVICE" ]; then
|
|
135
|
-
ADB_CMD="adb -s $DEVICE"
|
|
136
|
-
fi
|
|
137
|
-
|
|
138
|
-
info() { $QUIET || echo "[phone_launch] $*" >&2; }
|
|
139
|
-
|
|
140
|
-
# Resolve package name
|
|
141
|
-
PACKAGE=$(resolve_app "$APP_INPUT")
|
|
142
|
-
if [ -n "$PACKAGE" ]; then
|
|
143
|
-
info "Resolved '$APP_INPUT' -> $PACKAGE"
|
|
144
|
-
elif echo "$APP_INPUT" | grep -q '\.'; then
|
|
145
|
-
PACKAGE="$APP_INPUT"
|
|
146
|
-
info "Using package name directly: $PACKAGE"
|
|
147
|
-
else
|
|
148
|
-
# Try fuzzy search on device
|
|
149
|
-
info "Unknown alias '$APP_INPUT', searching on device..."
|
|
150
|
-
MATCHES=$($ADB_CMD shell pm list packages | grep -i "$APP_INPUT" | sed 's/package://' || true)
|
|
151
|
-
if [ -z "$MATCHES" ]; then
|
|
152
|
-
echo "ERROR: No package found matching '$APP_INPUT'" >&2
|
|
153
|
-
echo "Use -l to list known aliases, or provide full package name" >&2
|
|
154
|
-
exit 1
|
|
155
|
-
fi
|
|
156
|
-
PACKAGE=$(echo "$MATCHES" | head -1 | tr -d '\r')
|
|
157
|
-
info "Found package: $PACKAGE"
|
|
158
|
-
fi
|
|
159
|
-
|
|
160
|
-
# Launch the app
|
|
161
|
-
info "Launching $PACKAGE..."
|
|
162
|
-
$ADB_CMD shell monkey -p "$PACKAGE" -c android.intent.category.LAUNCHER 1 >/dev/null 2>&1
|
|
163
|
-
|
|
164
|
-
sleep 1
|
|
165
|
-
info "Done."
|
|
166
|
-
echo "$PACKAGE"
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# phone_screenshot.sh - Take a screenshot from connected Android phone via ADB
|
|
3
|
-
#
|
|
4
|
-
# Usage:
|
|
5
|
-
# bash phone_screenshot.sh [options]
|
|
6
|
-
#
|
|
7
|
-
# Options:
|
|
8
|
-
# -d DEVICE_ID Target specific device (default: first connected device)
|
|
9
|
-
# -o OUTPUT_PATH Output file path (default: /tmp/phone_screen.png)
|
|
10
|
-
# -s SCALE Scale percentage 1-100 (default: 50)
|
|
11
|
-
# -r Raw only - skip scaling, save native resolution
|
|
12
|
-
# -q Quiet mode - suppress info messages
|
|
13
|
-
#
|
|
14
|
-
# Output:
|
|
15
|
-
# Saves scaled screenshot to OUTPUT_PATH
|
|
16
|
-
# Prints the output file path on success
|
|
17
|
-
#
|
|
18
|
-
# Examples:
|
|
19
|
-
# bash phone_screenshot.sh # Default: 50% scale to /tmp/phone_screen.png
|
|
20
|
-
# bash phone_screenshot.sh -o /tmp/my.png -s 40 # 40% scale to custom path
|
|
21
|
-
# bash phone_screenshot.sh -d abc123 -r # Raw native resolution for specific device
|
|
22
|
-
|
|
23
|
-
set -euo pipefail
|
|
24
|
-
|
|
25
|
-
DEVICE=""
|
|
26
|
-
OUTPUT="/tmp/phone_screen.png"
|
|
27
|
-
SCALE=50
|
|
28
|
-
RAW=false
|
|
29
|
-
QUIET=false
|
|
30
|
-
|
|
31
|
-
while getopts "d:o:s:rq" opt; do
|
|
32
|
-
case $opt in
|
|
33
|
-
d) DEVICE="$OPTARG" ;;
|
|
34
|
-
o) OUTPUT="$OPTARG" ;;
|
|
35
|
-
s) SCALE="$OPTARG" ;;
|
|
36
|
-
r) RAW=true ;;
|
|
37
|
-
q) QUIET=true ;;
|
|
38
|
-
*) echo "Usage: $0 [-d device] [-o output] [-s scale%] [-r] [-q]" >&2; exit 1 ;;
|
|
39
|
-
esac
|
|
40
|
-
done
|
|
41
|
-
|
|
42
|
-
ADB_CMD="adb"
|
|
43
|
-
if [ -n "$DEVICE" ]; then
|
|
44
|
-
ADB_CMD="adb -s $DEVICE"
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
info() { $QUIET || echo "[phone_screenshot] $*" >&2; }
|
|
48
|
-
|
|
49
|
-
# Verify device connection
|
|
50
|
-
if ! $ADB_CMD get-state >/dev/null 2>&1; then
|
|
51
|
-
echo "ERROR: No device connected or device unauthorized" >&2
|
|
52
|
-
echo "Run 'adb devices' to check connection status" >&2
|
|
53
|
-
exit 1
|
|
54
|
-
fi
|
|
55
|
-
|
|
56
|
-
REMOTE_PATH="/sdcard/screen_$(date +%s).png"
|
|
57
|
-
RAW_PATH="/tmp/phone_raw_$$.png"
|
|
58
|
-
|
|
59
|
-
info "Capturing screenshot..."
|
|
60
|
-
$ADB_CMD shell screencap -p "$REMOTE_PATH"
|
|
61
|
-
|
|
62
|
-
info "Pulling to local..."
|
|
63
|
-
$ADB_CMD pull "$REMOTE_PATH" "$RAW_PATH" >/dev/null 2>&1
|
|
64
|
-
|
|
65
|
-
info "Cleaning up device temp file..."
|
|
66
|
-
$ADB_CMD shell rm -f "$REMOTE_PATH"
|
|
67
|
-
|
|
68
|
-
if $RAW; then
|
|
69
|
-
mv "$RAW_PATH" "$OUTPUT"
|
|
70
|
-
info "Saved raw screenshot to $OUTPUT"
|
|
71
|
-
else
|
|
72
|
-
# Get native resolution from the image
|
|
73
|
-
NATIVE_W=$(sips -g pixelWidth "$RAW_PATH" | tail -1 | awk '{print $2}')
|
|
74
|
-
NATIVE_H=$(sips -g pixelHeight "$RAW_PATH" | tail -1 | awk '{print $2}')
|
|
75
|
-
|
|
76
|
-
SCALED_W=$((NATIVE_W * SCALE / 100))
|
|
77
|
-
SCALED_H=$((NATIVE_H * SCALE / 100))
|
|
78
|
-
|
|
79
|
-
info "Native: ${NATIVE_W}x${NATIVE_H} -> Scaled (${SCALE}%): ${SCALED_W}x${SCALED_H}"
|
|
80
|
-
sips --resampleHeightWidth "$SCALED_H" "$SCALED_W" "$RAW_PATH" --out "$OUTPUT" >/dev/null 2>&1
|
|
81
|
-
|
|
82
|
-
rm -f "$RAW_PATH"
|
|
83
|
-
info "Saved scaled screenshot to $OUTPUT"
|
|
84
|
-
fi
|
|
85
|
-
|
|
86
|
-
# Output the path for easy capture by calling scripts
|
|
87
|
-
echo "$OUTPUT"
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
phone_security_kbd.py - Handle randomized security keyboards on Android.
|
|
4
|
-
|
|
5
|
-
Financial apps (banking, stock trading) use security keyboards where digit
|
|
6
|
-
positions change every time. This script reads the UI dump to map digit
|
|
7
|
-
positions and types a sequence by tapping each digit.
|
|
8
|
-
|
|
9
|
-
Usage:
|
|
10
|
-
python3 phone_security_kbd.py <digits> [options]
|
|
11
|
-
|
|
12
|
-
Options:
|
|
13
|
-
-d DEVICE_ID Target specific device
|
|
14
|
-
-f XML_FILE Use existing UI dump XML file
|
|
15
|
-
--delay MS Delay between taps in ms (default: 200)
|
|
16
|
-
--dry-run Show mapped positions without tapping
|
|
17
|
-
-q Quiet mode
|
|
18
|
-
|
|
19
|
-
How it works:
|
|
20
|
-
1. Dumps the UI hierarchy via uiautomator
|
|
21
|
-
2. Finds all clickable elements with numeric content-desc (0-9)
|
|
22
|
-
3. Maps each digit to its center coordinates
|
|
23
|
-
4. Taps each digit in sequence with configurable delay
|
|
24
|
-
|
|
25
|
-
Examples:
|
|
26
|
-
python3 phone_security_kbd.py "123456" # Type PIN 123456
|
|
27
|
-
python3 phone_security_kbd.py "888888" --dry-run # Show positions only
|
|
28
|
-
python3 phone_security_kbd.py "1234" --delay 300 # Slower tapping
|
|
29
|
-
python3 phone_security_kbd.py "0000" -f /tmp/ui.xml # Use existing dump
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
import argparse
|
|
33
|
-
import os
|
|
34
|
-
import re
|
|
35
|
-
import subprocess
|
|
36
|
-
import sys
|
|
37
|
-
import tempfile
|
|
38
|
-
import time
|
|
39
|
-
import xml.etree.ElementTree as ET
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def run_adb(device, *args):
|
|
43
|
-
cmd = ["adb"]
|
|
44
|
-
if device:
|
|
45
|
-
cmd += ["-s", device]
|
|
46
|
-
cmd += list(args)
|
|
47
|
-
result = subprocess.run(cmd, capture_output=True, text=True)
|
|
48
|
-
return result.stdout, result.stderr, result.returncode
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def dump_ui(device=None):
|
|
52
|
-
remote_path = "/sdcard/ui_kbd.xml"
|
|
53
|
-
local_path = os.path.join(tempfile.gettempdir(), f"phone_kbd_{os.getpid()}.xml")
|
|
54
|
-
|
|
55
|
-
_, stderr, rc = run_adb(device, "shell", "uiautomator", "dump", remote_path)
|
|
56
|
-
if rc != 0:
|
|
57
|
-
print(f"ERROR: uiautomator dump failed: {stderr}", file=sys.stderr)
|
|
58
|
-
sys.exit(1)
|
|
59
|
-
|
|
60
|
-
_, stderr, rc = run_adb(device, "pull", remote_path, local_path)
|
|
61
|
-
if rc != 0:
|
|
62
|
-
print(f"ERROR: Failed to pull UI dump: {stderr}", file=sys.stderr)
|
|
63
|
-
sys.exit(1)
|
|
64
|
-
|
|
65
|
-
run_adb(device, "shell", "rm", "-f", remote_path)
|
|
66
|
-
return local_path
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def parse_keyboard_map(xml_path):
|
|
70
|
-
"""Parse UI dump and return dict of digit/char -> (center_x, center_y)."""
|
|
71
|
-
tree = ET.parse(xml_path)
|
|
72
|
-
root = tree.getroot()
|
|
73
|
-
kbd_map = {}
|
|
74
|
-
|
|
75
|
-
for node in root.iter():
|
|
76
|
-
desc = node.get("content-desc", "").strip()
|
|
77
|
-
text = node.get("text", "").strip()
|
|
78
|
-
bounds = node.get("bounds", "")
|
|
79
|
-
clickable = node.get("clickable", "false")
|
|
80
|
-
|
|
81
|
-
if not bounds or clickable != "true":
|
|
82
|
-
continue
|
|
83
|
-
|
|
84
|
-
# Use content-desc first, fallback to text
|
|
85
|
-
label = desc or text
|
|
86
|
-
if not label:
|
|
87
|
-
continue
|
|
88
|
-
|
|
89
|
-
m = re.findall(r"\d+", bounds)
|
|
90
|
-
if len(m) != 4:
|
|
91
|
-
continue
|
|
92
|
-
|
|
93
|
-
x1, y1, x2, y2 = int(m[0]), int(m[1]), int(m[2]), int(m[3])
|
|
94
|
-
cx = (x1 + x2) // 2
|
|
95
|
-
cy = (y1 + y2) // 2
|
|
96
|
-
|
|
97
|
-
# Map single digits and common labels
|
|
98
|
-
if label in "0123456789":
|
|
99
|
-
kbd_map[label] = (cx, cy)
|
|
100
|
-
elif label.lower() in ("delete", "backspace", "del", "删除"):
|
|
101
|
-
kbd_map["delete"] = (cx, cy)
|
|
102
|
-
elif label.lower() in ("confirm", "ok", "done", "确定", "确认", "完成"):
|
|
103
|
-
kbd_map["confirm"] = (cx, cy)
|
|
104
|
-
elif label == ".":
|
|
105
|
-
kbd_map["."] = (cx, cy)
|
|
106
|
-
|
|
107
|
-
return kbd_map
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
def tap_digit(device, x, y):
|
|
111
|
-
run_adb(device, "shell", "input", "tap", str(x), str(y))
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def main():
|
|
115
|
-
parser = argparse.ArgumentParser(description="Type on security keyboard")
|
|
116
|
-
parser.add_argument("digits", help="Digits to type (e.g., '123456')")
|
|
117
|
-
parser.add_argument("-d", "--device", help="Target device ID")
|
|
118
|
-
parser.add_argument("-f", "--file", help="Existing UI dump XML")
|
|
119
|
-
parser.add_argument("--delay", type=int, default=200, help="Delay between taps (ms)")
|
|
120
|
-
parser.add_argument("--dry-run", action="store_true", help="Show positions only")
|
|
121
|
-
parser.add_argument("-q", "--quiet", action="store_true", help="Quiet mode")
|
|
122
|
-
args = parser.parse_args()
|
|
123
|
-
|
|
124
|
-
info = lambda msg: None if args.quiet else print(f"[security_kbd] {msg}", file=sys.stderr)
|
|
125
|
-
|
|
126
|
-
# Get UI dump
|
|
127
|
-
if args.file:
|
|
128
|
-
xml_path = args.file
|
|
129
|
-
cleanup = False
|
|
130
|
-
else:
|
|
131
|
-
info("Dumping UI hierarchy...")
|
|
132
|
-
xml_path = dump_ui(args.device)
|
|
133
|
-
cleanup = True
|
|
134
|
-
|
|
135
|
-
# Parse keyboard layout
|
|
136
|
-
kbd_map = parse_keyboard_map(xml_path)
|
|
137
|
-
|
|
138
|
-
if cleanup:
|
|
139
|
-
os.unlink(xml_path)
|
|
140
|
-
|
|
141
|
-
if not kbd_map:
|
|
142
|
-
print("ERROR: No keyboard digits found in UI dump", file=sys.stderr)
|
|
143
|
-
print("Make sure a security keyboard is visible on screen", file=sys.stderr)
|
|
144
|
-
sys.exit(1)
|
|
145
|
-
|
|
146
|
-
info(f"Keyboard map: { {k: v for k, v in sorted(kbd_map.items()) if k in '0123456789'} }")
|
|
147
|
-
|
|
148
|
-
# Validate all digits are mappable
|
|
149
|
-
for ch in args.digits:
|
|
150
|
-
if ch not in kbd_map:
|
|
151
|
-
print(f"ERROR: Digit '{ch}' not found on keyboard. Available: {sorted(kbd_map.keys())}", file=sys.stderr)
|
|
152
|
-
sys.exit(1)
|
|
153
|
-
|
|
154
|
-
if args.dry_run:
|
|
155
|
-
print("Dry run - would tap:")
|
|
156
|
-
for ch in args.digits:
|
|
157
|
-
x, y = kbd_map[ch]
|
|
158
|
-
print(f" '{ch}' -> ({x}, {y})")
|
|
159
|
-
return
|
|
160
|
-
|
|
161
|
-
# Type each digit
|
|
162
|
-
for i, ch in enumerate(args.digits):
|
|
163
|
-
x, y = kbd_map[ch]
|
|
164
|
-
info(f"Tapping '{ch}' at ({x}, {y})")
|
|
165
|
-
tap_digit(args.device, x, y)
|
|
166
|
-
if i < len(args.digits) - 1:
|
|
167
|
-
time.sleep(args.delay / 1000.0)
|
|
168
|
-
|
|
169
|
-
info(f"Typed {len(args.digits)} digits successfully")
|
|
170
|
-
print("kbd_input_ok")
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if __name__ == "__main__":
|
|
174
|
-
main()
|