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

简介

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

更新记录

2025-05-21

  • 新增 上传用户镜像 接口

2025-05-20

  • 新增 获取静态住宅商品列表 接口
  • 新增 获取静态住宅商品支持的国家城市信息 接口
  • 新增 静态住宅商品购买 接口
  • 新增 静态住宅代理订单明细 接口
  • 新增 静态住宅代理续费 接口
  • 新增 查询静态住宅代理列表 接口

2025-05-15

  • 新增 查询动态代理商品列表 接口
  • 新增 查询动态代理地区列表 接口
  • 新增 获取动态代理当前余量 接口
  • 新增 查询支持的服务器地区 接口
  • 新增 购买动态代理流量包 接口
  • 新增 创建动态代理 接口
  • 新增 查询动态代理列表(支持分页) 接口
  • 新增 查询动态代理订单列表(支持分页) 接口
  • 新增 云机配置动态代理 接口
  • 新增 查询动态代理自动续费信息 接口
  • 新增 设置动态代理自动续费开关 接口
  • 新增 删除动态代理 接口

2025-05-13

  • 新增 获取邮箱服务列表 接口
  • 新增 获取邮箱类型及剩余库存 接口
  • 新增 创建购买邮箱订单 接口
  • 新增 查询购买的邮箱列表 接口
  • 新增 刷新获取邮箱验证码 接口

2025-05-09

  • 新增 导入通话记录 接口
  • 新增 指定输入框文本输入 接口

2025-05-08

  • 新增 获取指定云机列表中所有安装的应用信息 接口
  • 更新 应用卸载 接口
  • 新增 上传文件到云空间 接口
  • 新增 删除云空间文件 接口
  • 新增 查询用户的文件列表 接口

2025-04-30

  • 新增 显示或隐藏应用进程 接口

2025-04-25

  • 更新 sku套餐列表 接口, 添加计时设备商品
  • 更新 云手机列表 接口,添加计时设备信息
  • 新增 创建计时设备订单 接口
  • 新增 计时设备开机 接口
  • 新增 计时设备关机 接口
  • 新增 计时设备销毁 接口
  • 新增 存储资源包列表 接口
  • 新增 云空间存储剩余容量 接口
  • 新增 云空间商品列表 接口
  • 新增 购买云空间扩容 接口
  • 新增 云空间续费详情查询 接口
  • 新增 聚合续费云空间商品 接口
  • 新增 云空间自动续费聚合商品开关 接口
  • 新增 删除备份资源包数据 接口

2025-04-21

  • 更新 实例重启(重启换IP) 接口

2025-04-09

  • 新增 安卓镜像版本集合 接口
  • 新增 云机模拟触控 接口

2025-03-29

  • 新增 设备预售购买 接口
  • 新增 查询预售订单结果详情 接口

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'))

Signature生成工具类示例(node)

const CryptoJS = require("crypto-js");
const moment = require("moment");

/**
 * Class for generating HMAC-SHA256 signatures for API requests to Vmos cloud services.
 */
class VmosAPISigner {
  constructor(accessKeyId, secretAccessKey) {
    this.accessKeyId = accessKeyId;
    this.secretAccessKey = secretAccessKey;
    this.contentType = "application/json;charset=UTF-8";
    this.host = "api.vmoscloud.com";
    this.service = "armcloud-paas";
    this.algorithm = "HMAC-SHA256";
  }

  // Generate authentication headers for API requests
  signRequest(requestOptions) {
    const { method, path, queryParams = {}, body = null } = requestOptions;

    // Process request parameters
    let params = "";
    if (method === "POST" && body) {
      params = typeof body === "string" ? body : JSON.stringify(body);
    } else if (method === "GET" && Object.keys(queryParams).length > 0) {
      params = new URLSearchParams(queryParams).toString();
    }

    // Generate timestamp
    const xDate = moment().utc().format("YYYYMMDDTHHmmss[Z]");
    const shortXDate = xDate.substring(0, 8);
    const credentialScope = `${shortXDate}/${this.service}/request`;

    // Build canonical request string
    const canonicalString = [
      `host:${this.host}`,
      `x-date:${xDate}`,
      `content-type:${this.contentType}`,
      `signedHeaders:content-type;host;x-content-sha256;x-date`,
      `x-content-sha256:${CryptoJS.SHA256(params).toString()}`,
    ].join("\n");

    // Calculate signature
    const stringToSign = [
      this.algorithm,
      xDate,
      credentialScope,
      CryptoJS.SHA256(canonicalString).toString(),
    ].join("\n");

    const kDate = CryptoJS.HmacSHA256(shortXDate, this.secretAccessKey);
    const kService = CryptoJS.HmacSHA256(this.service, kDate);
    const signKey = CryptoJS.HmacSHA256("request", kService);

    // Generate final signature
    const sign = CryptoJS.HmacSHA256(stringToSign, signKey);
    const signature = sign.toString(CryptoJS.enc.Hex);

    // Construct authorization header
    const authorization = [
      `HMAC-SHA256 Credential=${this.accessKeyId}/${credentialScope}`,
      `SignedHeaders=content-type;host;x-content-sha256;x-date`,
      `Signature=${signature}`,
    ].join(", ");

    // Return signed request headers
    return {
      "x-date": xDate,
      "x-host": this.host,
      authorization: authorization,
      "content-type": this.contentType,
    };
  }
}

接口调用demo示例(node)

const CryptoJS = require("crypto-js");
const moment = require("moment");
const axios = require("axios");

axios.interceptors.request.use(
  (config) => {
    // Convert Content-Type header to lowercase
    if (config.headers["Content-Type"]) {
      config.headers["content-type"] = config.headers["Content-Type"];
      delete config.headers["Content-Type"];
    }
    return config;
  },
  (error) => {
    // Handle request errors
    return Promise.reject(error);
  }
);

/**
 * Class for generating HMAC-SHA256 signatures for API requests to Vmos cloud services.
 */
class VmosAPISigner {
  constructor(accessKeyId, secretAccessKey) {
    this.accessKeyId = accessKeyId;
    this.secretAccessKey = secretAccessKey;
    this.contentType = "application/json;charset=UTF-8";
    this.host = "api.vmoscloud.com";
    this.service = "armcloud-paas";
    this.algorithm = "HMAC-SHA256";
  }

  // Generate authentication headers for API requests
  signRequest(requestOptions) {
    const { method, path, queryParams = {}, body = null } = requestOptions;

    // Process request parameters
    let params = "";
    if (method === "POST" && body) {
      params = typeof body === "string" ? body : JSON.stringify(body);
    } else if (method === "GET" && Object.keys(queryParams).length > 0) {
      params = new URLSearchParams(queryParams).toString();
    }

    // Generate timestamp
    const xDate = moment().utc().format("YYYYMMDDTHHmmss[Z]");
    const shortXDate = xDate.substring(0, 8);
    const credentialScope = `${shortXDate}/${this.service}/request`;

    // Build canonical request string
    const canonicalString = [
      `host:${this.host}`,
      `x-date:${xDate}`,
      `content-type:${this.contentType}`,
      `signedHeaders:content-type;host;x-content-sha256;x-date`,
      `x-content-sha256:${CryptoJS.SHA256(params).toString()}`,
    ].join("\n");

    // Calculate signature
    const stringToSign = [
      this.algorithm,
      xDate,
      credentialScope,
      CryptoJS.SHA256(canonicalString).toString(),
    ].join("\n");

    const kDate = CryptoJS.HmacSHA256(shortXDate, this.secretAccessKey);
    const kService = CryptoJS.HmacSHA256(this.service, kDate);
    const signKey = CryptoJS.HmacSHA256("request", kService);

    // Generate final signature
    const sign = CryptoJS.HmacSHA256(stringToSign, signKey);
    const signature = sign.toString(CryptoJS.enc.Hex);

    // Construct authorization header
    const authorization = [
      `HMAC-SHA256 Credential=${this.accessKeyId}/${credentialScope}`,
      `SignedHeaders=content-type;host;x-content-sha256;x-date`,
      `Signature=${signature}`,
    ].join(", ");

    // Return signed request headers
    return {
      "x-date": xDate,
      "x-host": this.host,
      authorization: authorization,
      "content-type": this.contentType,
    };
  }
}

// 使用示例
async function makeSignedRequest() {
  const signer = new VmosAPISigner(
    "", // Access Key ID
    "" // Secret Access Key
  );

  const baseURL = "https://api.vmoscloud.com";

  // Example GET request configuration
  const getRequest = {
    method: "GET",
    path: "/vcpcloud/api/padApi/getProxys",
    queryParams: { page: 1, rows: 10 },
  };

  // Example POST request configuration
  const postRequest = {
    method: "POST",
    path: "/vcpcloud/api/padApi/userPadList",
    body: { padCode: "AC32010790572" },
  };

  await axios({
    baseURL: baseURL,
    method: getRequest.method,
    url: getRequest.path,
    headers: signer.signRequest(getRequest),
    params: getRequest.queryParams,
  }).then((response) => {
    console.log("getRequest 响应:", response.data);
  });

  await axios({
    baseURL: baseURL,
    method: postRequest.method,
    url: postRequest.path,
    headers: signer.signRequest(postRequest),
    data: postRequest.body,
  }).then((response) => {
    console.log("postRequest 响应:", response.data);
  });
}

// Run example requests
makeSignedRequest();

Signature生成工具类示例(go)

package main

import (
	"bytes"
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"sort"
	"strings"
	"time"
)

type VmosAPISigner struct {
	AccessKeyId     string
	SecretAccessKey string
	ContentType     string
	Host            string
	Service         string
	Algorithm       string
}

func NewVmosAPISigner(accessKeyId, secretAccessKey string) *VmosAPISigner {
	return &VmosAPISigner{
		AccessKeyId:     accessKeyId,
		SecretAccessKey: secretAccessKey,
		ContentType:     "application/json;charset=UTF-8",
		Host:            "api.vmoscloud.com",
		Service:         "armcloud-paas",
		Algorithm:       "HMAC-SHA256",
	}
}

func sha256Hex(data string) string {
	hash := sha256.Sum256([]byte(data))
	return hex.EncodeToString(hash[:])
}

func hmacSHA256(key []byte, data string) []byte {
	h := hmac.New(sha256.New, key)
	h.Write([]byte(data))
	return h.Sum(nil)
}

