如何在自己的后台服务中通过open api集成自动化脚本的后台服务?

在自动化脚本开发场景中,有时候我需要进行二次开发将平台后端服务集成到自己的后台服务中。冰狐智能辅助Open API 提供设备管理、用户体系、脚本调度、卡密授权、微服务扩展 等后端能力,标准 HTTP 接口、统一 JSON 返回、完整权限控制,可无侵入对接自有后端,复用冰狐核心能力而不重构现有系统。本文从零讲解集成流程、关键接口、安全实践,并提供可直接运行的 Demo 源码。

一、冰狐 Open API 核心规范(必看)

1. 基础约定

  • 通信协议:HTTP/HTTPS
  • 请求方式:GET/POST(以文档标注为准)
  • 数据格式:统一 JSON
  • 响应标准结构:
javascript 复制代码
{
  "state": 1,  // 1=成功,-1=失败
  "data": {}   // 成功=业务数据,失败=错误描述
}
  • 鉴权体系:clientKey+clientSecret获取accessToken,接口调用必传clientKey+accessToken
  • 重要限制:禁止频繁调用 get_token,否则 IP 拉黑

2. 核心接口分类

模块 核心能力
认证授权 获取 / 刷新 Token
设备管理 列表 / 信息 / 状态 / 启动 / 停止 / 自定义数据
脚本执行 设备端脚本 / 后端脚本 / 微服务调用
用户体系 创建 / 登录 / 信息 / 列表 / 权限脚本
卡密体系 创建 / 列表 / 转移

二、集成前置准备

  1. 注册冰狐开发者账号,获取clientKeyclientSecret

  2. 确保服务器可访问冰狐 API 域名,放行出口请求

  3. 准备开发环境(本文以 Python+Flask 为例,可无缝迁移 Java/Go/PHP)

  4. 安装依赖:

    pip install flask requests python-dotenv

三、集成全流程

步骤 1:Token 管理(集成基石)

Token 是所有接口的通行证,必须实现获取 + 缓存 + 刷新机制。

  • 获取 Token:GET /api/get_token(慎用,防拉黑)
  • 刷新 Token:GET /api/refresh_token(过期前主动刷新)

步骤 2:设备全生命周期管理

  • 获取设备列表:批量查看在线 / 离线、空闲 / 繁忙
  • 获取设备状态:轻量查询,适合轮询监控
  • 启动 / 停止设备:批量下发指令
  • 设置自定义数据:打通自有业务字段

步骤 3:脚本远程执行(核心自动化)

  • 执行设备端脚本:指定 UUID、脚本名、参数、强制运行
  • 执行后端脚本 / 微服务:扩展业务逻辑,不依赖设备在线

步骤 4:用户与卡密(商业化必备)

  • 创建子用户:隔离权限,多客户使用
  • 设置支持脚本:精细化权限控制
  • 卡密创建 / 转移:授权时长、绑定脚本、分配子账户

四、生产级封装

新建.env配置文件:

复制代码
# 冰狐开发者配置
BINGHU_BASE_URL=https://aznfz.com
BINGHU_CLIENT_KEY=你的clientKey
BINGHU_CLIENT_SECRET=你的clientSecret

新建binghu_api_client.py

python 复制代码
import os
import json
import requests
from dotenv import load_dotenv
from datetime import datetime, timedelta

load_dotenv()

