###功能 基于DNSPOD (www.dnspod.com)的动态域名解析脚本:
适用于有域名在手,并且托管到dnspod的童鞋。
###原理 基于dnspod提供的api,提交信息。 如果IP地址没有改变,则不处理;如果改变了则提交新的IP地址。
###引用申明 本脚本基于[email protected]的原始dnspod脚本,修改了IP地址获取部分。
###功能 基于DNSPOD (www.dnspod.com)的动态域名解析脚本:
适用于有域名在手,并且托管到dnspod的童鞋。
###原理 基于dnspod提供的api,提交信息。 如果IP地址没有改变,则不处理;如果改变了则提交新的IP地址。
###引用申明 本脚本基于[email protected]的原始dnspod脚本,修改了IP地址获取部分。
| #!/usr/bin/env python | |
| #-*- coding:utf-8 -*- | |
| import urllib2,urllib,json,socket,commands | |
| # Based on [email protected] code | |
| class DNS: | |
| #Dnspod账户 | |
| _dnspod_user = 'dnspod_username' | |
| #Dnspod密码 | |
| _dnspod_pwd = 'dnspod_password' | |
| #Dnspod主域名,注意:是你注册的域名 | |
| _domain = 'your domain' | |
| #子域名,如www,如果要使用根域名,用@ | |
| _sub_domain = 'your subdomain' | |
| def getIP(self): | |
| """get local IP based on socket. | |
| Try to connect baidu.com, then getsockname""" | |
| s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
| s.connect(('baidu.com', 0)) | |
| return s.getsockname()[0] | |
| def getlocalIP(self, intf='eth0'): | |
| """get local IP from eth0. | |
| If VPN is connected, getIP will get assigned VPN client IP. | |
| So we need to get IP from eth0 or eth1""" | |
| intf_ip = commands.getoutput("ip address show dev " + intf).split() | |
| intf_ip = intf_ip[intf_ip.index('inet') + 1].split('/')[0] | |
| return intf_ip | |
| def api_call(self,api,data): | |
| try: | |
| api = 'https://dnsapi.cn/' + api | |
| data['login_email'] = self._dnspod_user | |
| data['login_password'] = self._dnspod_pwd | |
| data['format'] ='json' | |
| data['lang'] = 'cn' | |
| data['error_on_empty'] = 'no' | |
| data = urllib.urlencode(data) | |
| req = urllib2.Request(api,data, | |
| headers = { | |
| 'UserAgent' : 'LocalDomains/1.0.0', | |
| 'Content-Type':'application/x-www-form-urlencoded;text/html; charset=utf8', | |
| }) | |
| res = urllib2.urlopen(req) | |
| html = res.read() | |
| results = json.loads(html) | |
| return results | |
| except Exception as e: | |
| print e | |
| def main(self): | |
| ip = self.getIP() | |
| if '192.168' in ip: | |
| ip = self.getlocalIP() | |
| dinfo = self.api_call('domain.info',{'domain' : self._domain}) | |
| domainId = dinfo['domain']['id'] | |
| rs = self.api_call('record.list', | |
| { | |
| 'domain_id': domainId, | |
| 'offset' :'0', | |
| 'length' : '1', | |
| 'sub_domain' : self._sub_domain | |
| }) | |
| if rs['info']['record_total'] == 0: | |
| self.api_call('record.create', | |
| { | |
| 'domain_id' : domainId, | |
| 'sub_domain' : self._sub_domain, | |
| 'record_type' : 'A', | |
| 'record_line' : '默认', | |
| 'value' : ip, | |
| 'ttl' : '3600' | |
| }) | |
| print 'Success.' | |
| else: | |
| if rs['records'][0]['value'].strip() != ip.strip(): | |
| self.api_call('record.modify', | |
| { | |
| 'domain_id' : domainId, | |
| 'record_id' : rs['records'][0]['id'], | |
| 'sub_domain' : self._sub_domain, | |
| 'record_type' : 'A', | |
| 'record_line' : '默认', | |
| 'value' : ip | |
| }) | |
| else: | |
| print 'Success.' | |
| if __name__ == '__main__': | |
| d = DNS(); | |
| d.main() |