前言#
カスタムドメインを Cloudflare Workers にバインドするために、再度ドメイン解析を Cloudflare にホストしました;
しかし、解析レコードをインポートする際に、なぜか大量のレコードが出現し、約 200 件近くになりました;
一つずつ削除するのは面倒なので、API を使ってバッチ操作を研究することにしました;
おすすめ:
「折腾」2021 年末にまだ完備されていない画像ホスティングソリューションについて_コンピュータネットワーク_沈冰浮水
「折腾」Caddy 簡易入門チュートリアル_コンピュータネットワーク_沈冰浮水
「折腾」Git Submodule 探究_コンピュータネットワーク_沈冰浮水
公式ライブラリとドキュメント#
cloudflare/cloudflare-php: Cloudflare v4 API 用の PHP ライブラリ:
Cloudflare PHP API バインディング – Cloudflare ヘルプセンター:
https://support.cloudflare.com/hc/en-us/articles/115001661191
公式には PHP 言語の SDK があり、それを基に便利に使えるクラスがラップされています;
このツールは、最近試した hexo プラグインと共通点があり、どちらのドキュメントも非常に苦痛です;
過去と未来において、この苦痛を何度も乗り越えるしかない、あるいは倒れるしかない。。
鑑定#
API トークン | Cloudflare:https://dash.cloudflare.com/profile/api-tokens
↑ 実際に使用するのはアカウントのメールアドレスと「Global API Key」で、全権限のようです。「API トークン」は権限を細分化するために使用され、コード内での使用方法はまだよくわかりません;
相対的に一般的なクラスラップ#
require __DIR__ . "/vendor/autoload.php";
use Cloudflare\API\Auth\APIKey;
use Cloudflare\API\Adapter\Guzzle;
use Cloudflare\API\Endpoints\User;
use Cloudflare\API\Endpoints\Zones;
use Cloudflare\API\Endpoints\DNS;
class CloudFlare
{
public $errCode = 0;
public $errMsg = '';
// ----
private $errInfos = array(
0 => 'エラーなし',
1 => '認証情報が空または誤り *'
);
private $options = array();
private $oAPIKey = null;
private $oAdapter = null;
private $oUser = null;
private $oZones = null;
private $oDNS = null;
// ----
// 初期化
public function __construct($options)
{
$this->options = $options;
$bolOK = $this->checkOptions();
if ($bolOK) {
$this->initAPI();
}
}
// ユーザー基本クラスの初期化
public function initUser()
{
if ($this->oUser !== null) {
return $this->oUser;
}
$this->oUser = new User($this->oAdapter);
return $this->oUser;
}
// ドメイン基本クラスの初期化
public function initZones()
{
if ($this->oZones !== null) {
return $this->oZones;
}
$this->oZones = new Zones($this->oAdapter);
return $this->oZones;
}
// DNS 基本クラスの初期化
public function initDNS()
{
if ($this->oDNS !== null) {
return $this->oDNS;
}
$this->oDNS = new DNS($this->oAdapter);
return $this->oDNS;
}
// ドメインリストの取得
public function listZones()
{
$oZones = $this->initZones();
return $oZones->listZones();
}
// 指定ドメインの DNS レコードを取得
public function listRecords($zoneID)
{
$oDNS = $this->initDNS();
return $oDNS->listRecords($zoneID);
}
// DNS レコードを削除
public function deleteRecord($zoneID, $recordID)
{
$oDNS = $this->initDNS();
return $oDNS->deleteRecord($zoneID, $recordID);
}
// ----
// API の初期化
private function initAPI()
{
if ($this->oAPIKey === null || $this->oAdapter === null) {
$cf_email = $this->options['cf_email'];
$cf_key = $this->options['cf_key'];
$oAPIKey = new APIKey($cf_email, $cf_key);
$oAdapter = new Guzzle($oAPIKey);
$this->oAPIKey = $oAPIKey;
$this->oAdapter = $oAdapter;
}
}
// 設定の確認
private function checkOptions()
{
foreach ($this->options as $key => $value) {
if (empty($value)) {
$this->errCode = 1;
$this->errMsg = "設定項目 {$key} は空にできません";
return false;
}
}
return true;
}
}
上層ラップ#
インターフェースや設定項目は Z-BlogPHP に慣れているので、プラグインを作成して公開することもできます;
しかし、私は単に DNS 解析を一掃したいだけで、このプラグインには他にどんな用途があるのかも非常に疑問です;
以下は使用例に過ぎず、Z-BlogPHP プラグイン版を公開するかどうかも少し悩んでいます;
さらには DNSPod なども一つのプラグインにまとめることや、半完成品のプラグインを Git に含めるべきかどうかも考えています;
// 初期化
function CloudFlare_Init()
{
global $zbp;
// ----
$cf_email = $zbp->Config('CloudFlare')->cf_email;
$cf_key = $zbp->Config('CloudFlare')->cf_key;
$cf_token = $zbp->Config('CloudFlare')->cf_token;
// ----
$options = array(
'cf_email' => $cf_email,
'cf_key' => $cf_key,
'cf_token' => $cf_token,
);
// ----
$cf = new CloudFlare($options);
return $cf;
}
// ドメインリストの取得
function CloudFlare_ListDomins()
{
$cf = CloudFlare_Init();
if ($cf->errCode !== 0) {
return "<td rolspan=\"3\">{$cf->errMsg}</td>";
}
$tpl = file_get_contents(mz_DNMng_Path('cf_dm_list'));
$rltHTML = '';
$listZones = $cf->listZones();
foreach ($listZones->result as $zone) {
$rltHTML .= $tpl;
$rltHTML = str_replace('{id}', $zone->id, $rltHTML);
$rltHTML = str_replace('{name}', $zone->name, $rltHTML);
$rltHTML = str_replace('{status}', $zone->status, $rltHTML);
$rltHTML = str_replace('{plan_name}', $zone->plan->name, $rltHTML);
}
return $rltHTML;
}
// 指定ドメインの DNS レコードを取得
function CloudFlare_ListRecords($zoneID)
{
global $zbp;
$cf = CloudFlare_Init();
if ($cf->errCode !== 0) {
return "<td rolspan=\"3\">{$cf->errMsg}</td>";
}
$tpl = file_get_contents(mz_DNMng_Path('cf_recd_list'));
$csrfToken = $zbp->GetCSRFToken();
$rltHTML = '';
$listRecords = $cf->listRecords($zoneID);
foreach ($listRecords->result as $record) {
$rltHTML .= $tpl;
$rltHTML = str_replace('{name}', $record->name, $rltHTML);
$rltHTML = str_replace('{type}', $record->type, $rltHTML);
$rltHTML = str_replace('{content}', $record->content, $rltHTML);
$rltHTML = str_replace('{zone_id}', $record->zone_id, $rltHTML);
$rltHTML = str_replace('{id}', $record->id, $rltHTML);
$rltHTML = str_replace('{csrfToken}', $csrfToken, $rltHTML);
}
return $rltHTML;
}
// DNS レコードを削除
function CloudFlare_DelRecord($zoneID, $recordID)
{
$cf = CloudFlare_Init();
if ($cf->errCode !== 0) {
return false;
}
$rlt = $cf->deleteRecord($zoneID, $recordID);
return $rlt;
}
// DNS レコードをクリア
function CloudFlare_ClearRecords($zoneID)
{
$cf = CloudFlare_Init();
if ($cf->errCode !== 0) {
return false;
}
$listRecords = $cf->listRecords($zoneID);
foreach ($listRecords->result as $record) {
// $zoneName = $record->zone_name;
$zoneID = $record->zone_id;
$recordID = $record->id;
$cf->deleteRecord($zoneID, $recordID);
}
return $cf->errCode === 0 ? true : false;
}