Telegram Bot Duyuru Alt Yapısı

s1mples

C#,C++,C, Python, Web(Html,CSS,JS), java
Super Member
Katılım
16 Ağu 2022
Konular
53
Mesajlar
212
Tepkime puanı
133
RC Point
0
Merhaba! 👋 Bu konu altında size duyuru bot altyapısı vereceğim. Benim kodladigim bir bot altyapısıdır. Aktif olarakta kullanmaktayız.

Bot Özellikleri:

👥 Kullanıcılar için

/start komutu ile botu başlatabilir ve kayıt olabilirsiniz.

/help komutu ile yardım menüsünü görebilirsiniz.

Duyurular size otomatik olarak ulaştırılacaktır.


👑 Yöneticiler için

/duyuru <mesaj> → Duyuru başlatır.

/add_channel → Botu eklediğiniz kanal veya grubu sisteme kaydeder.

/stats → Kullanıcı ve kanal
istatistiklerini gösterir.

Duyuru gönderirken hem kanala hem de tüm kullanıcılara DM atabilirsiniz.


✅ Basit ve hızlı bir şekilde duyuru sistemini yönetebilirsiniz.
❌ Yetkiniz olmayan komutları çalışt
ırmanız mümkün değildir. ( üyeler içindir ve admin İd olmayan kişiler içindir)


Nasıl Kullanılır:
Not: Bu alt yapıdır. BotFather Token Alıp BOT_TOKEN_BURAYA yazan yere tokeninizi giriniz.

Admin İd kısmına da bottaki duyuru gönderme işlevini yapacak kişilerin telegram id katmalisiniz.

Botu ilk önce kullanacağınız kanala ekliyorsunuz. Botu ardından yönetici yapıyoruz. Kanala /add_channel diyip kanalı ekliyoruz. Sonra bot da dm geçip /duyuru mesaj (ör. /duyuru Selam ) yazıyoruz. Bot ardından bize:

📝 Duyuru Mesajı Hazır:

Mesajınız

📍 Nereye göndermek istiyorsunuz?

Kanallara Gönder

Dm Gönder

Kapat

Burda Kanallara Gönder dediğimiz de /add_channel ile eklediğiniz tüm kanallar çıkıyor istiyorsanız birine istiyorsanız hepsine gönderebilirsiniz.


Dm Gönder mantığı da bota /start çeken kullanıcılardır.



Kod:

import telebot
from telebot import types
import sqlite3
import threading
import time

BOT_TOKEN = "BOT_TOKEN_BURAYA"
ADMIN_IDS = [123456789, 987654321]

bot = telebot.TeleBot(BOT_TOKEN, threaded=True)

class Database:
def __init__(self):
self.init_db()

