PythonとSeleniumを使用した従業員の遅刻監視とSlack通知のためのスクリプトの作成 ： 実用的なガイド



## はじめに

少子高齢化に伴なう慢性的な人材不足は今後も様々な企業のワークライフバランスを圧迫する事でしょう。したがって、現代のリモートワーク環境では、従業員の出勤管理と遅刻への迅速な対応がビジネスプロセスにおいて重要な役割を果たします。本記事では、Seleniumライブラリを使用してウェブサイトから架空の出勤管理システムの従業員とその遅刻情報を収集し、特定の従業員をメンションしながらSlackに通知を送信するPythonスクリプトの作成手順を紹介します。

そのようなスクリプトの実際の使用例は、[Jinjer (https://kintai.jinjer.biz/)](https://kintai.jinjer.biz/) の出席確認システムに適用されました。このスクリプトを使用して、遅刻に関する情報を収集し、Slackに送信することができました。

###
![Снимок экрана 2023-11-01 в 09.50.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587996/43902db2-c2f8-bda7-28fa-49263d251352.png)


###
## 作業の準備

### 1. 必要なツールのインストール

まず、作業環境を準備しましょう。以下のツールが必要です。
 
- **Python**: コンピュータにPythonがインストールされていることを確認してください。2023年現在では幅広くライブラリがサポートされているPython 3を使用することをお勧めします。

Pythonのインストールを確認するためには、次の手順を実行できます：

1. **Windowsの場合、コマンドプロンプトでPythonの確認**：
   - コマンドプロンプトを開きます。Win + R キーを押し、`cmd` と入力し Enter キーを押します。
   - コマンドプロンプトに `python --version` または `python -V` と入力し Enter キーを押します。Pythonがインストールされている場合、バージョンが表示されます（例：Python 3.x.x）。


2. **MacやLinuxの場合、ターミナルでPythonを確認**：
   - ターミナルを開きます。アプリケーションから見つけるか、検索を使用してください。
   - `python3 --version` または `python3 -V` と入力し Enter キーを押します。Pythonがインストールされている場合、バージョンが表示されます（例：Python 3.x.x）。

Pythonがインストールされていない場合は、公式の[Pythonウェブサイト](https://www.python.org)からダウンロードしてインストールする必要があります。それぞれのオペレーティングシステムに対するインストール手順に従ってください。

Pythonをインストールした後、Pythonを使用してスクリプトの実行やプログラミングを行うことができます。


- **Selenium**: `pip`を使用してSeleniumライブラリをインストールします。

  ```
  pip install selenium
  ```
### 2. Slackアカウントの作成とトークンの取得

Slackへの通知を送信するために、SlackアカウントとAPIへのアクセス用トークンが必要です。次の手順を実行してください。

- **Slackでアプリを作成**: Slackでアプリを作成し、Slack APIとの相互作用を設定する手順は以下の通りです：

1. [Slackアプリの作成ページ](https://api.slack.com/apps)にアクセスします。
2. Slackのワークスペースにまだログインしていない場合は、ログインを求められるでしょう。
3. "Create New App"（新しいアプリを作成）ボタンをクリックして新しいアプリの作成を開始します。
4. アプリの名前を入力し、使用するワークスペースを選択します。
5. "Create App"（アプリを作成）をクリックしてアプリの作成を完了します。
###
![Снимок экрана 2023-10-31 в 16.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587996/43ca6bd1-dc19-5bb2-aa07-40fd83d1cd8a.png)

###
- **権限を設定**: 「OAuth & Permissions」セクションでアプリの権限を設定するには、以下の手順に従います：

1\. 作成したSlackアプリのページに戻ります。
2\. サイドメニューから「OAuth & Permissions」（OAuthとアクセス許可）を選択し、アクセス許可の設定セクションに移動します。
###
![Снимок экрана 2023-10-31 в 16.59.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587996/1e9e05a7-ee1c-d623-4379-414e3d73c7e5.png)

###

3\. 「Bot Token Scopes」（ボットトークンスコープ）セクションでは、Slack内でのボットのアプリケーションの権限を設定できます。ボットがSlackワークスペースでさまざまなタスクを実行できるように、適切な権限を設定できます。メッセージをチャンネルに送信するための適切な権限（たとえば「chat:write」または「chat:write.public」など）がボットに設定されていることを確認してください。
###
![Снимок экрана 2023-10-31 в 14.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587996/4af5c75a-ef00-473a-1877-85cd73cf5511.png)
###

4\. 「User Token Scopes」（ユーザートークンスコープ）セクションでは、ユーザーの代わりにアプリケーションが動作する場合の権限を設定できます。チャンネルのユーザーリストへのアクセスが必要な場合、ユーザーまたはチャンネルに関する情報を取得できる権限（「channels:read」または「users:read」など）を要求することを確認してください。
###
![Снимок экрана 2023-10-31 в 14.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587996/664737a1-61ba-4034-7bf8-f6ca5402b52d.png)
###

5\. 必要な権限を選択した後、「Save Changes」（変更を保存）をクリックして、これらの設定をアプリケーションに適用します。

権限の設定時に重要なのは、アプリケーションの機能に本当に必要な権限のみを要求することです。この設定が完了すると、Slack内でのアプリケーションはチャンネルへのメッセージ送信やユーザー情報の取得に必要な適切な権限を持つことになります。

- **ワークスペースにアプリをインストール**: 「OAuth & Permissions」セクションで、「ワークスペースにインストール」ボタンを見つけて、アプリをワークスペースにインストールします。

- **OAuthトークンを取得**: アプリをインストールした後、OAuthトークンを「OAuth & Permissions」セクションからコピーします。このトークンはスクリプトでSlack APIとのやりとりに使用されます。

## ステップ1: Seleniumを使用して情報を収集

### 1.1 Seleniumの設定

Seleniumを使用してウェブサイトとやり取りするための設定を行いましょう。

```python

from selenium import webdriver
from selenium.webdriver.common.by import By

# あなたのブラウザのWebDriverをロード
driver = webdriver.Chrome()

```

### 1.2 ウェブサイトへのログイン

次に、出勤管理システムのウェブサイトにログインします。
架空のシステムですので、ここでは URL https://example.com としておきます。
WEBサイトにはHTMLの要素として"username"と"password"という要素がある事を前提に
seleniumのWEB操作でログイン情報を自動入力してみます。
```python

# ログインページを開く
driver.get("https://example.com/login")

# ユーザー名とパスワードの入力項目を特定
username = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")

# ログイン情報を入力
username.send_keys("あなたのユーザー名")
password.send_keys("あなたのパスワード")

# 「ログイン」ボタンを特定
login_button = driver.find_element(By.ID, "login-button")

# 「ログイン」ボタンをクリック
login_button.click()

```

### 1.3 ウェブサイトから情報を取得

これで、Seleniumを使用して従業員、遅刻情報、および遅刻日付に関する情報を取得します。

```python

# 従業員情報ページに移動
driver.get("https://example.com/attendance")

# ページ上のすべての従業員を見つけます
employee_data = []
employee_data = driver.find_elements(By.CLASS_NAME, "employee")

```
## ステップ2: データの処理とフォーマット

### 2.1 データの処理

データの処理により、従業員、遅刻情報、および遅刻日付に関する情報を整理できます。

```python

# データ処理の例（従業員名、遅刻判定回数、遅刻日時を取得）
for employee in employee_data:
    name = employee.find_element(By.CLASS_NAME, "name").text
    late_count = employee.find_element(By.CLASS_NAME, "late-count").text
    dates = [date.text for date in employee.find_elements(By.CLASS_NAME, "late-dates")]
    
    # 必要に応じてデータをさらに処理します

```

## ステップ3: Slackへの通知の送信

### 3.1 通知の送信用スクリプトの記述

`slack-sdk`ライブラリを使用して、Slackに従業員、遅刻情報、および遅刻日付に関する情報を含む通知を送信します。

```python

# Slackに通知を送信するためのコードの例
from slack_sdk import WebClient

slack_token = "あなたのSlackトークン"
client = WebClient(token=slack_token)

for employee in employee_data:
    name = employee.find_element(By.CLASS_NAME, "name").text
    late_count = employee.find_element(By.CLASS_NAME, "late-count").text
    dates = [date.text for date in employee.find_elements(By.CLASS_NAME, "late-dates")]

    formatted_data = f"{name}さんが{late_count}回遅刻しました。遅刻日付: {', '.join(dates)}"
    mention = f"<@U12345678> {formatted_data}"  # "U12345678"を実際のユーザーIDに置き換えてください

    # 通知を送信
    client.chat_postMessage(channel="general", text=mention)
    
    # "general"をあなたのチャンネル名に置き換えてください。
    
```



## まとめ

Seleniumライブラリを使用して、出勤管理システムのウェブサイトから従業員、遅刻情報、および遅刻日付に関する情報を収集し、Slackに通知を送信するPythonスクリプトを作成しました。

提供された情報は架空のものであり、実際の環境でこのような自動化を実施する場合は、具体的な要件とシナリオを考慮した詳細な分析と設定を行うことをお勧めします。