08.06.2023

Ubuntu 20.04 üzerinde Python'da bir Slack bot nasıl oluşturulur

Giriş:

Slack - işyerlerinizde üretkenliği artırmak için tasarlanmış kurumsal bir mesajlaşma programıdır. Bununla mesaj alışverişi yapabilecek, genel veya özel sohbetler oluşturabilecek, aramalar (sesli veya görüntülü aramalar) yapabilecek ve farklı Slackbot'larla entegre olabileceksiniz. Slackbot, kullanıcılarla konuşmalar yoluyla etkileşim kurmak için tasarlanmış bir uygulamadır. Uyarılar ve mesajlar göndermek, herhangi bir görevi başlatmak gibi birçok işlevi ve seçeneği vardır.

Eğitimimizde Slackbot'u dağıtmak için Python ve Ubuntu 20.04 kullanacağız.
Slack, Python'un Uygulama Programlama Arayüzü (API) ve entegrasyonları ile etkileşim kurmanıza yardımcı olmak için kendi cephaneliğinde birçok araca sahiptir.

Python ve Slack API'sinin yeteneklerini test etmek için, sohbeti izleyecek ve tetiklendiğinde yazı tura atacak bir CoinBot başlatılacak. Sonuçta botunuzu daha pratik amaçlar ve kendi fikirleriniz için yükseltebilirsiniz.

Blot: Öğreticimizde Python.3 kullanıyoruz, bu da daha önce yayınlanan sürümleri kullanacaksanız, botun çalışamayacağı anlamına geliyor.

Hazırlık:

Bu unsurlara sahipseniz her şey işe yarayacaktır:

  1. Bilgisayarınızda Slack ve çalışacağınız Workplace (çalışma alanı). Eğer yoksa, resmi Slack web sitesinde bir tane oluşturmalısınız;
  2. Genel IP adresine sahip sanal makine veya PC.

Slackbot'u başlatma

Öncelikle Slack API Kontrol Panelinde (SCPAPI) Slack uygulamamızı başlatalım. İşyerinizin menüsüne girin ve ardından SCPAPI'ye gidin.
Ardından ekran görüntümüzdeki gibi "Create an App" menüsüne tıklayalım:

Bundan sonra uygulamanıza bir isim vermeniz gerekecektir. Adımız "CoinBot" olacak, ancak adınız size kalmış. Bundan sonra, uygulamanın yükleneceği sizin için daha uygun olan bir Çalışma Alanı seçin.

Daha sonra, uygulamanız çalışmaya hazır olacaktır. Kontrol paneline gidebilirsiniz.

Bu panelden uygulamanızı özelleştirebilirsiniz: yeni izinler yükleyebilir, bildirimleri herhangi bir etkinliğe bağlayabilir, uygulamanızı herhangi bir İşyerine yükleyebilir ve daha pek çok şey yapabilirsiniz.

Şimdi, uygulamamızın sohbetlerimizde mesaj gönderme erişimine sahip olmasını istiyorsak, uygulamamıza özel haklar vermemiz gerekir.

Bu izne sahip olmak için: ekran görüntümüzde olduğu gibi "Permissions" içerik menüsüne tıklamamız gerekir:

Bundan sonra, "OAuth & Permissions" menüsünde olacaksınız. "Scope" altına inmeniz gerekiyor. Orada "Bot Token Scopes" seçmelisiniz. Bu menüde, "Add on OAuth Scope" menüsüne basın:

Bir sonraki adım olarak, chat:write iznini eklememiz gerekiyor. Özel masada arama yapabilirsiniz.

Bundan sonra uygulamanız sohbetlerde yazma iznine sahip olacaktır.

Daha sonra, bu hakkı ekledikten sonra, uygulamanızı Çalışma Alanınıza tekrar eklemelisiniz.
Bu sayfada biraz daha aşağıya "Oauth Tokens for Your Workspace" gidin ve "Install to Workspace" düğmesine tıklayın:

Eylemlerimizden sonra Slack, bu uygulama için mevcut olan izinleri atmanızı isteyecektir. Eğer her şey size uygunsa, "Allow" butonuna tıklayın:

Botumuz kullanıma hazır olduğundan, Slack size kullanıcı belirtecinizi sağlayacak ve bu belirteci Çalışma Alanınıza erişmek için kullanacaksınız:

Yine bu menüde, botunuzda bazı hatalar varsa kullanabileceğiniz bir "Reinstall to Workspace" düğmesi vardır, bu düğmeye tıkladıktan sonra yeniden yüklenecektir.
Yapmamız gereken son şey sohbet robotumuzu çalışma alanınıza eklemek. Zaten oluşturulmuş bir kanalınız varsa, "Kanalınıza bir bot ekleme" adımına geçebilirsiniz.

Sohbetleriniz henüz başlatılmadıysa, aşağıdaki birkaç adımı izleyin:

  1. "Add channel" içerik menüsünü bulun ve içindeki "Create a new channel" düğmesini seçin:
  2. Ardından, kanalınız için bir ad seçin ve isteğe bağlı olarak açıklama çubuğunu doldurun.

Kanalınıza bir bot ekleme

Sohbetinize bot eklemek istiyorsanız, imlecinizi sohbetin adına getirmeli ve "View channel details" içerik menüsüne tıklamalısınız:

Ardından "Integration" menüsüne geçin ve "Add Application" düğmesine tıklayın:

Ardından uygulamanızı adına göre arayın veya bulmak için aşağı kaydırın. Bizim durumumuzda "CoinBot":

Tüm işlemlerimizden sonra, bot sohbetimizde başlatılacaktır:

Python kurulumu

Slack botlarımızı kurabilmemiz ve yönetebilmemiz için Python'u kurmamız gerekiyor.
İlk olarak, python v.3'ü ve ilgili araç yardımcılarını yükleyelim. Bunu, üzerinde Ubuntu v.20.04 kurulu olan sanal makinemize yapacağız.
Başlangıçta, Python v.3 zaten 20.04 sürümlü tüm Ubuntu sunucularında önceden yüklenmiştir, ancak tüm güncellemelere sahip olduğumuzdan emin olmak için, aşağıdaki komutları kullanarak sistemimizdeki tüm önceki güncellemeleri indirmeliyiz:

sudo apt update
sudo apt -y upgrade

After that, we can see wich version we have :

python3 -V

The answer will look something like this:

Python 3.8.2

Daha sonra, paket yönetimine erişmemizi sağlayacak olan pip aracını indirmeliyiz:

sudo apt install -y python3-pip

Bundan sonra sanal ortamı dağıtacağız:

python3 -m venv ~/.venvs/slackbot

Bundan sonra onu etkinleştirmemiz gerekiyor:

source ~/.venvs/slackbot/bin/activate

Şimdi parantez içindeki terminalimiz sanal ortamımızı gösterecek, buna benzer bir şey olmalı:

(slackbot) root@Ubuntu-Bot-Python:~#

Daha sonra, pip aracı ile bazı önemli Python bileşenlerini kuracağız:

pip install slackclient slackeventsapi Flask

Açıklama: slackclient ve slackeventsapi - Slack API kullanımını kolaylaştıran araçlar. Flask - botumuzu dağıtmak için kullanılacak mikro web çerçevesi.

Python'u kurduktan sonra botumuzu kurabiliriz.

Python'da Slackbot mesajları için bir sınıf oluşturma

Slack mesaj göndermek için özel olarak biçimlendirilmiş JSON verileri kullanıyor.
Yazı tura atmayı simüle eden bir Python sınıfı başlatalım.
Hatırlatma - tüm eylemleri sanal bir ortamda yapıyoruz. Bizim durumumuzda, sanal ortam root@Ubuntu-Bot-Python:~#
İlk olarak, touch komutunu kullanarak coinbot.py adında bir dosya oluşturun:

touch coinbot.py

Daha sonra bu dosyayı nano editörü ile açın, başka bir editör kullanabilirsiniz:

nanocoinbot.py

Aşağıdaki içeriği dosyamıza ekleyin:

# import the random library to help us generate the random numbers
import random

# Create the CoinBot Class
class CoinBot:
# Create a constant that contains the default text for the message
COIN_BLOCK = {
"type": "section",
"text": {
"type": "mrkdwn",
"text": (
"Ok! Flipping a coin....\n\n"
),
},
}
&  # The constructor for the class. It takes the channel name as the a
# parameter and then sets it as an instance variable
def __init__(self, channel):
self.channel = channel
# Generate a random number to simulate flipping a coin. Then return the
# crafted slack payload with the coin flip message.
def _flip_coin(self):
rand_int = random.randint(0,1)
if rand_int == 0:
results = "Heads"
else:
results = "Tails"
text = f"The result is {results}"
return {"type": "section", "text": {"type": "mrkdwn", "text": text}},
# Craft and return the entire message payload as a dictionary.
def get_message_payload(self):
return {
"channel": self.channel,
"blocks": [
self.COIN_BLOCK,
*self._flip_coin(),
],
}

