{"id":40400,"date":"2026-02-26T18:41:03","date_gmt":"2026-02-26T15:41:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=40400"},"modified":"2026-02-26T18:41:03","modified_gmt":"2026-02-26T15:41:03","slug":"python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/","title":{"rendered":"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Slack, modern ekiplerin ileti\u015fim kurma ve i\u015fbirli\u011fi yapma bi\u00e7imini de\u011fi\u015ftiren g\u00fc\u00e7l\u00fc bir platformdur. Ancak Slack&#8217;in ger\u00e7ek potansiyeli, \u00e7e\u015fitli otomasyon ve entegrasyon yetenekleriyle ortaya \u00e7\u0131kar. Bu yeteneklerin ba\u015f\u0131nda Slack botlar\u0131 gelir. Bir Slack botu, belirli olaylara tepki veren, mesajlar g\u00f6nderen, kullan\u0131c\u0131larla etkile\u015fim kuran ve hatta harici hizmetlerle ba\u011flant\u0131 kurarak i\u015f ak\u0131\u015flar\u0131n\u0131 otomatikle\u015ftiren bir uygulamad\u0131r. Bu makalede, Python programlama dilini kullanarak s\u0131f\u0131rdan ilk Slack botunuzu nas\u0131l in\u015fa edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.<\/p>\n<p>Bu rehber, Slack botlar\u0131n\u0131n temel kavramlar\u0131ndan ba\u015flayarak, bir Slack uygulamas\u0131 olu\u015fturma, gerekli izinleri ayarlama, Python ortam\u0131n\u0131z\u0131 yap\u0131land\u0131rma, ilk bot kodunuzu yazma, daha geli\u015fmi\u015f \u00f6zellikler ekleme ve botunuzu \u00e7al\u0131\u015ft\u0131rma konular\u0131n\u0131 kapsayacakt\u0131r. \u0130ster g\u00fcnl\u00fck i\u015flerinizi kolayla\u015ft\u0131rmak, ister e\u011flenceli bir ara\u00e7 yaratmak isteyin, Python ile kendi Slack botunuzu geli\u015ftirmek, hem faydal\u0131 hem de \u00f6\u011fretici bir deneyim olacakt\u0131r. Haz\u0131rsan\u0131z, bu heyecan verici yolculu\u011fa ba\u015flayal\u0131m!<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Bu rehbere ba\u015flamadan \u00f6nce, a\u015fa\u011f\u0131daki temel gereksinimlere sahip oldu\u011funuzdan emin olun:<\/p>\n<p>*   <strong>Python 3.7 veya \u00fczeri:<\/strong> Python&#8217;\u0131n kurulu oldu\u011fundan ve <code>pip<\/code> paket y\u00f6neticisinin \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun. Komut istemcinizde <code>python --version<\/code> ve <code>pip --version<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rarak kontrol edebilirsiniz.<br \/>\n*   <strong>Slack \u00c7al\u0131\u015fma Alan\u0131:<\/strong> Bir Slack \u00e7al\u0131\u015fma alan\u0131na eri\u015fiminiz olmal\u0131 ve bu alanda uygulama olu\u015fturma ve y\u00fckleme yetkisine sahip olmal\u0131s\u0131n\u0131z. Kendi test \u00e7al\u0131\u015fma alan\u0131n\u0131z\u0131 olu\u015fturmak en iyisidir.<br \/>\n*   <strong>Temel Python Bilgisi:<\/strong> Fonksiyonlar, de\u011fi\u015fkenler, listeler ve s\u00f6zl\u00fckler gibi temel Python kavramlar\u0131na a\u015fina olman\u0131z beklenmektedir.<br \/>\n*   <strong>Komut Sat\u0131r\u0131 Temelleri:<\/strong> Terminal veya komut istemcisini kullanma konusunda temel bilgiye sahip olman\u0131z faydal\u0131 olacakt\u0131r.<\/p>\n<h3>Slack Uygulamas\u0131 Olu\u015fturma ve Yetkilendirme<\/h3>\n<p>Slack botunuzu geli\u015ftirmeye ba\u015flamadan \u00f6nce, Slack&#8217;in API platformunda botunuz i\u00e7in bir uygulama olu\u015fturman\u0131z ve gerekli izinleri (scopes) yap\u0131land\u0131rman\u0131z gerekir. Bu i\u015flem, botunuzun Slack \u00e7al\u0131\u015fma alan\u0131n\u0131zda belirli eylemleri ger\u00e7ekle\u015ftirmesine olanak tan\u0131r.<\/p>\n<h4>Yeni Bir Slack Uygulamas\u0131 Olu\u015fturma<\/h4>\n<p>\u0130lk ad\u0131m, Slack API web sitesine giderek yeni bir uygulama olu\u015fturmakt\u0131r:<\/p>\n<p>1.  Taray\u0131c\u0131n\u0131zda [api.slack.com\/apps](https:\/\/api.slack.com\/apps) adresine gidin.<br \/>\n2.  &#8220;Create New App&#8221; (Yeni Uygulama Olu\u015ftur) d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n3.  &#8220;From scratch&#8221; (S\u0131f\u0131rdan) se\u00e7ene\u011fini se\u00e7in.<br \/>\n4.  Uygulaman\u0131za bir isim verin (\u00f6rne\u011fin, &#8220;MyFirstPythonBot&#8221;). Bu isim, Slack \u00e7al\u0131\u015fma alan\u0131n\u0131zda botunuzun g\u00f6r\u00fcnen ad\u0131 olacakt\u0131r.<br \/>\n5.  Botu y\u00fcklemek istedi\u011finiz Slack \u00e7al\u0131\u015fma alan\u0131n\u0131 se\u00e7in ve &#8220;Create App&#8221; (Uygulama Olu\u015ftur) d\u00fc\u011fmesine t\u0131klay\u0131n.<\/p>\n<p>Uygulaman\u0131z ba\u015far\u0131yla olu\u015fturulduktan sonra, sizi uygulaman\u0131z\u0131n temel bilgilerinin bulundu\u011fu sayfaya y\u00f6nlendirecektir.<\/p>\n<h4>Bot Token Yetkilendirmeleri (Scopes) Ekleme<\/h4>\n<p>Botunuzun Slack&#8217;te belirli eylemleri ger\u00e7ekle\u015ftirebilmesi i\u00e7in ona yetki vermeniz gerekir. Bu yetkilere &#8220;scopes&#8221; (kapsamlar) denir. Sol men\u00fcden &#8220;OAuth &#038; Permissions&#8221; (OAuth ve \u0130zinler) b\u00f6l\u00fcm\u00fcne gidin ve &#8220;Bot Token Scopes&#8221; (Bot Token Kapsamlar\u0131) ba\u015fl\u0131\u011f\u0131 alt\u0131nda a\u015fa\u011f\u0131daki kapsamlar\u0131 ekleyin:<\/p>\n<p>*   <code>app_mentions:read<\/code>: Botun kendisinden bahsedilen mesajlar\u0131 okumas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>chat:write<\/code>: Botun kanallara veya kullan\u0131c\u0131lara mesaj g\u00f6ndermesini sa\u011flar.<br \/>\n*   <code>channels:read<\/code>: Botun kat\u0131ld\u0131\u011f\u0131 genel kanallar\u0131n listesini ve detaylar\u0131n\u0131 okumas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>groups:read<\/code>: Botun kat\u0131ld\u0131\u011f\u0131 \u00f6zel kanallar\u0131n (private channels\/groups) listesini ve detaylar\u0131n\u0131 okumas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>im:read<\/code>: Botun direkt mesaj (DM) kanallar\u0131n\u0131 okumas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>mpim:read<\/code>: Botun \u00e7oklu ki\u015fi direkt mesaj (MPDM) kanallar\u0131n\u0131 okumas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu kapsamlar, botunuzun temel etkile\u015fimler i\u00e7in yeterli yetkiye sahip olmas\u0131n\u0131 sa\u011flar. \u0130htiya\u00e7lar\u0131n\u0131za g\u00f6re daha fazla kapsam eklemeniz gerekebilir. Kapsamlar\u0131 ekledikten sonra, sayfan\u0131n \u00fcst k\u0131sm\u0131nda bir uyar\u0131 g\u00f6receksiniz: &#8220;Install your app to your workspace&#8221; (Uygulaman\u0131z\u0131 \u00e7al\u0131\u015fma alan\u0131n\u0131za y\u00fckleyin).<\/p>\n<h4>Uygulamay\u0131 \u00c7al\u0131\u015fma Alan\u0131na Y\u00fckleme ve Bot Token&#8217;\u0131 Alma<\/h4>\n<p>Kapsamlar\u0131 ekledikten sonra, uygulaman\u0131z\u0131 Slack \u00e7al\u0131\u015fma alan\u0131n\u0131za y\u00fcklemeniz gerekir. Bu i\u015flem, botunuz i\u00e7in bir &#8220;Bot User OAuth Token&#8221; olu\u015fturacakt\u0131r.<\/p>\n<p>1.  &#8220;Install to Workspace&#8221; (\u00c7al\u0131\u015fma Alan\u0131na Y\u00fckle) d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n2.  Slack, uygulaman\u0131z\u0131n isteyece\u011fi izinleri \u00f6zetleyen bir onay ekran\u0131 g\u00f6sterecektir. &#8220;Allow&#8221; (\u0130zin Ver) d\u00fc\u011fmesine t\u0131klayarak onaylay\u0131n.<br \/>\n3.  Ba\u015far\u0131l\u0131 bir y\u00fcklemeden sonra, &#8220;OAuth &#038; Permissions&#8221; sayfas\u0131na geri d\u00f6neceksiniz. Bu sayfada, &#8220;Bot User OAuth Token&#8221; alt\u0131nda <code>xoxb-<\/code> ile ba\u015flayan bir token g\u00f6receksiniz.<\/p>\n<p>Bu token, botunuzun Slack API ile kimlik do\u011frulamas\u0131 yapmak i\u00e7in kullanaca\u011f\u0131 anahtard\u0131r. <strong>Bu token&#8217;\u0131 kesinlikle kimseyle payla\u015fmay\u0131n ve g\u00fcvenli bir yerde saklay\u0131n.<\/strong> Geli\u015ftirme ortam\u0131n\u0131zda bu token&#8217;\u0131 bir ortam de\u011fi\u015fkeni olarak saklayaca\u011f\u0131z. \u015eimdilik kopyalay\u0131p bir yere yap\u0131\u015ft\u0131r\u0131n.<\/p>\n<h3>Geli\u015ftirme Ortam\u0131n\u0131 Haz\u0131rlama<\/h3>\n<p>Python ile bot geli\u015ftirirken en iyi uygulama, her proje i\u00e7in izole bir sanal ortam kullanmakt\u0131r. Bu, proje ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n sistem genelindeki Python kurulumunuzu etkilemesini \u00f6nler.<\/p>\n<h4>Sanal Ortam Olu\u015fturma<\/h4>\n<p>Projeniz i\u00e7in bir dizin olu\u015fturun ve bu dizin i\u00e7inde bir sanal ortam ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">mkdir my-slack-bot\ncd my-slack-bot\npython -m venv venv<\/code><\/pre>\n<p>Sanal ortam\u0131 etkinle\u015ftirin:<\/p>\n<p>*   <strong>Windows:<\/strong><\/p>\n<pre><code class=\"language-bash\">.\\venv\\Scripts\\activate<\/code><\/pre>\n<p>*   <strong>macOS\/Linux:<\/strong><\/p>\n<pre><code class=\"language-bash\">source venv\/bin\/activate<\/code><\/pre>\n<p>Komut istemcinizin ba\u015f\u0131nda <code>(venv)<\/code> g\u00f6rd\u00fc\u011f\u00fcn\u00fczde, sanal ortam\u0131n\u0131z\u0131n etkin oldu\u011fu anlam\u0131na gelir.<\/p>\n<h4>Gerekli K\u00fct\u00fcphaneleri Y\u00fckleme<\/h4>\n<p>Slack botunuzu geli\u015ftirmek i\u00e7in Slack&#8217;in resmi Python SDK&#8217;s\u0131n\u0131 ve ortam de\u011fi\u015fkenlerini y\u00f6netmek i\u00e7in <code>python-dotenv<\/code> k\u00fct\u00fcphanesini y\u00fckleyece\u011fiz:<\/p>\n<pre><code class=\"language-bash\">pip install slack_sdk python-dotenv<\/code><\/pre>\n<p>*   <code>slack_sdk<\/code>: Slack API ile etkile\u015fim kurmay\u0131 sa\u011flayan resmi Python k\u00fct\u00fcphanesi.<br \/>\n*   <code>python-dotenv<\/code>: Ortam de\u011fi\u015fkenlerini <code>.env<\/code> dosyas\u0131ndan y\u00fcklemek i\u00e7in kullan\u0131l\u0131r, b\u00f6ylece hassas bilgiler (API token&#8217;lar\u0131 gibi) kodunuzda g\u00f6r\u00fcnmez.<\/p>\n<h4>Ortam De\u011fi\u015fkenlerini Ayarlama (.env Dosyas\u0131)<\/h4>\n<p>Token&#8217;\u0131n\u0131z\u0131 do\u011frudan kodunuza yazmak yerine, <code>.env<\/code> adl\u0131 bir dosyada saklayaca\u011f\u0131z. Bu, hassas bilgilerinizi g\u00fcvende tutman\u0131n ve kodunuzu daha ta\u015f\u0131nabilir hale getirmenin en iyi yoludur.<\/p>\n<p>Proje dizininizin k\u00f6k\u00fcnde <code>my-slack-bot<\/code> i\u00e7inde <code>.env<\/code> ad\u0131nda yeni bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki sat\u0131r\u0131 ekleyin, <code>xoxb-YOUR-BOT-TOKEN<\/code> k\u0131sm\u0131n\u0131 kendi bot token&#8217;\u0131n\u0131zla de\u011fi\u015ftirin:<\/p>\n<pre><code class=\"language-\">SLACK_BOT_TOKEN=xoxb-YOUR-BOT-TOKEN<\/code><\/pre>\n<p>Ayr\u0131ca, botunuzun Slack sunucusuyla ba\u011flant\u0131 kurmak i\u00e7in &#8220;Socket Mode&#8221; kullanaca\u011f\u0131z. Bunun i\u00e7in bir &#8220;App-Level Token&#8221; da gerekecek. Slack uygulaman\u0131z\u0131n ayarlar\u0131nda (api.slack.com\/apps adresindeki uygulaman\u0131z\u0131n sayfas\u0131nda) sol men\u00fcden &#8220;Basic Information&#8221; -> &#8220;App-Level Tokens&#8221; b\u00f6l\u00fcm\u00fcne gidin. &#8220;Generate Token&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n, token&#8217;a bir isim verin (\u00f6rne\u011fin, <code>socket_mode_token<\/code>) ve <code>connections:write<\/code> kapsam\u0131n\u0131 se\u00e7in. Olu\u015fturulan <code>xapp-<\/code> ile ba\u015flayan token&#8217;\u0131 kopyalay\u0131n ve <code>.env<\/code> dosyan\u0131za ekleyin:<\/p>\n<pre><code class=\"language-\">SLACK_BOT_TOKEN=xoxb-YOUR-BOT-TOKEN\nSLACK_APP_TOKEN=xapp-YOUR-APP-LEVEL-TOKEN<\/code><\/pre>\n<p><strong>\u00d6nemli:<\/strong> <code>.env<\/code> dosyas\u0131n\u0131 s\u00fcr\u00fcm kontrol sisteminize (\u00f6rne\u011fin Git) eklemeyin. <code>.gitignore<\/code> dosyan\u0131za <code>\/.env<\/code> sat\u0131r\u0131n\u0131 ekleyerek bu dosyay\u0131 g\u00f6rmezden gelmesini sa\u011flay\u0131n.<\/p>\n<h3>\u0130lk Bot Kodunuzu Yazma (Socket Mode ile)<\/h3>\n<p>Art\u0131k Slack uygulaman\u0131z haz\u0131r, ortam\u0131n\u0131z yap\u0131land\u0131r\u0131ld\u0131 ve token&#8217;lar\u0131n\u0131z g\u00fcvende. \u0130lk Python Slack bot kodumuzu yazmaya ba\u015flayabiliriz. Modern Slack botlar\u0131 i\u00e7in <code>SocketModeClient<\/code> kullanarak botunuzun Slack sunucusuyla s\u00fcrekli bir ba\u011flant\u0131 kurmas\u0131n\u0131 ve olaylar\u0131 ger\u00e7ek zamanl\u0131 olarak dinlemesini sa\u011flayaca\u011f\u0131z. Bu y\u00f6ntem, botunuzu herkese a\u00e7\u0131k bir HTTP u\u00e7 noktas\u0131na da\u011f\u0131tma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r, bu da geli\u015ftirme ve da\u011f\u0131t\u0131m\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirir.<\/p>\n<p>Proje dizininizin k\u00f6k\u00fcnde <code>app.py<\/code> ad\u0131nda yeni bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code class=\"language-python\">import os\nimport logging\nfrom slack_sdk import WebClient\nfrom slack_sdk.socket_mode import SocketModeClient\nfrom dotenv import load_dotenv\n\n<h2>Ortam de\u011fi\u015fkenlerini .env dosyas\u0131ndan y\u00fckle<\/h2>\nload_dotenv()\n\n<h2>Logger yap\u0131land\u0131rmas\u0131<\/h2>\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\n<h2>Ortam de\u011fi\u015fkenlerinden token'lar\u0131 al<\/h2>\nSLACK_BOT_TOKEN = os.environ.get(\"SLACK_BOT_TOKEN\")\nSLACK_APP_TOKEN = os.environ.get(\"SLACK_APP_TOKEN\")\n\n<h2>Token'lar\u0131n varl\u0131\u011f\u0131n\u0131 kontrol et<\/h2>\nif not SLACK_BOT_TOKEN or not SLACK_APP_TOKEN:\n    logger.error(\"SLACK_BOT_TOKEN veya SLACK_APP_TOKEN ortam de\u011fi\u015fkeni ayarlanmam\u0131\u015f.\")\n    exit(1)\n\n<h2>Slack WebClient'\u0131 ba\u015flat (API \u00e7a\u011fr\u0131lar\u0131 i\u00e7in)<\/h2>\n<h2>Bu client, mesaj g\u00f6ndermek, kanal bilgilerini almak gibi i\u015flemlerde kullan\u0131l\u0131r.<\/h2>\nweb_client = WebClient(token=SLACK_BOT_TOKEN)\n\n<h2>Slack SocketModeClient'\u0131 ba\u015flat (olaylar\u0131 dinlemek i\u00e7in)<\/h2>\n<h2>Bu client, botunuzun Slack'ten gelen olaylar\u0131 (mesajlar, mention'lar vb.) almas\u0131n\u0131 sa\u011flar.<\/h2>\nsocket_mode_client = SocketModeClient(\n    app_token=SLACK_APP_TOKEN,\n    web_client=web_client  # WebClient'\u0131 burada da kullanabiliriz\n)\n\n<h2>Botun kendisinden bahsedildi\u011finde (\u00f6rne\u011fin, \"@MyFirstPythonBot merhaba\") \u00e7al\u0131\u015facak fonksiyon<\/h2>\ndef process_app_mention(client: SocketModeClient, req):\n    \"\"\"\n    Botun kendisinden bahsedildi\u011finde tetiklenen olay i\u015fleyici.\n    Gelen iste\u011fi (req) i\u015fler ve bir yan\u0131t g\u00f6nderir.\n    \"\"\"\n    # Gelen olay\u0131n t\u00fcr\u00fcn\u00fc ve i\u00e7eri\u011fini kontrol et\n    event = req.payload.get(\"event\", {})\n    event_type = event.get(\"type\")\n    \n    # Sadece \"app_mention\" olaylar\u0131n\u0131 i\u015fle\n    if event_type == \"app_mention\":\n        channel_id = event.get(\"channel\")\n        user_id = event.get(\"user\")\n        text = event.get(\"text\")\n        \n        logger.info(f\"Kanal: {channel_id}, Kullan\u0131c\u0131: {user_id}, Mesaj: {text}\")\n\n        # Basit bir \"Merhaba!\" yan\u0131t\u0131 g\u00f6nder\n        try:\n            web_client.chat_postMessage(\n                channel=channel_id,\n                text=f\"Merhaba <@{user_id}>! Ben ilk Python botunuzum.\"\n            )\n            logger.info(f\"Yan\u0131t g\u00f6nderildi: Merhaba {user_id}!\")\n        except Exception as e:\n            logger.error(f\"Mesaj g\u00f6nderme hatas\u0131: {e}\")\n\n<h2>Botun olaylar\u0131 dinlemesini sa\u011flayan handler'\u0131 ekle<\/h2>\n<h2>\"app_mention\" olaylar\u0131n\u0131 dinlemek i\u00e7in \"app_mention\" event_type'\u0131n\u0131 belirtiyoruz.<\/h2>\nsocket_mode_client.events_api.on(\"app_mention\", process_app_mention)\n\nlogger.info(\"Bot ba\u015flat\u0131l\u0131yor...\")\n\n<h2>Botu ba\u015flat ve sonsuza dek \u00e7al\u0131\u015ft\u0131r<\/h2>\n<h2>Bu, botunuzun Slack ile ba\u011flant\u0131s\u0131n\u0131 s\u00fcrekli a\u00e7\u0131k tutar ve olaylar\u0131 dinlemesini sa\u011flar.<\/h2>\nsocket_mode_client.connect()\nsocket_mode_client.start() # Bu \u00e7a\u011fr\u0131 botu ana thread'de \u00e7al\u0131\u015ft\u0131r\u0131r ve bloklar<\/code><\/pre>\n<h4>Kodu A\u00e7\u0131klama<\/h4>\n<p>1.  <strong>\u0130\u00e7e Aktarmalar:<\/strong><br \/>\n    *   <code>os<\/code>: Ortam de\u011fi\u015fkenlerine eri\u015fmek i\u00e7in.<br \/>\n    *   <code>logging<\/code>: Botun \u00e7al\u0131\u015fma zaman\u0131 bilgilerini ve hatalar\u0131n\u0131 kaydetmek i\u00e7in.<br \/>\n    *   <code>slack_sdk.WebClient<\/code>: Slack API&#8217;ye HTTP istekleri g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r (\u00f6rne\u011fin, mesaj g\u00f6ndermek).<br \/>\n    *   <code>slack_sdk.socket_mode.SocketModeClient<\/code>: Slack&#8217;ten gelen olaylar\u0131 ger\u00e7ek zamanl\u0131 olarak dinlemek i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>dotenv.load_dotenv<\/code>: <code>.env<\/code> dosyas\u0131ndaki ortam de\u011fi\u015fkenlerini y\u00fcklemek i\u00e7in.<\/p>\n<p>2.  <strong>Token Y\u00fckleme ve Kontrol:<\/strong><br \/>\n    *   <code>load_dotenv()<\/code>: Proje dizinindeki <code>.env<\/code> dosyas\u0131n\u0131 y\u00fckler.<br \/>\n    *   <code>os.environ.get(...)<\/code>: <code>SLACK_BOT_TOKEN<\/code> ve <code>SLACK_APP_TOKEN<\/code> de\u011ferlerini ortam de\u011fi\u015fkenlerinden al\u0131r.<br \/>\n    *   Token&#8217;lar\u0131n eksik olmas\u0131 durumunda hata mesaj\u0131 verir ve programdan \u00e7\u0131kar.<\/p>\n<p>3.  <strong>Client Ba\u015flatma:<\/strong><br \/>\n    *   <code>web_client = WebClient(token=SLACK_BOT_TOKEN)<\/code>: Slack API&#8217;ye istek g\u00f6ndermek i\u00e7in <code>WebClient<\/code> \u00f6rne\u011fi olu\u015fturulur. Botun mesaj g\u00f6ndermesi gibi eylemleri bu client \u00fczerinden yap\u0131l\u0131r.<br \/>\n    *   <code>socket_mode_client = SocketModeClient(...)<\/code>: Slack&#8217;ten gelen olaylar\u0131 dinlemek i\u00e7in <code>SocketModeClient<\/code> \u00f6rne\u011fi olu\u015fturulur. <code>app_token<\/code> ve <code>web_client<\/code> parametreleri zorunludur.<\/p>\n<p>4.  <strong>Olay \u0130\u015fleyici Fonksiyon (<code>process_app_mention<\/code>):<\/strong><br \/>\n    *   Bu fonksiyon, botun kendisinden Slack&#8217;te bahsedildi\u011finde (<code>@MyFirstPythonBot merhaba<\/code> gibi) tetiklenir.<br \/>\n    *   <code>req<\/code> parametresi, Slack&#8217;ten gelen olay\u0131n t\u00fcm detaylar\u0131n\u0131 i\u00e7eren bir nesnedir.<br \/>\n    *   <code>req.payload.get(\"event\", {})<\/code> ile olay\u0131n i\u00e7eri\u011fine eri\u015filir.<br \/>\n    *   <code>channel_id<\/code> ve <code>user_id<\/code>, olay\u0131n ger\u00e7ekle\u015fti\u011fi kanal ve olay\u0131 tetikleyen kullan\u0131c\u0131n\u0131n ID&#8217;sidir.<br \/>\n    *   <code>web_client.chat_postMessage(...)<\/code> kullan\u0131larak <code>channel_id<\/code>&#8216;ye bir mesaj g\u00f6nderilir. Mesajda, <code>user_id<\/code> ile kullan\u0131c\u0131dan bahsedilir (<code><@{user_id}><\/code>).<\/p>\n<p>5.  <strong>Olay\u0131 Dinleme ve Botu Ba\u015flatma:<\/strong><br \/>\n    *   <code>socket_mode_client.events_api.on(\"app_mention\", process_app_mention)<\/code>: <code>SocketModeClient<\/code>&#8216;a, &#8220;app\\_mention&#8221; t\u00fcr\u00fcndeki bir olay geldi\u011finde <code>process_app_mention<\/code> fonksiyonunu \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 s\u00f6yler.<br \/>\n    *   <code>socket_mode_client.connect()<\/code>: Botu Slack sunucusuna ba\u011flar.<br \/>\n    *   <code>socket_mode_client.start()<\/code>: Botu dinleme modunda ba\u015flat\u0131r ve program\u0131n \u00e7al\u0131\u015fmaya devam etmesini sa\u011flar.<\/p>\n<h3>Botu \u00c7al\u0131\u015ft\u0131rma ve Test Etme<\/h3>\n<p>Art\u0131k kodunuz haz\u0131r oldu\u011funa g\u00f6re, botunuzu \u00e7al\u0131\u015ft\u0131rabilir ve Slack \u00e7al\u0131\u015fma alan\u0131n\u0131zda test edebilirsiniz.<\/p>\n<p>1.  <strong>Botu \u00c7al\u0131\u015ft\u0131rma:<\/strong><br \/>\n    Sanal ortam\u0131n\u0131z\u0131n etkin oldu\u011fundan emin olun ve proje dizininizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">python app.py<\/code><\/pre>\n<p>    Terminalinizde &#8220;Bot ba\u015flat\u0131l\u0131yor&#8230;&#8221; ve ard\u0131ndan &#8220;INFO&#8221; seviyesinde log mesajlar\u0131 g\u00f6rmelisiniz. Bu, botunuzun ba\u015far\u0131yla ba\u015flad\u0131\u011f\u0131 ve Slack&#8217;ten olaylar\u0131 dinledi\u011fi anlam\u0131na gelir.<\/p>\n<p>2.  <strong>Slack&#8217;te Test Etme:<\/strong><br \/>\n    *   Slack \u00e7al\u0131\u015fma alan\u0131n\u0131z\u0131 a\u00e7\u0131n.<br \/>\n    *   Botunuzu ekledi\u011finiz bir kanala gidin (veya botunuzu bir kanala davet edin). Botunuzun kanal \u00fcyesi olmas\u0131 gerekir.<br \/>\n    *   Botunuzdan bahsederek bir mesaj g\u00f6nderin: <code>@MyFirstPythonBot merhaba<\/code> (Botunuzun ad\u0131n\u0131 do\u011fru yazd\u0131\u011f\u0131n\u0131zdan emin olun).<br \/>\n    *   Botunuzun size &#8220;Merhaba <@kullan\u0131c\u0131_ad\u0131>! Ben ilk Python botunuzum.&#8221; \u015feklinde yan\u0131t vermesi gerekir.<\/p>\n<p>E\u011fer botunuz yan\u0131t vermezse, terminaldeki log mesajlar\u0131n\u0131 kontrol edin. Hata mesajlar\u0131, sorunun kayna\u011f\u0131n\u0131 anlaman\u0131za yard\u0131mc\u0131 olabilir.<\/p>\n<h3>Botu Geli\u015ftirme: Daha Fazla \u00d6zellik<\/h3>\n<p>\u0130lk basit botunuzu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131za g\u00f6re, onu daha ak\u0131ll\u0131 ve kullan\u0131\u015fl\u0131 hale getirmek i\u00e7in baz\u0131 ek \u00f6zellikler ekleyelim.<\/p>\n<h4>Farkl\u0131 Olaylar\u0131 Dinleme (\u00d6rne\u011fin, <code>message<\/code> Olay\u0131)<\/h4>\n<p>Botunuz sadece kendisinden bahsedildi\u011finde de\u011fil, belirli kanallardaki t\u00fcm mesajlar\u0131 da dinleyebilir. Bu, daha genel ama\u00e7l\u0131 botlar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. <code>message<\/code> olay\u0131n\u0131 dinlemek i\u00e7in <code>process_app_mention<\/code> fonksiyonuna benzer yeni bir i\u015fleyici olu\u015fturabiliriz.<\/p>\n<p><code>app.py<\/code> dosyan\u0131za <code>process_message<\/code> ad\u0131nda yeni bir fonksiyon ekleyin:<\/p>\n<pre><code class=\"language-python\"># ... (\u00f6nceki kod) ...\n\ndef process_message(client: SocketModeClient, req):\n    \"\"\"\n    Kanalda g\u00f6nderilen her mesaj i\u00e7in tetiklenen olay i\u015fleyici.\n    \"\"\"\n    event = req.payload.get(\"event\", {})\n    event_type = event.get(\"type\")\n    \n    # Sadece \"message\" olaylar\u0131n\u0131 ve botun kendi mesajlar\u0131n\u0131 g\u00f6z ard\u0131 et\n    if event_type == \"message\" and \"subtype\" not in event and event.get(\"bot_id\") is None:\n        channel_id = event.get(\"channel\")\n        user_id = event.get(\"user\")\n        text = event.get(\"text\")\n        \n        logger.info(f\"Mesaj (Kanal: {channel_id}, Kullan\u0131c\u0131: {user_id}): {text}\")\n\n        # E\u011fer mesaj \"saat ka\u00e7\" i\u00e7eriyorsa, saate yan\u0131t ver\n        if \"saat ka\u00e7\" in text.lower():\n            import datetime\n            now = datetime.datetime.now().strftime(\"%H:%M:%S\")\n            try:\n                web_client.chat_postMessage(\n                    channel=channel_id,\n                    text=f\"\u015eu anki saat: {now}\"\n                )\n                logger.info(f\"Saate yan\u0131t g\u00f6nderildi: {now}\")\n            except Exception as e:\n                logger.error(f\"Saate yan\u0131t g\u00f6nderme hatas\u0131: {e}\")\n\n<h2>... (\u00f6nceki kod) ...<\/h2>\n\n<h2>\"message\" olaylar\u0131n\u0131 dinlemek i\u00e7in handler'\u0131 ekle<\/h2>\nsocket_mode_client.events_api.on(\"message\", process_message)\n\nlogger.info(\"Bot ba\u015flat\u0131l\u0131yor...\")\n<h2>... (kalan kod) ...<\/code><\/pre>\n<\/h2>\n<p>Bu kod par\u00e7as\u0131, e\u011fer bir mesaj &#8220;saat ka\u00e7&#8221; ifadesini i\u00e7eriyorsa, botun o anki saati yan\u0131t olarak g\u00f6ndermesini sa\u011flar. <code>subtype not in event<\/code> kontrol\u00fc, mesaj\u0131n bir dosya y\u00fcklemesi veya kanal kat\u0131l\u0131m\u0131 gibi \u00f6zel bir t\u00fcr olmad\u0131\u011f\u0131n\u0131 garanti ederken, <code>event.get(\"bot_id\") is None<\/code> kontrol\u00fc botun kendi mesajlar\u0131n\u0131 i\u015flemesini engeller, b\u00f6ylece sonsuz d\u00f6ng\u00fclerin \u00f6n\u00fcne ge\u00e7ilir.<\/p>\n<h4>Kullan\u0131c\u0131 Girdisini \u0130\u015fleme (Regex Kullanarak)<\/h4>\n<p>Botunuzun daha karma\u015f\u0131k komutlar\u0131 anlamas\u0131 i\u00e7in d\u00fczenli ifadeler (regex) kullanabilirsiniz. \u00d6rne\u011fin, bir hava durumu botu i\u00e7in &#8220;hava durumu Ankara&#8221; gibi bir komutu ayr\u0131\u015ft\u0131rmak isteyebilirsiniz.<\/p>\n<p><code>process_message<\/code> fonksiyonunu a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim, b\u00f6ylece &#8220;hava durumu [\u015fehir]&#8221; komutunu i\u015fleyebilir:<\/p>\n<pre><code class=\"language-python\">import re # D\u00fczenli ifadeler i\u00e7in\n<h2>... (\u00f6nceki kod) ...<\/h2>\n\ndef process_message(client: SocketModeClient, req):\n    event = req.payload.get(\"event\", {})\n    event_type = event.get(\"type\")\n    \n    if event_type == \"message\" and \"subtype\" not in event and event.get(\"bot_id\") is None:\n        channel_id = event.get(\"channel\")\n        user_id = event.get(\"user\")\n        text = event.get(\"text\")\n        \n        logger.info(f\"Mesaj (Kanal: {channel_id}, Kullan\u0131c\u0131: {user_id}): {text}\")\n\n        # E\u011fer mesaj \"saat ka\u00e7\" i\u00e7eriyorsa, saate yan\u0131t ver\n        if \"saat ka\u00e7\" in text.lower():\n            import datetime\n            now = datetime.datetime.now().strftime(\"%H:%M:%S\")\n            try:\n                web_client.chat_postMessage(\n                    channel=channel_id,\n                    text=f\"\u015eu anki saat: {now}\"\n                )\n                logger.info(f\"Saate yan\u0131t g\u00f6nderildi: {now}\")\n            except Exception as e:\n                logger.error(f\"Saate yan\u0131t g\u00f6nderme hatas\u0131: {e}\")\n\n        # Hava durumu komutunu i\u015fle\n        weather_pattern = re.compile(r\"hava durumu (\\w+)\", re.IGNORECASE)\n        match = weather_pattern.search(text)\n\n        if match:\n            city = match.group(1)\n            # Burada ger\u00e7ek bir hava durumu API'si ile entegrasyon yap\u0131labilir.\n            # \u015eimdilik basit bir mock yan\u0131t g\u00f6nderelim.\n            try:\n                web_client.chat_postMessage(\n                    channel=channel_id,\n                    text=f\"{city} i\u00e7in hava durumu bilgisini getiriyorum... (Bu \u00f6zellik hen\u00fcz tam de\u011fil)\"\n                )\n                logger.info(f\"Hava durumu iste\u011fi al\u0131nd\u0131: {city}\")\n            except Exception as e:\n                logger.error(f\"Hava durumu yan\u0131t\u0131 g\u00f6nderme hatas\u0131: {e}\")<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>re.compile()<\/code> ile bir d\u00fczenli ifade deseni olu\u015fturulur ve <code>weather_pattern.search(text)<\/code> ile gelen mesajda bu desen aran\u0131r. E\u011fer bir e\u015fle\u015fme bulunursa, <code>match.group(1)<\/code> ile \u015fehir ad\u0131 yakalan\u0131r ve bot buna g\u00f6re yan\u0131t verir.<\/p>\n<h4>Block Kit ile Daha Zengin Mesajlar G\u00f6nderme<\/h4>\n<p>Slack&#8217;in Block Kit&#8217;i, botunuzun daha g\u00f6rsel ve etkile\u015fimli mesajlar g\u00f6ndermesini sa\u011flar. D\u00fc\u011fmeler, resimler, se\u00e7im men\u00fcleri gibi UI bile\u015fenlerini kullanarak kullan\u0131c\u0131 deneyimini zenginle\u015ftirebilirsiniz.<\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rnekte, bir d\u00fc\u011fme i\u00e7eren bir mesaj nas\u0131l g\u00f6nderilir g\u00f6sterilmi\u015ftir. Bu, <code>process_app_mention<\/code> veya <code>process_message<\/code> fonksiyonlar\u0131n\u0131zda kullan\u0131labilir.<\/p>\n<pre><code class=\"language-python\"># ... (\u00f6nceki kod) ...\n\ndef process_app_mention(client: SocketModeClient, req):\n    event = req.payload.get(\"event\", {})\n    event_type = event.get(\"type\")\n    \n    if event_type == \"app_mention\":\n        channel_id = event.get(\"channel\")\n        user_id = event.get(\"user\")\n        text = event.get(\"text\")\n        \n        logger.info(f\"Kanal: {channel_id}, Kullan\u0131c\u0131: {user_id}, Mesaj: {text}\")\n\n        # Basit bir \"Merhaba!\" yan\u0131t\u0131 g\u00f6nder\n        try:\n            # Block Kit kullanarak daha zengin bir mesaj olu\u015ftur\n            blocks = [\n                {\n                    \"type\": \"section\",\n                    \"text\": {\n                        \"type\": \"mrkdwn\",\n                        \"text\": f\"Merhaba <@{user_id}>! Ben ilk Python botunuzum. Size nas\u0131l yard\u0131mc\u0131 olabilirim?\"\n                    }\n                },\n                {\n                    \"type\": \"actions\",\n                    \"elements\": [\n                        {\n                            \"type\": \"button\",\n                            \"text\": {\n                                \"type\": \"plain_text\",\n                                \"text\": \"Daha Fazla Bilgi\"\n                            },\n                            \"style\": \"primary\",\n                            \"value\": \"more_info_clicked\"\n                        },\n                        {\n                            \"type\": \"button\",\n                            \"text\": {\n                                \"type\": \"plain_text\",\n                                \"text\": \"Yard\u0131m\"\n                            },\n                            \"value\": \"help_clicked\"\n                        }\n                    ]\n                }\n            ]\n\n            web_client.chat_postMessage(\n                channel=channel_id,\n                blocks=blocks # 'text' yerine 'blocks' parametresini kullan\u0131yoruz\n            )\n            logger.info(f\"Block Kit mesaj\u0131 g\u00f6nderildi: Merhaba {user_id}!\")\n        except Exception as e:\n            logger.error(f\"Block Kit mesaj\u0131 g\u00f6nderme hatas\u0131: {e}\")\n\n<h2>... (kalan kod) ...<\/code><\/pre>\n<\/h2>\n<p>Bu kod, kullan\u0131c\u0131dan bahsedildi\u011finde bir metin b\u00f6l\u00fcm\u00fc ve iki d\u00fc\u011fme i\u00e7eren bir mesaj g\u00f6nderir. D\u00fc\u011fmelere t\u0131kland\u0131\u011f\u0131nda, Slack botunuza bir &#8220;interaction&#8221; (etkile\u015fim) olay\u0131 g\u00f6nderir. Bu olaylar\u0131 dinlemek ve i\u015flemek i\u00e7in Slack uygulaman\u0131zda &#8220;Interactivity &#038; Shortcuts&#8221; b\u00f6l\u00fcm\u00fcn\u00fc yap\u0131land\u0131rman\u0131z ve bir &#8220;Request URL&#8221; sa\u011flaman\u0131z gerekir. Ancak Socket Mode kullan\u0131rken, bu etkile\u015fim olaylar\u0131n\u0131 do\u011frudan botunuzda dinleyebilirsiniz:<\/p>\n<pre><code class=\"language-python\"># ... (\u00f6nceki kod) ...\n\nfrom slack_sdk.socket_mode.request import SocketModeRequest\n\n<h2>Etkile\u015fim olaylar\u0131n\u0131 i\u015flemek i\u00e7in yeni bir fonksiyon<\/h2>\ndef process_interaction(client: SocketModeClient, req: SocketModeRequest):\n    if req.type == \"interactive\":\n        payload = req.payload\n        action_id = payload[\"actions\"][0][\"action_id\"] # Veya value'yu kullanabilirsiniz\n        user_id = payload[\"user\"][\"id\"]\n        channel_id = payload[\"channel\"][\"id\"]\n        \n        logger.info(f\"Etkile\u015fim olay\u0131 al\u0131nd\u0131: Kullan\u0131c\u0131 {user_id}, Aksiyon: {action_id}\")\n\n        if action_id == \"more_info_clicked\": # E\u011fer d\u00fc\u011fmelerin action_id'si varsa\n            try:\n                web_client.chat_postMessage(\n                    channel=channel_id,\n                    text=f\"<@{user_id}>, daha fazla bilgi istediniz! \u0130\u015fte size baz\u0131 kaynaklar...\"\n                )\n            except Exception as e:\n                logger.error(f\"Etkile\u015fim yan\u0131t\u0131 g\u00f6nderme hatas\u0131: {e}\")\n        \n        # Etkile\u015fim iste\u011fini onaylamak i\u00e7in\n        client.send_response(req=req, payload={\"status\": \"ok\"})\n\n<h2>... (kalan kod) ...<\/h2>\n\n<h2>Etkile\u015fim olaylar\u0131n\u0131 dinlemek i\u00e7in handler'\u0131 ekle<\/h2>\nsocket_mode_client.socket_mode_request_listeners.append(process_interaction)\n\nlogger.info(\"Bot ba\u015flat\u0131l\u0131yor...\")\n<h2>... (kalan kod) ...<\/code><\/pre>\n<\/h2>\n<p>Bu \u00f6rnekte, <code>socket_mode_client.socket_mode_request_listeners.append(process_interaction)<\/code> sat\u0131r\u0131 ile <code>process_interaction<\/code> fonksiyonu, Socket Mode \u00fczerinden gelen t\u00fcm interaktif istekleri dinlemek \u00fczere kaydedilir. <code>req.payload<\/code> i\u00e7indeki <code>actions<\/code> dizisinden d\u00fc\u011fme t\u0131klama olay\u0131n\u0131n <code>action_id<\/code>&#8216;sine eri\u015filebilir.<\/p>\n<h3>Botu Da\u011f\u0131tma<\/h3>\n<p>Botunuzu geli\u015ftirme ortam\u0131n\u0131zda \u00e7al\u0131\u015ft\u0131rmak harika, ancak onu s\u00fcrekli olarak kullan\u0131labilir hale getirmek i\u00e7in bir sunucuya veya bulut platformuna da\u011f\u0131tman\u0131z gerekir. <code>SocketModeClient<\/code> kullanman\u0131n avantaj\u0131, herkese a\u00e7\u0131k bir HTTP u\u00e7 noktas\u0131na ihtiyac\u0131n\u0131z olmamas\u0131d\u0131r, bu da da\u011f\u0131t\u0131m\u0131 basitle\u015ftirir.<\/p>\n<p>#### Da\u011f\u0131t\u0131m Se\u00e7enekleri<\/p>\n<p>1.  <strong>Kendi Sunucunuzda:<\/strong> Botunuzu bir Linux sunucusunda veya sanal makinede \u00e7al\u0131\u015ft\u0131rmak en do\u011frudan yoldur.<br \/>\n    *   Sunucunuza Python&#8217;\u0131 ve gerekli k\u00fct\u00fcphaneleri kurun (<code>pip install slack_sdk python-dotenv<\/code>).<br \/>\n    *   <code>.env<\/code> dosyan\u0131z\u0131 sunucuya y\u00fckleyin (ancak s\u00fcr\u00fcm kontrol\u00fcyle de\u011fil, g\u00fcvenli bir \u015fekilde).<br \/>\n    *   Botunuzu bir <code>systemd<\/code> servisi veya <code>screen<\/code>\/<code>tmux<\/code> gibi bir ara\u00e7la arka planda \u00e7al\u0131\u015ft\u0131r\u0131n, b\u00f6ylece terminal oturumunuz kapansa bile \u00e7al\u0131\u015fmaya devam eder.<\/p>\n<p>2.  <strong>Bulut Platformlar\u0131 (Heroku, Render, AWS EC2\/ECS, Google Cloud Run):<\/strong> Bu platformlar, uygulaman\u0131z\u0131 y\u00f6netmeyi ve \u00f6l\u00e7eklendirmeyi kolayla\u015ft\u0131r\u0131r. <code>SocketModeClient<\/code> ile \u00e7al\u0131\u015f\u0131rken, temelde uygulaman\u0131z\u0131 normal bir Python beti\u011fi gibi \u00e7al\u0131\u015ft\u0131rman\u0131z yeterlidir.<br \/>\n    *   <strong>Heroku\/Render:<\/strong> Bu platformlar genellikle <code>Procfile<\/code> adl\u0131 bir dosya gerektirir. <code>Procfile<\/code> dosyan\u0131zda botunuzu nas\u0131l ba\u015flataca\u011f\u0131n\u0131z\u0131 belirtirsiniz:<\/p>\n<pre><code class=\"language-\">worker: python app.py<\/code><\/pre>\n<p>        Ard\u0131ndan, <code>.env<\/code> dosyan\u0131zdaki ortam de\u011fi\u015fkenlerini platformun kendi yap\u0131land\u0131rma de\u011fi\u015fkenleri (Heroku&#8217;da Config Vars, Render&#8217;da Environment Variables) olarak ayarlaman\u0131z gerekir.<br \/>\n    *   <strong>Docker:<\/strong> Uygulaman\u0131z\u0131 bir Docker konteynerine paketleyerek herhangi bir Docker uyumlu ortamda (AWS ECS, Google Cloud Run, Kubernetes) kolayca da\u011f\u0131tabilirsiniz.<\/p>\n<p>#### G\u00fcvenlik Hususlar\u0131<\/p>\n<p>*   <strong>Token&#8217;lar\u0131 Gizli Tutma:<\/strong> Bot token&#8217;lar\u0131n\u0131z ve uygulama token&#8217;lar\u0131n\u0131z, botunuzun Slack&#8217;teki kimlik kartlar\u0131d\u0131r. Asla genel depolarda (GitHub gibi) payla\u015fmay\u0131n. <code>.env<\/code> dosyalar\u0131 ve platformlar\u0131n ortam de\u011fi\u015fkeni mekanizmalar\u0131 bunun i\u00e7in tasarlanm\u0131\u015ft\u0131r.<br \/>\n*   <strong>Yetki Minimumu:<\/strong> Botunuza yaln\u0131zca ihtiya\u00e7 duydu\u011fu kapsamlar\u0131 (scopes) verin. Gereksiz yetkiler vermek, g\u00fcvenlik risklerini art\u0131rabilir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular ve Sorun Giderme<\/h3>\n<p>Bot geli\u015ftirme s\u00fcrecinde kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcmleri:<\/p>\n<p>*   <strong>Botum yan\u0131t vermiyor, neden?<\/strong><br \/>\n    *   <strong>Token&#8217;lar\u0131 kontrol edin:<\/strong> <code>.env<\/code> dosyan\u0131zdaki <code>SLACK_BOT_TOKEN<\/code> ve <code>SLACK_APP_TOKEN<\/code> de\u011ferlerinin do\u011fru oldu\u011fundan emin olun. Slack API sayfas\u0131ndan tekrar kontrol edin.<br \/>\n    *   <strong>Botunuzun \u00e7evrimi\u00e7i oldu\u011fundan emin olun:<\/strong> Terminalinizde <code>python app.py<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda herhangi bir hata mesaj\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol edin. Botunuzun ba\u015flat\u0131ld\u0131\u011f\u0131na dair loglar\u0131 g\u00f6rmelisiniz.<br \/>\n    *   <strong>Botunuz kanalda m\u0131?<\/strong> Botunuzu test etti\u011finiz kanala davet etti\u011finizden emin olun (<code>\/invite @MyFirstPythonBot<\/code>).<br \/>\n    *   <strong>Kapsamlar\u0131 kontrol edin:<\/strong> Botunuzun mesajlar\u0131 okumak ve g\u00f6ndermek i\u00e7in gerekli <code>app_mentions:read<\/code> ve <code>chat:write<\/code> gibi yetkilere sahip oldu\u011fundan emin olun. Slack uygulaman\u0131z\u0131n &#8220;OAuth &#038; Permissions&#8221; sayfas\u0131n\u0131 kontrol edin. Yetkileri de\u011fi\u015ftirdiyseniz, uygulamay\u0131 \u00e7al\u0131\u015fma alan\u0131na yeniden y\u00fcklemeniz gerekebilir.<br \/>\n    *   <strong>Olay i\u015fleyici hatas\u0131:<\/strong> <code>process_app_mention<\/code> veya <code>process_message<\/code> gibi i\u015fleyici fonksiyonlar\u0131n\u0131zda bir hata olabilir. Terminaldeki hata loglar\u0131n\u0131 dikkatlice inceleyin.<br \/>\n    *   <strong>Socket Mode ba\u011flant\u0131s\u0131:<\/strong> Botunuzun Slack Socket Mode sunucusuyla ba\u011flant\u0131 kurabildi\u011finden emin olun. A\u011f veya g\u00fcvenlik duvar\u0131 sorunlar\u0131 ba\u011flant\u0131y\u0131 engelleyebilir.<\/p>\n<p>*   <strong><code>slack_sdk.errors.SlackApiError: The request to the Slack API failed.<\/code> hatas\u0131 al\u0131yorum.<\/strong><br \/>\n    *   Bu genellikle yanl\u0131\u015f veya s\u00fcresi dolmu\u015f bir token&#8217;dan kaynaklan\u0131r. <code>SLACK_BOT_TOKEN<\/code> de\u011ferini kontrol edin.<br \/>\n    *   Botunuzun belirli bir eylemi ger\u00e7ekle\u015ftirmek i\u00e7in yeterli yetkiye (scope) sahip olmayabilir. \u0130lgili kapsam\u0131 ekledi\u011finizden ve uygulamay\u0131 yeniden y\u00fckledi\u011finizden emin olun.<\/p>\n<p>*   <strong>Ortam de\u011fi\u015fkenleri y\u00fcklenmiyor.<\/strong><br \/>\n    *   <code>python-dotenv<\/code> k\u00fct\u00fcphanesinin y\u00fckl\u00fc oldu\u011fundan emin olun (<code>pip install python-dotenv<\/code>).<br \/>\n    *   <code>.env<\/code> dosyas\u0131n\u0131n <code>app.py<\/code> ile ayn\u0131 dizinde oldu\u011fundan emin olun.<br \/>\n    *   Dosya ad\u0131n\u0131n <code>.env<\/code> oldu\u011fundan ve b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf hassasiyeti olmad\u0131\u011f\u0131ndan emin olun (baz\u0131 sistemlerde).<\/p>\n<p>*   <strong>Botum kendi mesajlar\u0131na yan\u0131t veriyor ve sonsuz d\u00f6ng\u00fcye giriyor.<\/strong><br \/>\n    *   <code>message<\/code> olaylar\u0131n\u0131 i\u015flerken, botun kendi mesajlar\u0131n\u0131 g\u00f6z ard\u0131 etti\u011finizden emin olun. Genellikle <code>event.get(\"bot_id\") is None<\/code> veya <code>event.get(\"subtype\") != \"bot_message\"<\/code> gibi kontrollerle yap\u0131l\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu kapsaml\u0131 rehberde, Python ve <code>slack_sdk<\/code> k\u00fct\u00fcphanesini kullanarak ilk Slack botunuzu nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendiniz. Slack uygulaman\u0131z\u0131 yap\u0131land\u0131rmaktan, gerekli yetkilendirmeleri sa\u011flamaya, Python geli\u015ftirme ortam\u0131n\u0131z\u0131 kurmaya ve Socket Mode kullanarak etkile\u015fimli bot kodunuzu yazmaya kadar t\u00fcm s\u00fcreci ele ald\u0131k. Ayr\u0131ca, botunuzu daha ak\u0131ll\u0131 hale getirmek i\u00e7in farkl\u0131 olaylar\u0131 dinleme, kullan\u0131c\u0131 girdilerini i\u015fleme ve Block Kit ile zengin mesajlar g\u00f6nderme gibi geli\u015fmi\u015f \u00f6zelliklere de de\u011findik.<\/p>\n<p>Art\u0131k temel bir Slack botu olu\u015fturma ve geli\u015ftirme becerilerine sahipsiniz. Bu bilgi birikimiyle, Slack \u00e7al\u0131\u015fma alan\u0131n\u0131zdaki g\u00fcnl\u00fck g\u00f6revleri otomatikle\u015ftirebilir, ekibinizin i\u015f ak\u0131\u015flar\u0131n\u0131 iyile\u015ftirebilir veya sadece e\u011flenceli ve interaktif ara\u00e7lar yaratabilirsiniz. Bot geli\u015ftirme d\u00fcnyas\u0131 olduk\u00e7a geni\u015ftir ve Slack API&#8217;si say\u0131s\u0131z entegrasyon ve otomasyon olana\u011f\u0131 sunar.<\/p>\n<p>Gelecekteki ad\u0131mlar\u0131n\u0131z aras\u0131nda \u015funlar olabilir:<\/p>\n<p>*   <strong>Daha fazla Slack API \u00f6zelli\u011fi ke\u015ffetme:<\/strong> Modals, Shortcuts, Slash Commands gibi \u00f6zelliklerle botunuzu daha etkile\u015fimli hale getirin.<br \/>\n*   <strong>Harici API&#8217;larla entegrasyon:<\/strong> Hava durumu, d\u00f6viz kurlar\u0131, proje y\u00f6netimi ara\u00e7lar\u0131 veya \u015firket i\u00e7i sistemler gibi di\u011fer hizmetlerle botunuzu ba\u011flay\u0131n.<br \/>\n*   <strong>Veritaban\u0131 entegrasyonu:<\/strong> Botunuzun kal\u0131c\u0131 verileri saklamas\u0131 ve almas\u0131 i\u00e7in bir veritaban\u0131 (SQLite, PostgreSQL vb.) kullan\u0131n.<br \/>\n*   <strong>Asenkron i\u015flemler:<\/strong> Botunuzun ayn\u0131 anda birden fazla iste\u011fi i\u015flemesini sa\u011flamak i\u00e7in <code>asyncio<\/code> gibi asenkron programlama tekniklerini ara\u015ft\u0131r\u0131n.<br \/>\n*   <strong>Test ve hata ay\u0131klama:<\/strong> Botunuzun kararl\u0131 \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in otomatik testler yaz\u0131n ve daha geli\u015fmi\u015f hata ay\u0131klama tekniklerini \u00f6\u011frenin.<\/p>\n<p>Slack botlar\u0131, dijital \u00e7al\u0131\u015fma alan\u0131n\u0131z\u0131 ki\u015fiselle\u015ftirmenin ve \u00fcretkenli\u011fi art\u0131rman\u0131n g\u00fc\u00e7l\u00fc bir yoludur. Python&#8217;\u0131n esnekli\u011fi ve <code>slack_sdk<\/code>&#8216;n\u0131n sa\u011flad\u0131\u011f\u0131 kolayl\u0131k sayesinde, kendi \u00f6zel botlar\u0131n\u0131z\u0131 olu\u015fturmak hi\u00e7 bu kadar eri\u015filebilir olmam\u0131\u015ft\u0131. \u0130yi kodlamalar!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber Slack, modern ekiplerin ileti\u015fim kurma ve i\u015fbirli\u011fi yapma bi\u00e7imini de\u011fi\u015ftiren g\u00fc\u00e7l\u00fc bir platformdur.","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":[1403],"tags":[],"class_list":{"0":"post-40400","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","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 ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m 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-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-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 ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber Slack, modern ekiplerin ileti\u015fim kurma ve i\u015fbirli\u011fi yapma bi\u00e7imini de\u011fi\u015ftiren g\u00fc\u00e7l\u00fc bir platformdur.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-26T15:41:03+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=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-02-26T15:41:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/\"},\"wordCount\":3033,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/\",\"name\":\"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-26T15:41:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m 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 ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m 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-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber","og_description":"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber Slack, modern ekiplerin ileti\u015fim kurma ve i\u015fbirli\u011fi yapma bi\u00e7imini de\u011fi\u015ftiren g\u00fc\u00e7l\u00fc bir platformdur.","og_url":"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-26T15:41:03+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber","datePublished":"2026-02-26T15:41:03+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/"},"wordCount":3033,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/","name":"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-26T15:41:03+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-ilk-slack-botunuzu-insa-etmek-adim-adim-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python ile \u0130lk Slack Botunuzu \u0130n\u015fa Etmek: Ad\u0131m Ad\u0131m 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\/40400","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=40400"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40400\/revisions"}],"predecessor-version":[{"id":40401,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40400\/revisions\/40401"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=40400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=40400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=40400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}