🤖

Discord-Slack連携Botで業務効率化にチャレンジしてみた

2025/01/22に公開

🌟 はじめに

みなさん、こんにちは!仕事や研究でDiscordとSlackの両方を使っている方、必見です!
今回は、情報共有を効率化するために作った連携Botの開発記録を共有したいと思います。

こんな悩みありませんか?

「あれ?その連絡Slackだっけ?Discordだっけ?」
「重要な連絡、見逃してた...やばい」
「同じファイル、両方にアップロードするの面倒だな...」

私も同じ悩みを抱えていました。そこで、「両方のツールを連携させれば解決するのでは?」と思い立ち、Botを開発することにしました!

導入効果がスゴイ!

実際に使ってみたところ...

📈 数字で見る改善効果

  • 情報共有の手間が半分に!(作業時間50%削減)
  • 重要連絡の見落としがほぼゼロに!(90%減少)
  • ファイル共有がラクラクに!(作業効率2倍)

(あくまで個人の感想に過ぎないですが💦)

💪 このBotでできること

1️⃣ 完全自動の情報同期

  • Discordの投稿が自動でSlackに!
  • Slackの投稿が自動でDiscordに!
  • 画像や文書もラクラク共有!

2️⃣ その他便利な機能も満載

  • arXivから論文をサクッと検索
  • スケジュール管理も楽チン
  • 最新技術ニュースを自動配信

🎯 開発の動機

  1. 情報共有の一元化

    • Slack派とDiscord派の分断
    • 重要な情報の見落とし防止
    • ファイル共有の効率化
  2. 業務の効率化

    • 論文情報の一括管理
    • スケジュール共有の簡易化
    • ニュース情報の自動配信

💡 主な機能と工夫点

コミュニケーションを改善するために、特に以下の3つの機能に力を入れて開発しました。
それぞれの機能について、実際のコードと共に解説していきます。

1. メッセージ同期

「今どっちのツールに投稿したっけ?」という悩みを解消するため、
Discord⇔Slack間でメッセージを自動で同期する機能を実装しました。

# Discord → Slack
async def send_to_slack(message, user, channel):
    blocks = [
        {
            "type": "header",
            "text": {"type": "plain_text", "text": f"From Discord #{channel.name}"}
        },
        {
            "type": "section",
            "text": {"type": "mrkdw", "text": message.content}
        }
    ]
    await slack_client.chat_postMessage(channel=SLACK_CHANNEL, blocks=blocks)

工夫点

  • メッセージの重複送信防止
  • 絵文字リアクションの同期
  • メンションの相互変換

こんなことができます!

  • 📱 Discordで送信→Slackに自動転送
  • 🔄 絵文字リアクションも同期
  • 👥 メンションも自動で変換
  • 🚫 ループ防止機能付き

2. 論文管理機能

研究者向けに、arXivの論文を簡単に検索・保存できる機能を追加しました。
キーワードを入力するだけで、関連論文をすぐに見つけることができます。

@bot.tree.command(name="arxiv_search")
async def arxiv_search(interaction: discord.Interaction, query: str):
    url = f'http://export.arxiv.org/api/query?search_query=all:{query}'
    # キーワードと簡単コピー用IDを表示
    keywords = [f"🔑={kw}" for kw in query.split(',')]

工夫点

  • キーワードの視覚化
  • IDの簡単コピー機能
  • お気に入り論文の永続化

使い方の例

  1. /arxiv_search AI machine learningと入力
  2. 検索結果から気になる論文のIDをコピー
  3. /arxiv_save [ID]で論文を保存
  4. /arxiv_listで保存した論文を一覧表示

3. ニュース配信

毎朝の最新技術ニュースをチェックする手間を省くため、
自動でニュースを収集・配信する機能を実装しました。

class NewsService:
    async def fetch_news(self):
        if not articles:
            return self.get_default_articles()
        return articles[:5]  # 最大5件に制限

工夫点

  • エラー時のフォールバック
  • デフォルトニュースの用意
  • 自動投稿機能

ニュース配信の特徴

  • ⏰ 毎朝9時に自動配信
  • 🎯 AIや技術関連に特化
  • 📱 スマートな表示形式
  • ⚠️ エラー時も代替表示で安心

🛠️ 技術スタック

「なぜこの技術を選んだの?」という方のために、
採用した技術とその理由を説明していきます。

フレームワーク・ライブラリ

技術選定のポイント

  • discord.py:安定性と豊富な機能が決め手
  • slack_sdk:公式ライブラリで信頼性が高い
  • aiohttp:非同期処理で高速化を実現

データ管理

  • JSON形式でのデータ永続化
  • ファイルベースの軽量設計
  • 非同期処理の活用

🔧 実装上の工夫

開発中に直面した課題と、その解決方法をご紹介します。
特に以下の3点に注力しました。

1. エラーハンドリング

APIリクエストの失敗やタイムアウトに備えて、
しっかりとしたエラー処理を実装しています。

try:
    articles = await asyncio.wait_for(
        news_service.fetch_news(),
        timeout=15.0
    )
except asyncio.TimeoutError:
    await interaction.followup.send("タイムアウトしました")

2. 非同期処理

複数の処理を効率よく行うため、
非同期処理を積極的に活用しています。

  • aiohttpを使用した効率的な通信
  • タイムアウト制御の実装
  • メモリ使用量の最適化

3. ユーザビリティ

ユーザーが迷わず使えるよう、
UIとUXにこだわりました。

  • 直感的なスラッシュコマンド
  • エラーメッセージの親切な表示
  • チャンネル制限による秩序維持

パフォーマンスの改善例

  • ⚡ API要求の並列処理
  • 🕒 タイムアウト制御
  • 📊 メモリ使用量の監視

使いやすさへのこだわり

  • 📝 シンプルなコマンド体系
  • ⚠️ わかりやすいエラー表示
  • 🔒 チャンネルごとの権限管理

📈 今後の展望

  1. 機能拡張

    • GPT-4との連携
    • 進捗管理機能
    • 自動論文要約機能
  2. 改善点

    • パフォーマンス最適化
    • UI/UXの向上
    • エラーハンドリングの強化

🎉 おわりに

本プロジェクトを通じて、コミュニケーションがよりスムーズになりました。
今後も機能改善を続けていく予定です。


プロジェクトに興味を持っていただけた方は、ぜひGitHubをご覧ください:
Lab Migration Bot
https://github.com/paraccoli/lab_migration_bot

Discussion