Ardından dosyamızı bir klavye kısayoluyla kaydedip kapatalım.
Artık botumuz mesaj gönderebilir ve siz de onu çalışma alanınıza ekleyebilirsiniz.

Slackbot'umuzdan gelen mesajları test edin

Şimdi sınıfımızın doğru yükü oluşturup oluşturmadığını kontrol edelim.
coinbot_test.py adında bir dosya oluşturun:

nano coinbot_test.py

Ardından oluşturulan dosyaya aşağıdaki içeriği ekleyin
Önemli: coin_bot = coinbot("#YOUR_CHANNEL_HERE") içinde sunucu adını kendi adınızla değiştirdiğinizden emin olun.

from slack import WebClient
from coinbot import CoinBot
import os

# Slack istemcisi oluşturma
slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))

# Yeni bir CoinBot edinin
coin_bot = CoinBot("#YOUR_CHANNEL_HERE")

# İlk katılım mesajı yükünü alın
message = coin_bot.get_message_payload()

# İlk katılım mesajını Slack'te yayınlayın
slack_web_client.chat_postMessage(**message)

Bu dosyayı kaydedin ve kapatın.
Testi çalıştırmadan önce, Slak API'sinde listelenen token'ınızı dışa aktarmanız gerekir:

Şimdi tokenınızı dışa aktarın:

export SLACK_TOKEN="Your token"

Şimdi botumuzu test edebiliriz. Aşağıdaki betiği terminalinizde çalıştırın:

python coinbot_test.py

Bundan sonra, uygulamanızı yüklediğiniz kanalda size yazı tura hakkında bir mesaj gönderilecektir. Botunuzun gerçekten yazı ya da tura attığından emin olun.

Slackbot'u çalıştırmak için bir Flask uygulaması oluşturma

Artık botunuz yazı tura atabildiğine, mesaj oluşturabildiğine ve gönderebildiğine göre, mesajları işleyecek ve içerikleri bazı kriterlere uyuyorsa onlara bir tür tepki verecek olan Flask'ı dağıtacağız.

İlk olarak, 3000 numaralı bağlantı noktasındaki trafiğe izin vermek için güvenlik duvarı ayarlarını yapılandıralım:

sudo ufw allow 3000

Şimdi ufw'nin durumunu kontrol edin:

sudo ufw status

Buna benzer bir çıktı görmelisiniz:

Output
status: active

To Action From
--    ------    ----
OpenSSH    ALLOW    Anywhere
3000    ALLOW    Anywhere
OpenSSH (v6)    ALLOW    Anywhere (v6)
3000 (v6)    ALLOW    Anywhere (v6)

Daha sonra Flask uygulamamız için bir dosya oluşturacağız.
Bu dosyaya app.py adını verelim:

touch app.py

Ardından, bu dosyayı herhangi bir editörle açın. Biz nano kullanacağız:

nano app.py

Aşağıdaki içeriği app.py dosyamıza ekleyelim:

import os
import logging
from flask import Flask
from slack import WebClient
from slackeventsapi import SlackEventAdapter
from coinbot import CoinBot

# Olay bağdaştırıcısını barındırmak için bir Flask uygulamasını
# başlatma
app = Flask(__name__)
# Bir olay bağdaştırıcısı oluşturun ve olay enjeksiyonu için slack
# uygulamasındaki bir uç noktaya kaydedin.
slack_events_adapter = SlackEventAdapter(os.environ.get("SLACK_EVENTS_TOKEN"), "/slack/events", app)

# Web API istemcisini başlatma
slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))

def flip_coin(channel):
"""CoinBot'u oluşturun, yazı tura atın ve mesajı kanala gönderin
"""
# Yeni bir CoinBot oluşturun
coin_bot = CoinBot(channel)

# İlk katılım mesajı yükünü alın
message = coin_bot.get_message_payload()

# İlk katılım mesajını Slack'te yayınlayın
slack_web_client.chat_postMessage(**message)

# Olay bağdaştırıcısı tarafından bir 'mesaj' olayı algılandığında, bu
# yükü iletin bu işleve.
@slack_events_adapter.on("message")
def message(payload):
"""Mesaj olayını ayrıştırır ve etkinleştirme dizesi metnin içindeyse,
Yazı tura simülasyonu yapın ve sonucu gönderin.
"""

