VMOS Cloud API
  • 简体中文
  • English
  • 简体中文
  • English
  • 产品介绍
  • 产品类型
  • 产品计费
  • OpenAPI
    • 接口文档
    • 错误码
    • 实例属性列表
    • 安卓改机属性列表
  • Android端 SDK
    • 示例搭建
    • 接口说明
    • 回调函数
    • 错误码
    • 更新日志
  • Web H5端 SDK
    • 示例搭建
    • 接口说明
    • 回调函数
    • 错误码
    • 更新日志
  • Windows PC端 SDK
    • 示例搭建
    • 接口说明
    • 回调函数
    • 更新日志
  • 端侧与云机通信开发
    • AIDL接入方式
    • 系统服务API(aidl)
  • 类XP、LSP Hook框架
  • 相关协议

简介

本文档为您提供具体的 API 描述、语法、参数说明及示例等,您可以调用 API 管理云手机服务资源。

更新记录

2025-03-20

  • 新增 查询一键新机支持国家列表 接口
  • 新增 分页获取真机模板 接口
  • 更新 一键新机 接口

2025-03-19

  • 更新 新建/续费云手机 接口

2025-03-12

  • 更新 修改通讯录 接口
  • 新增 修改实例wifi属性 接口

2025-03-04

  • 新增 换机 接口
  • 新增 设置保活应用接口 接口

2025-02-27

  • 新增 文件通过链接直接上传接口 接口

2025-02-26

  • 新增 根据国家code修改sim卡信息 接口

2025-02-20

  • 新增 实例安装应用列表查询 接口

2025-02-12

  • 更新 创建自动化任务 接口支持添加视频点赞评论任务

2025-02-08

  • 更新 回调相关 接口
  • 更新 设置智能IP 接口
  • 更新 取消智能IP 接口
  • 新增 设备任务执行结果查询 接口

2025-02-07

  • 更新 智能IP代理检测 接口

2025-02-06

  • 新增 开关root权限 接口
  • 新增 云机状态示例 描述
  • 优化 自动化任务类型请求参数描述

2025-01-26

  • 新增 查询实例属性 接口
  • 新增 批量查询实例属性 接口
  • 新增 修改实例属性 接口
  • 更新 修改通讯录 接口
  • 新增 修改真机ADI模板 接口

2025-01-23

  • 新增 智能IP代理检测 接口
  • 新增 设置智能IP 接口
  • 新增 取消智能IP 接口

2025-01-22

  • 新增GET请求获取签名JAVA示例demo

2025-01-21

  • 新增 sku套餐列表 接口
  • 优化 新建/续费云手机 接口支持续费功能

2025-01-16

  • 新增 本地截图 接口
  • 新增 根据padCode获取SDK临时token 接口
  • 新增 获取SDK临时token 接口
  • 新增 清除SDK授权Token 接口
  • 新增 升级镜像 接口
  • 新增 升级真机镜像 接口

2025-01-08

  • 新增 自动化任务列表查询 接口
  • 新增 创建自动化任务 接口
  • 新增 自动化任务取消 接口
  • 新增 自动化任务重试 接口
  • 新增 应用详情 接口

2025-01-07

  • 新增 新建/续费云手机 接口
  • 新增 云手机列表 接口
  • 新增 云手机信息查询 接口
  • 新增 修改实例时区 接口
  • 新增 修改实例语言 接口
  • 新增 设置实例经纬度 接口
  • 新增 应用卸载 接口
  • 新增 应用启动 接口
  • 新增 应用停止 接口
  • 新增 应用重启 接口

2024-12-17

  • 新增 文件上传 接口
  • 新增 实例文件上传 接口

2024-12-12

  • 新增 实例设置代理 接口
  • 新增 一键新机 接口

2024-12-09

  • 新增 修改通讯录 接口
  • 新增 应用上传 接口
  • 新增 文件任务详情 接口
  • 新增 应用安装 接口

2024-12-09

  • 文档发布

调用说明

前置条件

获取账号的 Access Key ID 和 Secret Access Key (AK/SK),用于 API 请求鉴权。请联系技术对接人获取

公共请求参数

接口每次请求时,Headers中必须包含以下四个参数进行身份验证,否则接口无法正常请求。

参数名类型示例值参数描述
x-datestring20240301T093700Z发送请求的时间戳,使用UTC时间,精确到秒
x-hoststringopenapi.armcloud.net接口访问域名
authorizationstringHMAC-SHA256 Credential={AccessKey}, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature={Signature}发送的请求中包含的签名
Content-Typestringapplication/json资源的MIME类型

Authorization签名机制

对于每一次 HTTPS 协议请求,会根据访问中的签名信息验证访问请求者的身份。具体由用户账号对应的 AccessKey ID 和 AccessKey Secret(AK/SK)加密验证实现。

手动签名

注意

签名需要对请求参数进行一系列处理,包括排序、拼接、加密等步骤。这种方法提供了更大的灵活性和可定制性,适用于开发者对签名算法有深入理解的情况。然而,手动签名需要开发者编写额外的代码来实现签名过程,可能会增加开发难度和出错的可能性,因此我们依然建议您使用SDK来调用API,尽量避免自行编写签名代码。若您需要了解签名计算的原理和具体过程,可参考以下文档。

手动签名机制要求请求者对请求参数进行哈希值计算,经过加密后同 API 请求一起发送到服务器中,服务器将以同样的机制对收到的请求进行签名计算,并将其与请求者传来的签名进行比对,若签名未通过验证,请求将被拒绝。

获取账号的 Access Key ID 和 Secret Access Key (AK/SK),用于 API 请求鉴权。请联系技术对接人获取

构建规范请求字符串(CanonicalRequest)
 String canonicalStringBuilder=
 	"host:"+*${host}*+"\n"+
 	"x-date:"+*${xDate}*+"\n"+
 	"content-type:"+*${contentType}*+"\n"+
 	"signedHeaders:"+*${signedHeaders}*+"\n"+
 	"x-content-sha256:"+*${xContentSha256}*;
字段解释
host请求服务域名。固定为:api.vmoscloud.com
x-date指代请求 UTC 时间,即请求头公共参数中 X-Date 的取值,使用遵循 ISO 8601 标准的格式:YYYYMMDD'T'HHMMSS'Z' ,例如:20201103T104027Z
content-type请求或响应正文的媒体类型(application/json)
signedHeaders参与签名的Header,和CanonicalHeaders包含的Header是一一对应的,目的是指明哪些Header参与签名计算,从而忽略请求被proxy添加的额外Header,其中host、x-date如果存在Header中则必选参与
伪代码如下:
SignedHeaders=Lowercase(HeaderName0)+';'+Lowercase(HeaderName1)+";"+...+Lowercase(HeaderNameN)
示例:
SignedHeaders=content-type;host;x-content-sha256;x-date
x-content-sha256hashSHA256(body)注:body要去空格后再去计算hashSHA256
构建待签名字符串(StringToSign)

签名字符串主要包含请求以及规范化请求的元数据信息,由签名算法、请求日期、信任状和规范化请求哈希值连接组成。

构建待签名字符串,伪代码如下:

StringToSign=
	Algorithm+'\n'+
	xDate+'\n'+
	CredentialScope+'\n'+
	hashSHA256(canonicalStringBuilder.getByte())
字段解释
Algorithm指代签名的算法,目前仅支持 HMAC-SHA256 的签名算法。
x-date指代请求 UTC 时间,即请求头公共参数中 X-Date 的取值,使用遵循 ISO 8601 标准的格式:YYYYMMDD'T'HHMMSS'Z' ,例如:20201103T104027Z
CredentialScope指代信任状,格式为: ${YYYYMMDD}/${service}/request,其中${YYYYMMDD}取 X-Date 中的日期,${service} 固定为armcloud-paas,request为固定值。
参考下方《计算CredentialScope》
CanonicalRequest指构建规范请求字符串的结果。
计算CredentialScope
String credentialScope = shortXDate+"/"+service+"/request";
	shortXDate:短请求时间(x-date截取前8位示例:20201103)
	service:服务名(固定填armcloud-paas)
	"/request":固定值

Signingkey示例

HMAC哈希操作序列生成的派生签名密钥

byte[]Signingkey=hmacSHA256(hmacSHA256(hmacSHA256(sk.getBytes(),shortXDate),service),”request”);
字段解释
sk客户密钥
shortXDate短请求日期
Service服务名暂时固定填armcloud-paas

Signature示例

signature=HexEncode(hmacSHA256(Signingkey,StringToSign))

Signature生成工具类示例(java)

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;

public class PaasSignUtils {

    public static final String service = "armcloud-paas";

    public static String signature(String contentType, String signedHeaders, String host, String xDate, String sk, byte[] body) throws Exception {

        if (body == null) {
            body = new byte[0];
        }
        String xContentSha256 = hashSHA256(body);
        String shortXDate = xDate.substring(0, 8);

        String canonicalStringBuilder = "host:" + host + "\n" + "x-date:" + xDate + "\n" + "content-type:" + contentType + "\n" + "signedHeaders:" + signedHeaders + "\n" + "x-content-sha256:" + xContentSha256;

        String hashcanonicalString = hashSHA256(canonicalStringBuilder.getBytes());

        String credentialScope = shortXDate + "/" + service + "/request";
        String signString = "HMAC-SHA256" + "\n" + xDate + "\n" + credentialScope + "\n" + hashcanonicalString;

        byte[] signKey = genSigningSecretKeyV4(sk, shortXDate, service);
        return bytesToHex(hmacSHA256(signKey, signString));
    }

    public static String hashSHA256(byte[] content) throws Exception {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            return bytesToHex(md.digest(content));
        } catch (Exception e) {
            throw new Exception("Unable to compute hash while signing request: " + e.getMessage(), e);
        }
    }

    public static byte[] hmacSHA256(byte[] key, String content) throws Exception {
        try {
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(key, "HmacSHA256"));
            return mac.doFinal(content.getBytes());
        } catch (Exception e) {
            throw new Exception("Unable to calculate a request signature: " + e.getMessage(), e);
        }
    }

    private static byte[] genSigningSecretKeyV4(String secretKey, String date, String service) throws Exception {
        byte[] kDate = hmacSHA256((secretKey).getBytes(), date);
        byte[] kService = hmacSHA256(kDate, service);
        return hmacSHA256(kService, "request");
    }

    public static String bytesToHex(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return "";
        }
        final StringBuilder result = new StringBuilder();
        for (byte b : bytes) {
            result.append(String.format("%02x", b));
        }
        return result.toString();
    }

}

接口调用demo示例(java)

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@Component
public class ApiRequestUtils {
    private static final String API_HOST = "api.vmoscloud.com";
    private static final String CONTENT_TYPE = "application/json;charset=UTF-8";
    private static final String ACCESS_KEY = "Access Key ID";
    private static final String SECRET_ACCESS_KEY = "Secret Access Key";

    /**
     * 测试调用
     */
    public static void main(String[] args) {
        //POST请求
        JSONObject params = new JSONObject();
        params.put("taskIds", new int[]{4224});
        String url = "https://api.vmoscloud.com/vcpcloud/api/padApi/padTaskDetail";
        String result = sendPostRequest(url, params);
        System.out.println(result);

        //GET请求
//        String url = "https://api.vmoscloud.com/vcpcloud/api/padApi/stsToken";
//        String result = sendGetRequest(url, null);
    }

    public static String sendGetRequest(String url, JSONObject params) {
        String xDate = DateToUTC(LocalDateTime.now());
        StringBuilder urlWithParams = new StringBuilder(url);

        // 构建 URL 参数
        if (params != null && !params.isEmpty()) {
            urlWithParams.append("?");
            params.forEach((key, value) ->
                    urlWithParams.append(key).append("=").append(value).append("&")
            );
            // 去掉最后的 "&"
            urlWithParams.setLength(urlWithParams.length() - 1);
        }

        HttpGet httpGet = new HttpGet(urlWithParams.toString());

        // 设置公共头部
        httpGet.setHeader("content-type", CONTENT_TYPE);
        httpGet.setHeader("x-host", API_HOST);
        httpGet.setHeader("x-date", xDate);

        // 生成 Authorization 头部
        String authorizationHeader = getAuthorizationHeader(xDate, params == null ? null : params.toJSONString(), SECRET_ACCESS_KEY);
        httpGet.setHeader("authorization", authorizationHeader);

        // 执行请求
        try (CloseableHttpClient httpClient = HttpClients.createDefault();
             CloseableHttpResponse response = httpClient.execute(httpGet)) {

            HttpEntity responseEntity = response.getEntity();
            return EntityUtils.toString(responseEntity, StandardCharsets.UTF_8);

        } catch (Exception e) {
            throw new RuntimeException("Request failed", e);
        }
    }


