ساخت Slack Bot با Python روی Ubuntu 24.04

مقدمه

Slack یکی از محبوب‌ترین پلتفرم‌های ارتباطی برای تیم‌ها و سازمان‌ها است که امکاناتی مانند پیام‌رسانی مستقیم، کانال‌های عمومی و خصوصی، تماس صوتی و تصویری و همچنین پشتیبانی از ربات‌ها (Bot) را در اختیار کاربران قرار می‌دهد.

ربات‌های Slack یا Slackbot برنامه‌هایی هستند که می‌توانند به‌صورت خودکار کارهای مختلفی انجام دهند؛ از ارسال پیام و اجرای دستورات گرفته تا مانیتورینگ رویدادها و اطلاع‌رسانی خودکار.

در این آموزش یاد می‌گیرید چگونه با استفاده از زبان Python یک Slackbot بسازید. پایتون به دلیل سادگی، خوانایی بالا و کتابخانه‌های قدرتمند، یکی از بهترین گزینه‌ها برای توسعه ربات‌های Slack محسوب می‌شود.

Slack نیز کتابخانه‌های رسمی متنوعی برای Python ارائه کرده است که از طریق آن‌ها می‌توانید:

  • پیام ارسال کنید.
  • ایموجی به پیام‌ها اضافه کنید.
  • فایل ارسال کنید.
  • به رویدادهای مختلف Workspace واکنش نشان دهید.
  • و بسیاری قابلیت‌های دیگر.

در این آموزش به‌عنوان یک نمونه عملی، یک ربات ساده به نام CoinBot می‌سازیم که با دریافت یک دستور در کانال Slack، مانند پرتاب سکه عمل کرده و نتیجه را به کاربر اعلام می‌کند.

اگرچه این پروژه بسیار ساده است، اما تمام مفاهیم پایه موردنیاز برای توسعه ربات‌های حرفه‌ای Slack را پوشش می‌دهد و پس از پایان آموزش می‌توانید آن را برای سناریوهای واقعی مانند:

  • سیستم‌های اعلان (Notification)
  • اتوماسیون تیمی
  • مانیتورینگ سرویس‌ها
  • اجرای دستورات مدیریتی
  • پاسخگویی خودکار
  • اتصال به APIهای مختلف

گسترش دهید.

نکته

این آموزش بر اساس Python 3 نوشته شده است و با Python 2 سازگار نیست.


پیش‌نیازها

برای انجام مراحل این آموزش به موارد زیر نیاز دارید.

۱. یک Workspace در Slack

ابتدا باید یک Workspace در Slack داشته باشید که امکان نصب برنامه (App) روی آن را داشته باشید.

اگر Workspace را خودتان ایجاد کرده باشید، این دسترسی به‌صورت پیش‌فرض در اختیار شما قرار دارد.


۲. یک سرور Ubuntu 24.04

برای اجرای این آموزش پیشنهاد می‌شود از یک سرور تازه با مشخصات زیر استفاده کنید:

  • Ubuntu 24.04 LTS
  • یک کاربر غیر Root با دسترسی sudo
  • فعال بودن SSH
  • دسترسی به اینترنت

اگر هنوز سرور تهیه نکرده‌اید، می‌توانید تنها در چند دقیقه یک سرور ابری پارمین کلود (Parmin Cloud) ایجاد کرده و مراحل آموزش را روی آن انجام دهید.


۳. داشتن IP عمومی (پیشنهادی)

از آنجایی که Slack باید بتواند رویدادها (Events) را برای ربات شما ارسال کند، بهتر است سرور دارای یک Public IP باشد.

در صورتی که آموزش را روی کامپیوتر شخصی انجام می‌دهید، لازم است:

  • Port Forwarding انجام دهید.
  • یا از ابزارهایی مانند Cloudflare Tunnel یا Ngrok استفاده کنید.

در این آموزش فرض می‌کنیم برنامه روی یک سرور Ubuntu با IP عمومی اجرا می‌شود.


در بخش بعدی وارد پنل توسعه‌دهندگان Slack می‌شویم و اولین اپلیکیشن خود را ایجاد می‌کنیم.


مرحله اول — ساخت اپلیکیشن Slack در پنل توسعه‌دهندگان

در اولین قدم باید ربات خود را در پنل توسعه‌دهندگان Slack ایجاد کنیم.

برای این کار:

  1. وارد Workspace خود در Slack شوید.
  2. سپس از طریق مرورگر وارد Slack API Dashboard شوید.
  3. روی گزینه Create an App کلیک کنید.

