![]()
API y DNS de Cloudflare
En este ejemplo, usamos una cuenta gratuita de Cloudflare para administrar nuestros registros DNS. Si no tienes una o tu dominio está alojado en otro lugar, puedes transferirlo a Cloudflare o actualizar los servidores de nombres de tu proveedor actual para que apunten a Cloudflare.
Recuperar ID de zona
Una vez que haya iniciado sesión, haga clic en el dominio que desee utilizar.

Luego, desplácese hacia abajo y localice la sección API. Ahora copie el ID de zona y téngalo a mano

ID de zona:
2ba5972166bcdf34935728843955554e
Crear un registro
Ahora, si aún no lo ha creado, haga clic en DNS > Registros a la izquierda y agregue un registro A. Configure el proxy en DESACTIVADO y el TTL en 1 minuto

Generar tokens
A continuación, haz clic en en la parte superior derecha de la pantalla y selecciona Mi perfil

Crear un token de lectura
Ahora crearemos dos tokens: uno de lectura y otro de edición. El primero es necesario para obtener el ID del registro y puede eliminarse posteriormente si es necesario por seguridad.
Haga clic en Crear tokens

Luego la primera opción Editar zona DNS

Ahora, en Permisos, use Zona + DNS + Lectura. Los Recursos de Zona pueden ser una Zona específica si hay varias o, en este caso, usaremos Todas las Zonas .

En la siguiente página de resumen simplemente confirmamos y hacemos clic en Crear token

Ahora podemos ver nuestro token de lectura, que copiamos y anotamos junto con el resto de la información recopilada.

Leer token de API:
WYlmyM9-9xOSBUDue6_sCErhtvHsqv20nhwXylX7
Crear un token de edición
A continuación, repetimos el proceso, excepto que esta vez usamos Zona + DNS + Editar en la sección de permisos


Una vez que tenemos nuestro Token de Edición, copiamos esto también

Editar token de API:
5pXqw0U0ZL6GkahuDaBSwVbSc9tLRZYrUEQMRXiq
Recuperar ID de registro
La última información que necesitamos es el ID de registro, que necesitamos para ejecutar un comando de búsqueda en MikroTik (también es posible a través de Curl en una máquina Linux). Usa el siguiente comando en una terminal y agrega tu ID de zona y el token de API de lectura encontrados anteriormente
/tool/fetch url="https://api.cloudflare.com/client/v4/zones/<ZONE ID>/dns_records" http-header-field="Authorization: Bearer <READ API TOKEN>" http-method=get output=user
/tool/fetch url="https://api.cloudflare.com/client/v4/zones/2ba5972166bcdf34935728843955554e/dns_records" http-header-field="Authorization: Bearer WYlmyM9-9xOSBUDue6_sCErhtvHsqv20nhwXylX7" http-method=get output=user
Una vez ejecutado en MikroTIk proporcionará el siguiente resultado:

Localice la información después de «id»: del registro correspondiente, que será nuestro ID de registro. Cópiela con el resto.

ID de registro:
79e287776ea742f6df0d16cd5073f6cc
Scripts
Ahora podemos completar nuestro script. Habrá un solo script, sin embargo, se ha desglosado a continuación para explicar cada sección
Comprobación de IP pública
Esta parte primero descargará la dirección IP pública mediante el comando fetch y la guardará en un archivo txt llamado newIP.txt
Luego, comprobará si existe un archivo para la IP actual. Esto solo debería ser necesario la primera vez que se ejecuta el script, pero si el archivo se elimina por cualquier motivo, evitará que el script falle al ejecutarse. Si no se encuentra ningún archivo, creará uno nuevo con el comando fetch, como se usó para obtener la IP actualizada, y lo llamará currentIP.txt.
La última etapa es completar las 2 variables ($newIP y $currentIP) a partir del contenido del archivo txt y luego compararlas. Si la nueva es diferente a la anterior, registrará que la IP ha cambiado y actualizará currentIP.txt para la nueva dirección IP.
#Public IP Check
/tool fetch url="http://myip.dnsomatic.com/" mode=http dst-path=newIP.txt
#Check CurrentIP.txt exists
:if ([:len [/file find name=currentIP.txt]] = 0) do={
/tool fetch url="http://myip.dnsomatic.com/" mode=http dst-path=currentIP.txt
}
#Compare New and Existing IP addresses
:local currentIP [file get currentIP.txt contents];
:local newIP [file get newIP.txt contents];
#If different run update script
:if ($newIP != $currentIP) do={
#Log and Save new IP
:log info message="New Pubilc IP: $newIP"
/file set currentIP.txt contents=$newIP
Actualización de CloudFlare
# Define variables
:local apiToken "***<Your API Token>***"
:local zoneID "***<Your Zone ID***"
:local recordID "***<Your Record ID>***"
:local hostname "***<Your DNS record>***"
:local ipAddress "$newIP"
# Validate variables
:if (($apiToken = "") || ($zoneID = "") || ($recordID = "") || ($hostname = "") || ($ipAddress = "")) do={
:log error "One or more variables are not set. Please configure the API token, Zone ID, Record ID, Hostname, and IP address."
:error "Script terminated due to missing variables."
}
# Set the API endpoint
:local url ("https://api.cloudflare.com/client/v4/zones/" . $zoneID . "/dns_records/" . $recordID)
:log info $url
# Prepare JSON payload
:local json "{\
\"type\": \"A\", \
\"name\": \"$hostname\", \
\"content\": \"$ipAddress\", \
\"ttl\": 3600, \
\"proxied\": false\
}"
# Send the request
/tool fetch url=$url http-method=put http-header-field="Authorization: Bearer $apiToken,Content-Type: application/json" http-data="$json" output=user
Script completo
#Public IP Check
/tool fetch url="http://myip.dnsomatic.com/" mode=http dst-path=newIP.txt
#Check CurrentIP.txt exists
:if ([:len [/file find name=currentIP.txt]] = 0) do={
/tool fetch url="http://myip.dnsomatic.com/" mode=http dst-path=currentIP.txt
}
#Compare New and Existing IP addresses
:local currentIP [file get currentIP.txt contents];
:local newIP [file get newIP.txt contents];
#If different run update script
:if ($newIP != $currentIP) do={
#Log and Save new IP
:log info message="New Pubilc IP: $newIP"
/file set currentIP.txt contents=$newIP
# Define variables
:local apiToken "5pXqw0U0ZL6GkahuDaBSwVbSc9tLRZYrUEQMRXiq"
:local zoneID "2ba5972166bcdf34935728843955554e"
:local recordID "79e287776ea742f6df0d16cd5073f6cc"
:local hostname "chr.mikrotikmaster.app"
:local ipAddress "$newIP"
# Validate variables
:if (($apiToken = "") || ($zoneID = "") || ($recordID = "") || ($hostname = "") || ($ipAddress = "")) do={
:log error "One or more variables are not set. Please configure the API token, Zone ID, Record ID, Hostname, and IP address."
:error "Script terminated due to missing variables."
}
# Set the API endpoint
:local url ("https://api.cloudflare.com/client/v4/zones/" . $zoneID . "/dns_records/" . $recordID)
:log info $url
# Prepare JSON payload
:local json "{\
\"type\": \"A\", \
\"name\": \"$hostname\", \
\"content\": \"$ipAddress\", \
\"ttl\": 3600, \
\"proxied\": false\
}"
# Send the request
/tool fetch url=$url http-method=put http-header-field="Authorization: Bearer $apiToken,Content-Type: application/json" http-data="$json" output=user
}

Articulo Original en https://mikrotikmasters.com/