func (s *VmosAPISigner) SignRequest(method, path string,
	queryParams map[string]string,
	body interface{}) map[string]string {
	var paramStr string
	if method == http.MethodPost && body != nil {
		bodyBytes, _ := json.Marshal(body)
		paramStr = string(bodyBytes)
	} else if method == http.MethodGet && len(queryParams) > 0 {
		var queryParts []string
		for k, v := range queryParams {
			queryParts = append(queryParts, url.QueryEscape(k)+"="+url.QueryEscape(v))
		}
		sort.Strings(queryParts)
		paramStr = strings.Join(queryParts, "&")
	}

	xDate := time.Now().UTC().Format("20060102T150405Z")
	shortDate := xDate[:8]
	credentialScope := fmt.Sprintf("%s/%s/request", shortDate, s.Service)

	// Canonical string
	canonicalString := fmt.Sprintf(
		"host:%s\nx-date:%s\ncontent-type:%s\nsignedHeaders:content-type;host;x-content-sha256;x-date\nx-content-sha256:%s",
		s.Host,
		xDate,
		s.ContentType,
		sha256Hex(paramStr),
	)

	// String to sign
	stringToSign := fmt.Sprintf(
		"%s\n%s\n%s\n%s",
		s.Algorithm,
		xDate,
		credentialScope,
		sha256Hex(canonicalString),
	)

	kDate := hmacSHA256([]byte(s.SecretAccessKey), shortDate)
	kService := hmacSHA256(kDate, s.Service)
	signKey := hmacSHA256(kService, "request")

	signature := hex.EncodeToString(hmacSHA256(signKey, stringToSign))

	authorization := fmt.Sprintf(
		"HMAC-SHA256 Credential=%s/%s, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=%s",
		s.AccessKeyId,
		credentialScope,
		signature,
	)

	return map[string]string{
		"x-date":        xDate,
		"x-host":        s.Host,
		"authorization": authorization,
		"content-type":  s.ContentType,
	}
}

接口调用demo示例(go)

package main

import (
	"bytes"
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"sort"
	"strings"
	"time"
)

type VmosAPISigner struct {
	AccessKeyId     string
	SecretAccessKey string
	ContentType     string
	Host            string
	Service         string
	Algorithm       string
}

func NewVmosAPISigner(accessKeyId, secretAccessKey string) *VmosAPISigner {
	return &VmosAPISigner{
		AccessKeyId:     accessKeyId,
		SecretAccessKey: secretAccessKey,
		ContentType:     "application/json;charset=UTF-8",
		Host:            "api.vmoscloud.com",
		Service:         "armcloud-paas",
		Algorithm:       "HMAC-SHA256",
	}
}

func sha256Hex(data string) string {
	hash := sha256.Sum256([]byte(data))
	return hex.EncodeToString(hash[:])
}

func hmacSHA256(key []byte, data string) []byte {
	h := hmac.New(sha256.New, key)
	h.Write([]byte(data))
	return h.Sum(nil)
}

func (s *VmosAPISigner) SignRequest(method, path string,
	queryParams map[string]string,
	body interface{}) map[string]string {
	var paramStr string
	if method == http.MethodPost && body != nil {
		bodyBytes, _ := json.Marshal(body)
		paramStr = string(bodyBytes)
	} else if method == http.MethodGet && len(queryParams) > 0 {
		var queryParts []string
		for k, v := range queryParams {
			queryParts = append(queryParts, url.QueryEscape(k)+"="+url.QueryEscape(v))
		}
		sort.Strings(queryParts)
		paramStr = strings.Join(queryParts, "&")
	}

	xDate := time.Now().UTC().Format("20060102T150405Z")
	shortDate := xDate[:8]
	credentialScope := fmt.Sprintf("%s/%s/request", shortDate, s.Service)

	// Canonical string
	canonicalString := fmt.Sprintf(
		"host:%s\nx-date:%s\ncontent-type:%s\nsignedHeaders:content-type;host;x-content-sha256;x-date\nx-content-sha256:%s",
		s.Host,
		xDate,
		s.ContentType,
		sha256Hex(paramStr),
	)

	// String to sign
	stringToSign := fmt.Sprintf(
		"%s\n%s\n%s\n%s",
		s.Algorithm,
		xDate,
		credentialScope,
		sha256Hex(canonicalString),
	)

	kDate := hmacSHA256([]byte(s.SecretAccessKey), shortDate)
	kService := hmacSHA256(kDate, s.Service)
	signKey := hmacSHA256(kService, "request")

	signature := hex.EncodeToString(hmacSHA256(signKey, stringToSign))

	authorization := fmt.Sprintf(
		"HMAC-SHA256 Credential=%s/%s, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=%s",
		s.AccessKeyId,
		credentialScope,
		signature,
	)

	return map[string]string{
		"x-date":        xDate,
		"x-host":        s.Host,
		"authorization": authorization,
		"content-type":  s.ContentType,
	}
}

func sendRequest(method, path string, queryParams map[string]string, body interface{}, signer *VmosAPISigner) {
	baseURL := "https://api.vmoscloud.com"

	// Build URL
	fullURL := baseURL + path
	if method == http.MethodGet && len(queryParams) > 0 {
		values := url.Values{}
		for k, v := range queryParams {
			values.Add(k, v)
		}
		fullURL += "?" + values.Encode()
	}

	// Prepare body
	var bodyReader io.Reader
	if method == http.MethodPost && body != nil {
		bodyBytes, _ := json.Marshal(body)
		bodyReader = bytes.NewReader(bodyBytes)
	}

	// Sign
	headers := signer.SignRequest(method, path, queryParams, body)

	// Create request
	req, err := http.NewRequest(method, fullURL, bodyReader)
	if err != nil {
		fmt.Println("Failed to create request:", err)
		return
	}

	for k, v := range headers {
		req.Header[k] = []string{v}
	}

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("Request failed:", err)
		return
	}
	defer resp.Body.Close()

	respBody, _ := io.ReadAll(resp.Body)
	fmt.Printf("[%s] %s\n", method, string(respBody))
}

func main() {
	signer := NewVmosAPISigner(
		"", // Access Key ID
		"",         // Secret Access Key
	)

	// Example GET request
	getParams := map[string]string{
		"page": "1",
		"rows": "10",
	}
	sendRequest("GET", "/vcpcloud/api/padApi/getProxys", getParams, nil, signer)

	// Example POST request
	postBody := map[string]string{
		"padCode": "AC32010790572",
	}
	sendRequest("POST", "/vcpcloud/api/padApi/userPadList", nil, postBody, signer)
}

Signature生成工具类示例(php)

<?php

class VmosAPISigner
{
  private $accessKeyId;
  private $secretAccessKey;
  private $contentType = "application/json;charset=UTF-8";
  private $host = "api.vmoscloud.com";
  private $service = "armcloud-paas";
  private $algorithm = "HMAC-SHA256";

  // Constructor for VmosAPISigner
  public function __construct($accessKeyId, $secretAccessKey)
  {
    $this->accessKeyId = $accessKeyId;
    $this->secretAccessKey = $secretAccessKey;
  }

  // Generate authentication headers for API requests
  public function signRequest($method, $path, $queryParams = [], $body = null)
  {
    $params = "";
    if (strtoupper($method) === "POST" && $body !== null) {
      $params = is_string($body) ? $body : json_encode($body, JSON_UNESCAPED_UNICODE);
    } elseif (strtoupper($method) === "GET" && !empty($queryParams)) {
      $params = http_build_query($queryParams);
    }

    $xDate = gmdate("Ymd\THis\Z");
    $shortXDate = substr($xDate, 0, 8);
    $credentialScope = "$shortXDate/{$this->service}/request";

    $xContentSha256 = hash("sha256", $params);

    $canonicalString = implode("\n", [
      "host:{$this->host}",
      "x-date:$xDate",
      "content-type:{$this->contentType}",
      "signedHeaders:content-type;host;x-content-sha256;x-date",
      "x-content-sha256:$xContentSha256"
    ]);

    $hashedCanonicalString = hash("sha256", $canonicalString);

    $stringToSign = implode("\n", [
      $this->algorithm,
      $xDate,
      $credentialScope,
      $hashedCanonicalString
    ]);

    $kDate = hash_hmac("sha256", $shortXDate, $this->secretAccessKey, true);
    $kService = hash_hmac("sha256", $this->service, $kDate, true);
    $signKey = hash_hmac("sha256", "request", $kService, true);

    $signature = hash_hmac("sha256", $stringToSign, $signKey);

    $authorization = implode(", ", [
      "{$this->algorithm} Credential={$this->accessKeyId}/$credentialScope",
      "SignedHeaders=content-type;host;x-content-sha256;x-date",
      "Signature=$signature"
    ]);

    return [
      "x-date: $xDate",
      "x-host: {$this->host}",
      "authorization: $authorization",
      "content-type: {$this->contentType}"
    ];
  }
}

接口调用demo示例(php)

<?php

class VmosAPISigner
{
  private $accessKeyId;
  private $secretAccessKey;
  private $contentType = "application/json;charset=UTF-8";
  private $host = "api.vmoscloud.com";
  private $service = "armcloud-paas";
  private $algorithm = "HMAC-SHA256";

  // Constructor for VmosAPISigner
  public function __construct($accessKeyId, $secretAccessKey)
  {
    $this->accessKeyId = $accessKeyId;
    $this->secretAccessKey = $secretAccessKey;
  }

  // Generate authentication headers for API requests
  public function signRequest($method, $path, $queryParams = [], $body = null)
  {
    $params = "";
    if (strtoupper($method) === "POST" && $body !== null) {
      $params = is_string($body) ? $body : json_encode($body, JSON_UNESCAPED_UNICODE);
    } elseif (strtoupper($method) === "GET" && !empty($queryParams)) {
      $params = http_build_query($queryParams);
    }

    $xDate = gmdate("Ymd\THis\Z");
    $shortXDate = substr($xDate, 0, 8);
    $credentialScope = "$shortXDate/{$this->service}/request";

    $xContentSha256 = hash("sha256", $params);

    $canonicalString = implode("\n", [
      "host:{$this->host}",
      "x-date:$xDate",
      "content-type:{$this->contentType}",
      "signedHeaders:content-type;host;x-content-sha256;x-date",
      "x-content-sha256:$xContentSha256"
    ]);

    $hashedCanonicalString = hash("sha256", $canonicalString);

    $stringToSign = implode("\n", [
      $this->algorithm,
      $xDate,
      $credentialScope,
      $hashedCanonicalString
    ]);

    $kDate = hash_hmac("sha256", $shortXDate, $this->secretAccessKey, true);
    $kService = hash_hmac("sha256", $this->service, $kDate, true);
    $signKey = hash_hmac("sha256", "request", $kService, true);

    $signature = hash_hmac("sha256", $stringToSign, $signKey);

    $authorization = implode(", ", [
      "{$this->algorithm} Credential={$this->accessKeyId}/$credentialScope",
      "SignedHeaders=content-type;host;x-content-sha256;x-date",
      "Signature=$signature"
    ]);

    return [
      "x-date: $xDate",
      "x-host: {$this->host}",
      "authorization: $authorization",
      "content-type: {$this->contentType}"
    ];
  }
}

