分享Laravel是怎么操作宝塔面板API

本文由laravel教程栏目给大家介绍laravel+宝塔面板的相关知识,主要给大家分享laravel是怎么操作宝塔面板api,下面就带大家一起来看看,希望对需要的朋友有所帮助!

分享Laravel是怎么操作宝塔面板API

Laravel 操作宝塔面板 API

不一样的地方根据自身业务修改!!!

其他的接口请查看官方文档:https://www.bt.cn/api-doc.pdf。

代码如下:

 true/false  "msg" => "申请成功!" * 官方API文档  https://www.bt.cn/api-doc.pdf */class BtPanel extends Controller{    /**     * 发送请求     * @param string $path /data?action=getData&table=sites 请求路径     * @param array $query 请求参数     */    private function sendRequest(string $path, array $query)    {        // 宝塔面板秘钥        $secretKey = config('custom.bt.key');        // 宝塔面板地址 http://xxx.xxx.xxx:2222 填写至端口即可        $panelPath = config('custom.bt.panel_path');        $time = time();        $response = Http::withOptions(['verify' => false])            ->retry(2, 5000) // !!!这里时间不适用于 GetApplyCert 接口            ->attach('cookie', $secretKey, 'bt.cookie') // 随便传东西就行            ->post($panelPath . $path, array_merge([                'request_token' => md5($time . '' . md5($secretKey)),                'request_time' => $time            ], $query))            ->json();        return $response ?: false;    }    /**     * 查询网站     * @param string|null $search 需要搜索的关键词     * @return array|false     */    public function SiteSearch(string $search = null)    {        $search = $search ?: config('custom.bt.domain');        $response = $this->sendRequest('/data?action=getData&table=sites', [            'limit' => 5,            'search' => $search        ]);        // 获取失败        if (!isset($response['data'])) return false;        // 不允许出现相似的网站名        if (count($response['data']) != 1) return false;        $site = $response['data'][0];        return [            'id' => $site['id'],            'name' => $site['name'],            'path' => $site['path'],            'ps' => $site['ps'],            'php' => str_replace('.', '', $site['php_version'])        ];    }    /**     * 创建网站     * !!!PS: 使用API创建网站时  最好 不要创建相似网站名的网站  不然查询时有些麻烦     * @param string $domain 网站域名     * @param [type] json webname        网站域名     * @param [type] string path         网站路径 /www/wwwroot/www.baidu.com     * @param [type] integer type_id     网站分类ID     * @param [type] string type         网站类型 PHP/JAVA     * @param [type] string version      PHP版本 73/74     * @param [type] string port         网站端口     * @param [type] string ps           网站备注     * @param [type] bool ftp            是否创建FTP     * @param [type] string ftp_username  FTP用户名 // ftp为true必传     * @param [type] string ftp_password  FTP密码  // ftp为true必传     * @param [type] bool sql            是否创建数据库     * @param [type] string codeing      数据库编码类型 utf8|utf8mb4|gbk|big5  // sql为true必传     * @param [type] string datauser     数据库账号 // sql为true必传     * @param [type] string datapassword 数据库密码 // sql为true必传     * @return false|int     */    public function AddSite(string $domain)    {        $data = [            'webname' => json_encode([                'domain' => $domain,                'domainlist' => [],                'count' => 0            ]),            'path' => config('custom.bt.site_path'),            'type_id' => '0',            'type' => 'PHP',            'version' => '74',            'port' => '80',            'ps' => $domain,            'ftp' => 'false',            'sql' => 'false'        ];        $response = $this->sendRequest('/site?action=AddSite', $data);        return (isset($response['siteStatus']) && $response['siteStatus'] === true) ? (int)$response['siteId'] : false;    }    /**     * 删除网站     * @param string $siteName 网站名称 一般是网站域名     * @return bool     */    public function DeleteSite(string $siteName): bool    {        $site = $this->SiteSearch($siteName);        $response = $this->sendRequest('/site?action=DeleteSite', [            'id' => $site['id'],            'webname' => $site['name']        ]);        return isset($response['status']) && $response['status'] === true;    }    /**     * 开启网站     * @param string $siteName 网站名称 一般是网站域名     * @return bool     */    public function SiteStart(string $siteName): bool    {        $site = $this->SiteSearch($siteName);        $response = $this->sendRequest('/site?action=SiteStart', [            'id' => $site['id'],            'name' => $site['name']        ]);        return isset($response['status']) && $response['status'] === true;    }    /**     * 关闭网站     * @param string $siteName 网站名称 一般是网站域名     * @return bool     */    public function SiteStop(string $siteName): bool    {        $site = $this->SiteSearch($siteName);        $response = $this->sendRequest('/site?action=SiteStop', [            'id' => $site['id'],            'name' => $site['name']        ]);        return isset($response['status']) && $response['status'] === true;    }    /**     * 为网站绑定域名     * @param string $siteName 网站名称 一般是网站域名     * @param string $domain 需要绑定的域名     * @return bool     */    public function AddDomain(string $siteName, string $domain)    {        $site = $this->SiteSearch($siteName);        $response = $this->sendRequest('/site?action=AddDomain', [            'id' => $site['id'],            'webname' => $site['name'],            'domain' => $domain        ]);        // 绑定成功 status === true        // 绑定失败 和 指定域名已绑定过  都返回 status === false        // 不好区分 失败 还是 域名已绑定        return isset($response['status']);    }    /**     * 删除网站绑定的域名     * @param string $siteName 网站名称 一般是网站域名     * @param string $domain 需要删除的域名     * @return bool     */    public function DelDomain(string $siteName, string $domain)    {        $site = $this->SiteSearch($siteName);        $response = $this->sendRequest('/site?action=DelDomain', [            'id' => $site['id'],            'webname' => $site['name'],            'port' => '80',            'domain' => $domain        ]);        return isset($response['status']) && $response['status'] === true;    }    /**     * 网站设置SSL证书     * @param string $domain 站点域名     * @param string $key     * @param string $csr     * @return bool     */    public function SetSSL(string $domain, string $key, string $csr): bool    {        $data = [            'type' => 1,            'siteName' => $domain,            'key' => '',            'csr' => ''        ];        $response = $this->sendRequest('/site?action=SetSSL', $data);        return isset($response['status']) && $response['status'] === true;    }    /**     * 获取SSL状态及证书详情     * @param string $domain 站点域名     * @return string|false 成功则返回证书到期时间     */    public function GetSSL(string $domain)    {        $data = [            'siteName' => $domain        ];        $response = $this->sendRequest('/site?action=GetSSL', $data);        return (isset($response['status']) && $response['status'] === true && $response['cert_data']) ? $response['cert_data']['notAfter'] : false;    }    /**     * 设置网站运行目录     * @param int $siteId 站点域名     * @param string $runPath 运行目录路径     * @return bool     */    public function SetSiteRunPath(int $siteId, string $runPath = '/public'): bool    {        $data = [            'id' => $siteId,            'runPath' => $runPath        ];        $response = $this->sendRequest('/site?action=SetSiteRunPath', $data);        return isset($response['status']) && $response['status'] === true;    }    /**     * 获取网站预置伪静态规则内容(文件内容)     * @param string $domain 网站域名     * @param [type] $type 0->获取内置伪静态规则 /www/server/panel/rewrite/nginx/xxxxx.conf;1->获取当前站点伪静态规则 /www/server/panel/vhost/rewrite/www.baidu.com.conf     * @return string|false 成功则返回伪静态规则内容     */    public function GetFileBody(string $domain)    {        $data = [            'path' => "/www/server/panel/vhost/rewrite/$domain.conf"        ];        $response = $this->sendRequest('/files?action=GetFileBody', $data);        return (isset($response['status']) && $response['status'] === true) ? $response['data'] : false;    }    /**     * 保存网站伪静态规则内容(保存文件内容)     * 0->系统默认路径;1->自定义全路径     * @param string $domain     * @param string|null $htaccess     * @return bool     */    public function SaveFileBody(string $domain, string $htaccess = null): bool    {        $htaccess = $htaccess ?: config('custom.bt.htaccess');        $data = [            'path' => "/www/server/panel/vhost/rewrite/$domain.conf", // 伪静态文件路径            'data' => $htaccess, // 伪静态规则内容 ==> 字符串            'encoding' => 'utf-8'        ];        $response = $this->sendRequest('/files?action=SaveFileBody', $data);        return isset($response['status']) && $response['status'] === true;    }    /**     * 网站申请并设置SSL证书     * !!!PS:当前请求比较耗时间 20s-60s不等  最好单独使用     * @param int $id 站点ID     * @param string $domain 需要申请的域名     * @return bool|integer     */    public function GetApplyCert(int $id, string $domain)    {        $data = [            "domains" => json_encode([$domain]),            "auth_type" => "http",            "auto_wildcard" => 0,            "auth_to" => $id,            "id" => $id,            "siteName" => $domain        ];        $response = $this->sendRequest('/acme?action=apply_cert_api', $data);//        $response = [//            'cert' => '',//            'root' => '',//            'private_key' => '',//            'cert_timeout' => 1679184499,//            'status' => true//        ];        if (isset($response['status']) && $response['status'] === true) {            Storage::put("ssl/$domain.txt", json_encode($response));            $res = $this->SetSSL($domain, $response['private_key'], $response['cert'] . $response['root']);            return $res ? $response['cert_timeout'] : false;        }        return false;    }}

推荐学习:《laravel视频教程》《宝塔使用教程》

以上就是分享Laravel是怎么操作宝塔面板API的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/66171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月12日 05:06:51
下一篇 2025年11月12日 05:35:23

相关推荐

  • Laravel开发:如何在编辑界面正确预选数据库中的多选标签

    本文旨在解决laravel应用中编辑界面多选(select multiple)标签无法自动预选数据库中已保存数据的问题。通过详细讲解控制器层的数据准备和视图层的条件渲染逻辑,我们将展示如何利用blade模板引擎和eloquent关系,确保用户在编辑时能直观看到并修改此前选择的标签,同时提供最佳实践,…

    2025年12月23日
    000
  • Laravel Blade 条件渲染:根据数据状态控制 HTML 元素显示

    本文将介绍在 laravel blade 模板中如何根据数据变量的值是否为空或不存在,来有条件地渲染 html 元素,例如 ` ` 标签。通过利用 blade 的 `@if` 指令结合 php 的 `empty()` 函数,开发者可以确保只有当数据有效时才显示相关内容,从而避免渲染空标签或不必要的信…

    2025年12月23日
    000
  • JavaScript按钮实现PUT/POST重定向与数据提交:模拟表单行为的教程

    本教程详细讲解如何通过JavaScript动态创建并提交隐藏表单,以实现从按钮点击触发的PUT或POST请求重定向,并携带请求体数据。这种方法无需使用`fetch` API,能够满足浏览器自动处理Cookie的需求,为需要模拟完整表单提交行为的场景提供了有效的解决方案。 引言:理解PUT/POST重…

    2025年12月23日
    000
  • PHP多语言网站:语言切换与内容翻译的最佳实践

    本教程旨在指导开发者如何在php项目中实现健壮的多语言切换功能。文章详细介绍了基于会话(session)的语言状态管理、通过url参数进行语言切换的方法,并提出了一套功能完善的辅助函数来加载和安全地检索翻译内容,从而有效避免常见的“未定义变量”或“非法字符串偏移”错误。通过结构化的代码示例和最佳实践…

    2025年12月23日
    000
  • 优化长HTML属性值:SonarQube警告与实用策略

    本文探讨html表单`action`属性过长导致sonarqube警告的问题,并提供三种解决方案:优化url结构、通过变量预构建url,以及灵活评估代码规范。重点推荐使用变量预构建url,以提升代码可读性和维护性,同时兼顾静态分析工具的建议与实际开发需求。 引言:处理HTML长属性值的挑战 在现代W…

    2025年12月23日
    000
  • 使用JavaScript从按钮触发GET重定向或模拟POST/PUT提交的教程

    本教程详细介绍了如何通过JavaScript从按钮触发客户端重定向,以实现类似表单提交的效果,同时确保浏览器Cookie的正常处理。文章涵盖了两种主要方法:一是使用location.href进行带查询参数的GET重定向,适用于简单的导航或GET请求触发的动作;二是通过动态创建和提交隐藏表单来模拟PO…

    2025年12月23日
    000
  • Mac Valet一键站点,HTML+CSS开发环境王者!

    首先确认Valet服务已安装并运行,通过valet install和valet start初始化;使用valet park将项目目录设为可自动访问的本地根目录,新增项目即享.test域名;对独立项目可用valet link绑定自定义.test域名;为优化静态文件支持,在项目根目录创建.valet/s…

    2025年12月23日
    000
  • 优化HTML表单action属性:应对代码规范与长URL挑战

    本文探讨了在html表单中处理过长action url的有效策略,以满足代码规范工具如sonarcloud的行长度限制。针对直接换行无效的问题,文章提出了三种解决方案:优化url结构使其更简洁、在后端预处理并动态生成url,以及灵活评估代码规范的适用性。旨在帮助开发者在保持代码整洁的同时,有效管理复…

    2025年12月23日
    000
  • 如何有效隐藏或保护网页链接URL

    本文深入探讨了在网页中隐藏或保护链接URL的多种策略,从前端的视觉模糊处理到后端服务器的安全实现。文章详细阐述了通过HTML和CSS进行链接视觉隐藏的局限性,并重点介绍了针对下载链接或敏感资源,如何利用服务器端技术(如临时签名URL、代理下载)来提供更高级别的URL保护,确保用户无法直接获取或滥用原…

    2025年12月23日
    000
  • 单页应用结构:在index.html中管理多页面内容

    本文探讨了在单个`index.html`文件中实现多页面体验的多种策略。从利用现代前端javascript框架的组件化与路由功能,到纯粹通过html、css和javascript控制内容显示与动态加载,再到结合服务器端渲染构建单页应用,文章详细介绍了各种技术途径,旨在帮助开发者在不创建多个物理htm…

    2025年12月23日
    000
  • Laravel Blade模板中动态表格删除按钮ID传递问题解决方案

    针对laravel应用中动态表格删除操作时,bootstrap模态框始终获取第一个记录id的问题,本文提供了一种解决方案。通过将模态框定义在循环外部,并利用javascript动态捕获点击按钮的记录id,然后更新模态框内确认删除按钮的id值,确保每次删除操作都针对正确的记录。 在开发基于Larave…

    2025年12月23日
    000
  • Laravel教程:实现编辑表单中select标签的数据库数据预选功能

    本文详细介绍了在Laravel编辑界面中,如何根据数据库中已保存的数据,自动预选`select`标签(特别是多选`select`)中的选项。核心在于后端控制器准备已关联数据的ID集合,并在前端Blade模板中,通过循环遍历所有可用选项时,有条件地添加`selected`属性,确保用户在编辑时能直观看…

    2025年12月23日
    000
  • Laravel 中实现数据库数据在 标签的动态预选

    本文详细介绍了如何在 Laravel 应用的编辑界面中,实现 “ 标签根据数据库中已保存的数据自动预选相应选项。通过控制器获取当前记录及其关联数据,并在 Blade 视图中利用条件逻辑动态添加 `selected` 属性,确保用户在编辑时能直观看到并修改之前的选择,同时提供了后端数据处理…

    2025年12月23日
    000
  • Laravel多选框数据编辑:如何预选中已保存的关联数据

    本文旨在解决laravel应用中编辑界面多选框(`select multiple`)数据预选的问题。当编辑一个已存在的记录时,如何确保多选框自动选中该记录已关联的数据,而非全部选中或全部不选。我们将通过控制器数据准备和视图条件渲染相结合的方式,实现这一功能,提升用户体验。 引言 在构建Laravel…

    2025年12月23日
    000
  • Laravel 编辑界面:根据数据库数据预选 SELECT 标签选项教程

    本教程旨在解决 laravel 编辑界面中 `select` 标签未能自动预选数据库中已有数据的问题。我们将通过在控制器中获取当前数据关联的选项,并在视图层利用条件判断逻辑,动态地为 “ 元素添加 `selected` 属性,确保用户在编辑时能直观看到已选内容,提升用户体验。 在开发 L…

    2025年12月23日
    000
  • 构建单页Web应用:将多页面内容集成至单个HTML文件的策略与实践

    本文探讨了将多个“页面”内容集成到单个html文件中的多种策略,以实现流畅的单页应用(spa)体验。内容涵盖了利用现代前端框架进行组件化开发、通过纯html/css/javascript实现内容动态切换,以及结合服务器端语言进行动态内容渲染的方法,旨在帮助开发者根据项目需求选择最合适的解决方案。 在…

    2025年12月23日
    000
  • 在单个HTML文件中构建多页面体验的策略与实现

    本文探讨了在不创建多个html文件的情况下,如何在单个`index.html`中实现多页面效果的多种策略。我们将深入研究利用前端javascript框架的组件化、纯html/css/javascript的内容切换技术,以及结合后端语言构建单页应用的方案,旨在提供清晰的实现路径和选择建议。 在现代网页…

    2025年12月23日 好文分享
    000
  • 构建安全会员系统与内容保护策略:基于会话与DRM的实践指南

    本教程详细阐述了如何通过会话(session)和cookie机制实现用户登录认证,从而有效限制网站内容的访问权限。同时,针对视频等流媒体内容,文章介绍了数字版权管理(drm)技术,如widevine、playready和fairplay,以应对授权用户复制的挑战,确保数字资产的安全性与独占性。 在构…

    2025年12月23日
    000
  • W3C HTML规范中的“处理器”:深入理解其软件解析角色

    在w3c html规范中,“处理器”指的是解析和解释html(或xml)文档的软件实体,而非硬件中央处理器(cpu)。它代表了一类能够处理标记语言的应用程序或其组成部分,其范围远超传统网页浏览器,包括各种开发工具、服务器端渲染器等,旨在确保对标准内容的正确解读和处理,从而实现跨平台和工具的兼容性。 …

    2025年12月23日
    000
  • JavaScript动态生成带索引名称的表单元素教程

    本教程旨在指导开发者如何使用javascript动态生成带有递增索引名称的表单元素,以满足在网页中添加可重复数据输入块的需求。文章将详细介绍如何利用全局计数器、模板字符串以及`insertadjacenthtml`方法,高效且清晰地实现表单字段的动态创建与管理,确保数据提交时能以结构化数组形式被后端…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信