标签:des style blog http io color ar os java
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 record 104 /// </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-create 115 公共参数 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", new 124 { 125 domain_id = domainId, 126 sub_domain = subDomain, 127 value = 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 else 139 { 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-modify 159 公共参数 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", new 169 { 170 domain_id = domainId, 171 record_id = recordId, 172 value = 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 else 193 { 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", new 211 { 212 domain_id = domainId, 213 record_id = recordId, 214 remark = remark 215 }); 216 if (resObj != null && resObj["status"]["code"] == "1") 217 flag = true; 218 return flag; 219 } 220 221 #endregion 222 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 = string.Format("{0}&{1}", GetApiParamDataString(baseParam), data); 248 } 249 else 250 { 251 data = 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 = 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 = (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 #endregion 312 } 313 314 #region 辅助类,用于返回dynamic类型对象 315 316 public class JsonParser 317 { 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 : JavaScriptConverter 333 { 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> SupportedTypes 353 { 354 get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(object) })); } 355 } 356 } 357 358 public class DynamicJsonObject : DynamicObject 359 { 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
标签:des style blog http io color ar os java
原文地址:http://www.cnblogs.com/qingshang/p/4071333.html