function makeSignedRequest()
{
  $signer = new VmosAPISigner(
    "",  // Access Key ID
    ""  // Secret Access Key
  );

  $baseURL = "https://api.vmoscloud.com";

  // Example GET request
  $getPath = "/vcpcloud/api/padApi/getProxys";
  $getParams = ["page" => 1, "rows" => 10];
  $getHeaders = $signer->signRequest("GET", $getPath, $getParams);

  $getUrl = $baseURL . $getPath . '?' . http_build_query($getParams);
  $getCurl = curl_init($getUrl);
  curl_setopt($getCurl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($getCurl, CURLOPT_HTTPHEADER, $getHeaders);
  curl_setopt($getCurl, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($getCurl, CURLOPT_SSL_VERIFYHOST, false);

  $getResponse = curl_exec($getCurl);
  curl_close($getCurl);
  echo "GET Response:\n" . $getResponse . "\n";

  // Example POST request
  $postPath = "/vcpcloud/api/padApi/userPadList";
  $postData = ["padCode" => "AC32010790572"];
  $postHeaders = $signer->signRequest("POST", $postPath, [], $postData);

  $postCurl = curl_init($baseURL . $postPath);
  curl_setopt($postCurl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($postCurl, CURLOPT_POST, true);
  curl_setopt($postCurl, CURLOPT_HTTPHEADER, $postHeaders);
  curl_setopt($postCurl, CURLOPT_POSTFIELDS, json_encode($postData, JSON_UNESCAPED_UNICODE));
  curl_setopt($postCurl, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($postCurl, CURLOPT_SSL_VERIFYHOST, false);

  $postResponse = curl_exec($postCurl);
  if (curl_errno($postCurl)) {
    echo "cURL Error: \n" . curl_error($postCurl) . "\n";
  } else {
    $httpCode = curl_getinfo($postCurl, CURLINFO_HTTP_CODE);
    echo "POST Response HTTP Status: $httpCode\n";
    echo "POST Response:\n$postResponse\n";
  }
  curl_close($postCurl);
}

// Execute the signature request
makeSignedRequest();

Signature生成工具类示例(.net)

using System;
using System.Net.Http;
using System.Text;
using System.Security.Cryptography;
using System.Text.Json;
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using System.Security.Cryptography;

public class VmosAPISigner
{
    private readonly string accessKeyId;
    private readonly string secretAccessKey;
    private readonly string contentType = "application/json;charset=utf-8";
    private readonly string host = "api.vmoscloud.com";
    private readonly string service = "armcloud-paas";
    private readonly string algorithm = "HMAC-SHA256";

    public VmosAPISigner(string accessKeyId, string secretAccessKey)
    {
        this.accessKeyId = accessKeyId;
        this.secretAccessKey = secretAccessKey;
    }

    public Dictionary<string, string> SignRequest(string method, string path, Dictionary<string, string>? queryParams = null, object? body = null)
    {
        string paramsString = "";

        if (method == "POST" && body != null)
        {
            paramsString = JsonSerializer.Serialize(body);
        }
        else if (method == "GET" && queryParams != null)
        {
            var query = new FormUrlEncodedContent(queryParams).ReadAsStringAsync().Result;
            paramsString = query;
        }

        var utcNow = DateTime.UtcNow;
        var xDate = utcNow.ToString("yyyyMMdd'T'HHmmss'Z'");
        var shortXDate = utcNow.ToString("yyyyMMdd");
        var credentialScope = $"{shortXDate}/{service}/request";

        // Hash body or params
        var payloadHash = SHA256Hex(paramsString);

        // Canonical string
        var canonicalString = string.Join("\n", new[]
                                      {
                                          $"host:{host}",
                                          $"x-date:{xDate}",
                                          $"content-type:{contentType}",
                                          $"signedHeaders:content-type;host;x-content-sha256;x-date",
                                          $"x-content-sha256:{payloadHash}"
                                          });

        // Create string to sign
        var stringToSign = string.Join("\n", new[]
                                   {
                                       algorithm,
                                       xDate,
                                       credentialScope,
                                       SHA256Hex(canonicalString)
                                       });


        // Derive signing key
        var kDate = HmacSHA256(shortXDate, secretAccessKey);

        var kService = HmacSHA256(service, kDate);

        var signKey = HmacSHA256("request", kService);

        var signature = ByteArrayToHex(HmacSHA256(stringToSign, signKey));

        var authorization = string.Join(", ", new[]
                                    {
                                        $"{algorithm} Credential={accessKeyId}/{credentialScope}",
                                        "SignedHeaders=content-type;host;x-content-sha256;x-date",
                                        $"Signature={signature}"
                                        });

        return new Dictionary<string, string>
        {
            { "x-date", xDate },
            { "x-host", host },
            { "authorization", authorization },
            { "content-type", contentType }
        };
    }

    private static string SHA256Hex(string data)
    {
        using var sha256 = SHA256.Create();
        byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(data));
        return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
    }

    private static byte[] HmacSHA256(string data, string key)
    {
        return HmacSHA256(data, Encoding.UTF8.GetBytes(key));
    }

  private static byte[] HmacSHA256(string data, byte[] key)
  {
    using var hmac = new HMACSHA256(key);
    return hmac.ComputeHash(Encoding.UTF8.GetBytes(data));
  }

  private static string ByteArrayToHex(byte[] bytes)
  {
    return BitConverter.ToString(bytes).Replace("-", "").ToLowerInvariant();
  }
}

接口调用demo示例(.net)

Signer.cs

using System;
using System.Net.Http;
using System.Text;
using System.Security.Cryptography;
using System.Text.Json;
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using System.Security.Cryptography;

public class VmosAPISigner
{
    private readonly string accessKeyId;
    private readonly string secretAccessKey;
    private readonly string contentType = "application/json;charset=utf-8";
    private readonly string host = "api.vmoscloud.com";
    private readonly string service = "armcloud-paas";
    private readonly string algorithm = "HMAC-SHA256";

    public VmosAPISigner(string accessKeyId, string secretAccessKey)
    {
        this.accessKeyId = accessKeyId;
        this.secretAccessKey = secretAccessKey;
    }

    public Dictionary<string, string> SignRequest(string method, string path, Dictionary<string, string>? queryParams = null, object? body = null)
    {
        string paramsString = "";

        if (method == "POST" && body != null)
        {
            paramsString = JsonSerializer.Serialize(body);
        }
        else if (method == "GET" && queryParams != null)
        {
            var query = new FormUrlEncodedContent(queryParams).ReadAsStringAsync().Result;
            paramsString = query;
        }

        var utcNow = DateTime.UtcNow;
        var xDate = utcNow.ToString("yyyyMMdd'T'HHmmss'Z'");
        var shortXDate = utcNow.ToString("yyyyMMdd");
        var credentialScope = $"{shortXDate}/{service}/request";

        // Hash body or params
        var payloadHash = SHA256Hex(paramsString);

        // Canonical string
        var canonicalString = string.Join("\n", new[]
                                      {
                                          $"host:{host}",
                                          $"x-date:{xDate}",
                                          $"content-type:{contentType}",
                                          $"signedHeaders:content-type;host;x-content-sha256;x-date",
                                          $"x-content-sha256:{payloadHash}"
                                          });

        // Create string to sign
        var stringToSign = string.Join("\n", new[]
                                   {
                                       algorithm,
                                       xDate,
                                       credentialScope,
                                       SHA256Hex(canonicalString)
                                       });


        // Derive signing key
        var kDate = HmacSHA256(shortXDate, secretAccessKey);

        var kService = HmacSHA256(service, kDate);

        var signKey = HmacSHA256("request", kService);

        var signature = ByteArrayToHex(HmacSHA256(stringToSign, signKey));

        var authorization = string.Join(", ", new[]
                                    {
                                        $"{algorithm} Credential={accessKeyId}/{credentialScope}",
                                        "SignedHeaders=content-type;host;x-content-sha256;x-date",
                                        $"Signature={signature}"
                                        });

        return new Dictionary<string, string>
        {
            { "x-date", xDate },
            { "x-host", host },
            { "authorization", authorization },
            { "content-type", contentType }
        };
    }

    private static string SHA256Hex(string data)
    {
        using var sha256 = SHA256.Create();
        byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(data));
        return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
    }

    private static byte[] HmacSHA256(string data, string key)
    {
        return HmacSHA256(data, Encoding.UTF8.GetBytes(key));
    }

  private static byte[] HmacSHA256(string data, byte[] key)
  {
    using var hmac = new HMACSHA256(key);
    return hmac.ComputeHash(Encoding.UTF8.GetBytes(data));
  }

  private static string ByteArrayToHex(byte[] bytes)
  {
    return BitConverter.ToString(bytes).Replace("-", "").ToLowerInvariant();
  }
}

Request.cs

using System.Net.Http;
using System.Threading.Tasks;
using System.Text;
using System.Text.Json;
using System.Net.Http.Headers;

class Program
{
  static async Task Main()
  {
    var signer = new VmosAPISigner(
        "", // Access Key ID
        "" // Secret Access Key
    );

    using var client = new HttpClient { BaseAddress = new Uri("https://api.vmoscloud.com") };

    // Example GET request
    var getPath = "/vcpcloud/api/padApi/getProxys";
    var getParams = new Dictionary<string, string>
    {
        { "page", "1" },
        { "rows", "10" }
    };
    var getHeaders = signer.SignRequest("GET", getPath, getParams);
    var getQuery = new FormUrlEncodedContent(getParams).ReadAsStringAsync().Result;
    var getRequest = new HttpRequestMessage(HttpMethod.Get, $"{getPath}?{getQuery}");
    foreach (var h in getHeaders)
    {
      getRequest.Headers.TryAddWithoutValidation(h.Key, h.Value);
    }
    var getHttpContent = new StringContent("", Encoding.UTF8, "application/json");
    getRequest.Content = getHttpContent;
    var getResponse = await client.SendAsync(getRequest);
    Console.WriteLine("GET Response: " + await getResponse.Content.ReadAsStringAsync() + "\n");

    // Example POST request
    var postPath = "/vcpcloud/api/padApi/userPadList";
    var postBody = new { padCode = "AC32010790572" };
    var postHeaders = signer.SignRequest("POST", postPath, null, postBody);
    var postRequest = new HttpRequestMessage(HttpMethod.Post, postPath);
    foreach (var h in postHeaders) postRequest.Headers.TryAddWithoutValidation(h.Key, h.Value);
    postRequest.Content = new StringContent(JsonSerializer.Serialize(postBody), Encoding.UTF8, "application/json");
    var postResponse = await client.SendAsync(postRequest);
    Console.WriteLine("POST Response: " + await postResponse.Content.ReadAsStringAsync() + "\n");
  }
}

数据加解密示例

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/openOnlineAdb开启关闭ADB根据实例编号打开或关闭实例adb
/vcpcloud/api/padApi/adb获取ADB连接信息根据实例编号获取adb连接信息 响应数据(key,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/setKeepAliveApp设置保活应用接口设置保活应用接口
/vcpcloud/api/padApi/addUserRom上传用户镜像上传用户镜像

资源管理

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

应用管理

接口接口名接口说明
/vcpcloud/api/padApi/uninstallApp应用卸载应用卸载
/vcpcloud/api/padApi/startApp应用启动应用启动
/vcpcloud/api/padApi/stopApp应用停止应用停止
/vcpcloud/api/padApi/restartApp应用重启应用重启
/vcpcloud/api/padApi/listInstalledApp实例安装应用列表查询实例安装应用列表查询
/vcpcloud/api/padApi/uploadFileV3文件通过链接直接上传接口文件通过链接直接上传接口
/vcpcloud/api/padApi/getListInstalledApp获取指定云机列表中所有安装的应用信息获取指定云机列表中所有安装的应用信息
/vcpcloud/api/padApi/uploadFile上传文件到云空间上传文件到云空间
/vcpcloud/api/padApi/deleteOssFiles删除云空间文件删除云空间文件
/vcpcloud/api/padApi/selectFiles查询用户的文件列表查询用户的文件列表

任务管理

接口接口名接口说明
/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模板
/vcpcloud/api/padApi/createMoneyProOrder设备预售购买设备预售购买
/vcpcloud/api/padApi/queryProOrderList查询预售订单结果详情查询预售订单结果详情
/vcpcloud/api/padApi/imageVersionList安卓镜像版本集合安卓镜像版本集合
/vcpcloud/api/padApi/simulateTouch云机模拟触控云机模拟触控
/vcpcloud/api/padApi/createByTimingOrder创建计时设备订单创建计时设备订单
/vcpcloud//api/padApi/timingPadOn计时设备开机计时设备开机
/vcpcloud//api/padApi/timingPadOff计时设备关机计时设备关机
/vcpcloud//api/padApi/timingPadDel计时设备销毁计时设备销毁
/vcpcloud//api/padApi/vcTimingBackupList存储资源包列表存储资源包列表
/vcpcloud//api/padApi/getRenewStorageInfo云空间存储剩余容量云空间存储剩余容量
/vcpcloud//api/padApi/getVcStorageGoods云空间商品列表云空间商品列表
/vcpcloud//api/padApi/buyStorageGoods购买云空间扩容购买云空间扩容
/vcpcloud/api/padApi/selectAutoRenew云空间续费详情查询云空间续费详情查询
/vcpcloud/api/padApi/renewsStorageGoods聚合续费云空间商品聚合续费云空间商品
/vcpcloud/api/padApi/updateRenewStorageStatus云空间自动续费聚合商品开关云空间自动续费聚合商品开关
/vcpcloud/api/padApi/deleteUploadFiles删除备份资源包数据删除备份资源包数据
/vcpcloud/api/padApi/toggleProcessHide显示或隐藏应用进程显示或隐藏应用进程
/vcpcloud/api/padApi/addPhoneRecord导入通话记录导入通话记录
/vcpcloud/api/padApi/inputText指定输入框文本输入指定输入框文本输入

邮箱接码服务

接口接口名接口说明
/vcpcloud/api/padApi/getEmailServiceList获取邮箱服务列表获取邮箱服务列表
/vcpcloud/api/padApi/getEmailTypeList获取邮箱类型及剩余库存获取邮箱类型及剩余库存
/vcpcloud/api/padApi/createEmailOrder创建购买邮箱订单创建购买邮箱订单
/vcpcloud/api/padApi/getEmailOrder查询购买的邮箱列表查询购买的邮箱列表
/vcpcloud/api/padApi/getEmailOrder刷新获取邮箱验证码刷新获取邮箱验证码

动态代理服务

接口接口名接口说明
/vcpcloud/api/padApi/getDynamicGoodService查询动态代理商品列表查询动态代理商品列表
/vcpcloud/api/padApi/getDynamicProxyRegion查询动态代理地区列表查询动态代理地区列表
/vcpcloud/api/padApi/queryCurrentTrafficBalance获取动态代理当前余量获取动态代理当前余量
/vcpcloud/api/padApi/getDynamicProxyHost查询支持的服务器地区查询支持的服务器地区
/vcpcloud/api/padApi/buyDynamicProxy购买动态代理流量包购买动态代理流量包
/vcpcloud/api/padApi/createProxy创建动态代理创建动态代理
/vcpcloud/api/padApi/getProxys查询动态代理列表(支持分页)查询动态代理列表(支持分页)
/vcpcloud/api/padApi/getDynamicProxyOrders查询动态代理订单列表(支持分页)查询动态代理订单列表(支持分页)
/vcpcloud/api/padApi/batchPadConfigProxy云机配置动态代理云机配置动态代理
/vcpcloud/api/padApi/getDynamicProxyAutomaticRenewal查询动态代理自动续费信息查询动态代理自动续费信息
/vcpcloud/api/padApi/setAutoRenewSwitch设置动态代理自动续费开关设置动态代理自动续费开关
/vcpcloud/api/padApi/delProxyByIds删除动态代理删除动态代理

静态住宅代理服务

接口接口名接口说明
/vcpcloud/api/padApi/proxyGoodList获取静态住宅商品列表获取静态住宅商品列表
/vcpcloud/api/padApi/getProxyRegion获取静态住宅商品支持的国家城市信息获取静态住宅商品支持的国家城市信息
/vcpcloud/api/padApi/createProxyOrder静态住宅商品购买静态住宅商品购买
/vcpcloud/api/padApi/selectProxyOrderList静态住宅代理订单明细静态住宅代理订单明细
/vcpcloud/api/padApi/createRenewProxyOrder静态住宅代理续费静态住宅代理续费
/vcpcloud/api/padApi/queryProxyList查询静态住宅代理列表查询静态住宅代理列表

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
            }
        ]
}

