PythonとSubprocessで学ぶWi-Fi情報取得プロジェクト

目次

プロジェクト概要

前提条件

  • Pythonプログラミングの基本的な知識(変数、関数、クラスの概念)
  • VSCodeエディタの基本操作ができること
  • ターミナル(コマンドライン)の基本的な使用経験
  • Gitとバージョン管理の基礎知識
  • WindowsまたはmacOSの基本的な操作経験

開発環境

  • Python 3.7以上
  • VSCode(Visual Studio Code)
  • Windows 10以上またはmacOS 10.14以上
  • Git(バージョン管理システム)
  • GitHubアカウント

プロジェクト内容

このプロジェクトでは、Pythonのsubprocessモジュールを使用して、現在接続中のWi-Fiネットワークの名前とパスワードを自動取得するシステムを構築します。初心者でも段階的に学習できるよう、基本的な環境設定からクロスプラットフォーム対応まで、4つのステップに分けて実装していきます。

プロジェクトの核となるのは、各OSのシステムコマンドを活用したネットワーク情報の取得技術です。Windows環境ではnetshコマンド、macOS環境ではnetworksetupとsecurityコマンドを使用し、それぞれのOSに最適化された処理を自動選択するシステムを開発します。これにより、実際の業務で活用できる実用的なツールを作成できます。

データ取得においては、文字列処理技術を活用してコマンド出力を解析し、Wi-Fi名とパスワード情報を正確に抽出します。単純な情報取得にとどまらず、エラーハンドリングや権限管理も実装し、実際の運用環境でも安定して動作するシステムを構築します。

プロジェクトの特徴として、クロスプラットフォーム対応を重視した設計を採用しています。実際のシステム開発では、様々なOS環境での動作が求められることが多く、このプロジェクトを通じてOS判定技術やプラットフォーム固有の処理分岐を学習できます。

また、セキュリティ面への配慮も重要な学習要素として含まれています。ネットワーク認証情報という機密性の高いデータを扱うため、適切なエラーハンドリングと権限確認の実装方法を学習し、安全なシステム開発の基礎を身につけることができます。

実装内容

  • subprocessモジュールを使用したシステムコマンド実行
  • OS自動判定機能とプラットフォーム別処理分岐
  • 文字列処理による情報抽出(split、strip、decode)
  • Wi-Fi接続情報とパスワードの安全な取得
  • エラーハンドリングとタイムアウト管理
  • クロスプラットフォーム対応(Windows/macOS)
  • GitHubでのバージョン管理とポートフォリオ公開

得られるスキル

  • subprocessモジュール(システムコマンド実行と結果取得)
  • 文字列処理技術(split、strip、decodeメソッドの活用)
  • OS判定とプラットフォーム分岐処理
  • エラーハンドリング(try-except文とタイムアウト処理)

得られる経験

  • システムレベルでのコマンド実行経験
  • ネットワーク設定情報の取得と管理経験
  • クロスプラットフォーム開発の実践経験

得られる成果物

  • 完全に動作するWi-Fi情報取得ツール
  • GitHubでのポートフォリオとして活用可能なプロジェクト
  • 完全なPythonソースコード

このプロジェクトから応用できること

  • 社内ネットワーク設定確認業務の自動化
  • IT設定サポート業務での情報取得ツール開発
  • ヘルプデスク業務でのトラブルシューティング支援
  • システム管理業務での設定情報収集ツール作成
  • 小規模なIT作業の自動化案件への応用

Step1:開発環境の準備とプロジェクト構造の作成

このステップでは、ネットワーク情報取得プロジェクトを始めるための開発環境を整備し、必要なファイル構造を作成していきます。プログラミングを始める前の準備段階として、とても重要な作業になります。

※Step1の内容がわからない際は、下記記事にGitHubとVSCodeの連携について詳細を記載しているためご参照ください。

GitHubリポジトリの作成

まず最初に、プロジェクト専用のGitHubリポジトリを作成しましょう。

  1. GitHubの公式サイトにアクセスし、自分のアカウントでログインします
  2. 画面右上の「+」アイコンをクリックし、ドロップダウンメニューから「New repository」を選択します
  3. 新しいリポジトリの作成ページで、以下の情報を入力します

リポジトリの設定

  • Repository namenetwork_info_tool」と入力
  • Descriptionシステムコマンドを活用したネットワーク情報取得ツール」と入力
  • VisibilityPublic」を選択(ポートフォリオとして公開するため)
  • Initialize this repository with
    • Add a README file」にチェックを入れる
    • Add .gitignore」で「Python」を選択
    • Choose a license」は「None」のままにする
  1. Create repository」ボタンをクリックしてリポジトリを作成します