class BingHuAPIClient:
    def __init__(self):
        self.base_url = os.getenv("BINGHU_BASE_URL")
        self.client_key = os.getenv("BINGHU_CLIENT_KEY")
        self.client_secret = os.getenv("BINGHU_CLIENT_SECRET")
        self.access_token = None
        self.refresh_token = None
        self.expire_time = None
        # 初始化自动获取Token
        self.get_token()

    # 1. 获取Token(核心鉴权)
    def get_token(self):
        url = f"{self.base_url}/api/get_token"
        params = {
            "clientKey": self.client_key,
            "clientSecret": self.client_secret
        }
        resp = requests.get(url, params=params)
        result = resp.json()
        if result.get("state") == 1:
            data = result["data"]
            self.access_token = data["accessToken"]
            self.refresh_token = data["refreshToken"]
            self.expire_time = datetime.now() + timedelta(seconds=data["expiresIn"]-60)
            return True
        raise Exception(f"获取Token失败:{result.get('data')}")

    # 2. 刷新Token
    def refresh_token_api(self):
        url = f"{self.base_url}/api/refresh_token"
        params = {
            "clientKey": self.client_key,
            "refreshToken": self.refresh_token
        }
        resp = requests.get(url, params=params)
        result = resp.json()
        if result.get("state") == 1:
            data = result["data"]
            self.access_token = data["accessToken"]
            self.refresh_token = data["refreshToken"]
            self.expire_time = datetime.now() + timedelta(seconds=data["expiresIn"]-60)
            return True
        raise Exception(f"刷新Token失败:{result.get('data')}")

    # 自动校验Token有效性
    def check_token(self):
        if not self.access_token or datetime.now() >= self.expire_time:
            self.refresh_token_api()

    # 3. 获取设备列表
    def get_device_list(self, openId="", cursor=0, count=-1):
        self.check_token()
        url = f"{self.base_url}/api/device/list"
        params = {
            "clientKey": self.client_key,
            "accessToken": self.access_token,
            "openId": openId,
            "cursor": cursor,
            "count": count
        }
        resp = requests.get(url, params=params)
        return resp.json()

    # 4. 获取设备状态
    def get_device_state(self, uuid):
        self.check_token()
        url = f"{self.base_url}/api/device/state"
        params = {
            "clientKey": self.client_key,
            "accessToken": self.access_token,
            "uuid": uuid
        }
        resp = requests.get(url, params=params)
        return resp.json()

    # 5. 启动设备(支持单/多UUID)
    def start_device(self, uuids, forceRun=True):
        self.check_token()
        url = f"{self.base_url}/api/device/start"
        if isinstance(uuids, list):
            uuids = json.dumps(uuids)
        params = {
            "clientKey": self.client_key,
            "accessToken": self.access_token,
            "uuids": uuids,
            "forceRun": forceRun
        }
        resp = requests.get(url, params=params)
        return resp.json()

    # 6. 停止设备
    def stop_device(self, uuids, refreshApp=True):
        self.check_token()
        url = f"{self.base_url}/api/device/stop"
        if isinstance(uuids, list):
            uuids = json.dumps(uuids)
        params = {
            "clientKey": self.client_key,
            "accessToken": self.access_token,
            "uuids": uuids,
            "refreshApp": refreshApp
        }
        resp = requests.get(url, params=params)
        return resp.json()

    # 7. 执行设备端脚本
    def execute_script(self, uuids, scriptName, params="", forceRun=True, refresh=False):
        self.check_token()
        url = f"{self.base_url}/api/script/exe"
        if isinstance(uuids, list):
            uuids = json.dumps(uuids)
        req_params = {
            "clientKey": self.client_key,
            "accessToken": self.access_token,
            "uuids": uuids,
            "scriptName": scriptName,
            "params": params,
            "forceRun": forceRun,
            "refresh": refresh
        }
        resp = requests.get(url, params=req_params)
        return resp.json()

    # 8. 创建用户
    def create_user(self, username, password="", phoneNumber="", wx=""):
        self.check_token()
        url = f"{self.base_url}/api/user/create"
        params = {
            "clientKey": self.client_key,
            "accessToken": self.access_token
        }
        body = {
            "username": username,
            "password": password,
            "phoneNumber": phoneNumber,
            "wx": wx
        }
        resp = requests.post(url, params=params, json=body)
        return resp.json()

    # 9. 创建卡密
    def create_passport(self, hours, count=1, supportScripts="", childOpenId=""):
        self.check_token()
        url = f"{self.base_url}/api/passport/create"
        params = {
            "clientKey": self.client_key,
            "accessToken": self.access_token,
            "hours": hours,
            "count": count,
            "supportScripts": supportScripts,
            "childOpenId": childOpenId
        }
        resp = requests.get(url, params=params)
        return resp.json()

五、自有后台集成 Demo:Flask 管理平台

新建app.py,实现设备监控、脚本执行、用户创建、卡密生成四大核心页面:

python 复制代码
from flask import Flask, jsonify, request
from binghu_api_client import BingHuAPIClient

app = Flask(__name__)
binghu = BingHuAPIClient()

