Python で Chatwork の履歴を保存

Chatwork とは

Chatwork(チャットワーク)は、日本発祥のビジネスチャットツールです。主な機能としては、次のようなものがあります。

  • チャット機能:
    1 対 1 のチャットや、グループチャットが可能です。メッセージは履歴として残るため、後から確認することができます。
  • タスク管理機能:
    タスクの作成・割り当て・完了報告ができます。チームメンバーが誰がどのタスクを担当しているかが一目でわかるため、業務の進捗管理がしやすくなります。
  • ファイル共有機能:
    ドキュメントや画像などのファイルをチャット内で共有することができます。チームメンバー全員がファイルにアクセスできるため、情報共有が円滑に行われます。
  • 外部連携機能:
    Chatwork には API があり、外部のアプリケーションから Chatwork の機能を利用することができます。例えば次のようなことができます。
    • タスクの自動作成や進捗管理
    • チャットの自動作成やメッセージの送信
    • メンバーの追加や削除
    • ファイルのアップロードやダウンロード

    Chatwork API の使い方

    Chatworkアカウントの取得

    Chatwork API を使用するには、まず Chatwork のアカウントを取得する必要があります。アカウントを持っていない場合は、Chatwork の Web サイトから登録してください。

    API トークンの取得

    Chatwork API を使用するには、API トークンが必要です。API トークンは Chatwork のアカウントページから発行できます。

    API を実行

    API を実行するには、HTTP リクエストを送信する必要があります。
    以下は Python を使用して Chatwork API を実行する例です。この例では、チャットルーム ID が123、メッセージ本文が “Hello, Chatwork!” のメッセージを送信する API を実行しています。

    import requests
    
    API_TOKEN = 'YOUR_API_TOKEN'
    ROOM_ID = '123'
    MESSAGE = 'Hello, Chatwork!'
    
    url = f'https://api.chatwork.com/v2/rooms/{ROOM_ID}/messages'
    headers = {'X-ChatWorkToken': API_TOKEN}
    params = {'body': MESSAGE}
    response = requests.post(url, headers=headers, params=params)
    
    print(response.json())

    Chatworks 履歴を保存

    Python を使用して、API 経由で Chatworks の全履歴を保存するスクリプト例です。

    # ----------------------------------------------------------------------------
    # Author: tomo
    # Creation Date: 2023-04-02
    #
    # This script is free to use and modify at your own discretion.
    # No warranty is provided for the script's functionality.
    # Use this script at your own risk.
    # ----------------------------------------------------------------------------
    import requests
    import json
    import os
    from datetime import datetime
    
    # APIトークンを設定
    api_token = "YOUR_API_TOKEN"
    
    headers = {
        "X-ChatWorkToken": api_token
    }
    
    def get_rooms():
        url = "https://api.chatwork.com/v2/rooms"
        response = requests.get(url, headers=headers)
        return response.json()
    
    def get_messages(room_id, last_message_id):
        url = f"https://api.chatwork.com/v2/rooms/{room_id}/messages"
        params = {"force": 1}
    
        if last_message_id:
            params["end_id"] = last_message_id
    
        response = requests.get(url, headers=headers, params=params)
    
        if response.status_code != 200:
            print(f"Error: HTTP status code {response.status_code} for room {room_id}")
            return []
    
        try:
            messages = response.json()
        except json.JSONDecodeError:
            print(f"Error decoding JSON for room {room_id}: {response.text}")
            return []
    
        return messages
    
    def save_messages_to_file(room_name, messages):
        filename = f"{room_name}.txt"
    
        # ファイルが存在する場合は追記モード('a')、存在しない場合は新規作成モード('w')
        mode = 'a' if os.path.exists(filename) else 'w'
    
        with open(filename, mode, encoding="utf-8") as f:
            for message in messages:
                f.write(f"{message['account']['name']} ({message['account']['account_id']}): {message['body']}\n")
    
            # 最後のメッセージIDをファイルに保存
            if messages:
                f.write(f"LAST_MESSAGE_ID:{messages[-1]['message_id']}\n")
    
    def get_last_message_id(filename):
        if not os.path.exists(filename):
            return None
    
        last_message_id = None
    
        with open(filename, 'r', encoding='utf-8') as f:
            for line in f:
                if line.startswith("LAST_MESSAGE_ID:"):
                    last_message_id = line.strip().split(':')[1]
    
        return last_message_id
    
    def main():
        rooms = get_rooms()
        for room in rooms:
            room_id = room["room_id"]
            room_name = room["name"]
            filename = f"{room_name}.txt"
            last_message_id = get_last_message_id(filename)
            messages = get_messages(room_id, last_message_id)
            
            # 最後のメッセージIDから新しいメッセージだけをフィルタリング
            if last_message_id:
                messages = [msg for msg in messages if int(msg["message_id"]) > int(last_message_id)]
    
            save_messages_to_file(room_name, messages)
    
    if __name__ == "__main__":
        main()

    履歴保存処理の定期実行

    上記スクリプトを Windows のタスクスケジューラで定期実行することで、前回の実行から新しいメッセージだけを追記します。以下は Windows 11 のタスクスケジューラでスクリプトを実行する例です。

    1. タスクスケジューラを開く:
      • スタートメニューを開いて、検索ボックスに「タスクスケジューラ」と入力し、検索結果に表示された「タスクスケジューラ」をクリックして開きます。
    2. タスクの作成:
      • タスクスケジューラの右側のペインにある「操作」メニューから「基本タスクの作成」をクリックします。
    3. タスクの名前と説明を入力:
      • 「名前」にタスクの名前を入力し、「説明」にタスクの説明を入力します。次に、「次へ」ボタンをクリックします。
    4. タスクのトリガーを設定:
      • トリガーを選択して、タスクの実行タイミングを設定します(例:毎日、毎週など)。設定が完了したら、「次へ」ボタンをクリックします。
    5. タスクのアクションを設定:
      • 「操作」で「プログラムの開始」を選択し、「次へ」ボタンをクリックします。
      • 「プログラム/スクリプト」欄に Python インタープリタの絶対パスを入力します(例:C:\Users\YourUsername\AppData\Local\Programs\Python\Python310\python.exe)。Pythonインタープリタのパスは、コマンドプロンプトで where python と入力することで確認できます。
      • 「引数の追加 (オプション)」欄に、スクリプトファイルへの絶対パスを入力します(例:C:\scripts\chatworks.py)。
      • 「開始する場所 (オプション)」欄に、スクリプトファイルがあるフォルダの絶対パスを入力します(例:C:\scripts)。
      • 設定が完了したら、「次へ」ボタンをクリックします。
    6. タスクの設定を確認:
      • 最後に設定内容を確認し、必要に応じて変更を加えます。確認が終わったら、「完了」ボタンをクリックしてタスクを作成します。

    以上