Herkese Selam , geliştirdiğim telegram entegrasyonlu haber bot projesi kodlarını paylaşıyorum kullanımı şöyledir açılan arayüzde token kısmına oluşturduğunuz ve kanalınıza eklediğniz bot tokenı girip kanal ekle kısmındada kanal isimlerinizi ekledikten sonra altta dakika cinsinden süre ayarını girip sol üst köeşedki başlat butonuna basınca haberler kanallarınızda paylaşılamya başlayacaktır istediğiniz kadar kanal ekleyebilirsiniz eşanlı paylaşım yapılır.
Python:
import asyncio
import threading
import requests
from bs4 import BeautifulSoup
from telegram import Bot
import customtkinter as ctk
from tkinter import messagebox
# Bot Ayarları
bot_token = None
channel_names = []
sent_news = set()
polling_task = None
polling_interval = 300 # Varsayılan: 5 dakika
URL = 'https://www.sondakika.com/guncel'
async def send_news(bot, interval, duration):
start_time = asyncio.get_event_loop().time()
while True:
if asyncio.get_event_loop().time() - start_time >= duration:
print("Belirtilen süre doldu, bot haber göndermeyi durduruyor.")
break
try:
response = requests.get(URL)
soup = BeautifulSoup(response.text, 'html.parser')
news_list = soup.find('ul', class_='news-list')
news_items = news_list.find_all('li')
for item in reversed(news_items):
title = item.find('span', class_='title').text.strip()
link = "https://www.sondakika.com" + item.find('a')['href']
if link not in sent_news:
sent_news.add(link)
news_response = requests.get(link)
news_soup = BeautifulSoup(news_response.text, 'html.parser')
news_title = news_soup.find('h1', class_='haber_baslik').text.strip()
news_summary = news_soup.find('h2', id='spot', class_='mt10 haber_ozet').text.strip()
news_image_tag = news_soup.find('div', class_='haberResim')
news_image_url = news_image_tag.find('img')['src'] if news_image_tag else None
hour_info = item.find('span', class_='hour data_calc')['title']
message = f"{news_title}\n\n{news_summary}\n\nSaat: {hour_info}"
# Tüm kanallara eşzamanlı haber gönderimi için görevler oluştur
tasks = []
for channel in channel_names:
if news_image_url:
tasks.append(bot.send_photo(chat_id=channel, photo=news_image_url, caption=message))
else:
tasks.append(bot.send_message(chat_id=channel, text=message))
await asyncio.gather(*tasks)
print(f"Haber gönderildi: {news_title}")
await asyncio.sleep(60)
except Exception as e:
print(f"Haber gönderim hatası: {e}")
await asyncio.sleep(interval)
def start_bot():
global bot_token, polling_task, polling_interval
bot_token = token_entry.get().strip()
interval = interval_entry.get().strip()
if not bot_token:
messagebox.showerror("Hata", "Lütfen bir bot token girin!")
return
if not channel_names:
messagebox.showerror("Hata", "Lütfen en az bir kanal adı ekleyin!")
return
try:
polling_interval = int(interval)
except ValueError:
messagebox.showerror("Hata", "Gönderim aralığı geçerli bir sayı olmalıdır!")
return
duration_minutes = int(duration_entry.get().strip())
duration_seconds = duration_minutes * 60
bot = Bot(token=bot_token)
if polling_task:
messagebox.showerror("Hata", "Bot zaten çalışıyor!")
return
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
polling_task = loop.create_task(send_news(bot, polling_interval, duration_seconds))
threading.Thread(target=loop.run_forever, daemon=True).start()
messagebox.showinfo("Başarı", f"Bot başlatıldı! Haberler {duration_minutes} dakika boyunca gönderilecek.")
def stop_bot():
global polling_task
if polling_task:
polling_task.cancel()
polling_task = None
messagebox.showinfo("Başarı", "Bot durduruldu!")
else:
messagebox.showerror("Hata", "Bot çalışmıyor!")
def add_channel():
channel = channel_entry.get().strip()
if channel and channel not in channel_names:
channel_names.append(channel)
channel_listbox.insert('end', channel)
channel_entry.delete(0, 'end')
else:
messagebox.showerror("Hata", "Kanal adı geçersiz veya zaten ekli!")
def remove_channel():
selected = channel_listbox.curselection()
if selected:
channel = channel_listbox.get(selected)
channel_names.remove(channel)
channel_listbox.delete(selected)
else:
messagebox.showerror("Hata", "Lütfen bir kanal seçin!")
# Modern Arayüz Ayarları
ctk.set_appearance_mode("dark")
ctk.set_default_color_theme("blue")
root = ctk.CTk()
root.title("Telegram Haber Botu")
root.geometry("800x600")
# Üst Panel
top_frame = ctk.CTkFrame(root)
top_frame.pack(fill="x", padx=10, pady=10)
start_button = ctk.CTkButton(top_frame, text="Başlat", command=start_bot)
start_button.pack(side="left", padx=5)
stop_button = ctk.CTkButton(top_frame, text="Durdur", command=stop_bot)
stop_button.pack(side="left", padx=5)
exit_button = ctk.CTkButton(top_frame, text="Çıkış", command=root.quit)
exit_button.pack(side="right", padx=5)
# Orta Panel
body_frame = ctk.CTkFrame(root)
body_frame.pack(fill="both", expand=True, padx=20, pady=10)
ctk.CTkLabel(body_frame, text="Bot Token:").pack(pady=5)
token_entry = ctk.CTkEntry(body_frame, width=300)
token_entry.pack(pady=5)
ctk.CTkLabel(body_frame, text="Kanal Adı:").pack(pady=5)
channel_entry = ctk.CTkEntry(body_frame, width=300)
channel_entry.pack(pady=5)
ctk.CTkButton(body_frame, text="Kanal Ekle", command=add_channel).pack(pady=5)
ctk.CTkLabel(body_frame, text="Eklenen Kanallar:").pack(pady=5)
channel_listbox = ctk.CTkTextbox(body_frame, height=150, width=300)
channel_listbox.pack(pady=5)
ctk.CTkButton(body_frame, text="Kanal Sil", command=remove_channel).pack(pady=5)
ctk.CTkLabel(body_frame, text="Haber Gönderim Süresi (dakika):").pack(pady=5)
duration_entry = ctk.CTkEntry(body_frame, width=100)
duration_entry.pack(pady=5)
ctk.CTkLabel(body_frame, text="Haber Gönderim Aralığı (saniye):").pack(pady=5)
interval_entry = ctk.CTkEntry(body_frame, width=100)
interval_entry.pack(pady=5)
interval_entry.insert(0, str(polling_interval))
root.mainloop()


