[C#] 透過程式 新增/刪除/修改 Cloudflare 中的 DNS Record

2020-10-28

上一篇文章 取得在 Cloudflare 中的 DNS Records ,我們拿到了 Cloudflare 的 Zone Id , API Token 也成功取得了 DNS Record 記錄們,接下來我們要來自己新增/刪除/修改他們




1. 新增紀錄 ,目標我要新增一個 A 紀錄為  demo1 ,讓我的sample.com 擁有一個 demo1.sample.com 指向 163.13.202.22 ,官方網站給的案例是

curl -X POST "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records" \ -H "X-Auth-Email: user@example.com" \ -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"example.com","content":"127.0.0.1","ttl":120,"priority":10,"proxied":false}'
這時候我們必須要傳一個物件進去,這邊我準備好了

public class AddDNSRequest { public string type { get; set; } public string name { get; set; } public string content { get; set; } public int ttl { get; set; } public int priority { get; set; } public bool proxied { get; set; } }

這時候就是呼叫的 C# Code ,回應的 JSON 我放在註解裡面

HttpClient clientGetZones = new HttpClient(); clientGetZones.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //clientGetZones.DefaultRequestHeaders.Add("Authorization", " Bearer [API TOKEN]"); clientGetZones.DefaultRequestHeaders.Add("Authorization", " Bearer abcdedghijklmnopQRSTUV_ABCD_ggggPqCD"); //var url1 = "https://api.cloudflare.com/client/v4/zones/[ZONE_ID]/dns_records"; var url1 = "https://api.cloudflare.com/client/v4/zones/2836714271b942af9386532b00b5579c/dns_records"; HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, url1); var req = new AddDNSRequest(); req.name = "demo1"; req.proxied = true; req.type = "A"; req.content = "163.13.202.22"; requestMessage.Content = new StringContent(JsonConvert.SerializeObject(req), Encoding.UTF8, "application/json"); HttpResponseMessage response = clientGetZones.SendAsync(requestMessage).GetAwaiter().GetResult(); var res = response.Content.ReadAsStringAsync().Result.ToString(); ltlResult.Text = JsonConvert.SerializeObject(res); //result //{"id":"52991924ec82a967d45caab25cbf6a90","zone_id":"2836714271b942af9386532b00b5579c","zone_name":"sample.com","name":"demo1.sample.com","type":"A","content":"163.13.202.22","proxiable":true,"proxied":true,"ttl":1,"locked":false,"meta":{"auto_added":false,"managed_by_apps":false,"managed_by_argo_tunnel":false,"source":"primary"},"created_on":"2020-10-28T01:46:39.057696Z","modified_on":"2020-10-28T01:46:39.057696Z"},"success":true,"errors":[],"messages":[]}"

Reference : https://api.cloudflare.com/#dns-records-for-a-zone-create-dns-record

2. 承襲第一點,我要修改 demo1  的紀錄 將指向改到 163.13.202.11 ,每一紀錄都會有獨立編號ID,可以針對該ID修傳遞物件跟第一個一樣,但是要用 HTTP PUT

官方案例 curl

curl -X PUT "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/372e67954025e0ba6aaa6d586b9e0b59" \ -H "X-Auth-Email: user@example.com" \ -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \ -H "Content-Type: application/json" \ --data '{"type":"A","name":"example.com","content":"127.0.0.1","ttl":120,"proxied":false}'

C# Code

HttpClient clientGetZones = new HttpClient(); clientGetZones.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //clientGetZones.DefaultRequestHeaders.Add("Authorization", " Bearer [API TOKEN]"); clientGetZones.DefaultRequestHeaders.Add("Authorization", " Bearer abcdedghijklmnopQRSTUV_ABCD_ggggPqCD"); //var url1 = "https://api.cloudflare.com/client/v4/zones/[ZONE ID]/dns_records/[RECORD ID]"; var url1 = "https://api.cloudflare.com/client/v4/zones/2836714271b942af9386532b00b5579c/dns_records/52991924ec82a967d45caab25cbf6a90"; HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Put, url1); var req = new AddDNSRequest(); req.name = "demo1"; req.proxied = true; req.type = "A"; req.content = "163.13.202.11"; requestMessage.Content = new StringContent(JsonConvert.SerializeObject(req), Encoding.UTF8, "application/json"); HttpResponseMessage response = clientGetZones.SendAsync(requestMessage).GetAwaiter().GetResult(); var res = response.Content.ReadAsStringAsync().Result.ToString(); ltlResult.Text = JsonConvert.SerializeObject(res);
reference : https://api.cloudflare.com/#dns-records-for-a-zone-update-dns-record

3. 承襲第一點,或是上篇文章 取得在 Cloudflare 中的 DNS Records 每一個紀錄都有一個獨立編號ID ,可以針對該 ID 進行刪除,官方的 curl sample

curl -X DELETE "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/372e67954025e0ba6aaa6d586b9e0b59" \ -H "X-Auth-Email: user@example.com" \ -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \ -H "Content-Type: application/json"

C# Code ,回應的 JSON 我放在註解裡面,稍微注意的是他是要用 HTTP DELETE 

HttpClient clientGetZones = new HttpClient(); clientGetZones.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //clientGetZones.DefaultRequestHeaders.Add("Authorization", " Bearer [API TOKEN]"); clientGetZones.DefaultRequestHeaders.Add("Authorization", " Bearer abcdedghijklmnopQRSTUV_ABCD_ggggPqCD"); //var url1 = "https://api.cloudflare.com/client/v4/zones/[ZONE ID]/dns_records/[RECORD ID]"; var url1 = "https://api.cloudflare.com/client/v4/zones/2836714271b942af9386532b00b5579c/dns_records/52991924ec82a967d45caab25cbf6a90"; var res = clientGetZones.DeleteAsync(url1).Result.Content.ReadAsStringAsync().Result; ltlResult.Text = JsonConvert.SerializeObject(res); //Result: //"{"result":{"id":"52991924ec82a967d45caab25cbf6a90"},"success":true,"errors":[],"messages":[]}"

Reference : https://api.cloudflare.com/#dns-records-for-a-zone-delete-dns-record


基本上大概就是這樣,本來想用 nuget 上面套件的,但是想說看文件的時間不如自己動手,就玩一下吧,有時間我在裝起來好了。


當麻許的碎念筆記 2014 | Donma Hsu Design.