Nodejs 用node写了个dnspod动态域名更新工具

Nodejs 用node写了个dnspod动态域名更新工具

项目地址:https://github.com/ohsc/dnspod-ddns

安装:

npm install -g dnspod-ddns

执行一次更新动态域名(可以配合crontab使用):

dnspod-ddns --dns-domain yourdomain.com --dns-host yourhost --user youremail --passwd yourpassword

作为守护进程定时更新:

dnspod-ddns --dns-domain yourdomain.com --dns-host yourhost --user youremail --passwd yourpassword --daemon

开始这个项目的时候,一直在纠结怎么弄成守护进程,后来采用了这种方式。大家觉得如何?有没有更好的?


4 回复

Nodejs 用node写了个dnspod动态域名更新工具

项目地址

https://github.com/ohsc/dnspod-ddns

安装

首先,你需要全局安装这个工具:

npm install -g dnspod-ddns

执行一次更新动态域名

你可以手动执行一次更新命令,这个命令也可以配合 crontab 使用来实现定期更新。

dnspod-ddns --dns-domain yourdomain.com --dns-host yourhost --user youremail --passwd yourpassword

作为守护进程定时更新

如果你希望这个工具作为一个守护进程运行,并且定期更新DNS记录,可以使用以下命令:

dnspod-ddns --dns-domain yourdomain.com --dns-host yourhost --user youremail --passwd yourpassword --daemon

实现细节

在这个项目中,我最初遇到了如何将这个工具作为守护进程运行的难题。经过一番研究和尝试,最终采用了如下的方式来实现守护进程的功能。具体代码可以在 timeTicker.js 文件中找到。

timeTicker.js 示例代码

const { exec } = require('child_process');
const interval = 3600 * 1000; // 每小时执行一次

function updateDNS() {
    exec(`dnspod-ddns --dns-domain yourdomain.com --dns-host yourhost --user youremail --passwd yourpassword`, (error, stdout, stderr) => {
        if (error) {
            console.error(`Error updating DNS: ${stderr}`);
            return;
        }
        console.log(`DNS updated successfully: ${stdout}`);
    });
}

setInterval(updateDNS, interval);

// 立即执行一次
updateDNS();

这段代码通过 setInterval 每隔一小时调用一次 updateDNS 函数来更新DNS记录。这样可以确保即使程序退出,下次启动时也会继续执行这个任务。

总结

以上就是如何使用Node.js编写一个用于更新DNSPod动态域名的工具。希望这个项目对大家有所帮助!如果有任何建议或改进意见,欢迎在GitHub上提交Issue或PR。


希望这个回答能够帮助你更好地理解和使用这个工具。如果你有任何问题或需要进一步的帮助,请随时联系我。


守护进程比较讨厌,因为不同的发行版写法还不一样…

简单的用cronjob吧。

看到守护进程第一反应是 forever

对于“Nodejs 用node写了个dnspod动态域名更新工具”这个帖子,我们可以参考已有的项目结构和实现思路来说明如何编写这样的工具。

示例代码

首先,我们定义一个简单的Node.js脚本来定期更新DNSPod上的记录。这个脚本需要先从DNSPod API获取当前的IP地址,并与本地的IP地址进行比较,如果不同则更新DNSPod的记录。

  1. 安装必要的包
npm install request dns
  1. 创建脚本
const request = require('request');
const dns = require('dns');

function getPublicIp(callback) {
    dns.lookup('checkip.dyndns.org', (err, address) => {
        if (err) throw err;
        request(`http://${address}/`, (error, response, body) => {
            if (error || response.statusCode !== 200) throw error;
            const ipMatch = body.match(/(\d{1,3}\.){3}\d{1,3}/);
            callback(ipMatch ? ipMatch[0] : null);
        });
    });
}

function updateDnsPod(ip, domain, host, email, password, callback) {
    const url = `https://dnsapi.cn/Record.Modify`;
    const data = {
        login_email: email,
        login_password: password,
        domain: domain,
        record_id: 'YOUR_RECORD_ID', // 这里需要从API中获取记录ID
        sub_domain: host,
        record_type: 'A',
        record_line: '默认',
        value: ip
    };

    request.post({url, form: data}, (error, response, body) => {
        if (error || response.statusCode !== 200) return callback(error || new Error(body));
        callback(null, JSON.parse(body));
    });
}

function checkAndSync() {
    getPublicIp((publicIp) => {
        if (!publicIp) throw new Error('Failed to get public IP.');
        console.log(`Current Public IP: ${publicIp}`);
        
        updateDnsPod(publicIp, 'yourdomain.com', 'yourhost', 'youremail', 'yourpassword', (error, result) => {
            if (error) throw error;
            console.log('DNS Record Updated:', result);
        });
    });
}

// 每小时检查并同步一次
setInterval(checkAndSync, 3600000);
checkAndSync(); // 第一次立即运行

守护进程

为了确保该脚本在服务器重启后依然能够自动启动,可以考虑使用foreverpm2等工具将其设置为守护进程。

  1. 安装forever
npm install -g forever
  1. 启动脚本
forever start /path/to/your/script.js

这样就完成了一个基本的DNSPod动态域名更新工具的实现。可以根据实际需求进一步调整和完善。

回到顶部