第1話
https://ameblo.jp/araya-benki/entry-12766410252.html
第2話
https://ameblo.jp/araya-benki/entry-12766734601.html
第3話
https://ameblo.jp/araya-benki/entry-12766908187.html
第4話
https://ameblo.jp/araya-benki/entry-12767249127.html
第5話
https://ameblo.jp/araya-benki/entry-12770305968.html
第6話
https://ameblo.jp/araya-benki/entry-12773262191.html
第7話
第8話
このお話は第8話です。

前回までのあらすじ
いろいろあって、Pythonのseleniumが、アップデートの影響で、
ほとんど使い物にならなくなったので。
・・・というよりも、現状サーバーの修理ができないので、
ラズパイ4を使ったサーバーの構築しなおしが発生しました。
・・・ラズパイ5が製造されているそうだけど、
HDMI端子の部分が、とても折れやすいmicro-HDMIにされているので、
買わない。ラズパイ4で懲りた。
同じミニパソコンなら、
値段的にも物理的にも、頑丈で放熱が強い、そして、
かなりお安く使い勝手がいい中華パソコンを買うことになると思います。
もちろんWindowsではなく、amd64版のUbuntu MATEを入れて。

seleniumが役に立たない!
困ったことに、seleniumの仕様がころころ変わるので、
seleniumに見切りをつけて、別のものを使ってどうにかすることにしました。

playwright
とりあえずですが、IPアドレスをDNSに送るスクレイピングモジュールに、
playwriteを使うことにしました。
うちのサーバーでは、バリュードメインさんのドメインを使っているので、
バリュードメインに合わせたものしかまだ作っていません。

そんなのでよければさらします。

まず、pipでインストールするものをします。
pip3 install pytest-playwright requests
そのあと、これも打ち込みます。
(2023/12/10 playwright install のコマンドで動かないことがあるので、動く方法に修正)。
python3 -m playwright install
絶対条件かどうかはわかりませんが、Linuxでは、sudoが必要になるみたいです。
とりあえず、このスクリプトのファイル名を「/opt/breasts.py」とします。

breasts.py

from playwright.sync_api import Playwright, sync_playwright, expect
import re
import requests
import time

def ipv4():
    #res = requests.get('https://ifconfig.me')
    res = requests.get("http://v4.ident.me")
    return res.text

def ipv6():
    try:
        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
    except Exception:
        return ""

def hazimeru():
    with sync_playwright() as playwright:
        run(playwright)

def run(playwright: Playwright) -> None:

    def owari(browser, context, page):
        page.goto("https://www.value-domain.com/logout.php")
        context.close()
        browser.close()

    def kousin(browser, context, page):
        i=0
        while i<len(domain):
            #ログインしたらこのリンクは生きる
            page.goto("https://www.value-domain.com/modall.php")
            #それぞれのドメインのDNSにアクセスする
            page.get_by_role("link", name="DNSレコードの変更/URL転送の変更:{0}".format(domain[i])).click()
            page.locator("xpath=//*[@id=\"records\"]").fill(text[i])
            #DNS情報を記録するボタン
            page.get_by_role("button", name="保存").click()
            i+=1
        return browser, context, page

    def saisyo():
        print(v4)
        print(v6)
        browser = playwright.chromium.launch(headless=False)
        context = browser.new_context()
        page = context.new_page()
        page.goto("https://www.value-domain.com/")

        #ログイン
        page.get_by_role("link", name="ログイン").click()
        page.get_by_label("ユーザー名必須").fill(user_mei)
        page.get_by_label("パスワード必須").fill(password)
        page.get_by_role("button", name="ログイン").click()
        return browser, context, page

    browser, context, page=saisyo()
    kousin(browser, context, page)
    owari(browser, context, page)



v4=ipv4()
v6=ipv6()
time.sleep(30)

#ここから上は触らぬが吉

#ここからが設定するところ

ahi="""a @ {0}
aaaa @ {1}
""".format(v4,v6)


user_mei="pussy-cat"
password="tasticles"
domain=["yasasiku.site","omosiroku.site"]
text=[ahi, ahi]


hazimeru()



自動起動で動かない問題発生
このスクリプトは、電源を入れた直後と、深夜、日付が過ぎたあとに実行する必要があります。
電源を切ると、または日にちをまたぐとグローバルIPアドレスは変わってしまいますので。
IPが変わるタイミングでDNSに報告する必要があるのです。

そのタイミングで、crontab(時間が来たら何かさせるプログラム)も、
profile.d(Linuxパソコンが起動した直後に何かさせるものを入れるフォルダ)も、
上手に動いてくれないのです。
この問題を強引に解決します。

いろいろ調べたら、playwriteは動き出すのに、けっこうな時間がかかるということがわかりました。
だいたい1分。もしかしたら、もう少し早いかもしれませんけど、ラズパイ4的には、だいたい1分。

