i007.cc

i007.cc

优先队列-降维打击

借助Dnspod API定时更新域名解析获取公网IP(正在使用)

原文地址

 

但是最近遇到一个问题,就是该文中引用的ns1.dnspod.net已无法获取外网ip,本文修改了源码,改为访问搜狗公司提供的服务器。

可以借助DNSPOD的API来更新域名解析,实现DDNS,如何做呢?下面以Centos服务器为例。

 

创建Token

登录Dnspod账户:dnspod.cn/console/dashb

没有账号的可以注册一个,顺便买个域名使用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说明:dnspod.cn/docs/domains.

在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说明:dnspod.cn/docs/records.

在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

以便每次服务器重启的时候自动更新一下

 

完成

发表回复