    /**
     * 公共请求方法
     */
    public static String sendPostRequest(String url, JSONObject params) {
        String xDate = DateToUTC(LocalDateTime.now());
        HttpPost httpPost = new HttpPost(url);

        // 设置公共头部
        httpPost.setHeader("content-type", CONTENT_TYPE);
        httpPost.setHeader("x-host", API_HOST);
        httpPost.setHeader("x-date", xDate);

        // 生成 Authorization 头部
        String authorizationHeader = getAuthorizationHeader(xDate, params.toJSONString(), SECRET_ACCESS_KEY);
        httpPost.setHeader("authorization", authorizationHeader);

        // 设置请求体
        StringEntity entity = new StringEntity(params.toJSONString(), StandardCharsets.UTF_8);
        httpPost.setEntity(entity);

        // 执行请求
        try (CloseableHttpClient httpClient = HttpClients.createDefault();
             CloseableHttpResponse response = httpClient.execute(httpPost)) {

            HttpEntity responseEntity = response.getEntity();
            return EntityUtils.toString(responseEntity, StandardCharsets.UTF_8);

        } catch (Exception e) {
            throw new RuntimeException("Request failed", e);
        }
    }


    /**
     * 使用UTC时间,精确到秒
     *
     * @param dateTime LocalDateTime
     * @return String
     */
    public static String DateToUTC(LocalDateTime dateTime) {
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmss'Z'");
        return dateTime.format(formatter);
    }


    /**
     * 获取签名
     */
    private static String getSign(String xDate, String sk, String requestBody) throws Exception {
        String body = requestBody == null ? null : JSONObject.parseObject(requestBody, Feature.OrderedField).toJSONString();
        return PaasSignUtils.signature(CONTENT_TYPE, "content-type;host;x-content-sha256;x-date", API_HOST, xDate, sk, body == null ? null : body.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 获取Authorization头
     */
    private static String getAuthorizationHeader(String currentTimestamp, String body, String sk) {
        try {
            String sign = getSign(currentTimestamp, sk, body);
            return String.format("HMAC-SHA256 Credential=%s, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=%s", ACCESS_KEY, sign);
        } catch (Exception e) {
            throw new RuntimeException("Failed to generate signature", e);
        }
    }

}

接口调用demo示例(python)

import binascii
import datetime
import hmac
import hashlib
import json
import traceback

import requests


def get_signature(data, x_date, host, content_type, signed_headers, sk):
    # 给定的JSON数据
    # TODO 将JSON数据转换为字符串 (修改的地方,传入的json需要去除空格)
    json_string = json.dumps(data, separators=(',', ':'), ensure_ascii = False)
    print(json_string)

    # 计算SHA-256哈希值
    hash_object = hashlib.sha256(json_string.encode())
    x_content_sha256 = hash_object.hexdigest()

    # 使用f-string构建canonicalStringBuilder
    canonical_string_builder = (
        f"host:{host}\n"
        f"x-date:{x_date}\n"
        f"content-type:{content_type}\n"
        f"signedHeaders:{signed_headers}\n"
        f"x-content-sha256:{x_content_sha256}"
    )

    # 假设这些变量已经被赋值
    # short_x_date = datetime.datetime.now().strftime("%Y%m%d")  # 短请求时间,例如:"20240101"
    short_x_date = x_date[:8]  # 短请求时间,例如:"20240101"
    service = "armcloud-paas"  # 服务名

    # 构建credentialScope
    credential_scope = "{}/{}/request".format(short_x_date, service)

    # 假设这些变量已经被赋值
    algorithm = "HMAC-SHA256"

    # 计算canonicalStringBuilder的SHA-256哈希值
    hash_sha256 = hashlib.sha256(canonical_string_builder.encode()).hexdigest()
    # 构建StringToSign
    string_to_sign = (
            algorithm + '\n' +
            x_date + '\n' +
            credential_scope + '\n' +
            hash_sha256
    )

    # 假设这些变量已经被赋值
    service = "armcloud-paas"  # 服务名

    # 第一次hmacSHA256
    first_hmac = hmac.new(sk.encode(), digestmod=hashlib.sha256)
    first_hmac.update(short_x_date.encode())
    first_hmac_result = first_hmac.digest()

    # 第二次hmacSHA256
    second_hmac = hmac.new(first_hmac_result, digestmod=hashlib.sha256)
    second_hmac.update(service.encode())
    second_hmac_result = second_hmac.digest()

    # 第三次hmacSHA256
    signing_key = hmac.new(second_hmac_result, b'request', digestmod=hashlib.sha256).digest()

    # 使用signing_key和string_to_sign计算HMAC-SHA256
    signature_bytes = hmac.new(signing_key, string_to_sign.encode(), hashlib.sha256).digest()

    # 将HMAC-SHA256的结果转换为十六进制编码的字符串
    signature = binascii.hexlify(signature_bytes).decode()

    return signature


def paas_url_util(url, data, ak, sk):
    x_date = datetime.datetime.now().strftime("%Y%m%dT%H%M%SZ")
    content_type = "application/json"
    signed_headers = f"content-type;host;x-content-sha256;x-date"
    ShortDate = x_date[:8]
    host = "openapi-hk.armcloud.net"
    # 获取signature
    signature = get_signature(data, x_date, host, content_type, signed_headers, sk)
    url = f"http://openapi-hk.armcloud.net{url}"
    payload = json.dumps(data)
    headers = {
        'Content-Type': content_type,
        'x-date': x_date,
        'x-host': host,
        'authorization': f"HMAC-SHA256 Credential={ak}/{ShortDate}/armcloud-paas/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature={signature}"
    }
    response = requests.request("POST", url, headers=headers, data=payload)
    return response.json()


def vmos_url_util(url, data, AccessKey, sk):
    x_date = datetime.datetime.now().strftime("%Y%m%dT%H%M%SZ")
    content_type = "application/json;charset=UTF-8"
    signed_headers = f"content-type;host;x-content-sha256;x-date"
    ShortDate = x_date[:8]
    host = "api.vmoscloud.com"

    # 获取signature
    signature = get_signature(data, x_date, host, content_type, signed_headers, sk)
    url = f"https://api.vmoscloud.com{url}"

    payload = json.dumps(data, ensure_ascii = False)
    headers = {
        'content-type': "application/json;charset=UTF-8",
        'x-date': x_date,
        'x-host': "api.vmoscloud.com",
        'authorization': f"HMAC-SHA256 Credential={AccessKey}, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature={signature}"
    }
    response = requests.request("POST", url, headers=headers, data=payload)
    return response.json()


#根据查询条件分页获取实例列表信息/vcpcloud/api/padApi/infos
pad_infos_url='/vcpcloud/api/padApi/padTaskDetail'
pad_infos_body={"taskIds":[4224]}

#vmos接口调用
print(vmos_url_util(pad_infos_url, pad_infos_body, 'Access Key ID','Secret Access Key'))

数据加解密示例

Java AES GCM 解密

import javax.crypto.Cipher;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;

public class AESUtils {
    private static final String AES = "AES";
    private static final String AES_CIPHER_ALGORITHM = "AES/GCM/NoPadding";
    private static final int GCM_TAG_LENGTH = 16;
    private static final int GCM_IV_LENGTH = 12;

    /**
     * Generates a SecretKeySpec from a given string key
     */
    private static SecretKeySpec getKeyFromPassword(String password) throws NoSuchAlgorithmException {
        MessageDigest sha = MessageDigest.getInstance("SHA-256");
        byte[] key = sha.digest(password.getBytes());
        return new SecretKeySpec(key, AES);
    }

    /**
     * Generates a new Initialization Vector (IV)
     */
    public static byte[] generateIv() {
        byte[] iv = new byte[GCM_IV_LENGTH];
        new SecureRandom().nextBytes(iv);
        return iv;
    }

    /**
     * Encrypts a plain text using AES algorithm and returns both the cipher text and IV
     */
    public static String encrypt(String input, String key) {
        try {
            SecretKeySpec secretKeySpec = getKeyFromPassword(key);
            byte[] iv = generateIv();
            Cipher cipher = Cipher.getInstance(AES_CIPHER_ALGORITHM);
            GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, gcmParameterSpec);
            byte[] cipherText = cipher.doFinal(input.getBytes());

            // Encode IV and cipher text to Base64 and concatenate them with a separator
            String ivString = Base64.getEncoder().encodeToString(iv);
            String cipherTextString = Base64.getEncoder().encodeToString(cipherText);
            return ivString + ":" + cipherTextString;
        } catch (Exception e) {
            log.error("encrypt error >>>input:{} key:{}", input, key, e);
            return null;
        }

    }

    /**
     * Decrypts an encrypted text using AES algorithm
     */
    public static String decrypt(String encryptedData, String key) {
        try {
            SecretKeySpec secretKeySpec = getKeyFromPassword(key);

            // Split the encrypted data into IV and cipher text
            String[] parts = encryptedData.split(":");
            String ivString = parts[0];
            String cipherTextString = parts[1];

            byte[] iv = Base64.getDecoder().decode(ivString);
            byte[] cipherText = Base64.getDecoder().decode(cipherTextString);

            Cipher cipher = Cipher.getInstance(AES_CIPHER_ALGORITHM);
            GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, gcmParameterSpec);
            byte[] plainText = cipher.doFinal(cipherText);
            return new String(plainText);
        } catch (Exception e) {
            log.error("decrypt error >>>encryptedData:{} key:{}", encryptedData, key, e);
            return null;
        }

    }

    /**
     * Encodes the input byte array to a Base64 string
     */
    public static String encodeToString(byte[] input) {
        return Base64.getEncoder().encodeToString(input);
    }

    // Encodes the input string to a Base64 string
    public static String encodeToString(String input) {
        return Base64.getEncoder().encodeToString(input.getBytes());
    }

    /**
     * Decodes the input Base64 string to a byte array
     */
    public static byte[] decodeToBytes(String input) {
        return Base64.getDecoder().decode(input);
    }

    /**
     * Decodes the input Base64 string to a regular string
     */
    public static String decodeToString(String input) {
        byte[] decodedBytes = Base64.getDecoder().decode(input);
        return new String(decodedBytes);
    }

    /**
     * Encodes the input byte array to a Base64 byte array
     */
    public static byte[] encodeToBytes(byte[] input) {
        return Base64.getEncoder().encode(input);
    }

    /**
     * Decodes the input Base64 byte array to a byte array
     */
    public static byte[] decodeToBytes(byte[] input) {
        return Base64.getDecoder().decode(input);
    }

    public static void main(String[] args) throws Exception {
        String key = "AC22030010001"; // 任意字符串作为密钥
        // Decrypt the cipher text
        String decryptedText = decrypt("iMzQUI7SwzSD0kGJ:4FZ1fn1Jdd5Z4j2ehn/F3VSUVWBwLFQZH/HOCjLAI95r", key);
        System.out.println("Decrypted text: " + decryptedText);
    }
}

接口概览

实例管理

接口接口名接口说明
/vcpcloud/api/padApi/restart实例重启对指定实例执行重启操作,用以解决系统无响应、卡死等问题
/vcpcloud/api/padApi/reset实例重置对指定实例执行重置操作
/vcpcloud/api/padApi/padProperties查询实例属性查询指定实例的属性信息
/vcpcloud/api/padApi/batchPadProperties批量查询实例属性批量查询指定实例的属性信息,包括系统属性信息和设置信息。
/vcpcloud/api/padApi/updatePadProperties修改实例属性动态修改实例的属性信息,包括系统属性和设置。
/vcpcloud/api/padApi/dissolveRoom停止推流停止指定实例推流
/vcpcloud/api/padApi/setProxy实例设置代理对指定实例设置代理信息
/vcpcloud/api/padApi/replacePad一键新机一键新机
/vcpcloud/api/padApi/templateList分页获取真机模板分页获取真机模板
/vcpcloud/api/padApi/country查询一键新机支持国家列表查询一键新机支持国家列表
/vcpcloud/api/padApi/replacement换机换机
/vcpcloud/api/padApi/setWifiList修改实例wifi属性修改实例wifi属性

实例操控

接口接口名接口说明
/vcpcloud/api/padApi/asyncCmd异步执行ADB命令在一个或多个云手机实例中执行adb命令(异步任务)
/vcpcloud/api/padApi/syncCmd同步执行ADB命令在一个或多个云手机实例中同步执行adb命令
/vcpcloud/api/padApi/generatePreview生成预览图对当前云手机画面进行截图,并获取下载截图文件的地址
/vcpcloud/api/padApi/adb打开/关闭实例adb根据实例编号打开或关闭实例adb
/vcpcloud/api/padApi/updateContacts修改通讯录修改通讯录
/vcpcloud/api/padApi/updateTimeZone修改实例时区修改实例时区
/vcpcloud/api/padApi/updateLanguage修改实例语言修改实例语言
/vcpcloud/api/padApi/gpsInjectInfo设置实例经纬度设置实例经纬度
/vcpcloud/api/padApi/screenshot本地截图本地截图
/vcpcloud/api/padApi/upgradeImage升级镜像升级镜像
/vcpcloud/api/padApi/virtualRealSwitch升级真机镜像升级真机镜像
/vcpcloud/api/padApi/checkIP智能IP代理检测智能IP代理检测
/vcpcloud/api/padApi/smartIp设置智能IP设置智能IP
/vcpcloud/api/padApi/notSmartIp取消智能IP取消智能IP
/vcpcloud/api/padApi/getTaskStatus设备任务执行结果查询设备任务执行结果查询
/vcpcloud/api/padApi/switchRoot开关root权限开关root权限
/vcpcloud/api/padApi/updateSIM根据国家code修改sim卡信息根据国家code修改sim卡信息
/vcpcloud/api/padApi/updatePadAndroidProp修改实例安卓改机属性修改实例安卓改机属性
/vcpcloud/api/padApi/uploadFileV3文件通过链接直接上传接口文件通过链接直接上传接口
/vcpcloud/api/padApi/setKeepAliveApp设置保活应用接口设置保活应用接口

资源管理

接口接口名接口说明
/vcpcloud/api/padApi/infos实例列表信息查询所有已订购实例列表信息

应用管理

接口接口名接口说明
/vcpcloud/api/padApi/updateApp应用上传上传应用安装文件到应用管理中心(异步任务)
/vcpcloud/api/padApi/installApp应用安装将指定应用安装部署到指定的云实例中(异步任务)
/vcpcloud/api/padApi/uninstallApp应用卸载应用卸载
/vcpcloud/api/padApi/startApp应用启动应用启动
/vcpcloud/api/padApi/stopApp应用停止应用停止
/vcpcloud/api/padApi/restartApp应用重启应用重启
/vcpcloud/api/padApi/appDetail应用详情查询应用详情信息
/vcpcloud/api/padApi/updateFile文件上传上传文件到文件管理中心(异步任务)
/vcpcloud/api/padApi/padUpdateFile实例文件上传从文件管理中心推送文件到一个或多个云手机实例(异步任务)
/vcpcloud/api/padApi/listInstalledApp实例安装应用列表查询实例安装应用列表查询

任务管理

接口接口名接口说明
/vcpcloud/api/padApi/padTaskDetail实例操作任务详情查询指定实例操作任务的执行结果详细信息
/vcpcloud/api/padApi/fileTaskDetail文件任务详情查询指定文件任务的执行结果详细信息

云手机管理

接口接口名接口说明
/vcpcloud/api/padApi/createMoneyOrder新建/续费云手机新建/续费云手机
/vcpcloud/api/padApi/userPadList云手机列表云手机列表
/vcpcloud/api/padApi/padInfo云手机信息查询云手机信息查询
/vcpcloud/api/padApi/getCloudGoodListsku套餐列表sku套餐列表
/vcpcloud/api/padApi/replaceRealAdiTemplate修改真机ADI模板修改真机ADI模板

TK自动化

接口接口名接口说明
/vcpcloud/api/padApi/autoTaskList自动化任务列表查询自动化任务列表查询
/vcpcloud/api/padApi/addAutoTask创建自动化任务创建自动化任务
/vcpcloud/api/padApi/reExecutionAutoTask自动化任务重试自动化任务重试
/vcpcloud/api/padApi/cancelAutoTask自动化任务取消自动化任务取消

SDK Token

接口接口名接口说明
/vcpcloud/api/padApi/stsToken获取SDK临时token签发sdk临时token,用于对接入云手机服务的用户进行鉴权
/vcpcloud/api/padApi/stsTokenByPadCode根据padcode获取sdk临时token签发sdk临时token,用于对接入云手机服务的用户进行鉴权
/vcpcloud/api/padApi/clearStsToken清除SDK授权Token清除SDK授权Token

OpenAPI 接口列表

实例管理

修改实例wifi属性

修改指定实例的wifi列表属性(此接口与一建新机设置wifi二选一,否则会出现覆盖问题)。

接口地址

/vcpcloud/api/padApi/setWifiList

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC21020010001String是实例编号
wifiJsonListString[]是wifi属性列表
├─ ssid110101String是wifi名称
├─ BSSID02:31:00:00:00:01String是接入点mac地址
├─ MAC02:00:10:00:00:00String是wifi网卡mac地址
├─ IP02:00:10:00:00:00String是wifi网络IP
├─ MAC02:00:10:00:00:00String是wifi网络+mac地址
├─ gateway192.168.1.20String是wifi网关
├─ DNS11.1.1.1String是DNS1
├─ DNS28.8.8.8String是DNS2
├─ hessid0Integer否网络标识符
├─ anqpDomainId0Integer否ANQP(Access Network Query Protocol)域ID
├─ capabilities""String否WPA/WPA2等信息
├─ level0Integer否信号强度(RSSI)
├─ linkSpeed500Integer否当前Wi-Fi连接速率
├─ txLinkSpeed600Integer否上传链路速度
├─ rxLinkSpeed700Integer否下载链路速度
├─ frequency2134Integer否Wi-Fi信道频率
├─ distance-1Integer否估算的AP距离
├─ distanceSd-1Integer否估算距离的标准差
├─ channelWidth0Integer否信道宽度
├─ centerfreq00Integer否中心频率0
├─ centerfreq1-1Integer否中心频率1
├─ is80211McRTTResponderfalseBoolean否是否支持 802.11mc(Wi-Fi RTT,测距技术)

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC21020010001String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
    "padCodes":["AC2025030770R92X"],
    "wifiJsonList":[{
        "ssid": "110101",
        "bssid": "02:31:00:00:00:01",
        "mac": "02:00:10:00:00:00",
        "ip": "192.168.120.15",
        "gateway": "192.168.120.1",
        "dns1": "1.1.1.1",
        "dns2": "8.8.8.8",
        "hessid": 0,
        "anqpDomainId": 0,
        "capabilities": "",
        "level": 0,
        "linkSpeed": 500,
        "txLinkSpeed": 600,
        "rxLinkSpeed": 700,
        "frequency": 2413,
        "distance": -1,
        "distanceSd": -1,
        "channelWidth": 0,
        "centerFreq0": -1,
        "centerFreq1": -1,
        "is80211McRTTResponder": true
    }]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts":1713773577581,
	"data":[
            {
            "taskId": 1,
            "padCode": "AC21020010001",
            "vmStatus": 1
            }
        ]
}

实例重启

对指定实例执行重启操作,用以解决系统无响应、卡死等问题。

接口地址

/vcpcloud/api/padApi/restart

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC21020010001String是实例编号
groupIdsInteger[]否
├─1Integer否实例组ID

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC21020010001String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"padCodes": [
		"AC22030022693"
	],
	"groupIds": [1]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts":1713773577581,
	"data":[
				{
				"taskId": 1,
				"padCode": "AC21020010001",
				"vmStatus": 1
				}
			]
}

错误码

错误码错误说明操作建议
10001重启失败联系管理员
110004执行重启命令失败稍后再次重启
110028实例不存在请检查实例是否存在

实例重置

对指定实例执行重置操作,清理应用和文件

接口地址

/vcpcloud/api/padApi/reset

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC21020010001String是实例编号
groupIdsInteger[]否
├─1Integer否实例组ID

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC21020010001String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"padCodes": [
		"AC21020010001"
	],
	"groupIds": [1]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717559681604,
	"data": [
		{
			"taskId": 88,
			"padCode": "AC22030010001",
			"vmStatus": 1
		},
		{
			"taskId": 89,
			"padCode": "AC22030010002",
			"vmStatus": 0
		}
	]
}

错误码

错误码错误说明操作建议
10002重置失败联系管理员
110005执行重置命令失败稍后再次重置

查询实例属性

查询指定实例的属性信息,包括系统属性信息和设置信息。

接口地址

/vcpcloud/api/padApi/padProperties

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodeAC21020010001String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject
├─padCodeAC21020010001String实例编号
├─modemPropertiesListObject[]Modem-属性列表
├─├─propertiesNameIMEIString属性名称
├─├─propertiesValue412327621057784String属性值
├─systemPropertiesListObject[]系统-属性列表
├─├─propertiesNamero.build.idString属性名称
├─├─propertiesValueQQ3A.200805.001String属性值
├─settingPropertiesListObject[]setting-属性列表
├─├─propertiesNamero.build.tagsString属性名称
├─├─propertiesValuerelease-keysString属性值
├─oaidPropertiesListObject[]oaid-属性列表
├─├─propertiesNameoaidString属性名称
├─├─propertiesValue001String属性值

请求示例

{
	"padCode": "AC21020010001"
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts":1713773577581,
	"data": {
		"padCode": "AC21020010001",
		"modemPropertiesList": [
			{
				"propertiesName": "IMEI",
				"propertiesValue": "412327621057784"
			}
		],
		"systemPropertiesList": [
			{
				"propertiesName": "ro.build.id",
				"propertiesValue": "QQ3A.200805.001"
			}
		],
		"settingPropertiesList": [
			{
				"propertiesName": "ro.build.tags",
				"propertiesValue": "release-keys"
			}
		],
		"oaidPropertiesList": [
			{
				"propertiesName": "oaid",
				"propertiesValue": "001"
			}
		]
	}
}

错误码

错误码错误说明操作建议
110028实例不存在请检查实例是否正确

批量查询实例属性

批量查询指定实例的属性信息,包括系统属性信息和设置信息。

接口地址

/vcpcloud/api/padApi/batchPadProperties

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC21020010001String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─padCodeAC21020010001String实例编号
├─modemPropertiesListObject[]Modem-属性列表
├─├─propertiesNameIMEIString属性名称
├─├─propertiesValue412327621057784String属性值
├─systemPropertiesListObject[]系统-属性列表
├─├─propertiesNamero.build.idString属性名称
├─├─propertiesValueQQ3A.200805.001String属性值
├─settingPropertiesListObject[]setting-属性列表
├─├─propertiesNamero.build.tagsString属性名称
├─├─propertiesValuerelease-keysString属性值
├─oaidPropertiesListObject[]oaid-属性列表
├─├─propertiesNameoaidString属性名称
├─├─propertiesValue001String属性值

请求示例

{
    "padCodes": [
        "AC21020010001",
        "AC21020010002"
    ]
}

响应示例

{
    "code": 200,
        "msg": "success",
        "ts":1713773577581,
        "data": [
        {
            "padCode": "AC21020010001",
            "modemPropertiesList": [
                {
                    "propertiesName": "IMEI",
                    "propertiesValue": "412327621057784"
                }
            ],
            "systemPropertiesList": [
                {
                    "propertiesName": "ro.build.id",
                    "propertiesValue": "QQ3A.200805.001"
                }
            ],
            "settingPropertiesList": [
                {
                    "propertiesName": "ro.build.tags",
                    "propertiesValue": "release-keys"
                }
            ],
            "oaidPropertiesList": [
                {
                    "propertiesName": "oaid",
                    "propertiesValue": "001"
                }
            ]
        },
        {
            "padCode": "AC21020010002",
            "modemPropertiesList": [
                {
                    "propertiesName": "IMEI",
                    "propertiesValue": "412327621057784"
                }
            ],
            "systemPropertiesList": [
                {
                    "propertiesName": "ro.build.id",
                    "propertiesValue": "QQ3A.200805.001"
                }
            ],
            "settingPropertiesList": [
                {
                    "propertiesName": "ro.build.tags",
                    "propertiesValue": "release-keys"
                }
            ],
            "oaidPropertiesList": [
                {
                    "propertiesName": "oaid",
                    "propertiesValue": "001"
                }
            ]
        }
    ]
}

错误码

错误码错误说明操作建议
110028实例不存在请检查实例是否正确

修改实例属性

动态修改实例的属性信息,包括系统属性和设置

实例需要处于开机状态,该接口为即时生效

接口地址

/vcpcloud/api/padApi/updatePadProperties

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC21020010001String是实例编号
modemPropertiesListObject[]Modem-属性列表
├─propertiesNameIMEIString属性名称
├─propertiesValue412327621057784String属性值
systemPropertiesListObject[]系统-属性列表
├─propertiesNamero.build.idString属性名称
├─propertiesValueQQ3A.200805.001String属性值
settingPropertiesListObject[]setting-属性列表
├─propertiesNamero.build.tagsString属性名称
├─propertiesValuerelease-keysString属性值
oaidPropertiesListObject[]oaid-属性列表
├─propertiesNameoaidString属性名称
├─propertiesValue001String属性值

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC21020010001String实例编号
├─vmStatusInteger实例在线状态(0:离线;1:在线)

请求示例

{
    "padCodes": [
        "AC21020010001"
    ],
        "modemPersistPropertiesList": [
        {
            "propertiesName": "IMEI",
            "propertiesValue": "412327621057784"
        }
    ],
        "modemPropertiesList": [
        {
            "propertiesName": "IMEI",
            "propertiesValue": "412327621057784"
        }
    ],
        "systemPersistPropertiesList": [
        {
            "propertiesName": "ro.build.id",
            "propertiesValue": "QQ3A.200805.001"
        }
    ],
        "systemPropertiesList": [
        {
            "propertiesName": "ro.build.id",
            "propertiesValue": "QQ3A.200805.001"
        }
    ],
        "settingPropertiesList": [
        {
            "propertiesName": "ro.build.tags",
            "propertiesValue": "release-keys"
        }
    ],
        "oaidPropertiesList": [
        {
            "propertiesName": "oaid",
            "propertiesValue": "001"
        }
    ]
}