def init_db(self):
conn = sqlite3.connect('bot.db', check_same_thread=False)
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS users
(user_id INTEGER PRIMARY KEY, username TEXT, first_name TEXT)''')
cursor.execute('''CREATE TABLE IF NOT EXISTS channels
(channel_id INTEGER PRIMARY KEY, channel_title TEXT)''')
conn.commit()
conn.close()

def add_user(self, user_id, username=None, first_name=None):
conn = sqlite3.connect('bot.db', check_same_thread=False)
cursor = conn.cursor()
cursor.execute('INSERT OR REPLACE INTO users VALUES (?, ?, ?)',
(user_id, username, first_name))
conn.commit()
conn.close()

def get_all_users(self):
conn = sqlite3.connect('bot.db', check_same_thread=False)
cursor = conn.cursor()
cursor.execute('SELECT user_id FROM users')
users = [row[0] for row in cursor.fetchall()]
conn.close()
return users

def add_channel(self, channel_id, channel_title):
conn = sqlite3.connect('bot.db', check_same_thread=False)
cursor = conn.cursor()
cursor.execute('INSERT OR REPLACE INTO channels VALUES (?, ?)',
(channel_id, channel_title))
conn.commit()
conn.close()

def get_all_channels(self):
conn = sqlite3.connect('bot.db', check_same_thread=False)
cursor = conn.cursor()
cursor.execute('SELECT channel_id, channel_title FROM channels')
channels = cursor.fetchall()
conn.close()
return channels

db = Database()
pending_announcements = {}

@bot.message_handler(commands=['start'])
def start(message):
user = message.from_user
db.add_user(user.id, user.username, user.first_name)

welcome_text = f"""🤖 **Duyuru Botuna Hoş Geldiniz!**

Merhaba {user.first_name}!

Bu bot ile duyurularınızı alabilirsiniz.

📢 **Özellikler:**
• Kanal duyuruları
• Özel mesaj duyuruları
• Anlık bildirimler

✅ Başarıyla kayıt oldunuz!"""

bot.send_message(message.chat.id, welcome_text, parse_mode='Markdown')

@bot.message_handler(commands=['duyuru'])
def duyuru(message):
if message.from_user.id not in ADMIN_IDS:
bot.send_message(message.chat.id, "❌ Bu komutu kullanma yetkiniz yok!")
return

args = message.text.split(' ', 1)
if len(args) < 2:
bot.send_message(message.chat.id,
"❌ Lütfen duyuru mesajını belirtin!\n\n**Kullanım:** `/duyuru Mesajınız buraya`",
parse_mode='Markdown')
return

announcement_text = args[1]
pending_announcements[message.from_user.id] = {
'message': announcement_text,
'step': 'choose_type'
}

keyboard = types.InlineKeyboardMarkup()
keyboard.add(types.InlineKeyboardButton("📢 Kanallara Gönder", callback_data="type_channel"))
keyboard.add(types.InlineKeyboardButton("💬 DM Gönder", callback_data="type_dm"))
keyboard.add(types.InlineKeyboardButton("❌ İptal", callback_data="cancel"))

bot.send_message(message.chat.id,
f"📝 **Duyuru Mesajı Hazır:**\n\n{announcement_text}\n\n📍 **Nereye göndermek istiyorsunuz?**",
reply_markup=keyboard, parse_mode='Markdown')

@bot.message_handler(commands=['add_channel'])
def add_channel(message):
if message.from_user.id not in ADMIN_IDS:
bot.send_message(message.chat.id, "❌ Bu komutu kullanma yetkiniz yok!")
return

chat = message.chat
if chat.type in ['group', 'supergroup', 'channel']:
db.add_channel(chat.id, chat.title)
bot.send_message(message.chat.id,
f"✅ **Kanal/Grup başarıyla eklendi!**\n\n📍 **İsim:** {chat.title}\n🆔 **ID:** {chat.id}\n\nArtık bu kanala duyuru gönderebilirsiniz.",
parse_mode='Markdown')
else:
bot.send_message(message.chat.id,
"❌ Bu komut sadece kanal veya gruplarda kullanılabilir!\n\nBotu bir kanala/gruba ekleyin ve orada bu komutu çalıştırın.")

@bot.message_handler(commands=['stats'])
def stats(message):
if message.from_user.id not in ADMIN_IDS:
bot.send_message(message.chat.id, "❌ Bu komutu kullanma yetkiniz yok!")
return

users = db.get_all_users()
channels = db.get_all_channels()

stats_text = f"📊 **Bot İstatistikleri**\n\n👥 **Toplam Kullanıcı:** {len(users)}\n📢 **Toplam Kanal:** {len(channels)}\n\n📋 **Kayıtlı Kanallar:**\n"

for channel_id, channel_title in channels:
stats_text += f"• {channel_title} ({channel_id})\n"

if not channels:
stats_text += "• Henüz kanal eklenmemiş\n"

bot.send_message(message.chat.id, stats_text, parse_mode='Markdown')

@bot.message_handler(commands=['help'])
def help_command(message):
user_id = message.from_user.id

if user_id in ADMIN_IDS:
help_text = f"""🤖 **Duyuru Botu - Admin Komutları**

📢 **Duyuru Komutları:**
• `/duyuru <mesaj>` - Duyuru gönder
• `/add_channel` - Kanal/grup ekle (kanal içinde kullanın)
• `/stats` - Bot istatistikleri

📋 **Kullanım:**
1. Botu kanala/gruba ekleyin
2. Kanal/grupta `/add_channel` komutunu çalıştırın
3. `/duyuru Mesajınız` ile duyuru gönderin

🔐 **Admin ID'niz:** `{user_id}`"""
else:
help_text = """🤖 **Duyuru Botu**

Bu bot ile duyuruları alabilirsiniz.

📋 **Komutlar:**
• `/start` - Botu başlat ve kayıt ol
• `/help` - Bu yardım mesajı

✅ Duyuruları almak için `/start` komutunu kullanın."""

bot.send_message(message.chat.id, help_text, parse_mode='Markdown')

@bot.callback_query_handler(func=lambda call: True)
def callback_handler(call):
user_id = call.from_user.id

if user_id not in ADMIN_IDS:
bot.answer_callback_query(call.id, "❌ Yetkiniz yok!")
return

if user_id not in pending_announcements:
bot.answer_callback_query(call.id, "❌ Aktif duyuru bulunamadı!")
return

bot.answer_callback_query(call.id)
data = call.data
announcement_data = pending_announcements[user_id]

if data == "cancel":
del pending_announcements[user_id]
bot.edit_message_text("❌ Duyuru iptal edildi.", call.message.chat.id, call.message.message_id)
return

elif data == "type_channel":
channels = db.get_all_channels()

if not channels:
bot.edit_message_text("❌ Kayıtlı kanal bulunamadı!\n\nBotu bir kanala ekleyin ve /add_channel komutunu kullanın.",
call.message.chat.id, call.message.message_id)
del pending_announcements[user_id]
return

keyboard = types.InlineKeyboardMarkup()
for channel_id, channel_title in channels:
keyboard.add(types.InlineKeyboardButton(f"📢 {channel_title}", callback_data=f"channel_{channel_id}"))

keyboard.add(types.InlineKeyboardButton("📢 Tüm Kanallara Gönder", callback_data="all_channels"))
keyboard.add(types.InlineKeyboardButton("🔙 Geri", callback_data="back_to_type"))

pending_announcements[user_id]['step'] = 'choose_channel'
bot.edit_message_text("📢 **Hangi kanala göndermek istiyorsunuz?**",
call.message.chat.id, call.message.message_id,
reply_markup=keyboard, parse_mode='Markdown')

elif data == "type_dm":
users = db.get_all_users()
user_count = len(users)

keyboard = types.InlineKeyboardMarkup()
keyboard.add(types.InlineKeyboardButton("✅ Evet, Gönder", callback_data="confirm_dm"))
keyboard.add(types.InlineKeyboardButton("🔙 Geri", callback_data="back_to_type"))
keyboard.add(types.InlineKeyboardButton("❌ İptal", callback_data="cancel"))

bot.edit_message_text(f"💬 **DM Gönderimi Onayı**\n\n📊 **{user_count}** kullanıcıya mesaj gönderilecek.\n\n**Mesaj:**\n{announcement_data['message']}\n\nDevam etmek istediğinizden emin misiniz?",
call.message.chat.id, call.message.message_id,
reply_markup=keyboard, parse_mode='Markdown')

elif data.startswith("channel_"):
channel_id = int(data.split("_")[1])
message_text = announcement_data['message']

try:
bot.send_message(channel_id, f"📢 **DUYURU**\n\n{message_text}", parse_mode='Markdown')
bot.edit_message_text(f"✅ **Duyuru başarıyla gönderildi!**\n\n📍 **Hedef:** Seçili kanal\n📝 **Mesaj:** {message_text}",
call.message.chat.id, call.message.message_id)
except Exception as e:
bot.edit_message_text(f"❌ **Duyuru gönderilemedi!**\n\n**Hata:** {str(e)}",
call.message.chat.id, call.message.message_id)

del pending_announcements[user_id]

elif data == "all_channels":
channels = db.get_all_channels()
message_text = announcement_data['message']

success_count = 0
failed_count = 0

for channel_id, channel_title in channels:
try:
bot.send_message(channel_id, f"📢 **DUYURU**\n\n{message_text}", parse_mode='Markdown')
success_count += 1
except:
failed_count += 1

bot.edit_message_text(f"📊 **Toplu Kanal Gönderimi Tamamlandı!**\n\n✅ **Başarılı:** {success_count} kanal\n❌ **Başarısız:** {failed_count} kanal\n\n📝 **Mesaj:** {message_text}",
call.message.chat.id, call.message.message_id)

del pending_announcements[user_id]

elif data == "confirm_dm":
users = db.get_all_users()
message_text = announcement_data['message']

bot.edit_message_text(f"📤 **DM gönderimi başlatılıyor...**\n\n👥 {len(users)} kullanıcıya mesaj gönderiliyor...",
call.message.chat.id, call.message.message_id)

def send_bulk_dm():
success_count = 0
failed_count = 0

for user_id_target in users:
try:
bot.send_message(user_id_target, f"📢 **DUYURU**\n\n{message_text}", parse_mode='Markdown')
success_count += 1
time.sleep(0.05)
except:
failed_count += 1

bot.edit_message_text(f"📊 **Toplu DM Gönderimi Tamamlandı!**\n\n✅ **Başarılı:** {success_count} kullanıcı\n❌ **Başarısız:** {failed_count} kullanıcı\n\n📝 **Mesaj:** {message_text}",
call.message.chat.id, call.message.message_id)

threading.Thread(target=send_bulk_dm).start()
del pending_announcements[user_id]

elif data == "back_to_type":
keyboard = types.InlineKeyboardMarkup()
keyboard.add(types.InlineKeyboardButton("📢 Kanallara Gönder", callback_data="type_channel"))
keyboard.add(types.InlineKeyboardButton("💬 DM Gönder", callback_data="type_dm"))
keyboard.add(types.InlineKeyboardButton("❌ İptal", callback_data="cancel"))

bot.edit_message_text(f"📝 **Duyuru Mesajı:**\n\n{announcement_data['message']}\n\n📍 **Nereye göndermek istiyorsunuz?**",
call.message.chat.id, call.message.message_id,
reply_markup=keyboard, parse_mode='Markdown')

if __name__ == '__main__':
print("🤖 Duyuru botu başlatılıyor...")
bot.infinity_polling(none_stop=True)




İyi Kullanımlar.

Made By s1mples
 

Rico

Hayatımı sadece ben değiştirebilirim
Ultra Member
Katılım
4 Eyl 2019
Konular
86
Mesajlar
885
Çözümler
49
Tepkime puanı
1,818
Konum
Moskova
RC Point
0
Üst