helper.slack_message_api のソースコード

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""slackにメッセージを送る
"""
import json
from dataclasses import dataclass, asdict
import os
from typing import Optional
from argparse import ArgumentParser
from slack_sdk import WebClient  # pip install slack_sdk
from slack_sdk.errors import SlackApiError


[ドキュメント] @dataclass(frozen=True) class SlackMessageAPI: """Slackの設定情報を管理して、メッセージを送信するクラス。 access_tokenを指定せず、jsonファイルからaccess_tokenが読み込めない場合はアプリ終了する Args: access_token (str): (省略可)Slack API のトークンを指定する。指定しない場合はJSONファイルから読み込む json_path (str): (省略可)設定情報を保存するjsonファイルのパス client (WebClient): (省略可)Slack Clientのインスタンス Returns: SlackMessageAPI: インスタンス """ access_token: str json_path: str = (os.path.dirname(__file__) + r"\..\json\slack_message_api_config.json") client: WebClient = None def __post_init__(self): if not self.access_token: try: loaded_self = self.load_from_json() object.__setattr__(self, "access_token", loaded_self.access_token) except FileNotFoundError: print(f"エラー: JSONファイル({self.json_path})が見つかりません。" "トークンを指定するか、JSONファイルを作成してください。") exit(1) self.save_to_json() object.__setattr__(self, "client", WebClient(token=self.access_token))
[ドキュメント] def send_message(self, _channel_id: str, _message: str) -> bool: """Slackにメッセージを送信する Args: _channel_id (str): 送信先のチャンネルID _message (str): 送信するメッセージ Returns: bool: 送信に成功した場合はTrue、失敗した場合はFalseを返す """ try: self.client.chat_postMessage(channel=_channel_id, text=_message) return True except SlackApiError as e: print(f"メッセージの送信に失敗しました: {e}") return False
[ドキュメント] def save_to_json(self) -> None: """設定情報をJSONファイルに保存する。 設定情報の保存に失敗した場合は、エラーを表示して処理を継続する """ try: with open(self.json_path, 'w', encoding='utf-8') as f: json.dump(asdict(self), f, ensure_ascii=False, indent=4) except Exception as e: print(f"設定情報の保存に失敗しました: {e}")
[ドキュメント] @classmethod def load_from_json(cls, json_path: Optional[str] = None) -> "SlackMessageAPI": """JSONファイルから設定情報を読み込み、インスタンスを生成する Args: json_path (str): (省略可)JSONファイルのパス。指定しない場合は、デフォルトのパスを使用する Returns: SlackMessageAPI: インスタンス Raises: FileNotFoundError: JSONファイルが見つからない、設定情報の保存に失敗した """ path = json_path or cls.json_path if os.path.exists(path): with open(path, "r") as f: data = json.load(f) return cls(**data) else: raise FileNotFoundError(f"JSONファイルが見つかりません: {path}")
[ドキュメント] def get_option(): """オプションをパースする Returns: Namespace: オプションのパース結果 """ arg_parser = ArgumentParser() arg_parser.add_argument('-a', '--access_token', type=str, default="", help='Slack Appsのアクセストークンを指定する') arg_parser.add_argument('-c', '--channel_id', type=str, default="#general", help='メッセージを送るSlackチャンネルのIDを指定する') arg_parser.add_argument('-m', '--message', type=str, default="Hello from SlackMessageAPI!", help='送るメッセージを指定する') return arg_parser.parse_args()
if __name__ == "__main__": arg = get_option() print(arg) if arg.access_token: slack = SlackMessageAPI(access_token=arg.access_token) else: slack = SlackMessageAPI(access_token="") if slack.send_message(arg.channel_id, arg.message): print("メッセージを送信しました。") else: print("メッセージの送信に失敗しました。")