# 1. 设备列表接口
@app.route("/api/device/list", methods=["GET"])
def api_device_list():
    openId = request.args.get("openId", "")
    data = binghu.get_device_list(openId=openId)
    return jsonify(data)

# 2. 设备状态接口
@app.route("/api/device/state", methods=["GET"])
def api_device_state():
    uuid = request.args.get("uuid")
    if not uuid:
        return jsonify({"state": -1, "data": "uuid不能为空"})
    data = binghu.get_device_state(uuid)
    return jsonify(data)

# 3. 执行脚本接口
@app.route("/api/script/execute", methods=["POST"])
def api_script_execute():
    body = request.json
    uuids = body.get("uuids")
    scriptName = body.get("scriptName")
    if not uuids or not scriptName:
        return jsonify({"state": -1, "data": "uuids和scriptName不能为空"})
    params = body.get("params", "")
    data = binghu.execute_script(uuids, scriptName, params)
    return jsonify(data)

# 4. 创建用户接口
@app.route("/api/user/create", methods=["POST"])
def api_user_create():
    body = request.json
    username = body.get("username")
    if not username:
        return jsonify({"state": -1, "data": "username不能为空"})
    data = binghu.create_user(username)
    return jsonify(data)

# 5. 创建卡密接口
@app.route("/api/passport/create", methods=["POST"])
def api_passport_create():
    body = request.json
    hours = body.get("hours")
    if not hours:
        return jsonify({"state": -1, "data": "hours不能为空"})
    data = binghu.create_passport(hours)
    return jsonify(data)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

接口调用示例

  1. 获取设备列表:GET http://localhost:8000/api/device/list
  2. 执行脚本:POST http://localhost:8000/api/script/execute
javascript 复制代码
{
  "uuids": ["设备UUID1", "设备UUID2"],
  "scriptName": "自动签到",
  "params": "[{\"user\":\"test\"}]"
}

六、关键集成要点与避坑指南

1. Token 安全

  • 绝不前端暴露clientSecretaccessToken全部后端代理
  • Token 本地缓存,过期自动刷新,避免频繁 get_token 导致 IP 拉黑
  • 生产环境使用 HTTPS,防止明文传输

2. 参数编码

  • 数组类型uuids/params必须JSON.stringify+encodeURI
  • JSON 参数严格双引号,否则解析失败

3. 批量操作

  • 多设备指令用数组批量下发,减少请求次数
  • 分页查询用cursor+count,避免全量拉取卡死

4. 状态判断

  • onlineState:0 = 离线,1 = 在线,2 = 在线但服务不可用
  • workState:0 = 空闲,1 = 繁忙

七、集成价值总结

通过 Open API 把冰狐后台集成到自有后台,可实现:

  1. 能力复用:不用自建设备管理、用户体系、卡密系统,节省 90% 后端开发量
  2. 统一入口:自有平台一站式管理设备、脚本、用户、授权
  3. 灵活扩展:微服务 + 后端脚本自定义业务逻辑,适配私有化需求
  4. 商业交付:子账户 + 卡密 + 脚本权限,快速做 SaaS / 定制化交付
相关推荐
ai_coder_ai1 天前
如何在自动化脚本中使用云原生功能(FaaS和BaaS)?
云原生·autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai4 天前
如何在自动化脚本中使用excel文件?
excel·autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai5 天前
在自动化脚本中如何使用AI大语言模型?
语言模型·autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai8 天前
写自动化脚本时如何使用多线程和锁?
autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai10 天前
如何使用shizuku来实现自动化脚本?
autojs·自动化脚本·冰狐智能辅助·easyclick
Mr -老鬼11 天前
EasyClick 大文件分割合并
自动化·autojs·easyclick·易点云测
ai_coder_ai12 天前
如何使用adb来实现自动化脚本
adb·autojs·自动化脚本·冰狐智能辅助·easyclick
PyHaVolask14 天前
SQL 注入实战:布尔盲注原理与自动化脚本解析
sql注入·二分查找算法·自动化脚本·布尔盲注·sqli-labs靶场
Mr -老鬼14 天前
EasyClick 热更新坑点处理方案
自动化·ec·easyclick·易点云测