{"id":39172,"date":"2026-02-15T22:00:40","date_gmt":"2026-02-15T19:00:40","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/"},"modified":"2026-02-15T22:00:40","modified_gmt":"2026-02-15T19:00:40","slug":"java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/","title":{"rendered":"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131"},"content":{"rendered":"<h2>Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131<\/h2>\n<p>Telegram botlar\u0131, kullan\u0131c\u0131larla etkile\u015fim kurman\u0131n ve \u00e7e\u015fitli otomasyon g\u00f6revlerini yerine getirmenin g\u00fc\u00e7l\u00fc bir yolunu sunar. Mevcut bir\u00e7ok Java Telegram bot k\u00fct\u00fcphanesi olsa da, bazen projenin \u00f6zel ihtiya\u00e7lar\u0131na tam olarak uyan, daha hafif ve \u00fczerinde tam kontrole sahip bir \u00e7\u00f6z\u00fcm geli\u015ftirmek isteyebiliriz. Bu makalede, Java ile minimal bir Telegram bot k\u00fct\u00fcphanesi olu\u015fturman\u0131n temel ad\u0131mlar\u0131n\u0131, \u00f6zellikle de esnek ve geni\u015fletilebilir bir yap\u0131 sa\u011flayan Handler Zinciri Deseni (Chain of Responsibility Pattern) yakla\u015f\u0131m\u0131n\u0131 kullanarak inceleyece\u011fiz.<\/p>\n<h3>Telegram Bot API ve Temel Kavramlar<\/h3>\n<p>Telegram Bot API, geli\u015ftiricilerin botlar\u0131n\u0131 Telegram platformuyla entegre etmelerini sa\u011flayan bir HTTP tabanl\u0131 aray\u00fczd\u00fcr. Botunuzun kullan\u0131c\u0131larla etkile\u015fim kurabilmesi i\u00e7in bu API&#8217;yi anlamak kritik \u00f6neme sahiptir.<\/p>\n<h4>Bot API&#8217;ye Genel Bak\u0131\u015f<\/h4>\n<p>Telegram Bot API, RESTful prensiplere dayan\u0131r ve HTTPS \u00fczerinden istekler al\u0131r. Botunuz, API&#8217;ye belirli metodlar\u0131 \u00e7a\u011f\u0131rarak mesaj g\u00f6nderebilir, kullan\u0131c\u0131 bilgilerini alabilir veya dosya y\u00fckleyebilir. Her bot, benzersiz bir token ile tan\u0131mlan\u0131r ve t\u00fcm API istekleri bu token ile kimlik do\u011frulamas\u0131 gerektirir.<\/p>\n<h4>G\u00fcncelleme T\u00fcrleri ve Mesaj Nesnesi<\/h4>\n<p>Kullan\u0131c\u0131lar botunuzla etkile\u015fime ge\u00e7ti\u011finde (mesaj g\u00f6nderme, komut kullanma, inline sorgu vb.), Telegram sunucular\u0131 botunuza &#8220;g\u00fcncelleme&#8221; (update) g\u00f6nderir. Her g\u00fcncelleme, bir JSON nesnesi olarak gelir ve i\u00e7inde bir veya daha fazla olay t\u00fcr\u00fcn\u00fc bar\u0131nd\u0131rabilir (\u00f6rne\u011fin, <code>message<\/code>, <code>edited_message<\/code>, <code>callback_query<\/code>). En yayg\u0131n g\u00fcncelleme t\u00fcr\u00fc olan <code>message<\/code> nesnesi, g\u00f6nderen, al\u0131c\u0131, metin, tarih gibi bilgileri i\u00e7erir.<\/p>\n<pre><code>\n{\n  \"update_id\": 123456789,\n  \"message\": {\n    \"message_id\": 1,\n    \"from\": {\n      \"id\": 123456789,\n      \"is_bot\": false,\n      \"first_name\": \"Kullan\u0131c\u0131\",\n      \"username\": \"kullanici_adi\"\n    },\n    \"chat\": {\n      \"id\": 123456789,\n      \"first_name\": \"Kullan\u0131c\u0131\",\n      \"username\": \"kullanici_adi\",\n      \"type\": \"private\"\n    },\n    \"date\": 1678886400,\n    \"text\": \"\/start\"\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Webhook ve Long Polling<\/h4>\n<p>Botunuzun gelen g\u00fcncellemeleri almas\u0131n\u0131n iki ana yolu vard\u0131r:<\/p>\n<ul>\n<li><strong>Long Polling:<\/strong> Botunuz, belirli aral\u0131klarla Telegram API'ye g\u00fcncellemeler i\u00e7in istek g\u00f6nderir. Yeni bir g\u00fcncelleme varsa, API bunu hemen d\u00f6nd\u00fcr\u00fcr; yoksa, belirli bir s\u00fcre bekler ve yeni bir g\u00fcncelleme geldi\u011finde veya zaman a\u015f\u0131m\u0131 doldu\u011funda yan\u0131t verir. Minimal k\u00fct\u00fcphanemiz i\u00e7in genellikle daha basit bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/li>\n<li><strong>Webhook:<\/strong> Telegram, yeni g\u00fcncellemeler oldu\u011funda botunuzun belirledi\u011fi bir URL'ye HTTP POST iste\u011fi g\u00f6nderir. Bu y\u00f6ntem daha h\u0131zl\u0131 ve ger\u00e7ek zamanl\u0131d\u0131r ancak botunuzun d\u0131\u015far\u0131dan eri\u015filebilir bir sunucuda \u00e7al\u0131\u015fmas\u0131n\u0131 gerektirir.<\/li>\n<\/ul>\n<h4>Temel Bot Komutlar\u0131<\/h4>\n<p>Telegram botlar\u0131 genellikle <code>\/start<\/code>, <code>\/help<\/code> gibi komutlarla etkile\u015fime ba\u015flar. Bu komutlar, kullan\u0131c\u0131n\u0131n mesaj metninin ba\u015f\u0131nda bir e\u011fik \u00e7izgi (\/) ile ba\u015flayan \u00f6zel bir bi\u00e7ime sahip olmas\u0131yla tan\u0131n\u0131r. Botunuz, bu komutlar\u0131 ayr\u0131\u015ft\u0131rarak belirli i\u015flevleri tetikleyebilir.<\/p>\n<h3>Neden Kendi Minimal K\u00fct\u00fcphanemizi Yazmal\u0131y\u0131z?<\/h3>\n<p>Piyasada zaten bir\u00e7ok kapsaml\u0131 Telegram bot k\u00fct\u00fcphanesi varken, kendi minimal \u00e7\u00f6z\u00fcm\u00fcm\u00fcz\u00fc geli\u015ftirmek baz\u0131 durumlarda avantajl\u0131 olabilir.<\/p>\n<h4>Mevcut K\u00fct\u00fcphanelerin Dezavantajlar\u0131<\/h4>\n<p>B\u00fcy\u00fck k\u00fct\u00fcphaneler genellikle \u00e7ok say\u0131da \u00f6zelli\u011fi ve soyutlamay\u0131 i\u00e7erir. Bu durum, \u00f6\u011frenme e\u011frisini art\u0131rabilir, gereksiz ba\u011f\u0131ml\u0131l\u0131klar getirebilir ve uygulaman\u0131n boyutunu \u015fi\u015firebilir. Bazen, projenin ihtiyac\u0131 olan tek \u015fey basit bir mesaj i\u015fleme mekanizmas\u0131d\u0131r ve bu durumda a\u011f\u0131r bir k\u00fct\u00fcphane a\u015f\u0131r\u0131ya ka\u00e7abilir.<\/p>\n<h4>Kontrol ve Esneklik<\/h4>\n<p>Kendi k\u00fct\u00fcphanenizi yazd\u0131\u011f\u0131n\u0131zda, her bir bile\u015fen \u00fczerinde tam kontrole sahip olursunuz. Bu, uygulaman\u0131z\u0131n tam olarak istedi\u011finiz gibi davranmas\u0131n\u0131 sa\u011flar ve gelecekteki de\u011fi\u015fiklikler veya \u00f6zel entegrasyonlar i\u00e7in maksimum esneklik sunar. \u00d6rne\u011fin, \u00f6zel bir g\u00fcncelleme i\u015fleme mant\u0131\u011f\u0131 veya farkl\u0131 bir HTTP istemcisi kullanmak istedi\u011finizde, mevcut k\u00fct\u00fcphanelerin k\u0131s\u0131tlamalar\u0131na tak\u0131lmazs\u0131n\u0131z.<\/p>\n<h4>\u00d6\u011frenme ve Anlama S\u00fcreci<\/h4>\n<p>S\u0131f\u0131rdan bir k\u00fct\u00fcphane geli\u015ftirmek, Telegram Bot API'sinin ve genel yaz\u0131l\u0131m tasar\u0131m desenlerinin derinlemesine anla\u015f\u0131lmas\u0131n\u0131 sa\u011flar. Bu s\u00fcre\u00e7, sadece bot geli\u015ftirme becerilerinizi de\u011fil, ayn\u0131 zamanda genel yaz\u0131l\u0131m m\u00fchendisli\u011fi bilginizi de geli\u015ftirir. Bir problemi temelden \u00e7\u00f6zmek, soyutlamalar\u0131n arkas\u0131nda yatan mekanizmalar\u0131 kavraman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h4>Performans ve Kaynak Kullan\u0131m\u0131<\/h4>\n<p>Minimal bir k\u00fct\u00fcphane, sadece ihtiya\u00e7 duyulan \u00f6zellikleri i\u00e7erdi\u011fi i\u00e7in daha az bellek t\u00fcketir ve daha h\u0131zl\u0131 \u00e7al\u0131\u015fabilir. Gereksiz \u00f6zelliklerin ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n olmamas\u0131, uygulaman\u0131z\u0131n daha hafif ve verimli olmas\u0131n\u0131 sa\u011flar. \u00d6zellikle k\u0131s\u0131tl\u0131 kaynaklara sahip ortamlarda (\u00f6rne\u011fin, k\u00fc\u00e7\u00fck sunucular veya konteynerler) bu durum \u00f6nemli bir avantaj haline gelebilir.<\/p>\n<h3>Handler Zinciri Deseni Nedir?<\/h3>\n<p>Handler Zinciri Deseni (Chain of Responsibility Pattern), bir iste\u011fi i\u015fleyebilecek nesnelerin bir zincirini olu\u015fturarak, g\u00f6nderen ve al\u0131c\u0131 aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ortadan kald\u0131ran davran\u0131\u015fsal bir tasar\u0131m desenidir.<\/p>\n<h4>Desen Tan\u0131m\u0131 ve Amac\u0131<\/h4>\n<p>Bu desen, bir iste\u011fin birden fazla nesne taraf\u0131ndan i\u015flenebilece\u011fi durumlarda kullan\u0131l\u0131r. Her nesne, iste\u011fi i\u015fleyip i\u015fleyemeyece\u011fini kontrol eder. E\u011fer i\u015fleyebiliyorsa i\u015fler, aksi takdirde iste\u011fi zincirdeki bir sonraki nesneye iletir. Bu, iste\u011fi g\u00f6nderen taraf\u0131n, iste\u011fi kimin i\u015fleyece\u011fini bilmek zorunda kalmamas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>\u00c7al\u0131\u015fma Prensibi<\/h4>\n<p>Handler Zinciri Deseni genellikle \u015fu bile\u015fenlerden olu\u015fur:<\/p>\n<ul>\n<li><strong>Handler Aray\u00fcz\u00fc\/Soyut S\u0131n\u0131f\u0131:<\/strong> \u0130stekleri i\u015flemek i\u00e7in ortak bir aray\u00fcz tan\u0131mlar ve genellikle zincirdeki bir sonraki handler'\u0131 ayarlamak ve iste\u011fi ona iletmek i\u00e7in bir metod i\u00e7erir.<\/li>\n<li><strong>Somut Handler'lar:<\/strong> Handler aray\u00fcz\u00fcn\u00fc uygular ve belirli istek t\u00fcrlerini i\u015flemek i\u00e7in mant\u0131k i\u00e7erir. Ayr\u0131ca, iste\u011fi bir sonraki handler'a iletme sorumlulu\u011funu da ta\u015f\u0131r.<\/li>\n<li><strong>\u0130stemci:<\/strong> Zinciri olu\u015fturur ve iste\u011fi zincirin ilk handler'\u0131na g\u00f6nderir.<\/li>\n<\/ul>\n<p>Bir istek geldi\u011finde, zincirin ba\u015f\u0131ndaki handler'a g\u00f6nderilir. Bu handler, iste\u011fi i\u015fleyip i\u015fleyemedi\u011fine karar verir. E\u011fer i\u015fleyemezse, iste\u011fi zincirdeki bir sonraki handler'a iletir ve bu i\u015flem, istek i\u015flenene veya zincirin sonuna ula\u015f\u0131lana kadar devam eder.<\/p>\n<h4>Avantajlar\u0131 ve Dezavantajlar\u0131<\/h4>\n<p><strong>Avantajlar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Esneklik:<\/strong> Handler'lar\u0131 dinamik olarak ekleyebilir, kald\u0131rabilir veya yeniden s\u0131ralayabilirsiniz.<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131k Azaltma:<\/strong> G\u00f6nderen, iste\u011fi kimin i\u015fleyece\u011fini bilmek zorunda kalmaz.<\/li>\n<li><strong>Geni\u015fletilebilirlik:<\/strong> Yeni handler'lar eklemek kolayd\u0131r, mevcut kodu de\u011fi\u015ftirmeye gerek kalmaz.<\/li>\n<li><strong>Tek Sorumluluk Prensibi:<\/strong> Her handler, belirli bir i\u015fleme sorumlulu\u011funa odaklan\u0131r.<\/li>\n<\/ul>\n<p><strong>Dezavantajlar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Garanti Yok:<\/strong> Bir iste\u011fin i\u015flenece\u011fi garantisi yoktur; zincirin sonuna kadar i\u015flenmeden kalabilir.<\/li>\n<li><strong>Performans:<\/strong> \u00c7ok uzun zincirler veya karma\u015f\u0131k i\u015fleme mant\u0131\u011f\u0131 performans\u0131 etkileyebilir.<\/li>\n<li><strong>Hata Ay\u0131klama:<\/strong> Zincirdeki bir hatay\u0131 bulmak bazen zor olabilir.<\/li>\n<\/ul>\n<h4>Telegram Bot Ba\u011flam\u0131nda Uygulanmas\u0131<\/h4>\n<p>Telegram botlar\u0131nda, her gelen g\u00fcncelleme (\u00f6rne\u011fin, bir mesaj) bir istek olarak d\u00fc\u015f\u00fcn\u00fclebilir. Farkl\u0131 handler'lar, farkl\u0131 mesaj t\u00fcrlerini (metin mesajlar\u0131, komutlar, foto\u011fraf mesajlar\u0131 vb.) veya belirli ko\u015fullar\u0131 (kullan\u0131c\u0131n\u0131n yetkisi, mesaj\u0131n i\u00e7eri\u011fi) i\u015fleyebilir. \u00d6rne\u011fin, bir handler <code>\/start<\/code> komutunu i\u015flerken, di\u011feri <code>\/help<\/code> komutunu i\u015fleyebilir. Bir ba\u015fka handler ise t\u00fcm metin mesajlar\u0131n\u0131 loglayabilir.<\/p>\n<h3>K\u00fct\u00fcphane Mimarisi ve Temel Bile\u015fenler<\/h3>\n<p>Minimal k\u00fct\u00fcphanemizin temelini olu\u015fturacak s\u0131n\u0131flar\u0131 ve aray\u00fczleri tan\u0131mlayal\u0131m. Bu bile\u015fenler, Handler Zinciri Deseni'ni Java'da uygulamak i\u00e7in gerekli yap\u0131 ta\u015flar\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h4><code>Update<\/code> ve <code>Message<\/code> Modelleri<\/h4>\n<p>Telegram API'den gelen JSON yan\u0131tlar\u0131n\u0131 Java nesnelerine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in basit POJO (Plain Old Java Object) s\u0131n\u0131flar\u0131na ihtiyac\u0131m\u0131z var. Bu s\u0131n\u0131flar, sadece gerekli alanlar\u0131 i\u00e7erecek \u015fekilde minimal tutulmal\u0131d\u0131r. \u00d6rne\u011fin, bir <code>Update<\/code> s\u0131n\u0131f\u0131 ve i\u00e7inde bir <code>Message<\/code> s\u0131n\u0131f\u0131 olabilir.<\/p>\n<pre><code>\n\/\/ Update.java\npublic class Update {\n    public long update_id;\n    public Message message;\n    \/\/ Di\u011fer update t\u00fcrleri i\u00e7in gerekli alanlar eklenebilir\n}\n\n\/\/ Message.java\npublic class Message {\n    public long message_id;\n    public User from;\n    public Chat chat;\n    public String text;\n    \/\/ Di\u011fer mesaj t\u00fcrleri i\u00e7in gerekli alanlar eklenebilir\n}\n\n\/\/ User.java\npublic class User {\n    public long id;\n    public String first_name;\n    public String username;\n}\n\n\/\/ Chat.java\npublic class Chat {\n    public long id;\n    public String type;\n    public String first_name;\n    public String username;\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu modelleri JSON'dan Java nesnelerine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in Gson veya Jackson gibi hafif bir JSON k\u00fct\u00fcphanesi kullanabiliriz.<\/p>\n<h4><code>BotHandler<\/code> Aray\u00fcz\u00fc<\/h4>\n<p>Handler Zinciri Deseni'nin kalbi olan <code>BotHandler<\/code> aray\u00fcz\u00fc, t\u00fcm somut handler'lar i\u00e7in ortak bir s\u00f6zle\u015fme tan\u0131mlar. Bu aray\u00fcz, bir g\u00fcncellemenin i\u015flenip i\u015flenemeyece\u011fini kontrol eden ve i\u015fleme mant\u0131\u011f\u0131n\u0131 i\u00e7eren metodlar\u0131 bar\u0131nd\u0131r\u0131r.<\/p>\n<pre><code>\n\/\/ BotHandler.java\npublic interface BotHandler {\n    boolean handle(Update update, TelegramBot bot);\n    void setNext(BotHandler nextHandler);\n    BotHandler getNext();\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>handle<\/code> metodu, bir g\u00fcncelleme nesnesini ve botun kendisini (cevap g\u00f6ndermek i\u00e7in) al\u0131r. E\u011fer handler g\u00fcncellemeyi i\u015flerse <code>true<\/code> d\u00f6ner, aksi takdirde <code>false<\/code> d\u00f6ner ve zincirdeki bir sonraki handler'a ge\u00e7ilmesi gerekti\u011fini belirtir. <code>setNext<\/code> ve <code>getNext<\/code> metodlar\u0131 ise zincir yap\u0131s\u0131n\u0131 kurmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4><code>HandlerChain<\/code> S\u0131n\u0131f\u0131<\/h4>\n<p><code>HandlerChain<\/code> s\u0131n\u0131f\u0131, <code>BotHandler<\/code> aray\u00fcz\u00fcn\u00fc uygulayan handler'lar\u0131 bir araya getiren ve gelen g\u00fcncellemeleri zincir boyunca ileten ana yap\u0131d\u0131r. Bu s\u0131n\u0131f, zincirin y\u00f6netiminden sorumludur.<\/p>\n<pre><code>\n\/\/ AbstractBotHandler.java (Temel bir soyut s\u0131n\u0131f)\npublic abstract class AbstractBotHandler implements BotHandler {\n    protected BotHandler nextHandler;\n\n    @Override\n    public void setNext(BotHandler nextHandler) {\n        this.nextHandler = nextHandler;\n    }\n\n    @Override\n    public BotHandler getNext() {\n        return nextHandler;\n    }\n\n    \/\/ handle metodu somut s\u0131n\u0131flarda uygulanacak\n}\n\n\/\/ HandlerChain.java\npublic class HandlerChain extends AbstractBotHandler {\n    private BotHandler firstHandler;\n    private BotHandler lastHandler;\n\n    public HandlerChain() {\n        this.firstHandler = null;\n        this.lastHandler = null;\n    }\n\n    public void addHandler(BotHandler handler) {\n        if (firstHandler == null) {\n            firstHandler = handler;\n            lastHandler = handler;\n        } else {\n            lastHandler.setNext(handler);\n            lastHandler = handler;\n        }\n    }\n\n    @Override\n    public boolean handle(Update update, TelegramBot bot) {\n        if (firstHandler != null) {\n            return firstHandler.handle(update, bot);\n        }\n        return false; \/\/ Zincirde handler yoksa\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4><code>TelegramBot<\/code> S\u0131n\u0131f\u0131<\/h4>\n<p><code>TelegramBot<\/code> s\u0131n\u0131f\u0131, botun ana kontrol noktas\u0131n\u0131 temsil eder. API isteklerini g\u00f6ndermek, g\u00fcncellemeleri almak ve <code>HandlerChain<\/code>'i tetiklemek gibi g\u00f6revleri \u00fcstlenir. Bu s\u0131n\u0131f, bot token'\u0131n\u0131 tutar ve Telegram API ile ileti\u015fim kurmak i\u00e7in bir HTTP istemcisi kullan\u0131r.<\/p>\n<pre><code>\n\/\/ TelegramBot.java\npublic class TelegramBot {\n    private final String botToken;\n    private final String apiUrl;\n    private final HttpClient httpClient;\n    private final Gson gson;\n    private final HandlerChain handlerChain;\n\n    public TelegramBot(String botToken) {\n        this.botToken = botToken;\n        this.apiUrl = \"https:\/\/api.telegram.org\/bot\" + botToken + \"\/\";\n        this.httpClient = HttpClient.newHttpClient();\n        this.gson = new Gson();\n        this.handlerChain = new HandlerChain();\n    }\n\n    public void addHandler(BotHandler handler) {\n        handlerChain.addHandler(handler);\n    }\n\n    public void sendMessage(long chatId, String text) throws IOException, InterruptedException {\n        String url = apiUrl + \"sendMessage\";\n        Map<String, Object> params = new HashMap<>();\n        params.put(\"chat_id\", chatId);\n        params.put(\"text\", text);\n\n        String jsonBody = gson.toJson(params);\n\n        HttpRequest request = HttpRequest.newBuilder()\n                .uri(URI.create(url))\n                .header(\"Content-Type\", \"application\/json\")\n                .POST(HttpRequest.BodyPublishers.ofString(jsonBody))\n                .build();\n\n        httpClient.send(request, HttpResponse.BodyHandlers.ofString());\n    }\n\n    public void processUpdate(Update update) {\n        handlerChain.handle(update, this);\n    }\n\n    \/\/ Long polling veya webhook i\u00e7in metodlar eklenecek\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Handler Zincirini Olu\u015fturma ve Y\u00f6netme<\/h3>\n<p>K\u00fct\u00fcphanemizin temel bile\u015fenlerini tan\u0131mlad\u0131ktan sonra, \u015fimdi somut handler'lar\u0131 nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ve bunlar\u0131 zincire nas\u0131l ekleyece\u011fimizi inceleyelim.<\/p>\n<h4>Temel <code>BotHandler<\/code> Uygulamalar\u0131<\/h4>\n<p>Farkl\u0131 mesaj t\u00fcrlerini veya komutlar\u0131 i\u015flemek i\u00e7in \u00e7e\u015fitli <code>BotHandler<\/code> uygulamalar\u0131 olu\u015fturabiliriz. Her biri, belirli bir sorumlulu\u011fa odaklanmal\u0131d\u0131r.<\/p>\n<pre><code>\n\/\/ StartCommandHandler.java\npublic class StartCommandHandler extends AbstractBotHandler {\n    @Override\n    public boolean handle(Update update, TelegramBot bot) {\n        if (update.message != null && update.message.text != null && update.message.text.equals(\"\/start\")) {\n            try {\n                bot.sendMessage(update.message.chat.id, \"Merhaba! Botuma ho\u015f geldiniz.\");\n                return true; \/\/ \u0130\u015flendi\n            } catch (IOException | InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n        return nextHandler != null && nextHandler.handle(update, bot); \/\/ Bir sonrakine ilet\n    }\n}\n\n\/\/ EchoTextHandler.java\npublic class EchoTextHandler extends AbstractBotHandler {\n    @Override\n    public boolean handle(Update update, TelegramBot bot) {\n        if (update.message != null && update.message.text != null && !update.message.text.startsWith(\"\/\")) {\n            try {\n                bot.sendMessage(update.message.chat.id, \"Sen dedin ki: \" + update.message.text);\n                return true; \/\/ \u0130\u015flendi\n            } catch (IOException | InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n        return nextHandler != null && nextHandler.handle(update, bot); \/\/ Bir sonrakine ilet\n    }\n}\n\n\/\/ UnknownCommandHandler.java (Zincirin sonu i\u00e7in)\npublic class UnknownCommandHandler extends AbstractBotHandler {\n    @Override\n    public boolean handle(Update update, TelegramBot bot) {\n        if (update.message != null && update.message.text != null && update.message.text.startsWith(\"\/\")) {\n            try {\n                bot.sendMessage(update.message.chat.id, \"Bilinmeyen komut: \" + update.message.text);\n                return true; \/\/ \u0130\u015flendi\n            } catch (IOException | InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n        return false; \/\/ Zincirin sonu, i\u015flenmedi\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Zincire Handler Ekleme<\/h4>\n<p><code>TelegramBot<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131n <code>addHandler<\/code> metodu arac\u0131l\u0131\u011f\u0131yla handler'lar\u0131 zincire ekleyebiliriz. Eklenme s\u0131ras\u0131 \u00f6nemlidir, \u00e7\u00fcnk\u00fc handler'lar bu s\u0131raya g\u00f6re i\u015flenir.<\/p>\n<pre><code>\npublic class MyBotApp {\n    public static void main(String[] args) {\n        String botToken = \"YOUR_BOT_TOKEN\"; \/\/ Bot token'\u0131n\u0131z\u0131 buraya girin\n        TelegramBot bot = new TelegramBot(botToken);\n\n        \/\/ Handler'lar\u0131 ekleme s\u0131ras\u0131 \u00f6nemlidir\n        bot.addHandler(new StartCommandHandler());\n        bot.addHandler(new EchoTextHandler());\n        bot.addHandler(new UnknownCommandHandler()); \/\/ En sona eklenmeli\n        \n        \/\/ Botu ba\u015flatma kodu buraya gelecek\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Handler S\u0131ralamas\u0131 ve \u00d6ncelik<\/h4>\n<p>Handler'lar\u0131n zincire eklenme s\u0131ras\u0131, i\u015fleme \u00f6nceli\u011fini belirler. Daha spesifik veya \u00f6ncelikli olmas\u0131 gereken handler'lar zincirin ba\u015f\u0131na eklenmelidir. \u00d6rne\u011fin, <code>\/start<\/code> gibi belirli bir komutu i\u015fleyen handler, genel metin mesajlar\u0131n\u0131 i\u015fleyen handler'dan \u00f6nce gelmelidir. Aksi takdirde, <code>\/start<\/code> komutu bir \"metin mesaj\u0131\" olarak alg\u0131lan\u0131p yanl\u0131\u015f handler taraf\u0131ndan i\u015flenebilir.<\/p>\n<h4>Ko\u015fullu \u0130\u015fleme Mant\u0131\u011f\u0131<\/h4>\n<p>Her handler'\u0131n <code>handle<\/code> metodu i\u00e7inde, gelen g\u00fcncellemeyi i\u015fleyip i\u015fleyemeyece\u011fine dair ko\u015fullu mant\u0131k bulunur. Bu mant\u0131k, mesaj\u0131n i\u00e7eri\u011fi, g\u00f6nderen ki\u015fi, sohbet t\u00fcr\u00fc gibi bir\u00e7ok fakt\u00f6re dayanabilir. E\u011fer bir handler g\u00fcncellemeyi i\u015flerse, genellikle <code>true<\/code> d\u00f6nd\u00fcrerek zincirdeki di\u011fer handler'lar\u0131n i\u015fleme devam etmesini engeller. Bu, gereksiz i\u015flem y\u00fck\u00fcn\u00fc azalt\u0131r ve istenmeyen yan etkileri \u00f6nler.<\/p>\n<h3>Botu \u00c7al\u0131\u015ft\u0131rma ve Mesajlar\u0131 \u0130\u015fleme<\/h3>\n<p>K\u00fct\u00fcphanemizi ve handler zincirimizi kurduktan sonra, botumuzu nas\u0131l \u00e7al\u0131\u015ft\u0131raca\u011f\u0131m\u0131z\u0131 ve gelen mesajlar\u0131 nas\u0131l i\u015fleyece\u011fimizi ele alal\u0131m.<\/p>\n<h4>G\u00fcncellemeleri \u00c7ekme (Long Polling)<\/h4>\n<p>Minimal k\u00fct\u00fcphanemiz i\u00e7in Long Polling, g\u00fcncellemeleri almak i\u00e7in basit ve etkili bir y\u00f6ntemdir. Botumuz, belirli aral\u0131klarla Telegram API'den g\u00fcncellemeleri \u00e7ekecek bir d\u00f6ng\u00fc i\u00e7inde \u00e7al\u0131\u015f\u0131r.<\/p>\n<pre><code>\n\/\/ TelegramBot.java i\u00e7ine eklenecek metod\npublic void startLongPolling() {\n    long lastUpdateId = 0;\n    System.out.println(\"Bot ba\u015flat\u0131ld\u0131, g\u00fcncellemeler bekleniyor...\");\n\n    while (true) {\n        try {\n            String url = apiUrl + \"getUpdates?offset=\" + (lastUpdateId + 1) + \"&timeout=30\";\n            HttpRequest request = HttpRequest.newBuilder()\n                    .uri(URI.create(url))\n                    .GET()\n                    .build();\n\n            HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());\n            String responseBody = response.body();\n\n            \/\/ JSON ayr\u0131\u015ft\u0131rma\n            GetUpdatesResponse getUpdatesResponse = gson.fromJson(responseBody, GetUpdatesResponse.class);\n\n            if (getUpdatesResponse != null && getUpdatesResponse.ok && getUpdatesResponse.result != null) {\n                for (Update update : getUpdatesResponse.result) {\n                    processUpdate(update); \/\/ Handler zincirini tetikle\n                    lastUpdateId = update.update_id;\n                }\n            }\n            \/\/ K\u0131sa bir bekleme, API'yi yormamak i\u00e7in\n            Thread.sleep(1000); \n\n        } catch (IOException | InterruptedException e) {\n            System.err.println(\"G\u00fcncellemeler al\u0131n\u0131rken hata olu\u015ftu: \" + e.getMessage());\n            try {\n                Thread.sleep(5000); \/\/ Hata durumunda daha uzun bekle\n            } catch (InterruptedException ex) {\n                Thread.currentThread().interrupt();\n            }\n        }\n    }\n}\n\n\/\/ GetUpdatesResponse.java (Yeni POJO)\npublic class GetUpdatesResponse {\n    public boolean ok;\n    public Update[] result;\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>MyBotApp<\/code> s\u0131n\u0131f\u0131m\u0131zda <code>bot.startLongPolling();<\/code> \u00e7a\u011fr\u0131s\u0131yla botu ba\u015flatabiliriz.<\/p>\n<h4>Gelen Mesajlar\u0131 Ayr\u0131\u015ft\u0131rma<\/h4>\n<p><code>getUpdates<\/code> metodundan gelen JSON yan\u0131t\u0131n\u0131, \u00f6nceden tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>Update<\/code> ve <code>Message<\/code> POJO'lar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in Gson veya Jackson gibi bir k\u00fct\u00fcphane kullan\u0131r\u0131z. Bu, Java kodumuzda mesaj verilerine kolayca eri\u015fmemizi sa\u011flar.<\/p>\n<h4>Zinciri Tetikleme<\/h4>\n<p>Her yeni g\u00fcncelleme al\u0131nd\u0131\u011f\u0131nda, <code>TelegramBot<\/code> s\u0131n\u0131f\u0131ndaki <code>processUpdate(Update update)<\/code> metodu \u00e7a\u011fr\u0131l\u0131r. Bu metod, gelen g\u00fcncellemeyi <code>HandlerChain<\/code>'e iletir ve zincirdeki ilk handler'dan ba\u015flayarak i\u015fleme s\u00fcrecini ba\u015flat\u0131r.<\/p>\n<h4>Cevap G\u00f6nderme Mekanizmas\u0131<\/h4>\n<p>Handler'lar, gelen g\u00fcncellemeleri i\u015fledikten sonra kullan\u0131c\u0131lara yan\u0131t g\u00f6ndermek isteyebilir. Bu, <code>TelegramBot<\/code> s\u0131n\u0131f\u0131nda tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>sendMessage(long chatId, String text)<\/code> metodu arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r. Bu metod, Telegram API'sinin <code>sendMessage<\/code> metodunu \u00e7a\u011f\u0131rarak belirtilen sohbet kimli\u011fine mesaj g\u00f6nderir.<\/p>\n<h3>Geli\u015ftirmeyi Geni\u015fletme ve \u0130yile\u015ftirme<\/h3>\n<p>Minimal k\u00fct\u00fcphanemiz temel i\u015flevselli\u011fi sa\u011flasa da, daha g\u00fc\u00e7l\u00fc ve \u00fcretim ortam\u0131na uygun bir bot i\u00e7in baz\u0131 iyile\u015ftirmeler ve geni\u015fletmeler yap\u0131labilir.<\/p>\n<h4>Asenkron \u0130\u015fleme<\/h4>\n<p>Long polling d\u00f6ng\u00fcs\u00fc i\u00e7inde her g\u00fcncellemenin senkronize olarak i\u015flenmesi, yo\u011fun botlarda performans sorunlar\u0131na yol a\u00e7abilir. Her g\u00fcncellemeyi ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131nda (thread) veya bir i\u015f kuyru\u011funda (thread pool) asenkron olarak i\u015flemek, botun daha h\u0131zl\u0131 yan\u0131t vermesini ve birden fazla g\u00fcncellemeyi e\u015f zamanl\u0131 olarak i\u015flemesini sa\u011flar. Java'n\u0131n <code>ExecutorService<\/code> veya <code>CompletableFuture<\/code> yap\u0131lar\u0131 bu ama\u00e7la kullan\u0131labilir.<\/p>\n<pre><code>\n\/\/ TelegramBot.java i\u00e7inde\nprivate final ExecutorService executorService = Executors.newFixedThreadPool(10); \/\/ \u00d6rne\u011fin 10 i\u015f par\u00e7ac\u0131\u011f\u0131\n\npublic void processUpdateAsync(Update update) {\n    executorService.submit(() -> handlerChain.handle(update, this));\n}\n\n\/\/ startLongPolling metodunda processUpdate yerine processUpdateAsync \u00e7a\u011fr\u0131l\u0131r.\n<\/pre>\n<p><\/code><\/p>\n<h4>Veritaban\u0131 Entegrasyonu<\/h4>\n<p>Botunuzun kullan\u0131c\u0131 verilerini, sohbet ge\u00e7mi\u015fini veya \u00f6zel ayarlar\u0131 saklamas\u0131 gerekti\u011finde bir veritaban\u0131 entegrasyonu \u015fartt\u0131r. PostgreSQL, MySQL veya MongoDB gibi veritabanlar\u0131 kullan\u0131labilir. Handler'lar, veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirmek i\u00e7in bir Repository veya DAO (Data Access Object) katman\u0131yla etkile\u015fime girebilir.<\/p>\n<h4>Hata Y\u00f6netimi ve Loglama<\/h4>\n<p>\u00dcretim ortam\u0131nda \u00e7al\u0131\u015fan bir botun sa\u011flam bir hata y\u00f6netimi ve loglama mekanizmas\u0131na sahip olmas\u0131 gerekir. Log4j2 veya SLF4J gibi loglama k\u00fct\u00fcphaneleri kullanarak botun davran\u0131\u015f\u0131n\u0131, gelen g\u00fcncellemeleri, API hatalar\u0131n\u0131 ve i\u015fleme hatalar\u0131n\u0131 kaydedebiliriz. Handler'lar i\u00e7inde try-catch bloklar\u0131 kullanarak hatalar\u0131 yakalamak ve uygun \u015fekilde loglamak \u00f6nemlidir.<\/p>\n<h4>Komut Tabanl\u0131 Handler'lar<\/h4>\n<p>Daha karma\u015f\u0131k botlar i\u00e7in, sadece <code>\/start<\/code> gibi basit komutlar\u0131 de\u011fil, ayn\u0131 zamanda <code>\/ayarlar dil T\u00fcrk\u00e7e<\/code> gibi arg\u00fcman alan komutlar\u0131 da i\u015fleyebilen daha geli\u015fmi\u015f komut ayr\u0131\u015ft\u0131rma handler'lar\u0131 olu\u015fturulabilir. Bu, komutlar\u0131 daha esnek hale getirir ve botun daha zengin etkile\u015fimler sunmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Java ile minimal bir Telegram bot k\u00fct\u00fcphanesi olu\u015fturmak, sadece Telegram Bot API'sini de\u011fil, ayn\u0131 zamanda yaz\u0131l\u0131m tasar\u0131m desenlerini ve genel Java programlama prensiplerini de derinlemesine anlamak i\u00e7in harika bir yoldur. Handler Zinciri Deseni'ni kullanarak, botunuzun mesaj i\u015fleme mant\u0131\u011f\u0131n\u0131 esnek, geni\u015fletilebilir ve y\u00f6netilebilir bir \u015fekilde tasarlayabilirsiniz. Bu yakla\u015f\u0131m, projenizin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re \u00f6zelle\u015ftirilmi\u015f, hafif ve performansl\u0131 bir \u00e7\u00f6z\u00fcm sunar. Kendi k\u00fct\u00fcphanenizi geli\u015ftirmek, size tam kontrol ve esneklik sa\u011flayarak, botunuzu gelecekteki gereksinimlere kolayca adapte etme imkan\u0131 verir.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<p><strong>1. Neden haz\u0131r k\u00fct\u00fcphaneler yerine kendi minimal k\u00fct\u00fcphanemizi yazmal\u0131y\u0131z?<\/strong><\/p>\n<p>Kendi k\u00fct\u00fcphanenizi yazmak, size tam kontrol ve esneklik sa\u011flar. Gereksiz ba\u011f\u0131ml\u0131l\u0131klardan ka\u00e7\u0131narak daha hafif ve performansl\u0131 bir uygulama olu\u015fturabilirsiniz. Ayr\u0131ca, bu s\u00fcre\u00e7 Telegram API'sini ve tasar\u0131m desenlerini daha iyi anlaman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<p><strong>2. Handler Zinciri Deseni ba\u015fka nerede kullan\u0131labilir?<\/strong><\/p>\n<p>Handler Zinciri Deseni, bir iste\u011fin birden fazla nesne taraf\u0131ndan i\u015flenebilece\u011fi her yerde kullan\u0131labilir. \u00d6rne\u011fin, bir web uygulamas\u0131nda HTTP isteklerini filtrelemek, bir e-ticaret uygulamas\u0131nda sipari\u015f i\u015fleme ad\u0131mlar\u0131n\u0131 y\u00f6netmek veya bir belge i\u015fleme sisteminde farkl\u0131 dosya t\u00fcrlerini ayr\u0131\u015ft\u0131rmak gibi senaryolarda etkili bir \u015fekilde uygulanabilir.<\/p>\n<p><strong>3. Minimal k\u00fct\u00fcphanemizde performans sorunlar\u0131 ya\u015far m\u0131y\u0131m?<\/strong><\/p>\n<p>Do\u011fru tasarlanm\u0131\u015f ve optimize edilmi\u015f bir minimal k\u00fct\u00fcphane genellikle haz\u0131r, daha kapsaml\u0131 k\u00fct\u00fcphanelere g\u00f6re daha iyi performans g\u00f6sterebilir \u00e7\u00fcnk\u00fc sadece ihtiya\u00e7 duyulan i\u015flevselli\u011fi i\u00e7erir. Ancak, Long Polling d\u00f6ng\u00fcs\u00fcnde asenkron i\u015fleme yapmamak veya \u00e7ok uzun ve karma\u015f\u0131k handler zincirleri olu\u015fturmak gibi fakt\u00f6rler performans\u0131 olumsuz etkileyebilir. Asenkron i\u015flem ve dikkatli handler tasar\u0131m\u0131 ile bu sorunlar\u0131n \u00f6n\u00fcne ge\u00e7ilebilir.<\/p>\n<p><strong>4. G\u00fcvenlik nas\u0131l sa\u011flan\u0131r?<\/strong><\/p>\n<p>Botunuzun g\u00fcvenli\u011fi i\u00e7in \u00f6ncelikle bot token'\u0131n\u0131z\u0131 kesinlikle gizli tutmal\u0131s\u0131n\u0131z. API isteklerini HTTPS \u00fczerinden yapmal\u0131s\u0131n\u0131z. Ayr\u0131ca, kullan\u0131c\u0131 giri\u015flerini do\u011frulama ve yetkilendirme mekanizmalar\u0131 eklemelisiniz. \u00d6rne\u011fin, sadece belirli kullan\u0131c\u0131lar\u0131n hassas komutlar\u0131 kullanmas\u0131na izin veren handler'lar yazabilirsiniz. Veritaban\u0131 entegrasyonu yap\u0131yorsan\u0131z, SQL enjeksiyonu gibi sald\u0131r\u0131lara kar\u015f\u0131 dikkatli olmal\u0131 ve g\u00fcvenli veri depolama y\u00f6ntemleri kullanmal\u0131s\u0131n\u0131z<\/p>\n","protected":false},"excerpt":{"rendered":"Telegram Bot API, geli\u015ftiricilerin botlar\u0131n\u0131 Telegram platformuyla entegre etmelerini sa\u011flayan bir HTTP tabanl\u0131 aray\u00fczd\u00fcr. Botunuzun kullan\u0131c\u0131larla &#8230;","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":[1408],"tags":[],"class_list":{"0":"post-39172","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","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>Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131 - 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\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131\" \/>\n<meta property=\"og:description\" content=\"Telegram Bot API, geli\u015ftiricilerin botlar\u0131n\u0131 Telegram platformuyla entegre etmelerini sa\u011flayan bir HTTP tabanl\u0131 aray\u00fczd\u00fcr. Botunuzun kullan\u0131c\u0131larla ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-15T19:00:40+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=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131\",\"datePublished\":\"2026-02-15T19:00:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/\"},\"wordCount\":2680,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/\",\"name\":\"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-15T19:00:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131\"}]},{\"@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":"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131 - 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\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131","og_description":"Telegram Bot API, geli\u015ftiricilerin botlar\u0131n\u0131 Telegram platformuyla entegre etmelerini sa\u011flayan bir HTTP tabanl\u0131 aray\u00fczd\u00fcr. Botunuzun kullan\u0131c\u0131larla ...","og_url":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-15T19:00:40+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131","datePublished":"2026-02-15T19:00:40+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/"},"wordCount":2680,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/","url":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/","name":"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-15T19:00:40+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-ile-minimal-bir-telegram-bot-kutuphanesi-gelistirmek-handler-zinciri-deseni-yaklasimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java ile Minimal Bir Telegram Bot K\u00fct\u00fcphanesi Geli\u015ftirmek: Handler Zinciri Deseni Yakla\u015f\u0131m\u0131"}]},{"@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\/39172","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=39172"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39172\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}