/// <summary>
/// DnsPod DDNS工具类
/// </summary>
public class DDNSToolkit
{
private static string userName = ConfigurationManager.AppSettings["DNSUserName"];
private static string password = ConfigurationManager.AppSettings["DNSPassword"];
/// <summary>
/// 公共参数
/// </summary>
private object baseParam = new
{
login_email = userName,//用户帐号,必选
login_password = password,//用户密码,必选
format = "json",//返回的数据格式,可选,默认为xml,建议用json
lang = "cn",//返回的错误语言,可选,默认为en,建议用cn
error_on_empty = "no"//没有数据时是否返回错误,可选,默认为yes,建议用no
}; #region 域名相关 /// <summary>
/// Return the domain_Id,when the domains contains more then one entity,returns the first one!
/// </summary>
/// <returns></returns>
public int DomainGetId(string keyword)//获取域名ID
{
var domainId = -;
if (!string.IsNullOrWhiteSpace(keyword))
keyword = "keyword=" + keyword;
/*api说明 https://www.dnspod.cn/docs/domains.html#domain-list
公共参数
type 域名权限种类,可选参数,默认为’all’。包含以下类型:
all:所有域名
mine:我的域名
share:共享给我的域名
ismark:星标域名
pause:暂停域名
vip:VIP域名
recent:最近操作过的域名
share_out:我共享出去的域名
offset 记录开始的偏移,第一条记录为 0,依次类推,可选参数
length 共要获取的记录的数量,比如获取20条,则为20,可选参数
group_id 分组ID,获取指定分组的域名,可选参数
keyword,搜索的关键字,如果指定则只返回符合该关键字的域名,可选参数*/
var dataBaseObj = GetDNSApi("https://dnsapi.cn/Domain.List", keyword);
if (dataBaseObj != null)
{
if (dataBaseObj["status"]["code"] == "")
{
if (dataBaseObj["domains"].Length > )
{
domainId = Convert.ToInt32(dataBaseObj["domains"][]["id"]);
}
}
else
{
throw new ArgumentException(string.Format("DNSPod API:Domain.List调用异常,说明:{0}", dataBaseObj["status"]["message"]));
}
}
return domainId;
} #endregion #region 记录相关
/// <summary>
/// Get the recordId
/// </summary>
/// <param name="domainId">domainId</param>
/// <param name="subDomain">The name for subDomain</param>
/// <returns></returns>
public int RecordGetIdBySubdomain(int domainId, string subDomain)//获取记录ID
{
var recordId = -;
/*api说明 https://www.dnspod.cn/docs/records.html#record-list
公共参数
domain_id 域名ID,必选
offset 记录开始的偏移,第一条记录为 0,依次类推,可选
length 共要获取的记录的数量,比如获取20条,则为20,可选
sub_domain 子域名,如果指定则只返回此子域名的记录,可选
keyword,搜索的关键字,如果指定则只返回符合该关键字的记录,可选*/
var dataBaseObj = GetDNSApi("https://dnsapi.cn/Record.List", new { domain_id = domainId, sub_domain = subDomain });
if (dataBaseObj != null)
{
if (dataBaseObj["status"]["code"] == "")
{
if (dataBaseObj["records"].Length > )
{
domainId = Convert.ToInt32(dataBaseObj["records"][]["id"]);
}
}
else
{
throw new ArgumentException(string.Format("DNSPod API:Record.List调用异常,说明:{0}", dataBaseObj["status"]["message"]));
}
} return recordId;
} /// <summary>
/// Create subdomain record
/// </summary>
/// <param name="domainId">domainId</param>
/// <param name="value">value:IP、CNAME、MX</param>
/// <param name="subDomain">subdomain name,like "www",defalut is "@"</param>
/// <param name="recordId"></param>
/// <returns></returns>
public bool RecordCreate(int domainId, string value, string subDomain, out int recordId)//创建记录
{
recordId = -;
bool flag = false;
/*api说明 https://www.dnspod.cn/docs/records.html#record-create
公共参数
domain_id 域名ID, 必选
sub_domain 主机记录, 如 www, 默认@,可选
record_type 记录类型,通过API记录类型获得,大写英文,比如:A, 必选
record_line 记录线路,通过API记录线路获得,中文,比如:默认, 必选
value 记录值, 如 IP:200.200.200.200, CNAME: cname.dnspod.com., MX: mail.dnspod.com., 必选
mx {1-20} MX优先级, 当记录类型是 MX 时有效,范围1-20, MX记录必选
ttl {1-604800} TTL,范围1-604800,不同等级域名最小值不同, 可选*/
var dataBaseObj = GetDNSApi("https://dnsapi.cn/Record.Create", new
{
domain_id = domainId,
sub_domain = subDomain,
value = value,
record_type = "A",
record_line = "默认"
});
if (dataBaseObj != null)
{
if (dataBaseObj["status"]["code"] == "")
{
flag = true;
recordId = Convert.ToInt32(dataBaseObj["record"]["id"]);
}
else
{
throw new ArgumentException(string.Format("DNSPod API:Record.Create调用异常,说明:{0}", dataBaseObj["status"]["message"]));
}
}
return flag;
}
/// <summary>
/// 修改记录
/// </summary>
/// <param name="domainId"></param>
/// <param name="recordId"></param>
/// <param name="subdomain"></param>
/// <param name="value"></param>
/// <param name="message"></param>
/// <returns></returns>
public bool RecordUpdate(int domainId, int recordId, string subdomain, string value, out string message)//修改记录
{
message = string.Empty;
bool flag = false;
/*api说明 https://www.dnspod.cn/docs/records.html#record-modify
公共参数
domain_id 域名ID,必选
record_id 记录ID,必选
sub_domain 主机记录,默认@,如 www,可选
record_type 记录类型,通过API记录类型获得,大写英文,比如:A,必选
record_line 记录线路,通过API记录线路获得,中文,比如:默认,必选
value 记录值, 如 IP:200.200.200.200, CNAME: cname.dnspod.com., MX: mail.dnspod.com.,必选
mx {1-20} MX优先级, 当记录类型是 MX 时有效,范围1-20, mx记录必选
ttl {1-604800} TTL,范围1-604800,不同等级域名最小值不同,可选*/
var resObj = GetDNSApi("https://dnsapi.cn/Record.Modify", new
{
domain_id = domainId,
record_id = recordId,
value = value,
sub_domain = subdomain,
record_type = "A",
record_line = "默认"
});
if (resObj != null)
{
if (resObj["status"]["code"] == "")
{
/*更新成功,返回记录详情(记录中的各参数)
* "record": {
* "id":16894439,
* "name":"@",
* "value":"3.2.2.2",
* "status":"enable"
* }
*/
message = GetObjectPropertiesString(resObj["record"]);
flag = true;
}
else
{
message = resObj["status"]["message"];
throw new ArgumentException(string.Format("DNSPod API:Record.Modify调用异常,说明:{0}", resObj["status"]["message"]));
}
}
return flag;
}
/// <summary>
/// 设置记录备注
/// </summary>
/// <param name="domainId">域名ID</param>
/// <param name="recordId">记录ID</param>
/// <param name="remark">备注信息</param>
/// <returns></returns>
public bool RecordRemark(int domainId, int recordId, string remark = "")//设置记录备注
{
bool flag = false;
var resObj = GetDNSApi("https://dnsapi.cn/Record.Remark", new
{
domain_id = domainId,
record_id = recordId,
remark = remark
});
if (resObj != null && resObj["status"]["code"] == "")
flag = true;
return flag;
} #endregion #region 辅助方法 /// <summary>
/// Send the webrequest to the api,and get the data of JSON!
/// </summary>
/// <param name="apiAddress">The API address for DNSPod</param>
/// <param name="data">The object type parameter with key/value pairs,like{type:"POST"}</param>
/// <returns></returns>
private dynamic GetDNSApi(string apiAddress, object data)
{
return GetDNSApi(apiAddress, GetApiParamDataString(data));
}
/// <summary>
/// Send the webrequest to the api,and get the data of JSON!
/// </summary>
/// <param name="apiAddress">The API address for DNSPod</param>
/// <param name="data">The data that will send to the api,like "type=post",split with "&" for more parameters!</param>
/// <returns>The returned data object</returns>
private dynamic GetDNSApi(string apiAddress, string data)
{ //若有额外参数,则将公共参数添加至参数请求中
if (!string.IsNullOrWhiteSpace(data))
{
data = string.Format("{0}&{1}", GetApiParamDataString(baseParam), data);
}
else
{
data = GetApiParamDataString(baseParam);//若无额外参数,只提交公共参数
}
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiAddress);
request.Method = "POST";
request.Headers.Add("content", "text/html; charset=UTF-8");
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "ROS DDNS/V1";
byte[] postData = Encoding.UTF8.GetBytes(data);
request.ContentLength = postData.Length;
Stream smp = request.GetRequestStream();//得到请求流
smp.Write(postData, , postData.Length);//写入请求流
smp.Close();//关闭流 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);
string responseString = stream.ReadToEnd();//得到返回数据
stream.Close();
response.Close();
request = null;
dynamic obj = null;
if (!string.IsNullOrWhiteSpace(responseString))
{
obj = new JavaScriptSerializer().Deserialize(responseString, typeof(object) as dynamic);
}
return obj;
}
/// <summary>
///
/// </summary>
/// <param name="data"></param>
/// <returns>The returned data of JSON</returns>
private string GetApiParamDataString(object data)
{
var dataString = string.Empty;
if (data != null)
{
//利用反复取可读属性或实例,返回属性集合
var objProperties = (from x in data.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) where x.CanRead select x).ToList();
//将属性名与值拼接,返回string类型的数组
var arrProValue = (from y in objProperties select string.Format("{0}={1}", y.Name, y.GetValue(data, new object[]))).ToList().ToArray();
//将数组以“&”连接
dataString = string.Join("&", arrProValue);
}
return dataString;
}
private string GetObjectPropertiesString(object obj)
{
var dataStr = new StringBuilder();
if (obj != null)
{
var d = obj as Dictionary<string, object>;
foreach (var item in d)
{
dataStr.AppendLine(string.Format("{0} - {1}", item.Key, item.Value));
}
}
return dataStr.ToString();
} #endregion
} #region 辅助类,用于返回dynamic类型对象 public class JsonParser
{
/// <summary>
/// 从json字符串到对象。
/// </summary>
/// <param name="jsonStr"></param>
/// <returns></returns>
public static dynamic FromJson(string jsonStr)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() }); dynamic glossaryEntry = jss.Deserialize(jsonStr, typeof(object)) as dynamic;
return glossaryEntry;
}
}
public class DynamicJsonConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
if (dictionary == null)
throw new ArgumentNullException("dictionary"); if (type == typeof(object))
{
return new DynamicJsonObject(dictionary);
} return null;
} public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
} public override IEnumerable<Type> SupportedTypes
{
get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(object) })); }
}
} public class DynamicJsonObject : DynamicObject
{
private IDictionary<string, object> Dictionary { get; set; } public DynamicJsonObject(IDictionary<string, object> dictionary)
{
this.Dictionary = dictionary;
} public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.Dictionary[binder.Name]; if (result is IDictionary<string, object>)
{
result = new DynamicJsonObject(result as IDictionary<string, object>);
}
else if (result is ArrayList)
{
result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));
}
//else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)
//{
// result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));
//}
//else if (result is ArrayList)
//{
// result = new List<object>((result as ArrayList).ToArray());
//}
return this.Dictionary.ContainsKey(binder.Name);
}
}
#endregion

