在自动化脚本中如何在自己的后端服务中调用open api获取所有设备信息?

在自动化脚本开发与设备管控场景中,冰狐自动化脚本SaaS平台 提供OpenAPI 接口体系,可让开发者在自有 后台服务中,无缝对接冰狐后端,实现设备管理、脚本调度、用户与卡密管控等核心能力,完成从 "单机脚本" 到 "云端集中管控" 的升级。本文将基于从接口认证、核心接口调用、Java Demo 实现、异常处理 全流程,详细讲解如何在 J自己的后台中调用 OpenAPI 获取所有设备列表单设备详细信息,使用java代码作为例子讲解。

二、冰狐智能辅助 SaaS OpenAPI 核心基础

2.1 接口整体规范

  • 协议:HTTP/HTTPS
  • 请求方式:GET/POST(以 GET 为主)
  • 数据格式:统一返回 JSON,state=1 成功,state=-1 失败
  • 响应格式:
javascript 复制代码
{
    "state": 1,
    "data": { ... }
}

2.2 核心认证流程

所有业务接口(设备、用户、脚本等)均需accessToken鉴权,获取流程:

  1. clientKey+clientSecret 调用/api/get_token获取accessToken (访问凭证)+refreshToken(刷新凭证)
  2. accessToken 过期后,用refreshToken+clientKey调用/api/refresh_token刷新,避免重复获取 token 被拉黑 IP
  3. 禁止频繁调用get_token,否则系统自动拉黑 IP

2.3 本文核心接口

接口名称 请求地址 核心作用
获取 Token GET /api/get_token 获取访问凭证
刷新 Token GET /api/refresh_token 刷新过期凭证
获取设备列表 GET /api/device/list 获取所有 / 指定用户设备
获取设备信息 GET /api/device/get_info 获取单设备详细信息

三、开发环境准备

3.1 依赖引入(Maven)

基于 SpringBoot+OkHttp+FastJSON2 实现,轻量高效,无冗余依赖:

XML 复制代码
<!-- SpringBoot Web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.15</version>
</dependency>

<!-- OkHttp 网络请求 -->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.10.0</version>
</dependency>

<!-- FastJSON2 序列化 -->
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.32</version>
</dependency>

<!-- 工具类 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.23</version>
</dependency>

3.2 核心配置

application.yml配置冰狐 OpenAPI 基础信息,替换为自己的开发者密钥:

复制代码
binghu:
  # 基础域名
  base-url: https://aznfz.com
  # 开发者Key(冰狐后台获取)
  client-key: your_client_key
  # 开发者Secret(冰狐后台获取)
  client-secret: your_client_secret
  # 请求超时时间
  connect-timeout: 10000
  # 读取超时时间
  read-timeout: 30000

四、核心实体封装

4.1 通用响应实体

java 复制代码
import com.alibaba.fastjson2.JSONObject;
import lombok.Data;

/**
 * 冰狐OpenAPI通用响应
 */
@Data
public class BingHuResponse<T> {
    /**
     * 状态:1成功 -1失败
     */
    private Integer state;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 判断是否成功
     */
    public boolean isSuccess() {
        return 1 == this.state;
    }
}

4.2 设备信息实体

java 复制代码
import lombok.Data;

/**
 * 冰狐设备信息
 */
@Data
public class DeviceInfo {
    /**
     * 设备唯一标识
     */
    private String uuid;

    /**
     * 设备名称
     */
    private String name;

    /**
     * 设备手机号
     */
    private String phoneNumber;

    /**
     * 自定义数据
     */
    private String extraData;

    /**
     * 是否可用
     */
    private Boolean enable;

    /**
     * 可用天数
     */
    private Integer days;

    /**
     * 在线状态:0离线 1在线 2在线但服务不可用
     */
    private Integer onlineState;

    /**
     * 工作状态:0空闲 1繁忙
     */
    private Integer workState;

    /**
     * 开发模式:0开发 1发布
     */
    private Integer devState;
}

4.3 设备列表响应

java 复制代码
import lombok.Data;
import java.util.List;

/**
 * 设备列表响应
 */
@Data
public class DeviceListResponse {
    /**
     * 设备列表
     */
    private List<DeviceInfo> list;

    /**
     * 总数量
     */
    private Integer total;
}

4.4 Token 响应

java 复制代码
import lombok.Data;

/**
 * Token响应
 */
@Data
public class TokenResponse {
    /**
     * 访问Token
     */
    private String accessToken;

    /**
     * 刷新Token
     */
    private String refreshToken;

    /**
     * 过期时间(秒)
     */
    private Integer expiresIn;
}

五、核心工具类封装

5.1 OkHttp 客户端配置

java 复制代码
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;

/**
 * OkHttp配置
 */
@Configuration
public class OkHttpConfig {

    @Value("${binghu.connect-timeout}")
    private Integer connectTimeout;

    @Value("${binghu.read-timeout}")
    private Integer readTimeout;

    @Bean
    public OkHttpClient okHttpClient() {
        return new OkHttpClient.Builder()
                .connectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
                .readTimeout(readTimeout, TimeUnit.MILLISECONDS)
                .build();
    }
}

5.2 冰狐 API 核心调用工具

java 复制代码
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

/**
 * 冰狐智能辅助API工具
 */
@Component
public class BingHuApiUtil {

    @Value("${binghu.base-url}")
    private String baseUrl;

    @Value("${binghu.client-key}")
    private String clientKey;

    @Value("${binghu.client-secret}")
    private String clientSecret;

    @Resource
    private OkHttpClient okHttpClient;

    // 缓存Token(生产环境建议存入Redis)
    private String accessToken;
    private String refreshToken;

    /**
     * 1. 获取Token(核心认证)
     */
    public BingHuResponse<TokenResponse> getToken() {
        String url = baseUrl + "/api/get_token";
        Map<String, String> params = new HashMap<>(2);
        params.put("clientKey", clientKey);
        params.put("clientSecret", clientSecret);
        BingHuResponse<TokenResponse> response = doGet(url, params, new TypeReference<BingHuResponse<TokenResponse>>() {});
        if (response.isSuccess()) {
            // 缓存Token
            TokenResponse data = response.getData();
            this.accessToken = data.getAccessToken();
            this.refreshToken = data.getRefreshToken();
        }
        return response;
    }

    /**
     * 2. 刷新Token
     */
    public BingHuResponse<TokenResponse> refreshToken() {
        String url = baseUrl + "/api/refresh_token";
        Map<String, String> params = new HashMap<>(2);
        params.put("clientKey", clientKey);
        params.put("refreshToken", refreshToken);
        BingHuResponse<TokenResponse> response = doGet(url, params, new TypeReference<BingHuResponse<TokenResponse>>() {});
        if (response.isSuccess()) {
            TokenResponse data = response.getData();
            this.accessToken = data.getAccessToken();
            this.refreshToken = data.getRefreshToken();
        }
        return response;
    }

    /**
     * 3. 获取设备列表(所有设备)
     */
    public BingHuResponse<DeviceListResponse> getDeviceList() {
        String url = baseUrl + "/api/device/list";
        Map<String, String> params = new HashMap<>(2);
        params.put("clientKey", clientKey);
        params.put("accessToken", accessToken);
        // 默认获取管理者所有设备,cursor=0,count=-1返回全部
        return doGet(url, params, new TypeReference<BingHuResponse<DeviceListResponse>>() {});
    }

    /**
     * 4. 获取单设备详细信息
     */
    public BingHuResponse<DeviceInfo> getDeviceInfo(String uuid) {
        String url = baseUrl + "/api/device/get_info";
        Map<String, String> params = new HashMap<>(3);
        params.put("clientKey", clientKey);
        params.put("accessToken", accessToken);
        params.put("uuid", uuid);
        return doGet(url, params, new TypeReference<BingHuResponse<DeviceInfo>>() {});
    }

    /**
     * 通用GET请求
     */
    private <T> BingHuResponse<T> doGet(String url, Map<String, String> params, TypeReference<BingHuResponse<T>> typeReference) {
        try {
            // 拼接参数
            StringBuilder sb = new StringBuilder(url);
            if (params != null && !params.isEmpty()) {
                sb.append("?");
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
                }
                sb.deleteCharAt(sb.length() - 1);
            }

            Request request = new Request.Builder()
                    .url(sb.toString())
                    .get()
                    .build();

            try (Response response = okHttpClient.newCall(request).execute()) {
                if (!response.isSuccessful()) {
                    throw new RuntimeException("请求失败,状态码:" + response.code());
                }
                String body = response.body().string();
                return JSON.parseObject(body, typeReference);
            }
        } catch (Exception e) {
            BingHuResponse<T> error = new BingHuResponse<>();
            error.setState(-1);
            error.setData(null);
            e.printStackTrace();
            return error;
        }
    }

    /**
     * 初始化Token(项目启动时调用)
     */
    public void initToken() {
        if (StrUtil.isBlank(accessToken)) {
            getToken();
        }
    }
}

六、完整 Demo 实现

6.1 启动类初始化 Token

java 复制代码
import com.example.binghu.util.BingHuApiUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.Resource;

@SpringBootApplication
public class BingHuApiDemoApplication {

    @Resource
    private BingHuApiUtil bingHuApiUtil;

    public static void main(String[] args) {
        SpringApplication.run(BingHuApiDemoApplication.class, args);
    }

    /**
     * 项目启动后初始化Token
     */
    @javax.annotation.PostConstruct
    public void init() {
        bingHuApiUtil.initToken();
    }
}

6.2 控制层提供接口

java 复制代码
import com.example.binghu.entity.BingHuResponse;
import com.example.binghu.entity.DeviceInfo;
import com.example.binghu.entity.DeviceListResponse;
import com.example.binghu.util.BingHuApiUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

/**
 * 冰狐设备管理接口
 */
@RestController
@RequestMapping("/binghu/device")
public class BingHuDeviceController {

    @Resource
    private BingHuApiUtil bingHuApiUtil;

    /**
     * 获取所有设备列表
     */
    @GetMapping("/list")
    public BingHuResponse<DeviceListResponse> getDeviceList() {
        return bingHuApiUtil.getDeviceList();
    }

    /**
     * 获取单设备信息
     */
    @GetMapping("/info/{uuid}")
    public BingHuResponse<DeviceInfo> getDeviceInfo(@PathVariable String uuid) {
        return bingHuApiUtil.getDeviceInfo(uuid);
    }

    /**
     * 刷新Token
     */
    @GetMapping("/refreshToken")
    public BingHuResponse<TokenResponse> refreshToken() {
        return bingHuApiUtil.refreshToken();
    }
}

6.3 测试结果

  1. 启动项目,访问https://aznfz.com/api/device/list,返回所有设备列表:
javascript 复制代码
{
    "state": 1,
    "data": {
        "list": [
            {
                "uuid": "device_001",
                "name": "测试设备1",
                "phoneNumber": "13800138000",
                "extraData": "{\"remark\":\"测试专用\"}",
                "enable": true,
                "days": 365,
                "onlineState": 1,
                "workState": 0,
                "devState": 1
            }
        ],
        "total": 1
    }
}
  1. 访问https://aznfz.com/api/device/info/device_001,返回单设备详细信息。

七、生产环境关键注意事项

7.1 Token 缓存与刷新

  • 本文用内存缓存 Token,生产环境必须存入 Redis,设置过期时间(比 expiresIn 提前 5 分钟)
  • 调用业务接口时,捕获 token 过期异常,自动调用refreshToken重试

7.2 IP 防拉黑

  • 严禁频繁调用/api/get_token,官方明确会自动拉黑 IP
  • 优先用refreshToken刷新,减少get_token调用次数

7.3 参数编码

  • 接口中uuidsparams等 JSON 数组参数,必须调用 encodeURI 编码,避免参数解析失败

7.4 异常处理

  • 增加网络超时、参数错误、token 失效、设备不存在等异常捕获
  • 接口调用失败时,记录日志并返回友好提示

7.5 权限管控

  • clientKeyclientSecret属于核心密钥,严禁硬编码在代码中,通过配置中心 / 环境变量管理
  • 限制接口访问权限,避免未授权调用

八、扩展能力

基于本文封装的工具类,可快速扩展冰狐 OpenAPI 其他核心能力:

  1. 设备控制:启动 / 停止设备、执行设备端脚本
  2. 用户管理:创建用户、用户登录、获取用户列表
  3. 卡密管理:创建卡密、获取卡密列表、转移卡密
  4. 脚本调度:执行后端脚本、调用微服务

九、总结

本文基于冰狐智能辅助官方 OpenAPI 文档,完成了Java 后台调用 OpenAPI 获取设备列表与设备信息 的全流程实现,从接口规范、实体封装、核心工具、Demo 代码生产注意事项 ,覆盖开发全场景。通过这套方案,开发者可将冰狐智能辅助的设备管控能力,无缝集成到自有 Java 后台,实现自动化脚本的云端集中管理,轻松支撑规模化自动化业务。

相关推荐
ai_coder_ai5 天前
使用颜色来实现自动化脚本
autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai6 天前
在自动化脚本中如何实现文本转语音?
tts·autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai7 天前
在自动化脚本中如何使用websocket?
websocket·autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai8 天前
在自动化脚本中如何实现录音功能?
autojs·录音·自动化脚本·冰狐智能辅助·easyclick
Mr -老鬼9 天前
EasyClick 安卓CLI全栈专家能力手册
android·自动化·ai编程·easyclick·易点云测
iReachers10 天前
HTML打包EXE使用附件功能调用外部程序扩展你的EXE - 附实战演练实现录频功能
html打包exe·附件文件·open api
ai_coder_ai10 天前
在自动化脚本中如何获取手机信息和控制手机?
autojs·自动化脚本·冰狐智能辅助·easyclick
Mr -老鬼11 天前
EasyClick 全平台公开问题解决方案全集(2026最新完整版)
自动化·ec·easyclick·易点云测
ai_coder_ai12 天前
在自动化脚本中如何实现网络访问?
网络·autojs·自动化脚本·冰狐智能辅助·easyclick