首页 > 代码库 > DDNS动态更新
DDNS动态更新
1 /// <summary> 2 /// DnsPod DDNS工具类 3 /// </summary> 4 public class DDNSToolkit 5 { 6 private static string userName = ConfigurationManager.AppSettings["DNSUserName"]; 7 private static string password = ConfigurationManager.AppSettings["DNSPassword"]; 8 /// <summary> 9 /// 公共参数 10 /// </summary> 11 private object baseParam = new 12 { 13 login_email = userName,//用户帐号,必选 14 login_password = password,//用户密码,必选 15 format = "json",//返回的数据格式,可选,默认为xml,建议用json 16 lang = "cn",//返回的错误语言,可选,默认为en,建议用cn 17 error_on_empty = "no"//没有数据时是否返回错误,可选,默认为yes,建议用no 18 }; 19 20 #region 域名相关 21 22 /// <summary> 23 /// Return the domain_Id,when the domains contains more then one entity,returns the first one! 24 /// </summary> 25 /// <returns></returns> 26 public int DomainGetId(string keyword)//获取域名ID 27 { 28 var domainId = -1; 29 if (!string.IsNullOrWhiteSpace(keyword)) 30 keyword = "keyword=" + keyword; 31 /*api说明 https://www.dnspod.cn/docs/domains.html#domain-list 32 公共参数 33 type 域名权限种类,可选参数,默认为’all’。包含以下类型: 34 all:所有域名 35 mine:我的域名 36 share:共享给我的域名 37 ismark:星标域名 38 pause:暂停域名 39 vip:VIP域名 40 recent:最近操作过的域名 41 share_out:我共享出去的域名 42 offset 记录开始的偏移,第一条记录为 0,依次类推,可选参数 43 length 共要获取的记录的数量,比如获取20条,则为20,可选参数 44 group_id 分组ID,获取指定分组的域名,可选参数 45 keyword,搜索的关键字,如果指定则只返回符合该关键字的域名,可选参数*/ 46 var dataBaseObj = GetDNSApi("https://dnsapi.cn/Domain.List", keyword); 47 if (dataBaseObj != null) 48 { 49 if (dataBaseObj["status"]["code"] == "1") 50 { 51 if (dataBaseObj["domains"].Length > 0) 52 { 53 domainId = Convert.ToInt32(dataBaseObj["domains"][0]["id"]); 54 } 55 } 56 else 57 { 58 throw new ArgumentException(string.Format("DNSPod API:Domain.List调用异常,说明:{0}", dataBaseObj["status"]["message"])); 59 } 60 } 61 return domainId; 62 } 63 64 #endregion 65 66 #region 记录相关 67 /// <summary> 68 /// Get the recordId 69 /// </summary> 70 /// <param name="domainId">domainId</param> 71 /// <param name="subDomain">The name for subDomain</param> 72 /// <returns></returns> 73 public int RecordGetIdBySubdomain(int domainId, string subDomain)//获取记录ID 74 { 75 var recordId = -1; 76 /*api说明 https://www.dnspod.cn/docs/records.html#record-list 77 公共参数 78 domain_id 域名ID,必选 79 offset 记录开始的偏移,第一条记录为 0,依次类推,可选 80 length 共要获取的记录的数量,比如获取20条,则为20,可选 81 sub_domain 子域名,如果指定则只返回此子域名的记录,可选 82 keyword,搜索的关键字,如果指定则只返回符合该关键字的记录,可选*/ 83 var dataBaseObj = GetDNSApi("https://dnsapi.cn/Record.List", new { domain_id = domainId, sub_domain = subDomain }); 84 if (dataBaseObj != null) 85 { 86 if (dataBaseObj["status"]["code"] == "1") 87 { 88 if (dataBaseObj["records"].Length > 0) 89 { 90 domainId = Convert.ToInt32(dataBaseObj["records"][0]["id"]); 91 } 92 } 93 else 94 { 95 throw new ArgumentException(string.Format("DNSPod API:Record.List调用异常,说明:{0}", dataBaseObj["status"]["message"])); 96 } 97 } 98 99 return recordId;100 }101 102 /// <summary>103 /// Create subdomain record104 /// </summary>105 /// <param name="domainId">domainId</param>106 /// <param name="value">value:IP、CNAME、MX</param>107 /// <param name="subDomain">subdomain name,like "www",defalut is "@"</param>108 /// <param name="recordId"></param>109 /// <returns></returns>110 public bool RecordCreate(int domainId, string value, string subDomain, out int recordId)//创建记录111 {112 recordId = -1;113 bool flag = false;114 /*api说明 https://www.dnspod.cn/docs/records.html#record-create115 公共参数116 domain_id 域名ID, 必选117 sub_domain 主机记录, 如 www, 默认@,可选118 record_type 记录类型,通过API记录类型获得,大写英文,比如:A, 必选119 record_line 记录线路,通过API记录线路获得,中文,比如:默认, 必选120 value 记录值, 如 IP:200.200.200.200, CNAME: cname.dnspod.com., MX: mail.dnspod.com., 必选121 mx {1-20} MX优先级, 当记录类型是 MX 时有效,范围1-20, MX记录必选122 ttl {1-604800} TTL,范围1-604800,不同等级域名最小值不同, 可选*/123 var dataBaseObj = GetDNSApi("https://dnsapi.cn/Record.Create", new124 {125 domain_id = domainId,126 sub_domain = subDomain,127 value =http://www.mamicode.com/ value,128 record_type = "A",129 record_line = "默认"130 });131 if (dataBaseObj != null)132 {133 if (dataBaseObj["status"]["code"] == "1")134 {135 flag = true;136 recordId = Convert.ToInt32(dataBaseObj["record"]["id"]);137 }138 else139 {140 throw new ArgumentException(string.Format("DNSPod API:Record.Create调用异常,说明:{0}", dataBaseObj["status"]["message"]));141 }142 }143 return flag;144 }145 /// <summary>146 /// 修改记录147 /// </summary>148 /// <param name="domainId"></param>149 /// <param name="recordId"></param>150 /// <param name="subdomain"></param>151 /// <param name="value"></param>152 /// <param name="message"></param>153 /// <returns></returns>154 public bool RecordUpdate(int domainId, int recordId, string subdomain, string value, out string message)//修改记录155 {156 message = string.Empty;157 bool flag = false;158 /*api说明 https://www.dnspod.cn/docs/records.html#record-modify159 公共参数160 domain_id 域名ID,必选161 record_id 记录ID,必选162 sub_domain 主机记录,默认@,如 www,可选163 record_type 记录类型,通过API记录类型获得,大写英文,比如:A,必选164 record_line 记录线路,通过API记录线路获得,中文,比如:默认,必选165 value 记录值, 如 IP:200.200.200.200, CNAME: cname.dnspod.com., MX: mail.dnspod.com.,必选166 mx {1-20} MX优先级, 当记录类型是 MX 时有效,范围1-20, mx记录必选167 ttl {1-604800} TTL,范围1-604800,不同等级域名最小值不同,可选*/168 var resObj = GetDNSApi("https://dnsapi.cn/Record.Modify", new169 {170 domain_id = domainId,171 record_id = recordId,172 value =http://www.mamicode.com/ value,173 sub_domain = subdomain,174 record_type = "A",175 record_line = "默认"176 });177 if (resObj != null)178 {179 if (resObj["status"]["code"] == "1")180 {181 /*更新成功,返回记录详情(记录中的各参数) 182 * "record": {183 * "id":16894439,184 * "name":"@",185 * "value":"3.2.2.2",186 * "status":"enable"187 * }188 */189 message = GetObjectPropertiesString(resObj["record"]);190 flag = true;191 }192 else193 {194 message = resObj["status"]["message"];195 throw new ArgumentException(string.Format("DNSPod API:Record.Modify调用异常,说明:{0}", resObj["status"]["message"]));196 }197 }198 return flag;199 }200 /// <summary>201 /// 设置记录备注202 /// </summary>203 /// <param name="domainId">域名ID</param>204 /// <param name="recordId">记录ID</param>205 /// <param name="remark">备注信息</param>206 /// <returns></returns>207 public bool RecordRemark(int domainId, int recordId, string remark = "")//设置记录备注208 {209 bool flag = false;210 var resObj = GetDNSApi("https://dnsapi.cn/Record.Remark", new211 {212 domain_id = domainId,213 record_id = recordId,214 remark = remark215 });216 if (resObj != null && resObj["status"]["code"] == "1")217 flag = true;218 return flag;219 }220 221 #endregion222 223 #region 辅助方法224 225 /// <summary>226 /// Send the webrequest to the api,and get the data of JSON!227 /// </summary>228 /// <param name="apiAddress">The API address for DNSPod</param>229 /// <param name="data">The object type parameter with key/value pairs,like{type:"POST"}</param>230 /// <returns></returns>231 private dynamic GetDNSApi(string apiAddress, object data)232 {233 return GetDNSApi(apiAddress, GetApiParamDataString(data));234 }235 /// <summary>236 /// Send the webrequest to the api,and get the data of JSON!237 /// </summary>238 /// <param name="apiAddress">The API address for DNSPod</param>239 /// <param name="data">The data that will send to the api,like "type=post",split with "&" for more parameters!</param>240 /// <returns>The returned data object</returns>241 private dynamic GetDNSApi(string apiAddress, string data)242 {243 244 //若有额外参数,则将公共参数添加至参数请求中245 if (!string.IsNullOrWhiteSpace(data))246 {247 data = http://www.mamicode.com/string.Format("{0}&{1}", GetApiParamDataString(baseParam), data);248 }249 else250 {251 data = http://www.mamicode.com/GetApiParamDataString(baseParam);//若无额外参数,只提交公共参数252 }253 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiAddress);254 request.Method = "POST";255 request.Headers.Add("content", "text/html; charset=UTF-8");256 request.ContentType = "application/x-www-form-urlencoded";257 request.UserAgent = "ROS DDNS/V1";258 byte[] postData =http://www.mamicode.com/ Encoding.UTF8.GetBytes(data);259 request.ContentLength = postData.Length;260 Stream smp = request.GetRequestStream();//得到请求流261 smp.Write(postData, 0, postData.Length);//写入请求流262 smp.Close();//关闭流263 264 265 HttpWebResponse response = (HttpWebResponse)request.GetResponse();266 StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);267 string responseString = stream.ReadToEnd();//得到返回数据268 stream.Close();269 response.Close();270 request = null;271 dynamic obj = null;272 if (!string.IsNullOrWhiteSpace(responseString))273 {274 obj = new JavaScriptSerializer().Deserialize(responseString, typeof(object) as dynamic);275 }276 return obj;277 }278 /// <summary>279 /// 280 /// </summary>281 /// <param name="data"></param>282 /// <returns>The returned data of JSON</returns>283 private string GetApiParamDataString(object data)284 {285 var dataString = string.Empty;286 if (data != null)287 {288 //利用反复取可读属性或实例,返回属性集合289 var objProperties = (from x in data.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) where x.CanRead select x).ToList();290 //将属性名与值拼接,返回string类型的数组291 var arrProValue = http://www.mamicode.com/(from y in objProperties select string.Format("{0}={1}", y.Name, y.GetValue(data, new object[0]))).ToList().ToArray();292 //将数组以“&”连接293 dataString = string.Join("&", arrProValue);294 }295 return dataString;296 }297 private string GetObjectPropertiesString(object obj)298 {299 var dataStr = new StringBuilder();300 if (obj != null)301 {302 var d = obj as Dictionary<string, object>;303 foreach (var item in d)304 {305 dataStr.AppendLine(string.Format("{0} - {1}", item.Key, item.Value));306 }307 }308 return dataStr.ToString();309 }310 311 #endregion312 }313 314 #region 辅助类,用于返回dynamic类型对象315 316 public class JsonParser317 {318 /// <summary> 319 /// 从json字符串到对象。 320 /// </summary> 321 /// <param name="jsonStr"></param> 322 /// <returns></returns> 323 public static dynamic FromJson(string jsonStr)324 {325 JavaScriptSerializer jss = new JavaScriptSerializer();326 jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });327 328 dynamic glossaryEntry = jss.Deserialize(jsonStr, typeof(object)) as dynamic;329 return glossaryEntry;330 }331 }332 public class DynamicJsonConverter : JavaScriptConverter333 {334 public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)335 {336 if (dictionary == null)337 throw new ArgumentNullException("dictionary");338 339 if (type == typeof(object))340 {341 return new DynamicJsonObject(dictionary);342 }343 344 return null;345 }346 347 public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)348 {349 throw new NotImplementedException();350 }351 352 public override IEnumerable<Type> SupportedTypes353 {354 get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(object) })); }355 }356 }357 358 public class DynamicJsonObject : DynamicObject359 {360 private IDictionary<string, object> Dictionary { get; set; }361 362 public DynamicJsonObject(IDictionary<string, object> dictionary)363 {364 this.Dictionary = dictionary;365 }366 367 public override bool TryGetMember(GetMemberBinder binder, out object result)368 {369 result = this.Dictionary[binder.Name];370 371 if (result is IDictionary<string, object>)372 {373 result = new DynamicJsonObject(result as IDictionary<string, object>);374 }375 else if (result is ArrayList)376 {377 result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));378 }379 //else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)380 //{381 // result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));382 //}383 //else if (result is ArrayList)384 //{385 // result = new List<object>((result as ArrayList).ToArray());386 //}387 return this.Dictionary.ContainsKey(binder.Name);388 }389 } 390 #endregion
DDNS动态更新
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。