响应示例

{
    "code": 200,
        "msg": "success",
        "ts": 1717570916196,
        "data": [
        {
            "taskId": 36,
            "padCode": "AC22030010001",
            "vmStatus": 1
        }
    ]
}

错误码

错误码错误说明操作建议
110028实例不存在请检查实例是否正确

停止推流

停止指定实例推流,断开实例连接。

接口地址

/vcpcloud/api/padApi/dissolveRoom

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC11010000031String是实例编号
├─AC22020020700String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─successListObject[]成功集合
├─├─padCodeAC11010000031String实例编号
├─failListObject[]失败集合
├─├─padCodeAC22020020700String实例编号
├─├─errorCode120005Integer错误码
├─├─errorMsg实例不存在String失败的原因

请求示例

{
    "padCodes": ["AC11010000031","AC22020020700"]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts":1713773577581,
     "data": {
	 	  "successList": [
              {
                  "padCode": "AC11010000031"
              }
          ],
          "failList": [
		  	 {
                  "padCode": "AC22020020700",
				  "errorCode": 120005,
				  "errorMsg": "实例不存在"
              }
		  ]
     }
}

错误码

错误码错误说明操作建议
120005实例不存在请检查实例编号是否正确
120004中止推流错误,指令服务异常请稍后重试

实例操控

异步执行ADB命令

在一个或多个云手机实例中异步执行命令

接口地址

/vcpcloud/api/padApi/asyncCmd

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22020020793String是实例编号
scriptContentcd /root;lsString是ADB命令,多条命令使用分号隔开

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC22020020793String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
    "padCodes": [
        "AC22020020793"
    ],
    "scriptContent": "cd /root;ls"
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570297639,
	"data": [
		{
			"taskId": 14,
			"padCode": "AC22030010001",
			"vmStatus": 1
		},
		{
			"taskId": 15,
			"padCode": "AC22030010002",
			"vmStatus": 0
		}
	]
}

错误码

错误码错误说明操作建议
110003执行ADB命令失败联系管理员
110012命令执行超时请稍后重试

同步执行ADB命令

在一个或多个云手机实例中同步执行命令

超过5秒未响应则返回超时异常

接口地址

/vcpcloud/api/padApi/syncCmd

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodeAC22020020793String是实例ID
scriptContentcd /root;lsString是ADB命令,多条命令使用分号隔开

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC22020020793String实例编号
├─taskStatus3Integer任务状态(-1:全失败;-2:部分失败;-3:取消;-4:超时;1:待执行;2:执行中;3:完成)
├─taskResultSuccessString任务结果

请求示例

{
    "padCode": "VP21020010231",
    "scriptContent": "cd /root/nbin;ls"
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts":1713773577581,
	"data":[
				{
				"taskId": 1,
				"padCode": "AC22020020793",
				"taskStatus":3,
				"taskResult":"Success"
				}
			]
}

错误码

错误码错误说明操作建议
110003执行ADB命令失败请稍后重试
110012命令执行超时请稍后重试

生成预览图

指定的实例获取预览图。

接口地址

/vcpcloud/api/padApi/generatePreview

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC11010000031String是实例编号
rotation0Integer是截图画面横竖屏旋:0:截图方向不做处理,默认;1:截图画面旋转为竖屏时:a:手机竖屏的截图,不做处理。b:手机横屏的截图,截图顺时针旋转90度。
broadcastfalseBoolean否事件是否广播(默认false)

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─padCodeAC11010000031String实例编号
├─accessUrlhttp://xxx.armcloud.pngString访问地址

请求示例

{
    "padCodes": [
        "AC11010000031"
    ],
    "rotation": 0,
    "broadcast": false
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts":1713773577581,
	"data": [
		{
			"padCode": "AC11010000031",
			"accessUrl": "http://xxx.armcloud.png"
		}
	]
}

打开/关闭adb

根据实例编号打开或关闭实例adb

接口地址

/vcpcloud/api/padApi/adb

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesAC22030010124String是实例编号
enabletrueboolean是true-打开 false-关闭

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─padCodeAC32010140011String实例编号
├─commandadb connect ip:portIntegeradb 连接信息
├─expireTime2024-10-24 10:42:00String连接有效期
├─enabletruebooleanadb状态

请求示例

{
  "padCode": "AC22030010001",
  "enable": true
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1729651701083,
	"data": {
		"padCode": "AC32010161274",
		"command": "adb connect ip:port",
		"expireTime": "2024-10-24 10:42:00",
		"enable": true
	}
}

修改通讯录

fileUniqueId和info必填一个

接口地址

/vcpcloud/api/padApi/updateContacts

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodes[]Arr是实例编号列表
fileUniqueIdcfca25a2c62b00e065b417491b0cf07ffcString否通讯录文件ID
infoObject[]否通讯录信息
├─firstNametomString否姓名
├─phone13111111111String否手机号
├─email[email protected]String否邮箱

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId11Integer任务ID
├─padCodeAC32010210001String实例编号
├─vmStatus0Integer实例在线状态(0:离线;1:在线)

请求示例

{
  "fileUniqueId": "cfca25a2c62b00e065b417491b0cf07ffc",
  "info": [{
    "firstName": "tom",
    "phone": "13111111111",
    "email": "[email protected]"
  }],
  "padCodes": [
    "AC32010180326"
  ]
}

响应示例

{
  "code": 200,
  "msg": "success",
  "ts": 1730192434383,
  "data": [{
    "taskId": 11,
    "padCode": "AC32010210001",
    "vmStatus": 0
  }]
}

实例设置代理

接口地址

/vcpcloud/api/padApi/setProxy

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
account2222String否账号
password2222String否密码
ip47.76.241.5String否IP
port2222Integer否IP
enabletrueBoolean是启用
padCodes[]Array是实例列表
proxyTypevpnString否支持参数:proxy、vpn
proxyNamesocks5String否支持参数:socks5、http-relay (http、https)
bypassPackageListArray否包名 设置该包名不走代理
bypassIpListArray否ip 设置该ip不走代理
bypassDomainListArray否域名 设置该域名不走代理

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId24Long任务ID
├─padCodeAC22030010001String实例编号
├─vmStatus0Integer实例在线状态(0:离线;1:在线)

请求示例

{
  "padCodes": [
    "AC32010140023"
  ],
  "account": "2222",
  "password": "2222",
  "ip": "47.76.241.5",
  "port": 2222,
  "enable": true
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570663080,
	"data": [
		{
			"taskId": 24,
			"padCode": "AC32010140023",
			"vmStatus": 1
		}
	]
}

分页获取真机模板

分页获取真机模板

接口地址

/vcpcloud/api/padApi/templateList

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
page1Integer是页码
rows10Integer是每页记录数

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736327056700Long时间戳
dataObject数据详情
├─ recordsObject[]记录列表
│ ├─ goodFingerprintId127Integer云真机模板ID
│ ├─ goodFingerprintNameSamsung Galaxy Note 20String云真机名称
│ ├─ goodAndroidVersion13String安卓版本
├─ total25Integer总记录数
├─ size10Integer每页记录数
├─ current1Integer当前页码
├─ pages3Integer总页数

请求示例

{
    "page": 1, 
    "rows": 10
}

响应示例

{
    "msg": "success",
        "code": 200,
        "data": {
        "records": [
            {
                "goodFingerprintId": 127,
                "goodFingerprintName": "Samsung Galaxy Note 20",
                "goodAndroidVersion": "13",
            }
        ],
            "total": 25,
            "size": 10,
            "current": 1,
            "pages": 3
    },
    "ts": 1742454918332
}

一键新机⭐️

注意:一键新机会清除系统所有数据。请谨慎使用!

一键新机功能,将当前实例数据全部清空,并重新设置安卓属性

  • 虚拟机直接设置录象信息属性, 然后查看容器所有数据
  • 云端机直接轮训所有数据(单间于里面), 并且添加SIM信息, 如果有传入模板id, 会替换ad模板
  • 注意: 如果不传国家信息, 或者传入的国家信息服务器找不到, 会默认设置为新加坡的SIM信息

接口地址

/vcpcloud/api/padApi/replacePad

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodes[]Array是实例列表
countryCodeSGString否国家编码(具体查看: https://chahuo.com/country-code-lookup.html)
realPhoneTemplateId65Long否模板id参考 分页获取真机模板
androidProp{"persist.sys.cloud.wifi.mac": "D2:48:83:70:66:0B"}Object否参考 安卓改机属性列表

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId12818Long任务ID
├─padCodeAC22030010001String实例编号
├─vmStatus0Integer实例在线状态(0:离线;1:在线)

请求示例

{ "padCodes": [
  "AC32010030001"
]
}

响应示例

{
  "code": 200,
  "msg": "success",
  "ts": 1732270378320,
  "data": {
    "taskId": 8405,
    "padCode": "AC32010030001",
    "vmStatus": 2
  }
}

查询一键新机支持国家列表

接口地址

/vcpcloud/api/padApi/country

请求方式

GET

请求数据类型

application/json

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─codeADString国家编码
├─nameAndorraString国家名称(英文)

响应示例

{
    "code": 200,
        "msg": "success",
        "ts": 1730192434383,
        "data": [{
        "code": "AD",
        "name": "Andorra"
    }]
}

换机

接口地址

/vcpcloud/api/padApi/replacement

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodeAC22030010001String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─equipmentId358504Long设备编号
├─padCodeAC32011030092String实例编号

请求示例

{ 
    "padCode": "AC32010030001"
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "padCode": "AC32011030092",
        "equipmentId": 358504
    },
    "ts": 1741078432830
}

修改实例时区

接口地址

/vcpcloud/api/padApi/updateTimeZone

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
timeZoneAsia/ShanghaiString是UTC标准时间
padCodes["AC22030010001"]Array是实例列表

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId12818Long任务ID
├─padCodeAC22030010001String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"padCodes": [
		"AC32010140003"
	],
	"timeZone": "Asia/Shanghai"
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570663080,
	"data": [
		{
			"taskId": 12818,
			"padCode": "AC32010140003",
			"vmStatus": 1
		}
	]
}

修改实例语言

接口地址

/vcpcloud/api/padApi/updateLanguage

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
languagezhString是语言
countryCNString否国家
padCodes["AC22030010001"]Array是实例列表

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId12818Long任务ID
├─padCodeAC22030010001String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"padCodes": [
		"AC32010140026"
	],
	"language": "zh",
	"country": ""
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570663080,
	"data": [
		{
			"taskId": 12818,
			"padCode": "AC32010140026",
			"vmStatus": 1
		}
	]
}

设置实例经纬度

接口地址

/vcpcloud/api/padApi/gpsInjectInfo

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
longitude116.397455Float是纬度
latitude39.909187Float是经度
padCodes["AC22030010001"]Array是实例列表

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId12818Long任务ID
├─padCodeAC22030010001String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"padCodes": [
		"AC22030010001"
	],
	"longitude": 116.397455,
	"latitude": 39.909187
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570663080,
	"data": [
		{
			"taskId": 12818,
			"padCode": "AC22030010001",
			"vmStatus": 1
		}
	]
}

本地截图

接口地址

/vcpcloud/api/padApi/screenshot

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC11010000031String是实例编号
rotation0Integer是截图画面横竖屏旋:
0:截图方向不做处理,默认;
1:截图画面旋转为竖屏时:
a:手机竖屏的截图,不做处理。
b:手机横屏的截图,截图顺时针旋转90度。
broadcastfalseBoolean是事件是否广播(默认false)
definition50Integer否清晰度 取值范围0-100
resolutionHeight1920Integer否分辨率 - 高 大于1
resolutionWidth1080Integer否分辨率 - 宽 大于1

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId12818Long任务ID
├─padCodeAC11010000031String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
    "padCodes": [
        "1721739857317"
    ],
        "rotation": 0,
        "broadcast": false,
        "definition": 50,
        "resolutionHeight": 1920,
        "resolutionWidth": 1080
}

响应示例

{
    "code": 200,
        "msg": "success",
        "ts": 1717570337023,
        "data": [
        {
            "taskId": 12818,
            "padCode": "AC11010000031",
            "vmStatus": 1
        }
    ]
}

升级镜像

接口地址

/vcpcloud/api/padApi/upgradeImage

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22030010182String是实例编号
imageIdmg-24061124017String是镜像ID
wipeDatafalseBoolean是是否清除实例数据(data分区), true清除,false不清除

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId12818Long任务ID
├─padCodeAC22030010182String实例编号
├─errorMsg“”String错误信息

请求示例

{
    "padCodes": [
        "AC22030010182"
    ],
    "wipeData": false,
    "imageId": "mg-24061124017"
}

响应示例

{
    "code": 200,
        "msg": "success",
        "ts": 1718594881432,
        "data": [
        {
            "taskId": 63,
            "padCode": "AC22030010182",
            "errorMsg": null
        }
    ]
}

