在自动化脚本开发场景中,有时候我需要进行二次开发将平台后端服务集成到自己的后台服务中。冰狐智能辅助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 |
| 设备管理 | 列表 / 信息 / 状态 / 启动 / 停止 / 自定义数据 |
| 脚本执行 | 设备端脚本 / 后端脚本 / 微服务调用 |
| 用户体系 | 创建 / 登录 / 信息 / 列表 / 权限脚本 |
| 卡密体系 | 创建 / 列表 / 转移 |
二、集成前置准备
-
注册冰狐开发者账号,获取
clientKey与clientSecret -
确保服务器可访问冰狐 API 域名,放行出口请求
-
准备开发环境(本文以 Python+Flask 为例,可无缝迁移 Java/Go/PHP)
-
安装依赖:
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)
接口调用示例
- 获取设备列表:
GET http://localhost:8000/api/device/list - 执行脚本:
POST http://localhost:8000/api/script/execute
javascript
{
"uuids": ["设备UUID1", "设备UUID2"],
"scriptName": "自动签到",
"params": "[{\"user\":\"test\"}]"
}
六、关键集成要点与避坑指南
1. Token 安全
- 绝不前端暴露
clientSecret与accessToken,全部后端代理 - 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 把冰狐后台集成到自有后台,可实现:
- 能力复用:不用自建设备管理、用户体系、卡密系统,节省 90% 后端开发量
- 统一入口:自有平台一站式管理设备、脚本、用户、授权
- 灵活扩展:微服务 + 后端脚本自定义业务逻辑,适配私有化需求
- 商业交付:子账户 + 卡密 + 脚本权限,快速做 SaaS / 定制化交付