Linux宝塔面板简介
Linux宝塔面板是一款简单高效、功能强大的服务器运维管理工具,致力于让服务器管理变得轻松直观。它提供图形化 Web 界面,帮助用户快速完成常见的运维任务。在基础操作之外,宝塔面板还提供了 API 接口能力,允许开发者通过程序化方式调用面板功能,实现自动化运维、远程控制或与第三方系统集成。API 操作属于进阶功能,要求使用者不仅熟悉宝塔面板(Linux)的基本操作,还需具备一定的服务器运维经验、HTTP 请求调试能力(如使用浏览器开发者工具或 Postman),并理解 API 调用的安全机制(如 IP 白名单、密钥验证等)。
什么是API
API(Application Programming Interface,应用程序编程接口)是一组预定义的规则和协议,允许不同的软件应用之间进行通信与数据交互。通过 API,开发者无需了解底层实现细节,即可调用特定服务的功能或获取所需数据。
本文使用的是以网络请求为基础的API,长这样:POST http://127.0.0.1/api/users
在宝塔面板中,本质上和用户对面板的操作就是通过API进行的,因此宝塔面板(Linux)提供了十分丰富API。通过API我们可以完成许多自动化的,不需要Web登录面板的操作;但是调用API具有一定的风险。
获取和设置用于调用API的身份
在上一点提到调用API具有一定的风险,因此我们想要调用面板的API需要校验身份。
-
登录你的宝塔面板 ->点击设置 -> 在常用设置中找到API接口 -> 点击配置面板API打开API接口就能看到接口密钥了。


-
点击接口密钥然后复制到一个安全的地方存放后续会使用。
-
设置IP白名单,本示例使用*任意字符通配符 不拒绝IP,但是该操作在实际环境中存在风险。
调用面板API前的准备
构建Panel类存放网络请求和身份校验逻辑
我们在panel.py中写入下列内容,先构建一个Panel类、用于发送请求和取得请求回应体的算法:
class Panel:
__BT_KEY__ = ""
__BT_PANEL__ = ""
__VERIFY_SSL__ = True
__SSL_CA_FILE__ = None
def __init__(self, bt_panel=None, bt_key=None, verify_ssl=True, ca_file=None):
if bt_panel:
self.__BT_PANEL__ = bt_panel
self.__BT_KEY__ = bt_key
self.__VERIFY_SSL__ = verify_ssl
self.__SSL_CA_FILE__ = ca_file
def __get_md5__(self, s):
# 计算MD5
m = hashlib.md5()
m.update(s.encode("utf-8"))
return m.hexdigest()
def __get_key_data__(self):
# 构造带有签名的关联数组
now_time = int(time.time())
p_data = {
"request_token": self.__get_md5__(
str(now_time) + "" + self.__get_md5__(self.__BT_KEY__)
),
"request_time": now_time,
}
return p_data
def __build_ssl_context__(self):
import ssl
if not self.__VERIFY_SSL__:
return ssl._create_unverified_context()
if self.__SSL_CA_FILE__:
return ssl.create_default_context(cafile=self.__SSL_CA_FILE__)
return ssl.create_default_context()
def __http_post_cookie__(self, url, p_data, timeout=1800):
''' 发送POST请求并保存Cookie
@url 被请求的URL地址(必需)
@data POST参数,可以是字符串或字典(必需)
@timeout 超时时间默认1800秒
return string
'''
cookie_file = "./" + self.__get_md5__(self.__BT_PANEL__) + ".cookie"
import urllib.request, urllib.parse, http.cookiejar
cookie_obj = http.cookiejar.MozillaCookieJar(cookie_file)
if os.path.exists(cookie_file):
cookie_obj.load(cookie_file, ignore_discard=True, ignore_expires=True)
cookie_handler = urllib.request.HTTPCookieProcessor(cookie_obj)
ssl_context = self.__build_ssl_context__()
https_handler = urllib.request.HTTPSHandler(context=ssl_context)
data = urllib.parse.urlencode(p_data).encode("utf-8")
req = urllib.request.Request(url, data)
opener = urllib.request.build_opener(cookie_handler, https_handler)
response = opener.open(req, timeout=timeout)
cookie_obj.save(ignore_discard=True, ignore_expires=True)
result = response.read()
if type(result) == bytes:
result = result.decode("utf-8")
return result
其他编程语言的可以参考
由于宝塔面板并没有给出完整的官方API文档,本文会使用浏览器调试器来进行API的获取,后续待我完善apifox文档后会附带完整的文档链接到本文。
获取API
-
我们依旧先登录宝塔面板,点到你想查的功能的API的页面,然后点击F12打开浏览器调试器(我使用Edge演示),点击上方标签页的网络(Network)。

-
按下Ctrl+E记录网络日志(我以重启网站->Python项目进行演示)。
-
在Python项目选择一个正在运行项目的栏目 点击 运行中 -> 重启

-
查看浏览器调试器捕抓到的网络请求

-
可以看的记录了两条请求,分别为RestartProject和GetProjectList。通过名字易知RestartProject为我想要的重启Python项目的API请求,点击该条请求查看请求头、请求负载和请求响应。

-
可以在标头看到API请求的地址为
{宝塔面板地址}/project/python/RestartProject请求方法为POST。但仅有这些信息还不足以我们成功调用API,我们需要知道后端需要我们提交什么信息,它会返回什么信息。点击负载查看该API请求提交了些什么信息。
-
可以看到该API请求携带了一串名为data的json数据(键值对,name为键,home为name键的值)
{"name":"home"},说明我们只需要更改name的值即可以对指定的python项目进行操作。到这里已经可以进行调用API了,但是后端还有响应数据的规则,我们要了解这个规则才能确保我们数据处理的正确性(你让它重启了,总得知道成没成功吧)。点击响应即可查看响应数据详情。
-
可以看到后端返回了一串json数据,包含Boolean类型的status和String类型的msg。status的值是true代表我们这次的请求成功了,msg返回了一条Unicode编码的字符串其内容解码为成功的描述项目
重启指令已执行,请注意查看日志
构建API请求函数以调用API
我们在Panel类添加一个函数restart_python_project(self, project_name)
def restart_python_project(self, project_name):
# 执行Python项目重启
# 拼接URL地址
url = self.__BT_PANEL__ + "/project/python/RestartProject"
# 准备POST数据
p_data = self.__get_key_data__() # 取签名
p_data["name"] = project_name
# 请求面板接口
result = self.__http_post_cookie__(url, p_data)
# 解析JSON数据
return json.loads(result)
到这里我们已经可以在python创建一个Panel实例调用网络API请求对指定的python项目进行重启了。
在该文件下加入以下内容以完成请求的发送和响应的接收。
if __name__ == "__main__":
# 实例化宝塔API对象
# 若面板使用自签或不受信任证书,可将verify_ssl设为False
my_api = bt_api(
"http://192.168.24.103:9192/",
"tokenisNU1WGRfIosXNhpc7RNwB7kfc",
verify_ssl=False,
)
r_data = my_api.restart_python_project("home")
# 打印响应数据
print(r_data.get("data", [{}])[0].get("status"))
结语








评论(1)
此评论仅作者可见