实例重启

对指定实例执行重启操作,以解决系统无响应、卡顿等问题。新增支持重启后更换设备网络 IP 的功能。

接口地址

/vcpcloud/api/padApi/restart

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC21020010001String是实例编号
groupIdsInteger[]否
├─1Integer否实例组ID
changeIpFlagfalseBoolean否是否需要更换网络IP true-是 false-否 默认-false

响应参数

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

请求示例

{
	"padCodes": [
		"AC22030022693"
	],
    "changeIpFlag": false,
	"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/openOnlineAdb

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是实例列表(传入实例数量1-200个)
├─padCodeAC32010140011String是实例编号
openStatus1Integer是开启关闭ADB状态(1开启 0或者不传默认关闭)

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─taskId16147Integer任务id
├─padCodeAC32010250032String实例编号
├─taskStatus3Integer任务状态(-1全失败,-2部分失败,-3取消,-4超时,-5异常,1,等待执行,2执行中,3完成)
├─taskResultsuccessString任务结果

请求示例

{
    "padCodes":[
        "AC32010250032"
    ],
    "openStatus": 1
}

响应示例

{
    "code": 200,
        "msg": "success",
        "ts": 1736920929306,
        "data": [
        {
            "taskId": 16147,
            "padCode": "AC32010250032",
            "taskStatus": 3,
            "taskResult": "success"
        }
    ]
}

获取ADB连接信息

根据实例编号获取adb连接信息 响应数据(key,adb)不全情况时,请调用开启关闭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否手机号
├─emailtom@gmail.comString否邮箱

响应参数

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

请求示例

{
  "fileUniqueId": "cfca25a2c62b00e065b417491b0cf07ffc",
  "info": [{
    "firstName": "tom",
    "phone": "13111111111",
    "email": "tom@gmail.com"
  }],
  "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
}

设备任务执行结果查询

使用任务编号查询任务的执行结果(智能IP使用)

接口地址

/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
}

获取指定云机列表中所有安装的应用信息

接口地址

/vcpcloud/api/padApi/getListInstalledApp

请求方式

POST

请求数据类型

application/json

请求Body参数

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

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1721739857317Long时间戳
dataObject[]
├─appNameVMOSCloudStringAPP名称
├─packageNamecom.geniuscloud.overseasStringAPP包名

请求示例

{
    "padCodeList": ["AC32010601132"]
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "appName": "VMOSCloud",
            "packageName": "com.geniuscloud.overseas"
        },
        {
            "appName": "快手极速版",
            "packageName": "com.kuaishou.nebula"
        }
    ],
    "ts": 1746694111364
}

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

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

接口地址

/vcpcloud/api/padApi/uploadFileV3

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─padCodeAC32010250011String否实例编号
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/addUserRom

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
nameCloudROM-13String是ROM名称
updateLog更新String是更新日志
androidVersion13String是安卓版本
versionv1.0.0String是版本
downloadUrlhttps://file.vmoscloud.com/userFile/userRom/d281d848eff49adee2dda2475235b80b2.tarString是地址
packageSize236978175String是大小(单位:Byte)

响应参数

字段名示例值类型说明
code200Integer状态码
msgsuccessString响应消息
ts1736326542985Long时间戳
dataimg-2505287582886572String镜像id

请求示例

{
    "name": "CloudROM-13-11",
    "updateLog": "更新日志",
    "androidVersion": "13",
    "version": "v1.0.0",
    "downloadUrl": "https://file.vmoscloud.com/userFile/userRom/d281d848eff49adee2dda2475235b80b2.tar", 
    "packageSize": 236978175,
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": "img-2505287582886572",
    "ts": 1748425758327
}

用户镜像分页

接口地址

/vcpcloud/api/padApi/userRomPage

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
nameCloudROM-13String否ROM名称
androidVersion13String否更新日志
current1int是当前页
size10int是分页大小

响应参数

字段名示例值类型说明
code200Integer状态码
msgsuccessString响应消息
ts1736326542985Long时间戳
dataObject
├─recordsObject[]镜像列表
├─├─id1int记录id
├─├─nameCloudROM-13-01String镜像名称
├─├─androidVersion13String安卓版本
├─├─downloadUrl13String地址
├─├─imageId13String镜像id
├─├─packageSize236978175int大小(单位:Byte)
├─├─versionv1.0.0String版本
├─├─imageFailedRemarkString原因
├─total1int总数
├─size10int每页大小
├─current1int当前页
├─pages1int总页数

请求示例

{
    "name": "cloud", 
    "androidVersion": 13,  
    "current": 1,
    "size": 10 
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "records": [
            {
                "id": 27,
                "name": "CloudROM-13-01",
                "androidVersion": "13",
                "downloadUrl": "https://file.vmoscloud.com/userFile/userRom/d281d848eff49adee2dda2475235b80b2.tar",
                "imageId": "img-2505287929452799",
                "packageSize": 236978175,
                "updateLog": "更新",
                "version": "v1.0.0",
                "imageFailedRemark": "下载文件失败: https://file.vmoscloud.com/userFile/userRom/d281d848eff49adee2dda2475235b80b2.tar",
            }
        ],
        "total": 2,
        "size": 10,
        "current": 1,
        "pages": 1
    },
    "ts": 1748428965816
}

资源管理相关接口

实例列表信息

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

接口地址

/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/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/uninstallApp

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
apkPackageListString[]是包名集合
├─com.geniuscloud.overseasString是应用包名
padCodeListString[]是
├─AC22010020062String是实例编号

响应参数

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

请求示例

{
    "padCodeList": ["AC32010601132"],
    "apkPackageList": ["com.geniuscloud.overseas"]
}

响应示例

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

