東京大学の勤務時間管理システム(CWS)で打刻漏れの勤務状況メモ登録と月次申請を自動化するスキル。agent-browserを使用してブラウザ操作を行う。 Use when: (1) 打刻漏れのメモを登録したい、(2) 月次申請・確定をしたい、(3) 勤怠の打刻漏れを修正したい、(4) 勤務表を確認したい、(5) CWSを操作したい Trigger: 打刻漏れ, 勤怠, 月次申請, 月次確定, 勤務表, 出勤, 退勤, attendance, CWS, 勤務状況メモ
東京大学の勤務時間管理システム(CWS: https://ut-ppsweb.adm.u-tokyo.ac.jp/cws/cws )にアクセスし、打刻漏れの勤務状況メモ登録および月次申請を自動化する。
agent-browserでExecutable doesn't existエラーが出る場合、Chromiumをインストールする:
cd /opt/homebrew/lib/node_modules/agent-browser && npm install
PLAYWRIGHT_BROWSERS_PATH=/opt/homebrew/lib/node_modules/agent-browser/node_modules/playwright-core/.local-browsers \
npx --prefix /opt/homebrew/lib/node_modules/agent-browser playwright install chromium
net::ERR_SOCKET_NOT_CONNECTED)が出る場合は --headed オプションで再試行する(一時的な接続問題のことが多い)--headed モードを使用する: ユーザーがログイン操作を行えるよう、ヘッドレスではなくheadedモードでブラウザを起動するselectコマンドはrefを壊すことがある: ドロップダウンの選択にはagent-browser selectではなくJavaScript evalを使うこと(後述)snapshot -iでrefを再取得すること。バックグラウンド実行やパイプ処理ではrefが古くなり失敗するCWSトップ → Microsoft認証(SAML)→ メインメニュー
├── 勤務表 → 月次の打刻記録一覧・月次申請
├── 承認者設定
├── 就労申請 → 各種申請メニュー
│ ├── 勤務状況メモ入力 → 日付指定でメモ登録
│ ├── 勤務状況メモ取消
│ ├── 超過勤務(終業時刻後)
│ └── ...
└── 就労申請処理状況確認
agent-browser --headed open https://ut-ppsweb.adm.u-tokyo.ac.jp/cws/cws
agent-browser eval "
const rows = document.querySelectorAll('table tr');
const results = [];
rows.forEach(r => {
const cells = r.querySelectorAll('td');
if (cells.length >= 5) {
const day = cells[0]?.innerText?.trim();
const dow = cells[1]?.innerText?.trim();
const kind = cells[2]?.innerText?.trim();
const stamp = cells[3]?.innerText?.trim();
if (day && day.match(/^\\d+\\//)) {
results.push(day + ' ' + dow + ' ' + kind + ' | 打刻: [' + stamp + ']');
}
}
});
results.join('\\n');
"
打刻漏れのパターン:
| 打刻時間の表示 | 意味 |
|---|---|
09:24 -- 18:01 | 出勤・退勤両方あり(正常) |
09:24 -- | 出勤のみ、退勤打刻漏れ |
-- 18:04 | 退勤のみ、出勤打刻漏れ |
| (空白) | 出勤・退勤両方打刻漏れ |
勤務内容の判定:
打刻漏れのある日をリストアップし、ユーザーに以下を確認する:
snapshot -i で確認すること):
agent-browser select コマンドはドロップダウン操作後にrefが無効化される問題がある。代わりにJavaScript evalで値をセットすること:
# NG: selectコマンドはrefを壊す
# agent-browser select @e18 "05"
# OK: JavaScript evalで直接値をセット
agent-browser eval "document.querySelectorAll('select')[1].value = '05'; document.querySelectorAll('select')[1].dispatchEvent(new Event('change'))"
document.querySelectorAll('select')[1] は日ドロップダウン(2番目のselect要素)を指す。月ドロップダウンは [0]。
# 1. 日付をJS evalでセット
agent-browser eval "document.querySelectorAll('select')[1].value = '{日}'; document.querySelectorAll('select')[1].dispatchEvent(new Event('change'))"
# 2. snapshot -i でrefを再取得(eval後はrefがリセットされている可能性あり)
agent-browser snapshot -i
# → メモテキストボックスとボタンのrefを確認
# 3. メモを入力して「次へ」
agent-browser fill @e51 "{メモ内容}" # ref番号は都度確認
agent-browser click @e52 # ref番号は都度確認
agent-browser wait --load networkidle
# 4. 確認画面で「送信」
agent-browser snapshot -i
agent-browser click @e4 # 「送信」ボタン(ref番号は都度確認)
agent-browser wait --load networkidle
# 5. 完了画面から「就労申請」に戻る
agent-browser snapshot -i
agent-browser click @e4 # 「就労申請」リンク(ref番号は都度確認)
agent-browser wait --load networkidle
# 6. 「勤務状況メモ入力」をクリックして次の日へ
agent-browser snapshot -i
agent-browser click @e3 # 「勤務状況メモ入力」リンク(ref番号は都度確認)
agent-browser wait --load networkidle
Resource temporarily unavailableエラーが発生するsnapshot -iでrefを再取得するsnapshot -iで確認してからリトライするメモ内容のフォーマット:
打刻漏れ。実際は{時刻}に出勤打刻漏れ。実際は{時刻}に退勤打刻漏れ。実際は{出勤時刻}に出勤、{退勤時刻}に退勤注意: ref番号(@e1, @e2...)はページ遷移のたびに変わる。必ず各ページで snapshot -i を実行して最新のrefを取得すること。
# 勤務表ページで月次申請ボタンをクリック
agent-browser snapshot -i
agent-browser click @e11 # 月次申請ボタン(ref番号は都度確認)
agent-browser wait --load networkidle
# 確認画面で確定
agent-browser snapshot -i
agent-browser click @e4 # 確定ボタン(ref番号は都度確認)
agent-browser wait --load networkidle
| 操作 | 遷移先 |
|---|---|
| メインメニュー → 勤務表 | 月次打刻一覧 |
| メインメニュー → 就労申請 | 申請メニュー一覧 |
| 就労申請 → 勤務状況メモ入力 | メモ入力フォーム |
| メモ入力 → 次へ | 確認画面 |
| 確認画面 → 送信 | 完了画面 |
| 完了画面 → 就労申請 | 申請メニューに戻る |
cd /opt/homebrew/lib/node_modules/agent-browser && npm install
PLAYWRIGHT_BROWSERS_PATH=/opt/homebrew/lib/node_modules/agent-browser/node_modules/playwright-core/.local-browsers \
npx --prefix /opt/homebrew/lib/node_modules/agent-browser playwright install chromium
agent-browser close してから --headed で再試行curl -s -o /dev/null -w "%{http_code}" https://ut-ppsweb.adm.u-tokyo.ac.jp/cws/cws で疎通確認(302なら正常)--headed オプションを付けているか確認agent-browser close してから再起動agent-browser snapshot -i で新しいrefを取得selectコマンドの実行後もrefが壊れる。selectの代わりにJS evalを使うことsnapshot -i で状態を確認し、リトライするsnapshot -i で「再ログイン」リンクが表示されたらクリックする