プロジェクトフォルダの作成

次に、プロジェクトを管理するための親フォルダを作成しましょう。

Windows・macOS共通

  1. デスクトップや任意の場所に新しいフォルダを作成します
  2. フォルダ名は任意ですが、ここでは例として「PythonPortfolio」に設定します

この親フォルダが、今後のプロジェクト全体を管理するルートディレクトリとなります。複数のプロジェクトを整理して管理するために作成しておくと便利です。

VSCodeでプロジェクトを開く

作成したGitHubリポジトリをローカルにクローンして開きましょう。

  1. VSCodeを起動します
  2. 左側のアクティビティバーからソース管理アイコン(分岐のようなアイコン)をクリックします
  3. リポジトリの複製」ボタンをクリックします
  4. GitHubから複製」を選択します
  5. 先ほど作成した「network_info_tool」リポジトリを選択します
  6. リポジトリ宛先として先ほど作成した親フォルダを選択します
  7. クローンしたリポジトリを開きますか」というウィンドウが表示されたら「開く」をクリックします

VSCodeの左側にエクスプローラーパネルが表示され、現在のプロジェクトフォルダの中身が確認できるようになります。

仮想環境の作成とアクティベート

Python開発において仮想環境は非常に重要です。仮想環境とは、プロジェクトごとに独立したPython実行環境を作成する仕組みのことです。これにより、プロジェクト間でのライブラリの競合を防ぎ、クリーンな開発環境を維持できます。

詳しくは下記記事をご参照ください。

Windows環境での仮想環境作成

  1. VSCodeの上部メニューから「ターミナル」→「新しいターミナル」を選択
  2. 以下のコマンドで仮想環境を作成します
python -m venv myenv
  1. 仮想環境をアクティベートします
myenv\Scripts\activate

macOS環境での仮想環境作成

  1. VSCodeの上部メニューから「ターミナル」→「新しいターミナル」を選択
  2. 以下のコマンドで仮想環境を作成します
python3 -m venv myenv
  1. 仮想環境をアクティベートします
source myenv/bin/activate

重要なポイント

  • 仮想環境名は「myenv」として作成
  • ターミナルの行頭に「(myenv)」と表示されることを確認
  • この表示があることで、仮想環境が正常にアクティベートされていることがわかります

プロジェクトファイル構造の作成

次に、今回のネットワーク情報取得プロジェクトに必要なファイルを作成していきます。VSCodeのエクスプローラーパネルを使用してファイルを作成しましょう。

メインプログラムファイルの作成

  1. VSCodeの左側エクスプローラーパネルで「新しいファイル」アイコン(ファイルの絵とプラスのマークがあるアイコン)をクリック
  2. ファイル名を「wifi_manager.py」として作成

この「wifi_manager.py」ファイルが、今回のネットワーク情報取得機能を実装するメインプログラムとなります。.py拡張子Pythonスクリプトファイルであることを示しており、実行可能なプログラムコードを記述するために使用します。

設定ファイルの作成

  1. プロジェクトのルートフォルダ(network_info_tool)で「新しいファイル」アイコンをクリック
  2. ファイル名を「config.py」として作成

config.py」ファイルは、プログラムで使用する設定値や定数を管理するためのファイルです。今回のプロジェクトでは、各OS用のシステムコマンドの設定などを記述します。

依存関係管理ファイルの作成

  1. プロジェクトのルートフォルダ(network_info_tool)をクリックして選択
  2. 新しいファイル」アイコンをクリック
  3. ファイル名を「requirements.txt」として作成

requirements.txtファイルは、Pythonプロジェクトで使用する外部ライブラリとそのバージョンを記録するための重要なファイルです。これにより、他の開発者や本番環境でも同じライブラリ環境を再現できます。

requirements.txtの内容設定

作成した「requirements.txt」ファイルをVSCodeで開き、以下の内容を記述してください。

# 今回のプロジェクトでは標準ライブラリのみを使用
# 外部ライブラリは使用しません

今回のプロジェクトでは、標準ライブラリのみを使用するため、特別なライブラリのインストールは必要ありません。

  • subprocess Pythonの標準ライブラリで、システムコマンドを実行するためのモジュールです。WindowsやmacOSのネットワーク設定コマンドを呼び出す際に使用します
  • os オペレーティングシステムとの間でやり取りを行うためのライブラリです。実行しているOSの種類を判別する際に使用します

プロジェクト構造の確認

この時点で、VSCodeのエクスプローラーパネルには以下のような構造が表示されているはずです。

network_info_tool/
├── myenv/                      # 仮想環境フォルダ
├── wifi_manager.py             # メインプログラムファイル
├── config.py                   # 設定管理ファイル
├── requirements.txt            # 依存関係管理ファイル
├── README.md                   # プロジェクト説明書(GitHub作成時に自動生成)
└── .gitignore                  # Git除外設定ファイル(GitHub作成時に自動生成)

