树莓派用dnspod的DDNS自动更新公网宽带IP

前不久手痒花二百多大洋入了Raspberry 2B,折腾了几天,突然发现dnspod有更新记录的API,家里的宽带分配的IP又刚好是公网IP,这下可玩性更高了.比如自动将宽带的IP绑定到域名上,通过路由器的端口映射,可以直接访问到家里的所有接入设备,还可以开放一些服务,比如代理/Web服务等.

废话少说.

首先你要有个域名,嗯,巧的是前不久也刚好买了个域名,在Namesilo上买的,新用户首年只要6.9刀,相当于人民币不到五十块,还送隐私保护,这太值了.

然后可以将域名的解析转到其他专业的DNS服务商处,Namesilo虽然也有提供解析,但真心太弱了.我这用的是Dnspod的免费套餐,虽然免费,但其功能依旧强大.接着取一个三级域名名称,记录类型为A类型,值先随便填个IP,TTL设置为10分钟.

到这里就要获取domain_idrecord_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.