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
Bot Özellikleri:
/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.
/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.
ı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:
Mesajınız
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"""
Merhaba {user.first_name}!
Bu bot ile duyurularınızı alabilirsiniz.
• Kanal duyuruları
• Özel mesaj duyuruları
• Anlık bildirimler
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, "
return
args = message.text.split(' ', 1)
if len(args) < 2:
bot.send_message(message.chat.id,
"
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("
keyboard.add(types.InlineKeyboardButton("
keyboard.add(types.InlineKeyboardButton("
bot.send_message(message.chat.id,
f"
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, "
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"
parse_mode='Markdown')
else:
bot.send_message(message.chat.id,
"
@bot.message_handler(commands=['stats'])
def stats(message):
if message.from_user.id not in ADMIN_IDS:
bot.send_message(message.chat.id, "
return
users = db.get_all_users()
channels = db.get_all_channels()
stats_text = f"
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 <mesaj>` - Duyuru gönder
• `/add_channel` - Kanal/grup ekle (kanal içinde kullanın)
• `/stats` - Bot istatistikleri
1. Botu kanala/gruba ekleyin
2. Kanal/grupta `/add_channel` komutunu çalıştırın
3. `/duyuru Mesajınız` ile duyuru gönderin
else:
help_text = """
Bu bot ile duyuruları alabilirsiniz.
• `/start` - Botu başlat ve kayıt ol
• `/help` - Bu yardım mesajı
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, "
return
if user_id not in pending_announcements:
bot.answer_callback_query(call.id, "
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("
return
elif data == "type_channel":
channels = db.get_all_channels()
if not channels:
bot.edit_message_text("
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"
keyboard.add(types.InlineKeyboardButton("
keyboard.add(types.InlineKeyboardButton("
pending_announcements[user_id]['step'] = 'choose_channel'
bot.edit_message_text("
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("
keyboard.add(types.InlineKeyboardButton("
keyboard.add(types.InlineKeyboardButton("
bot.edit_message_text(f"
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"
bot.edit_message_text(f"
call.message.chat.id, call.message.message_id)
except Exception as e:
bot.edit_message_text(f"
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"
success_count += 1
except:
failed_count += 1
bot.edit_message_text(f"
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"
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"
success_count += 1
time.sleep(0.05)
except:
failed_count += 1
bot.edit_message_text(f"
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("
keyboard.add(types.InlineKeyboardButton("
keyboard.add(types.InlineKeyboardButton("
bot.edit_message_text(f"
call.message.chat.id, call.message.message_id,
reply_markup=keyboard, parse_mode='Markdown')
if __name__ == '__main__':
print("
bot.infinity_polling(none_stop=True)
İyi Kullanımlar.
Made By s1mples