انتخاب نام برنامه

در این مرحله از شما دو مورد خواسته می‌شود:

  • نام برنامه (App Name)
  • Workspace مقصد

در این آموزش نام برنامه را CoinBot قرار می‌دهیم و Workspace موردنظر را انتخاب می‌کنیم.

پس از تکمیل اطلاعات روی Create App کلیک کنید.


داشبورد مدیریت برنامه

بعد از ایجاد برنامه، وارد داشبورد مدیریت آن می‌شوید.

در این بخش می‌توانید:

  • سطح دسترسی (Permissions) برنامه را تعیین کنید.
  • رویدادهای دریافتی (Events) را مدیریت کنید.
  • برنامه را روی Workspace نصب کنید.
  • توکن‌های دسترسی دریافت کنید.
  • تنظیمات امنیتی برنامه را مدیریت کنید.

تقریباً تمام تنظیمات موردنیاز ربات از همین صفحه انجام خواهد شد.


اعطای دسترسی ارسال پیام

از آنجایی که قرار است ربات بتواند داخل کانال‌ها پیام ارسال کند، ابتدا باید مجوز لازم را برای آن تعریف کنیم.

از منوی سمت چپ وارد بخش:

OAuth & Permissions

شوید.

سپس کمی پایین‌تر بروید تا به بخش Scopes برسید.

در قسمت Bot Token Scopes روی گزینه:

Add an OAuth Scope

کلیک کنید.


اضافه کردن مجوز chat:write

در کادر جستجو عبارت زیر را وارد کنید:

chat:write

این سطح دسترسی به ربات اجازه می‌دهد در کانال‌هایی که عضو آن‌هاست پیام ارسال کند.

در آینده در صورت نیاز می‌توانید مجوزهای بیشتری مانند موارد زیر را نیز اضافه کنید:

  • خواندن پیام‌ها
  • مدیریت فایل‌ها
  • مدیریت کانال‌ها
  • واکنش با Emoji
  • ارسال پیام خصوصی

اما برای این آموزش همان chat:write کافی است.


نصب برنامه روی Workspace

اکنون که مجوزها را تعیین کرده‌ایم، باید برنامه را روی Workspace نصب کنیم.

در همان صفحه OAuth & Permissions به بالای صفحه برگردید و روی دکمه:

Install App to Workspace

کلیک کنید.

Slack فهرستی از مجوزهایی که برنامه درخواست کرده نمایش می‌دهد.

اگر همه چیز صحیح بود روی Allow کلیک کنید.


دریافت Bot Token

پس از نصب موفق برنامه، Slack یک توکن اختصاصی برای ربات تولید می‌کند.

این توکن با نام زیر نمایش داده می‌شود:

Bot User OAuth Token

یا در نسخه‌های جدید Slack:

xoxb-xxxxxxxxxxxxxxxx

این توکن را در جای امنی نگه دارید؛ زیرا در ادامه آموزش برای اتصال برنامه Python به Slack از آن استفاده خواهیم کرد.

نکته امنیتی

این توکن معادل رمز عبور ربات شماست. هرگز آن را داخل GitHub یا مخازن عمومی قرار ندهید.


اضافه کردن ربات به یک کانال

در آخر باید ربات را وارد یکی از کانال‌های Workspace کنید.

اگر هنوز کانالی ایجاد نکرده‌اید، می‌توانید از کانال پیش‌فرض #general استفاده کنید.

برای این کار:

  1. برنامه CoinBot را از بخش Apps پیدا کنید.
  2. وارد صفحه برنامه شوید.
  3. روی آیکون Details در گوشه بالا کلیک کنید.
  4. از منوی سه نقطه (More) گزینه:
Add this app to a channel

را انتخاب کنید.

سپس نام کانال موردنظر را وارد کرده و روی Add کلیک کنید.


در این مرحله ربات شما با موفقیت ایجاد شده و به یکی از کانال‌های Workspace اضافه شده است.

البته هنوز هیچ کاری انجام نمی‌دهد، زیرا هنوز کدی برای آن ننوشته‌ایم.

در بخش بعدی محیط توسعه Python را آماده کرده و کتابخانه‌های موردنیاز را نصب خواهیم کرد.


مرحله دوم — آماده‌سازی محیط توسعه Python

اکنون که اپلیکیشن Slack را ایجاد کرده‌ایم، نوبت به آماده‌سازی محیط توسعه می‌رسد تا بتوانیم کدنویسی ربات را آغاز کنیم.

