背景
リモート制度に切り替えに伴って Microsoft Teams のシフト機能を使うようになりました。
が、記録するのは面倒くさく、忘れた場合も多かったです。
そこで、スクリプトで自動化してみました。
これで実現します!
pass
pass
というコマンドを使います。
pass
は、コマンドラインベースのパスワードマネージャー。
UNIX 哲学に従え、シンプルかつ拡張しやすいアプリです。
pass-otp
pass
はただパスワードを保存するアプリなので、TOTP(ログインする際に必要な6桁数字)を生成する機能がついていません。
そこで、pass-otp
という拡張機能を使います。
GnuPG
pass
がパスワードデータを暗号化するために使うプログラムです。
SSHの秘密鍵の似ていて、秘密鍵と公開鍵があります。
Puppeteer
Node.js ベースのブラウザ操作を自動化するライブラリー。
ただの好みで、ブラウザ操作とシェルコマンドを実行可能のであれば他の言語のブラウザ自動化ライブラリーを使っても大丈夫です。
手順
1. pass
、pass-otp
、gpupg
をインストール・設定
MacOS の場合は、homebrew
を使うと便利です。
$ brew install pass pass-otp gnupg
2. GnuPG 鍵を作る
$ gpg --gen-key
本名、メールアドレス、パスフレーズを入力します。
3. pass
のストアを初期化
$ pass init "[指定したメールアドレス]"
4. TOTP の QR コードを取得
MSの2段階認証設定画面からAuthenticatorアプリ用のQRコードを取得します。このQRコードに otpauth://
というURIが入っているので、zbar
というコマンドラインアプリでQRから解読できます。
$ zbarimg -q -—raw [path/to/qrcode.png]
5. TOTP 情報を pass
に登録
$ pass otp insert [任意の名前]
Enter otpauth:// for [任意の名前]:
Retype otpauth:// for [任意の名前]:
6. TOTP を動いているか確認
MSの設定画面に戻り、pass-otp
で生成した6桁コードを入力。
$ pass otp [登録した名前]
XXXXXX
パスフレーズを聞かれた場合はGnuPG鍵のパスフレーズを入力すれば良いです。
7. スクリプトで利用
スクリプト言語のシェルコマンド実行機能を使い、OTPコードを取得してブラウザに入力します。Node.js + Puppeteer の場合はこんな感じです。
// TOTPコードを取得
import util from ‘util’
import childProcess from ‘child_process’
const exec = util.promisify(childProcess.exec)
const result = await exec(‘pass otp [登録した名前]’)
const totp = result.stdout
// ブラウザフォームに入力
import puppeteer from ‘puppeteer’
const browser = await puppeteer.launch()
const page = await browser.newPage()
// URL にアクセス、メールアドレス・パスワード入力を省略
const input = await page.$(‘input[name=otc]’)
await input.type(totp)
await input.press(‘Enter’)
GnuPG鍵のパスフレーズが毎回聞かれてうざい!
と思っている方も思うので、MacOSの場合は GPGTools でパスフレーズをMacOSキーチェンに保存され、解消できます。
Microsoft Teams 自動出勤・退勤スクリプト
これをベースにしたスクリプトを作りました。
興味があればGithubリポを見てみてください!