查询用户的文件列表

接口地址

/vcpcloud/api/padApi/selectFiles

请求方式

POST

请求数据类型

application/json

请求Body参数

无

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject[]返回体
├─appName快手极速版String文件名称
├─downloadUrlhttps://file.vmoscloud.com/userFile/fd31c45b5a7c3e6249c7d1b1dca6ff77.apkString文件下载链接
├─packageNamecom.kuaishou.nebulaStringAPK包名,只有ap文件才有
├─fileId479472Integet云空间文件编号

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "appName": "快手极速版",
            "downloadUrl": "https://file.vmoscloud.com/userFile/fd31c45b5a7c3e6249c7d1b1dca6ff77.apk",
            "packageName": "com.kuaishou.nebula",
            "fileId": 479472
        }
    ],
    "ts": 1746711010676
}

删除云空间文件

接口地址

/vcpcloud/api/padApi/deleteOssFiles

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
filesInteger[]是云空间文件唯一编号集合
├─479452String是云空间文件唯一编号

响应参数

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

请求示例

{
    "files": [479452]
}

响应示例

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

上传文件到云空间

上传文件到云空间并获取下载链接

接口地址

/vcpcloud/api/padApi/uploadFile

请求方式

POST

请求数据类型

multipart/form-data

body 注意是 form 不是 json

请求 form-data 参数

参数名示例值参数类型是否必填参数描述
fileFourSeasonsPhilly.webpFile是需要上传的文件

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1756021167163Long时间戳
dataObject返回体
├─downloadUrlhttps://file.vmoscloud.com/userFile/83bb260163f78e6928c1fe5acda.webpString文件下载链接

请求示例

curl --request POST \
  --url /vcpcloud/api/padApi/uploadFile \
  --header 'accept-language: zh' \
  --header 'content-type: multipart/form-data' \
  --form 'file=@C:\FourSeasonsPhilly.webp'

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "downloadUrl": "https://file.vmoscloud.com/userFile/83bb260163f78e6928c1fe5acda.webp"
    },
    "ts": 1746704760360
}

应用停止

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

接口地址

/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/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

请求Body参数

参数名示例值参数类型是否必填参数描述
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

请求Body参数

参数名示例值参数类型是否必填参数描述
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

请求Body参数

参数名示例值参数类型是否必填参数描述
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

登陆任务请求Body参数示例

参数名示例值参数类型是否必填参数描述
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": "zzx833454@gmail.com"
            }
        }
    ]
}

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

参数名示例值参数类型是否必填参数描述
passwordzzxxxx@gmail.comString是账号
usernamezzxxxx@gmail.comString是密码

编辑资料任务参数(任务类型-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

请求Body参数

参数名示例值参数类型是否必填参数描述
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

请求Body参数

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

响应参数

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

请求示例

{
    "taskIds": [
        118
    ]
}

响应示例

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

云手机管理

新建/续费云手机

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

接口地址

/vcpcloud/api/padApi/createMoneyOrder

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
androidVersionNameAndroid13String是Android 版本:Android10、Android13、Android14
goodId1Integer是商品Id(对应 sku套餐列表的商品ID值-> goodTimes的.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/simulateTouch

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesObject[]是需要触发点击的实例编码
├─ ACP250329MMRFCCTString是设备编号
width1080Integer是触控容器宽度
height1920Integer是触控容器高度
positionsObject[]是触控坐标集合
├─ actionType1Integer是操作类型(0:按下;1:抬起;2:触摸中)
├─ x100float是点击的x坐标
├─ y100float是点击的y坐标
├─ nextPositionWaitTime100Integer是多组坐标时,触发下一组点击坐标的等待间隔时间ms毫秒值

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject[]数据列表
├─ padCodeACP250329MMRFCCTString实例编号
├─ taskId10004759Long任务id
├─ vmStatus0Integer实例在线状态(0:离线;1:在线)

请求示例

{
    "padCodes": [
        "ACP250329MMRFCCT"
    ],
    "width": 1080,
    "height": 1920,
    "positions": [
        {
            "actionType": 0,
            "x": 100,
            "y": 100,
            "nextPositionWaitTime": 20
        },
        {
            "actionType": 2,
            "x": 110,
            "y": 110,
            "nextPositionWaitTime": 22
        },
        {
            "actionType": 2,
            "x": 120,
            "y": 120,
            "nextPositionWaitTime": 23
        },
        {
            "actionType": 1,
            "x": 120,
            "y": 120
        }
    ]
}

响应示例

{
    "code": 200,
    "msg": "success",
    "ts": 1743676563784,
    "data": [
        {
            "taskId": 100059,
            "padCode": "ACP250329MMRFCCT",
            "vmStatus": 0
        },
        {
            "taskId": 100060,
            "padCode": "ACP250329MMRFCCT",
            "vmStatus": 0
        }
    ]
}

安卓镜像版本集合

获取当前设备可以升级的镜像集合

接口地址

/vcpcloud/api/padApi/imageVersionList

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodeACP250329MMRFCCTString是设备编号

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject[]数据列表
├─ nowImgIdimg-25033129396String当前设备镜像版本ID
├─ hasNewVersionfalseBoolean是否存在可以升级的镜像版本
├─ imageVersionListObject[]镜像版本列表
├─├─ imageIdimg-25033129396String镜像版本ID
├─├─ version20250401Integer镜像版本
├─├─ versionName20250401String镜像版本名称
├─├─ publishTypereleasedString发布类型:released-稳定、beta-最新
├─├─ imageIllustrateFixed the issue that the Coffee Meet Begal app cannot activate location servicesString镜像更新说明
├─├─ romSdkint14Integer安卓版本Code
├─├─ romSdkNameAndroid 14String安卓版本说明

请求示例

{
    "padCode": "ACP250329MMRFCCT"
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
    "nowImgId": "img-25033129396",
    "imageManageList": [
            {
                "imageId": "img-25040148674",
                "version": 20250401,
                "versionName": "20250401",
                "publishType": "released",
                "imageIllustrate": "Fixed the issue that the Coffee Meet Begal app cannot activate location services",
                "romSdkint": 34,
                "romSdkName": "Android 14"
            },
            {
                "imageId": "img-25033136513",
                "version": 20250331,
                "versionName": "20250331",
                "publishType": "released",
                "imageIllustrate": "Expand the tool model to add a blacklist",
                "romSdkint": 34,
                "romSdkName": "Android 14"
            },
            {
                "imageId": "img-25040129277",
                "version": 20250401,
                "versionName": "20250401",
                "publishType": "released",
                "imageIllustrate": "termux supports root",
                "romSdkint": 29,
                "romSdkName": "Android 10"
            },
            {
                "imageId": "img-25040872272",
                "version": 30000013,
                "versionName": "30000013",
                "publishType": "beta",
                "imageIllustrate": "B",
                "romSdkint": 33,
                "romSdkName": "Android 13"
            },
            {
                "imageId": "img-25032893685",
                "version": 20250328,
                "versionName": "20250328",
                "publishType": "released",
                "imageIllustrate": "1.tools add language",
                "romSdkint": 33,
                "romSdkName": "Android 13"
            }
        ],
        "hasNewVersion": false
    },
    "ts": 1744181920213
}

设备预售购买

当库存不足时,可通过该接口预订购买设备(仅适用于租期30天及以上的云手机商品)。一旦库存恢复,系统将优先处理预售订单并自动发货。订单发货后,用户将收到邮件通知,并额外获赠1天使用时长。

接口地址

/vcpcloud/api/padApi/createMoneyProOrder

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
androidVersionNameAndroid13String是Android 版本:Android10、Android13、Android14
goodId1Integer是商品Id(对应 sku套餐列表的商品ID值)
goodNum1Integer是商品数量
autoRenewtrueBoolean是是否自动续费(默认关闭)true-开启、false-关闭

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataVMOS-CLOUD174290228048631464String预售订单编号

请求示例

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

响应示例

{
	"msg": "success",
	"code": 200,
	"data": "VMOS-CLOUD174290228048631464",
	"ts": 1736306672346
}

查询预售订单结果详情

查询预售订单结果详情。可支持通过预售订单号、订单状态(1-待发货 2-已发货 为空默认全部)的方式进行查询

接口地址

/vcpcloud/api/padApi/queryProOrderList

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
proBuyStatus2Integer否1-待发货 2-已发货 为空默认全部
orderIdVMOS-CLOUD174290228048631464Integer否预售订单号

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject[]数据列表
├─ proBuyOrderIdVMOS-CLOUD174290228048631464String订单编号
├─ proBuyStatus2Integer1-待发货 2-已发货
├─ proBuyNumber1Integer购买数量
├─ createTime2025-03-25 19:31:21String创建时间
├─ payTime2025-03-25 19:31:21String支付时间
├─ endTime2025-03-25 19:41:33String发货时间
├─ orderPrice1399Integer订单金额(美分)
├─ goodNameSamsung Galaxy A53String设备名称
ts1736306672346Long时间戳

请求示例

{
    "proBuyStatus": "2",
    "orderId": "VMOS-CLOUD174290228048631464"
}

响应示例

{
    "msg": "success",
        "code": 200,
        "data": [
        {
            "proBuyOrderId": "VMOS-CLOUD174290228048631464",
            "proBuyStatus": 2,
            "proBuyNumber": 1,
            "createTime": "2025-03-25 19:31:21",
            "payTime": "2025-03-25 19:31:21",
            "endTime": "2025-03-25 19:41:33",
            "orderPrice": 499,
            "goodName": "V08"
        },
        {
            "proBuyOrderId": "VMOS-CLOUD174323615535421664",
            "proBuyStatus": 2,
            "proBuyNumber": 1,
            "createTime": "2025-03-29 16:16:22",
            "payTime": "2025-03-29 16:16:22",
            "endTime": "2025-03-29 16:18:03",
            "orderPrice": 1399,
            "goodName": "Samsung Galaxy A53"
        }
    ],
        "ts": 1743239203460
}

云手机列表

云手机列表。

接口地址

/vcpcloud/api/padApi/userPadList

请求方式

POST

请求数据类型

application/json

请求Body参数

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

响应参数

参数名示例值参数类型参数描述
code200Integer状态码
msgsuccessString响应消息
ts1736235894274Long时间戳
dataObject[]数据列表
├─ padCodeAC32010180421String云机编号 (ACN开头的均为计时设备)
├─ deviceIp172.30.5.43String云机物理机IP
├─ padIp10.254.21.225String云机I虚拟P
├─ cvmStatus100Integer云机状态 100-正常 101-截图中 102-重启中 103-重置中 104-异常
├─ screenshotLinkhttps://XXXXXX.pngString云机截图链接
├─ equipmentId106626Integer设备编号
├─ userId14114Integer用户ID
├─ status1Integer设备状态 1-运行中 2-关机 3-开机中
├─ 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

请求Body参数

参数名示例值参数类型是否必填参数描述
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
}

创建计时设备订单

创建计时设备订单,购买计时设备

接口地址

/vcpcloud/api/padApi/createByTimingOrder

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
goodId1Integer是商品Id(对应 sku套餐列表的商品ID值-> timingGoodTimes.id
goodNum1Integer是商品数量

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataString[]购买的计时设备实例
├─ padCodeACN250424VU2F6LBString实例编号

请求示例

{
    "goodId": 1,
    "goodNum": 1
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        "ACN250424VU2F6LB"
    ],
    "ts": 1745562924759
}

计时设备开机

计时设备开机, 支持开机为新机、按照指定备份资源包进行开机

接口地址

/vcpcloud/api/padApi/timingPadOn

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是实例编号集合
├─ padCodeACN250424VU2F6LBString是实例编号
defCode1Integer否是否开机为新机 0-否 1-是 默认为0 优先级高
netStorageResUnitCodeZSC250423CVEY7CP-ACN2504235BZK2XWString否指定开机的备份资源包ID 优先级低

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
datafalseBoolean当天是否存在扣费满1美金的设备,如果存在,该设备将不再扣费

请求示例

{
    "padCodes": [
        "ACN250424VU2F6LB"
    ],
    "defCode": 0,
    "netStorageResUnitCode": "ZSC250423CVEY7CP-ACN2504235BZK2XW"
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": false,
    "ts": 1745568308881
}

计时设备关机

计时设备关机,支持备份当前实例,备份包支持自定义备注名称

接口地址

/vcpcloud/api/padApi/timingPadOff

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是实例编号集合
├─ padCodeACN250424VU2F6LBString是实例编号
isBackUp1Integer否是否备份 0-否 1-是 默认备份
remark备份包说明String否给当前需要备份的资源包添加说明

响应参数

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

请求示例

{
    "padCodes": [
        "ACN250424VU2F6LB"
    ],
    "isBackUp": 1,
    "remark": "备份包说明"
}

响应示例

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

计时设备销毁

计时设备销毁,计时设备销毁并不会删除备份的资源包

接口地址

/vcpcloud/api/padApi/timingPadDel

请求方式

POST

请求数据类型

application/json

请求Body参数

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

响应参数

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

请求示例

{
    "padCodes": [
        "ACN250424VU2F6LB"
    ]
}

响应示例

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

购买云空间扩容

购买云空间扩容

接口地址

/vcpcloud/api/padApi/buyStorageGoods

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
storageId1Integer是云空间扩容商品唯一ID
autoRenewOrder0Integer是是否自动续费 0-否 1-是

响应参数

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

请求示例

{
    "storageId": 1,
    "autoRenewOrder": 0
}

响应示例

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

存储资源包列表

关机备份后的存储资源包列表

接口地址

/vcpcloud/api/padApi/vcTimingBackupList

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject[]资源包集合信息
├─ backupIdZSC250425LIOJY2V-ACN250424VU2F6LBString备份资源包编号
├─ padCodeACN250424VU2F6LBString备份包所属设备
├─ beginTime2025-04-25 16:28:48String备份时间
├─ remarkTime:20250425162833String备份说明 ,备份时有传入remar就会使用自定义的,否则默认就是备份时间
├─ padNameV06String自定义的设备名称,用来快速区分和查找资源包

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "backupId": "ZSC250425LIOJY2V-ACN250424VU2F6LB",
            "padCode": "ACN250424VU2F6LB",
            "beginTime": "2025-04-25 16:28:48",
            "remark": "Time:20250425162833",
            "padName": "V06"
        }
    ],
    "ts": 1745570858994
}

云空间商品列表

云空间商品列表

接口地址

/vcpcloud/api/padApi/getVcStorageGoods

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject[]资源包集合信息
├─ oldPrice169Long商品原价
├─ payPrice169Long折扣后售卖价格
├─ subscriptTips85折String折扣说明
├─ useTime43200Long有效分钟数
├─ storageCapacity107374182400Long对应云空间大小
├─ storageId1Integer云空间商品唯一ID
├─ storageName100GB/月String云空间商品说明

响应示例

{
    "msg": "success",
        "code": 200,
        "data": [
            {
                "oldPrice": 199,
                "payPrice": 169,
                "subscriptTips": "85折",
                "useTime": 43200,
                "reorder": 1,
                "storageCapacity": 107374182400,
                "selected": true,
                "storageId": 1,
                "storageName": "100GB/月"
            }
        ],
        "ts": 1745572789763
}

聚合续费云空间商品

聚合续费云空间商品

接口地址

/vcpcloud/api/padApi/renewsStorageGoods

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
autoRenewOrder0Integer是是否自动续费 0-否 1-是

响应参数

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

请求示例

{
    "autoRenewOrder": 0
}

响应示例

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

删除备份资源包数据

删除备份资源包数据

接口地址

/vcpcloud/api/padApi/deleteUploadFiles

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型是否必填参数描述
String[]是要删除的资源包ID集合
├─ZSC250425LIOJY2V-ACN250424VU2F6LBString是要删除的资源包ID

响应参数

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

请求示例

[
    "ZSC250425LIOJY2V-ACN250424VU2F6LB"
]

响应示例

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

云空间自动续费聚合商品开关

云空间自动续费聚合商品开关

接口地址

/vcpcloud/api/padApi/updateRenewStorageStatus

请求方式

GET

请求数据类型

application/json

请求Query参数

参数名示例值参数类型是否必填参数描述
renewStorageStatusfalseString是是否自动续费 false-否 true-是

响应参数

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

请求示例

/vcpcloud/api/padApi/updateRenewStorageStatus?renewStorageStatus=false

响应示例

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

云空间续费详情查询

云空间续费详情查询

接口地址

/vcpcloud/api/padApi/selectAutoRenew

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject[]续费信息
├─ renewStorageStatus0Integer是否开启自动续费 0-否 1-是
├─ storageSize214748364800Long续费云空间的总大小
├─ storageAmount338Long续费所需金额(美分)
├─ signExpirationTime2025-05-10 19:22:35String有效时间

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "renewStorageStatus": 0,
        "storageSize": 214748364800,
        "storageAmount": 338,
        "signExpirationTime": "2025-05-10 19:22:35"
    },
    "ts": 1745573906608
}

云空间存储剩余容量

云空间存储剩余容量

接口地址

/vcpcloud/api/padApi/getRenewStorageInfo

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject资源包集合信息
├─ storageCapacityLimit112742891520Long用可用空间大小 1GB = 1024 x 1024 x 1024 Byte
├─ storageUsedAvail17325201433Long已使用空间大小
├─ otherObject附件空间详情
├─├─ signExpirationTime2025-05-10 19:22:35String附加空间到期时间
├─├─ storageAmount169Long附加空间续费所需金额(美分)
├─├─ otherStorageSize107374182400Long附加空间大小

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "storageCapacityLimit": 112742891520,
        "storageUsedAvail": 17325201433,
        "other": {
            "signExpirationTime": "2025-05-10 19:22:35",
            "storageAmount": 169,
            "otherStorageSize": 107374182400
        }
    },
    "ts": 1745571643583
}

sku套餐列表

sku套餐列表。

接口地址

/vcpcloud/api/padApi/getCloudGoodList

请求方式

GET

请求数据类型

application/json

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
dataObject响应数据
├─ androidVersionNameAndroid13StringAndroid 版本名称
├─ cloudGoodsInfoObjectsku套餐信息
│ ├─ configsList商品型号信息
│ │ ├─ configNameSamsung s23 ultraString商品型号名称
│ │ ├─ sellOutFlagfalseBoolean包月设备是否售罄
│ │ ├─ timingSellOutFlagfalseBoolean计时设备是否售罄
│ │ ├─ configBlurb顶尖科技,媲美真机至尊体验!String商品型号描述
│ │ ├─ defaultSelectionfalseBoolean是否默认选中包月设备
│ │ ├─ defaultTimeSelectionfalseBoolean是否默认选中计时设备
│ │ ├─ reorder0Integer排序
│ │ ├─ goodTimesList包月商品价格卡
│ │ │ ├─ oldGoodPrice100Integer原价
│ │ │ ├─ showContent1天String商品时长名称
│ │ │ ├─ whetherFirstPurchasetrueBoolean是否为首次购买
│ │ │ ├─ reorder1Integer排序
│ │ │ ├─ goodPrice100Integer商品价格
│ │ │ ├─ equipmentNumber1Integer商品发货设备数量
│ │ │ ├─ goodTime1440Integer商品时长(分钟)
│ │ │ ├─ autoRenewtrueBoolean是否支持自动续订
│ │ │ ├─ recommendContent首购特惠String推荐内容
│ │ │ ├─ id27Integer商品 ID
│ │ ├─ timingGoodTimesList计时商品价格卡
│ │ │ ├─ oldGoodPrice100Integer原价
│ │ │ ├─ showContent1天String商品时长名称
│ │ │ ├─ whetherFirstPurchasetrueBoolean是否为首次购买
│ │ │ ├─ reorder1Integer排序
│ │ │ ├─ goodPrice100Integer商品价格
│ │ │ ├─ equipmentNumber1Integer商品发货设备数量
│ │ │ ├─ goodTime1440Integer商品时长(分钟)
│ │ │ ├─ autoRenewtrueBoolean是否支持自动续订
│ │ │ ├─ recommendContent首购特惠String推荐内容
│ │ │ ├─ id1Integer商品 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
                            }
                        ],
                        "timingGoodTimes": [
                            {
                                "oldGoodPrice": 15,
                                "goodTime": 15,
                                "defaultSelection": false,
                                "showContent": "15 minutes",
                                "whetherFirstPurchase": false,
                                "chargeType": 2,
                                "currentPrice": 9,
                                "recommendContent": "40% off",
                                "reorder": 1,
                                "id": 1,
                                "goodPrice": 9,
                                "equipmentNumber": 1
                            }
                        ]
                    }
                ],
                "goodId": 1
            }
        }
    ],
        "ts": 1737440589859
}

显示或隐藏应用进程

接口地址

/vcpcloud/api/padApi/toggleProcessHide

请求方式

POST

请求数据类型

application/json

请求BODY参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC22010020062String是实例编号
showfalseBoolean是隐藏进程: true-隐藏 false-恢复
packageNamecom.facebook.katanaString是应用包名

响应参数

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

请求示例

{
    "padCodes": [
        "AC32010601132"
    ],
    "show": false,
    "packageName": "com.facebook.katana"
}

响应示例

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

导入通话记录

此接口允许将通话记录数据导入至云手机中。接口在导入过程中,会自动检测云手机通讯录中已保存的联系人,并将这些联系人对应的名称显示在通话记录中,便于用户快速识别联系人。

接口地址

/vcpcloud/api/padApi/addPhoneRecord

请求方式

POST

请求数据类型

application/json

请求BODY参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC32010601132String是实例编号
callRecordsObject[]是
├─number13900000000String是电话号码
├─inputType1Integer是通话类型(1:拨出;2:接听;3:未接)
├─duration62Integer是通话时长;单位是秒,未接电话是0秒
├─timeString2025-05-08 12:30:00String是通话时长

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─padCodeAC32010601132String实例编号
├─taskId10004759Long任务id
├─vmStatus0String实例在线状态

请求示例

{
    "padCodes": [
        "AC32010601132"
    ],
    "callRecords": [
        {
            "number": "18009781201",
            "inputType": 1,
            "duration": 30,
            "timeString": "2025-05-06 14:00:09"
        },
        {
            "number": "18009781202",
            "inputType": 2,
            "duration": 60,
            "timeString": "2025-05-07 14:00:09"
        },
        {
            "number": "18009781203",
            "inputType": 3,
            "duration": 0
        }
    ]
}

响应示例

{
    "code": 200,
    "msg": "success",
    "ts": 1743676563784,
    "data": [
        {
            "taskId": 100059,
            "padCode": "AC32010601132",
            "vmStatus": 0
        }
    ]
}

指定输入框文本输入

在云机中预先聚焦好输入框,调用完接口后,文本信息展示在云机指定位置。需要预先在云机中定位到输入位置,否则无法生效

接口地址

/vcpcloud/api/padApi/inputText

请求方式

POST

请求数据类型

application/json

请求BODY参数

参数名示例值参数类型是否必填参数描述
padCodesString[]是
├─AC32010601132String是实例编号
textHello WorldString是输入文本

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─padCodeAC32010601132String实例编号
├─taskId10004759Long任务id

请求示例

{
    "padCodes": [
        "AC32010601132"
    ],
    "text": "Hello World"
}

响应示例

{
    "code": 200,
    "msg": "success",
    "ts": 1743676563784,
    "data": [
        {
            "taskId": 100059,
            "padCode": "AC32010601132"
        }
    ]
}

静态住宅服务

获取静态住宅商品列表

接口地址

/vcpcloud/api/padApi/proxyGoodList

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─proxyGoodName5 daysString商品名称
├─proxyGoodId1Integer商品唯一编号
├─proxyGoodPrice200Integer商品价格(美分)
├─proxyGoodType2Integer代理商品类型:0-通用 1-socket5 2-http 3-https
├─proxyGoodTime7200Integer商品时长(分钟)

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "proxyGoodName": "5 days",
            "proxyGoodId": 4,
            "proxyGoodTime": 7200,
            "proxyGoodType": 2,
            "proxyGoodPrice": 200
        }
    ],
    "ts": 1747734076860
}

获取静态住宅商品支持的国家城市信息

接口地址

/vcpcloud/api/padApi/getProxyRegion

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]
├─countrycnString支持的国家code
├─countryZhChinaString支持的国家说明
├─countryId15Integer国家唯一编号

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "country": "cn",
            "countryZh": "China",
            "countryId": 15
        },
    ],
    "ts": 1747734076860
}

静态住宅商品购买

接口地址

/vcpcloud/api/padApi/createProxyOrder

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
proxyGoodId4Integer对应静态住宅商品的唯一ID
regioncnString静态住宅的地区-country
num1Integer购买数量
countrycnString静态住宅的国家-country
proxyAddressChinaString静态住宅的地址-countryZh
autoRenewtrueBoolean开启自动续费 false-关闭 true-开启

响应参数

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

请求示例

{
    "proxyGoodId": 4,
    "region": "cn",
    "num": 1,
    "country": "cn",
    "proxyAddress": "China",
    "autoRenew": true
}

响应示例

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

静态住宅代理订单明细

接口地址

/vcpcloud/api/padApi/selectProxyOrderList

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
page1Integer第几页
rows10Integer每页展示多少条

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject
├─total1Integer条数
├─size10Integer每页展示数
├─pages1Integer总页数
├─recordsObject[]订单信息
├─├─buyNumber1String购买数量
├─├─goodNameNew Purchase5-day agency productString商品名称
├─├─createTime1747734544000Long创建时间
├─├─orderIdVMOS-CLOUD174773454378660285String订单ID
├─├─payPrice200String支付金额
├─├─orderStatusvpnString订单状态 0-待支付 1-已支付
├─├─orderPricecnString订单金额
├─├─goodPriceSichuanString商品单价
├─├─goodNumSichuanString商品数量

请求示例

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

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "current": 1,
        "total": 30,
        "pages": 3,
        "size": 10,
        "records": [
            {
                "buyNumber": 1,
                "goodName": "New Purchase5-day agency product",
                "createTime": 1747734544000,
                "orderId": "VMOS-CLOUD174773454378660285",
                "payPrice": 200,
                "orderStatus": 1,
                "orderPrice": 200,
                "goodPrice": 200,
                "goodNum": 1
            }
        ]
    },
    "ts": 1747734706973
}

静态住宅代理续费

接口地址

/vcpcloud/api/padApi/createRenewProxyOrder

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
proxyGoodId4Integer对应静态住宅商品的唯一ID
proxyIps154.81.41.161,154.81.41.162String续费的IP,多个以,分割
autoRenewtrueBoolean开启自动续费 false-关闭 true-开启

响应参数

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

请求示例

{
    "proxyGoodId": 4,
    "proxyIps": "154.81.41.161,154.81.41.162",
    "autoRenew": true
}

响应示例

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

查询静态住宅代理列表

接口地址

/vcpcloud/api/padApi/queryProxyList

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
current1Integer第几页
size10Integer每页展示多少条

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject
├─total1Integer条数
├─size10Integer每页展示数
├─pages1Integer总页数
├─recordsObject[]订单信息
├─├─proxyStatus1Integer代理状态:0-检测中 1-正常 -1检测失败 2-待检测
├─├─proxyGoodId4String商品ID
├─├─proxyName154.81.40.200Long代理名称
├─├─proxyUseNumber0String挂载云机数
├─├─proxyType1String代理类型:1-Socks5 2-http 3-https
├─├─proxyHost154.81.40.200String订单状态 0-待支付 1-已支付
├─├─proxyPort63007String代理端口(奇数-socks5 偶数-http)63007 (63008)
├─├─passwordxxxxxxString代理密码
├─├─proxyCountryCNString代理所属国家
├─├─expectedExpireTime1748166543String到期时时间戳
├─├─expireTime1748166543String到期时时间戳 (同上,使用 expireTime 即可)
├─├─accountxxxxxxString用户名
├─├─proxyId86930String代理唯一ID (挂载云机使用)

请求示例

{
    "current": 1,
    "size": 10
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "current": 1,
        "total": 30,
        "pages": 3,
        "size": 10,
        "records": [
            {
                "proxyStatus": 2,
                "proxyGoodId": 4,
                "proxyName": "154.81.40.200",
                "proxyUseNumber": 0,
                "proxyType": 1,
                "proxyHost": "154.81.40.200",
                "proxyPort": 63007,
                "password": "xxxxxx",
                "proxyCountry": "CN",
                "expireTime": 1748166543,
                "expectedExpireTime": 1748166543,
                "account": "xxxxxxx",
                "proxyId": 86930
            },
        ]
    },
    "ts": 1747734706973
}

动态代理服务

查询动态代理商品列表

接口地址

/vcpcloud/api/padApi/getDynamicGoodService

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─goodName2GBString商品名称
├─goodId1Integer商品唯一编号
├─goodPrice1String商品价格
├─protocolDescriptionGithubString支持的协议信息
├─totalTrafficObject[]流量包大小

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "goodName": "2GB",
            "goodId": 1,
            "goodPrice": 1000,
            "protocolDescription": "HTTP(S)/SOCKS5",
            "totalTraffic": 2048
        }
    ],
    "ts": 1740643153803
}

查询动态代理地区列表

接口地址

/vcpcloud/api/padApi/getDynamicProxyRegion

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─CountryName阿拉伯联合酋长国String国家名称
├─CountryCodeAEString国家Code
├─StateObject[]地区列表
├─├─cityObject[]城市列表
├─├─├─MusaffahcityString城市名称
├─├─nameAbudhabiString地区名称

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "CountryName": "阿拉伯联合酋长国",
            "CountryCode": "AE",
            "State": [
                {
                    "city": [
                        "Musaffahcity",
                        "Abudhabi"
                    ],
                    "name": "Abudhabi"
                },
            ],
        }
    ],
    "ts": 1740643153803
}

获取动态代理当前余量

接口地址

/vcpcloud/api/padApi/queryCurrentTrafficBalance

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─accumulatedTraffic2048String总流量
├─remainingTraffic1024Object[]剩余流量
├─useTraffic1024Object[]已使用流量

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "accumulatedTraffic": 2048,
        "remainingTraffic": 1024,
        "useTraffic": 1024
    },
    "ts": 1740659529379
}

查询支持的服务器地区

接口地址

/vcpcloud/api/padApi/getDynamicProxyHost

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─nameAmerica Region (South America & North America)String大洲名称
├─valuexxxxxxx:1234String大洲服务器地址

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "name": "America Region (South America & North America)",
            "value": "xxxxxxx:1234"
        }
    ],
        "ts": 1740660551742
}

购买动态代理流量包

接口地址

/vcpcloud/api/padApi/buyDynamicProxy

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
goodId1Integer对应动态流量包的唯一ID
goodNum1Integer购买数量
autoRenewOrder1Integer开启自动续费 0-关闭 1-开启 剩余流量低于50MB时,触发自动续费

响应参数

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

请求示例

{
    "goodId": 1,
    "goodNum": 1,
    "autoRenewOrder": 0
}

响应示例

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

创建动态代理

接口地址

/vcpcloud/api/padApi/createProxy

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
city""String城市 不选要传""
countryCodeAEString国家Code
goodNum1Integer购买数量
proxyHostxxxxx:7778String大洲网址
proxyTypesocks5String代理类型 socks5 / http / https
proxyUseTypeproxyString挂载方式 proxy / vpm
stateAbudhabiString地区 不选要传""
time1String自动更换ip频率 (分钟) 可选 5、10、15、30、45、60、90

响应参数

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

请求示例

{
    "proxyHost": "xxxxx:7778",
    "countryCode": "CN",
    "state": "Sichuan",
    "city": "Sichuan",
    "time": 5,
    "proxyType": "socks5",
    "proxyUseType": "vpn"
}

响应示例

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

查询动态代理列表(支持分页)

接口地址

/vcpcloud/api/padApi/getProxys

请求方式

GET

请求数据类型

application/json

请求Query参数

参数名示例值参数类型参数描述
page1Integer当前页
rows10Integer每页条数

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject状态码
├─recordsObject[]动态代理信息
├─├─id1String代理唯一编号
├─├─proxyHostxxxxxxxString大洲服务器域名
├─├─proxyPort1234String大洲服务器端口
├─├─userNameE44S5YaWP660_time_5String动态代理用户名
├─├─password1234String动态代理密码
├─├─proxyTypesocks5String动态代理协议类型
├─├─proxyUseTypevpnString动态代理挂载方式
├─├─countryCodecnString国家Code
├─├─stateSichuanString地区
├─├─citySichuanString城市
├─├─time5Integer刷新频率
├─total1Integer代理条数
├─size10Integer每页展示数
├─pages1Integer总页数

