全壊までのあらすじ
バリュードメインのダイナミックDNSを更新するCGIページを見つけ、
そこにアクセスしてIPアドレスを更新したまではよかったが、
何時間たっても一向にホームページが見える状態にならない。
どうする? このまま動的グローバルIPアドレスに屈するの?
それとも、Linux的にWINE(Windowsのエミュレーター)を使わせて、DiCE使わせるの?

そもそもWINE使わせたって更新できるのかな?
WindowsでDiCEを設定する。
ルーターの電源を抜いて、わざとグローバルIPアドレスを変える。
ルーターの電源を差し込む。
ホームページが見えるようになる気配なし。
このままでは、私がこの間作ったPython3スクリプトと一緒だ。

そういえば、最初のころに、更新がうまくいったと思っていた現象は何だったのか?
思い当たるのは、ログインしている状態だったとき。
つまり、この情報は、今、使えるものではないということだとしたら?
ダイナミックDNSの更新こそできるけど、
あのCGIに、ホームページを見せるだけの力がないとしたら・・・?

ログインしていないとホームページを見せられるようにはならない・・・?
細かい疑問は残るけど、条件的にはこれしか思い当たるものがないので。
まず、バリュードメインにログインする。
そして前回作った、requestsとreが動くスクリプトを動かす。
・・・ダイナミックDNSは更新されているけどホームページは見えない。

アクセスしているブラウザが一致している必要があるっぽい?
それなら、Chromiumとseleniumを使ってログインして、
CGIの操作をChromiumとseleniumを使って、やる。
・・・ホームページは見えない。

ならば、ダイナミックDNS更新ページに実際に値を書き込んで、
保存ボタンを押すところまでやってみる。
・・・ここまでやれば、ホームページが見えるところまでやれる!
やったやった!
ああ、今度もGoogleの呪縛から逃れられなかった。

バリュードメインのIP更新スクリプト完全版
設定を自分で変えなければいけないのは仕方ない。
こういうのはアプリの形にしようが何だろうが一緒なので。
使うには、chromium、requests、seleniumが必要です。
webdriverは、seleniumをインストールしたときに、
chromedriverという形でくっついてきます。
sudo apt install chromium-browser python3-selenium python3-requests
アメーバブログは普通にHTML構文をぶち壊すから、
ちゃんとコピペできるかは怪しいです。
では、緑色のところを参照してください。

#使い方とかはスクリプトの末尾をみてください

import requests
import re
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome import service as fs


#スクリプトの内部。キャーさわらないでー!

'''
CHROMEDRIVER = "chromedriverのパス"
あくまでもここで有効にしているのは、
今回使っているRaspberryPiのUbuntu MATEのChromium用。
未来になれば場所は変わっているかもしれないので、
そのときはCtrl+Fとかでシステムファイルのフォルダを探してください。
'''
CHROMEDRIVER = "/snap/chromium/2106/usr/lib/chromium-browser"
URL = "https://www.value-domain.com/"
IPv6 = ""

def get_ipv4():
    res = requests.get('https://ifconfig.me')
    return res.text

def get_ipv6():
    r=requests.get("http://checkipv6.dyndns.com/")
    ip=re.findall(r'\w+',r.text)
    ip=':'.join(ip)
    ip=re.sub("html:head:title:Current:IP:Check:title:","",ip)
    ip=re.sub("head:body:Current:IP:Address:","",ip)
    ip=re.sub(":body:html","",ip)
    return ip

# ドライバー指定でChromeブラウザを開く
chrome_service = fs.Service(executable_path=CHROMEDRIVER)

options = Options()
options.add_argument(f'service={chrome_service}')
# ブラウザを表示しない。CUI環境の人用または確認が済んだ人用。
#options.headless = True

driver = webdriver.Chrome(options=options)

# ウィンドウサイズ=画像サイズ
driver.set_window_size(1024, 768)

def roguin():
    # 対象ページへアクセス
    driver.get(URL+"login.php")
    # テキストを入力する
    driver.find_element_by_id("username").send_keys(USERNAME)
    driver.find_element_by_id("password").send_keys(PASSWORD)
    ele = driver.find_element_by_xpath('//*[@id="login_submit_btn"]')
    ele.click()

def rogu_out():
    driver.get(URL+"logout.php")