DDNS动态更新的更多相关文章

  1. centos DNS服务搭建 DNS原理 使用bind搭建DNS服务器 配置DNS转发 配置主从 安装dig工具 DHCP dhclient 各种域名解析记录 mydns DNS动态更新 第三十节课

    centos  DNS服务搭建  DNS原理  使用bind搭建DNS服务器 配置DNS转发 配置主从  安装dig工具  DHCP  dhclient  各种域名解析记录  mydns DNS动态更 ...

  2. RPi 2B DDNS 动态域名

    /**************************************************************************** * RPi 2B DDNS 动态域名 * 说 ...

  3. Openshift 自建DDNS动态域名

    某种情况下如openstack或者openshift/kubernetes软件部署过程由于需要标准的 域名系统(DNS UPDATE)RFC 2136中的动态更新功能, 但是现有的阿里云/华为云均不提 ...

  4. JSPatch – 动态更新iOS APP

    原文:http://blog.cnbang.net/works/2767/ JSPatch是最近业余做的项目,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的 ...

  5. JAVA代码热部署,在线不停服动态更新

    本地debug的时候,可以实时编译并更新代码,线上也可以不停服来动态更新类,即所说的java热部署.   JDK代理的两种方式: 1.premain方式是Java SE5开始就提供的代理方式,但其必须 ...

  6. elasticsearch同义词及动态更新

    第一种:参考地址:http://dev.paperlesspost.com/setting-up-elasticsearch-synonyms/271.Add a synonyms file.2.Cr ...

  7. 在Android中实现service动态更新UI界面

    之前曾介绍过Android的UI设计与后台线程交互,据Android API的介绍,service一般是在后台运行的,没有界面的.那么如何实现service动态更新UI界面呢?案例:通过service ...

  8. Android中动态更新ListView(转)

    在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中.实现步骤:调用ListView的setOnSc ...

  9. Js多国时间动态更新

    Js多国时间动态更新 点击下载

随机推荐

  1. Button 模板和样式

    <Style TargetType="{x:Type Button}"> <Setter Property="FontFamily" Valu ...

  2. 设计模式(十二)享元模式(Flyweight Pattern)

    一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...

  3. Entity Framework Plus 系列目录

    Entity Framework Plus 系列文章计划的已经全部写完,可能还有其他功能没有写到,希望大家能够多动手,尝试一下使用,一定会给您带来一些帮助的.文章全部写完,也应该出一个目录方便查看,目 ...

  4. 从Google工程师到创业CTO,他的8项理念也许可以帮到你

    Lan Langworth是前Google软件工程师.O'Reily作者,现在他是Artillery的co-founder/CTO,致力于把游戏机质量的游戏带进网页浏览器.下文是他从Google离职到 ...

  5. Linux设置开机启动

    开机启动 解决服务器重启,比如断点,导致服务没有启动的烦恼   1.整理机器上面运行的服务,编些成sh脚本,文件为:/home/rc/exec.sh #加载环境变量 source /etc/profi ...

  6. Java下载文件(流的形式)

    @RequestMapping("download") @ResponseBody public void download(HttpServletResponse respons ...

  7. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  8. Linux网络查看命令

    1.ifconfig 查看当前生效的网卡. 2.ifdown ifup 网卡禁用与启动. 3.netstat -tuln 查看当前tcp/udp通讯端口连接情况. 4.netstat -an 查看当前 ...

  9. transformjs污染了DOM?是你不了解它的强大

    原文链接: https://github.com/AlloyTeam/AlloyTouch/wiki/Powerful-transformjs 写在前面 上星期在React微信群里,有小伙伴觉得tra ...

  10. UIScrollView的封装

    UIScrollView的封装 效果 特点 1.用法简单,尺寸大小,随意设置位置 2.可以有多个数据源的数据,可以定制不通的界面(如同上图,一个有文字,一个没有文字) 3.能够实现点击事件 用法 1. ...