MENU
カテゴリー
アーカイブ

Bing で MyDNS のアドレス更新スクリプトを作ってみた

今日、Bing AI の順番が回ってきたから ChatGPT と同じ質問で DDNS のアドレス更新スクリプトを作ってみた。

何はともあれ、まずは Ubuntu 用の Microsoft Edge をダウンロード、インストール。

続いて ChatGPT と同じ質問をしてみた。

目次

最初の質問

DDNSとしてMyDNSを使っている環境で、自宅のグローバルIPアドレスが変わったことを検出してDDNSを更新するPythonスクリプトを書いて。

こんにちは、これはBingです。😊

DDNSとしてMyDNSを使っている環境で、自宅のグローバルIPアドレスが変わったことを検出してDDNSを更新するPythonスクリプトを書くのは難しいことではありません。以下のようなスクリプトを参考にしてください。

# 必要なモジュールをインポート
import requests
import os
import time

# MyDNSのユーザーIDとパスワードを設定
MYDNS_USER = "your_user_id"
MYDNS_PASS = "your_password"

# 前回のIPアドレスを保存するファイル名を設定
LAST_IP_FILE = "last_ip.txt"

# IPアドレスの変更をチェックする間隔を秒で設定
CHECK_INTERVAL = 60

# 現在のIPアドレスを取得する関数
def get_current_ip():
    # https://ipv4.mydns.jp/ にアクセスしてIPアドレスを取得
    response = requests.get("https://ipv4.mydns.jp/")
    # レスポンスのテキストを返す
    return response.text

# 前回のIPアドレスを取得する関数
def get_last_ip():
    # ファイルが存在するかチェック
    if os.path.exists(LAST_IP_FILE):
        # ファイルを読み込む
        with open(LAST_IP_FILE, "r") as f:
            # ファイルの内容を返す
            return f.read()
    else:
        # ファイルが存在しない場合は空文字を返す
        return ""

# 前回のIPアドレスを保存する関数
def save_last_ip(ip):
    # ファイルにIPアドレスを書き込む
    with open(LAST_IP_FILE, "w") as f:
        f.write(ip)

# MyDNSにIPアドレスを通知する関数
def update_mydns(ip):
    # MyDNSの更新用URLを作成
    url = f"https://ipv4.mydns.jp/login.html?username={MYDNS_USER}&password={MYDNS_PASS}&updatehost=1"
    # URLにアクセスしてレスポンスを取得
    response = requests.get(url)
    # レスポンスのステータスコードを返す
    return response.status_code

# 無限ループ
while True:
    # 現在のIPアドレスを取得
    current_ip = get_current_ip()
    # 前回のIPアドレスを取得
    last_ip = get_last_ip()
    # IPアドレスが変わったかチェック
    if current_ip != last_ip:
        # IPアドレスが変わった場合
        print(f"IPアドレスが変わりました: {last_ip} -> {current_ip}")
        # MyDNSにIPアドレスを通知
        status = update_mydns(current_ip)
        # 通知の結果を表示
        if status == 200:
            # 通知に成功した場合
            print("MyDNSにIPアドレスを更新しました。")
        else:
            # 通知に失敗した場合
            print(f"MyDNSにIPアドレスを更新できませんでした。ステータスコード: {status}")
        # 前回のIPアドレスを保存
        save_last_ip(current_ip)
    else:
        # IPアドレスが変わっていない場合
        print(f"IPアドレスは変わっていません: {current_ip}")
    # 指定した間隔だけ待つ
    time.sleep(CHECK_INTERVAL)

おお、最初から IP アドレスを保存して比較するスクリプトになっている。
でも IP アドレスの保存時にアドレス以外の文字が残っていて、そのままの状態で通知しようとして失敗している。

質問をもっと正確に書かないとダメだね。
ということでやり直してみる。

2回めの質問

DDNSとしてMyDNSを使っている環境で、自宅のグローバルIPアドレスが変わったことを検出してDDNSを更新するPythonスクリプトを書いて。ただし、現在のIPアドレスは"http://checkip.dyndns.org"から取得すること。また、取得したIPアドレスの保存時は、正規表現にマッチする文字だけとすること。

以下のPythonスクリプトを書きました。これは、自宅のグローバルIPアドレスが変わったことを検出して、MyDNSに登録したドメインのIPアドレスを更新するものです。現在のIPアドレスは"http://checkip.dyndns.org"から取得し、正規表現にマッチする文字だけを保存します。このスクリプトは、定期的に実行する必要があります。

# 必要なライブラリをインポート
import requests
import re
import os

# MyDNSのマスターIDとパスワードを設定
MYDNS_ID = "your_master_id"
MYDNS_PASSWORD = "your_password"

# IPアドレスを取得するURLを設定
IP_URL = "http://checkip.dyndns.org"

# IPアドレスを保存するファイル名を設定
IP_FILE = "ip.txt"

# IPアドレスの正規表現を設定
IP_REGEX = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"

# IPアドレスを取得する関数を定義
def get_ip():
    # URLにアクセスしてレスポンスを取得
    response = requests.get(IP_URL)
    # レスポンスのテキストからIPアドレスを抽出
    ip = re.search(IP_REGEX, response.text).group()
    # IPアドレスを返す
    return ip

# IPアドレスを更新する関数を定義
def update_ip(ip):
    # MyDNSの更新用URLを設定
    update_url = f"https://www.mydns.jp/directip.html?MID={MYDNS_ID}&PWD={MYDNS_PASSWORD}&IPV4ADDR={ip}"
    # URLにアクセスしてレスポンスを取得
    response = requests.get(update_url)
    # レスポンスのステータスコードを返す
    return response.status_code

# 現在のIPアドレスを取得
current_ip = get_ip()

# IPアドレスを保存するファイルが存在するか確認
if os.path.exists(IP_FILE):
    # ファイルが存在する場合、ファイルから前回のIPアドレスを読み込む
    with open(IP_FILE, "r") as f:
        previous_ip = f.read()
else:
    # ファイルが存在しない場合、前回のIPアドレスを空文字にする
    previous_ip = ""

# 現在のIPアドレスと前回のIPアドレスが異なるか確認
if current_ip != previous_ip:
    # IPアドレスが変わっている場合、MyDNSにIPアドレスを更新する
    status_code = update_ip(current_ip)
    # 更新の結果を表示
    if status_code == 200:
        print(f"IPアドレスを更新しました: {current_ip}")
    else:
        print(f"IPアドレスの更新に失敗しました: {status_code}")
    # 現在のIPアドレスをファイルに保存する
    with open(IP_FILE, "w") as f:
        f.write(current_ip)
else:
    # IPアドレスが変わっていない場合
    print(f"IPアドレスは変わっていません: {current_ip}")

今度は大丈夫だった。

感想

ChatGPT もそうだけど、質問は意図する内容をできるだけ正確に記述することが大切。

回答(スクリプト)を確認して、場合によっては何度も試行を繰り返すことで必要なスクリプトを完成させることができるのは便利。

どっちがパワフル?なのか判らないけど、質問の修正と、質問回答の履歴をそのまま残すことができる ChatGPT は便利だと思った(残す必要があるかどうかは別として)。

コメント

コメントする

目次