python

[Python] お名前ドットコムのDNS更新スクリプト

自宅サーバーを使用してお名前ドットコムで取得したドメインと紐づける事があります。
固定IPであればいいのですが、プロバイダによっては固定IPが出来ない事があります。
その場合にはDNSにIPを登録する必要がありますが、管理サイトにログインして登録するのは手間となります。
今回は実行するだけで更新するスクリプトを作成しました。

0. 環境

  • Python 3.9
  • python-dotenv

1. スクリプト

実行するスクリプトは以下となります。

#!/usr/bin/env python3

import ssl
import json
import socket
import urllib.request
import datetime
import os
from dotenv import load_dotenv

# .env ファイルの内容を環境変数に読み込む
load_dotenv()

# OnamaeID/Pass
user_id=os.getenv("USER_ID")
password=os.getenv("PASSWORD")

# サブドメインとメインドメイン
sub_domains=[
    "",
    "sub"
    ]
domname="example.com"

# inet-ipのAPIでIPアドレスを取得する
def getip():
    url = "http://inet-ip.info/ip"
    req = urllib.request.Request(url)
    res = urllib.request.urlopen(req)
    ip = res.read().decode()

    return ip

# DNS更新API URL
def getdns(domain):
    url = "https://dns.google.com/resolve?name={domain}&type=A".format(domain=domain)
    req = urllib.request.Request(url)
    res = urllib.request.urlopen(req)
    data = json.loads(res.read().decode())
    return data["Answer"][0]["data"]

# IPアドレスの更新
def updateip(ip):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(10)
    s = ssl.wrap_socket(sock)
    s.connect(("ddnsclient.onamae.com", 65010))
    #print(s.recv(1024).decode())

    data = """LOGIN
USERID:{uid}
PASSWORD:{pwd}
.
MODIP
HOSTNAME:{h}
DOMNAME:{domain}
IPV4:{ip}
.
LOGOUT
.""".format(uid=user_id,pwd=password,h=sub_domain,domain=domname,ip=ip)

    print("DATA STRINGS:\n", data)

    for line in data.split("\n"):
        s.send(line.encode() + b"\r\n")
        if line == ".":
            print(s.recv(1024).decode())

    s.close()

## Main function
if __name__ == "__main__":
    dt_now = datetime.datetime.now()
    print(dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))

    current_ip = getip()
    print("Current Global IP:", current_ip)

    # Set host name
    for sub_domain in sub_domains:

        # Host check
        if sub_domain != "":
            print("Target Host Name:", sub_domain + "." + domname)
            dns_record_ip = getdns(sub_domain + "." + domname)
        else:
            print("Target Host Name:", domname)
            dns_record_ip = getdns(domname)

        print("DNS Registered IP:", dns_record_ip)

        if dns_record_ip == current_ip:
            print("No update is required.")
        else:
            print("Sending update request...")
            updateip(current_ip)
            print("The request is completed.")

またログインIDとパスワードを「.env」ファイルに記載します。

USER_ID="onamae_user_id"
PASSWORD="onamae_password"

上記のスクリプトを実行するとお名前ドットコムのDNSに登録することができます。
Cronや以前ご紹介した定期処理を行って、IPアドレスとドメインの紐づけを保つことができます。