このお話に出てくるスクリプトは、役に立ちません。

前回までのあらすじ
ラズパイUbuntu MATEで、Python3を使って特殊なことをやって、
バリュードメインのダイナミックDNSサーバーに、IPアドレスの変更を伝えられるようになった。
なったけど、なんとなくラズパイUbuntu MATE、重たい・・・?
chromedriverには、終了しきれないという欠点があるので、
自動起動やcrontabで使ってはいけないものだった。

人類総家畜化を狙う(?)Googleをボイコットしたい
Microsoftが悪の帝国、Appleが悪の枢軸、
Amazonが悪の武器商人、Facebook、Twitterが戦争誘発をたくらむカルト、
という想定でいけば、Googleは人類の家畜化を狙う悪の秘密結社ということになります。
まあ、いろいろなサービスを与えて、世界のインフラとして既成事実を作って、
その枠組みの中で、勝手なルールを押し通して、
人類を思ったように誘導しようとする姿は、
人類を家畜化しようとしているように見えなくもない。
たとえば、こんなこととか。

という与太話はさておいて、
Chromiumもchromedriverも、十分Googleの息のかかったプログラムです。
使ってみると、メモリの食い方がすごいらしく、意外と重たいです。
しかも、プログラムが終わった後も終了しきらない。終わらせたはずなのに。

そしてよく考えたら、seleniumをわざわざ使わなくても、
サイトに自動的にアクセスすることぐらいは、
requestsモジュールで何とかなることに気づきました。
今までのソースを見ても、IPv4やIPv6のアドレスを調べるのに、
requestsモジュールだけを使って何とかしていましたし(reモジュールも使っているけど)。

seleniumを使わないダイナミックDNSへのアクセス方法
前回、前々回のものを見てない人への説明をすると、
この記事のシリーズでは、バリュードメインのダイナミックDNSサーバーに、
よく変わるグローバル動的IPアドレスを伝えるために、
CGI経由でアクセスするスクリプトにまつわることを書いています。
バリュードメイン以外のドメイン管理会社のドメインを使っている人には、
スクリプトを作るヒントにはなっても、そのままでは使えない予定。

使うのは、やっぱりPython3です。
そして、requestsモジュールとreモジュールは使います。
最近のUbuntu系ならrequestsは入っていると思うけど、
エラーが出る人のためのコマンドが、
pip3 install requests re
そして、Python3のスクリプト。
名前は、とりあえず、また「breasts.py」にしますか。
どうせ今までのファイルを上書きするし。

import requests
import re

def get_gip_addr():
    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

#IP確認用
#if __name__ == '__main__':
#    print('IPv4 = '+get_gip_addr())
#    print("IPv6 = "+get_ipv6())

IPv4=get_gip_addr()
IPv6=get_ipv6()


def dns_henkou(kazu):
    if kazu==4:
        IP=IPv4
    else:
        IP=IPv6

    # 対象ページへアクセス
    UUU = (URL + "d=" + DOMAIN + "&p=" + PASS + "&h=" + HOST + "&i=" + str(IP))
    # 結果表示が見たいなら次の2行「#」を消す
    #print(DOMAIN)
    #print(requests.get(UUU).text + "\n")


URL = "https://dyn.value-domain.com/cgi-bin/dyn.fcg?"
# 自分が取得したドメインの設定に合わせる
DOMAIN = "nantoka.site"
PASS = "tasticles"
HOST = "*"

dns_henkou(4)
dns_henkou(6)
#DOMAINの値を変えればマルチドメインでもいける
DOMAIN = "sukini.site"
dns_henkou(4)
dns_henkou(6)

#終了
quit()


反応がない・・・ように見えるだけ。
今回は、表示も何もしませんし、
何かアクション起こしたかどうかわからないぐらいの、
まるでウイルス? のような動きです。
(結果表示をするものはコメントアウトしています)
水面下で動くスクリプトなんて、こんなもんでいいのです。
では、前々回のものを見て、自動起動するなりしてください。

グローバルIPアドレスが変わった瞬間からアクセスさせたい
常駐プログラムじゃないから、それは無理です。
それに、仮に常駐させても、IPアドレスの変更を知るために、
何度もIPアドレスがわかるサイトにアクセスしたら、
サイトが動かなくなってしまいます。

