您好,登錄后才能下訂單哦!
今天小編給大家分享一下Laravel如何操作寶塔面板API的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Laravel 操作寶塔面板 API
代碼如下:
<?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('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如何操作寶塔面板API”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。