در این آموزش از Python 3 و یک Virtual Environment استفاده می‌کنیم تا وابستگی‌های پروژه از سایر پروژه‌های سیستم جدا باشند.


به‌روزرسانی سیستم

ابتدا لیست مخازن و بسته‌های سیستم را به‌روزرسانی کنید.

sudo apt update
sudo apt upgrade -y

نصب Python و ابزارهای موردنیاز

در Ubuntu 24.04 معمولاً Python 3 به‌صورت پیش‌فرض نصب شده است، اما برای اطمینان، بسته‌های موردنیاز را نصب کنید.

sudo apt install python3 python3-venv python3-pip -y

برای بررسی نسخه Python نیز می‌توانید دستور زیر را اجرا کنید.

python3 --version

نمونه خروجی:

Python 3.12.x

ایجاد Virtual Environment

برای جلوگیری از تداخل کتابخانه‌های پروژه با سایر برنامه‌های سیستم، بهتر است از محیط مجازی Python استفاده کنیم.

ابتدا پوشه‌ای برای نگهداری محیط‌های مجازی ایجاد کنید.

mkdir -p ~/.venvs

سپس محیط مجازی پروژه را ایجاد کنید.

python3 -m venv ~/.venvs/slackbot

فعال کردن محیط مجازی

اکنون محیط مجازی را فعال کنید.

source ~/.venvs/slackbot/bin/activate

در صورت موفقیت، ابتدای خط فرمان چیزی مشابه زیر نمایش داده می‌شود.

(slackbot) user@server:~$

از این لحظه تمام کتابخانه‌هایی که نصب می‌کنید فقط در همین پروژه قرار خواهند گرفت.


استفاده از میرور PyPI پارمین کلود

برای افزایش سرعت دانلود بسته‌های Python، پیشنهاد می‌شود از میرور PyPI پارمین کلود استفاده کنید.

ابتدا pip را به آخرین نسخه ارتقا دهید.

python -m pip install --upgrade pip \
-i https://pypi.parmincloud.ir/simple/

سپس کتابخانه‌های موردنیاز پروژه را نصب کنید.

pip install slackclient slackeventsapi Flask \
-i https://pypi.parmincloud.ir/simple/

در این پروژه از سه کتابخانه اصلی استفاده می‌کنیم:

کتابخانه کاربرد
slackclient ارتباط با Web API اسلک و ارسال پیام
slackeventsapi دریافت Eventهای ارسالی از Slack
Flask ایجاد یک Web Server سبک برای دریافت درخواست‌های Slack

بررسی نصب کتابخانه‌ها

برای اطمینان از نصب صحیح، دستور زیر را اجرا کنید.

pip list

خروجی باید شامل کتابخانه‌هایی مانند موارد زیر باشد.

Flask
slackclient
slackeventsapi

ساخت پوشه پروژه

برای نظم بیشتر، یک پوشه جداگانه برای پروژه ایجاد کنید.

mkdir ~/coinbot
cd ~/coinbot

تمام فایل‌های پروژه را در این مسیر ایجاد خواهیم کرد.

در پایان این مرحله، محیط توسعه شما کاملاً آماده است و می‌توانید نوشتن کد ربات را آغاز کنید.


در مرحله بعد چه کاری انجام می‌دهیم؟

در بخش بعدی کلاس CoinBot را ایجاد می‌کنیم؛ کلاسی که وظیفه دارد:

  • پرتاب سکه را شبیه‌سازی کند.
  • پیام مناسب را تولید کند.
  • خروجی را در قالب استاندارد Slack (JSON Payload) آماده کند تا از طریق API برای کانال ارسال شود.

مرحله سوم — ساخت کلاس CoinBot در Python

اکنون که محیط توسعه آماده شده است، نوبت به نوشتن اولین بخش از کد ربات می‌رسد.

در این مرحله کلاسی به نام CoinBot ایجاد می‌کنیم که وظیفه آن ساخت پیام مناسب برای Slack و شبیه‌سازی پرتاب سکه است.

در واقع این کلاس یک JSON Payload مطابق استاندارد Slack تولید می‌کند تا توسط API برای کانال ارسال شود.


ساخت فایل پروژه

ابتدا فایل مربوط به ربات را ایجاد کنید.

touch coinbot.py

سپس آن را با ویرایشگر دلخواه باز کنید.

برای مثال با Nano:

nano coinbot.py

ساختار پیام در Slack

پیام‌هایی که توسط Slack API ارسال می‌شوند، در قالب JSON هستند.

نمونه‌ای از ساختار پیام:

{
    "channel": "general",
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "در حال پرتاب سکه..."
            }
        },
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "نتیجه: شیر"
            }
        }
    ]
}

البته لازم نیست این JSON را به‌صورت دستی تولید کنیم؛ در ادامه این کار را با یک کلاس پایتون انجام خواهیم داد.


وارد کردن کتابخانه‌های موردنیاز

در این بخش فقط به کتابخانه داخلی random نیاز داریم.

این کتابخانه برای تولید اعداد تصادفی و شبیه‌سازی پرتاب سکه استفاده می‌شود.

ابتدای فایل را به شکل زیر بنویسید.

import random

ایجاد کلاس CoinBot

اکنون کلاس اصلی پروژه را ایجاد می‌کنیم.

class CoinBot:
    pass

در ادامه تمام قابلیت‌های ربات داخل همین کلاس قرار خواهند گرفت.


تعریف قالب اولیه پیام

قبل از اینکه نتیجه پرتاب سکه نمایش داده شود، بهتر است ربات یک پیام ابتدایی ارسال کند.

برای این کار یک ثابت (Constant) داخل کلاس تعریف می‌کنیم.

class CoinBot:

    COIN_BLOCK = {
        "type": "section",
        "text": {
            "type": "mrkdwn",
            "text": (
                "در حال پرتاب سکه...\n\n"
            ),
        },
    }

این بخش اولین بلوک پیام Slack را تشکیل می‌دهد.


ساخت متد سازنده (Constructor)

هر بار که ربات اجرا می‌شود باید بداند پیام را به کدام کانال ارسال کند.

برای همین شناسه یا نام کانال را هنگام ایجاد شیء دریافت می‌کنیم.

class CoinBot:

    ...

    def __init__(self, channel):
        self.channel = channel

از این پس هر شیء از کلاس CoinBot، کانال مقصد خود را خواهد شناخت.


شبیه‌سازی پرتاب سکه

اکنون مهم‌ترین قسمت کلاس را می‌نویسیم.

با استفاده از تابع random.randint() عددی بین صفر و یک تولید می‌کنیم.

اگر مقدار صفر باشد نتیجه شیر و اگر یک باشد خط خواهد بود.

def _flip_coin(self):

    rand_int = random.randint(0, 1)

    if rand_int == 0:
        result = "شیر 🦁"
    else:
        result = "خط 🪙"

    text = f"نتیجه پرتاب سکه: **{result}**"

    return {
        "type": "section",
        "text": {
            "type": "mrkdwn",
            "text": text
        }
    },

در اینجا:

  • random.randint() عدد تصادفی تولید می‌کند.
  • متن خروجی ساخته می‌شود.
  • خروجی به فرمت قابل قبول Slack برگردانده می‌شود.

تولید پیام کامل

در آخر باید پیام نهایی را بسازیم.

این پیام شامل:

  • نام کانال
  • متن اولیه
  • نتیجه پرتاب سکه

خواهد بود.

def get_message_payload(self):

    return {
        "channel": self.channel,
        "blocks": [
            self.COIN_BLOCK,
            *self._flip_coin(),
        ],
    }

این همان داده‌ای است که مستقیماً برای Slack API ارسال خواهد شد.


فایل نهایی coinbot.py

در پایان فایل شما باید چیزی مشابه نمونه زیر باشد.

import random


class CoinBot:

    COIN_BLOCK = {
        "type": "section",
        "text": {
            "type": "mrkdwn",
            "text": (
                "در حال پرتاب سکه...\n\n"
            ),
        },
    }

    def __init__(self, channel):
        self.channel = channel

    def _flip_coin(self):

        rand_int = random.randint(0, 1)

        if rand_int == 0:
            result = "شیر 🦁"
        else:
            result = "خط 🪙"

        text = f"نتیجه پرتاب سکه: **{result}**"

        return {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": text
            }
        },

    def get_message_payload(self):

        return {
            "channel": self.channel,
            "blocks": [
                self.COIN_BLOCK,
                *self._flip_coin(),
            ],
        }

نکته: در این آموزش متن پیام‌های ربات به فارسی تغییر داده شده تا تجربه کاربری بهتری برای کاربران فارسی‌زبان فراهم شود. در صورت نیاز می‌توانید متن‌ها را به زبان دلخواه خود تغییر دهید.


در بخش بعد چه خواهیم کرد؟

در مرحله بعد یک فایل تست ایجاد می‌کنیم تا بدون نیاز به دریافت Event از Slack، عملکرد ربات را بررسی کنیم. سپس با استفاده از Slack Web API اولین پیام آزمایشی را در کانال ارسال خواهیم کرد.


مرحله چهارم — تست عملکرد Slackbot

اکنون که کلاس CoinBot را ایجاد کرده‌ایم، بهتر است قبل از پیاده‌سازی بخش دریافت رویدادها (Events)، مطمئن شویم ربات می‌تواند پیام را به‌درستی تولید کرده و به Slack ارسال کند.

در این مرحله یک اسکریپت آزمایشی می‌نویسیم که مستقیماً با استفاده از Slack Web API یک پیام در کانال ارسال می‌کند.


ساخت فایل تست

ابتدا فایل زیر را ایجاد کنید.

touch coinbot_test.py

سپس آن را با ویرایشگر دلخواه باز کنید.

nano coinbot_test.py

نوشتن کد تست

کد زیر را داخل فایل قرار دهید.

نکته: مقدار #YOUR_CHANNEL را با نام کانالی که ربات را به آن اضافه کرده‌اید جایگزین کنید.

from slack import WebClient
from coinbot import CoinBot
import os

# ایجاد Web Client
slack_web_client = WebClient(
    token=os.environ.get("SLACK_TOKEN")
)

# ساخت شیء CoinBot
coin_bot = CoinBot("#YOUR_CHANNEL")

# تولید پیام
message = coin_bot.get_message_payload()

# ارسال پیام
slack_web_client.chat_postMessage(**message)

سپس فایل را ذخیره و از ویرایشگر خارج شوید.


تنظیم توکن Slack

برای اینکه برنامه بتواند با Slack ارتباط برقرار کند، باید Bot Token را به‌صورت متغیر محیطی تعریف کنید.

توکنی که در مرحله اول از بخش OAuth دریافت کردید را در دستور زیر قرار دهید.

export SLACK_TOKEN="xoxb-your-bot-token"

برای اینکه مطمئن شوید متغیر محیطی ثبت شده است، دستور زیر را اجرا کنید.

echo $SLACK_TOKEN

در صورتی که توکن نمایش داده شد، همه چیز درست است.


اجرای برنامه

ابتدا مطمئن شوید Virtual Environment فعال است.

اگر فعال نیست:

source ~/.venvs/slackbot/bin/activate

سپس برنامه تست را اجرا کنید.

python coinbot_test.py

اگر همه چیز به‌درستی تنظیم شده باشد، برنامه بدون خطا اجرا خواهد شد.


بررسی نتیجه

اکنون وارد Workspace خود در Slack شوید و کانالی که ربات را به آن اضافه کرده‌اید باز کنید.

باید پیامی مشابه تصویر زیر مشاهده کنید.

در حال پرتاب سکه...

نتیجه پرتاب سکه: شیر 🦁

یا

در حال پرتاب سکه...

نتیجه پرتاب سکه: خط 🪙

از آنجایی که نتیجه به‌صورت تصادفی تولید می‌شود، ممکن است هر بار خروجی متفاوتی دریافت کنید.


خطاهای رایج

اگر پیام ارسال نشد، موارد زیر را بررسی کنید.

توکن اشتباه

در صورتی که با خطای زیر مواجه شدید:

invalid_auth

توکن SLACK_TOKEN معتبر نیست یا به‌درستی تنظیم نشده است.


ربات به کانال اضافه نشده است

اگر خطای زیر را مشاهده کردید:

channel_not_found

احتمالاً:

  • ربات هنوز عضو کانال نیست.
  • نام کانال را اشتباه وارد کرده‌اید.

ابتدا ربات را به کانال اضافه کرده و سپس دوباره تست کنید.


مجوز ارسال پیام وجود ندارد

اگر خطایی مشابه زیر مشاهده شد:

missing_scope

یعنی مجوز chat:write برای ربات فعال نشده است.

به تنظیمات برنامه در Slack مراجعه کرده و این Scope را اضافه کنید، سپس برنامه را مجدداً نصب (Reinstall) کنید.


نتیجه این مرحله

در این بخش اطمینان حاصل کردیم که:

  • ارتباط برنامه با Slack برقرار است.
  • کلاس CoinBot به‌درستی Payload تولید می‌کند.
  • پیام از طریق Slack API ارسال می‌شود.
  • تنظیمات اولیه برنامه صحیح هستند.

در بخش بعد چه خواهیم کرد؟

در مرحله پنجم، یک برنامه Flask ایجاد می‌کنیم تا ربات به‌صورت دائمی اجرا شود و بتواند پیام‌های ارسالی در کانال را دریافت کرده و در صورت مشاهده عبارت مشخص‌شده، به‌صورت خودکار نتیجه پرتاب سکه را ارسال کند.


مرحله پنجم — ساخت برنامه Flask برای اجرای دائمی Slackbot

تا اینجای کار توانستیم یک پیام آزمایشی به Slack ارسال کنیم. اما این روش فقط یک بار اجرا می‌شود و پس از پایان برنامه، ربات دیگر فعال نخواهد بود.

برای اینکه ربات همیشه در حال اجرا باشد و بتواند پیام‌های جدید را دریافت کند، از Flask استفاده می‌کنیم.

در این مرحله یک وب‌سرور کوچک ایجاد می‌کنیم که رویدادهای (Events) ارسالی از Slack را دریافت کرده و در صورت مشاهده عبارت مشخص‌شده، نتیجه پرتاب سکه را در همان کانال ارسال می‌کند.


باز کردن پورت 3000

از آنجایی که Slack باید بتواند به برنامه شما متصل شود، لازم است پورت مورد استفاده را در فایروال باز کنید.

sudo ufw allow 3000

سپس وضعیت فایروال را بررسی کنید.

sudo ufw status

نمونه خروجی:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW
3000                       ALLOW

ایجاد فایل برنامه Flask

ابتدا فایل اصلی برنامه را ایجاد کنید.

touch app.py

سپس آن را باز کنید.

nano app.py

وارد کردن کتابخانه‌ها

ابتدای فایل، کتابخانه‌های موردنیاز را اضافه کنید.

import os
import logging

from flask import Flask
from slack import WebClient
from slackeventsapi import SlackEventAdapter

from coinbot import CoinBot

در اینجا:

  • Flask وظیفه اجرای وب‌سرور را برعهده دارد.
  • WebClient برای ارسال پیام به Slack استفاده می‌شود.
  • SlackEventAdapter رویدادهای Slack را دریافت می‌کند.
  • CoinBot همان کلاسی است که در مرحله قبل ایجاد کردیم.

ایجاد برنامه Flask

اکنون برنامه Flask را مقداردهی اولیه کنید.

app = Flask(__name__)

ثبت مسیر دریافت رویدادهای Slack

Slack هنگام وقوع رویدادها (مانند ارسال پیام) درخواست‌هایی به برنامه شما ارسال می‌کند.

برای دریافت این درخواست‌ها، باید یک Endpoint ایجاد کنیم.

slack_events_adapter = SlackEventAdapter(
    os.environ.get("SLACK_EVENTS_TOKEN"),
    "/slack/events",
    app
)

در این بخش از متغیر محیطی SLACK_EVENTS_TOKEN استفاده شده است که در مرحله بعد مقدار آن را تنظیم خواهیم کرد.


ایجاد Web Client

اکنون شیء مربوط به ارتباط با Slack را ایجاد می‌کنیم.

slack_web_client = WebClient(
    token=os.environ.get("SLACK_TOKEN")
)

این شیء برای ارسال پیام‌ها به Workspace استفاده خواهد شد.


ایجاد تابع ارسال پیام

برای اینکه چند بار کد ارسال پیام را تکرار نکنیم، یک تابع مجزا ایجاد می‌کنیم.

def flip_coin(channel):

    # ایجاد نمونه جدید از CoinBot
    coin_bot = CoinBot(channel)

    # تولید Payload
    message = coin_bot.get_message_payload()

    # ارسال پیام
    slack_web_client.chat_postMessage(**message)

این تابع تنها شناسه کانال را دریافت می‌کند و نتیجه پرتاب سکه را در همان کانال ارسال می‌کند.


دریافت پیام‌های Slack

اکنون مهم‌ترین قسمت برنامه را می‌نویسیم.

با استفاده از دکوراتور زیر، هر زمان رویداد جدیدی از نوع message دریافت شود، تابع ما اجرا خواهد شد.

@slack_events_adapter.on("message")
def message(payload):

داخل تابع ابتدا اطلاعات پیام را استخراج می‌کنیم.

event = payload.get("event", {})
text = event.get("text")

بررسی عبارت فعال‌کننده

فرض می‌کنیم هر زمان کاربری جمله زیر را ارسال کند:

Hey Sammy, Flip a coin

ربات باید پاسخ دهد.

کد بررسی به شکل زیر خواهد بود.

if "hey sammy, flip a coin" in text.lower():

    channel_id = event.get("channel")

    return flip_coin(channel_id)

با استفاده از lower() تفاوت حروف بزرگ و کوچک نادیده گرفته می‌شود.