この基本構造が、今回のネットワーク情報取得プロジェクトの基盤となります。GitHubで作成したリポジトリをクローンしたため、README.md.gitignoreファイルが最初から含まれています。

設定ファイルの準備

今回のプロジェクトで使用するシステムコマンドの設定を準備しましょう。作成した「config.py」ファイルをVSCodeで開き、以下の内容を記述してください。

# Windows用とmacOS用のコマンド設定をここで管理します
# 実際の内容は次のステップで追加予定

プロジェクトの初期確認

仮想環境が正常にアクティベートされていることを再度確認しましょう。

  1. VSCodeのターミナルで行頭に「(myenv)」が表示されていることを確認
  2. 以下のコマンドでPythonのバージョンを確認

Windows環境の場合

python --version

macOS環境の場合

python3 --version

正常にバージョンが表示されれば、開発環境の準備は完了です。次のステップでは、実際にネットワーク情報を取得するプログラムの実装を開始していきます。

Step2:基本的なネットワーク情報取得機能の実装

このステップでは、subprocessモジュールを活用してシステムコマンドを実行し、Wi-Fiネットワーク情報を取得する基本機能を実装します。Windows・macOS両対応のクロスプラットフォームなプログラムを作成していきます。

NetworkInfoManagerクラスの作成

まず、ネットワーク情報取得機能をまとめて管理するクラスを作成します。このクラスの中に、今後必要な機能をすべてdef文(関数)として実装していきます。

wifi_manager.py」ファイルをVSCodeで開き、以下のコードを記述してください。

# 必要なライブラリをインポート
import subprocess  # システムコマンドを実行するためのライブラリ
import os  # ファイルやフォルダの操作に使用
import platform  # 実行中のOSを判定するためのライブラリ


class NetworkInfoManager:
    """Wi-Fiネットワーク情報を取得・管理するクラス"""
    
    def __init__(self):
        """クラスが作成されたときに最初に実行される関数"""
        # 現在動作しているOSの名前を取得して保存
        self.operating_system = platform.system()
        # 検出されたOSをユーザーに表示
        print(f"検出されたOS: {self.operating_system}")

__init__メソッドはクラスの初期化を行う特別な関数です。ここでOSの種類を自動判定し、後の処理で適切なコマンドを選択できるようにします。

OS判定機能の実装

次に、クラス内にcheck_platformメソッドを実装します。

    def check_platform(self):
        """実行中のOSを判定して、使用するコマンドの種類を決める関数"""
        # WindowsかMacかLinuxかを判定
        if self.operating_system == "Windows":
            # Windowsの場合は"windows"を返す
            return "windows"
        elif self.operating_system == "Darwin":  # macOSは内部的にDarwinという名前
            # macOSの場合は"macos"を返す
            return "macos"
        else:
            # それ以外のOSの場合はエラーメッセージを表示
            print(f"サポートされていないOS: {self.operating_system}")
            return "unsupported"

このメソッドはクラス内で定義されているため、selfキーワードを使用してクラスの属性にアクセスできます。

システムコマンド実行機能の実装

subprocessモジュールを使用してシステムコマンドを安全に実行する機能を追加します。

    def execute_command(self, command_list):
        """コマンドを実行して結果を取得する関数
        
        Args:
            command_list: 実行したいコマンドをリスト形式で指定
            
        Returns:
            str: コマンドの実行結果(文字列)、失敗した場合はNone
        """
        try:
            # subprocessを使ってコマンドを実行
            result = subprocess.check_output(
                command_list,  # 実行するコマンドのリスト
                stderr=subprocess.STDOUT,  # エラーメッセージも結果に含める
                timeout=10  # 10秒でタイムアウトする設定
            )
            # コマンドの結果はバイト形式なので、文字列に変換して返す
            return result.decode('utf-8', errors='ignore')
        except subprocess.CalledProcessError as e:
            # コマンドの実行が失敗した場合
            print(f"コマンド実行エラー: {e}")
            return None
        except subprocess.TimeoutExpired:
            # コマンドが指定時間内に終わらなかった場合
            print("コマンドがタイムアウトしました")
            return None
        except Exception as e:
            # その他の予想外のエラーが発生した場合
            print(f"予期しないエラー: {e}")
            return None

subprocess.check_outputは、外部コマンドを実行して結果を取得するための関数です。decode()メソッドでバイト列を文字列に変換しています。

現在接続中のWi-Fi名取得機能

