开发模版与 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)