{"id":40890,"date":"2026-03-02T03:40:47","date_gmt":"2026-03-02T00:40:47","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=40890"},"modified":"2026-03-02T03:40:47","modified_gmt":"2026-03-02T00:40:47","slug":"python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/","title":{"rendered":"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Slack, modern ekiplerin vazge\u00e7ilmez ileti\u015fim platformlar\u0131ndan biri haline geldi. \u0130\u015f ak\u0131\u015flar\u0131n\u0131 otomatikle\u015ftirmek, bildirimleri y\u00f6netmek ve ekip \u00fcyeleri aras\u0131nda etkile\u015fimi art\u0131rmak i\u00e7in Slack botlar\u0131 g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Bu makalede, Ubuntu 20.04 i\u015fletim sistemi \u00fczerinde Python kullanarak ad\u0131m ad\u0131m nas\u0131l bir Slack botu geli\u015ftirece\u011finizi \u00f6\u011freneceksiniz. Kendi botunuzu olu\u015fturmaktan, Slack API ile entegre etmeye ve hatta basit bir da\u011f\u0131t\u0131m senaryosuna kadar her \u015feyi kapsayaca\u011f\u0131z.<\/p>\n<h3>Giri\u015f: Slack Botlar\u0131 ve \u00d6nemi<\/h3>\n<p>Slack botlar\u0131, belirli komutlara yan\u0131t veren, olaylar\u0131 dinleyen ve kullan\u0131c\u0131larla etkile\u015fime giren otomatikle\u015ftirilmi\u015f programlard\u0131r. Bir bot, bir sunucunun durumunu bildirebilir, bir g\u00f6revi hat\u0131rlatabilir, d\u0131\u015f bir API&#8217;den bilgi \u00e7ekebilir veya sadece e\u011flenceli yan\u0131tlar verebilir. Python, okunabilirli\u011fi, geni\u015f k\u00fct\u00fcphane deste\u011fi ve g\u00fc\u00e7l\u00fc toplulu\u011fu sayesinde bot geli\u015ftirme i\u00e7in m\u00fckemmel bir se\u00e7imdir. Ubuntu 20.04 ise kararl\u0131l\u0131\u011f\u0131 ve geli\u015ftirici dostu ortam\u0131yla bu t\u00fcr projeler i\u00e7in ideal bir temel sunar.<\/p>\n<p>Bu rehber, temel Python bilgisine ve Linux komut sat\u0131r\u0131 kullan\u0131m\u0131na a\u015fina olan herkes i\u00e7in uygundur. Ad\u0131mlar\u0131 takip ederek, kendi \u00f6zelle\u015ftirilmi\u015f Slack botunuzu olu\u015fturma yetene\u011fine sahip olacaks\u0131n\u0131z.<\/p>\n<h3>Gereksinimler ve Ortam Kurulumu (Ubuntu 20.04)<\/h3>\n<p>Bot geli\u015ftirme s\u00fcrecine ba\u015flamadan \u00f6nce, Ubuntu 20.04 sisteminizin gerekli ara\u00e7lara sahip oldu\u011fundan emin olmal\u0131y\u0131z.<\/p>\n<h4>Python ve PIP Kurulumu<\/h4>\n<p>Ubuntu 20.04, genellikle varsay\u0131lan olarak Python 3 ile birlikte gelir. Ancak, en g\u00fcncel s\u00fcr\u00fcm\u00fcn kurulu oldu\u011fundan ve <code>pip<\/code> (Python paket y\u00f6neticisi) arac\u0131n\u0131n mevcut oldu\u011fundan emin olal\u0131m.<\/p>\n<p>1.  <strong>Sistem Paketlerini G\u00fcncelleyin:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt update\n    sudo apt upgrade -y<\/code><\/pre>\n<p>2.  <strong>Python 3 ve PIP&#8217;i Kurun (Zaten Kurulu De\u011filse):<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt install python3 python3-pip -y<\/code><\/pre>\n<p>3.  <strong>Kurulumu Do\u011frulay\u0131n:<\/strong><\/p>\n<pre><code class=\"language-bash\">python3 --version\n    pip3 --version<\/code><\/pre>\n<p>    \u00c7\u0131kt\u0131da Python 3.8.x veya daha yeni bir s\u00fcr\u00fcm\u00fcn\u00fc ve pip s\u00fcr\u00fcm\u00fcn\u00fc g\u00f6rmelisiniz.<\/p>\n<h4>Sanal Ortam Olu\u015fturma<\/h4>\n<p>Python projelerinde sanal ortamlar kullanmak iyi bir pratiktir. Bu, projenizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 sistem genelindeki Python kurulumundan izole etmenizi sa\u011flar, b\u00f6ylece farkl\u0131 projeler aras\u0131nda ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nlersiniz.<\/p>\n<p>1.  <strong>Proje Dizini Olu\u015fturun ve \u0130\u00e7ine Girin:<\/strong><\/p>\n<pre><code class=\"language-bash\">mkdir my_slack_bot\n    cd my_slack_bot<\/code><\/pre>\n<p>2.  <strong>Sanal Ortam Olu\u015fturun:<\/strong><\/p>\n<pre><code class=\"language-bash\">python3 -m venv venv<\/code><\/pre>\n<p>    Bu komut, <code>my_slack_bot<\/code> dizini i\u00e7inde <code>venv<\/code> ad\u0131nda bir sanal ortam olu\u015fturacakt\u0131r.<\/p>\n<p>3.  <strong>Sanal Ortam\u0131 Etkinle\u015ftirin:<\/strong><\/p>\n<pre><code class=\"language-bash\">source venv\/bin\/activate<\/code><\/pre>\n<p>    Komut isteminiz \u015fimdi <code>(venv)<\/code> ile ba\u015flayarak sanal ortam\u0131n etkin oldu\u011funu g\u00f6sterecektir.<\/p>\n<p>4.  <strong>Sanal Ortamdan \u00c7\u0131k\u0131\u015f Yapma (Daha Sonra \u0130htiyac\u0131n\u0131z Olursa):<\/strong><\/p>\n<pre><code class=\"language-bash\">deactivate<\/code><\/pre>\n<h4>Gerekli Python K\u00fct\u00fcphaneleri<\/h4>\n<p>Sanal ortam\u0131n\u0131z etkinle\u015ftirildikten sonra, Slack API ile etkile\u015fim kurmak ve web isteklerini y\u00f6netmek i\u00e7in gerekli k\u00fct\u00fcphaneleri y\u00fckleyelim.<\/p>\n<p>1.  <strong>K\u00fct\u00fcphaneleri Y\u00fckleyin:<\/strong><\/p>\n<pre><code class=\"language-bash\">pip install slack_sdk flask python-dotenv<\/code><\/pre>\n<p>    *   <code>slack_sdk<\/code>: Slack API ile kolayca etkile\u015fim kurmak i\u00e7in Slack&#8217;in resmi Python SDK&#8217;s\u0131.<br \/>\n    *   <code>flask<\/code>: Slack&#8217;ten gelen HTTP isteklerini (olaylar, komutlar) i\u015flemek i\u00e7in hafif bir web \u00e7er\u00e7evesi.<br \/>\n    *   <code>python-dotenv<\/code>: Ortam de\u011fi\u015fkenlerini <code>.env<\/code> dosyas\u0131ndan y\u00fcklemek i\u00e7in, hassas bilgileri (API anahtarlar\u0131) koddan ayr\u0131 tutar.<\/p>\n<p>2.  <strong><code>requirements.txt<\/code> Dosyas\u0131 Olu\u015fturun:<\/strong><br \/>\n    Projenizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kaydetmek i\u00e7in <code>requirements.txt<\/code> dosyas\u0131 olu\u015fturmak \u00f6nemlidir.<\/p>\n<pre><code class=\"language-bash\">pip freeze > requirements.txt<\/code><\/pre>\n<p>    Bu dosya, projenizi ba\u015fka bir ortama ta\u015f\u0131d\u0131\u011f\u0131n\u0131zda t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 kolayca yeniden y\u00fcklemenizi sa\u011flar (<code>pip install -r requirements.txt<\/code>).<\/p>\n<h3>Slack Uygulamas\u0131 Olu\u015fturma ve API Kimlik Bilgileri Alma<\/h3>\n<p>Botunuzun Slack ile etkile\u015fim kurabilmesi i\u00e7in \u00f6ncelikle Slack platformunda bir uygulama olu\u015fturman\u0131z ve gerekli API kimlik bilgilerini alman\u0131z gerekir.<\/p>\n<h4>Slack API Web Sitesine Eri\u015fim<\/h4>\n<p>1.  Bir web taray\u0131c\u0131s\u0131nda <code>api.slack.com\/apps<\/code> adresine gidin.<br \/>\n2.  Slack \u00e7al\u0131\u015fma alan\u0131n\u0131zda oturum a\u00e7\u0131n.<br \/>\n3.  &#8220;Create New App&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n4.  &#8220;From scratch&#8221; se\u00e7ene\u011fini se\u00e7in.<\/p>\n<h4>Uygulama Bilgilerini Yap\u0131land\u0131rma<\/h4>\n<p>1.  <strong>Uygulama Ad\u0131 ve \u00c7al\u0131\u015fma Alan\u0131:<\/strong><br \/>\n    *   &#8220;App Name&#8221; alan\u0131na botunuz i\u00e7in benzersiz bir ad girin (\u00f6rn. &#8220;MyPythonBot&#8221;).<br \/>\n    *   Botunuzu geli\u015ftirece\u011finiz Slack \u00e7al\u0131\u015fma alan\u0131n\u0131 se\u00e7in.<br \/>\n    *   &#8220;Create App&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<\/p>\n<p>2.  <strong>OAuth &#038; Permissions (Yetkilendirme ve \u0130zinler):<\/strong><br \/>\n    Uygulama olu\u015fturulduktan sonra, sol men\u00fcden &#8220;OAuth &#038; Permissions&#8221; se\u00e7ene\u011fine gidin.<\/p>\n<p>    *   <strong>Bot Token Scopes:<\/strong> Bu, botunuzun Slack&#8217;te yapabilece\u011fi eylemleri tan\u0131mlar. &#8220;Add an OAuth Scope&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n ve a\u015fa\u011f\u0131daki izinleri ekleyin:<br \/>\n        *   <code>chat:write<\/code>: Botunuzun kanallara ve do\u011frudan mesajlara mesaj g\u00f6ndermesine izin verir.<br \/>\n        *   <code>app_mentions:read<\/code>: Botunuzun kendisinden bahsedildi\u011finde olaylar\u0131 almas\u0131na izin verir.<br \/>\n        *   <code>commands<\/code>: Slash komutlar\u0131n\u0131 kullanmak i\u00e7in gereklidir.<br \/>\n        *   <code>im:read<\/code>: Do\u011frudan mesajlar\u0131 okumak i\u00e7in (iste\u011fe ba\u011fl\u0131).<br \/>\n    *   <strong>Install to Workspace:<\/strong> \u0130zinleri ekledikten sonra, sayfan\u0131n \u00fcst k\u0131sm\u0131ndaki &#8220;Install to Workspace&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n. Onay ekran\u0131nda &#8220;Allow&#8221; se\u00e7ene\u011fini se\u00e7in.<br \/>\n    *   <strong>Bot User OAuth Token:<\/strong> Kurulum tamamland\u0131\u011f\u0131nda, <code>xoxb-<\/code> ile ba\u015flayan bir &#8220;Bot User OAuth Token&#8221; g\u00f6receksiniz. Bu token, botunuzun Slack API&#8217;ye yetkili istekler g\u00f6ndermesi i\u00e7in gereklidir. Bu tokeni <strong>g\u00fcvenli bir yerde saklay\u0131n<\/strong> ve kimseyle payla\u015fmay\u0131n.<\/p>\n<p>3.  <strong>Basic Information (Temel Bilgiler):<\/strong><br \/>\n    Sol men\u00fcden &#8220;Basic Information&#8221; se\u00e7ene\u011fine geri d\u00f6n\u00fcn.<\/p>\n<p>    *   <strong>Signing Secret:<\/strong> Sayfan\u0131n &#8220;App Credentials&#8221; b\u00f6l\u00fcm\u00fcnde <code>Signing Secret<\/code> adl\u0131 bir de\u011fer bulacaks\u0131n\u0131z. Bu secret, Slack&#8217;ten gelen isteklerin ger\u00e7ekten Slack taraf\u0131ndan g\u00f6nderildi\u011fini do\u011frulamak i\u00e7in kullan\u0131l\u0131r. Bu de\u011feri de <strong>g\u00fcvenli bir yerde saklay\u0131n<\/strong>.<\/p>\n<h4>Olay Abonelikleri (Event Subscriptions) ve \u0130nteraktivite<\/h4>\n<p>Botunuzun Slack&#8217;teki belirli olaylara (\u00f6rne\u011fin, birisi bottan bahsetti\u011finde veya bir slash komutu kulland\u0131\u011f\u0131nda) yan\u0131t verebilmesi i\u00e7in bu \u00f6zellikleri etkinle\u015ftirmelisiniz.<\/p>\n<p>1.  <strong>Event Subscriptions:<\/strong><br \/>\n    *   Sol men\u00fcden &#8220;Event Subscriptions&#8221; se\u00e7ene\u011fine gidin.<br \/>\n    *   &#8220;Enable Events&#8221; d\u00fc\u011fmesini a\u00e7\u0131n.<br \/>\n    *   <strong>Request URL:<\/strong> Bu, botunuzun olaylar\u0131 dinleyece\u011fi herkese a\u00e7\u0131k bir URL olmal\u0131d\u0131r. Geli\u015ftirme a\u015famas\u0131nda bu URL&#8217;yi daha sonra Ngrok kullanarak sa\u011flayaca\u011f\u0131z. \u015eimdilik bo\u015f b\u0131rakabilirsiniz, ancak bu URL&#8217;nin <code>https:\/\/your-ngrok-url\/slack\/events<\/code> gibi bir \u015fey olaca\u011f\u0131n\u0131 unutmay\u0131n.<br \/>\n    *   <strong>Subscribe to Bot Events:<\/strong> A\u015fa\u011f\u0131 kayd\u0131r\u0131n ve &#8220;Add Bot User Event&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n. Botunuzun dinlemesini istedi\u011finiz olaylar\u0131 ekleyin:<br \/>\n        *   <code>app_mention<\/code>: Birisi botunuzdan bahsetti\u011finde tetiklenir (\u00f6rn. <code>@MyPythonBot merhaba<\/code>).<br \/>\n        *   <code>message.channels<\/code>: Botunuzun herkese a\u00e7\u0131k kanallardaki t\u00fcm mesajlar\u0131 dinlemesini sa\u011flar (dikkatli kullan\u0131n, \u00e7ok fazla olay olu\u015fturabilir).<\/p>\n<p>2.  <strong>Interactivity &#038; Shortcuts:<\/strong><br \/>\n    *   Sol men\u00fcden &#8220;Interactivity &#038; Shortcuts&#8221; se\u00e7ene\u011fine gidin.<br \/>\n    *   &#8220;Interactivity&#8221; \u00f6zelli\u011fini etkinle\u015ftirin.<br \/>\n    *   <strong>Request URL:<\/strong> Buraya da Event Subscriptions i\u00e7in kulland\u0131\u011f\u0131n\u0131z URL&#8217;nin ayn\u0131s\u0131n\u0131 gireceksiniz (<code>https:\/\/your-ngrok-url\/slack\/events<\/code>).<\/p>\n<p>3.  <strong>Slash Commands (\u0130ste\u011fe Ba\u011fl\u0131):<\/strong><br \/>\n    *   Sol men\u00fcden &#8220;Slash Commands&#8221; se\u00e7ene\u011fine gidin.<br \/>\n    *   &#8220;Create New Command&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n    *   <strong>Command:<\/strong> <code>\/hello<\/code> gibi bir komut ad\u0131 girin.<br \/>\n    *   <strong>Request URL:<\/strong> Yine ayn\u0131 herkese a\u00e7\u0131k URL (<code>https:\/\/your-ngrok-url\/slack\/commands<\/code>).<br \/>\n    *   <strong>Short Description:<\/strong> Komutun k\u0131sa bir a\u00e7\u0131klamas\u0131n\u0131 girin (\u00f6rn. &#8220;Bot&#8217;tan merhaba mesaj\u0131 al\u0131r.&#8221;).<br \/>\n    *   <strong>Usage Hint:<\/strong> Kullan\u0131m ipucu (iste\u011fe ba\u011fl\u0131).<br \/>\n    *   &#8220;Save&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<\/p>\n<p>T\u00fcm bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, botunuzun Slack ile ileti\u015fim kurmas\u0131 i\u00e7in gerekli t\u00fcm kimlik bilgilerine ve yap\u0131land\u0131rmalara sahip olacaks\u0131n\u0131z.<\/p>\n<h3>Bot Mimarisi ve Temel Kodlama<\/h3>\n<p>\u015eimdi s\u0131ra geldi botumuzun kalbini, yani Python kodunu yazmaya. Flask ile basit bir web sunucusu olu\u015fturacak ve <code>slack_sdk<\/code> kullanarak Slack olaylar\u0131n\u0131 i\u015fleyece\u011fiz.<\/p>\n<h4>Proje Yap\u0131s\u0131<\/h4>\n<p><code>my_slack_bot<\/code> dizini i\u00e7inde a\u015fa\u011f\u0131daki gibi bir yap\u0131 olu\u015fturaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-\">my_slack_bot\/\n\u251c\u2500\u2500 .env\n\u251c\u2500\u2500 app.py\n\u2514\u2500\u2500 requirements.txt<\/code><\/pre>\n<p>1.  <strong><code>.env<\/code> Dosyas\u0131 Olu\u015fturun:<\/strong><br \/>\n    Proje k\u00f6k dizininizde (<code>my_slack_bot\/<\/code>) <code>.env<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine daha \u00f6nce ald\u0131\u011f\u0131n\u0131z Slack kimlik bilgilerini ekleyin:<\/p>\n<pre><code class=\"language-ini\"># .env\n    SLACK_BOT_TOKEN=xoxb-YOUR_BOT_TOKEN_HERE\n    SLACK_SIGNING_SECRET=YOUR_SIGNING_SECRET_HERE<\/code><\/pre>\n<p>    <code>YOUR_BOT_TOKEN_HERE<\/code> ve <code>YOUR_SIGNING_SECRET_HERE<\/code> k\u0131s\u0131mlar\u0131n\u0131 kendi de\u011ferlerinizle de\u011fi\u015ftirin.<\/p>\n<p>2.  <strong><code>app.py<\/code> Dosyas\u0131 Olu\u015fturun:<\/strong><br \/>\n    Bu, botunuzun ana mant\u0131\u011f\u0131n\u0131 i\u00e7erecek olan Python dosyas\u0131d\u0131r.<\/p>\n<pre><code class=\"language-python\"># app.py\n    import os\n    from dotenv import load_dotenv\n    from flask import Flask, request, jsonify\n    from slack_sdk import WebClient\n    from slack_sdk.signature import SignatureVerifier\n    from slack_sdk.errors import SlackApiError\n\n    # .env dosyas\u0131ndan ortam de\u011fi\u015fkenlerini y\u00fckle\n    load_dotenv()\n\n    # Ortam de\u011fi\u015fkenlerini al\n    SLACK_BOT_TOKEN = os.environ.get(\"SLACK_BOT_TOKEN\")\n    SLACK_SIGNING_SECRET = os.environ.get(\"SLACK_SIGNING_SECRET\")\n\n    # Flask uygulamas\u0131n\u0131 ba\u015flat\n    app = Flask(__name__)\n\n    # Slack WebClient'\u0131 ba\u015flat\n    # Bu istemci, botunuzun Slack API'ye istek g\u00f6ndermesini sa\u011flar (mesaj g\u00f6nderme vb.)\n    slack_client = WebClient(token=SLACK_BOT_TOKEN)\n\n    # Slack isteklerini do\u011frulamak i\u00e7in SignatureVerifier'\u0131 ba\u015flat\n    # Bu, Slack'ten gelen isteklerin g\u00fcvenilir oldu\u011funu kontrol eder.\n    verifier = SignatureVerifier(SLACK_SIGNING_SECRET)\n\n    # Middleware: T\u00fcm Slack isteklerini do\u011frula\n    @app.before_request\n    def verify_slack_request():\n        # Sadece Slack'ten gelen POST isteklerini do\u011frula\n        if request.method == \"POST\" and request.path.startswith(\"\/slack\/\"):\n            # \u0130stek ba\u015fl\u0131klar\u0131n\u0131 ve g\u00f6vdesini al\n            timestamp = request.headers.get(\"X-Slack-Request-Timestamp\")\n            signature = request.headers.get(\"X-Slack-Signature\")\n            body = request.get_data().decode(\"utf-8\")\n\n            # \u0130stek do\u011frulamas\u0131n\u0131 yap\n            if not verifier.is_valid_request(body, timestamp, signature):\n                # Do\u011frulama ba\u015far\u0131s\u0131z olursa 403 Forbidden yan\u0131t\u0131 d\u00f6n\n                app.logger.warning(\"Slack istek do\u011frulamas\u0131 ba\u015far\u0131s\u0131z oldu!\")\n                return jsonify({\"error\": \"Invalid Slack request signature\"}), 403\n\n    # Slack olaylar\u0131n\u0131 i\u015fleyen ana endpoint\n    @app.route(\"\/slack\/events\", methods=[\"POST\"])\n    def slack_events():\n        payload = request.get_json()\n        app.logger.info(f\"Slack Event Payload: {payload}\")\n\n        # Slack'in URL do\u011frulama iste\u011fini ele al\n        if payload and payload.get(\"type\") == \"url_verification\":\n            return jsonify({\"challenge\": payload.get(\"challenge\")})\n\n        # Bir kullan\u0131c\u0131 bottan bahsetti\u011finde (app_mention)\n        if payload and payload.get(\"event\") and payload[\"event\"].get(\"type\") == \"app_mention\":\n            event = payload[\"event\"]\n            channel_id = event.get(\"channel\")\n            user_id = event.get(\"user\")\n            text = event.get(\"text\")\n\n            # Basit bir yan\u0131t g\u00f6nder\n            try:\n                slack_client.chat_postMessage(\n                    channel=channel_id,\n                    text=f\"Merhaba <@{user_id}>! Bana '{text}' dedin.\"\n                )\n                app.logger.info(f\"Kanal {channel_id} adresine yan\u0131t g\u00f6nderildi.\")\n            except SlackApiError as e:\n                app.logger.error(f\"Slack API hatas\u0131: {e.response['error']}\")\n            return jsonify({\"status\": \"ok\"}), 200\n\n        # Di\u011fer olay t\u00fcrlerini burada i\u015fleyebilirsiniz\n        # \u00d6rne\u011fin, bir mesaj g\u00f6nderildi\u011finde:\n        # if payload and payload.get(\"event\") and payload[\"event\"].get(\"type\") == \"message\":\n        #    ...\n\n        return jsonify({\"status\": \"ignored\"}), 200\n\n    # Slack slash komutlar\u0131n\u0131 i\u015fleyen endpoint\n    @app.route(\"\/slack\/commands\", methods=[\"POST\"])\n    def slack_commands():\n        # Flask, request.form ile gelen form verilerini otomatik olarak ayr\u0131\u015ft\u0131r\u0131r\n        command_data = request.form\n        app.logger.info(f\"Slack Command Data: {command_data}\")\n\n        command = command_data.get(\"command\")\n        channel_id = command_data.get(\"channel_id\")\n        user_id = command_data.get(\"user_id\")\n        text = command_data.get(\"text\") # Komut sonras\u0131 girilen metin\n\n        if command == \"\/hello\":\n            response_text = f\"Merhaba <@{user_id}>! \/hello komutunu kulland\u0131n.\"\n            if text:\n                response_text += f\" Ve '{text}' yazd\u0131n.\"\n            try:\n                slack_client.chat_postMessage(\n                    channel=channel_id,\n                    text=response_text\n                )\n                app.logger.info(f\"Kanal {channel_id} adresine slash komut yan\u0131t\u0131 g\u00f6nderildi.\")\n            except SlackApiError as e:\n                app.logger.error(f\"Slack API hatas\u0131: {e.response['error']}\")\n            return jsonify({\"status\": \"ok\"}), 200\n        \n        # Bilinmeyen bir komut gelirse\n        return jsonify({\"text\": \"Bilinmeyen bir komut.\"}), 200\n\n\n    # Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rma\n    if __name__ == \"__main__\":\n        # Geli\u015ftirme ortam\u0131 i\u00e7in hata ay\u0131klama modunu etkinle\u015ftir\n        app.run(debug=True, port=3000)<\/code><\/pre>\n<p>Bu kod, Flask kullanarak basit bir web sunucusu olu\u015fturur. <code>\/slack\/events<\/code> yolu, Slack&#8217;ten gelen olaylar\u0131 (botunuzdan bahsedildi\u011finde gibi) i\u015flerken, <code>\/slack\/commands<\/code> yolu slash komutlar\u0131n\u0131 i\u015fler. <code>SignatureVerifier<\/code> ile Slack isteklerinin g\u00fcvenli\u011fi sa\u011flan\u0131r.<\/p>\n<h3>Bot&#8217;u \u0130nternete A\u00e7ma (Ngrok Kullan\u0131m\u0131)<\/h3>\n<p>Slack, botunuza olaylar\u0131 ve komutlar\u0131 g\u00f6nderebilmek i\u00e7in herkese a\u00e7\u0131k (public) bir URL&#8217;ye ihtiya\u00e7 duyar. Geli\u015ftirme a\u015famas\u0131nda, yerel makinenizde \u00e7al\u0131\u015fan Flask uygulamas\u0131n\u0131 d\u0131\u015f d\u00fcnyaya a\u00e7mak i\u00e7in Ngrok gibi bir t\u00fcnelleme arac\u0131 kullanabiliriz.<\/p>\n<h4>Ngrok Kurulumu<\/h4>\n<p>1.  <strong>Ngrok Web Sitesi:<\/strong> <code>ngrok.com<\/code> adresine gidin ve bir hesap olu\u015fturun veya giri\u015f yap\u0131n.<br \/>\n2.  <strong>Kurulum:<\/strong> Ubuntu i\u00e7in Ngrok&#8217;u kurman\u0131n en kolay yollar\u0131ndan biri <code>snap<\/code> kullanmakt\u0131r:<\/p>\n<pre><code class=\"language-bash\">sudo snap install ngrok<\/code><\/pre>\n<p>    Alternatif olarak, Ngrok web sitesinden indirme yapabilir ve zip dosyas\u0131n\u0131 \u00e7\u0131kar\u0131p y\u00fcr\u00fct\u00fclebilir dosyay\u0131 PATH&#8217;inize ekleyebilirsiniz.<\/p>\n<p>3.  <strong>Auth Token Ekleme:<\/strong> Ngrok hesab\u0131n\u0131za giri\u015f yapt\u0131ktan sonra, &#8220;Your Authtoken&#8221; b\u00f6l\u00fcm\u00fcnde size \u00f6zel bir kimlik do\u011frulama tokeni verilecektir. Bu tokeni Ngrok&#8217;a ekleyin:<\/p>\n<pre><code class=\"language-bash\">ngrok authtoken <YOUR_AUTH_TOKEN><\/code><\/pre>\n<p>    <code><YOUR_AUTH_TOKEN><\/code> k\u0131sm\u0131n\u0131 kendi tokeninizle de\u011fi\u015ftirin.<\/p>\n<h4>Ngrok&#8217;u \u00c7al\u0131\u015ft\u0131rma ve Slack URL&#8217;lerini G\u00fcncelleme<\/h4>\n<p>1.  <strong>Flask Uygulaman\u0131z\u0131 \u00c7al\u0131\u015ft\u0131r\u0131n:<\/strong><br \/>\n    <code>my_slack_bot<\/code> dizininde oldu\u011funuzdan ve sanal ortam\u0131n etkinle\u015ftirildi\u011finden emin olun:<\/p>\n<pre><code class=\"language-bash\">cd my_slack_bot\n    source venv\/bin\/activate\n    python app.py<\/code><\/pre>\n<p>    Uygulaman\u0131z varsay\u0131lan olarak <code>http:\/\/127.0.0.1:3000<\/code> adresinde \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<p>2.  <strong>Ngrok T\u00fcnelini Ba\u015flat\u0131n:<\/strong><br \/>\n    Yeni bir terminal penceresi a\u00e7\u0131n (veya mevcut terminalde Flask uygulamas\u0131n\u0131 arka plana al\u0131n) ve Ngrok&#8217;u \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">ngrok http 3000<\/code><\/pre>\n<p>    Ngrok, size <code>https:\/\/<\/code> ile ba\u015flayan bir &#8220;Forwarding&#8221; URL&#8217;si verecektir (\u00f6rn. <code>https:\/\/abcdef123456.ngrok.io<\/code>). Bu URL, yerel Flask uygulaman\u0131za y\u00f6nlendirilmi\u015f herkese a\u00e7\u0131k URL&#8217;nizdir.<\/p>\n<p>3.  <strong>Slack Uygulamas\u0131nda URL&#8217;leri G\u00fcncelleyin:<\/strong><br \/>\n    *   Slack API web sitesine (api.slack.com\/apps) gidin ve bot uygulaman\u0131z\u0131 se\u00e7in.<br \/>\n    *   <strong>Event Subscriptions:<\/strong> Sol men\u00fcden &#8220;Event Subscriptions&#8221; se\u00e7ene\u011fine gidin. &#8220;Request URL&#8221; alan\u0131na Ngrok&#8217;tan ald\u0131\u011f\u0131n\u0131z URL&#8217;yi ekleyin ve sonuna <code>\/slack\/events<\/code> ekleyin. \u00d6rne\u011fin: <code>https:\/\/abcdef123456.ngrok.io\/slack\/events<\/code>.<br \/>\n        Slack, bu URL&#8217;yi do\u011frulamak i\u00e7in bir &#8220;challenge&#8221; iste\u011fi g\u00f6nderecektir. Kodunuzdaki <code>url_verification<\/code> i\u015fleyici sayesinde bu otomatik olarak yan\u0131tlanacakt\u0131r. Do\u011frulama ba\u015far\u0131l\u0131 olursa, URL&#8217;nin yan\u0131nda ye\u015fil bir onay i\u015fareti g\u00f6receksiniz.<br \/>\n    *   <strong>Interactivity &#038; Shortcuts:<\/strong> Sol men\u00fcden &#8220;Interactivity &#038; Shortcuts&#8221; se\u00e7ene\u011fine gidin. &#8220;Request URL&#8221; alan\u0131na ayn\u0131 Ngrok URL&#8217;sini ve <code>\/slack\/events<\/code> ekleyin.<br \/>\n    *   <strong>Slash Commands:<\/strong> Sol men\u00fcden &#8220;Slash Commands&#8221; se\u00e7ene\u011fine gidin. Olu\u015fturdu\u011funuz <code>\/hello<\/code> komutunu d\u00fczenleyin ve &#8220;Request URL&#8221; alan\u0131na Ngrok URL&#8217;sini ve <code>\/slack\/commands<\/code> ekleyin. \u00d6rne\u011fin: <code>https:\/\/abcdef123456.ngrok.io\/slack\/commands<\/code>.<\/p>\n<p>Art\u0131k botunuz Slack&#8217;ten gelen olaylar\u0131 ve komutlar\u0131 dinlemeye haz\u0131r! Slack \u00e7al\u0131\u015fma alan\u0131n\u0131zda botunuzdan bahsedebilir (<code>@MyPythonBot merhaba<\/code>) veya <code>\/hello<\/code> komutunu kullanabilirsiniz. Botunuzun yan\u0131t verdi\u011fini g\u00f6rmelisiniz.<\/p>\n<h3>Bot&#8217;u Geli\u015ftirme ve Ek \u00d6zellikler<\/h3>\n<p>Temel bir botu \u00e7al\u0131\u015f\u0131r duruma getirdikten sonra, onu daha yetenekli hale getirmek i\u00e7in \u00e7e\u015fitli \u00f6zellikler ekleyebilirsiniz.<\/p>\n<h4>Mod\u00fcler Yap\u0131<\/h4>\n<p>Botunuz b\u00fcy\u00fcd\u00fck\u00e7e, t\u00fcm kodu <code>app.py<\/code> i\u00e7inde tutmak zorla\u015fabilir. Kodu fonksiyonel olarak mod\u00fcllere ay\u0131rmak (\u00f6rn. <code>handlers.py<\/code>, <code>utils.py<\/code>) projenizin daha d\u00fczenli olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Veritaban\u0131 Entegrasyonu<\/h4>\n<p>Botunuzun kullan\u0131c\u0131 tercihlerini, ge\u00e7mi\u015f etkile\u015fimleri veya di\u011fer kal\u0131c\u0131 verileri saklamas\u0131 gerekebilir. SQLite (k\u00fc\u00e7\u00fck projeler i\u00e7in), PostgreSQL veya MySQL gibi veritabanlar\u0131n\u0131 Python&#8217;da <code>sqlite3<\/code>, <code>psycopg2<\/code> veya <code>pymysql<\/code> k\u00fct\u00fcphaneleriyle entegre edebilirsiniz.<\/p>\n<h4>Harici API&#8217;larla Entegrasyon<\/h4>\n<p>Bir Slack botunun en g\u00fc\u00e7l\u00fc yanlar\u0131ndan biri, di\u011fer hizmetlerle entegrasyon yetene\u011fidir. Hava durumu API&#8217;leri, d\u00f6viz kurlar\u0131, proje y\u00f6netim ara\u00e7lar\u0131 (Jira, Trello) veya \u00f6zel i\u015f uygulamalar\u0131n\u0131zla entegre olarak botunuzu daha kullan\u0131\u015fl\u0131 hale getirebilirsiniz. <code>requests<\/code> k\u00fct\u00fcphanesi bu t\u00fcr entegrasyonlar i\u00e7in standart ara\u00e7t\u0131r.<\/p>\n<pre><code class=\"language-python\"># \u00d6rnek: Hava durumu API'si ile entegrasyon\nimport requests\n\ndef get_weather(city):\n    api_key = \"YOUR_WEATHER_API_KEY\" # Kendi API anahtar\u0131n\u0131z\u0131 buraya ekleyin\n    base_url = f\"http:\/\/api.openweathermap.org\/data\/2.5\/weather?q={city}&appid={api_key}&units=metric\"\n    try:\n        response = requests.get(base_url)\n        response.raise_for_status() # HTTP hatalar\u0131n\u0131 kontrol et\n        data = response.json()\n        if data[\"cod\"] == 200:\n            main = data[\"main\"]\n            weather = data[\"weather\"][0]\n            return (f\"{city} \u015fehrinde s\u0131cakl\u0131k: {main['temp']}\u00b0C, \"\n                    f\"durum: {weather['description'].capitalize()}\")\n        else:\n            return f\"Hava durumu bilgisi al\u0131namad\u0131: {data['message']}\"\n    except requests.exceptions.RequestException as e:\n        return f\"Hava durumu sorgularken bir hata olu\u015ftu: {e}\"\n\n<h2>app.py i\u00e7inde kullan\u0131m \u00f6rne\u011fi:<\/h2>\n<h2>if text.lower().startswith(\"hava durumu\"):<\/h2>\n<h2>city = text.split(\" \", 2)[-1] # 'hava durumu istanbul' -> 'istanbul'<\/h2>\n<h2>weather_info = get_weather(city)<\/h2>\n<h2>slack_client.chat_postMessage(channel=channel_id, text=weather_info)<\/code><\/pre>\n<\/h2>\n<h4>\u0130nteraktif Mesajlar (Block Kit)<\/h4>\n<p>Slack&#8217;in Block Kit&#8217;i, botunuzun daha zengin ve etkile\u015fimli mesajlar g\u00f6ndermesini sa\u011flar. D\u00fc\u011fmeler, a\u00e7\u0131l\u0131r men\u00fcler, metin giri\u015f alanlar\u0131 ve modallar gibi UI \u00f6\u011felerini kullanarak kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015ftirebilirsiniz. <code>slack_sdk<\/code> bu t\u00fcr mesajlar\u0131 olu\u015fturmak i\u00e7in yard\u0131mc\u0131 fonksiyonlar sunar.<\/p>\n<h4>Hata Y\u00f6netimi ve Loglama<\/h4>\n<p>Botunuzun kararl\u0131 \u00e7al\u0131\u015fmas\u0131 i\u00e7in iyi bir hata y\u00f6netimi ve loglama stratejisi \u00f6nemlidir. Python&#8217;\u0131n <code>try-except<\/code> bloklar\u0131n\u0131 kullanarak olas\u0131 hatalar\u0131 yakalay\u0131n ve <code>logging<\/code> mod\u00fcl\u00fcn\u00fc kullanarak \u00f6nemli olaylar\u0131, uyar\u0131lar\u0131 ve hatalar\u0131 kaydedin.<\/p>\n<pre><code class=\"language-python\">import logging\n\n<h2>Loglama yap\u0131land\u0131rmas\u0131<\/h2>\nlogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\n\n<h2>... kodunuzda ...<\/h2>\ntry:\n    slack_client.chat_postMessage(...)\n    logging.info(\"Mesaj ba\u015far\u0131yla g\u00f6nderildi.\")\nexcept SlackApiError as e:\n    logging.error(f\"Slack API hatas\u0131: {e.response['error']}\")\nexcept Exception as e:\n    logging.exception(\"Beklenmedik bir hata olu\u015ftu:\")<\/code><\/pre>\n<h3>Bot&#8217;u S\u00fcrekli \u00c7al\u0131\u015ft\u0131rma (Production Ortam\u0131 \u0130\u00e7in Temeller)<\/h3>\n<p>Ngrok, geli\u015ftirme i\u00e7in harika olsa da, botunuzu s\u00fcrekli olarak ve g\u00fcvenilir bir \u015fekilde \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir \u00fcretim ortam\u0131 kurulumuna ihtiyac\u0131n\u0131z olacakt\u0131r. Ubuntu \u00fczerinde <code>systemd<\/code> servisi kullanarak botunuzu arka planda \u00e7al\u0131\u015ft\u0131rmak ve sistem ba\u015flang\u0131c\u0131nda otomatik olarak ba\u015flatmak m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h4>Gunicorn ve Nginx (Daha Kapsaml\u0131 \u00dcretim \u0130\u00e7in)<\/h4>\n<p>Daha b\u00fcy\u00fck veya daha yo\u011fun trafikli botlar i\u00e7in, Flask uygulaman\u0131z\u0131 do\u011frudan \u00e7al\u0131\u015ft\u0131rmak yerine bir WSGI sunucusu (Gunicorn gibi) ve bir ters proxy (Nginx gibi) kullanmak daha iyi bir yakla\u015f\u0131md\u0131r.<\/p>\n<p>1.  <strong>Gunicorn Kurulumu:<\/strong><\/p>\n<pre><code class=\"language-bash\">pip install gunicorn<\/code><\/pre>\n<p>2.  <strong>Gunicorn ile Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma:<\/strong><\/p>\n<pre><code class=\"language-bash\">gunicorn -w 4 -b 0.0.0.0:8000 app:app<\/code><\/pre>\n<p>    Bu komut, <code>app.py<\/code> dosyas\u0131ndaki <code>app<\/code> Flask uygulamas\u0131n\u0131 4 worker ile 8000 portunda \u00e7al\u0131\u015ft\u0131r\u0131r. Nginx daha sonra gelen istekleri bu Gunicorn sunucusuna y\u00f6nlendirebilir.<\/p>\n<p>Bu makalenin kapsam\u0131n\u0131 a\u015faca\u011f\u0131 i\u00e7in Nginx yap\u0131land\u0131rmas\u0131na girmeyece\u011fiz, ancak production ortam\u0131nda bir web sunucusu ve ters proxy kullanman\u0131n en iyi pratik oldu\u011funu bilmelisiniz.<\/p>\n<h4><code>systemd<\/code> Servisi ile Bot&#8217;u Y\u00f6netme<\/h4>\n<p>Botunuzu Ubuntu&#8217;da bir <code>systemd<\/code> servisi olarak yap\u0131land\u0131rmak, uygulaman\u0131z\u0131n arka planda \u00e7al\u0131\u015fmas\u0131n\u0131, otomatik olarak yeniden ba\u015flat\u0131lmas\u0131n\u0131 ve sistemin \u00f6ny\u00fcklemesi s\u0131ras\u0131nda ba\u015flamas\u0131n\u0131 sa\u011flar.<\/p>\n<p>1.  <strong>Servis Dosyas\u0131 Olu\u015fturun:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/systemd\/system\/my_slack_bot.service<\/code><\/pre>\n<p>    A\u015fa\u011f\u0131daki i\u00e7eri\u011fi dosyaya yap\u0131\u015ft\u0131r\u0131n. <code>User<\/code>, <code>WorkingDirectory<\/code> ve <code>ExecStart<\/code> yollar\u0131n\u0131 kendi sisteminize g\u00f6re ayarlamay\u0131 unutmay\u0131n.<\/p>\n<pre><code class=\"language-ini\">[Unit]\n    Description=My Slack Bot\n    After=network.target\n\n    [Service]\n    User=your_username            # Kendi Ubuntu kullan\u0131c\u0131 ad\u0131n\u0131z\u0131 buraya yaz\u0131n\n    WorkingDirectory=\/path\/to\/my_slack_bot # Bot projenizin tam yolunu yaz\u0131n\n    ExecStart=\/path\/to\/my_slack_bot\/venv\/bin\/python3 \/path\/to\/my_slack_bot\/app.py # venv i\u00e7indeki python ve app.py yolunu yaz\u0131n\n    Restart=always\n    StandardOutput=syslog\n    StandardError=syslog\n    SyslogIdentifier=my_slack_bot\n\n    [Install]\n    WantedBy=multi-user.target<\/code><\/pre>\n<p>    *   <code>Description<\/code>: Servisin k\u0131sa a\u00e7\u0131klamas\u0131.<br \/>\n    *   <code>After=network.target<\/code>: A\u011f servisleri ba\u015flat\u0131ld\u0131ktan sonra ba\u015flamas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <code>User<\/code>: Botu hangi kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131z\u0131 belirtir.<br \/>\n    *   <code>WorkingDirectory<\/code>: Bot projenizin k\u00f6k dizini.<br \/>\n    *   <code>ExecStart<\/code>: Botu ba\u015flatan komut. Sanal ortam\u0131n\u0131zdaki Python yorumlay\u0131c\u0131s\u0131n\u0131 ve <code>app.py<\/code> dosyan\u0131z\u0131n tam yolunu belirtmeniz \u00f6nemlidir.<br \/>\n    *   <code>Restart=always<\/code>: Bot \u00e7\u00f6kerse veya durursa otomatik olarak yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <code>StandardOutput<\/code> ve <code>StandardError<\/code>: \u00c7\u0131kt\u0131lar\u0131 sistem g\u00fcnl\u00fc\u011f\u00fcne (<code>journalctl<\/code>) y\u00f6nlendirir.<\/p>\n<p>2.  <strong><code>systemd<\/code> De\u011fi\u015fikliklerini Yeniden Y\u00fckleyin:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload<\/code><\/pre>\n<p>3.  <strong>Servisi Ba\u015flat\u0131n:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo systemctl start my_slack_bot<\/code><\/pre>\n<p>4.  <strong>Servisin Durumunu Kontrol Edin:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo systemctl status my_slack_bot<\/code><\/pre>\n<p>    \u00c7\u0131kt\u0131da &#8220;active (running)&#8221; g\u00f6rmelisiniz. Hata olursa, <code>journalctl -u my_slack_bot<\/code> komutuyla detayl\u0131 loglar\u0131 inceleyebilirsiniz.<\/p>\n<p>5.  <strong>Sistem Ba\u015flang\u0131c\u0131nda Otomatik Ba\u015flatmay\u0131 Etkinle\u015ftirin:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo systemctl enable my_slack_bot<\/code><\/pre>\n<p>Art\u0131k botunuz, sisteminiz yeniden ba\u015flat\u0131lsa bile otomatik olarak ba\u015flayacak ve arka planda s\u00fcrekli \u00e7al\u0131\u015facakt\u0131r. Ngrok&#8217;u kapatabilir ve Slack uygulamas\u0131ndaki Request URL&#8217;lerini, botunuzun sunucuya da\u011f\u0131t\u0131ld\u0131\u011f\u0131 ger\u00e7ek herkese a\u00e7\u0131k IP adresi veya alan ad\u0131yla g\u00fcncelleyebilirsiniz. Bu genellikle bir alan ad\u0131, SSL sertifikas\u0131 (Let&#8217;s Encrypt gibi) ve bir web sunucusu (Nginx gibi) yap\u0131land\u0131rmas\u0131n\u0131 i\u00e7erir.<\/p>\n<h3>Sonu\u00e7 ve \u0130leri Ad\u0131mlar<\/h3>\n<p>Bu kapsaml\u0131 rehberde, Ubuntu 20.04 \u00fczerinde Python kullanarak bir Slack botunu s\u0131f\u0131rdan nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131, Slack API ile nas\u0131l entegre edece\u011finizi ve hatta temel bir \u00fcretim ortam\u0131 i\u00e7in nas\u0131l yap\u0131land\u0131raca\u011f\u0131n\u0131z\u0131 \u00f6\u011frendiniz. Bir Slack botu olu\u015fturmak, sadece mesajlara yan\u0131t vermekten \u00e7ok daha fazlas\u0131n\u0131 ifade eder; i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 otomatikle\u015ftirmek, verimlili\u011fi art\u0131rmak ve ekibinizin ileti\u015fimini zenginle\u015ftirmek i\u00e7in sonsuz olanaklar sunar.<\/p>\n<p>\u00d6\u011frendiklerinizle yetinmeyin! \u0130\u015fte botunuzu daha da geli\u015ftirmek i\u00e7in baz\u0131 ileri ad\u0131mlar:<\/p>\n<p>*   <strong>Slack API Dok\u00fcmantasyonunu Ke\u015ffedin:<\/strong> <code>api.slack.com<\/code> adresindeki resmi dok\u00fcmantasyon, Block Kit, modallar, etkile\u015fimli bile\u015fenler ve daha fazlas\u0131 hakk\u0131nda derinlemesine bilgi sa\u011flar.<br \/>\n*   <strong>Daha Karma\u015f\u0131k Mant\u0131k Uygulay\u0131n:<\/strong> Durum y\u00f6netimi, kullan\u0131c\u0131 tabanl\u0131 ki\u015fiselle\u015ftirme veya makine \u00f6\u011frenimi entegrasyonu gibi daha karma\u015f\u0131k mant\u0131klar\u0131 botunuza dahil edin.<br \/>\n*   <strong>Testler Yaz\u0131n:<\/strong> Botunuzun g\u00fcvenilirli\u011fini sa\u011flamak i\u00e7in birim testleri ve entegrasyon testleri yaz\u0131n.<br \/>\n*   <strong>Da\u011f\u0131t\u0131m Stratejilerini Ara\u015ft\u0131r\u0131n:<\/strong> Docker, Kubernetes veya bulut platformlar\u0131 (AWS Lambda, Google Cloud Functions) gibi modern da\u011f\u0131t\u0131m y\u00f6ntemlerini inceleyin.<\/p>\n<p>Kendi Slack botunuzu geli\u015ftirmek, hem e\u011flenceli hem de \u00f6\u011fretici bir s\u00fcre\u00e7tir. Bu rehber, size sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 sunmu\u015ftur. \u015eimdi yarat\u0131c\u0131l\u0131\u011f\u0131n\u0131z\u0131 kullan\u0131n ve ekibinizin ihtiya\u00e7lar\u0131na uygun, benzersiz bir bot geli\u015ftirin!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Python ve Ubuntu 20. 04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber Slack, modern ekiplerin vazge\u00e7ilmez ileti\u015fim platformlar\u0131ndan biri haline geldi.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-40890","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Python ve Ubuntu 20. 04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber Slack, modern ekiplerin vazge\u00e7ilmez ileti\u015fim platformlar\u0131ndan biri haline geldi.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-02T00:40:47+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-03-02T00:40:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/\"},\"wordCount\":2582,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/\",\"name\":\"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-03-02T00:40:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber","og_description":"Python ve Ubuntu 20. 04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber Slack, modern ekiplerin vazge\u00e7ilmez ileti\u015fim platformlar\u0131ndan biri haline geldi.","og_url":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-03-02T00:40:47+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber","datePublished":"2026-03-02T00:40:47+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/"},"wordCount":2582,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/","name":"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-03-02T00:40:47+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-ve-ubuntu-20-04-ile-kendi-slack-botunuzu-gelistirin-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python ve Ubuntu 20.04 ile Kendi Slack Botunuzu Geli\u015ftirin: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=40890"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40890\/revisions"}],"predecessor-version":[{"id":40891,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40890\/revisions\/40891"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=40890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=40890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=40890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}