各OS用のコマンドを使用してWi-Fi名を取得する機能を実装します。

    def get_current_wifi_name(self):
        """現在接続中のWi-Fiネットワークの名前を取得する関数
        
        Returns:
            str: Wi-Fi名、取得に失敗した場合はNone
        """
        # まず現在のOSを判定
        platform_type = self.check_platform()
        
        if platform_type == "windows":
            # Windows環境の場合
            # netshコマンドでWi-Fiのインターフェース情報を取得
            command = ["netsh", "wlan", "show", "interfaces"]
            # 上で定義したexecute_command関数でコマンドを実行
            output = self.execute_command(command)
            
            if output:
                # コマンドの結果からWi-Fi名を抽出
                return self._parse_windows_wifi_name(output)
                
        elif platform_type == "macos":
            # macOS環境の場合
            # networksetupコマンドで現在のWi-Fiネットワークを取得
            command = ["networksetup", "-getairportnetwork", "en0"]
            # コマンドを実行
            output = self.execute_command(command)
            
            if output:
                # コマンドの結果からWi-Fi名を抽出
                return self._parse_macos_wifi_name(output)
        
        # どちらでもない場合やエラーの場合はNoneを返す
        return None

この関数では、OS別に適切なコマンドを選択して実行し、結果を解析します。

Windows用データ解析機能

Windows netshコマンドの出力からWi-Fi名を抽出する機能を実装します。

    def _parse_windows_wifi_name(self, command_output):
        """Windowsのnetshコマンドの結果からWi-Fi名を取り出す関数
        
        Args:
            command_output: netshコマンドの実行結果(文字列)
            
        Returns:
            str: Wi-Fi名、見つからない場合はNone
        """
        # コマンドの結果を改行文字で分割して、1行ずつ処理
        lines = command_output.split('\n')
        
        # 各行を順番にチェック
        for line in lines:
            # 行の前後にある余分な空白を削除
            cleaned_line = line.strip()
            
            # この行に"ssid"という文字が含まれているかチェック(大文字小文字区別なし)
            # 同時に":"(コロン)も含まれているかチェック
            if "ssid" in cleaned_line.lower() and ":" in cleaned_line:
                # コロンで文字列を分割(最初のコロンのみで分割)
                parts = cleaned_line.split(":", 1)
                # 分割が正常にできた場合
                if len(parts) >= 2:
                    # コロンの右側がWi-Fi名なので取得
                    wifi_name = parts[1].strip()  # 前後の空白も削除
                    # Wi-Fi名が空でない場合は返す
                    if wifi_name and wifi_name != "":
                        return wifi_name
        
        # どの行からもWi-Fi名が見つからなかった場合
        return None

split()メソッドで文字列を分割し、strip()メソッドで不要な空白を除去してデータを整理します。

macOS用データ解析機能

macOS networksetupコマンドの出力からWi-Fi名を抽出する機能を実装します。

    def _parse_macos_wifi_name(self, command_output):
        """macOSのnetworksetupコマンドの結果からWi-Fi名を取り出す関数
        
        Args:
            command_output: networksetupコマンドの実行結果(文字列)
            
        Returns:
            str: Wi-Fi名、見つからない場合はNone
        """
        # コマンドの結果を改行で分割
        lines = command_output.split('\n')
        
        # 各行をチェック
        for line in lines:
            # 前後の空白を削除
            cleaned_line = line.strip()
            
            # "Current Wi-Fi Network:"という文字列が含まれる行を探す
            if "current wi-fi network:" in cleaned_line.lower():
                # コロンで分割してWi-Fi名の部分を取得
                parts = cleaned_line.split(":", 1)
                if len(parts) >= 2:
                    # コロンの右側がWi-Fi名
                    wifi_name = parts[1].strip()
                    return wifi_name
        
        # 見つからなかった場合
        return None

ネットワーク情報表示機能

取得したネットワーク情報を整理して表示する機能を実装します。

    def display_network_info(self):
        """取得したネットワーク情報をわかりやすく表示する関数"""
        # 見やすくするために区切り線を表示
        print("=" * 50)
        print("ネットワーク情報取得ツール")
        print("=" * 50)
        
        # 上で作った関数を使って現在のWi-Fi名を取得
        current_wifi = self.get_current_wifi_name()
        
        # Wi-Fi名が取得できた場合
        if current_wifi:
            print(f"接続中のWi-Fi: {current_wifi}")
        else:
            # 取得できなかった場合
            print("Wi-Fi接続が見つかりません")
        
        # 終了の区切り線
        print("=" * 50)

メイン実行部分の実装

プログラムのエントリーポイントとなるmain関数を実装します。

