boxmoe_header_banner_img

Welcome to ICETOWNE

文章导读

使用Linux宝塔面板API


avatar
SYLVIA 2026年4月24日 86

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需要校验身份。

  1. 登录你的宝塔面板 ->点击设置 -> 在常用设置中找到API接口 -> 点击配置面板API打开API接口就能看到接口密钥了。

    Find-API

    API_APIKEY

  2. 点击接口密钥然后复制到一个安全的地方存放后续会使用。

  3. 设置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

  1. 我们依旧先登录宝塔面板,点到你想查的功能的API的页面,然后点击F12打开浏览器调试器(我使用Edge演示),点击上方标签页的网络(Network)。
    DevTools-network-init

  2. 按下Ctrl+E记录网络日志(我以重启网站->Python项目进行演示)。

  3. 在Python项目选择一个正在运行项目的栏目 点击 运行中 -> 重启

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

    requests_list

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

    request_details1

  6. 可以在标头看到API请求的地址为{宝塔面板地址}/project/python/RestartProject请求方法为POST。但仅有这些信息还不足以我们成功调用API,我们需要知道后端需要我们提交什么信息,它会返回什么信息。点击负载查看该API请求提交了些什么信息。

    request_details2

  7. 可以看到该API请求携带了一串名为data的json数据(键值对,name为键,home为name键的值{"name":"home"},说明我们只需要更改name的值即可以对指定的python项目进行操作。到这里已经可以进行调用API了,但是后端还有响应数据的规则,我们要了解这个规则才能确保我们数据处理的正确性(你让它重启了,总得知道成没成功吧)。点击响应即可查看响应数据详情。

    request_details3

  8. 可以看到后端返回了一串json数据,包含Boolean类型的statusString类型的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"))

 

结语

学会如何使用浏览器调试器,你不仅能捕抓宝塔面板的API还能捕抓互联网上任何的API!

使用Linux宝塔面板API
CC CCCC BYCC NCCC SA
作者SYLVIA
发布于2026-04-24
许可协议CC BY-NC-SA 4.0


评论(1)

查看评论列表
评论头像
Jason 2026年04月24日

此评论仅作者可见


发表评论