# Olay verilerini yükten alın
event = payload.get("event", {})

# Gelen etkinlikten metni alın
text = event.get("text")

# Etkinleştirme ifadesinin mesaj metninde olup olmadığını kontrol edin.
# Eğer öyleyse, yazı tura atmak için kodu çalıştırın.
if "hey sammy, flip a coin" in text.lower():
# Etkinleştirme ifadesi karşılandığından, olayın gerçekleştirildiği kanal
# kimliğini alın

channel_id = event.get("channel")

# flip_coin fonksiyonunu çalıştırın ve yazı tura sonuçlarını kanala
# gönderin

return flip_coin(channel_id)

if __name__ == "__main__":
# Günlük nesnesini oluşturun
logger = logging.getLogger()

# Günlük seviyesini DEBUG olarak ayarlayın. Bu, günlük mesajlarının ayrıntı
# düzeyini artıracaktır
logger.setLevel(logging.DEBUG)

# StreamHandler'ı günlük işleyicisi olarak ekleyin
logger.addHandler(logging.StreamHandler())

# Uygulamamızı, geliştirme için geleneksel olan localhost'ta
# çalıştırmak yerine 3000 numaralı bağlantı noktasında harici olarak
# bakan IP adresimizde çalıştırın.
app.run(host='0.0.0.0', port=3000)

Dosyayı kaydedin ve kapatın.
Açıklama: Aşağıdaki ifadeleri ekliyoruz çünkü:

import os - ortam değişkenlerine erişmek için kullanacağız
import logging - uygulama olaylarını günlüğe kaydetmek için kullanacağız.
from flask import Flask - bir Flask uygulaması oluşturmak için kullanacağız
from slack import WebClient - Slack üzerinden mesaj göndermek için kullanacağız
from slackeventsapi import SlackEventAdapter - Slack'ten olay almak ve bunları işlemek için kullanacağız
from coinbot import CoinBot - CoinBot'unuzu örneklemek ve mesaj yükünü oluşturmak için kullanacağız.

Flask uygulamanızı başlatma

Sonuçta Flask uygulamamız çalışmaya hazır, hadi test edelim.
İlk olarak Slackbot uygulamamızı ekleyelim.
Slack API sayfasında, "Basik information" bölümüne gidin ve "Uygulama Kimlik Bilgileri" alt bölümüne ilerleyin:

Ekran görüntüsünde gösterildiği gibi "Show" üzerine tıklayın ve ardından İmzalama sırrını kopyalayın.

Şimdi bu komutla imza sırrımızı dışa aktarıyoruz:

export SLACK_EVENTS_TOKEN="MY_SIGNING_SECRET_TOKEN"

Şimdi uygulamamızı test edebiliriz.
Bu kodu kullanarak Flask uygulamasını başlatın:

python3 app.py

Çıktı örneği:

(slackbot) [19:37:05] danial:CoinBot$ python app.py
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:3000/ (Press CTRL+C to quit)

Şimdi Slack kullanıcı arayüzünde uygulamamızı kurmayı bitirelim.
İlk olarak, uygulamamıza sohbetteki etkinlikleri okuma, işleme ve bunlara yanıt verme hakkı sağlayacağız.

Kullanıcı arayüzü menüsünde, "Event Subscriptions" bölümünü seçin ve ekran görüntüsünde gösterildiği gibi "Enable Events" geçiş anahtarını "On" konuma getirin:

Ardından, "Subscribe to bot events" menüsünü açın ve message.channels: öğesini seçin

Eylemlerimizden sonra, futere'deki uygulamanız mesajları işleme fırsatına sahip olacaktır.
Değişiklikleri kaydettiğinizde, ekranın üst kısmında, aşağıdaki değişiklikleri uygulamak için uygulamayı yeniden yüklemeniz gerektiğini bildiren sarı bir içerik menüsüne sahip olacaksınız.
Uygulamayı yeniden yüklemek için bu başlıktaki eski haline getirme bağlantısına tıklayın:

Daha sonra yeni izinlerin uygulandığı bir içerik menüsüne sahip olacaksınız. Her şeyi kabul ediyorsanız, "Allow" seçeneğine tıklayın:

Sonuçta, botumuz hazır olacak. Sohbetinize gidin ve "Hey Danny, flip a coin" ifadesini içeren bir mesaj gönderin.
Şansınızı kontrol edecek ve sonucu size gösterecek. Tebrikler, botumuzu başlattık!