プロバイダ(インターネット回線を使わせてくれるインターネット屋さん)によって、
グローバル変動IPアドレスがいつ変わるかは、まちまちですが、
一説によると、日付をまたぐ(午前0時を過ぎる)とIPアドレスが変わることがあると。
それが本当なら、それの対策ぐらいなら、crontabに働かせられます。

crontabを動かすのはいいのですが、
Python3は、sudo権限で動かすとエラーになるときがあるので、
sudo権限がかからない、sudo crontabじゃないcrontabを使います。
crontab -e

crontab、反応がない!
crontabで時刻を設定して、pyファイルを動かします。
crontabの末尾に追記するのは、
たった1行。

 * * * * * python3 /opt/breasts.py

・・・動きません。
いや、動かそうとしてエラーを起こしています。
というよりも、そもそもpython3が動けてない。
じゃあ、python3の絶対パスを指定して、

* * * * * /usr/bin/python3 /opt/breasts.py

・・・動きません。
むかついたので、ログが出るようにしてみます。

* * * * * /opt/cron_breasts.sh > /home/cunt/rogu.log

python3ファイルも、いったん差し替えます。

print("ろぐろぐろぐろぐろぐ、ろぐ!")
import re
import requests
print("ここまで実行できるかな?")


ホームに出現するrogu.txt(print文で表示されるものがログに書き込まれる)を見ると、

ろぐろぐろぐろぐろぐ、ろぐ!

「ここまで実行できるかな?」の分はなし。
動けない原因を調べると、
何かしらの事情によりモジュールやらプラグインやらが、
インストールされていないことにされています。
なにこれ。。。
もしかしたら、crontabで動く分はPATHが通っていないっぽい?

ならばパスを通すまで!

モジュール類のPATHを通す
まず、$PATHと呼ばれているものを表示させます。
echo $PATH
するとこんな表示が。

/usr/local/sbin:/usr/local/bin:usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

python3のモジュール類のPATHは出てきません。これに用があるのに。
とりあえずぐぐってみたら、いろいろ難しい言葉を使って「PATHを通せ」と書かれているけど、
モジュール類のありか=PATHはどうしたらわかるのか。
これもぐぐってみました。bingで。
python3を実行するthonnyを使って、モジュール類のパスを調べるため、
まずスクリプトを組んで実行します。

import re
import requests
print(re.__file__)
print(requests.__path__)

モジュールもプラグインも区別が全然つかないけど、勘と手数でなんとかする。
動けばNGなし。
これをそのまま実行して動かします。
私はthonnyをインストールしてやっていますが、コマンドでもいいです。

/usr/lib/python3.10/re.py
['/usr/lib/python3/dist-packages/requests']

これを、crontabに組み込みます。


$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
1 0 * * * python3 /opt/breasts.py

これでよかろう。
これを追加することによって、python3ファイルは、モジュールごと動かせるようになりました。
(ただしreとrequestsだけ)
なお、一度PATHを設定すると、消してもPATHは有効になっている模様。
でも、将来またPATHを追記するんだから、
(Python3をちょくちょく使うならばほぼ当たり前にPATHが増えると思う)
変な指定のされ方しないためにも、
残しておいたほうがいいでしょう。
それに、PATH通したというログにもなるし。
一度$PATHとモジュール類のPATHを調べてから、それを組み込めばやれるようです。
crontabにこんな罠があったなんて。

ログインしたら自動起動する、
また、ログインそのものも自動化することに関しては、
前々回をご覧ください。

ところが・・・更新できない!
スクリプトが正しく動いても、
バリュードメインのCGIが正常に働いて、
DNS情報を更新してくれはするけれど、
にホームページが見られるようにはなりませんでした。
対策考えます。

!(おしまい)
「not おしまい」というわけで、つづく。


参考資料
Python, Requestsの使い方(note.nkmk.me)
https://note.nkmk.me/python-requests-usage/
cronが動かない!?いや、動かないのではなく…(Qiita)
【Python】モジュール・パッケージのインストールパスを確認する方法 (鎖プログラム)

その他の資料は前回、前々回と同じ。