def main():
    """プログラムが実行されたときに呼び出されるメイン関数"""
    try:
        # NetworkInfoManagerクラスのインスタンスを作成
        network_manager = NetworkInfoManager()
        
        # ネットワーク情報を表示する関数を呼び出し
        network_manager.display_network_info()
        
    except KeyboardInterrupt:
        # ユーザーがCtrl+Cでプログラムを中断した場合
        print("\nプログラムが中断されました")
    except Exception as e:
        # その他のエラーが発生した場合
        print(f"プログラム実行エラー: {e}")


# このファイルが直接実行された場合のみmain関数を呼び出す
# 他のファイルからimportされた場合は実行されない
if __name__ == "__main__":
    main()

if name == “main”は、このファイルが直接実行された場合のみmain関数を呼び出すためのPythonの構文です。

動作テスト実行

VSCodeのターミナルでプログラムを実行してテストします。

Windows環境の場合

python wifi_manager.py

macOS環境の場合

python3 wifi_manager.py

出力結果

検出されたOS: Windows
==================================================
ネットワーク情報取得ツール
==================================================
接続中のWi-Fi: MyHomeNetwork
==================================================

Step3:Wi-Fiパスワード取得機能の実装

このステップでは、Step2で作成したWi-Fi名取得機能に加えて、Wi-Fiパスワードを取得する機能を実装します。Windows・macOSそれぞれのシステムコマンドを活用して、接続中のネットワークの認証情報を安全に取得していきます。

Wi-Fiパスワード取得機能の追加

NetworkInfoManagerクラスに、Wi-Fiパスワードを取得するメソッドを追加します。wifi_manager.pydisplay_network_infoメソッドの後に、以下のコードを追加してください。

    def get_wifi_password(self, wifi_name):
        """指定されたWi-Fiネットワークのパスワードを取得する関数
        
        Args:
            wifi_name: パスワードを調べたいWi-Fi名
            
        Returns:
            str: Wi-Fiパスワード、取得に失敗した場合はNone
        """
        # Wi-Fi名が指定されていない場合は処理を中止
        if not wifi_name:
            return None
            
        # 現在のOSを判定
        platform_type = self.check_platform()
        
        if platform_type == "windows":
            # Windows環境の場合
            # netshコマンドでWi-Fiプロファイルの詳細情報を取得
            # "key=clear"オプションでパスワードを平文で取得
            command = ["netsh", "wlan", "show", "profile", wifi_name, "key=clear"]
            # コマンドを実行
            output = self.execute_command(command)
            
            if output:
                # コマンドの結果からパスワードを抽出
                return self._parse_windows_wifi_password(output)
                
        elif platform_type == "macos":
            # macOS環境の場合
            # securityコマンドでキーチェーンからパスワードを取得
            command = ["security", "find-generic-password", "-wa", wifi_name]
            # コマンドを実行
            output = self.execute_command(command)
            
            if output:
                # コマンドの結果からパスワードを抽出
                return self._parse_macos_wifi_password(output)
        
        # どのOSでもない場合やエラーの場合
        return None

この関数では、Wi-Fi名を引数として受け取り、OS別に適切なコマンドを実行してパスワードを取得します。key=clearオプションにより、暗号化されていないパスワードを取得できます。

Windows用パスワード解析機能の実装

Windows netshコマンドの出力からパスワードを抽出する機能を実装します。get_wifi_passwordメソッドの後に追加してください。

    def _parse_windows_wifi_password(self, command_output):
        """Windowsのnetshコマンドの結果からパスワードを取り出す関数
        
        Args:
            command_output: netsh show profileコマンドの実行結果
            
        Returns:
            str: Wi-Fiパスワード、見つからない場合は"パスワードなし"
        """
        # コマンドの結果を改行で分割して1行ずつ処理
        lines = command_output.split('\n')
        
        # 各行をチェック
        for line in lines:
            # 行の前後の余分な空白を削除
            cleaned_line = line.strip()
            
            # "Key Content"という文字列が含まれる行を探す
            # この行にパスワード情報が記載されている
            if "key content" in cleaned_line.lower() and ":" in cleaned_line:
                # コロンで分割してパスワード部分を取得
                parts = cleaned_line.split(":", 1)  # 最初のコロンのみで分割
                if len(parts) >= 2:
                    # コロンの右側がパスワード
                    password = parts[1].strip()  # 前後の空白を削除
                    # パスワードが空でない場合は返す
                    if password and password != "":
                        return password
        
        # パスワードが見つからなかった場合
        return "パスワードなし"

“Key Content”は、Windows netshコマンドでパスワード情報が表示される際の識別文字列です。この行からパスワードを抽出します。

macOS用パスワード解析機能の実装

