在自动化脚本任务中如何在自己的后端服务中使用open api调用平台的后端服务?

在自动化运维、智能设备管控、批量脚本执行等场景中,自动化脚本平台后端服务支持开发者将设备控制、脚本运行、用户管理、卡密分发等能力无缝集成到自有后台服务,实现自动化流程闭环。本文从接入准备、核心流程、Java Demo 实现、异常处理到最佳实践,全方位讲解如何在 Java 后端安全、高效调用OpenAPI,助力企业快速搭建自动化管控平台。

一、冰狐 OpenAPI 核心价值与接入前提

1.1 核心能力概览

冰狐 OpenAPI 覆盖设备管理、脚本调度、用户体系、卡密运营 四大核心模块,接口统一返回 JSON 格式,成功状态state=1,失败state=-1,数据结构清晰易解析。核心能力包括:

  • 身份鉴权:获取 / 刷新 AccessToken,保障接口调用安全;
  • 设备管控:列表查询、状态获取、启动 / 停止、自定义数据配置;
  • 脚本执行:远程调度设备端脚本、传递参数、强制运行;
  • 用户运营:创建子账户、登录验证、权限分配、数据管理;
  • 卡密体系:生成、查询、转移卡密,实现付费自动化。

1.2 接入前置条件

  1. 注册冰狐智能辅助开发者账号,获取clientKey (开发者 Key)与clientSecret(开发者密钥);
  2. 完成设备绑定,确认设备在线状态,获取设备 UUID;
  3. 自有后台具备 Java 运行环境,支持 HTTP 请求、JSON 序列化;
  4. 避免频繁调用get_token接口,防止 IP 被系统拉黑。

二、OpenAPI 调用核心流程

冰狐 OpenAPI 采用AccessToken 鉴权机制,所有业务接口必须携带有效 AccessToken,完整调用流程如下:

  1. 初始化鉴权 :通过clientKey+clientSecret调用get_token获取accessTokenrefreshToken及过期时间;
  2. Token 缓存:本地缓存 AccessToken,避免重复调用获取接口;
  3. 业务调用 :携带clientKey+accessToken请求设备、脚本、用户等业务接口;
  4. Token 刷新 :AccessToken 过期前,用refreshToken调用refresh_token更新凭证;
  5. 异常处理:捕获接口调用异常、Token 失效、设备离线等问题,保障流程稳定。

三、Java 项目环境搭建

3.1 依赖配置

基于 Maven 构建项目,引入 HTTP 工具、JSON 解析、日志依赖,核心依赖如下:

XML 复制代码
<dependencies>
    <!-- HTTP客户端 -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.14</version>
    </dependency>
    <!-- JSON序列化 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson2</artifactId>
        <version>2.0.32</version>
    </dependency>
    <!-- 日志工具 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.12</version>
    </dependency>
</dependencies>

3.2 基础配置类

创建配置类管理冰狐 OpenAPI 基础参数,支持硬编码或配置文件注入,便于维护:

java 复制代码
/**
 * 冰狐OpenAPI配置类
 */
public class BingHuConfig {
    // 冰狐API基础域名
    public static final String BASE_URL = "https://aznfz.com";
    // 开发者Key(替换为自己的)
    public static final String CLIENT_KEY = "your_client_key";
    // 开发者Secret(替换为自己的)
    public static final String CLIENT_SECRET = "your_client_secret";
    // 请求超时时间(毫秒)
    public static final int HTTP_TIMEOUT = 10000;
}

四、Demo 完整实现

4.1 通用 HTTP 工具类

封装 GET/POST 请求,统一处理参数编码、响应解析,适配冰狐 OpenAPI 接口规范:

java 复制代码
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
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 java.net.URI;
import java.nio.charset.StandardCharsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 冰狐OpenAPI HTTP工具类
 */
public class BingHuHttpUtil {
    private static final Logger log = LoggerFactory.getLogger(BingHuHttpUtil.class);
    private static final CloseableHttpClient HTTP_CLIENT = HttpClients.createDefault();

    /**
     * 发送GET请求
     */
    public static JSONObject doGet(String apiPath, JSONObject params) {
        try {
            URIBuilder uriBuilder = new URIBuilder(BingHuConfig.BASE_URL + apiPath);
            // 拼接请求参数
            if (params != null) {
                params.forEach((key, value) -> uriBuilder.addParameter(key, String.valueOf(value)));
            }
            URI uri = uriBuilder.build();
            HttpGet httpGet = new HttpGet(uri);
            // 配置超时
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(BingHuConfig.HTTP_TIMEOUT)
                    .setSocketTimeout(BingHuConfig.HTTP_TIMEOUT)
                    .build();
            httpGet.setConfig(requestConfig);

            try (CloseableHttpResponse response = HTTP_CLIENT.execute(httpGet)) {
                HttpEntity entity = response.getEntity();
                String result = EntityUtils.toString(entity, StandardCharsets.UTF_8);
                return JSON.parseObject(result);
            }
        } catch (Exception e) {
            log.error("冰狐GET请求异常", e);
            return null;
        }
    }

