8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MACアドレスで打刻システムを作ってみた!

Last updated at Posted at 2022-12-30

目次

  • なぜこのシステムを作ったのか
  • 使用するツール・環境
  • MACアドレスについて
  • ソースコード
  • Raspberry pi のプログラム自動実行設定
  • 使用してみた結果
  • 最後に

1. なぜこのシステムを作ったのか

出社時の打刻ってめんどくさくないですか?が発端でした。
打刻忘れなどによる、訂正など、とても時間がかかり、非生産的です。

それらの問題を解決するべく、Wifiによる打刻システムを簡易的に作成しました。

毎時5分起きに、プログラムが作動し、社員さんが持つスマホやPCがWifiに繋がったデバイスを検知し、出勤記録をエクセルに記入します。あらかじめ、社員さんのMACアドレスは控えておくことが必要条件です。

2. 使用するツール・環境

今回はRaspberry pi を使って実装しました。
理由として、小型コンピュータで、常に動作させられ、プログラムの自動実行等、汎用性が高いからです。
言語はpythonで、仮想環境を用いて行いました。

3. MACアドレスについて

社員のデバイスのMACアドレスを入手しておく必要がありますが、もし、iphoneのMACアドレスを取得する場合、注意する点があります。iOS14からデフォルトでオンになった「MACアドレスのランダム化」により、使うWifiによってMACアドレスが変わってしまいます。そのため、社内で繋がるように設定しているWifiのMACアドレスを取得するようにしましょう。

4. ソースコードの解説等

import requests
import subprocess
import sys
import openpyxl
import datetime

employee_1_a = 'a1:47:74:3e:6e:6a'
employee_1_b = 'da:67:66:7b:23:d7'
employee_2_a = '69:93:c6:28:78:ff'
employee_2_b = '6b:a4:eb:2b:8b:15'

#LINE Notifyの送信部分
def send_line_notify(notification_message):
    line_notify_token = ''
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'message: {notification_message}'}
    requests.post(line_notify_api, headers = headers, data = data)

#MACアドレスの取得
def check_mac():
    res = subprocess.run(["arp", "-a"], stdout=subprocess.PIPE)
    sys.stdout.buffer.write(res.stdout)
    return res


def main():
    dt_now = datetime.datetime.now()
    mac_address = str(check_mac())
    book = openpyxl.load_workbook('qiita/出勤簿.xlsx')
    sheet = book['出勤簿']
    
    #従業員1のチェック
    if employee_1_a or employee_1_b in mac_address:
        send_line_notify('社員1の出勤を記録しました。')
        sheet.cell(row=dt_now.day + 1, column = 1).value = str(dt_now) + '  出勤'
        book.save('qiita/出勤簿.xlsx')

    #従業員2のチェック
    if employee_2_a or employee_2_b in mac_address:
        send_line_notify('社員2の出勤を記録しました。')
        sheet.cell(row=dt_now.day + 1, column = 2).value = str(dt_now) + '  出勤'
        book.save('qiita/出勤簿.xlsx')

if __name__ == "__main__":
    main()


5. Raspberry pi のプログラム自動実行設定・方法

上記のプログラムを定期実行してくれるように設定行います。

$ sudo crontab -e

上記のようにcrontabを開きます。

*/5 * * * * /usr/bin/python3 /home/qiita/times_tamping.py

この記述で、5分置きに定期実行をすることができます。

6. 使用してみた結果

実際に半月ほど稼働させてみました。

スクリーンショット 2022-12-25 23.06.51.png

上記は、MACアドレスを検知し、社員2の出勤が記録されている様子です。

スクリーンショット 2022-12-25 23.26.26.png

上記は、実際にシステムが出勤を9時に検知し、エクセルに記録している様子です。
想像以上に、検知の感度が良く、正しく記録できていました。

7. 最後に

記事を読んでくださり、ありがとうございました。
DBに接続したり、フロントに反映させたりすると、もっと面白くなると思いました!
いいなと思ったら、いいねをお願いします!

8
4
1

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
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?