本文由Laravel教程欄目給大家介紹laravel+寶塔面板的相關(guān)知識(shí),主要給大家分享Laravel是怎么操作寶塔面板API,下面就帶大家一起來看看,希望對(duì)需要的朋友有所幫助!
Laravel 操作寶塔面板 API
不一樣的地方根據(jù)自身業(yè)務(wù)修改?。?!
其他的接口請(qǐng)查看官方文檔:https://www.bt.cn/api-doc.pdf。
代碼如下:
<?php namespace AppHttpControllersCustom; use AppHttpControllersController; use IlluminateSupportFacadesHttp; /** * 除了 AddSite GetSSL GetFileBody 外 其他都有返回 "msg" * 返回狀態(tài) "status" => true/false "msg" => "申請(qǐng)成功!" * 官方API文檔 https://www.bt.cn/api-doc.pdf */ class BtPanel extends Controller { /** * 發(fā)送請(qǐng)求 * @param string $path /data?action=getData&table=sites 請(qǐng)求路徑 * @param array $query 請(qǐng)求參數(shù) */ 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) // !!!這里時(shí)間不適用于 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; } /** * 查詢網(wǎng)站 * @param string|null $search 需要搜索的關(guān)鍵詞 * @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; // 不允許出現(xiàn)相似的網(wǎng)站名 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']) ]; } /** * 創(chuàng)建網(wǎng)站 * ?。。S: 使用API創(chuàng)建網(wǎng)站時(shí) 最好 不要?jiǎng)?chuàng)建相似網(wǎng)站名的網(wǎng)站 不然查詢時(shí)有些麻煩 * @param string $domain 網(wǎng)站域名 * @param [type] json webname 網(wǎng)站域名 * @param [type] string path 網(wǎng)站路徑 /www/wwwroot/www.baidu.com * @param [type] integer type_id 網(wǎng)站分類ID * @param [type] string type 網(wǎng)站類型 PHP/JAVA * @param [type] string version PHP版本 73/74 * @param [type] string port 網(wǎng)站端口 * @param [type] string ps 網(wǎng)站備注 * @param [type] bool ftp 是否創(chuàng)建FTP * @param [type] string ftp_username FTP用戶名 // ftp為true必傳 * @param [type] string ftp_password FTP密碼 // ftp為true必傳 * @param [type] bool sql 是否創(chuàng)建數(shù)據(jù)庫(kù) * @param [type] string codeing 數(shù)據(jù)庫(kù)編碼類型 utf8|utf8mb4|gbk|big5 // sql為true必傳 * @param [type] string datauser 數(shù)據(jù)庫(kù)賬號(hào) // sql為true必傳 * @param [type] string datapassword 數(shù)據(jù)庫(kù)密碼 // 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; } /** * 刪除網(wǎng)站 * @param string $siteName 網(wǎng)站名稱 一般是網(wǎng)站域名 * @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; } /** * 開啟網(wǎng)站 * @param string $siteName 網(wǎng)站名稱 一般是網(wǎng)站域名 * @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; } /** * 關(guān)閉網(wǎng)站 * @param string $siteName 網(wǎng)站名稱 一般是網(wǎng)站域名 * @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; } /** * 為網(wǎng)站綁定域名 * @param string $siteName 網(wǎng)站名稱 一般是網(wǎng)站域名 * @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 // 不好區(qū)分 失敗 還是 域名已綁定 return isset($response['status']); } /** * 刪除網(wǎng)站綁定的域名 * @param string $siteName 網(wǎng)站名稱 一般是網(wǎng)站域名 * @param string $domain 需要?jiǎng)h除的域名 * @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; } /** * 網(wǎng)站設(shè)置SSL證書 * @param string $domain 站點(diǎn)域名 * @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狀態(tài)及證書詳情 * @param string $domain 站點(diǎn)域名 * @return string|false 成功則返回證書到期時(shí)間 */ 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; } /** * 設(shè)置網(wǎng)站運(yùn)行目錄 * @param int $siteId 站點(diǎn)域名 * @param string $runPath 運(yùn)行目錄路徑 * @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; } /** * 獲取網(wǎng)站預(yù)置偽靜態(tài)規(guī)則內(nèi)容(文件內(nèi)容) * @param string $domain 網(wǎng)站域名 * @param [type] $type 0->獲取內(nèi)置偽靜態(tài)規(guī)則 /www/server/panel/rewrite/nginx/xxxxx.conf;1->獲取當(dāng)前站點(diǎn)偽靜態(tài)規(guī)則 /www/server/panel/vhost/rewrite/www.baidu.com.conf * @return string|false 成功則返回偽靜態(tài)規(guī)則內(nèi)容 */ 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; } /** * 保存網(wǎng)站偽靜態(tài)規(guī)則內(nèi)容(保存文件內(nèi)容) * 0->系統(tǒng)默認(rèn)路徑;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", // 偽靜態(tài)文件路徑 'data' => $htaccess, // 偽靜態(tài)規(guī)則內(nèi)容 ==> 字符串 'encoding' => 'utf-8' ]; $response = $this->sendRequest('/files?action=SaveFileBody', $data); return isset($response['status']) && $response['status'] === true; } /** * 網(wǎng)站申請(qǐng)并設(shè)置SSL證書 * ?。。S:當(dāng)前請(qǐng)求比較耗時(shí)間 20s-60s不等 最好單獨(dú)使用 * @param int $id 站點(diǎn)ID * @param string $domain 需要申請(qǐng)的域名 * @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; } }
登錄后復(fù)制
推薦學(xué)習(xí):《laravel視頻教程》《寶塔使用教程》