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