- SONY RC-S380
- Linux系OSのPCまたはWindows PC (Docker)
- 前者を使う場合は手順1-1,後者を使う場合は手順1-2を使用
- 🚨注意:Dockerの場合は音声出力に対応していません.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
次に,PATHを通す(コマンドは人によるけど,調べたらすぐ出てくる)
brew --version
でバージョンが表示されたら成功
brew install libusb
brew install python
python3 -m pip install --upgrade pip
python3 -m pip install nfcpy gspread pygame requests python-dotenv google-auth
nfcpy
: NFCの読み取りgspread
: GoogleスプレッドシートAPIpygame
: 音声ファイルの読み込みrequests
: HTTPリクエストpython-dotenv
:.env
ファイルの読み込みgoogle-auth
: Google Cloudサービスへのアクセス
NFCリーダをDocker内から使用するため,以下が必要となる.
WSL (Windows Subsystem for Linux)
: 説明は割愛Docker Desktop
: 説明は割愛usbipd-win
: 後述
winget install --interactive --exact dorssel.usbipd-win
PowerShellで以下のコマンドを実行し,USBデバイスを確認する.
usbipd list
以下の例では「BUSID」が「1-2」となっている「NFC Port/PaSoRi 100 USB」がNFCリーダである.
> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-2 054c:06c3 NFC Port/PaSoRi 100 USB Not shared
1-11 26ce:01a2 USB 入力デバイス Not shared
...
PowerShellで以下のコマンドを実行し,USBデバイスをバインドする.
usbipd bind --busid 1-2
PowerShellで以下のコマンドを実行し,USBデバイスをアタッチする.
usbipd attach --wsl --busid 1-2
ここまでで,NFCリーダの「STATE」が「Attached」になっていればよい.
> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-2 054c:06c3 NFC Port/PaSoRi 100 USB Attached
1-11 26ce:01a2 USB 入力デバイス Not shared
...
WSLのUbuntuで以下のコマンドを実行し,NFCリーダが認識されることを確認する.
lsusb
以下のような出力が得られる.「Sony Corp. RC-S380」という記載があれば,WSL2側で認識されている.
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 054c:06c3 Sony Corp. RC-S380
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
- ターミナルを開いてプロジェクトフォルダに移動
例↓
cd workSpace/attendance_checker
- Dockerfileからイメージファイルを作成
docker build -t attendance-app .
- Slackのワークスペースに入っているブラウザでSlack APIのサイトを開く
create new app
を選択From a scratch
を選択App Name
はgr1-attendance-bot
等妥当な名前をつける- ワークスペースを選択し,Botを作成する
- 左のメニューから
OAuth & Permissions
を開き,少し下にあるScopes
のBot Token Scopes
に追加でChat:write
の権限を与える - ページ上部にスクロールして
Install to your_workspace_name
をクリックしてインストール - インストール後,
Bot User OAuth Token
をあとで使うのでメモしておく
- Slack Marketplaceを開く
Manage
を選択Instlled apps
内のBot一覧から作成したBotを選択App Details
を選択Open in Slack
を選択- 作成したSlack BotとのDMチャンネルが開放されるので,この
チャンネルID
をメモしておく
- チャンネルを作成
- チャンネル名は自由だが,
gr1-attendance
等妥当な名前にする - このチャンネルの
チャンネルID
をあとで使うのでメモしておく
- チャンネル名は自由だが,
- 出席管理対象の学生を全員追加
/invite @your-bot-name
コマンドをチャット欄に打ち込むことでチャンネルにBotを追加
- Googleアカウントを用意
出席管理シート_template.xlsx
をGoogle Drive
にアップロード- エクセルファイルを開いた後,
File
>Save as Google Sheets
を選択し,Google Sheetに変換 - 変換されたスプレッドシート名を適当な名前に変更する
- A1セルの説明を参考に,出席管理対象の学籍番号と名前および遅刻判定時間を入力する
- 他のセルは絶対に触らない
- 出席管理スプレッドシートの
sheetID
をあとで使うのでメモしておくsheetID
:URLのd/
と/edit
の間の文字列
- Google Cloud Platform にアクセス
- コンソールを開き,新規プロジェクトを作成(名前は自由)
- 左のメニューから
有効なAPIとサービス
を選択 Google Sheets API
を有効化Google Drive API
を有効化
OAuth同意画面
から開始
- アプリ名:自由
- ユーザーサポートメール:作成したGoogleアカウントが無難
- 対象:
外部
- 連絡先情報:作成したGoogleアカウントが無難
- 作成を押す
APIとサービス
→認証情報
→認証情報を作成
サービスアカウント
を選択サービスアカウント名
は自由ロール
はオーナー
- 完了
サービスアカウントの編集
→鍵(キー)
→新しい鍵を作成
JSON
を選択し,ダウンロード
- ダウンロードした
JSON
ファイルをプロジェクトフォルダに保存し,credentials.json
にリネーム credentials.json
を開き,client_email
をコピー- スプレッドシートを開き,
共有
→ユーザーを追加
にclient_email
をペーストし,編集者
に設定 - 続いて,共有リンクを
閲覧者
に設定し, 作成したチャンネルで学生にシートを共有およびにピン留め
- Google Formで以下の内容を同じ順番で作成
項目 | タイプ | 必須回答 |
---|---|---|
学籍番号 | 短文入力(自由記述) | ✅ |
MTG日程 | 日付ピッカー(カレンダーから選択) | ✅ |
出席/遅刻/公欠 | ラジオボタン(単一選択) | ✅ |
理由 | 短文入力(自由記述) | ✅ |
氏名 | 短文入力(自由記述) | ✅ |
- Googleフォームの回答先をGoogleスプレッドシートに設定
回答
→ 「回答先をスプレッドシートにする」- スプレッドシートのIDを後で使うのでメモしておく
- スプレッドシート内のメニューにある
拡張機能
⇨Apps Script
を選択- GASプロジェクトが作成され,エディタが開く
form.gs
のスクリプトをコピペ- スクリプト内の最初の5つの定数にそれぞれさきほどメモしたIDを記述
const FORM_SHEET_ID = (申請フォームの回答スプレッドシートのID)
const ATTENDANCE_SHEET_ID = (出席管理スプレッドシートのID)
const SLACK_TOKEN = (Slack Botのトークン)
const APPROVAL_CHANNEL_ID = (出欠申請承認者のDMチャンネルのID)
const ATTENDANCE_CHANNEL_ID = (出欠を通知するチャンネルのID)
- エディタの右上にある
デプロイ
⇨New Deploy
を選択- タイプ:
Web app
- 説明:自由
- 実行者:自身
- アクセス権限:誰でも
デプロイ
を選択- この時,警告が出ることがあるが,無視して進んで良い
- タイプ:
- 下側に表示される
Web app URL
をコピー - 先ほど開いていたSlack Botのページを再度開いて,作成したBotを選択
- 左のメニューから
Interactivity & Shortcuts
を選択し,Interactivity
を有効にする - 先ほどコピーしたURLを
Request URL
に貼り付けて保存
- GASのページに戻る
- エディタの左のメニューにあるトリガーを選択
- 右下のトリガーを追加を選択
Choose which function to run
:onFormSubmit
Select event type
:On form submit
Save
を選択- この時も同様に,警告が出ることがあるが,無視して進んで良い
.env
ファイルをプロジェクトのルートディレクトリに作成.env.example
ファイルを参考に,さきほどメモした情報を.env
ファイルに記述
ATTENDANCE_SHEET_ID =(スプレッドシートID)
SLACK_BOT_TOKEN = (作成したBotのトークン)
ATTENDANCE_CHANNEL_ID = (attendanceチャンネルのID)
- ターミナルを開いてプロジェクトフォルダを開く
- MTG開始時刻を入力して
attendance.py
を実行
python3 attendance.py 13:00
- 終了時は
Ctrl + C
で強制終了
- 標準入力にMTG開始時刻を入力してコンテナを起動
docker run --rm --device=/dev/bus/usb:/dev/bus/usb attendance-app 13:00
1.終了時は Ctrl + C
で強制終了