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

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

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

Laravel 操作宝塔面板 API

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

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

代码如下:

<?php
namespace App\Http\Controllers\Custom;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Http;
/**
 * 除了 AddSite GetSSL GetFileBody 外  其他都有返回 "msg"
 * 返回状态 "status" => 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(&#39;custom.bt.key&#39;);
        // 宝塔面板地址 http://xxx.xxx.xxx:2222 填写至端口即可
        $panelPath = config(&#39;custom.bt.panel_path&#39;);
        $time = time();
        $response = Http::withOptions([&#39;verify&#39; => false])
            ->retry(2, 5000) // !!!这里时间不适用于 GetApplyCert 接口
            ->attach(&#39;cookie&#39;, $secretKey, &#39;bt.cookie&#39;) // 随便传东西就行
            ->post($panelPath . $path, array_merge([
                &#39;request_token&#39; => md5($time . &#39;&#39; . md5($secretKey)),
                &#39;request_time&#39; => $time
            ], $query))
            ->json();
        return $response ?: false;
    }
    /**
     * 查询网站
     * @param string|null $search 需要搜索的关键词
     * @return array|false
     */
    public function SiteSearch(string $search = null)
    {
        $search = $search ?: config(&#39;custom.bt.domain&#39;);
        $response = $this->sendRequest(&#39;/data?action=getData&table=sites&#39;, [
            &#39;limit&#39; => 5,
            &#39;search&#39; => $search
        ]);
        // 获取失败
        if (!isset($response[&#39;data&#39;])) return false;
        // 不允许出现相似的网站名
        if (count($response[&#39;data&#39;]) != 1) return false;
        $site = $response[&#39;data&#39;][0];
        return [
            &#39;id&#39; => $site[&#39;id&#39;],
            &#39;name&#39; => $site[&#39;name&#39;],
            &#39;path&#39; => $site[&#39;path&#39;],
            &#39;ps&#39; => $site[&#39;ps&#39;],
            &#39;php&#39; => str_replace(&#39;.&#39;, &#39;&#39;, $site[&#39;php_version&#39;])
        ];
    }
    /**
     * 创建网站
     * !!!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 = [
            &#39;webname&#39; => json_encode([
                &#39;domain&#39; => $domain,
                &#39;domainlist&#39; => [],
                &#39;count&#39; => 0
            ]),
            &#39;path&#39; => config(&#39;custom.bt.site_path&#39;),
            &#39;type_id&#39; => &#39;0&#39;,
            &#39;type&#39; => &#39;PHP&#39;,
            &#39;version&#39; => &#39;74&#39;,
            &#39;port&#39; => &#39;80&#39;,
            &#39;ps&#39; => $domain,
            &#39;ftp&#39; => &#39;false&#39;,
            &#39;sql&#39; => &#39;false&#39;
        ];
        $response = $this->sendRequest(&#39;/site?action=AddSite&#39;, $data);
        return (isset($response[&#39;siteStatus&#39;]) && $response[&#39;siteStatus&#39;] === true) ? (int)$response[&#39;siteId&#39;] : false;
    }
    /**
     * 删除网站
     * @param string $siteName 网站名称 一般是网站域名
     * @return bool
     */
    public function DeleteSite(string $siteName): bool
    {
        $site = $this->SiteSearch($siteName);
        $response = $this->sendRequest(&#39;/site?action=DeleteSite&#39;, [
            &#39;id&#39; => $site[&#39;id&#39;],
            &#39;webname&#39; => $site[&#39;name&#39;]
        ]);
        return isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === true;
    }
    /**
     * 开启网站
     * @param string $siteName 网站名称 一般是网站域名
     * @return bool
     */
    public function SiteStart(string $siteName): bool
    {
        $site = $this->SiteSearch($siteName);
        $response = $this->sendRequest(&#39;/site?action=SiteStart&#39;, [
            &#39;id&#39; => $site[&#39;id&#39;],
            &#39;name&#39; => $site[&#39;name&#39;]
        ]);
        return isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === true;
    }
    /**
     * 关闭网站
     * @param string $siteName 网站名称 一般是网站域名
     * @return bool
     */
    public function SiteStop(string $siteName): bool
    {
        $site = $this->SiteSearch($siteName);
        $response = $this->sendRequest(&#39;/site?action=SiteStop&#39;, [
            &#39;id&#39; => $site[&#39;id&#39;],
            &#39;name&#39; => $site[&#39;name&#39;]
        ]);
        return isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === true;
    }
    /**
     * 为网站绑定域名
     * @param string $siteName 网站名称 一般是网站域名
     * @param string $domain 需要绑定的域名
     * @return bool
     */
    public function AddDomain(string $siteName, string $domain)
    {
        $site = $this->SiteSearch($siteName);
        $response = $this->sendRequest(&#39;/site?action=AddDomain&#39;, [
            &#39;id&#39; => $site[&#39;id&#39;],
            &#39;webname&#39; => $site[&#39;name&#39;],
            &#39;domain&#39; => $domain
        ]);
        // 绑定成功 status === true
        // 绑定失败 和 指定域名已绑定过  都返回 status === false
        // 不好区分 失败 还是 域名已绑定
        return isset($response[&#39;status&#39;]);
    }
    /**
     * 删除网站绑定的域名
     * @param string $siteName 网站名称 一般是网站域名
     * @param string $domain 需要删除的域名
     * @return bool
     */
    public function DelDomain(string $siteName, string $domain)
    {
        $site = $this->SiteSearch($siteName);
        $response = $this->sendRequest(&#39;/site?action=DelDomain&#39;, [
            &#39;id&#39; => $site[&#39;id&#39;],
            &#39;webname&#39; => $site[&#39;name&#39;],
            &#39;port&#39; => &#39;80&#39;,
            &#39;domain&#39; => $domain
        ]);
        return isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === true;
    }
    /**
     * 网站设置SSL证书
     * @param string $domain 站点域名
     * @param string $key
     * @param string $csr
     * @return bool
     */
    public function SetSSL(string $domain, string $key, string $csr): bool
    {
        $data = [
            &#39;type&#39; => 1,
            &#39;siteName&#39; => $domain,
            &#39;key&#39; => &#39;&#39;,
            &#39;csr&#39; => &#39;&#39;
        ];
        $response = $this->sendRequest(&#39;/site?action=SetSSL&#39;, $data);
        return isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === true;
    }
    /**
     * 获取SSL状态及证书详情
     * @param string $domain 站点域名
     * @return string|false 成功则返回证书到期时间
     */
    public function GetSSL(string $domain)
    {
        $data = [
            &#39;siteName&#39; => $domain
        ];
        $response = $this->sendRequest(&#39;/site?action=GetSSL&#39;, $data);
        return (isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === true && $response[&#39;cert_data&#39;]) ? $response[&#39;cert_data&#39;][&#39;notAfter&#39;] : false;
    }
    /**
     * 设置网站运行目录
     * @param int $siteId 站点域名
     * @param string $runPath 运行目录路径
     * @return bool
     */
    public function SetSiteRunPath(int $siteId, string $runPath = &#39;/public&#39;): bool
    {
        $data = [
            &#39;id&#39; => $siteId,
            &#39;runPath&#39; => $runPath
        ];
        $response = $this->sendRequest(&#39;/site?action=SetSiteRunPath&#39;, $data);
        return isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === 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 = [
            &#39;path&#39; => "/www/server/panel/vhost/rewrite/$domain.conf"
        ];
        $response = $this->sendRequest(&#39;/files?action=GetFileBody&#39;, $data);
        return (isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === true) ? $response[&#39;data&#39;] : false;
    }
    /**
     * 保存网站伪静态规则内容(保存文件内容)
     * 0->系统默认路径;1->自定义全路径
     * @param string $domain
     * @param string|null $htaccess
     * @return bool
     */
    public function SaveFileBody(string $domain, string $htaccess = null): bool
    {
        $htaccess = $htaccess ?: config(&#39;custom.bt.htaccess&#39;);
        $data = [
            &#39;path&#39; => "/www/server/panel/vhost/rewrite/$domain.conf", // 伪静态文件路径
            &#39;data&#39; => $htaccess, // 伪静态规则内容 ==> 字符串
            &#39;encoding&#39; => &#39;utf-8&#39;
        ];
        $response = $this->sendRequest(&#39;/files?action=SaveFileBody&#39;, $data);
        return isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === 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(&#39;/acme?action=apply_cert_api&#39;, $data);
//        $response = [
//            &#39;cert&#39; => &#39;&#39;,
//            &#39;root&#39; => &#39;&#39;,
//            &#39;private_key&#39; => &#39;&#39;,
//            &#39;cert_timeout&#39; => 1679184499,
//            &#39;status&#39; => true
//        ];
        if (isset($response[&#39;status&#39;]) && $response[&#39;status&#39;] === true) {
            Storage::put("ssl/$domain.txt", json_encode($response));
            $res = $this->SetSSL($domain, $response[&#39;private_key&#39;], $response[&#39;cert&#39;] . $response[&#39;root&#39;]);
            return $res ? $response[&#39;cert_timeout&#39;] : false;
        }
        return false;
    }
}

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

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