Python ile Telegram Chatbot + Heroku – Telegram Group

Photo by Mina FC on Unsplash

Python ile Telegram Chatbot + Heroku

Merhaba bu flood üzerinde sizinle Python programlama diliyle ufak bir Telegram chatbot geliştireceğiz. Hazırsanız başlayalım!

Chatbot Nedir ?

Chatbot, çeşitli dijital ortamlarda kullanıcıdan aldığı yazılı veya sözlü girdileri işleyerek kullanıcıya geri yanıt döndüren etkileşimli sohbet robotlarıdır. Biz bu flood üzerinde sizinle yazılı etkileşim alan bir chatbot geliştireceğiz.

BotFather İle Bot Oluşturmak

1- Telegramda @BotFather kullanıcısını arayın, karşınıza BotFather adında bir bot çıkmalı

Telegramda @BotFather kullanıcısı

2- BotFather ile bir chat başlatın, START’a bastığınızda size komutlarını listeleyecektir

BotFather chat komutları

3- BotFather’a chat üzerinden /newbot komutunu gönderdiğinizde geri mesaj döndürerek sizden chatbotunuz için bir isim isteyecek, bot adını gönderdiğinizde son olarak sizden chatbotunuz için bir “kullanıcı_adı_bot” gibi bir kullanıcı adı isteyecek ve kullanıcı adını mesaj olarak gönderdiğinizde size botununuzun oluşturulduğunu bildirecek ve API-TOKEN değerini mesaj olarak gönderecek.

Chatbot isimlendirme

4- Tebrikler telegram üzerinde artık bir bota sahipsiniz, botlarınızı /mybots komutu ile görebilirsiniz. Gelin şimdi bota biraz işlevsellik kazandıralım.

Telegram Botu Yazdıklarımızı Nasıl Algılıyor ?

Aslında yapmamız gereken şey bir API Servisi gibi düşünülebilir. Bir kaç endpoint belirleyeceğiz ve bu endpointlere çağrı geldiğinde istek işlenecek ve varsa parametrelerini de işin içine katarak geriye bir yanıt döndürecek ve istediğimiz işlemleri gerçekleştirmemizi sağlayacak. Ancak burada endpoint diye bahsettiğimiz bir kavrama sahip değiliz. Endpoint yerine olaylar ile yürütülen bir sisteme sahibiz ve bu sisteme de ‘Webhook’ adı veriliyor.

Olayları bir dispatcher(çağrı yönlendirici) ile kontrol altına alıyoruz. Dispatcherımız yalnızca olayları kontrol altına almakla kalmıyor aynı zamanda /getUpdates endpointi üzerinde güvenliği de sağlıyor.

Dispatcher, Telegramın sizin botunuza özel tanımladığı api adresindeki /getUpdates endpointine gelen güncellemeleri kontrol eder. Bu güncellemeleri sıra sıra alır ve aldığı güncellemeyi endpoint(getUpdates) üzerinden siler. Daha sonra aldığı güncellemenin chat içeriğine bakar ve yerine getirmesi gereken işlemleri gerçekleştirir.

Örneğin chatbota aşağıdaki gibi bir mesaj dizisi gönderdiğimizde

Chatbota gönderilen mesajlar
https://api.telegram.org/bot[BOT_TOKEN_DEĞERİ]/getUpdates

adresine giderseniz yollanan mesajlar ile ilgili json türünde update verileri ile karşılacaksınız.

Gerekli bilgileri verdiğimize göre chatbot kodlamaya geçebiliriz.

Chatbotumuzu geliştirirken Python3 kullanacağız eğer ki kurulu değilse aşağıdaki bağlantıdan edinebilirsiniz;

Download Python

Information about specific ports, and developer info Source and binary executables are signed by the release manager or…

www.python.org

Python bilgisayarınızda zaten kurulu ise eklememiz gereken bir paket var. Paketimizi aşağıdaki CLI komutunu çalıştırarak ekleyelim ve artık işe başlayalım.

pip3 install python-telegram-bot

Paketimiz sorunsuz kurulduysa, istediğiniz bir dizinde klasör oluşturun ve içerisinde aşağıdaki hiyerarşik düzeni elde edin.

Klasör Hiyerarşisi

./telegram-chatbot/main.py

Main.py dosyası, chatbot kodlarımızın bulunduğu Python dosyamız.

./telegram-chatbot/Procfile

Procfile dosyası, chatbot kodlarımızı yazdıktan sonra uzak bir sunucu olan Heroku üzerinde yayınlarken Dyno adı verdiğimiz işlemlerimizin bulunacağı bir uzantıya sahip olmayan dosyamız.(Heroku üzerinde yayınlamak istemiyorsanız bu dosya ile ilgili işlemleri gerçekleştirmeyebilirsiniz.)

./telegram-chatbot/requirements.txt

Requirements.txt dosyası, chatbot geliştirmede kullandığımız paketlerimizin bulunduğu bir metin dosyamız. Aynı zamanda Heroku üzerinde chatbot uygulamamızı yayınlarken Heroku da bu metin dosyasını baz alarak paketleri uzak sunucuya kuruyor.(Heroku üzerinde yayınlamak istemiyorsanız bu dosya ile ilgili işlemleri gerçekleştirmeyebilirsiniz.)

./telegram-chatbot/runtime.txt

Runtime.txt dosyası, chatbot geliştirirken Python dilinin hangi versiyonunu kullandığımızın belirtildiği, yerel bilgisayarınızda geliştirme yaparken bir önem arz etmeyen ancak Heroku üzerinde uygulamamızı yayınladığımızda işimize yarayacak olan metin dosyamız.(Heroku üzerinde yayınlamak istemiyorsanız bu dosya ile ilgili işlemleri gerçekleştirmeyebilirsiniz.)

Şimdi Chatbot Geliştirme Zamanı

Öncelikle aşağıdaki modülleri dahil ederek başlayalım.

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

Şimdi bir adet global değişken tanımlayacağız;

1- TOKEN adında BotFather’ın sana verdiği API-TOKEN verisini içeren string değişken.

TOKEN = "[SİZİN_API_TOKEN_DEĞERİNİZ]"

Şimdi ürün ve geliştirme aşamasına uyumlu bir kod yazmak adına ilk olarak geliştirme aşamasında çalışacak bir ‘update’ metodu oluşturalım.

Daha sonra, main fonksiyonu içerisinde bir dispatcher oluşturalım.

Şimdi /start komutu gönderildiğinde yapılması istediğimiz işlemleri gerçekleştirecek bir fonksiyon oluşturalım.

Update ve Context parametreleri CommandHandler fonksiyonumuzun bize sağladığı parametreler. Bu parametrelerle ilgili daha detaylı bilgi için aşağıdan dökümantasyona ulaşabilirsiniz.

telegram.ext.CommandHandler – Python Telegram Bot 13.0 documentation

class telegram.ext. CommandHandler( command: Union[str, List[str]], callback: Callable[[Union[str, Update]…

python-telegram-bot.readthedocs.io

Şimdi start komutunda message değişkeninde bahsettiğimiz /help komutunun işlemlerini gerçekleştirecek olan “help” fonksiyonunu oluşturalım.

Bir tane komut daha ekleyelim ve yeni komutumuz /about komutu olsun. Fonksiyon adı da “about” olsun.(Çok yaratıcı…)

Son olarak da yanlış bir komut/mesaj gönderildiğinde tetiklenecek bir fonksiyon oluşturalım.

Artık oluşturduğumuz fonksiyonları dispatchera ekleyebiliriz. Bunu daha önce oluşturduğumuz main fonksiyonuna birkaç ekleme yaparak gerçekleştirebiliriz.

Son olarak da main fonksiyonumuzun çalıştırılmasını sağlayalım ve kodlama işlemlerinin sonuna gelmiş olalım.

Main.py içeriği yukarıdaki adımların sonucunda yaklaşık olarak aşağıdaki gibi olmalıdır.

Şimdi komut satırı arayüzünde ‘main.py’ ile aynı seviyeye gelin ve aşağıdaki komutu çalıştırın.

python3 main.py

Aşağıdaki uyarıyı almanız halinde botunuz sorunsuz çalışmaktadır.(Olası hatalar için benimle iletişime geçebilirsiniz.)

Bot başlatıldı.

Şimdi botumuzu test edebiliriz. Botumuza /start ve /yardim komutlarını gönderelim ve geri dönecek mesajları görelim.

Başarılı! Artık Telegram üzerinde bir chatbota sahipsiniz. Bu noktadan sonra yapılacak adımlar Heroku üzerinde python botunuzu yayınlama ile ilgilidir. Burada yolumuzun ayrılacağı kişilere selamlar.

Kodların Heroku İçin Hazırlanması

Herokuya kodlarımızı direkt olarak değil de GitHub ile bağlantılı bir şekilde yükleceği, dolayısıyla TOKEN gibi özel değişkenleri artık ortam değişkenlerine aktarmalıyız. Bunun için TOKEN, MODE, PORT ve HEROKU_APP_NAME adında 4 değişken bize yeterli olacaktır. Ayrıca ortam değişkenlerini kullanabilmek için ‘os’ adlı kütüphaneyi dahil etmeniz gerekiyor. Bunun yanında bir de ‘sys’ kütüphanesini de dahil etmeliyiz çünkü birkaç adım sonra bu kütüphaneyi de kullanacağız.

import os
import sys

Daha önce tanımladığımız TOKEN değişkenini ortam değişkeni olarak vermek daha sağlıklı olacaktır. TOKEN değişkenini aşağıdaki şekilde güncelleyin.

TOKEN = os.getenv("TOKEN")

Şimdi daha önce oluşturduğumuz ‘run’ fonksiyonumuzu hem geliştirme hem de ürün tarafına uyarlamalıyız. Aşağıdaki değişiklikleri ‘run’ fonksiyonunuza uygulayabilirsiniz. MODE “dev” değerini tutuyor ise geliştirici modu için bir run fonksiyonu tanımlayacak, eğer ki MODE “prod” değerini tutuyor ise ürün aşamasında olduğunu anlayacak ve bir Web Hook oluşturabilen bir run fonksiyonu elde edeceğiz.

Kodlarınızın en son hali yaklaşık olarak aşağıdaki kodlara benzeyecektir.

Not: Kodlarınızı herokuya hazırladıktan sonra yerel bilgisayarınızda çalıştırmayı denerseniz hata verecektir. Bu hatanın sebebi sizin bilgisayarınızda ortam değişkenlerinin tanımlı olmamasından kaynaklanır. Ortam değişkeni tanımlamayla ilgili aşağıya linkleri bırakıyorum.

How to Create an Environment Variable in Windows

How to Create an Environment Variable in Windows. 1. For Windows 10, right click on the Start Menu and select System…

kb.wisc.edu

How to Set and List Environment Variables in Linux

In Linux and Unix based systems environment variables are a set of dynamic named values, stored within the system that…

linuxize.com

Heroku İçin Gerekli Dosyaların Düzenlenmesi

Procfile dosyası Herokunun uygulamaları başlatması için gerekli işlem tiplerini tutuyor. Web hook oluşturabilmek için ‘web’ adında bir işlem tanımlamalıyız. Procfile dosyanız aşağıdaki gibi bir içeriğe sahip olmalıdır.

web: python3 main.py

Web hook için ‘web’ işlem tipi değişken değildir. Eğer ki farklı bir isimde bir işlem tipi oluşturursanız, Heroku bu işlem tipi Webhook olarak algılamayacaktır. Normal bir dyno mantığı ile çalışacaktır. Dolayısıyla ücretsiz bir hesap için düşünürsek, Heroku aylık 550 saat(yaklaşık 23 gün) bedava dyno koşma süresi tanımlıyor. Yani Webhook olarak tanımlamadığınızda dynonuz aylık olarak 23 gün çalışacak ve 7 gün uyumak zorunda kalacaktır. (Ücretli hesaplar için bu değişkenlik gösterebilir.) Ancak Webhook olarak tanımlandığında heroku botunuzu uyku moduna geçirebilecek ve bu da boşa çalışmasını engelleyerek size ekstra zaman kazandıracak.

Bir diğer dosyamız olan ‘requirements.txt’ dosyasını hazırlayalım. Kodlarımızda varsayılan kütüphanelere ek olarak tek bir kütüphane dahil ettik. Dolayısıyla python-telegram-bot kütüphanesini dahil etmeniz yeterli olacaktır.

python-telegram-bot==13.1

Son olarak ‘runtime.txt’ adlı dosyamızın içeriğine de kullandığımız Python dilinin versiyonunu ekliyoruz. Python versiyonunuzu öğrenmek için aşağıdaki kodu komut satırına yapıştırın.

python3 --version

Runtime.txt içeriği yaklaşık olarak aşağıdaki gibi olmalıdır.

python-3.8.6

Artık kod ayarlamalarımızı gerçekleştirdik. Şimdi kodumuzu git sistemine yükleyerek işleri kolaylaştıracağız. Bu yazıda GitHub ile gerçekleştireceğiz ancak Heroku GitLab, BitBucket vb. sistemleri de destekliyor. Linklerini sizin için aşağıya bırakıyorum.

Test and deploy a Python application with GitLab CI/CD

This example will guide you how to run tests in your Python application and deploy it automatically as Heroku…

docs.gitlab.com

Deploy to Heroku | Bitbucket Cloud | Atlassian Support

Deploying your application to Heroku from Bitbucket Pipelines. Define two variables in your settings for your Heroku…

support.atlassian.com

Şimdi Heroku üzerinde yeni bir uygulama oluşturacağız. Hesabınıza giriş yaptıktan sonra yeni/new butonuna tıklayın. Açılan popover üzerinden yeni uygulama oluştur/create new app butonuna tıklayın.

Yeni uygulama oluşturma

Karşınızda gelen yeni ekranda sizden bir uygulama adı ve bölge seçmeniz isteniyor. İstediğiniz bir uygulama adı ve bölge belirleyebilirsiniz. Belirledikten sonra uygulama oluştur/create app butonuna tıklayın.

Bölge ve uygulamadı adı belirleme

Uygulama oluşturma işlemi tamamlandı! Şimdi ‘deploy’ sekmesi altında GitHub’a bağlanma işlemini gerçekleştireceğiz.

Deploy sekmesinde Connect to GitHub seçeneğine gelin ve açılan sekmeden GitHub hesabınıza bağlanın.

GitHub hesabını bağlama

Github hesabınızı bağladıktan sonra Connect to GitHub seçeneğinde repository adınızı metin kutusuna girin. Listelenen seçeneklerden ilgili repositoryi uygulamanıza bağlayın.

Repository seçimi

Şimdi ortam değişkenlerimizi Heroku üzerinde tanımlayalım. Bu işlem için ayarlar/settings sekmesine gelin ve Ortam değişkenleri bölümünden aşağıdaki gibi değişkenlerinizi ekleyin. TOKEN değişkeninizi ve HEROKU_APP_NAME değişkeninizi kendinize göre ayarlayın.

Ortam değişkenlerinin tanımlanması

Artık uygulamanızı dağıtabilirsiniz!

Uygulamayı dağıtma

Deploy Branch butonu ile seçtiğiniz bir GitHub branchını uygulamanızda dağıtabilirsiniz. Ek olarak Enable Automatic Deploys butonunu aktif ederseniz, GitHub üzerine uyguladığınız her değişiklikte Heroku üzerindeki uygulamanız güncellenecektir.

Uygulama dağıtımı

Not: View butonuna tıkladığınızda sizi uygulamanızın web arayüzüne götürür ancak biz bir arayüz tasarlamadık dolayısıyla bir hata mesajı döndürecektir. Ancak uygulamanız başarıyla dağıtıldıysa arkaplanda çalışıyor demektir.

Yukarıdaki resimde görülen adımların hepsi başarılı olduysa uygulamanız başarıyla dağıtılmıştır. Artık botunuz Heroku üzerinde çalışmaya başladı. Bir sonraki yazımda görüşmek üzere sağlıcakla kalın!

Herhangi bir sorunuz/öneriniz için bana ulaşabilirsiniz.

Tüm kodlara erişmek için: https://github.com/fatiiates/telegram-chatbot

İletişim: http://fatiiates.github.io/

Ten articles before and after

Пошаговый мануал: Как создать бота в Телеграм? – Telegram Group

Пишем telegram бота для мониторинга сайта на Golang – Telegram Group

Bot Telegram Untuk Membantu Sekolah/Kuliah Kamu – Telegram Group

Create a telegram bot – Telegram Group

Sending a message from Python to a Telegram chat: the simplest way – Telegram Group

TRX1 Dev Blog #1 (January 2021). TRX1’s January 2021 development report. – Telegram Group

How to code a recipe recommendation Telegram bot – Telegram Group

Telegram Bot Oluşturma. Telegram son günlerde ülkemizde ve… – Telegram Group

使用Python寫一個Telegram Notify – Lofi-nancier – Medium – Telegram Group

Автоматизация службы поддержки партнера iiko с помощью Telegram-ботов. Снижение нагрузки на колл-центр более чем в 2 раза (на 113%) – Telegram Group