اجرای برنامه Flask

در انتهای فایل، برنامه را اجرا می‌کنیم.

if __name__ == "__main__":

    logger = logging.getLogger()

    logger.setLevel(logging.DEBUG)

    logger.addHandler(logging.StreamHandler())

    app.run(
        host="0.0.0.0",
        port=3000
    )

به این ترتیب برنامه روی تمام Interfaceهای شبکه و پورت 3000 اجرا خواهد شد.


فایل نهایی app.py

در پایان فایل شما باید ساختاری مشابه زیر داشته باشد.

import os
import logging

from flask import Flask
from slack import WebClient
from slackeventsapi import SlackEventAdapter

from coinbot import CoinBot

app = Flask(__name__)

slack_events_adapter = SlackEventAdapter(
    os.environ.get("SLACK_EVENTS_TOKEN"),
    "/slack/events",
    app
)

slack_web_client = WebClient(
    token=os.environ.get("SLACK_TOKEN")
)


def flip_coin(channel):

    coin_bot = CoinBot(channel)

    message = coin_bot.get_message_payload()

    slack_web_client.chat_postMessage(**message)


@slack_events_adapter.on("message")
def message(payload):

    event = payload.get("event", {})

    text = event.get("text")

    if text and "hey sammy, flip a coin" in text.lower():

        channel_id = event.get("channel")

        return flip_coin(channel_id)


if __name__ == "__main__":

    logger = logging.getLogger()

    logger.setLevel(logging.DEBUG)

    logger.addHandler(logging.StreamHandler())

    app.run(host="0.0.0.0", port=3000)

نتیجه این مرحله

در پایان این بخش:

  • یک وب‌سرور Flask ایجاد کردید.
  • مسیر /slack/events برای دریافت رویدادهای Slack آماده شد.
  • ربات می‌تواند پیام‌های کانال را بررسی کند.
  • در صورت مشاهده عبارت مشخص‌شده، نتیجه پرتاب سکه را ارسال خواهد کرد.

در بخش بعد چه خواهیم کرد؟

در مرحله ششم، متغیرهای محیطی موردنیاز مانند SLACK_EVENTS_TOKEN را تنظیم می‌کنیم، برنامه را اجرا خواهیم کرد، تنظیمات Event Subscriptions را در پنل Slack انجام می‌دهیم و در نهایت عملکرد کامل ربات را آزمایش خواهیم کرد.


مرحله ششم — اجرای برنامه و اتصال Slack به ربات

در این مرحله آخر، برنامه را اجرا کرده و Slack را به آن متصل می‌کنیم تا ربات بتواند پیام‌های کانال را دریافت و پردازش کند.

در پایان این مرحله، هر زمان عبارت مشخص‌شده را در کانال ارسال کنید، CoinBot به‌صورت خودکار نتیجه پرتاب سکه را نمایش خواهد داد.


دریافت Signing Secret

برای اینکه Slack بتواند درخواست‌های ارسالی خود را اعتبارسنجی کند، باید Signing Secret برنامه را دریافت کنید.

در پنل توسعه‌دهندگان Slack وارد برنامه‌ای شوید که در مراحل قبل ساختید و از منوی سمت چپ مسیر زیر را باز کنید:

Basic Information

در بخش App Credentials گزینه‌ای با عنوان Signing Secret مشاهده خواهید کرد.

مقدار آن را کپی کنید.


تنظیم متغیر محیطی

اکنون Signing Secret را به‌صورت متغیر محیطی تعریف کنید.

export SLACK_EVENTS_TOKEN="YOUR_SIGNING_SECRET"

همچنین اگر قبلاً متغیر مربوط به Bot Token را تنظیم نکرده‌اید، آن را نیز تعریف کنید.

export SLACK_TOKEN="YOUR_BOT_TOKEN"

برای اطمینان از ثبت متغیرها:

echo $SLACK_EVENTS_TOKEN
echo $SLACK_TOKEN

اجرای برنامه

ابتدا Virtual Environment را فعال کنید.

source ~/.venvs/slackbot/bin/activate

سپس برنامه را اجرا کنید.

python3 app.py

اگر همه چیز درست باشد، خروجی مشابه زیر خواهید دید.

 * Serving Flask app "app"
 * Running on http://0.0.0.0:3000

پیام زیر نیز طبیعی است و صرفاً به این معناست که سرور داخلی Flask برای محیط Production مناسب نیست.

WARNING: This is a development server.
Do not use it in a production deployment.