响应示例

{
    "msg": "success",
        "code": 200,
        "data": {
        "records": [
            {
                "id": 1,
                "proxyHost": "xxxxxx",
                "proxyPort": 7778,
                "userName": "E44S5YaW",
                "password": "1111",
                "proxyType": "socks5",
                "proxyUseType": "vpn",
                "countryCode": "cn",
                "state": "Sichuan",
                "city": "Sichuan",
                "time": 5
            }
        ],
        "total": 2,
        "size": 10,
        "current": 1,
        "pages": 1
    },
    "ts": 1740725704758
}

查询动态代理订单列表(支持分页)

接口地址

/vcpcloud/api/padApi/getDynamicProxyOrders

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
page1Integer当前页
rows10Integer每页条数
completeStartTime2025-02-27 23:20:36String支付开始时间
completeEndTime2025-02-28 23:20:36String支付结束时间

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject状态码
├─recordsObject[]动态代理信息
├─├─orderIdVMOS-CLOUD174066963648092563String平台唯一ID
├─├─orderPrice1000Integer订单金额分
├─├─payPrice1000Integer支付金额分
├─├─createTime2025-02-27T23:20:36.000+0800String创建时间
├─├─completeTime2025-02-27T23:20:36.000+0800String支付时间
├─├─orderStatus1Integer订单状态 0-待支付 1-已支付
├─├─goodId1Integer商品唯一ID
├─├─goodNum1Integer购买数量
├─├─goodName2GBString商品名称
├─├─goodPrice1000Integer商品单价
├─├─goodSize2048Integer商品流量包带下
├─├─sumSize2048Integer订单总流量包大小
├─├─orderOtherInfo购买 2GB 流量包,购买数量:1String订单说明
├─├─autoRenewOrder1Integer是否开启续费 1-开启 0-不开 (全局生效)
├─total1Integer代理条数
├─size10Integer每页展示数
├─pages1Integer总页数

请求示例

{
   "page": 1,
   "rows": 10,
   "completeStartTime": "2025-02-27 23:20:36",
   "completeEndTime": "2025-02-28 23:20:36"
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
    "records": [
            {
                "orderId": "VMOS-CLOUD174066963648092563",
                "orderPrice": 1000,
                "payPrice": 1000,
                "createTime": "2025-02-27T23:20:36.000+0800",
                "completeTime": "2025-02-27T23:20:36.000+0800",
                "orderStatus": 1,
                "goodId": 1,
                "goodNum": 1,
                "goodName": "2GB",
                "goodPrice": 1000,
                "goodSize": 2048,
                "sumSize": 2048,
                "orderOtherInfo": "购买 2GB 流量包,购买数量:1",
                "autoRenewOrder": 0
            }
        ],
        "total": 2,
        "size": 10,
        "current": 1,
        "pages": 1
    },
    "ts": 1740726141853
}

创建动态代理

接口地址

/vcpcloud/api/padApi/createProxy

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
city""String城市 不选要传""
countryCodeAEString国家Code
goodNum1Integer购买数量
proxyHostxxxxx:7778String大洲网址
proxyTypesocks5String代理类型 socks5 / http / https
proxyUseTypeproxyString挂载方式 proxy / vpm
stateAbudhabiString地区 不选要传""
time1String自动更换ip频率 (分钟) 可选 5、10、15、30、45、60、90

响应参数

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

请求示例

{
    "proxyHost": "xxxxx:7778",
    "countryCode": "CN",
    "state": "Sichuan",
    "city": "Sichuan",
    "time": 5,
    "proxyType": "socks5",
    "proxyUseType": "vpn"
}

响应示例

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

云机配置动态代理

接口地址

/vcpcloud/api/padApi/batchPadConfigProxy

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
padCodesString[]云机集合
├─AC32010921223String云机编号
setProxyFlagtrueBoolean是否设备代理到云机
proxyId1Integer动态代理唯一ID

响应参数

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

请求示例

{
    "padCodes": [
        "AC32010921223"
    ],
    "setProxyFlag": true,
    "proxyId": 2
}

响应示例

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

查询动态代理自动续费信息

接口地址

/vcpcloud/api/padApi/getDynamicProxyAutomaticRenewal

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─good_size2048Integer续费的流量包大小
├─auto_renew_order1Integer是否开启自动续费 0-关闭 1-开启
├─order_price199Integer自动续费需扣除的金额
├─good_nameTraffic packageString自动续费商品名称
├─good_number1Integer自动续费商品数量

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "good_size": 2048,
            "auto_renew_order": 1,
            "order_price": 199,
            "good_name": "Traffic package",
            "good_number": 1
        }
    ],
    "ts": 1745308893191
}

设置动态代理自动续费开关

接口地址

/vcpcloud/api/padApi/setAutoRenewSwitch

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
autoRenewOrder0Integer自动续费开关 0-关 1-开

响应参数

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

请求示例

{
    "autoRenewOrder": 0
}

响应示例

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

删除动态代理

接口地址

/vcpcloud/api/padApi/delProxyByIds

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
idsInteger[]要删除的动态代理ID集合
├─1Integer动态代理唯一ID

响应参数

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

请求示例

{
    "ids": [
        1
    ]
}

响应示例

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

邮箱接码服务

购买邮箱并获取相关服务的验证码

获取邮箱服务列表

接口地址

/vcpcloud/api/padApi/getEmailServiceList

请求方式

GET

请求数据类型

application/json

请求Query参数

无

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─price0.01Float价格
├─stockNum300Integer剩余库存
├─serviceId1String服务列表编号
├─serviceNameGithubString服务名称
├─itemsObject[]子服务列表
├─├─serviceItemId1Integer子服务唯一ID (购买时使用的ID)
├─├─serviceItemNameGithub RegisterString子服务名称

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "price": 0.01,
            "stockNum": 300,
            "serviceId": 1,
            "serviceName": "Github",
            "items": [
                {
                    "serviceItemId": 1,
                    "serviceItemName": "Github Register"
                }
            ]
        }
    ],
    "ts": 1745825162018
}

获取邮箱类型及剩余库存

接口地址

/vcpcloud/api/padApi/getEmailTypeList

请求方式

GET

请求数据类型

application/json

请求Query参数

参数名示例值参数类型参数描述
serviceId1Integer对应 serviceItemId 字段

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1736922808949Integer时间戳
dataObject[]状态码
├─price0.01Float价格
├─nameOutlookString类型名称
├─stockNum630Integer剩余库存
├─id1Integer邮箱类型编号

请求示例

{
    "serviceId": "1"
}

响应示例

{
    "msg": "success",
    "code": 200,
    "data": [
        {
            "price": 0.01,
            "name": "Outlook",
            "stockNum": 300,
            "id": 1
        }
    ],
    "ts": 1745823575860
}

创建购买邮箱订单

接口地址

/vcpcloud/api/padApi/getEmailTypeList

请求方式

POST

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
serviceId1Integer对应 serviceItemId 字段
emailTypeId1Integer对应 /getEmailTypeList 返回的 ID 字段
goodNum1Integer购买数量

响应参数

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

请求示例

{
    "serviceId": 1,
    "emailTypeId": 1,
    "goodNum": 1
}

响应示例

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

查询购买的邮箱列表

当通过刷新接口无法获取到验证码时,可以通过:https://api.vmoscloud.com/vcpcloud/api/padApi/code?orderId= + outOrderId(外部订单号)进行查询结果

接口地址

/vcpcloud/api/padApi/getEmailOrder

请求方式

GET

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
page1Integer必填,分页参数,当前页
size10Integer必填,分页参数,每页条数
serviceId1Integer非必填,对应 serviceItemId 字段
emailyzxovmqString非必填,邮箱模糊查询
status0Integer非必填,邮箱状态 0-未使用 1-接收中 2-已使用 3-已失效

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1745835489149Long时间戳(毫秒)
dataObject数据对象
├─ current1Integer当前页码
├─ total1Integer总记录数
├─ pages1Integer总页数
├─ size10Integer每页大小
├─ recordsObject[]数据记录列表
├─├─ id1Long主键 ID
├─├─ userId10667Long用户 ID
├─├─ emailyzxovmqi828@outlook.comString邮箱地址
├─├─ emailStatus0Integer邮箱状态(0-未使用)
├─├─ emailTypeId1Integer邮箱类型 ID
├─├─ emailTypeNameOutlookString邮箱类型名称
├─├─ emailServiceId2Integer邮箱服务商 ID
├─├─ emailServiceNameAppleString邮箱服务商名称
├─├─ emailCode767170String邮箱验证码
├─├─ useSize1Integer使用次数
├─├─ orderIdVMOS-CLOUD174583355706782096String系统订单号
├─├─ outOrderId1916791090664861697String外部订单号

请求示例

/vcpcloud/api/vcEmailService/getEmailOrder?page=1&size=10&serviceId=2&email=yzxovmq&status=0

响应示例

{
    "msg": "success",
    "code": 200,
    "data": {
        "current": 1,
        "total": 1,
        "pages": 1,
        "size": 10,
        "records": [
            {
                "emailServiceName": "Tiktok",
                "emailTypeName": "Gmail",
                "useSize": 2,
                "orderId": "VMOS-CLOUD174592947484442767",
                "updateTime": 1747135883000,
                "goodPrice": 0.03,
                "userId": 10667,
                "emailTypeId": 3,
                "emailCode": "767170",
                "emailStatus": 3,
                "createTime": 1745929475000,
                "emailServiceId": 3,
                "outOrderId": "1917193290790019073",
                "id": 468,
                "email": "jessicaadams316490@gmail.com"
            }
        ]
    },
    "ts": 1745835489149
}

刷新获取邮箱验证码

此接口是刷新验证码列表结果,需要配合【查询购买的邮箱列表】接口一起使用

接口地址

/vcpcloud/api/padApi/getEmailCode

请求方式

GET

请求数据类型

application/json

请求Body参数

参数名示例值参数类型参数描述
orderId1917193290790019073String必填,对应 outOrderId 字段

响应参数

参数名示例值参数类型参数描述
msgsuccessString响应消息
code200Integer状态码
ts1745835489149Long时间戳(毫秒)

请求示例

/vcpcloud/api/vcEmailService/getEmailCode?orderId=1917193290790019073

响应示例

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

修改真机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

请求Body参数

参数名示例值参数类型是否必填参数描述
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

请求Body参数

参数名示例值参数类型是否必填参数描述
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
}

用户镜像上传回调

使用场景

用户镜像上传,结果通过该回调接口通知给客户。

字段类型示例说明
taskBusinessTypeInteger4001任务业务类型
imageIdStringimg-2505244083302766镜像id
taskStatusInteger3任务状态(-1:失败;3:完成)

示例

{
    "imageId": "img-2505244083302766",
    "taskBusinessType": 4001,
    "taskStatus": 3
}
Next
错误码