升级真机镜像

批量实例真机镜像升级

接口地址

/vcpcloud/api/padApi/virtualRealSwitch

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22030010182String是实例编号
imageIdmg-24061124017String是镜像ID
wipeDatafalseBoolean是是否清除实例数据(data分区), true清除,false不清除
realPhoneTemplateId178Integer否真机模板ID upgradeImageConvertType=real时必填
upgradeImageConvertTypevirtualString是转换镜像类型 virtual:虚拟机 real:云真机
screenLayoutId14Integer否屏幕布局ID upgradeImageConvertType=virtual时必填

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId12818Long任务ID
├─padCodeAC22030010182String实例编号
├─errorMsg“”String错误信息

请求示例

{
    "padCodes": [
        "AC32010210023"
    ],
        "imageId": "img-24112653977",
        "wipeData": true,
        "realPhoneTemplateId": 178,
        "upgradeImageConvertType": "virtual",
        "screenLayoutId": 14
}

响应示例

{
    "code": 200,
        "msg": "success",
        "ts": 1718594881432,
        "data": [
        {
            "taskId": 63,
            "padCode": "AC22030010182",
            "errorMsg": null
        }
    ]
}

智能IP代理检测

检测代理IP是否可用,归属地信息是否正确

接口地址

/vcpcloud/api/padApi/checkIP

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
host127.0.0.1String是代理信息 (ip或host)
port8080Integer是代理端口 (数字类型)
accountxxxxString是代理用户名
passwordxxxxString是代理密码
typeSocks5String是代理协议类型 Socks5、 http、https
countryUSString否国家-强行指定时必填 - 参数请参考:curl -x http://用户名:密码@ip:端口 https://ipinfo.io?token=注册就有的token 当使用了强行指定后,系统会直接使用指定的信息,不会检测代理
ip156.228.84.62String否ip-强行指定时必填
loc39.0438,-77.4874String否经,纬度-强行指定时必填
cityAshburnString否城市-强行指定时必填
regionVirginiaString否地区-强行指定时必填
timezoneAmerica/New_YorkString否时区-强行指定时必填

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─proxyLocationUS-Los AngelesString归属地
├─publicIp62.112.132.92String出口IP
├─proxyWorkingtrueBoolean检测成功-true 检测失败-false

请求示例

{
    "host": "62.112.132.92",
    "port": 45001,
    "account": "xxxxxxxxxx",
    "password": "xxxxxxxx",
    "type": "Socks5"
    // "country": "US",
    // "ip": "156.228.84.62",
    // "loc": "39.0438,-77.4874", 
    // "city": "Ashburn", 
    // "region": "Virginia",
    // "timezone": "America/New_York"
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "proxyLocation": "US-Los Angeles",
        "publicIp": "62.112.132.92",
        "proxyWorking": true
    },
    "ts": 1737601218580
}

设置智能IP

给云机设备设置智能IP,云机内的出口ip,SIM卡信息,gps坐标,时区等信息自动变更到代理的归属国家(设置完设备会重启,重启完毕后1分钟内生效, 同时设备状态变更为119-初始化中, 任务成功、失败、超时后会变更到100-正常状态 任务超时时间为5分钟 )

(设置的智能IP信息必须先经过检测接口的检测)直接设置会出现国家对应不上

接口地址

/vcpcloud/api/padApi/smartIp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22030010182String是实例编号
host127.0.0.1String是代理信息 (ip或host)
port8080Integer是代理端口 (数字类型)
accountxxxxString是代理用户名
passwordxxxxString是代理密码
typeSocks5String是代理协议类型 Socks5、 http、https
modevpnString是设置代理的模式 vpn / proxy

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
dataTASK-278784482960609280String任务编号
msgsuccessString响应消息
ts1721739857317Long时间戳

请求示例

{
    "padCodes": [
        "AC32010160334"
    ],
    "host": "62.112.132.92",
    "port": 45001,
    "account": "xxxxxx",
    "password": "xxxxxxx",
    "type": "Socks5",
    "mode": "vpn"
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": "TASK-278784482960609280",
    "ts": 1737604726812
}

取消智能IP

取消智能IP,还原云机内的出口ip,SIM卡信息,gps坐标,时区等信息(设置完设备会重启,重启完毕后1分钟内生效, 同时设备状态变更为119-初始化中, 任务成功、失败、超时后会变更到100-正常状态 任务超时时间为5分钟 )

接口地址

/vcpcloud/api/padApi/notSmartIp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22030010182String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
dataTASK-278784482960609280String任务编号
msgsuccessString响应消息
ts1721739857317Long时间戳

请求示例

{
    "padCodes": [
        "AC32010160334"
    ]
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": "TASK-278784482960609280",
    "ts": 1737604726812
}

设备任务执行结果查询

使用任务编号查询任务的执行结果

接口地址

/vcpcloud/api/padApi/getTaskStatus

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
taskIdTASK-278784482960609280String是任务ID

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
dataObject[]任务结果
├─padCodeAC32010150162String实例编号
├─taskStatusSuccessfullyString任务状态:Executing-执行中 Successfully-已成功 Failed-已失败 Timedout-已超时
├─taskType10010Integer任务类型:10010-设置智能IP 10011-取消智能IP
msgsuccessString响应消息
ts1721739857317Long时间戳

请求示例

{
    "taskId": "TASK-278784482960609280"
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "padCode": "AC32010150162",
            "taskStatus": "Successfully",
            "taskType": 10010
        }
    ],
    "ts": 1738999472135
}

开关root权限

在一个或多个云手机实例中开关root权限。 开关单个应用root,需要指定包名,否则会抛出异常.

接口地址

/vcpcloud/api/padApi/switchRoot

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22020020793String是实例编号
globalRootfalseBoolean否是否开启全局root权限,默认不开启
packageNamecom.zixun.cmpString否应用包名(非全局root必传)
rootStatusroot开启状态Integer是root状态,0:关闭 1:开启

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId1Long任务ID
├─padCodeAC22020020793String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
    "padCodes": [
        "AC32010250002"
    ],
    "globalRoot": false,
    "packageName": "com.android.ftpeasys",
    "rootStatus": 0
}

响应示例

{
    "code": 200,
        "msg": "success",
        "ts": 1717570297639,
        "data": [
            {
                "taskId": 1,
                "padCode": "AC32010250002",
                "vmStatus": 1
            }
        ]
}


错误码

错误码错误说明操作建议
110003执行ADB命令失败联系管理员
110089开启单个root包名不能为空开启单个应用root时,包名不能为空

修改实例安卓改机属性

静态设置安卓改机属性,需要重启实例才能够生效,一般用于修改设备信息。

该接口与 修改实例属性接口的区别在于生效时机,该接口生效时间为每次开机初始化。

设置实例属性后,属性数据会持久化存储,重启或重置实例无需再调用该接口。

参考 安卓改机属性列表

使用该接口需要对安卓系统有一定的理解,部分属性可能会影响实例正常启动,如果改机后,导致实例异常,可以通过调用实例重置接口恢复正常

接口地址

/vcpcloud/api/padApi/updatePadAndroidProp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodeAC32010210001String是实例编号
restartfalseBoolean否设置完成后自动重启(默认false)
props{}Object否系统属性(此字段为key-value定义)
├─ro.product.vendor.nameOP52D1L1String否属性设置

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId1Long任务ID
├─padCodeAC32010210001String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
    "padCode": "AC32010250001",
    "props": {
        "ro.product.vendor.name": "OP52D1L1"
     }
}

响应示例

{
    "code": 200,
        "msg": "success",
        "ts": 1717570297639,
        "data": [
            {
                "taskId": 14017,
                "padCode": "AC32010250001",
                "vmStatus": 1
            }
        ]
}


根据国家code修改sim卡信息

静态设置会在实例重启后生效,需要重启实例才能够生效,一般用于修改设备信息。

该接口与 修改实例安卓改机属性接口具有相同功能,区别在于该接口会额外生成 sim 卡信息,并且每次都必须重启。

设置实例属性后,属性变更会持久化存储,重启或重置实例无需再调用该接口。

接口地址

/vcpcloud/api/padApi/updateSIM

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodeAC32010210001String是实例编号
countryCodeUSString否国家code
props{}Object否系统属性(此字段为key-value定义)
├─persist.sys.cloud.phonenum15166370000String否属性设置

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataTASK-285633563817283584String任务ID

请求示例

{
    "padCode": "AC32010250001",
    "props": {
        "persist.sys.cloud.phonenum": "1234578998"
     },
    "countryCode": "US"
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": "TASK-285633563817283584",
    "ts": 1740631552342
}

文件通过链接直接上传接口

从文件管理中心推送文件到云手机实例(异步任务) 如果能通过md5值或者文件ID找到对应的文件,会直接通过OSS的路径下发给实例下载 如果OSS没有对应的文件,会直接将URL下发给实例下载,并且将该URL内容上传到OSS 如果选择安装应用,会检验包名是否有值,如果没值,会抛出异常.(安装应用默认会授权所有权限,通过isAuthorization字段可以选择不授权) 请求方式

接口地址

/vcpcloud/api/padApi/uploadFileV3

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodeAC32010210001String是实例编号
autoInstall1Integer否是否需要⾃动安装 1需要、0不需要。不填默认不需要。仅对apk类型的⽂件⽣效
fileUniqueId1e5d3bf00576ee8f3d094908c0456722String否系文件id唯一标识
customizeFilePath/Documents/String否⾃定义路径。非必传,需以/开头。(示例:"/DCIM/", "/Documents/", "/Download/", "/Movies/", "/Music/", "/Pictures/")
fileNamethreadsString否文件名称
packageNamecom.zhiliaoapp.musicallyString否文件包名
urlhttps://file.vmoscloud.com/appMarket/2/apk/fe1f75df23e6fe3fd3b31c0f7f60c0af.apkString否文件安装路径
md51e5d3bf00576ee8f3d094908c0456722String否系文件唯一标识
isAuthorizationfalseBoolean否是否授权(默认全授权)
iconPathhttps://file.vmoscloud.com/appMarket/2/apk/fe1f75df23e6fe3fd3b31c0f7f60c0af.pngString否安装时的图标展示

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─padCodeAC22010020062String实例编号
├─taskId1Integer任务ID
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
    "padCodes": [
        "AC32010250022"
    ],
    "customizeFilePath": "/DCIM/",
    "md5": "d97fb05b3a07d8werw2341f10212sdfs3sdfs24",
    "url": "https://file.vmoscloud.com/appMarket/2/apk/fe1f75df23e6fe3fd3b31c0f7f60c0af.apk",
    "autoInstall": 1,
    "packageName": "com.zhiliaoapp.musically",
    "fileName": "market",
    "isAuthorization": false
}

响应示例

{
    "code": 200,
    "msg": "success",
    "ts": 1737431505379,
    "data": [
        {
            "taskId": 13469,
            "padCode": "AC32010250022",
            "vmStatus": 0
        }
    ]
}

错误码

错误码错误说明操作建议
110065参数请求不合规,请参考接口文档检查参数,参考接口文档
120005实例不存在请检查实例编号是否正确

设置保活应用

目前只支持安卓14

接口地址

/vcpcloud/api/padApi/setKeepAliveApp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─padCodeAC32010250011String否实例编号
applyAllInstancesfalseBoolean是是否应用所有实例模式
appInfosObject[]否
├─serverNamecom.zixun.cmp/com.zixun.cmp.service.TaskServiceString是com.xxx.xxx(包名)/com.xxx.xxx.service.DomeService (需要启动的服务完整路径)

响应参数

字段名示例值类型说明
code200Integer状态码
msgsuccessString响应消息
ts1736326542985Long时间戳
dataObject[]任务数据列表
├─ taskId10074Integer任务 ID
├─ padCodeAC32010250011String实例编号
├─ errorMsgnullString错误信息(为空表示无错误)

请求示例

{
    "padCodes": [
        "AC32010250011"
    ], 
    "appInfos": [
        {
            "serverName": "com.zixun.cmp/com.zixun.cmp.service.TaskService"
        }
    ], 
    "applyAllInstances": false
}

响应示例

{
    "code": 200,
    "msg": "success",
    "ts": 1736326542985,
    "data": [
        {
            "taskId": 10074,
            "padCode": "AC32010250011",
            "errorMsg": null
        }
    ]
}

错误码

错误码错误说明操作建议
110065参数请求不合规,请参考接口文档检查参数,参考接口文档
120005实例不存在请检查实例编号是否正确

资源管理相关接口

实例列表信息

根据查询条件分页获取实例列表信息。

接口地址

/vcpcloud/api/padApi/infos

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
page1Integer是页码
rows10Integer是条数
padTyperealString否实例类型(virtual:虚拟机;real:真机)
padCodesString[]否
├─AC22010020062String是实例编号
groupIdsInteger[]否
├─1Integer否实例分组ID

响应参数

参数名示例值参数类型参数描述
code200Integer
msgsuccessString
ts1713773577581Long
dataObject
├─page1Integer当前页
├─rows10Integer每页的数量
├─size1Integer当前页的数量
├─total1Integer总记录数
├─totalPage1Integer总页数
├─pageDataobject[]列表
├─├─padCodeVP21020010391String实例编号
├─├─padGradeq1-2String实例开数(q1-6六开,q1-2二开)
├─├─padStatus10String实例状态 (10-运行中 11-重启中 12-重置中 13-升级中 14-异常 15-未就绪)
├─├─groupId0Integer分组ID
├─├─idcCoded3c1f580c41525e514330a85dfdecda8String机房编码
├─├─deviceIp192.168.0.0String云机ip
├─├─padIp192.168.0.0String实例ip
├─├─appsString[]安装的应用列表
├─├─├─armcloud001String安装的应用

请求示例

{
	"page": 1,
	"rows": 10,
	"padCodes": [
		"AC21020010391"
	],
	"groupIds":[1]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts":1713773577581,
	"data": {
		"page": 1,
		"rows": 1,
		"size": 1,
		"total": 1,
		"totalPage": 1,
		"pageData": [
			{
				{
				"padCode": "AC21020010391",
				"padGrade": "q2-4",
				"padStatus": 10,
				"groupId": 0,
				"idcCode": "8e61ad284bc105b877611e6fef7bdd17",
				"deviceIp": "172.31.2.34",
				"padIp": "10.255.1.19",
				"apps": [
					"armcloud001"
				]
			}
		]
	}
}

应用管理

应用上传

上传应用安装文件到指定业务的应用管理中心(异步任务)。

接口地址

/vcpcloud/api/padApi/updateApp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
parsetrueBoolean是是否缓存并解析(解析并缓存) 如解析则无需填包信息
appsObject[]是应用列表
├─ urlhttps://xxx.armcloud.apkString是源文件下载地址
├─ appNamekuaishouString否应用名称
├─ pkgNamecom.smile.gifmakerString否包名
├─ signMd50F938C4F0995A83C9BF31F0C64322589String否应用签名MD5
├─ versionNo36000Integer否版本号
├─ versionName12.3.20.36000String否版本名
├─ descriptionkuaiString否描述
├─ md5sume673a204b8f18a0f6482da9998String否应用唯一标识

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─ taskId12Integer任务ID
├─ appId1243Integer应用ID

请求示例

{
	"parse": true,
	"apps": [
		{ 
			"appName": "kuaishou",
			"url": "https://xxx.armcloud.apk",
			"pkgName": "com.smile.gifmaker",
			"signMd5": "0F938C4F0995A83C9BF31F0C64322589",
			"versionNo": 36000,
			"versionName": "12.3.20.36000",
			"description": "kuai",
			"md5sum": "e673a204b8f18a0f6482da9998"
		}
	]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts":1713773577581,
	"data": [
			{
				"taskId": 12,
				"appId": 1243
			}
	]
}

应用详情

查询应用详情。

接口地址

/vcpcloud/api/padApi/appDetail

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
appId1Integer是应用id

响应参数

参数名示例值参数类型参数描述
code200Integer是
msgsuccessString是
ts1713773577581Long是
appId1Integer是
originUrlhttp://www.xx.com/test.apkString是
customizeFileIdcustomizeId_v5o26String是
descriptiontestString是
packageNamexxx.xxx.comString是
appNametestString是
versionName1.0.1String是
versionNo124511Integer是
signMd50F938C4F0995A83C9BF31F0C64322589String是
createTime1711595044000Long是

请求示例

{
	"appId":1
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts":1713773577581,
	"data": {
		"appId": 1,
		"originUrl": "http://www.xx.com/test.apk",
		"customizeFileId": "customizeId_v5o26",
		"description": "test",
		"packageName": "xxx.xxx.com",
		"appName": "test",
		"versionName": "1.0.1",
		"versionNo": 124511,
		"signMd5": "0F938C4F0995A83C9BF31F0C64322589",
		"createTime": 1711595044000
	}
}

应用安装

为单台或多台实例同时安装单个或多个APP。此接口为异步操作。

接口地址

/vcpcloud/api/padApi/installApp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
appsObject[]是应用列表
├─appId124Integer是应用ID
├─appName葫芦侠String是应用名称
├─pkgNamecom.huluxia.gametoolsString是应用包名
├─padCodesString[]是
├─├─AC22010020062String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC22010020062String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"apps":[
		{
			"appId":124,
			"appName":"葫芦侠",
			"pkgName":"com.huluxia.gametools",
			"padCodes":["AC22010020062"]
		}
	]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570991004,
	"data": [
		{
			"taskId": 37,
			"padCode": "AC22030010001",
			"vmStatus": 1
		},
		{
			"taskId": 38,
			"padCode": "AC22030010002",
			"vmStatus": 1
		}
	]
}

错误码

错误码错误说明操作建议
140005文件不可用查看文件是否存在

应用卸载

为单台或多台实例同时卸载单个或多个APP。此接口为异步操作。

接口地址

/vcpcloud/api/padApi/uninstallApp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
appsObject[]是应用列表
├─appId124Integer是应用ID
├─appName葫芦侠String是应用名称
├─pkgNamecom.huluxia.gametoolsString是应用包名
├─padCodesString[]是
├─├─AC22010020062String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC22010020062String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"apps":[
		{
			"appId":124,
			"appName":"葫芦侠",
			"pkgName":"com.huluxia.gametools",
			"padCodes":["AC22010020062"]
		}
	]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570991004,
	"data": [
		{
			"taskId": 37,
			"padCode": "AC22030010001",
			"vmStatus": 1
		},
		{
			"taskId": 38,
			"padCode": "AC22030010002",
			"vmStatus": 1
		}
	]
}

错误码

错误码错误说明操作建议
110007卸载应用失败稍后请重试

应用启动

根据实例编号和应用包名对实例进行应用启动的操作。

接口地址

/vcpcloud/api/padApi/startApp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
├─pkgNamexxx.test.comString是包名
├─padCodesString[]是
├─├─AC22010020062String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC22010020062String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"padCodes": [
		"AC22010020062"
	],
	"pkgName": "xxx.test.com"
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570663080,
	"data": [
		{
			"taskId": 24,
			"padCode": "AC22010020062",
			"vmStatus": 1
		}
	]
}

错误码

错误码错误说明操作建议
110008启动应用失败重启云机后再启动应用

应用停止

根据实例编号和应用包名对实例进行应用停止的操作。

接口地址

/vcpcloud/api/padApi/stopApp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
├─pkgNamexxx.test.comString是包名
├─padCodesString[]是
├─├─AC22010020062String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC22010020062String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"padCodes": [
		"AC22010020062"
	],
	"pkgName": "xxx.test.com"
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570663080,
	"data": [
		{
			"taskId": 24,
			"padCode": "AC22010020062",
			"vmStatus": 1
		}
	]
}

错误码

错误码错误说明操作建议
110010停止应用失败重启云机关闭应用

应用重启

根据实例编号和应用包名对实例进行应用重启的操作。

接口地址

/vcpcloud/api/padApi/restartApp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
├─pkgNamexxx.test.comString是包名
├─padCodesString[]是
├─├─AC22010020062String是实例编号

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]
├─taskId1Integer任务ID
├─padCodeAC22010020062String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
	"padCodes": [
		"AC22010020062"
	],
	"pkgName": xxx.test.com
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717570663080,
	"data": [
		{
			"taskId": 24,
			"padCode": "AC22010020062",
			"vmStatus": 1
		}
	]
}

错误码

错误码错误说明操作建议
110009重启应用失败重启云机后再启动应用

文件上传

进行文件上传操作(异步任务)。

接口地址

/vcpcloud/api/padApi/updateFile

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
fileUrlhttp://xxx.armcloud.apkString是文件下载地址
fileName桃源深处有人家游戏官方版.apkString是文件名称
fileSha25632e1f345f209a7dc1cc704913ea436d3String是⽂件预期md5,⽤作下载⽂件校验最⼤⻓度32

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1713773577581Long时间戳
dataObject[]
├─ taskId1Integer任务ID
├─ fileUniqueId6865b417b7257d782afd5ac8bee4d311Integer文件唯一标识

请求示例


{
    "fileUrl": "http://down.s.qq.com/download/11120898722/apk/10043132_com.tencent.fiftyone.yc.apk",
	"fileName": "桃源深处有人家游戏官方版.apk",
	"fileMd5": "c52585e13a67e13128d9963b2f20f69678a86ee8b5551ca593327d329719a5"
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1713773577581,
	"data": {
		"taskId":1,
		"fileUniqueId": "6865b417b7257d782afd5ac8bee4d311"
	}
}

实例文件上传

从文件管理中心推送文件到一个或多个云手机实例(异步任务)。

接口地址

/vcpcloud/api/padApi/padUpdateFile

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22010020062String是实例编号
autoInstall1Integer否是否需要⾃动安装 1需要、0不需要。不填默认不需要。仅对apk类型的⽂件⽣效
fileUniqueId1e5d3bf00576ee8f3d094908c0456722String是文件id唯一标识。
customizeFilePath/Documents/String否⾃定义路径。非必传,需以/开头。(示例:"/DCIM/", "/Documents/", "/Download/", "/Movies/", "/Music/", "/Pictures/")

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1713773577581Long时间戳
dataObject[]
├─ padCodeAC22010020062String实例编号
├─ taskId1Integer任务ID
├─ vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例


{
	"padCodes": [
		"AC22010020062"
	],
	"autoInstall": 1,
	"fileUniqueId": "1e5d3bf00576ee8f3d094908c0456722",
	"customizeFilePath": "/Documents/"
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1717571059834,
	"data": [
		{
			"taskId": 1,
			"padCode": "AC22010020062",
			"vmStatus": 1
		}
	]
}

实例安装应用列表查询

查询实例安装应用列表信息。

接口地址

/vcpcloud/api/padApi/listInstalledApp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22010020062String是实例编号
appNameString否应用名称

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1713773577581Long时间戳
dataObject[]
├─ padCodeAC22010020062String实例编号
├─ appsObject[]应用列表
│ ├─ appNameTapTapString应用名称
│ ├─ packageNamecom.taptap.globalString应用包名
│ ├─ versionName3.49.0-full.100000String应用版本号
│ ├─ versionCode349001000String应用版本代码
│ ├─ appState0Integer0 已完成 1安装中 2下载中

请求示例


{
    "padCodes": ["AC32010780841"],
    "appName": null
}

响应示例

{
    "msg": "success",
        "code": 200,
        "data": [
            {
                "padCode": "AC32010780841",
                "apps": [
                    {
                        "appName": "TapTap",
                        "packageName": "com.taptap.global",
                        "versionName": "3.49.0-full.100000",
                        "versionCode": "349001000",
                        "appState": 0
                    }
                ]
            }
        ], 
        "ts": 1740020993436
}

任务管理

实例操作任务详情

查询指定实例操作任务的执行结果详细信息。

接口地址

/vcpcloud/api/padApi/padTaskDetail

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
taskIdsInteger[]是
├─taskId1Integer是任务ID

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject []子任务列表详情
├─ taskId1Integer子任务ID
├─ padCodeVP22020020793String实例标识
├─ taskStatus2String TODO类型使用错误任务状态(-1:全失败;-2:部分失败;-3:取消;-4:超时;1:待执行;2:执行中;3:完成)
├─ endTime1713429401000Long子任务结束时间戳
├─ taskContent“”String任务内容
├─ taskResult“”String任务结果
├─ errorMsg“”String错误信息

请求示例

{
	"taskIds":[1,2]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1716283460673,
	"data": [
		{
			"taskId": 1,
			"padCode": "AC22030022441",
			"taskStatus": 2,
			"endTime": 1713429401000,
			"taskContent": null,
			"taskResult": null
		},
		{
			"taskId": 2,
			"padCode": "AC22030022442",
			"taskStatus": 2,
			"endTime": 1713429401001,
			"taskContent": null,
			"taskResult": null
		}
	]
}

文件任务详情

查询指定文件任务的执行结果详细信息。

接口地址

/vcpcloud/api/padApi/fileTaskDetail

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
taskIdsInteger[]是
├─taskId1Integer是任务ID

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]任务列表详情
├─ taskId1Integer子任务ID
├─ appId134Long应用id
├─ fileUniqueIde2c07491309858c5cade4bfc44c03724String⽂件唯⼀标识
├─ fileNamexx.apkString文件名称
├─ taskStatus2Integer任务状态(-1:全失败;-2:部分失败;-3:取消;-4:超时;1:待执行;2:执行中;3:完成)
├─ endTime1713429401000Long子任务结束时间戳

请求示例

{
	"taskIds":[
		1,2
	]
}

响应示例

