Java ile Minimal Bir Telegram Bot Kütüphanesi Geliştirmek: Handler Zinciri Deseni Yaklaşımı
Telegram botları, kullanıcılarla etkileşim kurmanın ve çeşitli otomasyon görevlerini yerine getirmenin güçlü bir yolunu sunar. Mevcut birçok Java Telegram bot kütüphanesi olsa da, bazen projenin özel ihtiyaçlarına tam olarak uyan, daha hafif ve üzerinde tam kontrole sahip bir çözüm geliştirmek isteyebiliriz. Bu makalede, Java ile minimal bir Telegram bot kütüphanesi oluşturmanın temel adımlarını, özellikle de esnek ve genişletilebilir bir yapı sağlayan Handler Zinciri Deseni (Chain of Responsibility Pattern) yaklaşımını kullanarak inceleyeceğiz.
Telegram Bot API ve Temel Kavramlar
Telegram Bot API, geliştiricilerin botlarını Telegram platformuyla entegre etmelerini sağlayan bir HTTP tabanlı arayüzdür. Botunuzun kullanıcılarla etkileşim kurabilmesi için bu API’yi anlamak kritik öneme sahiptir.
Bot API’ye Genel Bakış
Telegram Bot API, RESTful prensiplere dayanır ve HTTPS üzerinden istekler alır. Botunuz, API’ye belirli metodları çağırarak mesaj gönderebilir, kullanıcı bilgilerini alabilir veya dosya yükleyebilir. Her bot, benzersiz bir token ile tanımlanır ve tüm API istekleri bu token ile kimlik doğrulaması gerektirir.
Güncelleme Türleri ve Mesaj Nesnesi
Kullanıcılar botunuzla etkileşime geçtiğinde (mesaj gönderme, komut kullanma, inline sorgu vb.), Telegram sunucuları botunuza “güncelleme” (update) gönderir. Her güncelleme, bir JSON nesnesi olarak gelir ve içinde bir veya daha fazla olay türünü barındırabilir (örneğin, message, edited_message, callback_query). En yaygın güncelleme türü olan message nesnesi, gönderen, alıcı, metin, tarih gibi bilgileri içerir.
{
"update_id": 123456789,
"message": {
"message_id": 1,
"from": {
"id": 123456789,
"is_bot": false,
"first_name": "Kullanıcı",
"username": "kullanici_adi"
},
"chat": {
"id": 123456789,
"first_name": "Kullanıcı",
"username": "kullanici_adi",
"type": "private"
},
"date": 1678886400,
"text": "/start"
}
}
Webhook ve Long Polling
Botunuzun gelen güncellemeleri almasının iki ana yolu vardır:
- Long Polling: Botunuz, belirli aralıklarla Telegram API'ye güncellemeler için istek gönderir. Yeni bir güncelleme varsa, API bunu hemen döndürür; yoksa, belirli bir süre bekler ve yeni bir güncelleme geldiğinde veya zaman aşımı dolduğunda yanıt verir. Minimal kütüphanemiz için genellikle daha basit bir başlangıç noktasıdır.
- Webhook: Telegram, yeni güncellemeler olduğunda botunuzun belirlediği bir URL'ye HTTP POST isteği gönderir. Bu yöntem daha hızlı ve gerçek zamanlıdır ancak botunuzun dışarıdan erişilebilir bir sunucuda çalışmasını gerektirir.
Temel Bot Komutları
Telegram botları genellikle /start, /help gibi komutlarla etkileşime başlar. Bu komutlar, kullanıcının mesaj metninin başında bir eğik çizgi (/) ile başlayan özel bir biçime sahip olmasıyla tanınır. Botunuz, bu komutları ayrıştırarak belirli işlevleri tetikleyebilir.
Neden Kendi Minimal Kütüphanemizi Yazmalıyız?
Piyasada zaten birçok kapsamlı Telegram bot kütüphanesi varken, kendi minimal çözümümüzü geliştirmek bazı durumlarda avantajlı olabilir.
Mevcut Kütüphanelerin Dezavantajları
Büyük kütüphaneler genellikle çok sayıda özelliği ve soyutlamayı içerir. Bu durum, öğrenme eğrisini artırabilir, gereksiz bağımlılıklar getirebilir ve uygulamanın boyutunu şişirebilir. Bazen, projenin ihtiyacı olan tek şey basit bir mesaj işleme mekanizmasıdır ve bu durumda ağır bir kütüphane aşırıya kaçabilir.
Kontrol ve Esneklik
Kendi kütüphanenizi yazdığınızda, her bir bileşen üzerinde tam kontrole sahip olursunuz. Bu, uygulamanızın tam olarak istediğiniz gibi davranmasını sağlar ve gelecekteki değişiklikler veya özel entegrasyonlar için maksimum esneklik sunar. Örneğin, özel bir güncelleme işleme mantığı veya farklı bir HTTP istemcisi kullanmak istediğinizde, mevcut kütüphanelerin kısıtlamalarına takılmazsınız.
Öğrenme ve Anlama Süreci
Sıfırdan bir kütüphane geliştirmek, Telegram Bot API'sinin ve genel yazılım tasarım desenlerinin derinlemesine anlaşılmasını sağlar. Bu süreç, sadece bot geliştirme becerilerinizi değil, aynı zamanda genel yazılım mühendisliği bilginizi de geliştirir. Bir problemi temelden çözmek, soyutlamaların arkasında yatan mekanizmaları kavramanıza yardımcı olur.
Performans ve Kaynak Kullanımı
Minimal bir kütüphane, sadece ihtiyaç duyulan özellikleri içerdiği için daha az bellek tüketir ve daha hızlı çalışabilir. Gereksiz özelliklerin ve bağımlılıkların olmaması, uygulamanızın daha hafif ve verimli olmasını sağlar. Özellikle kısıtlı kaynaklara sahip ortamlarda (örneğin, küçük sunucular veya konteynerler) bu durum önemli bir avantaj haline gelebilir.
Handler Zinciri Deseni Nedir?
Handler Zinciri Deseni (Chain of Responsibility Pattern), bir isteği işleyebilecek nesnelerin bir zincirini oluşturarak, gönderen ve alıcı arasındaki bağımlılığı ortadan kaldıran davranışsal bir tasarım desenidir.
Desen Tanımı ve Amacı
Bu desen, bir isteğin birden fazla nesne tarafından işlenebileceği durumlarda kullanılır. Her nesne, isteği işleyip işleyemeyeceğini kontrol eder. Eğer işleyebiliyorsa işler, aksi takdirde isteği zincirdeki bir sonraki nesneye iletir. Bu, isteği gönderen tarafın, isteği kimin işleyeceğini bilmek zorunda kalmamasını sağlar.
Çalışma Prensibi
Handler Zinciri Deseni genellikle şu bileşenlerden oluşur:
- Handler Arayüzü/Soyut Sınıfı: İstekleri işlemek için ortak bir arayüz tanımlar ve genellikle zincirdeki bir sonraki handler'ı ayarlamak ve isteği ona iletmek için bir metod içerir.
- Somut Handler'lar: Handler arayüzünü uygular ve belirli istek türlerini işlemek için mantık içerir. Ayrıca, isteği bir sonraki handler'a iletme sorumluluğunu da taşır.
- İstemci: Zinciri oluşturur ve isteği zincirin ilk handler'ına gönderir.
Bir istek geldiğinde, zincirin başındaki handler'a gönderilir. Bu handler, isteği işleyip işleyemediğine karar verir. Eğer işleyemezse, isteği zincirdeki bir sonraki handler'a iletir ve bu işlem, istek işlenene veya zincirin sonuna ulaşılana kadar devam eder.
Avantajları ve Dezavantajları
Avantajları:
- Esneklik: Handler'ları dinamik olarak ekleyebilir, kaldırabilir veya yeniden sıralayabilirsiniz.
- Bağımlılık Azaltma: Gönderen, isteği kimin işleyeceğini bilmek zorunda kalmaz.
- Genişletilebilirlik: Yeni handler'lar eklemek kolaydır, mevcut kodu değiştirmeye gerek kalmaz.
- Tek Sorumluluk Prensibi: Her handler, belirli bir işleme sorumluluğuna odaklanır.
Dezavantajları:
- Garanti Yok: Bir isteğin işleneceği garantisi yoktur; zincirin sonuna kadar işlenmeden kalabilir.
- Performans: Çok uzun zincirler veya karmaşık işleme mantığı performansı etkileyebilir.
- Hata Ayıklama: Zincirdeki bir hatayı bulmak bazen zor olabilir.
Telegram Bot Bağlamında Uygulanması
Telegram botlarında, her gelen güncelleme (örneğin, bir mesaj) bir istek olarak düşünülebilir. Farklı handler'lar, farklı mesaj türlerini (metin mesajları, komutlar, fotoğraf mesajları vb.) veya belirli koşulları (kullanıcının yetkisi, mesajın içeriği) işleyebilir. Örneğin, bir handler /start komutunu işlerken, diğeri /help komutunu işleyebilir. Bir başka handler ise tüm metin mesajlarını loglayabilir.
Kütüphane Mimarisi ve Temel Bileşenler
Minimal kütüphanemizin temelini oluşturacak sınıfları ve arayüzleri tanımlayalım. Bu bileşenler, Handler Zinciri Deseni'ni Java'da uygulamak için gerekli yapı taşlarını sağlayacaktır.
Update ve Message Modelleri
Telegram API'den gelen JSON yanıtlarını Java nesnelerine dönüştürmek için basit POJO (Plain Old Java Object) sınıflarına ihtiyacımız var. Bu sınıflar, sadece gerekli alanları içerecek şekilde minimal tutulmalıdır. Örneğin, bir Update sınıfı ve içinde bir Message sınıfı olabilir.
// Update.java
public class Update {
public long update_id;
public Message message;
// Diğer update türleri için gerekli alanlar eklenebilir
}
// Message.java
public class Message {
public long message_id;
public User from;
public Chat chat;
public String text;
// Diğer mesaj türleri için gerekli alanlar eklenebilir
}
// User.java
public class User {
public long id;
public String first_name;
public String username;
}
// Chat.java
public class Chat {
public long id;
public String type;
public String first_name;
public String username;
}
Bu modelleri JSON'dan Java nesnelerine dönüştürmek için Gson veya Jackson gibi hafif bir JSON kütüphanesi kullanabiliriz.
BotHandler Arayüzü
Handler Zinciri Deseni'nin kalbi olan BotHandler arayüzü, tüm somut handler'lar için ortak bir sözleşme tanımlar. Bu arayüz, bir güncellemenin işlenip işlenemeyeceğini kontrol eden ve işleme mantığını içeren metodları barındırır.
// BotHandler.java
public interface BotHandler {
boolean handle(Update update, TelegramBot bot);
void setNext(BotHandler nextHandler);
BotHandler getNext();
}
handle metodu, bir güncelleme nesnesini ve botun kendisini (cevap göndermek için) alır. Eğer handler güncellemeyi işlerse true döner, aksi takdirde false döner ve zincirdeki bir sonraki handler'a geçilmesi gerektiğini belirtir. setNext ve getNext metodları ise zincir yapısını kurmak için kullanılır.
HandlerChain Sınıfı
HandlerChain sınıfı, BotHandler arayüzünü uygulayan handler'ları bir araya getiren ve gelen güncellemeleri zincir boyunca ileten ana yapıdır. Bu sınıf, zincirin yönetiminden sorumludur.
// AbstractBotHandler.java (Temel bir soyut sınıf)
public abstract class AbstractBotHandler implements BotHandler {
protected BotHandler nextHandler;
@Override
public void setNext(BotHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public BotHandler getNext() {
return nextHandler;
}
// handle metodu somut sınıflarda uygulanacak
}
// HandlerChain.java
public class HandlerChain extends AbstractBotHandler {
private BotHandler firstHandler;
private BotHandler lastHandler;
public HandlerChain() {
this.firstHandler = null;
this.lastHandler = null;
}
public void addHandler(BotHandler handler) {
if (firstHandler == null) {
firstHandler = handler;
lastHandler = handler;
} else {
lastHandler.setNext(handler);
lastHandler = handler;
}
}
@Override
public boolean handle(Update update, TelegramBot bot) {
if (firstHandler != null) {
return firstHandler.handle(update, bot);
}
return false; // Zincirde handler yoksa
}
}
TelegramBot Sınıfı
TelegramBot sınıfı, botun ana kontrol noktasını temsil eder. API isteklerini göndermek, güncellemeleri almak ve HandlerChain'i tetiklemek gibi görevleri üstlenir. Bu sınıf, bot token'ını tutar ve Telegram API ile iletişim kurmak için bir HTTP istemcisi kullanır.
// TelegramBot.java
public class TelegramBot {
private final String botToken;
private final String apiUrl;
private final HttpClient httpClient;
private final Gson gson;
private final HandlerChain handlerChain;
public TelegramBot(String botToken) {
this.botToken = botToken;
this.apiUrl = "https://api.telegram.org/bot" + botToken + "/";
this.httpClient = HttpClient.newHttpClient();
this.gson = new Gson();
this.handlerChain = new HandlerChain();
}
public void addHandler(BotHandler handler) {
handlerChain.addHandler(handler);
}
public void sendMessage(long chatId, String text) throws IOException, InterruptedException {
String url = apiUrl + "sendMessage";
Map params = new HashMap<>();
params.put("chat_id", chatId);
params.put("text", text);
String jsonBody = gson.toJson(params);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
httpClient.send(request, HttpResponse.BodyHandlers.ofString());
}
public void processUpdate(Update update) {
handlerChain.handle(update, this);
}
// Long polling veya webhook için metodlar eklenecek
}
Handler Zincirini Oluşturma ve Yönetme
Kütüphanemizin temel bileşenlerini tanımladıktan sonra, şimdi somut handler'ları nasıl oluşturacağımızı ve bunları zincire nasıl ekleyeceğimizi inceleyelim.
Temel BotHandler Uygulamaları
Farklı mesaj türlerini veya komutları işlemek için çeşitli BotHandler uygulamaları oluşturabiliriz. Her biri, belirli bir sorumluluğa odaklanmalıdır.
// StartCommandHandler.java
public class StartCommandHandler extends AbstractBotHandler {
@Override
public boolean handle(Update update, TelegramBot bot) {
if (update.message != null && update.message.text != null && update.message.text.equals("/start")) {
try {
bot.sendMessage(update.message.chat.id, "Merhaba! Botuma hoş geldiniz.");
return true; // İşlendi
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
return nextHandler != null && nextHandler.handle(update, bot); // Bir sonrakine ilet
}
}
// EchoTextHandler.java
public class EchoTextHandler extends AbstractBotHandler {
@Override
public boolean handle(Update update, TelegramBot bot) {
if (update.message != null && update.message.text != null && !update.message.text.startsWith("/")) {
try {
bot.sendMessage(update.message.chat.id, "Sen dedin ki: " + update.message.text);
return true; // İşlendi
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
return nextHandler != null && nextHandler.handle(update, bot); // Bir sonrakine ilet
}
}
// UnknownCommandHandler.java (Zincirin sonu için)
public class UnknownCommandHandler extends AbstractBotHandler {
@Override
public boolean handle(Update update, TelegramBot bot) {
if (update.message != null && update.message.text != null && update.message.text.startsWith("/")) {
try {
bot.sendMessage(update.message.chat.id, "Bilinmeyen komut: " + update.message.text);
return true; // İşlendi
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
return false; // Zincirin sonu, işlenmedi
}
}
Zincire Handler Ekleme
TelegramBot sınıfımızın addHandler metodu aracılığıyla handler'ları zincire ekleyebiliriz. Eklenme sırası önemlidir, çünkü handler'lar bu sıraya göre işlenir.
public class MyBotApp {
public static void main(String[] args) {
String botToken = "YOUR_BOT_TOKEN"; // Bot token'ınızı buraya girin
TelegramBot bot = new TelegramBot(botToken);
// Handler'ları ekleme sırası önemlidir
bot.addHandler(new StartCommandHandler());
bot.addHandler(new EchoTextHandler());
bot.addHandler(new UnknownCommandHandler()); // En sona eklenmeli
// Botu başlatma kodu buraya gelecek
}
}
Handler Sıralaması ve Öncelik
Handler'ların zincire eklenme sırası, işleme önceliğini belirler. Daha spesifik veya öncelikli olması gereken handler'lar zincirin başına eklenmelidir. Örneğin, /start gibi belirli bir komutu işleyen handler, genel metin mesajlarını işleyen handler'dan önce gelmelidir. Aksi takdirde, /start komutu bir "metin mesajı" olarak algılanıp yanlış handler tarafından işlenebilir.
Koşullu İşleme Mantığı
Her handler'ın handle metodu içinde, gelen güncellemeyi işleyip işleyemeyeceğine dair koşullu mantık bulunur. Bu mantık, mesajın içeriği, gönderen kişi, sohbet türü gibi birçok faktöre dayanabilir. Eğer bir handler güncellemeyi işlerse, genellikle true döndürerek zincirdeki diğer handler'ların işleme devam etmesini engeller. Bu, gereksiz işlem yükünü azaltır ve istenmeyen yan etkileri önler.
Botu Çalıştırma ve Mesajları İşleme
Kütüphanemizi ve handler zincirimizi kurduktan sonra, botumuzu nasıl çalıştıracağımızı ve gelen mesajları nasıl işleyeceğimizi ele alalım.
Güncellemeleri Çekme (Long Polling)
Minimal kütüphanemiz için Long Polling, güncellemeleri almak için basit ve etkili bir yöntemdir. Botumuz, belirli aralıklarla Telegram API'den güncellemeleri çekecek bir döngü içinde çalışır.
// TelegramBot.java içine eklenecek metod
public void startLongPolling() {
long lastUpdateId = 0;
System.out.println("Bot başlatıldı, güncellemeler bekleniyor...");
while (true) {
try {
String url = apiUrl + "getUpdates?offset=" + (lastUpdateId + 1) + "&timeout=30";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.GET()
.build();
HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
String responseBody = response.body();
// JSON ayrıştırma
GetUpdatesResponse getUpdatesResponse = gson.fromJson(responseBody, GetUpdatesResponse.class);
if (getUpdatesResponse != null && getUpdatesResponse.ok && getUpdatesResponse.result != null) {
for (Update update : getUpdatesResponse.result) {
processUpdate(update); // Handler zincirini tetikle
lastUpdateId = update.update_id;
}
}
// Kısa bir bekleme, API'yi yormamak için
Thread.sleep(1000);
} catch (IOException | InterruptedException e) {
System.err.println("Güncellemeler alınırken hata oluştu: " + e.getMessage());
try {
Thread.sleep(5000); // Hata durumunda daha uzun bekle
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}
// GetUpdatesResponse.java (Yeni POJO)
public class GetUpdatesResponse {
public boolean ok;
public Update[] result;
}
MyBotApp sınıfımızda bot.startLongPolling(); çağrısıyla botu başlatabiliriz.
Gelen Mesajları Ayrıştırma
getUpdates metodundan gelen JSON yanıtını, önceden tanımladığımız Update ve Message POJO'larına dönüştürmek için Gson veya Jackson gibi bir kütüphane kullanırız. Bu, Java kodumuzda mesaj verilerine kolayca erişmemizi sağlar.
Zinciri Tetikleme
Her yeni güncelleme alındığında, TelegramBot sınıfındaki processUpdate(Update update) metodu çağrılır. Bu metod, gelen güncellemeyi HandlerChain'e iletir ve zincirdeki ilk handler'dan başlayarak işleme sürecini başlatır.
Cevap Gönderme Mekanizması
Handler'lar, gelen güncellemeleri işledikten sonra kullanıcılara yanıt göndermek isteyebilir. Bu, TelegramBot sınıfında tanımladığımız sendMessage(long chatId, String text) metodu aracılığıyla yapılır. Bu metod, Telegram API'sinin sendMessage metodunu çağırarak belirtilen sohbet kimliğine mesaj gönderir.
Geliştirmeyi Genişletme ve İyileştirme
Minimal kütüphanemiz temel işlevselliği sağlasa da, daha güçlü ve üretim ortamına uygun bir bot için bazı iyileştirmeler ve genişletmeler yapılabilir.
Asenkron İşleme
Long polling döngüsü içinde her güncellemenin senkronize olarak işlenmesi, yoğun botlarda performans sorunlarına yol açabilir. Her güncellemeyi ayrı bir iş parçacığında (thread) veya bir iş kuyruğunda (thread pool) asenkron olarak işlemek, botun daha hızlı yanıt vermesini ve birden fazla güncellemeyi eş zamanlı olarak işlemesini sağlar. Java'nın ExecutorService veya CompletableFuture yapıları bu amaçla kullanılabilir.
// TelegramBot.java içinde
private final ExecutorService executorService = Executors.newFixedThreadPool(10); // Örneğin 10 iş parçacığı
public void processUpdateAsync(Update update) {
executorService.submit(() -> handlerChain.handle(update, this));
}
// startLongPolling metodunda processUpdate yerine processUpdateAsync çağrılır.
Veritabanı Entegrasyonu
Botunuzun kullanıcı verilerini, sohbet geçmişini veya özel ayarları saklaması gerektiğinde bir veritabanı entegrasyonu şarttır. PostgreSQL, MySQL veya MongoDB gibi veritabanları kullanılabilir. Handler'lar, veritabanı işlemlerini gerçekleştirmek için bir Repository veya DAO (Data Access Object) katmanıyla etkileşime girebilir.
Hata Yönetimi ve Loglama
Üretim ortamında çalışan bir botun sağlam bir hata yönetimi ve loglama mekanizmasına sahip olması gerekir. Log4j2 veya SLF4J gibi loglama kütüphaneleri kullanarak botun davranışını, gelen güncellemeleri, API hatalarını ve işleme hatalarını kaydedebiliriz. Handler'lar içinde try-catch blokları kullanarak hataları yakalamak ve uygun şekilde loglamak önemlidir.
Komut Tabanlı Handler'lar
Daha karmaşık botlar için, sadece /start gibi basit komutları değil, aynı zamanda /ayarlar dil Türkçe gibi argüman alan komutları da işleyebilen daha gelişmiş komut ayrıştırma handler'ları oluşturulabilir. Bu, komutları daha esnek hale getirir ve botun daha zengin etkileşimler sunmasını sağlar.
Sonuç
Java ile minimal bir Telegram bot kütüphanesi oluşturmak, sadece Telegram Bot API'sini değil, aynı zamanda yazılım tasarım desenlerini ve genel Java programlama prensiplerini de derinlemesine anlamak için harika bir yoldur. Handler Zinciri Deseni'ni kullanarak, botunuzun mesaj işleme mantığını esnek, genişletilebilir ve yönetilebilir bir şekilde tasarlayabilirsiniz. Bu yaklaşım, projenizin özel ihtiyaçlarına göre özelleştirilmiş, hafif ve performanslı bir çözüm sunar. Kendi kütüphanenizi geliştirmek, size tam kontrol ve esneklik sağlayarak, botunuzu gelecekteki gereksinimlere kolayca adapte etme imkanı verir.
SSS (Sık Sorulan Sorular)
1. Neden hazır kütüphaneler yerine kendi minimal kütüphanemizi yazmalıyız?
Kendi kütüphanenizi yazmak, size tam kontrol ve esneklik sağlar. Gereksiz bağımlılıklardan kaçınarak daha hafif ve performanslı bir uygulama oluşturabilirsiniz. Ayrıca, bu süreç Telegram API'sini ve tasarım desenlerini daha iyi anlamanıza yardımcı olur.
2. Handler Zinciri Deseni başka nerede kullanılabilir?
Handler Zinciri Deseni, bir isteğin birden fazla nesne tarafından işlenebileceği her yerde kullanılabilir. Örneğin, bir web uygulamasında HTTP isteklerini filtrelemek, bir e-ticaret uygulamasında sipariş işleme adımlarını yönetmek veya bir belge işleme sisteminde farklı dosya türlerini ayrıştırmak gibi senaryolarda etkili bir şekilde uygulanabilir.
3. Minimal kütüphanemizde performans sorunları yaşar mıyım?
Doğru tasarlanmış ve optimize edilmiş bir minimal kütüphane genellikle hazır, daha kapsamlı kütüphanelere göre daha iyi performans gösterebilir çünkü sadece ihtiyaç duyulan işlevselliği içerir. Ancak, Long Polling döngüsünde asenkron işleme yapmamak veya çok uzun ve karmaşık handler zincirleri oluşturmak gibi faktörler performansı olumsuz etkileyebilir. Asenkron işlem ve dikkatli handler tasarımı ile bu sorunların önüne geçilebilir.
4. Güvenlik nasıl sağlanır?
Botunuzun güvenliği için öncelikle bot token'ınızı kesinlikle gizli tutmalısınız. API isteklerini HTTPS üzerinden yapmalısınız. Ayrıca, kullanıcı girişlerini doğrulama ve yetkilendirme mekanizmaları eklemelisiniz. Örneğin, sadece belirli kullanıcıların hassas komutları kullanmasına izin veren handler'lar yazabilirsiniz. Veritabanı entegrasyonu yapıyorsanız, SQL enjeksiyonu gibi saldırılara karşı dikkatli olmalı ve güvenli veri depolama yöntemleri kullanmalısınız
