Rocket.Chat APIを使ってPythonから投稿してみた

### 背景
毎日の業務の中で自動化したい投稿はありますか？  
今回は運用しているサービスの日々の顧客数を営業チームやマーケティングチームに自動で通知するBotを作成するためにRocket.ChatのAPIを活用してPythonから自動で通知する仕組みを構築しました！  

SlackのBotに関する情報は多いですが、Rocket.Chatの情報は意外と少ないので、ぜひ参考にしてください！  

---

## 1. 準備：Rocket.ChatでBotを準備する
Rocket.ChatでBotを利用するには、まず以下の設定が必要です。

### **1.1 Botのアカウント作成**  
デフォルトで用意されているかわいい猫のアイコンのBot「Rocket.Cat」を使います。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962642/2b92865a-5e0d-c33b-a009-af548d5bcf07.png)

メールアドレスとパスワードを設定しましょう。
- **メールアドレス**：`test@sample.co.jp`  
- **パスワード**：`password`  

### **1.2 Botを通知用チャンネルに招待**  
通知を送るチャンネル（例：`BOT_TEST`）に、このBotを招待します。

---

## 2. 必要な情報を環境変数で管理
Botを動かすための設定情報は、環境変数にまとめて管理しましょう。  
`.env` ファイルの例：  

```.env
# Rocket.Chat API設定情報
ROCKET_CHAT_BASE_URL=https://chat.sample.work/
ROCKET_CHAT_EMAIL=test@sample.co.jp
ROCKET_CHAT_PASSWORD=password
ROCKET_CHAT_ROOM_NAME=BOT_TEST
```

---

## 3. Rocket.Chat APIの流れ
Rocket.Chat APIを使ったメッセージ投稿の流れは以下の通りです：

1. **ログイン**：`login` APIでBotの認証情報（メールアドレス＆パスワード）を送信して、`user-id` と `auth-token` を取得します。  
2. **チャネル情報の取得**：チャンネル名から`channel_id`（ランダムな文字列）を取得します。  
3. **メッセージ投稿**：`auth-token` と `user-id` をヘッダーにセットし、`channel_id` とメッセージ本文をPOSTします。  

---

## 4. POSTMANでAPIを確認する
Pythonのコードを書く前にPOSTMANでリクエストが正しく動作することを確認しましょう。

### **4.1 ログイン**
- **エンドポイント**：`/api/v1/login`  
- **Body**：メールアドレス＆パスワード  
![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962642/0d251a3d-3273-6fd3-fe24-c50723498be9.png)

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962642/3c72b336-6933-4783-cbd6-e39c6bc30fe9.png)

---

### **4.2 チャンネルID取得**
- **エンドポイント**：`/api/v1/rooms.info`  
- **Params**：チャンネル名  
![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962642/d374b9e3-b709-0fa9-651b-92e318f2088a.png)
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962642/55aae73a-ab95-9e37-0767-5eda1c5798e3.png)


---

### **4.3 メッセージ投稿**
- **エンドポイント**：`/api/v1/chat.postMessage`  
- **Headers**：`auth-token`、`user-id`  
- **Body**：`channel_id`、`text`  
![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962642/85c6128f-12f2-2ef4-4f47-b905c7bccee8.png)
![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962642/c09de2ff-28cd-9bb0-0d6c-efad15d6af44.png)



---

## 5. PythonでRocket.Chatに通知する

PythonからRocket.chat APIを呼びましょう
```daily_report.py
import os
import requests
from dotenv import load_dotenv

# 環境変数を取得
ROCKET_CHAT_BASE_URL = os.getenv("ROCKET_CHAT_BASE_URL")
ROCKET_CHAT_EMAIL = os.getenv("ROCKET_CHAT_EMAIL")
ROCKET_CHAT_PASSWORD = os.getenv("ROCKET_CHAT_PASSWORD")
ROCKET_CHAT_ROOM_NAME = os.getenv("ROCKET_CHAT_ROOM_NAME")

# メッセージフォーマット
def format_message(user_count):
    return f"現在の顧客数は{user_count}です。"

# Rocket.Chatにメッセージを投稿
def post_message_to_rocket_chat(email, password, room_name, message):
    try:
        # 1. ログイン
        login_url = f"{ROCKET_CHAT_BASE_URL}api/v1/login"
        response = requests.post(login_url, json={"user": email, "password": password})
        response.raise_for_status()
        user_id = response.json()['data']['userId']
        auth_token = response.json()['data']['authToken']
        
        # 2. チャネルID取得
        room_info_url = f"{ROCKET_CHAT_BASE_URL}api/v1/rooms.info?roomName={room_name}"
        headers = {'X-Auth-Token': auth_token, 'X-User-Id': user_id}
        response = requests.get(room_info_url, headers=headers)
        response.raise_for_status()
        channel_id = response.json()['room']['_id']
        
        # 3. メッセージ投稿
        post_message_url = f"{ROCKET_CHAT_BASE_URL}api/v1/chat.postMessage"
        payload = {'channel': channel_id, 'text': message}
        response = requests.post(post_message_url, headers=headers, json=payload)
        response.raise_for_status()
        print("Rocket.Chatへのメッセージ投稿に成功しました！")

    except Exception as e:
        print(f"エラーが発生しました: {e}")

# メイン処理
if __name__ == "__main__":
    user_count = 100  # 仮の顧客数（ここをDBから取得する処理に置き換え）
    message = format_message(user_count)
    post_message_to_rocket_chat(ROCKET_CHAT_EMAIL, ROCKET_CHAT_PASSWORD, ROCKET_CHAT_ROOM_NAME, message)
```

---
## 6. Shellscriptの作成
daily_report.pyを実行するためのシェルスクリプトを作成します。このスクリプトは、指定されたPythonスクリプトを実行する役割を果たします。


```daily_batch.sh
#!/bin/bash

# daily_report.pyを実行
/usr/local/bin/python /daily_report.py
```

## 7．cron.confの設定
次に、cron.confファイルを設定します。このファイルには、cronが実行するジョブのスケジュールが記述されています。
今回は平日毎日18時に通知したいので以下のように設定します：
```cron.conf
0 18 * * 1-5 /bin/bash /path/to/daily_batch.sh >> /log/cron.log 2>&1
```

## 8. cronの設定から実行
8-1. cron.confの反映
cron.confの内容をcrontabに反映させるため、以下のコマンドを実行します。
```bash
crontab cron.conf
```
8-2. cronサービスの再起動
```bash
sudo systemctl restart cron
または
sudo service cron restart
```

8-3. cronジョブの確認
```bash
crontab -l
```




## 9. まとめ
今回はRocket.Chat APIを使ってBotを作成する流れを解説しました！
初めての記事投稿となりますが、今後も継続してアウトプットしていければなと思います！


Rocket.Chatの公式ドキュメント：  
- [login API](https://developer.rocket.chat/apidocs/login-with-username-and-password)  
- [チャンネル情報取得API](https://developer.rocket.chat/apidocs/get-room-information)  
- [メッセージ投稿API](https://developer.rocket.chat/apidocs/send-message)  

---