首页 » 操作系统 » 抛弃花生壳,通过python脚本调用dnspod api实现动态域名解析

抛弃花生壳,通过python脚本调用dnspod api实现动态域名解析

时间:2014-02-21作者:felix.chan分类:操作系统评论:0

公司测试服务器放在公司内部,由于是拨号光纤上网,每天ip地址都会有变化,之前在centos6.4上装了个花生壳的client for linux版本,然后把测试域名cname到花生壳的二级域名上,现在觉得花生壳不是很稳定,所以想直接通过dnspod提供的api接口来实现每次ip发生变化之后自动修改指定的二级域名的A记录来解析到新的ip上。避免了花生壳这个中间环节,速度快了很多,故障率也降低了很多。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env python
#-*- coding:utf-8 -*-
 
import httplib, urllib, urllib2
import time
import sys,os
import re
import json
 
username = 'webmaster@rednat.com'  #dnspod账号
password = 'felix.chan'  #dnspod密码
format = 'json'
 
domain = [u'www.rednat.com']  #要解析的域名
 
def get_domain_info(domain):
    domain_split = domain.split('.')
    domain_split_len = len(domain_split)
    maindomain = domain_split[domain_split_len - 2] + '.' + domain_split[domain_split_len - 1]
    return maindomain,domain
 
params = {'login_email':username,'login_password':password,'format':format}
 
def request(action, params, method = 'POST'):
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"}
    conn = httplib.HTTPSConnection("dnsapi.cn")
    conn.request(method, '/' + action, urllib.urlencode(params), headers)
    response = conn.getresponse()
    data = response.read()
    conn.close()
    if response.status == 200:
        return data
    else:
        return None
 
def get_my_domain_id():
    data = request('Domain.List',params)
    data = json.loads(data)
    domainlist = data.get('domains')
    domaninfo = {}
    for d in domainlist:
        domaninfo[d.get('name')]  = d.get('id')
    return domaninfo
 
def get_my_domain_record_id(domain_id):
    params['domain_id'] = domain_id
    data = request('Record.List',params)
    data = json.loads(data)
    if data.get('code') == '10':
        return None
    domainname = data.get('domain').get('name')
    record_list = data.get('records')
    record = {}
    for r in record_list:
        if r.get('type') == 'A':
            key = r.get('name') != '@' and r.get('name') + '.' + domainname or domainname
            record[key] = {'id':r.get('id'),'value':r.get('value')}
    return  record
 
def changerecord(domain,domain_id,record_id,ip):
    params['domain_id'] = domain_id
    params['record_id'] = record_id
    params['record_type'] = 'A'
    params['record_line'] = '默认'
    params['sub_domain'] = domain
    params['ttl'] = 600
    params['value'] = ip
    data = request('Record.Modify',params)
 
def getip():
#   url = 'http://members.3322.org/dyndns/getip'  获取自己ip的备用网址
    url = 'http://iframe.ip138.com/ic.asp'
    response = urllib2.urlopen(url)
    text = response.read()
    ip = re.findall(r'\d+.\d+.\d+.\d+', text)
    return ip[0] or None
 
def updatedomaininfo(domain):
    m,sub_m = get_domain_info(domain)
    domain_id = my_domain_id_list.get(m)
    record_list = get_my_domain_record_id(domain_id)
    if record_list == None:
        return None
    rocord_info = record_list.get(sub_m)
    record_ip = rocord_info.get('value')
    record_id = rocord_info.get('id')
    return sub_m,record_ip,record_id,domain_id
 
if __name__ == '__main__':
    my_domain_id_list = get_my_domain_id()
    try:
        for dm in domain:
            domaindata = updatedomaininfo(dm)
            if domaindata == None:
                continue
            dnsdomain,dnsdomainip,record_id,domain_id = domaindata
            domain_name = dnsdomain.split('.')[0]
            ip = getip()
            if ip == dnsdomainip:
                continue
            else:
                changerecord(domain_name,domain_id,record_id,ip)
    except:
        pass

原创文章,转载请注明: 转载自红防联盟www.rednat.com

本文链接地址: 抛弃花生壳,通过python脚本调用dnspod api实现动态域名解析

|2|right
0 条评论

暂时没有评论!

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>