Bot/Automation Development
December 5, 2021

Python ile Telegram Bot Kodlamaya Giriş

Bu gönderide Python kullanarak Telegram bot geliştirmeye giriş yapıyoruz.

Giriş - Kurulumlar

Öncelikle, https://my.telegram.org/auth?to=apps adresine gidip, hesabınızla giriş yaparak API_ID ve API_HASH değerini kopyalayın ve not edin.

Sonrasında Telegramda BotFather botunu aratıp /newbot ile yeni bir bot oluşturup tokeni not alın.

Not: Bu rehberde Python 3.10 baz alınarak, Pyrogram modülü kullanılmıştır.

pip install pyrogram
pip tgcrypto
pip apscheduler

Giriş - İçe Aktarılacak Modüller

Önceki başlıkta Git Bash ile modülleri kurduktan sonra artık yapmak gereken modülleri dosyaya aktarmak.

import pyrogram
import tgcrypto
import random
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from pyrogram.types import *
from pyrogram import Client, filters

Pyrogram ve TgCyrpto bot için gerekli, APScheduler ise zamanlama işlemleri için kullanacağımız asenkron modülümüz.

Giriş - İstemci ile Haberleşme

Burada, Pyrogramdan yeni bir nesne türettik, bu Client() nesnesi session_name, api_id, api_hash ve bot token bekler. Geçtiğimiz sayfalarda not aldığınız değerleri bu fonksiyonda aşağıdaki gibi belirtin. Session Name ise botunuzun ismi olabilir.

app = Client(session_name="my_bot", api_id=12345, api_hash="hash", bot_token="bot_token")

Sonraki başlıkta pyrogram'ın gövde elemanlarına değineceğiz. Bundan sonra basit bir Günün Sözü telegram botu yazacağız.

Giriş - Pyrogram Yapısı

app = Client(session_name="bot_name", api_id=12345,
api_hash="hash", bot_token="token" )
# Client() sayesinde istemci ile iletişim kurduk
@app.on_message(filters.group)
# filters ile botun çalışacagt yeri, gruplar ile sınırladık
async def(client, message):
# üstte, asenkron bir fonksiyon yazdık,
# bu fonksiyon client ve message parametrelerini alır
    await send_message(message.chat.id, text='Merhaba Dünya!' )
    # pyrogramda, işlemlerin awaited olması gerekir
    # send_message() Sohbet ID'si ve bir mesaj bekler
    # 0 anki Sohbet ID'sini, message.chat.id yazarak elde ettik
app.run()
# botu başlattık

Botun İşlevlerini Zamanlamak

APScheduler modülümüz ile asenkron olarak eylemleri zamanlayabiliriz.

Bunun için parametre almayan bir adet fonksiyon tanımlayarak, eylemi await ile başlatmadan saf halde Scheduler'e göndermeliyiz.

def job():
    app.send_message(chat_id, 'Kodların Tercümanı' )
# chat_id için @username_to_id_bot'u kullanın
# @app.on_message() işlemi olmadığı için anlık chat_id alamıyoruz.
scheduler = AsyncIOScheduler(timezone="Europe/Istanbul")
# Istanbul saatine göre bir Scheduler nesnesi oluşturduk
scheduler.add_job(job, "interval", hours=24)
# İşlemi her 24 saatte bir tekrarlaması için zamanladık
# hours yerine, minutes, seconds, days vesaire yazabilirsiniz
scheduler.start( )
# zamanlayıcıyı başlattık

Günün Sözü Uygulaması

Aşağıdaki Github reposuna girip, sozler.txt'yi indirin.

Tıkla!

Aşağıda sadece sözleri alabilmek için gereksiz alanları pas geçerek filtreledik.

with open('sozler.txt', 'r', encoding='utf8') as s:
    sentences = s.read().split()
array = []
for sentence in sentences:
    if not sentence.startswith(' ') and sentence.startswith('"'):
        array.append(sentence)

Günün Sözü Uygulaması II

Sonlara yaklaşıyoruz! Bu liste ortalama 1500 farklı söz içeriyor bu yüzden random ile karıştırarak kullanmamız gerekecek.

# İçe Aktarılacaklar Buraya Gelecek
from datetime import datetime as d # Ek Modül
# Sözler Buraya Gelecek
array = [
"Öfke her zaman hüsranla sonuçlanan beklentilerden gelir.",
"Başkaları ile ilgili canımızı sıkan her şey kendimizi
  daha iyi anlamamıza yardımcı olabilir.", "...."
]
random.shuffle(array)
# listeyi karıştırdık
arr = array[0]
# karıştırılan listenin ilk elemanını aldık
app = Client(session_name="bot_name", api_id=12345,
             api_hash="hash", bot_token="token")
    
dx = d.now().today()
date = {"day": dx.day, "month":dx.month, "year": dx.year, 
"hour":dx.hour, "minute": dx.minute}
# datetime'dan dönen zamanı isteğimize göre parçaladık
months = ["", "Ocak", "Şubat", "Mart", "Nisan","Mayıs",
"Haziran","Temmuz","Ağustos","Eylül", "Ekim", "Kasım", "Aralık"]
pattern = f'Bugün, {date["day"]} {months[date["month"]]}
{date["year"]}\n\n'
# günün sözü için bir desen oluşturduk
def gununsozu():
  app.send_message(chat_id, text=f'{pattern}{arr}')
scheduler = AsyncIOScheduler(timezone="Europe/Istanbul")
scheduler.add_job(jobs, "interval", hours=24)
scheduler.start()
# eylemi zamanladık
app.run()
# botumuzu başlattık

Örneğimiz hazır. Artık tek yapmanız gereken kodları toparlamak ve Heroku'ya deploy etmek.

Son Sözler - Deploy

Deploy için gönderimize buradan göz atabilirsiniz.

Bu gönderide elimden geldiğince Pyrogramdan bahsetmeye ve örnekle pekiştirmeye çalıştım, Pyrogram modülü hakkında daha detaylı bilgi için:

Dokümantasyon: https://docs.pyrogram.org/