借助Dnspod API定时更新域名解析获取公网IP(正在使用)
ns1.dnspod.net已无法获取外网ip,本文修改了源码,改为访问搜狗公司提供的服务器。可以借助DNSPOD的API来更新域名解析,实现DDNS,如何做呢?下面以Centos服务器为例。
创建Token
登录Dnspod账户:https://www.dnspod.cn/console/dashboard
没有账号的可以注册一个,顺便买个域名使用Dnspod解析吧,相当不错。
网上很多教程都是使用用户名和密码来访问Dnspod API,这个感觉不太安全,建议使用token方式访问。
点击用户中心->安全设置->API Token->创建API Token
注意存储保存,因为只显示一次。重点记住ID和Token两个值,因为后续使用的登录Token需要由这两个数字使用英文逗号组合而成。
创建A记录域名解析
在你的Dnspod解析的某个域名里添加一个子域名(新买个独立域名也行),如下图所示:
创建一个A记录,主机名使用一个你喜欢而且不与其他子域名冲突的,这里我使用了ddns,记录值可以随便写(如何8.8.8.8),因为后续会不断通过API改变。
域名解析更新Python代码
为了实现获取公网IP地址并更新到Dnspod刚才创建的A记录中,需要写如下代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import requests
import http.client
import json
import time
from urllib import parse
def get_ip():
content = requests.get('https://www.sogou.com/websearch/features/getTime.jsp').content.decode("utf8")
json_data = json.loads(content)
my_ip = json_data['ip']
return my_ip
def bind_ip_to_dns_pod(ip_, id_, token_, domain_id_, record_id_, sub_domain_):
params = dict(
login_token=("%s,%s" % (id_, token_)),
format="json",
value=ip_,
domain_id=domain_id_,
record_id=record_id_,
sub_domain=sub_domain_,
record_line="默认",
)
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"}
data = parse.urlencode(params).encode('utf-8')
conn = http.client.HTTPSConnection("dnsapi.cn")
conn.request("POST", "/Record.Ddns", data, headers)
response = conn.getresponse()
print(response.status, response.reason, response.read())
conn.close()
return response.status == 200
if __name__ == '__main__':
try:
ip = get_ip()
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(now + " ip=" + ip)
# vmok.cn
bind_ip_to_dns_pod(ip, "3999", "867553cd57f8f470d3eb54e09f6f9999", 84499999, 653479999, "@")
except Exception as e:
print(e)
如何获取你的domain_id
参考DNSPOD API说明:https://www.dnspod.cn/docs/domains.html#domain-list
在Terminal中输入以下命令即可获取你的所有域名列表和domain_id信息,从结果中找到你设置了A记录解析的那个域名,记录下domain_id
curl -X POST https://dnsapi.cn/Domain.List -d ‘login_token=LOGIN_TOKEN&format=json’
注意:LOGIN_TOKEN是由ID和Token加英文逗号组合而成,即 LOGIN_TOKEN = ”ID,Token“
如何获取你的record_id
参考DNSPOD API说明:https://www.dnspod.cn/docs/records.html#record-list
在Terminal中输入以下命令即可获取所有的record_id信息,从结果中找到你新添加的那个子域名的record_id。
curl -X POST https://dnsapi.cn/Record.List -d ‘login_token=LOGIN_TOKEN&format=json&domain_id=xxx’
注意:domain_id就是上面你获取到的domain_id,LOGIN_TOKEN是由ID和Token加英文逗号组合而成,即 LOGIN_TOKEN = ”ID,Token“
如何定时更新域名解析?
把上面的域名解析Python代码存下来,我命名为ddnspod_damogame.py,放在/home/ddns/目录下(或者你放到其他位置)
新建run.sh文件:
#!/bin/bash basepath=$(cd `dirname $0`; pwd) /usr/bin/python3 $basepath/script/run.py >> $basepath/log/run.log
在/etc/crontab中增加以下代码:
# 每小时更新一次腾讯dnspod.cn的ddns 0 * * * * will /home/ddns/run.sh
意思是每隔1小时运行一次,以便更新DNS记录。
在/etc/rc.d/rc.local中增加一行:
sudo -u will /home/ddns/run.sh
以便每次服务器重启的时候自动更新一下
