第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話
第9話

このお話は第9話です。

前回までのあらすじ
直したはずのサーバーが動かない。
いろいろ調べたら、crontabがちっとも仕事してくれないことに気が付きました。
というわけで、またいろいろ調べて、
crontabにきっちり仕事してもらうための方法をなんとか見つけました。

crontabで動かすには、sudoでやらす場合でも、もうひと仕事必要になるということに気づいたので、
追記します。
というよりも、これ、どこかでやったことがあるような気がする。

話の続編を書く場合は、たいてい追記が時期的に間に合わなくなったときです。

想定されている機材
Ubuntu MATE 22.04がインストールされているパソコン。
おそらく、ラズパイでもDOS/Vパソコンでも行けると思います。
ラズパイ5が出たらしいけど、もしかしたら中国製ミニパソコン(DOS/Vマシン)のほうが、
安く、安定して動く可能性が高いので、
値段だけ見たら、中国製ミニパソコンのほうがいいかもしれません。
わざわざ折れやすいmicro-HDMIなんか導入していないし。

前回のスクリプトのおさらい
今のところ、バリュードメインさん対応の分しか作ってなかったけど、
スクリプトを2つ見てみましょう。
よくよく見たら、bottoms.pyはいらないことがわかったので、今回は割愛します。

pussy.py

import time
import datetime
import subprocess

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

def owari():
    quit()


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



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=["nantoka.site","sukini.site"]
text=[ahi, ahi]

try:
    hazimeru()
    print("通報しますた")
except:
    print("なんじゃこりゃあ!")



一部、改良している部分があります。
IPv4にもIPv6にも対応しています。
IPv6の回線につなぐ予定がない場合は、
ahi の中の、aaaa @ {1} の行を消してください。

このあと、visudoコマンドを使って、
sudoコマンドを使わなくてもpythonを使えるようにするために、
このコマンドを打ち込んで、
sudo visudo
こんなのを書き込みます。そして保存。
(管理者権限のユーザー) ALL=NOPASSWORD: /usr/bin/python3

その後、/etc/profile.dフォルダに、shスクリプトのファイルを作って、

#!/bin/sh
/usr/bin/python3 (pythonのファイルがあるフォルダ)/pussy.py

pussy.pyでは、/opt フォルダに、breasts.pyがあること前提なので、
別の場所にpythonファイルを置く場合は、
pussy.pyの8行目の、みぎ側の項目をお目当てのパスに変更する必要があります。
とにかく、/usr/profile.d/フォルダに、shファイルを作っておけば、このスクリプトが自動起動します。

crontabが動かない!
sudo権限で動かすこと前提の、「sudo crontab」、
0 0 * * * /usr/bin/python3 (pythonファイルがあるフォルダ)/pussy.py
なんと、これにスケジュールを登録しただけでは、python3は動いてくれないのでした。
動的グローバルIPを使ってサーバーをやるには、
電源を入れた直後と、0時0分を過ぎた直後に、DDNSにIPアドレスが変わったことを通報しなければ、
サーバーとしてやっていけません。
crontabが動いてくれないと、電源を入れた日はよくても、
次の日は、高い確率でアクセスできなくなります。
でも、どうやったらcrontabは動いてくれるんだろう?

crontabでpythonを動かす方法
shファイルは、スケジュールを登録しただけで動きます。
python3は、スケジュールを登録しただけでは、動こうとしますが、残念な動きしかできず、エラーを起こして沈没します。
実は、ちゃんと動こうとしているのです。
その証拠に、
* * * * * /usr/bin/python3 (pythonファイルがあるフォルダ)/pussy.py >> ~/うんこ.txt
crontabにファイルを作ってもらうときには、
>>のあとに、ファイル名とファイルのパスを書き込みますが、
これをやると、何も書かれていない「うんこ.txt」ファイルが出来上がります。
実行していることはしているようですが、動ききっていない。

・・・何も茶番のネタが思いつかないので、結論を書きます。
pythonのモジュールをimportしている場合は、
モジュールのパス(またはファイルのありか)をcrontabに読み込ませる必要があります。
そして、ほかにも、sudo権限で扱う$PATHもcrontabに読み込ませる必要が・・・あるかどうかのテストはしていないけど、たぶん必要になるかもしれない。

pythonのモジュールのパス・・・となると、ものによってはエラーをはじき出すので、
ファイルのありかを調べるスクリプトを。

import time
import datetime
import subprocess
import re
import requests
import playwright

print(datetime.__file__)
print(subprocess.__file__)
print(re.__file__)
print(requests.__file__)
print(playwright.__file__)

timeモジュールのprint文を打ち込んでいないのは、わざとです。
組み込みされているものは、出てこないし、出す必要もないので。
(無理やり所在を出す場合は、print(time) で出てきます)。
出てきた結果を、crontabに書き込みます。
コマンドうちこんで、
sudo crontab -e

$PATH=(でてきた結果):(ほかのでてきた結果):(あるだけ書く)
0 0 * * * /usr/bin/python3 (pythonファイルのある場所)/pussy.py

:(コロン)を区切りにして、出てきた結果を次々と連結させていきます。
echo $PATHコマンドで出てきたものも付け加えると、完璧になる予定。
こんなかんじで動くようになります。

playwrightは、時間を少しおいておかないと、動くのに失敗する場合があり、
時間を少しおいても、失敗することがあるので、
crontabでは、2回くらい実行したほうがいいかもしれません。

疑問に思ったこと
これだけは絶対に書かなければいけないことだと思うので、書いてみます。
アンミカさんのために。

アンミカさんが、X(ツイッター。別名「バカ発見機」)で、
頭のおかしいネトウヨに叩かれているので、
いろいろ調べてみたら、アンミカさんは「日本は世界の恥」という発言をしたそうです。
で、その発言の元を調べてみると、
杉田水脈という、これまた頭のおかしい国会議員が、
いろんなところで、いろいろな差別発言をまき散らしているので、
そんな状況を見て、世界の恥発言となったわけでした。

まあ、アンミカさんの反応は一般の良識を持ち合わせていれば、とても正常な反応だと思いますし、
杉田水脈のようなやつが、平気で国会議員している日本の状況は、世界の恥です。
この状況は、私が見ても世界の恥だと思うし、客観的に見ても、この状況は世界の恥にしか見えません。
むしろ、杉田水脈の言動は「このハゲー!」や「お・・・おっぱい」並みに罷免案件かと推察できますし、
「北方領土を取り返したければロシアから奪い取るしかない」発言以上に深刻かと思われますが。
(北方領土を取り返すにはロシアから奪い返す以外に方法がないのは、ただの事実だし、北方・・・の発言が罷免案件になるのはおかしいけど)。
むしろ杉田水脈のような輩は、言論の自由を理解していないから、
侮辱罪で終身体刑にしたほうがいいです。

そしてどん兵衛うまい!
えびが食べられないので、おあげのほうにしましたけど。



参考文献
【Python】モジュール・パッケージのインストールパスを確認する方法(鎖プログラム)
https://pg-chain.com/python-module-package-directory

Where is time.py located?(stack overflow)
https://stackoverflow.com/questions/25823053/where-is-time-py-located