    /**
     * 发送POST请求(适配创建用户接口)
     */
    public static JSONObject doPost(String apiPath, JSONObject urlParams, JSONObject bodyParams) {
        try {
            URIBuilder uriBuilder = new URIBuilder(BingHuConfig.BASE_URL + apiPath);
            if (urlParams != null) {
                urlParams.forEach((key, value) -> uriBuilder.addParameter(key, String.valueOf(value)));
            }
            URI uri = uriBuilder.build();
            HttpPost httpPost = new HttpPost(uri);
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(BingHuConfig.HTTP_TIMEOUT)
                    .setSocketTimeout(BingHuConfig.HTTP_TIMEOUT)
                    .build();
            httpPost.setConfig(requestConfig);
            // 设置请求体
            StringEntity entity = new StringEntity(JSON.toJSONString(bodyParams), StandardCharsets.UTF_8);
            entity.setContentType("application/json");
            httpPost.setEntity(entity);

            try (CloseableHttpResponse response = HTTP_CLIENT.execute(httpPost)) {
                String result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
                return JSON.parseObject(result);
            }
        } catch (Exception e) {
            log.error("冰狐POST请求异常", e);
            return null;
        }
    }
}

4.2 核心接口调用实现

封装 Token 管理、设备、脚本、用户、卡密等核心接口,形成可直接复用的工具类:

java 复制代码
/**
 * 冰狐OpenAPI核心调用类
 */
public class BingHuOpenApiClient {
    private static final Logger log = LoggerFactory.getLogger(BingHuOpenApiClient.class);
    // 缓存AccessToken
    private static String accessToken;
    private static String refreshToken;
    private static long expireTime;

    /**
     * 1. 获取AccessToken(核心鉴权接口)
     */
    public static boolean getToken() {
        JSONObject params = new JSONObject();
        params.put("clientKey", BingHuConfig.CLIENT_KEY);
        params.put("clientSecret", BingHuConfig.CLIENT_SECRET);
        JSONObject result = BingHuHttpUtil.doGet("/api/get_token", params);
        
        if (result != null && result.getIntValue("state") == 1) {
            JSONObject data = result.getJSONObject("data");
            accessToken = data.getString("accessToken");
            refreshToken = data.getString("refreshToken");
            expireTime = System.currentTimeMillis() + data.getLong("expiresIn") * 1000;
            log.info("获取Token成功,过期时间:{}", expireTime);
            return true;
        }
        log.error("获取Token失败:{}", result);
        return false;
    }

    /**
     * 2. 刷新AccessToken
     */
    public static boolean refreshToken() {
        JSONObject params = new JSONObject();
        params.put("clientKey", BingHuConfig.CLIENT_KEY);
        params.put("refreshToken", refreshToken);
        JSONObject result = BingHuHttpUtil.doGet("/api/refresh_token", params);
        
        if (result != null && result.getIntValue("state") == 1) {
            JSONObject data = result.getJSONObject("data");
            accessToken = data.getString("accessToken");
            refreshToken = data.getString("refreshToken");
            expireTime = System.currentTimeMillis() + data.getLong("expiresIn") * 1000;
            log.info("刷新Token成功");
            return true;
        }
        log.error("刷新Token失败,重新获取");
        return getToken();
    }

    /**
     * 3. 获取设备列表
     */
    public static JSONObject getDeviceList(String openId, int cursor, int count) {
        // 自动刷新Token
        if (System.currentTimeMillis() > expireTime - 60000) {
            refreshToken();
        }
        JSONObject params = new JSONObject();
        params.put("clientKey", BingHuConfig.CLIENT_KEY);
        params.put("accessToken", accessToken);
        params.put("openId", openId);
        params.put("cursor", cursor);
        params.put("count", count);
        return BingHuHttpUtil.doGet("/api/device/list", params);
    }

    /**
     * 4. 执行设备端脚本
     * @param uuids 设备UUID(数组需encodeUri)
     * @param scriptName 脚本名
     * @param params 脚本参数
     */
    public static JSONObject executeScript(String uuids, String scriptName, String params) {
        if (System.currentTimeMillis() > expireTime - 60000) {
            refreshToken();
        }
        JSONObject reqParams = new JSONObject();
        reqParams.put("clientKey", BingHuConfig.CLIENT_KEY);
        reqParams.put("accessToken", accessToken);
        reqParams.put("uuids", uuids);
        reqParams.put("scriptName", scriptName);
        reqParams.put("params", params);
        reqParams.put("forceRun", true);
        return BingHuHttpUtil.doGet("/api/script/exe", reqParams);
    }

    /**
     * 5. 创建用户
     */
    public static JSONObject createUser(String username, String password, String phone) {
        if (System.currentTimeMillis() > expireTime - 60000) {
            refreshToken();
        }
        JSONObject urlParams = new JSONObject();
        urlParams.put("clientKey", BingHuConfig.CLIENT_KEY);
        urlParams.put("accessToken", accessToken);
        JSONObject bodyParams = new JSONObject();
        bodyParams.put("username", username);
        bodyParams.put("password", password);
        bodyParams.put("phoneNumber", phone);
        return BingHuHttpUtil.doPost("/api/user/create", urlParams, bodyParams);
    }
}