macOS securityコマンドの出力からパスワードを抽出する機能を実装します。

    def _parse_macos_wifi_password(self, command_output):
        """macOSのsecurityコマンドの結果からパスワードを取り出す関数
        
        Args:
            command_output: security find-generic-passwordコマンドの実行結果
            
        Returns:
            str: Wi-Fiパスワード、見つからない場合は"パスワードなし"
        """
        # コマンドの結果を改行で分割
        lines = command_output.split('\n')
        
        # 各行をチェック
        for line in lines:
            # 前後の空白を削除
            cleaned_line = line.strip()
            
            # securityコマンドは成功時にパスワードのみを出力する
            # エラーメッセージ以外の行がパスワード
            if cleaned_line and not cleaned_line.startswith("security:"):
                return cleaned_line
        
        # パスワードが見つからなかった場合
        return "パスワードなし"

macOSのsecurityコマンドは、成功時にパスワードを直接出力するため、エラーメッセージ以外の行がパスワードとなります。

ネットワーク詳細情報表示機能の拡張

既存のdisplay_network_infoメソッドを更新して、Wi-Fiパスワードも表示できるようにします。既存のメソッドを以下のコードで置き換えてください。

    def display_network_info(self):
        """ネットワーク情報を詳細表示する関数(パスワード情報も含む)"""
        # 見やすくするための区切り線
        print("=" * 50)
        print("ネットワーク詳細情報取得ツール")
        print("=" * 50)
        
        # 現在接続中のWi-Fi名を取得
        current_wifi = self.get_current_wifi_name()
        
        # Wi-Fi名が取得できた場合
        if current_wifi:
            # Wi-Fi名を表示
            print(f"接続中のWi-Fi名: {current_wifi}")
            
            # 上で作成した関数を使ってWi-Fiパスワードを取得
            wifi_password = self.get_wifi_password(current_wifi)
            
            # パスワードが取得できた場合とできなかった場合で分岐
            if wifi_password and wifi_password != "パスワードなし":
                # パスワードが取得できた場合
                print(f"Wi-Fiパスワード: {wifi_password}")
            else:
                # パスワードが取得できなかった場合
                print("Wi-Fiパスワード: 取得できませんでした")
                
        else:
            # Wi-Fi名自体が取得できなかった場合
            print("Wi-Fi接続が見つかりません")
        
        # 終了の区切り線
        print("=" * 50)

この更新により、Wi-Fi名とパスワードの両方が表示されるようになります。

エラーハンドリング機能の強化

セキュリティ関連の操作でエラーが発生する可能性があるため、エラーハンドリングを強化します。execute_commandメソッドを以下のコードで置き換えてください。

    def execute_command(self, command_list):
        """コマンドを実行して結果を取得する関数(エラー処理強化版)
        
        Args:
            command_list: 実行したいコマンドをリスト形式で指定
            
        Returns:
            str: コマンドの実行結果、失敗した場合はNone
        """
        try:
            # subprocessを使ってコマンドを実行
            result = subprocess.check_output(
                command_list,  # 実行するコマンドのリスト
                stderr=subprocess.STDOUT,  # エラーメッセージも結果に含める
                timeout=15  # パスワード取得は時間がかかることがあるので15秒に設定
            )
            # コマンドの結果をバイト形式から文字列に変換
            return result.decode('utf-8', errors='ignore')
        except subprocess.CalledProcessError as e:
            # コマンドの実行が失敗した場合
            # 特に管理者権限が必要な場合のエラーをチェック
            if "access" in str(e).lower() or "permission" in str(e).lower():
                print("注意: 管理者権限が必要な場合があります")
            else:
                print(f"コマンド実行エラー: {e}")
            return None
        except subprocess.TimeoutExpired:
            # コマンドが指定時間内に終わらなかった場合
            print("コマンドがタイムアウトしました")
            return None
        except Exception as e:
            # その他の予想外のエラーが発生した場合
            print(f"予期しないエラー: {e}")
            return None

タイムアウト時間を15秒に延長し、権限エラーに対する適切なメッセージを追加しました。

設定ファイルの更新

config.pyファイルに、今回使用するコマンドの設定を追加します。以下の内容で更新してください。

"""
ネットワーク情報取得ツール用の設定ファイル
各OS用のコマンドとメッセージをまとめて管理
"""

# Windows環境で使用するコマンドの設定
WINDOWS_COMMANDS = {
    "wifi_interfaces": ["netsh", "wlan", "show", "interfaces"],
    "wifi_profile": ["netsh", "wlan", "show", "profile"],  # Wi-Fi名は後から追加
}

# macOS環境で使用するコマンドの設定
MACOS_COMMANDS = {
    "wifi_network": ["networksetup", "-getairportnetwork", "en0"],
    "wifi_password": ["security", "find-generic-password", "-wa"],  # Wi-Fi名は後から追加
}

