LoginSignup
15
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-01

この記事は 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を使っているエンジニアにとっては、利用料金って、かなり気になるテーマだと思います。こちらも引き続きお楽しみください!

15
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
15
2