第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話
このお話は第2話です。
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話
実用的な解決方法に興味がある方は、第5話以降をお読みください。このお話は第2話です。
このお話で出てくるスクリプトは、役に立ちません。
前回までのあらすじ
自鯖でホームページやりたい。
だがしかし、マシンに電源を入れるごとにIPアドレスが変わってしまうのであった。
それを解決するために、電源を入れてログインしたらIPv4アドレスを勝手に調べて、
勝手に更新するPython3スクリプトを作ったはいいものの・・・。
IPv6にも対応しようぞ
インターネットの回線には、IPv4とIPv6があります。
バリュードメインのダイナミックDNSは、IPv6アドレスにも対応できるように設定できます。
具体的な設定例
a * 206.52.8.143
aaaa * 2404:4fa2:c50e:93f:12ba:803d:2c5b:90a1
こんなかんじ(IPアドレスの数字は、それっぽく書いたでたらめな数字です)。
こんな設定をしている場合は、IPv4のほかに、IPv6も更新しなければ、
つながりません。ホームページ見せられません。
しかも、グローバルIPアドレス。
事前準備
先に、ダイナミックDNSを設定して、
こんな画面を出して、パスワードを設定する。
そして、下のほうにある四角にチェックをつけて、
ダイナミックDNSを有効にする。
これをやらないと、スクリプトだけでは対応できません。
Windows的にだって、DiCE使っても無理。
なお、これはPython3のchromium、seleniumを使うので、
コマンド打ち込んでインストールする。
sudo apt install chromium-browser
pip install selenium
素のままのPython3でグローバルIPアドレスを知る方法
ローカルIPアドレスを知ることはできますが、
グローバルIPアドレスを知ることはできません。
一応IPアドレス関連のモジュールはあるようですが、
使い方がわからなかったけど、グローバルIPアドレスを調べるというよりは、
IPアドレスを設定するほうがメインになっているっぽかった。
もしかして、マシンから何かを発信して、
信号を受けたサイトからしかグローバルIPはわからないっぽい?
なんでもありならできなくもないみたいだけど。
そういう事情があるので、IPv6アドレスがわかるサイト、
しかもプレーンテキストでわかるサイト・・・はない。
でも、プレーンテキストに近い形でIPv6アドレスを表示してくれるサイトはありました。
IPv4
IPv6
なお、この2つのサイトは、SSL認証していないので、
ほぼ検索にはひっかかりません。
この状況はなんとかしてほしい。
DuckDuckGoですら検索八分はないでしょ。
Python3スクリプトを改造する
IPv6アドレスの取得方法はわかりました。
というわけで、IPv4にもIPv6にも対応させたスクリプトにします。
・・・正規表現も文字列操作もわけわかめ。
とりあえず、IPv6アドレスをわかる方法。
import requests
import re
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:head:body:Current:IP:Address:","",ip)
ip=re.sub(":body:html","",ip)
print(ip)
このスクリプトを取り入れて、改造したbreasts.pyは、
こうなります。
import time
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://dyn.value-domain.com/cgi-bin/dyn.fcg?"
# 自分が取得したドメインの設定に合わせる
DOMAIN = "nantoka.site"
PASSWORD = "tasticles"
HOSTNAME = "*"
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()
# ドライバー指定で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 chrome_sousa(IP):
if IP==4:
IPv_=IPv4
else:
IPv_=IPv6
# 対象ページへアクセス
driver.get(URL)
# スクリーンショットを取得
#driver.save_screenshot('result.png')
# テキストを入力する
driver.find_element_by_name("d").send_keys(DOMAIN)
driver.find_element_by_name("p").send_keys(PASSWORD)
driver.find_element_by_name("h").send_keys(HOSTNAME)
driver.find_element_by_name("i").clear()
driver.find_element_by_name("i").send_keys(IPv_)
# 見せる用。このスリープに意味はない。
time.sleep(5)
# 要素を取得する。F12押してのデバッグモードでxpathをコピーして値をペースト。
# xpathが作り出す文字の法則なんか知らん。
ele = driver.find_element_by_xpath("/html/body/form/center/table/tbody/tr[5]/td/input")
# ある要素をクリックする
ele.click()
# 更新できたか確認するためのスリープ5秒
time.sleep(5)
#DOMAIN = "nantoka.site"
#PASSWORD = "tasticles"
#HOSTNAME = "*"
chrome_sousa(4)
chrome_sousa(6)
#マルチドメインでもいける
DOMAIN = "sukini.site"
chrome_sousa(4)
chrome_sousa(6)
# ブラウザ終了(終わるときのお約束)
driver.quit()
quit()
別解
このページを見つけました。
このページでは、CGIからアクセスするときの、
URL(URI?)の記述方法が書かれています。
普通にアドレス欄に、ドメインとか何やら書き込んでアクセスすればいいので、
もう少し簡単にできたのでした。
import time
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://dyn.value-domain.com/cgi-bin/dyn.fcg?"
# 自分が取得したドメインの設定に合わせる
DOMAIN = "nantoka.site"
PASS = "tasticles"
HOST = "*"
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()
# ドライバー指定で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 dns_henkou(kazu):
if kazu==4:
IP=IPv4
else:
IP=IPv6
# 対象ページへアクセス
UUU = (URL + "d=" + DOMAIN + "&p=" + PASS + "&h=" + HOST + "&i=" + IP)
driver.get(UUU)
#DOMAIN = "nantoka.site"
#PASSWORD = "tasticles"
#HOSTNAME = "*"
dns_henkou(4)
dns_henkou(6)
#マルチドメインでもいける
DOMAIN = "sukini.site"
dns_henkou(4)
dns_henkou(6)
# ブラウザ終了(終わるときのお約束)
driver.quit()
quit()
もしかしたら、お名前ドットコムやムームードメインとかでも、
似たようなCGIはあるかもしれません。
本を作るとなれば、ドメイン取得して調べるべきか・・・?
自動起動する
前回のを見てね。変更点ないから。
https://ameblo.jp/araya-benki/entry-12766410252.html
ちなみに
やり方しだいでは、月額100円前後でサーバー運営できるらしいです。
https://news.mynavi.jp/techplus/article/zeropython-43/
ロシアショックとコロナショックのせいで、電気代がうなぎのぼりなので、
この状況だったらサーバー借りたほうがいいかもしれません。
・・・設備が怪しい外国に引っ越してサーバーたてるとか、
そういう用途なら自鯖構築は覚えたほうがいいと思います。
現実的な考えをするならば、
日本の常識が外国でも通用するとは思わないほうがいいし、
自分の考えている常識や正義が、ほかの人にも通用するとは思わないほうが身のためです。
!(おしまい)
似たようなCGIはあるかもしれません。
本を作るとなれば、ドメイン取得して調べるべきか・・・?
自動起動する
前回のを見てね。変更点ないから。
https://ameblo.jp/araya-benki/entry-12766410252.html
ちなみに
やり方しだいでは、月額100円前後でサーバー運営できるらしいです。
https://news.mynavi.jp/techplus/article/zeropython-43/
ロシアショックとコロナショックのせいで、電気代がうなぎのぼりなので、
この状況だったらサーバー借りたほうがいいかもしれません。
・・・設備が怪しい外国に引っ越してサーバーたてるとか、
そういう用途なら自鯖構築は覚えたほうがいいと思います。
現実的な考えをするならば、
日本の常識が外国でも通用するとは思わないほうがいいし、
自分の考えている常識や正義が、ほかの人にも通用するとは思わないほうが身のためです。
!(おしまい)
なんと、まだこの書き込みには続きがあったのです。
参考資料
【Python】IPアドレスを取得する方法(ゆうまるブログ)
https://yumarublog.com/python/ipaddress/
Pythonの正規表現の基本的な使い方(UX MILK)
https://uxmilk.jp/41416
Pythonで余計な文字列を削除する方法(HACK note)
https://hacknote.jp/archives/19937/