# 表示メッセージの設定
MESSAGES = {
    "success": "ネットワーク情報の取得が完了しました",
    "no_wifi": "Wi-Fi接続が見つかりません",
    "no_password": "パスワードを取得できませんでした",
    "permission_error": "管理者権限が必要です",
}

メイン実行部分の更新

main関数を更新して、新しい機能をテストできるようにします。既存のmain関数を以下のコードで置き換えてください。

def main():
    """プログラムのメイン処理(パスワード取得機能を含む)"""
    try:
        # NetworkInfoManagerクラスのインスタンスを作成
        network_manager = NetworkInfoManager()
        
        # OS検出メッセージは詳細情報表示で十分なのでコメントアウト
        # print(f"検出されたOS: {network_manager.operating_system}")
        
        # ネットワーク詳細情報を表示(Wi-Fi名とパスワードの両方)
        network_manager.display_network_info()
        
    except KeyboardInterrupt:
        # ユーザーがCtrl+Cで中断した場合
        print("\nプログラムが中断されました")
    except Exception as e:
        # その他のエラーが発生した場合
        print(f"プログラム実行エラー: {e}")


# このファイルが直接実行された場合のみmain関数を呼び出す
if __name__ == "__main__":
    main()

動作テスト実行

VSCodeのターミナルでプログラムを実行してテストします。

Windows環境の場合

python wifi_manager.py

macOS環境の場合

python3 wifi_manager.py

出力結果

検出されたOS: Windows
==================================================
ネットワーク詳細情報取得ツール
==================================================
接続中のWi-Fi名: MyHomeNetwork
Wi-Fiパスワード: mypassword123
==================================================

Step4:プロジェクトをGitHubにアップロード

このステップでは、完成したネットワーク情報取得プロジェクトをGitHubにアップロードし、ポートフォリオとして活用できる形にします。最終的なファイル整理とコードの公開を行っていきます。

.gitignoreファイルの更新

既存の.gitignoreファイルに、プロジェクト固有の除外設定を追加します。

VSCodeで「.gitignore」ファイルを開き、以下の内容を末尾に追加してください。

# Virtual environment
myenv/

# OS generated files
.DS_Store
Thumbs.db

# IDE files
.vscode/settings.json
.idea/

これらを追加する理由について説明します。

  • myenv/ 仮想環境フォルダはプロジェクト固有のため、リポジトリに含める必要がありません
  • .DS_Store macOSが自動生成するシステムファイルを除外
  • Thumbs.db Windowsが自動生成するサムネイルファイルを除外
  • .vscode/settings.json VSCodeの個人設定ファイルを除外

README.mdファイルの更新

リポジトリ作成時に生成されたREADME.mdファイルの内容を、プロジェクトの詳細情報に更新します。

VSCodeで「README.md」ファイルを開き、内容を以下のように全て置き換えてください。

# システムコマンドを活用したネットワーク情報取得ツール

## プロジェクト内容

現在接続中のWi-Fiネットワークの名前とパスワードを取得するネットワーク情報管理ツールです。Windows・macOS両対応のクロスプラットフォーム仕様で、各OSのシステムコマンドを活用してセキュアなネットワーク情報を自動取得します。Pythonのsubprocessモジュールとシステムコマンド実行技術を学習することを目的として実装しました。

## プロジェクト構成

```
network_info_tool/
├── wifi_manager.py          # メインプログラム
├── config.py               # 設定管理ファイル
├── requirements.txt        # 依存関係管理
├── README.md              # プロジェクト説明書
└── .gitignore             # Git除外ファイル設定
```

## 必要要件/開発環境

- **Python 3.7以上**
- **VSCode** (開発環境)
- **Git** (バージョン管理)
- **Windows 10以上** または **macOS 10.14以上**

### 使用ライブラリ

- **subprocess** システムコマンドの実行処理
- **platform** OS種別の自動判定
- **os** オペレーティングシステム操作

## 機能

- **OS自動判定** Windows・macOSの自動識別とコマンド選択
- **Wi-Fi名取得** 現在接続中のネットワーク名を自動取得
- **Wi-Fiパスワード取得** 接続中ネットワークのパスワードを安全に取得
- **クロスプラットフォーム対応** Windows・macOS両環境での動作保証
- **システムコマンド実行** netsh・networksetup・securityコマンドの活用
- **データ解析処理** コマンド出力の文字列解析と情報抽出
- **エラーハンドリング** コマンド実行失敗やタイムアウトへの対応
- **権限管理** 管理者権限が必要な処理の適切な案内

## 実行方法

### 1. リポジトリのクローン