def kousin(SONOTA):
    if IPv6 != "":
        ppp="aaaa " + HOSTNAME + " " + IPv6 + "\n"
    
    driver.get(URL+"modall.php")
    driver.get(URL+\
        "moddns.php?action=moddns2&domainname="+DOMAIN)
    #テキストクリアしてから入力しないととんでもないことになる
    driver.find_element_by_id("records").clear()
    driver.find_element_by_id("records").send_keys(
        "a " + HOSTNAME + " " + IPv4 + "\n" + \
        ppp + SONOTA)
    # 要素を取得する。F12押してのデバッグモードでxpathをコピーして値をペースト。
    # xpathが作り出す文字の法則は相変わらず不明。
    ele = driver.find_element_by_xpath(\
        "/html/body/div[1]/div[2]/div[3]/div[3]/\
        section[2]/form/p[3]/input[4]")
    ele.click()

#ここから上はさわらぬが吉

'''使い方
やることを関数(何かするマシン)にしたので、
関数をひたすら並べていく。
'''

"""設定はここから
ここからが自分で設定する部分
自分が取得したドメインの設定に合わせる
"""
#ログインするときのユーザー名
USERNAME = "pussy-cat"
#ドメイン
DOMAIN = "nantoka.site"
#パスワード
PASSWORD = "tasticles"
#ホスト名。たいていは「*」でいい。
HOSTNAME = "*"
#その他メールなどの設定があれば追記する
TA = "txt @ zoho-verification=vagina.cockverify.zoho.jp"
#IPアドレスを知るためのもの。IPv4はかならずやる。
IPv4=get_ipv4()
#IPv6アドレスを知るためのもの。
#プロバイダがIPv6に対応していないならば先頭に#をつける
IPv6=get_ipv6()
#ログアウト。すでにログインしたまま作業を続けると
#このスクリプトでは事故の元になる
rogu_out()
#ログイン
roguin()
#更新。設定があれば変数に代入する。
#代入したいものが複数あるなら(TA1+"\n"+TA2)のような設定にする
kousin(TA)
#マルチドメインで更新するなら別のドメイン名を代入する
DOMAIN = "sukini.site"
#IPアドレス以外の設定がなければ、かっこの中は""にする。
kousin("")
#ログアウト
rogu_out()

""" 設定ここまで"""
#ここまで


# ブラウザ終了(終わるときのお約束)
driver.quit()
quit()

chromedriver関連のcrontab起動は難しいけどできる
ラズパイスタート時に自動ログオン&自動起動する方法は第1回、
crontabに登録する方法は第3回でやったのですが、
crontabでseleniumを動かすのはなかなか大変なので、
ここでやり方書いておきます。
crontab -e
なぜか「DISPLAY=:0」と書くと、Chromiumが動き出せるので、
いろんなパスを通しまくって、

$PATH=/usr/local/sbin:/usr/local/bin:usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/python3.10/re.py:/usr/lib/python3/dist-packages/requests:/usr/lib/python3/dist-packages/selenium/__init__.py
1 0 * * * DISPLAY=:0 python3 /opt/breasts.py

python3のモジュールやら何やらのパスは、
print(モジュール名.__file__)
または
print(モジュール名.__path__)
のどちらかで表示されるので、コピペしてください。
どれがどれだかわからないので、確率50%でなんとかしてみてください。
(先にモジュール類をimportする必要がある)
あと、いわゆるパス通っているフォルダについての$PATHは、
echo $PATH
これで出ます。

前回は、Chromiumを使わない予定だったから、
chromedriverのパスも通していないし、
Chromiumの自動起動もしていませんでしたが、
絶対ここ、ひっかかるところだと思うので、ここに書きました。

Windowsで動かすことに関してはよくわからない
せっかくなので、Windowsしか選択肢がない人のことも考えて、
(Windows専用のサーバーなんてのもあるので)
WindowsのPythonでも動かす方法を探していましたが、
なぜかhtmlのinput要素を探して入力しようとすると、
必ずエラーが出て止まります。
原因を探していました。
それとも、別の言語を使えってこと?
たとえば、JavaScriptとか、C#とか、
LibreOfficeを使ったVBAとか。

もし続きがあるとすれば、
Windows版のIP更新スクリプトを書くことになるでしょう。
続けられるかは、ちょっとわかりません。




参考資料
Pythonで長いコードを改行して記述する方法(dot blog)
【初心者向け】HTMLで空白(スペース)を入れる3つの方法(CodeCampus)
run selenium with crontab (python) (stack overflow)