4.3 测试主函数

编写测试类,验证核心接口调用流程,覆盖鉴权、设备、脚本、用户全场景:

java 复制代码
/**
 * 冰狐OpenAPI测试类
 */
public class BingHuTest {
    public static void main(String[] args) {
        // 1. 获取Token
        boolean tokenFlag = BingHuOpenApiClient.getToken();
        if (!tokenFlag) {
            log.error("Token获取失败,退出程序");
            return;
        }

        // 2. 获取设备列表
        JSONObject deviceList = BingHuOpenApiClient.getDeviceList("", 0, -1);
        log.info("设备列表:{}", deviceList);

        // 3. 执行设备脚本(替换为自己的设备UUID和脚本名)
        JSONObject scriptResult = BingHuOpenApiClient.executeScript(
                "your_device_uuid",
                "test_script",
                "[{\"key\":\"value\"}]"
        );
        log.info("脚本执行结果:{}", scriptResult);

        // 4. 创建子用户
        JSONObject createUser = BingHuOpenApiClient.createUser("test_user", "123456", "13800138000");
        log.info("创建用户结果:{}", createUser);
    }
}

五、关键接口调用细节与避坑指南

5.1 鉴权接口注意事项

  1. 禁止频繁调用 get_token:官方明确限制频繁调用,否则 IP 拉黑,建议缓存 Token,过期前 1 分钟刷新;
  2. Token 安全存储:避免明文存储在代码中,生产环境使用配置中心或环境变量;
  3. 刷新机制:AccessToken 过期后,优先用 refreshToken 刷新,失败再重新获取。

5.2 设备与脚本接口规范

  1. UUID 参数处理 :多设备 UUID 需转为 JSON 数组并encodeURI编码,防止参数解析失败;
  2. 脚本参数格式:参数必须为 JSON 数组,字符串与 Key 用双引号,调用前编码;
  3. 状态判断 :设备onlineState=1才支持脚本执行,workState=0表示空闲可调度。

5.3 异常处理最佳实践

  1. 状态码校验 :所有接口先判断state字段,1为成功,-1时读取data获取错误信息;
  2. 网络异常:设置超时时间,增加重试机制,避免请求阻塞;
  3. 设备异常:捕获离线、繁忙、不可用状态,加入重试或告警逻辑。

六、生产环境优化建议

  1. Token 集中管理:使用 Redis 缓存 AccessToken,支持分布式系统共享,避免重复获取;
  2. 异步调用:脚本执行、设备启动等耗时接口,采用线程池异步处理,提升接口响应速度;
  3. 日志监控:记录接口调用日志、异常信息,接入监控系统,实时感知调用状态;
  4. 权限隔离:子账户分配最小权限,避免主账户 Key 泄露导致安全风险;
  5. 限流防护:自有后台接口增加限流,防止恶意请求触发冰狐官方限制。

七、总结

冰狐智能辅助 OpenAPI 为企业自动化平台提供了设备与脚本管控能力,通过 Java 后端集成,可实现设备统一管理、脚本批量调度、用户自动化运营、卡密全生命周期管理 。本文从接入流程、环境搭建、Demo 实现到生产优化,提供了完整的落地方案,代码可直接复用,适配 Spring Boot、微服务等多种架构。开发者只需替换自己的clientKeyclientSecret,即可快速完成集成,专注于业务逻辑开发,无需关注底层设备通信细节。

相关推荐
ai_coder_ai19 小时前
在自动化脚本任务中如何在自己的后端服务中使用open api进行卡密相关操作?
autojs·自动化脚本·冰狐智能辅助·easyclick
weixin_408099672 天前
身份证OCR识别API接入实战:6种自动化脚本3分钟搞定(含天诺/按键精灵/易语言/C#示例)
ocr·图像识别·api对接·易语言·自动化脚本·身份证ocr·石榴智能
Bear on Toilet2 天前
【JSON-RPC远程过程调用组件库】测试报告
开发语言·软件测试·后端·自动化脚本
ai_coder_ai2 天前
在自动化脚本中如何在自己的后端服务中调用open api进行用户相关操作?
autojs·自动化脚本·冰狐智能辅助·easyclick
weixin_408099673 天前
触动精灵调用身份证OCR识别API实现智能信息录入(Lua脚本实战)
junit·ocr·lua·自动化脚本·石榴智能·身份证ocr识别·触动精灵
ai_coder_ai3 天前
在自动化脚本中如何在自己的后端服务中调用open api获取所有设备信息?
autojs·open·自动化脚本·冰狐智能辅助·easyclick·open api
ai_coder_ai8 天前
使用颜色来实现自动化脚本
autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai9 天前
在自动化脚本中如何实现文本转语音?
tts·autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai10 天前
在自动化脚本中如何使用websocket?
websocket·autojs·自动化脚本·冰狐智能辅助·easyclick