zoukankan      html  css  js  c++  java
  • 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 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
  • 相关阅读:
    『题解』POJ1753 Flip Game
    『数论』乘法逆元
    『数据结构』RMQ问题
    UVA 253 Cube painting 【数学】
    POJ 1852 Ants 【水+Trick+贪心】
    POJ 2955 Brackets 【区间DP】
    LOJ 1422 Halloween Costumes【区间DP】
    HDU 4193 Non-negative Partial Sums 【单调队列】
    CodeForces-545C Woodcutters 【贪心+机智】
    CodeForces 19D A and B and Interesting Substrings 【前缀和】
  • 原文地址:https://www.cnblogs.com/qingshang/p/4071333.html
Copyright © 2011-2022 走看看