{
	"code": 200,
	"msg": "success",
	"ts": 1716283460673,
	"data": [
		{
			"taskId": 1,
			"appId": 134,
			"fileUniqueId": "e2c07491309858c5cade4bfc44c03724",
			"fileName": "xx.apk",
			"taskStatus": 2,
			"endTime": 1713429401000
		},
		{
			"taskId": 2,
			"appId": 135,
			"fileUniqueId": "e2c07491309858c5cade4bfc43c03725",
			"fileName": "xx.apk",
			"taskStatus": 2,
			"endTime": 1713429401001
		}
	]
}

自动化管理

做自动化任务时请不要操作云机,去做重启、重置、升级镜像、换机等操作云机的业务,否则会影响自动化任务。

自动化任务列表查询

自动化任务列表查询。

接口地址

/vcpcloud/api/padApi/autoTaskList

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
taskIdsLong[]否任务id数组
taskType1Integer否任务类型:1-登陆 2-编辑资料 3-搜索短视频 4-随机浏览视频 5-发布视频 6-发布图集
page1Integer是页码
rows10Integer是每页记录数

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736327056700Long时间戳
dataObject数据详情
├─ recordsObject[]记录列表
│ ├─ taskId115Integer任务ID
│ ├─ userId14114Integer用户ID
│ ├─ equipmentId106588Integer设备编号
│ ├─ padCodeAC32010180421String实例编号
│ ├─ padNamezzzzzString实例名称
│ ├─ taskType1Integer任务类型:1-登陆 2-编辑资料 3-搜索短视频 4-随机浏览视频 5-发布视频 6-发布图集
│ ├─ taskNametestAddString任务名称
│ ├─ executionStatus0Integer执行状态:-2取消任务 -1 执行失败 0-待执行 1-执行中 2-执行成功
│ ├─ plannedExecutionTime2025-01-09 00:00:00String计划执行时间
│ ├─ executionEndTimenullString执行结束时间
│ ├─ createdTime2025-01-08 14:25:01String创建时间
│ ├─ failureReasonnullString失败原因
├─ total46Integer总记录数
├─ size10Integer每页记录数
├─ current1Integer当前页码
├─ pages5Integer总页数

请求示例

{
    "page": 1,
    "rows": 10
}

响应示例

{
	"msg": "success",
	"code": 200,
	"data": {
		"records": [
			{
				"id": 121,
				"taskId": 121,
				"userId": 14114,
				"equipmentId": 106653,
				"padCode": "AC32010180522",
				"padName": "V04",
				"taskType": 1,
				"taskName": "testAdd",
				"executionStatus": 2,
				"plannedExecutionTime": "2025-01-08 18:02:00",
				"executionEndTime": "2025-01-08 18:08:11",
				"createdTime": "2025-01-08 18:01:03",
				"failureReason": null
			}
		],
		"total": 46,
		"size": 10,
		"current": 1,
		"pages": 5
	},
	"ts": 1736331989341
}

创建自动化任务

创建自动化任务。设备编号一定要传对(云手机列表接口有返回设备编号)。任务主要绑定在设备编号上,如果执行前操作了换机也不会影响设备丢失任务。(异步,会检测云机是否有下载TK应用,未下载会自动下载TK应用后再去执行任务。下载TK和执行任务期间勿手动操作云机),不同任务传参的请求不一致会有示例。

接口地址

/vcpcloud/api/padApi/addAutoTask

请求方式

POST

请求数据类型

application/json

登陆任务请求Query参数示例

参数名示例值参数类型是否必填参数描述
taskNametestAddString是任务名称
remarks测试String否备注
taskType1Integer是任务类型:1-登陆 2-编辑资料 3-搜索短视频 4-随机浏览视频 5-发布视频 6-发布图集 7-视频点赞评论 8-直播加热
listObject[]是任务列表
├─ equipmentId106653Integer是设备编号
├─ padCodeAC32010180522String是实例编号
├─ plannedExecutionTime2025-01-08 17:20:00String是计划执行时间
├─ addInfo参考请求示例JSONObject是任务参数(注:许按不同任务类型对应的格式填,否则任务失败)

请求示例

{
    "taskName": "testAdd",
    "remarks": "测试",
    "taskType": 1,
    "list": [
        {
            "equipmentId": 106653,
            "padCode": "AC32010180522",
            "plannedExecutionTime": "2025-01-08 17:20:00",
            "addInfo": {
                "password": "zhouxi12....",
                "username": "[email protected]"
            }
        }
    ]
}

登陆任务参数(任务类型-taskType:1)

参数名示例值参数类型是否必填参数描述
password[email protected]String是账号
username[email protected]String是密码

编辑资料任务参数(任务类型-taskType:2)

参数名示例值参数类型是否必填参数描述
linkhttps://xxxx.pngString是头像地址 大于 250x250
usernametestString是名称

搜索短视频任务参数(任务类型-taskType:3)

参数名示例值参数类型是否必填参数描述
tag标题String是标签
timeout10Integer是观看时长(秒) 注:最多2小时,否则任务超时失败

随机浏览视频任务参数(任务类型-taskType:4)

参数名示例值参数类型是否必填参数描述
timeout10Integer是观看时长(秒) 注:最多2小时,否则任务超时失败
tag“”String否标签

发布视频任务参数(任务类型-taskType:5)

参数名示例值参数类型是否必填参数描述
linkhttps://xxxxString否视频oss地址
copywritingtestString是文案
productIdnullString否商品id

发布图集任务参数(任务类型-taskType:6)

