search
LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

リモート時代の「今どこにいるの?」をpythonで

この記事は NTTテクノクロス Advent Calendar 2021の2日目の記事です。

こんにちは。安田と申します!
NTTテクノクロスでAI関連の新製品創出を担当しています。
(例えば、こういうの → BizFront/SmartUI Decision Manager

さて、本記事では、pythonで「今どこにいるの?」をロギングする方法を見ていきたいと思います。コロナ禍以降になって、会社オフィスだけでなく、自宅も働く場所になってきました。出社と在宅が混在するようになると、「そういえば先週の火曜日って、どこで働いていたっけ?」って、良く分からなくなります。そこで、私なりの工夫として、肌身離さず持ち歩いているノートPCがその日はどこにあったのかをログに残すことにしています。

原理(どうして居場所がわかるの?)

ノートPCがそのときに掴んでいるWifiのSSIDとBSSIDの情報を取得できれば、どこにいるのかは分かると思います。

  • SSID = Wifiのネットワークの名前
  • BSSID = アクセスポイントの識別子(たいていはMacアドレス)

代替テキスト

SSIDが同じだとしても、アクセスポイントが異なればBSSIDは異なるはずです。
そして、掴んでいるWifiのSSIDやBSSIDはnetshコマンドで調べることができます。
netsh wlan show interfaces

ソースコード

pythonで書きました。実際にはこれをpyinstallerでexe化してWindowsPCのスタートアップに入れて常に動かしてログを残しています。

main.py
import os
from subprocess import PIPE
import subprocess
import datetime


# Const
LOC_LOG_PATH = '../logs/log/'
LOC_LOG_FILENAME = 'loc.csv'
DIFF_JST_FROM_UTC = 9

# Opening Message
print('WIFIのSSID及びBSSIDの検出を開始します。')

loginName = os.getlogin()
prevSsidBssid = ''
nowSsidBssid = ''

while True:
    # SSID 及び BSSIDの取得
    proc = subprocess.run("netsh wlan show interfaces", shell=True, stdout=PIPE, stderr=PIPE, text=True)
    datalist = proc.stdout.split('\n')
    ssid = ''
    bssid = ''
    for data in datalist :
        if data.find('    SSID') == 0:
            ssid = data[data.find(':')+2:len(data)]
        elif data.find('    BSSID') == 0:
            bssid = data[data.find(':')+2:len(data)]
    if (ssid == '') or (bssid == ''):
        ssid_bssid = 'no wifi'
    else:
        ssid_bssid = ssid + '/'+bssid

    now = datetime.datetime.utcnow() + datetime.timedelta(hours=DIFF_JST_FROM_UTC)
    nowDate = now.strftime('%Y%m%d')
    nowTimestamp = now.strftime('%Y/%m/%d %H:%M:%S')    

    nowSsidBssid = ssid_bssid
    if (nowSsidBssid != prevSsidBssid):
        line = loginName\
                 + ', ' + nowTimestamp + ', ' + nowSsidBssid
        fileObject = open(LOC_LOG_PATH+str(nowDate)+LOC_LOG_FILENAME, 'a', encoding = 'shift_jis') # そのままエクセルで分析できるようにsjis
        fileObject.write(line + '\n')
        fileObject.close()
        print(line)
    prevSsidBssid = nowSsidBssid

おわりに

pythonって、色々できて面白いですよね。
さて、NTTテクノクロス Advent Calendar 2021 の明日(3日目)の記事は、【AWS】利用料金の詳細通知&自動化のお話です。AWSを使っているエンジニアにとっては、利用料金って、かなり気になるテーマだと思います。こちらも引き続きお楽しみください!

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
What you can do with signing up
2