مقدمه
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 میشویم و اولین اپلیکیشن خود را ایجاد میکنیم.
مرحله سوم — ساخت کلاس 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 اولین پیام آزمایشی را در کانال ارسال خواهیم کرد.
نظرات کاربران