What’s app ile birlikte en çok kullanılan mesajlaşma programı olarak son zamanlarda iyice yıldızı parlayan telegram’ın chatleşme dışında da pek çok harika özelliğinin olduğunu biliyor musun? Geliştiricilere yönelik fantastik özelliklerinden birisi de telegram botu yapabilme ve onu dilediğin bir programlama dili ile yönetebilmektir.
Bot diye nitelendirdiğimiz uygulamalar, kendi başına çalışan, insanlar ile etkileşime geçerek, gönderdikleri komutları cevaplayabilen, periyodik olarak mesajlar da (notification) gönderebilen çok faydalı programlardır.
Örneğin bir meteoroloji botu kullanıcılara günlük hava durumunu bildirebilir. Güncel piyasaları takip ederek, dileyenlere bilgi verebilir. Kripto para botunuzun ürettiği al/sat sinyallerini telegram grubu üyelerine otomatik olarak gönderebilir. En çok ilgilendiğim kullanım alanlarından birisi 😉
Yazıyı okuyup bitirdiğinde nasıl bot yazacağını, botu oluşturduktan sonra, python ile nasıl yöneteceğini vs hepsini öğrenmiş olacak, kendi telegram botunu yazmak için sabırsızlanacaksın.
Üç Adımda Kendi Telegram Botunu Yaz
1) Telegram uygulamasına bağlanıp, botfather ile iletişime geç
İlk olarak yapman gereken telegramı, istersen mobilden istersen desktop uygulamasından başlatarak, botfather ile iletişime geçmek olacaktır.
Botfather diğer botları yönetebilen bir başka bottur. Ona bazı komutlar göndererek, bot yapımına başlayacağız.
2) Botfather’dan Yeni Bot Yaratmasını İsteyin
Start komutunu göndererek işe başlayalım:
/start
Ardından /newbot komutunu girelim. Bu komuta cevap olarak bize yeni botun ismini ardından da botun kullanıcı ismini bize soracak:
Telegramın istediği özelliklerde bir bot adı ve kullanıcı belirledikten sonra bize bir token numarası verecektir. Token bilgisini bir yere kaydetmen gerekiyor, çünkü python uygulamamızın içerisinde bu bilgiyi kullanacaksın.
Telegram botu oluşturduk oluşturmasına ama şu an itibariyle herhangi bir işlem yapmamakta, komutlarımıza cevap vermemektedir. Sonraki adımda yapacağımız şey ise bir uygulama oluşturarak, botu işe yarar bir hale getirmek olacaktır.
3) Python ile Telegram Botunu Yönet ve İşlevsel Hale Getir
Telegram botunu yönetmek için bir program yazman gerekiyor. Bunun için C#, nodejs ya da Java ile geliştirme yapabilirsin. Fakat benim tercihim python.
Kodu geliştirmeden önce telegram ile bağlantımızı yapmak için bir paket yüklememiz gerekiyor: python-telegram-bot
pip install python-telegram-bot
Kodumuzun temel iskeletini yazarak üzerinden gidelim:
import logging
import telegram
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
# Define a few command handlers. These usually take the two arguments update and
# context. Error handlers also receive the raised TelegramError object in error.
def start(update, context):
"""Send a message when the command /start is issued."""
update.message.reply_text('Başladık hadi hayırlısı')
def help(update, context):
"""Send a message when the command /help is issued."""
update.message.reply_text('Yardım geliyor')
def echo(update, context):
"""Echo the user message."""
update.message.reply_text(update.message.text)
def error(update, context):
"""Log Errors caused by Updates."""
logger.warning('Update "%s" caused error "%s"', update, context.error)
def main():
"""Start the bot."""
# Create the Updater and pass it your bot's token.
# Make sure to set use_context=True to use the new context based callbacks
# Post version 12 this will no longer be necessary
token = "!!!!!!!!!!TOKEN!!!!!!!!!!!"
updater = Updater(token, use_context=True)
# Get the dispatcher to register handlers
dp = updater.dispatcher
# on different commands - answer in Telegram
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("help", help))
# on noncommand i.e message - echo the message on Telegram
dp.add_handler(MessageHandler(Filters.text, echo))
# log all errors
dp.add_error_handler(error)
# Start the Bot
updater.start_polling()
# Run the bot until you press Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT. This should be used most of the time, since
# start_polling() is non-blocking and will stop the bot gracefully.
updater.idle()
if __name__ == '__main__':
main()
def start(update, context): Bu metodda /start komutunu gönderdiğimizde geri dönecek mesajı belirtiriz.
def help(update, context): /help komutunu nasıl cevap vereceğini belirtiyoruz.
def echo(update, context): Herhangi bir mesaj gönderdiğimizde bize aynı mesajı dönecek şekilde yazdık.
Bu uygulamayı çalıştırdığımızda artık telegram üretinde oluşturduğumuz bot komutlara yanıt verecektir.
Komut Girmeden Periyodik Mesajlar Göndermek
Kullanıcıdan herhangi bir komut girmesini beklemeden, botun periyodik mesajlar göndermesi de mümkün. Bunun için yapman gereken bir job_queue objesi oluşturup, onun aracılığıyla mesaj göndermek olacaktır.
j = updater.job_queue
job_minute = j.run_repeating(callback_minute, interval=60, first=10)
callback_minute metodunu tanımlayalım:
def callback_minute(context: telegram.ext.CallbackContext):
context.bot.send_message(chat_id='@chat_id',
text='One message every minute')
j.run_repeating komutuyla 60 saniyede bir mesaj göndereceğimizi, ilk mesajı da 10.saniyede göndereceğimizi belirtmiş olursun.
Kodun tamamını görelim:
import logging
import telegram
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
# Define a few command handlers. These usually take the two arguments update and
# context. Error handlers also receive the raised TelegramError object in error.
def start(update, context):
"""Send a message when the command /start is issued."""
update.message.reply_text('Hi!')
def help(update, context):
"""Send a message when the command /help is issued."""
update.message.reply_text('Help!')
def echo(update, context):
"""Echo the user message."""
update.message.reply_text(update.message.text)
def error(update, context):
"""Log Errors caused by Updates."""
logger.warning('Update "%s" caused error "%s"', update, context.error)
def callback_minute(context: telegram.ext.CallbackContext):
context.bot.send_message(chat_id='SENINCHATIDIN',
text='One message every minute')
def main():
"""Start the bot."""
# Create the Updater and pass it your bot's token.
# Make sure to set use_context=True to use the new context based callbacks
# Post version 12 this will no longer be necessary
token = "!!!!!!!!TOKEN!!!!!!!!!!!!"
updater = Updater(token, use_context=True)
j = updater.job_queue
job_minute = j.run_repeating(callback_minute, interval=60, first=10)
# Get the dispatcher to register handlers
dp = updater.dispatcher
# on different commands - answer in Telegram
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("help", help))
# on noncommand i.e message - echo the message on Telegram
dp.add_handler(MessageHandler(Filters.text, echo))
# log all errors
dp.add_error_handler(error)
# Start the Bot
updater.start_polling()
myuser_id = 'SENINUSERIDIN'
# Run the bot until you press Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT. This should be used most of the time, since
# start_polling() is non-blocking and will stop the bot gracefully.
updater.idle()
if __name__ == '__main__':
main()
Uygulama çalışmaya başlayınca bot her dakika mesaj gönderecektir.
Id Değerini (chat_id) Nasıl Öğrenirsin
Bir bot kendi kendine mesaj göndermeyeceği için, başka bir kullanıcı aracılığıyla onu yönetirsin. Dolayısıyla bir chat-id değerine ihtiyacın var.
Kendi şahsınızın chat-id değerini öğrenmek için tek yapman gereken, başka bir bottan yardım almak olacaktır.
@userinfobot botuna telegram uygulamasından bağlanırsan, sana kullanıcı bilgilerini dönecektir:
Bağlantı kurduktan sonra START komutunu çalıştırınca sana id değerini dönecektir.
Telegram Botunun Tek Bir Mesaj Göndermesi
Telegram botundan periyodik olmayan, herhangi bir komuta da karşılık gelmeyen tek bir mesaj göndermek için yapmanız gereken, send_message komutunu çalıştırmak olacaktır:
updater.dispatcher.bot.send_message(chat_id='SENIN_USER_ID_DEGERIN', text='Ansızın mesaj gönderiyorum!')
Kodun tamamını tekrar yazalım:
import logging
import telegram
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
# Define a few command handlers. These usually take the two arguments update and
# context. Error handlers also receive the raised TelegramError object in error.
def start(update, context):
"""Send a message when the command /start is issued."""
update.message.reply_text('Hi!')
def help(update, context):
"""Send a message when the command /help is issued."""
update.message.reply_text('Help!')
def echo(update, context):
"""Echo the user message."""
update.message.reply_text(update.message.text)
def error(update, context):
"""Log Errors caused by Updates."""
logger.warning('Update "%s" caused error "%s"', update, context.error)
def callback_minute(context: telegram.ext.CallbackContext):
context.bot.send_message(chat_id='SENIN_CHAT_ID',
text='Dakikada bir mesaj gönderiyorum')
def main():
"""Start the bot."""
# Create the Updater and pass it your bot's token.
# Make sure to set use_context=True to use the new context based callbacks
# Post version 12 this will no longer be necessary
token = "OLUSTURDUGUN_BOT_TOKEN_DEGERIN"
updater = Updater(token, use_context=True)
j = updater.job_queue
job_minute = j.run_repeating(callback_minute, interval=60, first=10)
# Get the dispatcher to register handlers
dp = updater.dispatcher
# on different commands - answer in Telegram
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("help", help))
# on noncommand i.e message - echo the message on Telegram
dp.add_handler(MessageHandler(Filters.text, echo))
# log all errors
dp.add_error_handler(error)
# Start the Bot
updater.start_polling()
myuser_id = 'SENIN_USER_ID'
updater.dispatcher.bot.send_message(chat_id=myuser_id, text='Ansızın mesaj gönderiyorum!')
# Run the bot until you press Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT. This should be used most of the time, since
# start_polling() is non-blocking and will stop the bot gracefully.
updater.idle()
if __name__ == '__main__':
main()
Sonuç
Telegram geliştiricilere yönelik pek çok faydalı özelliği ile öne çıkmıştır. Bot yazabilmek bunlardan bir tanesi. Yazımda python dili ile bir botu nasıl yönetebileceğini ve faydalı bir hale getireceğini görmüş oldun.
FAYDALANDIĞIM KAYNAKLAR
Bots: An introduction for developers (telegram.org)
GitHub – python-telegram-bot/python-telegram-bot: We have made you a wrapper you can’t refuse
Code snippets · python-telegram-bot/python-telegram-bot Wiki · GitHub
Extensions – Your first Bot · python-telegram-bot/python-telegram-bot Wiki · GitHub
Emeğin için teşekkürler. Gayet temiz ve verimli bir kod yazmışsın. Kullanmaya başladım bile.
gruba nasıl yazdırabiliriz peki? grup_id nasıl alınabilir?
hocam trading bot için kullanmayı düşünüyorum. alış ve satış yaptığında bildirim atması için. acaba sadece mesaj attırmak için while döngüsü içinde nasıl kullanabiliriz. kafam çok karıştı.
if __name__ == ‘__main__’:
main()
kısmını döngüye sokacakmıyız yoksa ilk imort kısmının altında bırakacakmıyız. sürekli hata alıyorum.
(*import yazacaktım yanlış oldu)
Hocam from telegram.ext import …. kısmında
Şöyle bir hata veriyor: No module named ‘telegram.ext’: ‘telegram’ is not a package
İmport telegram deyince problem yok ve pip ile ‘pip install python-telegram-bot’ u sıkıntısız kurdum lütfen yardım edin hocam.
Hocam selam,
Size ulasmak istiyorum, iletisim icin mail adresinizi bulamadim.
Sizinle iletisime gecebilir miyim
Teşekkürler hocam kullandım.