参数名示例值参数类型是否必填参数描述
links[https://xxxx]array[String]是图片oss地址 最多十张
copywritingtestString是文案
bgmbgmString是背景音乐名称

视频点赞评论任务参数(任务类型-taskType:7)

参数名示例值参数类型是否必填参数描述
timeout10Integer是观看时长(秒) 注:最多2小时,否则任务超时失败
tag“”String否标签
contents["wow"]array[String]否评论内容 注:目前仅支持1个,后续扩展

直播加热任务参数(任务类型-taskType:8)

参数名示例值参数类型是否必填参数描述
timeout10Integer是观看时长(秒) 注:最多2小时,否则任务超时失败
liveRoomId“xlavandulax”String是主播ID
contents"wow"String是评论内容

响应参数

参数名示例值参数类型参数描述
code0Integer状态码:0-成功
msgsuccessString响应消息
ts1736327056700Long时间戳
dataObject {}子任务列表详情
├─ taskIdsLong[]任务ID数组

响应示例

{
	"msg": "success",
	"code": 200,
	"taskIds": [
		116
	],
	"ts": 1736327380399
}

自动化任务重试

自动化任务重试。

接口地址

/vcpcloud/api/padApi/reExecutionAutoTask

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
taskIdsLong[]是任务ID数组
plannedExecutionTime2025-01-08 17:30:00Date是计划执行时间

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
dataObject {}子任务列表详情
ts1736327056700Long时间戳
├─ taskIdsLong[]新任务ID数组

请求示例

{
    "taskIds": [
        109
    ],
    "plannedExecutionTime": "2025-01-08 17:30:00"
}

响应示例

{
	"msg": "success",
	"code": 200,
	"taskIds": [
		118
	],
	"ts": 1736327771611
}

自动化任务取消

自动化任务取消。

接口地址

/vcpcloud/api/padApi/cancelAutoTask

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
taskIdsLong[]是任务ID数组

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1736327056700Long时间戳

请求示例

{
    "taskIds": [
        118
    ]
}

响应示例

{
	"msg": "success",
	"code": 200,
	"ts": 1736327841671
}

云手机管理

新建/续费云手机

新建/续费云手机。(注意购买的商品套餐需在网页端是存在的,否则购买失败)

接口地址

/vcpcloud/api/padApi/createMoneyOrder

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
androidVersionNameAndroid13String是Android 版本:Android13、Android14
goodId1Integer是商品Id(对应 sku套餐列表的商品ID值)
goodNum1Integer是商品数量
autoRenewtrueBoolean是是否自动续费(默认开启)true-开启、false-关闭
equipmentId106626,106627String是续费设备编号 (多台设备以逗号分割)

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject[]数据列表
├─ id7644Integer数据唯一标识
├─ orderIdVMOS-CLOUD173630666722957907String订单编号
├─ equipmentId106662Integer设备ID
├─ createTime2025-01-08 11:24:31String创建时间
├─ creater14114String创建人
ts1736306672346Long时间戳

请求示例

{
    "androidVersionName": "Android13",
    "goodId": 1,
    "goodNum": 1,
    "autoRenew": true
}

响应示例

{
	"msg": "success",
	"code": 200,
	"data": [
		{
			"id": 7644,
			"orderId": "VMOS-CLOUD173630666722957907",
			"equipmentId": 106662,
			"createTime": "2025-01-08 11:24:31",
			"creater": "14114"
		}
	],
	"ts": 1736306672346
}

云手机列表

云手机列表。

接口地址

/vcpcloud/api/padApi/userPadList

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
padCodenullString否实例编号
equipmentIdsInteger[]否设备编号数组

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1736235894274Long时间戳
dataObject[]数据列表
├─ padCodeAC32010180421String云机编号
├─ deviceIp172.30.5.43String云机物理机IP
├─ padIp10.254.21.225String云机I虚拟P
├─ cvmStatus100Integer云机状态 100-正常 101-截图中 102-重启中 103-重置中 104-异常
├─ screenshotLinkhttps://XXXXXX.pngString云机截图链接
├─ equipmentId106626Integer设备编号
├─ userId14114Integer用户ID
├─ status1Integer设备状态
├─ padNameV08String云机显示名称
├─ bootTime1735643626263Long云机使用时长
├─ cumulativeUseTimenullObject设备累计使用时间
├─ lastBackupTimenullObject上次备份时间
├─ maintainContentnullObject维护内容
├─ goodId1Integer商品ID
├─ goodNamei18n_Android13-V08String商品名称
├─ signExpirationTime2025-01-31 19:13:46String签约云机到期时间
├─ signExpirationTimeTamp1738322026000Long签约云机到期时间戳
├─ supplierType5String供应商类型
├─ androidVersionAvatarhttps://XXXX.pngStringAndroid版本头像
├─ configNameV08String商品型号名称
├─ androidVersionAvatar2https://XXX.pngStringAndroid版本头像2
├─ androidVersionAvatar3https://XXX.pngStringAndroid版本头像3
├─ androidVersion13StringAndroid版本
├─ authorizedUserIdnullObject授权用户ID
├─ authorizedExpirationTimenullObject授权过期时间
├─ authorizedExpirationTimeTampnullObject授权过期时间戳
├─ changeConfig1Integer支持更配 0-否 1-是
├─ createTime2024-12-31 19:13:46String创建时间
├─ proxyIpnullObject代理IP地址
├─ remarkString备注
├─ proxyIdnullObject代理IP信息
├─ ipAddressnullObjectIP归属地
├─ publicIpnullObject出口IP
├─ groupIdnullObject分组ID
├─ groupNamenullObject分组名称
├─ groupSortnullObject分组排序

云机状态

状态值参数描述
99加载中 (Loading)
100正常 (Normal)
101获取截图中 (Getting Screenshot)
102重启中 (Rebooting)
103重置中 (Resetting)
104重启失败 (Reboot Failed)
105重置失败 (Reset Failed)
106维护 (Maintenance)
107镜像升级中 (Upgrading Image)
108实例迁移中 (Migrating Instance)
109实例迁移失败 (Migration Failed)
111设备更配中 (Device Configuration)
112反诈封禁 (Anti-Fraud Lockdown)
113升降配 (Config Change)
114超卖中 (Over Selling)
115换区中 (Changing Zone)
116清理内存中 (Cleaning Memory)
119云机初始化中 (Initializing Cloud Machine)
120一键新机初始化中 (One-click New Machine Initialization)
121任务执行中 (Task Execution in Progress)
201备份中 (Backing Up)
202还原中 (Restoring)

请求示例

{
    "padCode": null,
    "equipmentIds": [
        106626
    ]
}

响应示例

{
  "msg": "success",
  "code": 200,
  "ts": 1736235894274,
  "data": [
    {
      "padCode": "AC32010180421",
      "deviceIp": "172.30.5.43",
      "padIp": "10.254.21.225",
      "cvmStatus": 100,
      "screenshotLink": "https://XXXXXX.png",
      "equipmentId": 106626,
      "userId": 14114,
      "status": 1,
      "padName": "V08",
      "bootTime": 1735643626263,
      "cumulativeUseTime": null,
      "lastBackupTime": null,
      "maintainContent": null,
      "goodId": 1,
      "goodName": "i18n_Android13-V08",
      "signExpirationTime": "2025-01-31 19:13:46",
      "signExpirationTimeTamp": 1738322026000,
      "supplierType": "5",
      "androidVersionAvatar": "https://XXXX.png",
      "configName": "V08",
      "androidVersionAvatar2": "https://XXX.png",
      "androidVersionAvatar3": "https://XXX.png",
      "androidVersion": "13",
      "authorizedUserId": null,
      "authorizedExpirationTime": null,
      "authorizedExpirationTimeTamp": null,
      "changeConfig": 1,
      "createTime": "2024-12-31 19:13:46",
      "proxyIp": null,
      "remark": "",
      "proxyId": null,
      "ipAddress": null,
      "publicIp": null,
      "groupId": null,
      "groupName": null,
      "groupSort": null
    }
  ]
}

云手机信息查询

云手机信息查询。

接口地址

/vcpcloud/api/padApi/padInfo

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
padCodeAC32010180421String是实例编号

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject响应数据
├─ explainEnglishString语言-说明
├─ simCountrySGStringSIM卡国家
├─ countrySGString国家
├─ padCodeAC32010180421String实例编号
├─ padTypeV08String设备机型
├─ bluetoothAddress3A:1F:4B:9C:2D:8EString蓝牙地址
├─ initializationData{"explain":"English","country":"SG","simJson":{"simCountry":"SG","operatorShortname":"M1","imei":"979706209497838","imsi":"525036719631842","phonenum":"6510633153","operatorNumeric":"52503"},"latitude":"1.3398","timeZone":"Asia/Singapore","language":"en","longitude":"103.6967"}String设备信息集合
├─ groupId0String分组ID
├─ latitude1.3398String纬度
├─ ipAddressHong KongStringIP地址
├─ timeZoneAsia/SingaporeString时区
├─ publicIp192.169.96.14String出口IP
├─ phoneNumber+6510633153String虚拟号码
├─ androidVersionAndroid13StringAndroid版本
├─ wlanMac4c:7f:11:2f:a6:ccStringWLAN MAC地址
├─ padNameV08StringPad名称
├─ simIsoM1StringSIM卡ISO
├─ longitude103.6967String经度
├─ operatorNumeric52503Integer运营商编号
├─ padImei525036719631842StringIMEI
ts1736239152927Long时间戳

请求示例

{
    "padCode": null
}

响应示例

{
	"msg": "success",
	"code": 200,
	"data": {
		"explain": "English",
		"simCountry": "SG",
		"country": "SG",
		"padCode": "AC32010180421",
		"padType": "V08",
		"bluetoothAddress": "3A:1F:4B:9C:2D:8E",
		"initializationData": "{\"explain\":\"English\",\"country\":\"SG\",\"simJson\":{\"simCountry\":\"SG\",\"operatorShortname\":\"M1\",\"imei\":\"979706209497838\",\"imsi\":\"525036719631842\",\"phonenum\":\"6510633153\",\"operatorNumeric\":\"52503\"},\"latitude\":\"1.3398\",\"timeZone\":\"Asia/Singapore\",\"language\":\"en\",\"longitude\":\"103.6967\"}",
		"groupId": "0",
		"latitude": "1.3398",
		"ipAddress": "Hong Kong",
		"timeZone": "Asia/Singapore",
		"publicIp": "192.169.96.14",
		"phoneNumber": "+6510633153",
		"androidVersion": "Android13",
		"wlanMac": "4c:7f:11:2f:a6:cc",
		"padName": "V08",
		"simIso": "M1",
		"longitude": "103.6967",
		"operatorNumeric": 52503,
		"padImei": "525036719631842"
	},
	"ts": 1736239152927
}

sku套餐列表

sku套餐列表。

接口地址

/vcpcloud/api/padApi/getCloudGoodList

请求方式

GET

请求数据类型

application/json

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject响应数据
├─ androidVersionNameAndroid13StringAndroid 版本名称
├─ cloudGoodsInfoObjectsku套餐信息
│ ├─ configsList商品型号信息
│ │ ├─ configNameSamsung s23 ultraString商品型号名称
│ │ ├─ sellOutFlagfalseBoolean是否售罄
│ │ ├─ configBlurb顶尖科技,媲美真机至尊体验!String商品型号描述
│ │ ├─ defaultSelectionfalseBoolean是否默认选中
│ │ ├─ reorder0Integer排序
│ │ ├─ goodTimesList商品价格卡
│ │ │ ├─ oldGoodPrice100Integer原价
│ │ │ ├─ showContent1天String商品时长名称
│ │ │ ├─ whetherFirstPurchasetrueBoolean是否为首次购买
│ │ │ ├─ reorder1Integer排序
│ │ │ ├─ goodPrice100Integer商品价格
│ │ │ ├─ equipmentNumber1Integer商品发货设备数量
│ │ │ ├─ goodTime1440Integer商品时长(分钟)
│ │ │ ├─ autoRenewtrueBoolean是否支持自动续订
│ │ │ ├─ recommendContent首购特惠String推荐内容
│ │ │ ├─ id27Integer商品 ID
ts1737440589859Long时间戳

响应示例

{
    "msg": "success",
        "code": 200,
        "data": [
        {
            "androidVersionName": "Android13",
            "cloudGoodsInfo": {
                "configs": [
                    {
                        "configName": "Samsung s23 ultra",
                        "sellOutFlag": false,
                        "configBlurb": "顶尖科技,媲美真机至尊体验!",
                        "defaultSelection": false,
                        "reorder": 0,
                        "goodTimes": [
                            {
                                "oldGoodPrice": 100,
                                "showContent": "1天",
                                "whetherFirstPurchase": true,
                                "reorder": 1,
                                "goodPrice": 100,
                                "equipmentNumber": 1,
                                "goodTime": 1440,
                                "autoRenew": true,
                                "recommendContent": "首购特惠",
                                "id": 27
                            }
                        ]
                    }
                ],
                "goodId": 1
            }
        }
    ],
        "ts": 1737440589859
}

修改真机ADI模板

修改实例云真机ADI模版, 传入云真机模版ID

必要条件:

实例创建时,需要创建为云真机类型 实例创建时的规格,需要和目标的ADI模版规格一致 实例创建时的安卓版本,需要和目标的ADI安卓版本一致

接口地址

/vcpcloud/api/padApi/replaceRealAdiTemplate

请求方式

POST

请求数据类型

application/json

请求BODY参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22010020062String是实例编号
wipeDatafalseBoolean是是否清除数据
realPhoneTemplateId186Long是云真机模板id

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject响应数据
├─taskId1Integer任务ID
├─padCodeAC21020010001String实例编号
├─vmStatus1Integer实例在线状态(0:离线;1:在线)

请求示例

{
    "padCodes": ["AC32010250011"],
    "wipeData": true,
    "realPhoneTemplateId": 186
}

响应示例

{
    "code": 200,
        "msg": "success",
        "ts": 1736326542985,
        "data": [{
        "taskId": 10074,
        "padCode": "AC32010250011",
        "errorMsg": null
    }]
}

SDK Token签发

签发临时 STS Token,用于对接入云手机服务的用户进行鉴权。

获取SDK临时token

接口地址

/vcpcloud/api/padApi/stsToken

请求方式

GET

请求数据类型

application/json

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject数据列表
├─ token18df5803-48ce-4b53-9457-6a15feb1dacaStringsdk通信token

响应示例

{
    "code": 200,
    "msg": "success",
    "ts":1713773577581,
    "data": {
        
        "token": "18df5803-48ce-4b53-9457-6a15feb1daca"
    }
}

SDK-Token签发(根据padCode)

签发临时 STS Token,用于对接入云手机服务的用户进行鉴权(该token只能用于请求的padCode)。

根据padCode获取SDK临时token

接口地址

/vcpcloud/api/padApi/stsTokenByPadCode

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
padCodeAC32010230001String是实例编号

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject数据列表
├─ token18df5803-48ce-4b53-9457-6a15feb1dacaStringsdk通信token

请求示例

{"padCode":"AC32010230001"}

响应示例

{
    "code": 200,
    "msg": "success",
    "ts":1713773577581,
    "data": {
        "token": "18df5803-48ce-4b53-9457-6a15feb1daca"
    }
}

清除SDK授权Token

接口地址

/vcpcloud/api/padApi/clearStsToken

请求方式

POST

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
token123String是

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject数据列表
请求示例
{"token":1234}

响应示例

{
    "code": 200,
    "msg": "success",
    "ts":1713773577581,
    "data": null
}

回调相关

配置说明

需要客户在WEB端配置回调地址,配置地址成功则默认开启接收回调信息

异步执行ADB命令回调

使用场景

客户调用异步执行ADB命令,会通过该回调接口通知给客户。

字段类型示例说明
taskBusinessTypeInteger1002任务业务类型
taskIdInteger1任务id
padCodeStringAC22030022001实例标识
taskStatusInteger3任务状态(-1:全失败;-2:部分失败;-3:取消;-4:超时;1:待执行;2:执行中;3:完成)
endTimeLong1756021166163任务执行结束时间
taskResultStringSuccess任务结果
taskContentString任务内容
cmdStringcd /root;ls执行的命令
cmdResultString/ws执行的命令返回

示例

{
    "cmd": "cd /root;ls",
    "cmdResult": "/system/bin/sh: <stdin>[1]: cd: /root: No such file or directory",
    "endTime": 1734942133000,
    "padCode": "AC22030022001",
    "taskContent": null,
    "taskId": 10614,
    "taskResult": "/system/bin/sh: <stdin>[1]: cd: /root: No such file or directory",
    "taskStatus": 3
}

实例文件上传回调

使用场景

客户调用实例文件上传api,会通过该回调接口通知客户。

字段类型示例说明
taskBusinessTypeInteger1009任务业务类型
taskIdInteger1任务ID
resultbooleantrue执行结果:true-成功,false-失败
errorCodeString错误码
padCodeStringAC22030022001实例编号
fileIdStringcf08f7b685ab3a7b6a793b30de1b33ae34文件id

示例

{
    "errorCode": null,
    "fileId": "cfec132ab3c4e1aff5515c4467d9bbe460",
    "padCode": "AC22030022001",
    "result": true,
    "taskBusinessType": 1009,
    "taskId": 10659,
    "taskResult": "Success",
    "taskStatus": 3
}

应用安装回调

使用场景

客户调用应用安装,应用的安装情况会通过该回调接口通知给客户。

字段类型示例说明
taskBusinessTypeInteger1003任务业务类型
taskIdInteger1任务ID
appsObject[]应用信息
├─ appIdInteger10001应用ID
├─ appNameStringdemo应用名称
├─ pkgNameStringcom.xxx.demo包名
├─ padCodeStringAC22030022001实例编号
├─ resultbooleantrue安装结果的标识。true:成功,false:失败
├─ failMsgString此应用已加入黑名单,禁止安装失败信息

示例

{
    "endTime": 1734939747000,
    "padCode": "AC22030022001",
    "taskBusinessType": 1003,
    "taskContent": "",
    "taskId": 10613,
    "taskResult": "Success",
    "taskStatus": 3
}

应用卸载回调

使用场景

客户调用应用卸载,应用卸载的情况会通过该回调接口通知给客户。

字段类型示例说明
taskBusinessTypeInteger1004任务业务类型
taskIdInteger1任务ID
appsObject应用信息
├─ appIdInteger10001应用ID
├─ appNameStringdemo应用名称
├─ pkgNameStringcom.xxx.demo包名
├─ padCodeStringAC22030022001实例编号
├─ resultbooleantrue安装结果的标识。true:成功,false:失败

示例

{
    "endTime": 1734940052000,
    "padCode": "AC22030022001",
    "taskBusinessType": 1004,
    "taskContent": "",
    "taskId": null,
    "taskResult": "Success",
    "taskStatus": 3
}

应用启动回调

使用场景

客户调用应用启动,应用启动的情况会通过该回调接口通知给客户。

字段类型示例说明
taskBusinessTypeInteger1007任务业务类型
taskIdInteger1任务ID
taskStatusInteger3任务状态(-1:全失败;-3:取消;-4:超时;1:待执行;2:执行中;3:完成)
padCodeStringAC22030022001实例标识
pkgNameStringxxx.test.com包名

示例

{
    "taskBusinessType": 1007,
    "packageName": "com.quark.browser",
    "padCode": "AC22030022001",
    "taskId": 10618,
    "taskStatus": 3
}

应用停止回调

使用场景

客户调用应用停止,应用停止的情况会通过该回调接口通知给客户。

字段类型示例说明
taskBusinessTypeInteger1005任务业务类型
taskIdInteger1任务ID
taskStatusInteger3任务状态(-1:全失败;-3:取消;-4:超时;1:待执行;2:执行中;3:完成)
padCodeStringAC22030022001实例标识
pkgNameStringxxx.test.com包名

示例

{
    "taskBusinessType": 1005,
    "packageName": "com.quark.browser",
    "padCode": "AC22030022001",
    "taskId": 10618,
    "taskStatus": 3
}

应用重启回调

使用场景

客户调用应用重启,应用重启的情况会通过该回调接口通知给客户。

字段类型示例说明
taskBusinessTypeInteger1006任务业务类型
taskIdInteger1任务ID
taskStatusInteger3任务状态(-1:全失败;-3:取消;-4:超时;1:待执行;2:执行中;3:完成)
padCodeStringAC22030022001实例标识
pkgNameStringxxx.test.com包名

示例

{
    "taskBusinessType": 1006,
    "packageName": "com.quark.browser",
    "padCode": "AC22030022001",
    "taskId": 10618,
    "taskStatus": 3
}
Next
错误码