目次
目的
- 毎朝8:55に自動起動(Windowsタスクスケジューラ)
- 勤怠システムにログインし、出勤打刻が済んでいるか確認
- 打刻されていない場合は、Slackに通知を自動送信
- API未使用。全てブラウザ操作ベースの構成
📁 フォルダ構成(推奨)
KintaiCheckerBot/
├─ main_flow.padx
├─ modules/
│ ├─ LoginKintai.padx ← ログイン処理
│ ├─ CheckStampStatus.padx ← 打刻判定
│ ├─ NotifySlack.padx ← Slack通知処理
├─ data/
│ ├─ config.json ← 勤怠URLやSlack情報など
│ └─ log.csv ← 判定ログ
🕒 スケジュール設定
❱ タスクスケジューラ(Windows)で設定
| 項目 | 設定内容 |
|---|---|
| トリガー | 毎日 8:55 |
| アクション | Power Automate Desktop で main_flow.padx を実行 |
| 実行権限 | 「最上位の特権で実行」にチェック |
📄 config.json(例)
{
"kintaiUrl": "https://example.com/kintai/login",
"userEmail": "your.email@example.com",
"slackUrl": "https://slack.com/app_redirect?channel=your_channel",
"slackMessageTemplate": "【勤怠未打刻通知】%TIME% 時点で未打刻です。ご確認ください。",
"timeoutSeconds": 30
}
✅ 処理の全体フロー
[1] Chrome起動 → 勤怠システムへログイン(LoginKintai)
↓
[2] ダッシュボードから打刻状態を判定(CheckStampStatus)
↓
[3] 未打刻ならSlackに通知を送信(NotifySlack)
↓
[4] 処理結果をlog.csvに記録
🛠 フロー構築手順(ステップバイステップ)
✅ STEP1:Chrome起動 & 勤怠システムへログイン(LoginKintai.padx)
アクション構成:
- ブラウザ起動
- Chrome起動:ユーザープロファイル指定でログイン維持
- URL指定:
https://example.com/kintai/login
- ログインフォーム操作
- メールアドレス/パスワード入力(※パスワードは資格情報マネージャに登録)
- 「ログイン」ボタンをクリック
セレクタ例:
| 項目 | セレクタ例 |
|---|---|
| メール入力欄 | input[name="email"] |
| パスワード欄 | input[type="password"] |
| ログイン | button[aria-label="ログイン"] |
⛳ 補足: 2段階認証がある場合は、処理を一時停止して「手動操作待ち」にする対応も可能です。
✅ STEP2:打刻状況をチェック(CheckStampStatus.padx)
判定対象:
- 勤怠システムのダッシュボードにある「出勤済み」or「未打刻」などの表示テキスト
判定方法:
出勤済みなどのDOM要素が存在するかをチェック- または、
innerTextに"出勤打刻済み"などが含まれるかを文字列検索
PADアクション例:
Webページ上のUI要素が存在するか確認(存在しない=未打刻)テキストを取得して条件判定
判定結果:
- フラグ:
IsStamped→ True or False
✅ STEP3:Slack通知を送信(NotifySlack.padx)
Slack送信方法(API不使用):
- ChromeでSlackのWeb版(チャンネルURL)を開く
- テキスト入力欄にテンプレメッセージを入力
Enterキーで送信
メッセージ構成:
【勤怠未打刻通知】2025/09/11 08:55 時点で未打刻です。ご確認ください。
→ config.json のテンプレートで %TIME% を現在時刻に置換
UI操作:
- Slackのメッセージ入力欄が
contenteditable=trueのDIVである場合が多い - セレクタが不安定な場合は座標クリック+Ctrl+Vで代替可能
✅ STEP4:処理ログを保存(log.csv)
出力内容(1行ごとに追記):
| 実行時刻 | 打刻状況 | Slack通知 | 備考 |
|---|---|---|---|
| 2025/09/11 08:55 | 未打刻 | 通知済み | 正常完了 |
| 2025/09/10 08:55 | 出勤済み | なし | – |
保存先:data/log.csv
💡 応用Tips
| 応用 | 実装案 |
|---|---|
| 土日実行除外 | 曜日チェック(Now() で Today の DayOfWeek 判定) |
| 通知先を切替 | ユーザーごとの Slack URL をCSV管理可能 |
| 毎週まとめて報告 | ログを元に毎週月曜に集計&一括通知も可能 |
| LINE通知に拡張 | LINE公式アカウントのWeb画面に貼付けで対応可能 |
✅ 練習ポイントまとめ
| 学習要素 | 習得できるスキル |
|---|---|
| ✅ スケジュール起動 | タスクスケジューラ連携(定時実行) |
| ✅ ログイン処理 | UI入力・セレクタの安定取得 |
| ✅ DOM判定処理 | テキスト or 要素の有無による条件分岐 |
| ✅ Slack通知(Web) | Webアプリ間コピペ+送信の自動化 |
| ✅ ログ出力 | CSVへ結果追記で再現性・記録性を確保 |
❓ よくある質問(FAQ)
Q1. 勤怠システムのUIが変更されたら?
A. DOMのセレクタが崩れると判定失敗しますが、「ラベル名のテキスト取得」による柔軟な判定構成を推奨します。
また、セレクタが取得できない場合は画像マッチングや座標クリックも併用可能です。
Q2. Slackへの投稿がうまくいかない
A. Web版Slackでログイン状態を保持しておくと安定します。
入力欄のセレクタが取りづらい場合、「TAB→Ctrl+V→Enter」方式で送信が可能です。
Q3. 出勤済みでも通知してしまう場合は?
A. 判定条件があいまいな可能性があります。
以下のような**「完全一致 or 含む」ルール**で対応してください。
If "出勤打刻済み" in 要素のテキスト → 出勤済み
Else → 未打刻
