前不久手痒花二百多大洋入了Raspberry 2B,折腾了几天,突然发现dnspod有更新记录的API,家里的宽带分配的IP又刚好是公网IP,这下可玩性更高了.比如自动将宽带的IP绑定到域名上,通过路由器的端口映射,可以直接访问到家里的所有接入设备,还可以开放一些服务,比如代理/Web服务等.
废话少说.
首先你要有个域名,嗯,巧的是前不久也刚好买了个域名,在Namesilo上买的,新用户首年只要6.9刀,相当于人民币不到五十块,还送隐私保护,这太值了.
然后可以将域名的解析转到其他专业的DNS服务商处,Namesilo虽然也有提供解析,但真心太弱了.我这用的是Dnspod的免费套餐,虽然免费,但其功能依旧强大.接着取一个三级域名名称,记录类型为A类型,值先随便填个IP,TTL设置为10分钟.
到这里就要获取domain_id
和record_id
了:
#获取domain_id,将以下的xxx改为对应的邮箱和密码
curl curl -k https://dnsapi.cn/Domain.List -d "login_email=xxx&login_password=xxx"
#获取record_id前,要获取domain_id,将以下的xxx改为对应值即可
curl -k https://dnsapi.cn/Record.List -d "login_email=xxx&login_password=xxx&domain_id=xxx"
然后就可以用以下填入以下代码:
# coding:utf-8
import httplib, urllib
import socket
import time
params = dict(
login_email="xxx", # 邮箱
login_password="xxx", # 密码
domain_id=100, # 替换domain_id
record_id=100, # 替换record_id
sub_domain="xxx", # 替换为指定的三级域名,可以不动
format="json", # 不用改
record_line="默认", # 不用改
)
current_ip = None
def ddns(ip):
params.update(dict(value=ip))
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"}
conn = httplib.HTTPSConnection("dnsapi.cn")
conn.request("POST", "/Record.Ddns", urllib.urlencode(params), headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
print data
conn.close()
return response.status == 200
def getip():
sock = socket.create_connection(('ns1.dnspod.net', 6666))
ip = sock.recv(16)
sock.close()
return ip
if __name__ == '__main__':
while True:
try:
ip = getip()
print ip
if current_ip != ip:
if ddns(ip):
current_ip = ip
except Exception, e:
print e
pass
time.sleep(30)
保存为/var/ddns/pyddns.py
,然后加入到开机启动脚本即可/etc/rc.local
.