```bash
git clone https://github.com/yourusername/network_info_tool.git
cd network_info_tool
```

### 2. 仮想環境の作成・アクティベート

**Windows**
```bash
python -m venv myenv
myenv\Scripts\activate
```

**macOS**
```bash
python3 -m venv myenv
source myenv/bin/activate
```

### 3. 依存関係のインストール

```bash
pip install -r requirements.txt
```

### 4. プログラムの実行

**Windows**
```bash
python wifi_manager.py
```

**macOS**
```bash
python3 wifi_manager.py
```

実行後、現在接続中のWi-Fi名とパスワードが表示されます。

### 注意事項

- パスワード取得には管理者権限が必要な場合があります
- macOSでは初回実行時にキーチェーンアクセスの許可が求められることがあります
- セキュリティソフトによってコマンド実行がブロックされる場合があります

## データ取得について

* **Windows環境** netshコマンドを使用してWLAN情報を取得
* **macOS環境** networksetupとsecurityコマンドを使用してネットワーク情報を取得
* **出力形式** コンソールに接続情報を表示

## 開発者

YuYu

プロジェクトのコミット・プッシュ

プロジェクトの全ての変更をGitHubに反映させましょう。

変更のステージングとコミット

  1. VSCodeの左側のアクティビティバーからソース管理アイコンをクリックします
  2. 変更内容セクションで、すべての変更ファイルを確認します
  3. 各ファイルの横にある「+」アイコンをクリックしてステージングします
  4. コミットメッセージ入力欄に「Add network information retrieval system with cross-platform support」と入力します
  5. コミット」ボタンをクリックします

GitHubへのプッシュ

  1. コミット完了後、「変更の同期」または「プッシュ」ボタンをクリックします
  2. 初回の場合、GitHub認証が求められる場合があります
  3. 認証完了後、ローカルの変更がGitHubリポジトリに反映されます

GitHubでの確認

プロジェクトが正常にアップロードされたか確認しましょう。

  1. ブラウザでGitHubリポジトリページを開きます
  2. 以下のファイルが正しくアップロードされていることを確認します
  • wifi_manager.py (メインプログラムファイル)
  • config.py (設定管理ファイル)
  • requirements.txt (依存関係管理ファイル)
  • README.md (更新されたプロジェクト説明書)
  • .gitignore (更新された除外設定ファイル)
  1. README.mdが適切に表示され、プロジェクトの説明が読みやすく表示されていることを確認します
  2. ファイル一覧にmyenv/フォルダが含まれていないことを確認します(.gitignoreで除外されているため)

これで本格的なネットワーク情報取得システムが完成し、GitHubでのポートフォリオ公開も完了しました。作成したプロジェクトは、就職活動や案件獲得時の実績として活用できる実用的なシステムとなっています。

まとめ

このプロジェクトを通じて、Pythonを使用したWi-Fi情報取得システムの基礎から実践的な応用まで幅広く学習することができました。

得られたスキル

  • subprocessモジュール – システムコマンド実行と結果取得技術
  • 文字列処理技術 – split、strip、decodeメソッドの活用
  • OS判定とプラットフォーム分岐 – Windows/macOS対応処理の実装
  • エラーハンドリング – try-except文とタイムアウト処理の実装

得られた経験

  • システムレベルでのコマンド実行経験
  • ネットワーク設定情報の取得と管理経験
  • クロスプラットフォーム開発の実践経験
  • セキュリティを考慮した開発の基礎経験
  • GitHubを使用したバージョン管理の実践的経験

得られた成果物

  • 完全に動作するWi-Fi情報取得ツール
  • GitHubでのポートフォリオとして活用可能なプロジェクト
  • 完全なPythonソースコード

次に学ぶべきこと

  • tkinterを使用したGUIアプリケーション化
  • ログファイル出力機能の追加
  • 設定ファイルでの管理機能の実装
  • CSV出力機能による結果保存
  • スケジューリング機能による定期実行

このプロジェクトから応用できること

  • 社内ネットワーク設定確認業務の自動化ツール開発
  • IT設定サポート業務での情報取得ツール作成
  • ヘルプデスク業務でのトラブルシューティング支援ツール
  • システム管理業務での設定情報収集の自動化
  • 小規模なIT作業の自動化案件への応用
  • オフィス環境でのネットワーク管理業務への活用

このWi-Fi情報取得技術を基盤として、様々な業務での自動化ニーズに対応できるツールを開発することが可能です。特に、定期的な設定確認や情報収集が必要な業務では、高い効率化効果を提供できる技術として活用できます。

この記事が気に入ったら
フォローしてね!

この記事が参考になった方はシェアしてね!
  • URLをコピーしました!

本コンテンツへの意見や質問

コメントする

目次