Pythonには、scheduleというモジュールがあります。
pip3 install schedule
これをダウンロードして、時間が来たらPythonスクリプトを起動するスクリプトを作ります。

これの通りにしてしまうと、ずっとwhileを実行したままで、Linuxパソコンが動かなくなるので、
Pythonの関数を指定時刻に実行する方法を現役エンジニアが解説【初心者向け】(TechAcademyマガジン)
https://magazine.techacademy.jp/magazine/20872
これを改造します。
この改造スクリプトの名前を「/opt/bottoms.py」と「/opt/pussy.py」とします。

2023/12/6 追記
後半に書かれている「追記その2」にも書いているけど、
sudo visudo
このコマンドを使って、Python3をいつでもsudo起動できる形にして、使ってください。
visudoのあとは、これを書き込みます。
(sudoユーザー) ALL=NOPASSWD: /usr/bin/python3


bottoms.py(2023/12/6 2023/12/10 少しだけ改良)

import schedule
import time
import datetime
import subprocess

def hazime():
    try:
        subprocess.run(["python3","-m","playlight","install"])
        subprocess.run(["/usr/bin/python3","/opt/breasts.py"])
        print("おっけー!")
    except:
        print("うん、だめだこりゃ。sudo権限でやってみて。")

def owari():
    quit()

schedule.every().day.at("00:01").do(hazime)
schedule.every().day.at("00:03").do(owari)

while True:
    schedule.run_pending()
    time.sleep(60)




pussy.py(こっちも少しだけ改良)

import time
import datetime
import subprocess

def hazime():
    try:
        subprocess.run(["playlight","install"])
        subprocess.run(["/usr/bin/python3","/opt/breasts.py"])
        print("おっけー!")
    except:
        print("うん、だめだこりゃ。sudo権限でやってみて。")

def owari():
    quit()


time.sleep(60)
hazime()
time.sleep(60)
owari()




bottoms.pyとpussy.pyの違いは、
bottomsのほうが、crontab用。
pussyのほうが、Linuxパソコン自動起動用。
pussy.pyを動かすには、別のshファイルも作らなければなりません。
shファイルは、「/etc/profile.d/boobies.sh」にします。

boobies.sh(これも改良)

#!/bin/sh
python3 /opt/pussy.py


profile.dに入れておけば、shファイルは自動起動してくれるので。

bottoms.pyは、sudo crontabで動かします。
crontabは、00:00起動で。

sudo crontab -e

0 0 * * * /usr/bin/python3 /opt/bottoms.py



スクリプト的には、2つのスクリプトは、スクリプトを動かしてから1分たったあと、
DNSサーバーに連絡する「breasts.py」を動かすという寸法です。
賞味2分後、スクリプトは終了(変にリソース消費しないようにするため)。

いろんなところをたらい回しにして、目的のファイルを実行します。
たぶん、無駄が多すぎる設計になっています。

そのうち、ほかのドメイン会社の分も作っておきますね。
・・・お金が回ってきたら。
お名前ドットコムのだけは、スクレイピングできないみたいです。

追記
このコマンドやって、実行権限を確実に確保しておいてください。
でないと、いくらスクリプトがあっていても実行できないので。
sudo chmod 755 -R /opt
sudo chmod 755 /opt/boobies.sh
あと、追記の途中で思ったけど、bottoms.pyは、いらないかもしれません。
実装しちゃったけど。
Linux起動でも、crontab起動でも、pussy.pyを起動させる形でいいかもしれません。

追記その2
sudoコマンドでsubprocessを動かす必要があるけど、
sudo権限特有のパスワードを打ち込むことができません。
こんなときは、visudoでどうにかします。
まず、コマンドを打ち込みます。
sudo visudo
nanoのエディタでいろいろ設定が出てくるので、これを最後に打ち込みます。
(sudoユーザー) ALL=NOPASSWD: /usr/bin/python3
Python3を動かすときだけ、sudo権限で動かせます。






参考資料
Pythonの関数で複数の戻り値を返す方法(note.nkmk.me)
https://note.nkmk.me/python-function-return-multiple-values/

Playwright for Python
https://playwright.dev/python/docs/locators

プログラムでネットサーフィン
https://web.biz-prog.net/playwright/fundamental.html

Pythonの関数を指定時刻に実行する方法を現役エンジニアが解説【初心者向け】(TechAcademyマガジン)
https://magazine.techacademy.jp/magazine/20872

【Python入門】subprocessを使ってコマンドを実行しよう!(SAMURAI ENGINEER Blog)
https://www.sejuku.net/blog/51090

sudo のパスワードを入力なしで使うには(Qiita)
https://qiita.com/RyodoTanaka/items/e9b15d579d17651650b7

Error when installing Microsoft Playwright(stack overflow)
https://stackoverflow.com/questions/72791487/error-when-installing-microsoft-playwright