در بخش پایانی مقاله روش مناسب برای استقرار در محیط عملیاتی را معرفی خواهیم کرد.


بررسی اجرای برنامه

در یک ترمینال جدید وضعیت برنامه را بررسی کنید.

curl http://YOUR_SERVER_IP:3000/slack/events

اگر خروجی زیر را مشاهده کردید، یعنی برنامه به‌درستی اجرا شده است.

These are not the slackbots you're looking for.

فعال کردن Event Subscription

اکنون باید به Slack اعلام کنید که رویدادها را به برنامه شما ارسال کند.

از منوی برنامه وارد بخش زیر شوید.

Event Subscriptions

گزینه Enable Events را فعال کنید.


وارد کردن آدرس برنامه

در قسمت Request URL آدرس زیر را وارد کنید.

http://YOUR_SERVER_IP:3000/slack/events

اگر از دامنه استفاده می‌کنید:

https://bot.example.com/slack/events

پس از چند ثانیه، Slack ارتباط را بررسی می‌کند.

در صورت موفق بودن، کنار آدرس عبارت Verified با رنگ سبز نمایش داده می‌شود.


فعال کردن رویداد پیام‌ها

کمی پایین‌تر، قسمت Subscribe to Bot Events را باز کنید.

روی Add Bot Event کلیک کرده و رویداد زیر را اضافه کنید.

message.channels

این مجوز باعث می‌شود ربات پیام‌های ارسال‌شده در کانال‌هایی که عضو آن‌هاست را دریافت کند.

سپس روی Save Changes کلیک کنید.


نصب مجدد برنامه

بعد از تغییر Permissionها، Slack از شما می‌خواهد برنامه را دوباره نصب کنید.

روی لینک زیر کلیک کنید.

Reinstall your app

سپس در صفحه تأیید، گزینه Allow را انتخاب کنید.


آزمایش ربات

اکنون وارد همان کانالی شوید که ربات را به آن اضافه کرده‌اید.

پیام زیر را ارسال کنید.

Hey Sammy, Flip a coin

چند لحظه بعد، ربات پاسخی مشابه زیر ارسال خواهد کرد.

در حال پرتاب سکه...

نتیجه: شیر 🦁

یا

در حال پرتاب سکه...

نتیجه: خط 🪙

اگر ربات پاسخ نداد

موارد زیر را بررسی کنید.

برنامه در حال اجرا باشد

python3 app.py

متغیرهای محیطی تنظیم شده باشند

echo $SLACK_TOKEN

echo $SLACK_EVENTS_TOKEN

ربات عضو کانال باشد

در Slack دستور زیر را اجرا کنید.

/invite @CoinBot

یا از بخش تنظیمات کانال، ربات را اضافه کنید.


آدرس Request URL معتبر باشد

اگر کنار آدرس، تیک سبز Verified نمایش داده نمی‌شود، معمولاً یکی از موارد زیر رخ داده است:

  • برنامه اجرا نشده است.
  • پورت 3000 بسته است.
  • آدرس IP یا دامنه اشتباه وارد شده است.
  • فایروال اتصال را مسدود کرده است.

اجرای برنامه در محیط Production

سرور داخلی Flask فقط برای توسعه مناسب است.

برای استفاده در محیط واقعی بهتر است برنامه را با یکی از گزینه‌های زیر اجرا کنید.

  • Gunicorn + Nginx (پیشنهادشده)
  • uWSGI + Nginx
  • Docker
  • Kubernetes

اگر قصد دارید ربات را روی Parmin Cloud اجرا کنید، پیشنهاد می‌شود از Gunicorn در کنار Nginx استفاده کنید تا علاوه بر امنیت بیشتر، عملکرد و پایداری بالاتری نیز داشته باشید.


جمع‌بندی

در این آموزش یاد گرفتید که:

  • یک برنامه Slack ایجاد کنید.
  • مجوزهای لازم را برای ربات تعریف کنید.
  • با استفاده از Python و Flask یک Slackbot بسازید.
  • رویدادهای Slack را دریافت کنید.
  • پیام‌های کانال را پردازش کنید.
  • در پاسخ به یک عبارت مشخص، نتیجه پرتاب سکه را به‌صورت خودکار ارسال کنید.

از این نقطه به بعد می‌توانید منطق CoinBot را به هر قابلیتی که نیاز دارید گسترش دهید؛ از ارسال اعلان‌های مانیتورینگ و مدیریت زیرساخت گرفته تا اجرای دستورات خودکار، پاسخ‌گویی به کاربران یا اتصال به سرویس‌های مختلف.

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *