sdks/python
开发模版与 SDK

Python 极简 SDK

纯 requests 实现的单文件 LanghuaClient,即拷即用

无需安装庞大的外部依赖,将以下单文件直接拷入你的 Python 项目中即可调用全部真机能力。


客户端源码 (langhua_client.py)

import requests
import json
from typing import List, Dict, Any, Optional

class LanghuaClient:
    def __init__(self, base_url: str = "http://localhost:58166", app_key: str = ""):
        self.base_url = base_url.rstrip("/")
        self.headers = {"Content-Type": "application/json", "X-AppKey": app_key}

    def _execute(self, device_id: str, skill_id: str, params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
        """统一指令下发通道"""
        payload = {"device_id": device_id, "skill_id": skill_id, "params": params or {}}
        res = requests.post(f"{self.base_url}/gateway/skill/execute", json=payload, headers=self.headers)
        return res.json()

    # --- 1. 设备与状态 ---
    def list_devices(self) -> List[Dict[str, Any]]:
        """获取所有已绑定在线手机"""
        res = requests.get(f"{self.base_url}/gateway/device/list", headers=self.headers)
        return res.json().get("data", [])

    def unlock(self, device_id: str, credential: str = "") -> Dict[str, Any]:
        """唤醒屏幕并解锁 (黑屏时自动点亮)"""
        return self._execute(device_id, "system.unlock", {"credential": credential})

    # --- 2. 触控与手势 ---
    def tap(self, device_id: str, x: int, y: int, duration: int = 100) -> Dict[str, Any]:
        """点击屏幕物理坐标 (x, y)"""
        return self._execute(device_id, "ui.tap", {"x": x, "y": y, "duration": duration})

    def swipe(self, device_id: str, x1: int, y1: int, x2: int, y2: int, duration: int = 350, steps: int = 15) -> Dict[str, Any]:
        """拟人化平滑滑动 (从 x1,y1 到 x2,y2)"""
        return self._execute(device_id, "ui.swipe", {
            "x1": x1, "y1": y1, "x2": x2, "y2": y2, "duration": duration, "steps": steps
        })

    def scroll(self, device_id: str, action: str = "PAGE_DOWN") -> Dict[str, Any]:
        """整页滚动 (PAGE_DOWN / PAGE_UP / LEFT / RIGHT)"""
        return self._execute(device_id, "ui.scroll", {"action": action})

    def input_text(self, device_id: str, text: str, x: Optional[int] = None, y: Optional[int] = None, clear: bool = True) -> Dict[str, Any]:
        """拟真逐字输入 (可指定 x, y 自动先点击获焦)"""
        params = {"text": text, "clear": clear, "delay": 150}
        if x is not None and y is not None:
            params["x"] = x
            params["y"] = y
        return self._execute(device_id, "ui.input", params)

    def press_key(self, device_id: str, key_code: int = 4) -> Dict[str, Any]:
        """物理按键 (4=Back, 3=Home, 187=Recents, 66=Enter)"""
        return self._execute(device_id, "control.key_event", {"keyCode": key_code})

    # --- 3. 应用管理 ---
    def launch_app(self, device_id: str, package_name: str) -> Dict[str, Any]:
        """启动应用 (息屏状态自动唤醒解锁)"""
        return self._execute(device_id, "app.launch", {"package_name": package_name})

    def get_current_app(self, device_id: str) -> Dict[str, Any]:
        """获取当前活跃的前台应用与 Activity 界面"""
        return self._execute(device_id, "app.get_current").get("data", {})

    def grant_permission(self, device_id: str, package_name: str, permission: str) -> Dict[str, Any]:
        """驱动级静默授予应用敏感权限 (无弹窗)"""
        return self._execute(device_id, "app.grant_permission", {"package_name": package_name, "permission": permission})

    # --- 4. 视觉与媒体 ---
    def screenshot(self, device_id: str, quality: int = 50, scale: float = 0.5) -> Dict[str, Any]:
        """抓取采集 (返回 image_base64, width, height)"""
        res = self._execute(device_id, "control.screenshot_info", {"quality": quality, "scale": scale})
        return res.get("data", {})

    def download_to_gallery(self, device_id: str, image_urls: List[str]) -> Dict[str, Any]:
        """将图片批量写入系统相册第一位 (发帖发圈神器)"""
        return self._execute(device_id, "media.download_image", {"image_urls": image_urls})

30 秒自动化运行示例

from langhua_client import LanghuaClient
import time

client = LanghuaClient(base_url="http://localhost:58166", app_key="sk-lh-xxxxxx")

# 1. 查找首台设备
devices = client.list_devices()
device_id = devices[0]["deviceId"]

# 2. 启动微信 (若手机息屏会自动唤醒并解锁)
client.launch_app(device_id, "com.tencent.mm")
time.sleep(2)

# 3. 打印当前前台界面
print("当前前台:", client.get_current_app(device_id))

# 4. 点击搜索栏并在指定坐标输入关键词 (自动获焦)
client.input_text(device_id, "客服小助手", x=540, y=320)