Telegram Bot Yapımı ve Python ile Yönetmek Aşırı Kolay

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.

botfather

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:

bot name & username

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 bot token

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.

Bot /start komutuna cevap veriyor

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.

Telegram bot /help komutuna cevap veriyor

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.

telegram timer

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:

telegram userinfobot

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

7 thoughts on “Telegram Bot Yapımı ve Python ile Yönetmek Aşırı Kolay”

  1. 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.

  2. 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.

Yorum bırakın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir