Herşey Udemy’den Engin hocanın kurslarını satın almam ile başladı.. Çoğu dersini büyük bir motivasyonla izledim, inanılmaz bilgiler öğrendim, burdan kendisine teşekkür etmek istiyorum umarım bu yazıyı okuyordur.(bknz. TV’de akrabalarına selam söyleyen genç)

                Udemy kurslarından Youtube canlı yayınlarına geçtik, oradan da çığ gibi büyüyen Telegram grubuna. Gruba ilk katıldığımda 20-30 kişi anca vardık, şuan 1000 kişiyi geçmiş durumda ve her geçen gün bu sayı artıyor, büyük başarı.

                Bu grupta elimden geldiğince aktif olmaya çalışıyorum, bir de Stackoverflow Udemy grubu var ki o grup benim favori telegram grubum. Bu grupta yazılım sorunlarına, teknolojilere vb. konulardaki sorulara cevap vermeye çalışıyorum. Bu cevaplardan sonra telegram üzerinden birçok özel mesaj almaya başladım, günde ortalama 10 arkadaşım yaşadığı sorunları yazıyor, bunlar üzerinde tartışıyoruz ve çözümler bulmaya çalışıyoruz. Hatta birkaçı direkt uzak bağlantı veriyor 🙂 Velhasıl böyle tatlı bir telaşa girmişken aklıma bir fikir geldi. Madem bu kadar kişi ile konuşuyorum ve çözümler bulmaya çalışıyorum neden bu soru sorma işini biraz daha otomatize ederek bir yazılımcıya yakışır şekilde çözmüyorum dedim ve HopeStakoverflow Chat Bot’u geliştirmeye başladım. Ee tabi böyle bir yazılımı geliştirirkende ilk blogumu yazarak herkesin yararlanmasını sağlamasam olmazdı. Hadi başlayalım.

Nasıl Telegram Bot oluşturulur ?

Kendi telegram botumuzu oluşturmak için yapmamız gereken 2 adım var. Bunlardan ilki telegramın BotFather diye adlandırdığı bot oluşturma botudur 😀 Evet yanlış anlamadınız bot oluşturmak için Telegramın botunu kullanacağız. Telegram üzerinden botfather ‘ı aratın ona ona /start yazın, ardından /newbot komutu ile yeni bot istediğimizi söyleyelim. Sonra bize yeni botun adını soracaktır ben HopeStackoverflow olarak belirledim, bu görünen ismi, ardından botun kullanıcı adını soracak , bu ise kullanıcıların botunuzu bulması için kullanılan bot kullanıcı adı. Vereceğiniz kullanıcı adının ‘bot’ ile bitmesi gerekiyor bu yüzden kullanıcı adına da Ask_hope_botolarak belirledim. Bu işlemleri yaptıktan sonra BotFather size botunuza erişim sağlamak için bir Token verecek, bu token ile işlemlerimizi çok kolay şekilde gerçekleştireceğiz.

Kodlama zamanı..

İlk adımı geçip Telegram üzerinden botumuzu oluşturduğumuza göre şimdi ikinci ve en zevkli aşama olan kod yazma adımına geçebiliriz. Ben teknoloji olarak sürekli kullandığım ve çok sevdiğim Net Core üzerinden geliştirmemi yaptım ama Telegram Bot birçok programlama dili desteklemektedir. (PHP, Java, Nodejs vs.) Önce boş bir Net Core console projesi oluşturdum. Daha sonra Nuget aracılığı ile  Telegram.Bot.Framework projeme ekledim. Cli aracılığı ile eklemek için aşağıdaki komutu yazabilirsiniz.

dotnet add package Telegram.Bot.Framework –version 2.0.0-alpha5

Frameworkü ekledikten sonra BotManager adında bir class oluşturdum ve bot ile ilgili yapacağım tüm işlemleri bu kısımda yazdım. BotOnMessageReceived adında 2 parametre alan bir fonksiyon tanımladım, bunu daha sonra Program.cs altındaki main fonksiyonunda OnMessage eventine bağlayacağız. Böylece gelen her mesaj bizim BotOnMessageReceived fonksiyonumuza düşecek ve gerekli işlemleri orda yapacağız.

BotOnMessageReceived fonksiyonuna geçmeden önce, kullanıcıya soracağım soruları bir json’a yazdım (MessageText.json), daha sonra bu json’ın C# tarafında modelini (Messages.cs) oluştururak program çalıştırıldığında bir deserialize işlemi ile bir değişkende tutulmasını sağladım.

BotOnMessageReceived fonksiyonuna geri dönecek olursak aslında tüm mesajlaşma ve buna bağlı karar işlemlerini burada gerçekleştirdim. Karşılaştığım sorunlardan biri kullanıcının hangi adımda kaldığının takibini yapmaktı, çünkü bir mesajı yazdıktan sonra bot ile bağlantısı kesilirse ya da farklı bir mesaj yazarsa bot sıradaki cevabı doğru şekilde veremiyordu. Bunu kullanıcı her cevap yazdığında DB’ye geçici olarak o kullanıcının Chat ID’sini ve kaldığı adım’ı insert ya da update işlemi ile veritabanına kaydettim. Çok detayına girip konudan uzaklaşmak istemiyorum ama UserStepTemp adında bir model tanımlayarak bunu EFCore ile çok kolay şekilde yönettim. İsterseniz bu adımı veritabanında değilde generic bir List’te de tutabilirsiniz tercih sizin. Sonra bu adımlara göre switch case ile kullanıcıya soruları sorup ilgili cevapları almaya çalıştım. Aslında bu yöntem benim üzerinde çok düşündüğüm ve vakit harcadığım bir kısımdı. Kullanıcı yeni bir soru soracak ise önce Question ‘dan instance oluşturdum ve List<Question> türünde questionTempList listine ekledim. Kullanıcı ilk mesajını yazıp diğer adımlara sırası ile geçtiğinde ise bu listeden kullanıcın Chat Id(herkesin sabit Telegram Id’si vardır) ile ilgili list elemanını bulup bu elemanın kullanıcının cevapladığı soruya karşılık gelen sorunun cevabını güncelledim J Kullanıcı tüm soruları cevapladığında ise ilgili nesneyi veritabanı işlemlerini yürüttüğüm Repository classımdaki SaveQuestion fonksiyonu ile veritabanına kaydedip, questionTempList ‘ten bu elemanı sildim.

Genel olarak bot’un çalışma mantığı kullanıcıya belirli sorular sorulup bunların cevabını almak ve veritabanına kaydetmek ya da mail atmak artık gerisi size kalmış. Kod tarafının anlaşılması zor kısımlarını anlatmaya çalıştım, makalenin daha fazla uzamasının önüne geçmek için veritabanı işlemlerini yöneten Repository class’ını, EfCore ,Console uygulamasında Dependency Injection ve Configuration gibi yerlere değinmedim ama aşağıdaki link ile github üzerinden kodlara bakabilirsiniz. Ayrıca csproj üzerinden projeye import ettiğim kütüphanelere göz gezdirebilirsiniz. Ayrıca projeyi geliştirirek bir API’ a bağlayıp soruların ve cevapların buna göre şekillenmesini sağlayabilirsiniz ya da kullanıcıdan bir fotoğraf isteyerek bunu yapay zeka servislerinden yorumlatıp kullanıcıya fotoğraf hakkında bilgi verebilirsiniz, yapacaklarınız tamamen sizin hayal gücünüze kalmış.

Ve sonuç..

Böylece ilk makalemin sonuna geldik. İlk olduğu için hatalarımı mazur görün, tavsiyelerinize açığım lütfen yorum kısmına yazın. Bir sonraki makalede bir NetCore uygulamasının nasıl Azure üzerinde WebJob olarak çalıştırıldığını ve verilerin Azure SQL’de tutulacağına değineceğim.

Bot ile görüşmek için Telegram üzerinden @Ask_hope_bot kullanıcı adıyla ya da t.me/Ask_hope_bot tıklayarak da iletişime geçebilirsiniz. Şuan Azure üzerinde hizmet veren genç bir kardeşimiz 🙂

Projenin github linki.

https://github.com/kahramanumut/HopeTelegramBot

Share: