宝塔面板的API接口可以让开发者通过代码远程操作服务器相关功能,避免手动登录面板操作的繁琐,适合批量管理服务器、自动化部署等场景。对接的核心是先理解面板的签名机制,再封装统一的请求方法,减少重复代码。

宝塔面板API对接前置准备
在编写代码前需要先获取两个关键信息:
- 面板地址:即宝塔面板的访问地址,例如
http://192.168.0.1:8888 - API密钥:在宝塔面板设置页面开启API接口后生成的密钥,分为密钥和密钥前缀两部分
宝塔API的签名规则为:将请求参数按照键名排序后拼接成字符串,再拼接上密钥,最后进行MD5加密,加密结果的前面拼接密钥前缀作为最终签名。
Python封装宝塔API类库
核心实现逻辑
Python版本的类库主要包含签名生成、请求发送两个核心方法,同时封装常用的站点、数据库、服务器状态查询等接口。
import hashlib
import requests
class BtPanelApi:
def __init__(self, panel_url, api_key, key_prefix):
self.panel_url = panel_url.rstrip('/')
self.api_key = api_key
self.key_prefix = key_prefix
def _generate_sign(self, params):
# 对参数键名排序
sorted_keys = sorted(params.keys())
# 拼接排序后的参数值
param_str = ''.join([str(params[k]) for k in sorted_keys])
# 拼接密钥后MD5加密
sign_str = param_str + self.api_key
md5_sign = hashlib.md5(sign_str.encode('utf-8')).hexdigest()
# 拼接密钥前缀返回最终签名
return self.key_prefix + md5_sign
def request(self, action, params=None):
if params is None:
params = {}
# 添加请求时间戳
params['request_time'] = int(time.time())
# 生成签名
params['request_token'] = self._generate_sign(params)
# 发送POST请求
try:
response = requests.post(f"{self.panel_url}/api/{action}", data=params, timeout=10)
return response.json()
except Exception as e:
return {'status': False, 'msg': f'请求失败: {str(e)}'}
# 获取系统基础信息
def get_system_info(self):
return self.request('GetSystemTotal')
# 获取站点列表
def get_site_list(self):
return self.request('GetSiteList')
if __name__ == '__main__':
import time
# 初始化实例,替换为实际的面板地址、密钥、密钥前缀
api = BtPanelApi(
panel_url='http://192.168.0.1:8888',
api_key='your_api_key_here',
key_prefix='your_key_prefix_here'
)
# 调用获取系统信息接口
system_info = api.get_system_info()
print(system_info)
PHP封装宝塔API类库
核心实现逻辑
PHP版本的类库同样遵循签名规则,使用curl发送请求,封装常用接口方法,方便在PHP项目中直接调用。
<?php
class BtPanelApi {
private $panelUrl;
private $apiKey;
private $keyPrefix;
public function __construct($panelUrl, $apiKey, $keyPrefix) {
$this->panelUrl = rtrim($panelUrl, '/');
$this->apiKey = $apiKey;
$this->keyPrefix = $keyPrefix;
}
private function generateSign($params) {
// 对参数键名排序
ksort($params);
// 拼接排序后的参数值
$paramStr = '';
foreach ($params as $value) {
$paramStr .= $value;
}
// 拼接密钥后MD5加密
$signStr = $paramStr . $this->apiKey;
$md5Sign = md5($signStr);
// 拼接密钥前缀返回最终签名
return $this->keyPrefix . $md5Sign;
}
public function request($action, $params = []) {
// 添加请求时间戳
$params['request_time'] = time();
// 生成签名
$params['request_token'] = $this->generateSign($params);
// 初始化curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->panelUrl . '/api/' . $action);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 发送请求
$response = curl_exec($ch);
if (curl_errno($ch)) {
$result = ['status' => false, 'msg' => '请求失败: ' . curl_error($ch)];
} else {
$result = json_decode($response, true);
}
curl_close($ch);
return $result;
}
// 获取系统基础信息
public function getSystemInfo() {
return $this->request('GetSystemTotal');
}
// 获取站点列表
public function getSiteList() {
return $this->request('GetSiteList');
}
}
// 使用示例,替换为实际的面板地址、密钥、密钥前缀
$api = new BtPanelApi(
'http://192.168.0.1:8888',
'your_api_key_here',
'your_key_prefix_here'
);
// 调用获取系统信息接口
$systemInfo = $api->getSystemInfo();
print_r($systemInfo);
?>
使用注意事项
- API密钥属于敏感信息,不要硬编码在代码中,建议通过环境变量或配置文件存储
- 请求超时时间建议设置为10秒以上,避免服务器响应慢导致请求失败
- 调用接口后需要判断返回的状态码,处理接口返回的错误信息
- 宝塔面板的API接口版本可能会更新,使用前可以查看面板内的API文档确认接口参数