Este texto tem importância apenas para quem deseja fazer seu próprio script ou programa de atualização DDNS para Cloudflare.
Na primeira vez que tentei entender a documentação da API da Cloudflare há um ano eu falhei miseravelmente. Não entendi nada. Na segunda tentativa esta semana eu entendi em minutos. É engraçado como nosso cérebro funciona.
Aqui eu vou descrever apenas as partes necessárias para fazer atualizações DDNS. Vou usar como exemplo o cURL porque aí já aproveito os exemplos da documentação e apesar de ser uma ferramenta popular do Linux você também pode usar o cURL no Windows. Mas eu recomendo usar o complemento POSTMAN do Chrome inserindo os headers indicados (toda linha precedida por “-H” é um header).
O serviço permite que você cadastre vários domínios, que são referenciados como “zonas”.
Para atualizar um host você primeiro precisa do ID do domínio/zona. Se não sabe o id (ele também aparece na sua conta Cloudflare), primeiro peça uma listagem de zonas:
1 2 3 4 |
curl -X GET "https://api.cloudflare.com/client/v4/zones" \ -H "X-Auth-Email: user@example.com" \ -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \ -H "Content-Type: application/json" |
A resposta é algo assim (este é o exemplo oficial. A resposta hoje é ligeiramente diferente):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
{ "success": true, "errors": [], "messages": [], "result": [ { "id": "023e105f4ecef8ad9ca31a8372d0c353", "name": "example.com", "development_mode": 7200, "original_name_servers": [ "ns1.originaldnshost.com", "ns2.originaldnshost.com" ], "original_registrar": "GoDaddy", "original_dnshost": "NameCheap", "created_on": "2014-01-01T05:20:00.12345Z", "modified_on": "2014-01-01T05:20:00.12345Z", "name_servers": [ "tony.ns.cloudflare.com", "woz.ns.cloudflare.com" ], "owner": { "id": "7c5dae5552338874e5053f2534d2767a", "email": "user@example.com", "owner_type": "user" }, "permissions": [ "#zone:read", "#zone:edit" ], "plan": { "id": "e592fd9519420ba7405e1307bff33214", "name": "Pro Plan", "price": 20, "currency": "USD", "frequency": "monthly", "legacy_id": "pro", "is_subscribed": true, "can_subscribe": true }, "plan_pending": { "id": "e592fd9519420ba7405e1307bff33214", "name": "Pro Plan", "price": 20, "currency": "USD", "frequency": "monthly", "legacy_id": "pro", "is_subscribed": true, "can_subscribe": true }, "status": "active", "paused": false, "type": "full" } ], "result_info": { "page": 1, "per_page": 20, "count": 1, "total_count": 2000 } } |
Note que o nome de domínio é precedido por um “id”. É isso que você vai usar.
Para obter os registros DNS com o IP atual para um determinado domínio você usa os mesmos headers, mas muda o URL para algo assim:
https://api.cloudflare.com/client/v4/zones/id_do_dominio/dns_records
Exemplo de resposta (eu suprimi vários registros desnecessários para a explicação e editei informação confidencial):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
{ "result": [ { "id": "####################################", "type": "A", "name": "automalabs.com.br", "content": "192.185.224.99", "proxiable": true, "proxied": true, "ttl": 1, "locked": false, "zone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "zone_name": "automalabs.com.br", "modified_on": "2016-09-13T21:49:36.667689Z", "created_on": "2016-09-13T21:49:36.667689Z", "meta": { "auto_added": true } }, { "id": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", "type": "A", "name": "localhost.automalabs.com.br", "content": "127.0.0.1", "proxiable": false, "proxied": false, "ttl": 1, "locked": false, "zone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "zone_name": "automalabs.com.br", "modified_on": "2016-09-13T21:49:36.745572Z", "created_on": "2016-09-13T21:49:36.745572Z", "meta": { "auto_added": true } }, { "id": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", "type": "A", "name": "batcaverna.automalabs.com.br", "content": "189.70.xx.yyy", "proxiable": true, "proxied": false, "ttl": 120, "locked": false, "zone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "zone_name": "automalabs.com.br", "modified_on": "2017-07-07T04:35:16.994150Z", "created_on": "2017-07-07T04:35:16.994150Z", "meta": { "auto_added": false } }, } ], "result_info": { "page": 1, "per_page": 20, "total_pages": 1, "count": 3, "total_count": 3 }, "success": true, "errors": [], "messages": [] } |
Para se limitar a receber o dados de um host específico (é este o comando que finalmente traz o IP configurado para o host):
https://api.cloudflare.com/client/v4/zones/id_do_dominio/dns_records/id_do_host
Exemplo de resposta:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "result": { "id": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", "type": "A", "name": "batcaverna.automalabs.com.br", "content": "127.0.0.1", "proxiable": false, "proxied": false, "ttl": 120, "locked": false, "zone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "zone_name": "automalabs.com.br", "modified_on": "2017-07-07T04:17:14.185987Z", "created_on": "2017-07-07T04:17:14.185987Z", "meta": { "auto_added": false } }, "success": true, "errors": [], "messages": [] } |
Para atualizar um host (preste atenção aos vários campos que você precisa modificar):
1 2 3 4 5 |
curl -X PUT "https://api.cloudflare.com/client/v4/zones/id_do_dominio/dns_records/id_do_host" \ -H "X-Auth-Email: user_email" \ -H "X-Auth-Key: api_key" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"batcaverna.automalabs.com.br","content":"192.168.0.1","ttl":120,"proxied":false}' |
“name” precisa ter o nome completo e correto do host. Por alguma razão se o nome estiver errado e não bater com id_do_host a API acrescenta um novo host com esse nome, em vez de atualizar.
No Postman, escolha RAW, JSON e insira os dados de uma chave à outra.
Exemplo de resposta:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "result": { "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "type": "A", "name": "batcaverna.automalabs.com.br", "content": "192.168.0.1", "proxiable": false, "proxied": false, "ttl": 120, "locked": false, "zone_id": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", "zone_name": "automalabs.com.br", "modified_on": "2017-07-07T04:03:37.550700Z", "created_on": "2017-07-07T04:03:37.550700Z", "meta": { "auto_added": false } }, "success": true, "errors": [], "messages": [] } |
Tenha em mente que os IDs de domínio e host não mudam se você não apagar a definição do host. Então depois que você tem esses IDs só precisa usar dois comandos: o que verifica os dados do host (se quiser saber o IP que está lá) e o PUT que faz a atualização.
Pronto. Esse é o básico necessário da API para atualização DDNS. Queria ter achado algo assim no ano passado.
Fiz diversas expansões e esclarecimentos no texto.
Se ao usar o Postman para isso você receber uma mensagem de erro dizendo que o Content-Type está errado mas você está vendo que colocou “application/json”, clique em Preview para ver o que o Postman efetivamente vai mandar. Se você ver duas definições de Content-Type, selecione POST e nas opções clique em RAW. Volte para GET e clique em Preview. A definição extra de Content-Type deverá ter sumido.