3
2

More than 3 years have passed since last update.

Pythonで「インターネット アクセスなし」から蘇る

Last updated at Posted at 2020-03-15

はじめに

みなさん、突然の「インターネットアクセスなし」に悩まされていませんか?

netsh_test1 (3)_LI.jpg

私は悩まされていました。
定型業務を自動化するためにスクリプトを組んで古いPCに常駐させているのですが、
PCをつけっぱなしにしているといつの間にか「インターネット アクセスなし」の状態になっていて、手動でPCのネットワークを切断、再接続する必要がありました。
自動化して放置しているのにいつの間にか処理が止まってるの、怖いですよね。

そこで、スクリプト内でネットワークの状態確認、再接続を行うようにしてみたので紹介します。

(そもそもなんでインターネットアクセスなしになるのかとか分からないので詳しい人教えてください)

環境

・Windows7
・Anaconda3

とりあえず結論(コード)

内容はほぼWindowsのコマンドですが、スクリプトの一部のためPythonからコマンドを呼び出しています。

def is_ping_ok():
    proc = subprocess.run(["ping", "yahoo.co.jp"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    ret = proc.stdout.decode("cp932")
    if "見つかりません" in ret:
        return False
    else: return True

def restart_network():
    subprocess.run(["netsh", "wlan", "disconnect"])
    subprocess.run(["netsh", "wlan", "connect", 'name="接続したいSSID"'])
    time.sleep(5)

def check_network():
    if not is_ping_ok():
        restart_network()

        if is_ping_ok():
            return "Restarted!"
        else: return "Error"
    return "OK"

とりあえず一回試して復活しなければあきらめるようにしていますが、負けず嫌いの方は復活するまで徹底的に再帰してもいいかと思います。

解説

ネットワークの状態を確認

インターネットアクセスがあるかどうかは ping コマンドで確認します。
突然出てきたsubprocessに関してはこの記事とか参照してみてください。

下記はインターネットアクセスありの場合

>>> import subprocess

>>> proc = subprocess.run(["ping","yahoo.co.jp"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> print(proc.stdout.decode("cp932"))

yahoo.co.jp [182.22.59.229] ping を送信しています 32 バイトのデータ:
182.22.59.229 からの応答: バイト数 =32 時間 =11ms TTL=50
182.22.59.229 からの応答: バイト数 =32 時間 =16ms TTL=50
182.22.59.229 からの応答: バイト数 =32 時間 =21ms TTL=50
182.22.59.229 からの応答: バイト数 =32 時間 =21ms TTL=50

182.22.59.229  ping 統計:
    パケット数: 送信 = 4受信 = 4損失 = 0 (0% の損失)
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 11ms最大 = 21ms平均 = 17ms

インターネットアクセスなしの場合

>>> proc = subprocess.run(["ping","yahoo.co.jp"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> print(proc.stdout.decode("cp932"))
ping 要求ではホスト yahoo.co.jp が見つかりませんでしたホスト名を確認してもう一度実行してください

返り値に「見つかりません」が含まれる場合に、インターネットアクセスなしと判定することにしました。
ここは端末の言語とかによると思います。

def is_ping_ok():
    proc = subprocess.run(["ping", "yahoo.co.jp"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    ret = proc.stdout.decode("cp932")
    if "見つかりません" in ret:
        return False
    else: return True

ネットワーク再起動

インターネットアクセスなしになっていた場合、下記コマンドでネットワークの再接続を試みます。
コマンドの詳細はこの記事を参考にしました。

> netsh wlan disconnect
インターフェイス "ワイヤレス ネットワーク接続" の切断要求が正常に完了しました。

> netsh wlan connect name="接続したいSSID"
接続要求が正常に完了しました。

pythonで呼び出すと下記のようになります。
接続完了しないまま次の処理へ移らないよう、sleepを入れてます。

def restart_network():
    subprocess.run(["netsh", "wlan", "disconnect"])
    subprocess.run(["netsh", "wlan", "connect", 'name="接続したいSSID"'])
    time.sleep(5)

まとめ

突然の「インターネットアクセスなし」と戦うすべを紹介しました。

もっとスマートなやり方募集してます。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2