# -*- coding: utf-8 -*- import telebot import requests import random import logging import os import re # Настройка логирования logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) # Конфигурация - ЗАМЕНИТЕ НА СВОИ ДАННЫЕ! TOKEN = "TOken ID" CHANNEL_ID = "channel name or ID" TOPIC_ID = number channel (28856) ADMIN_IDS = [Your ID] bot = telebot.TeleBot(TOKEN) class JokeGenerator: def __init__(self): self.gai_jokes = self.load_jokes_from_file('GAI.txt', self.get_default_gai_jokes()) self.moto_jokes = self.load_jokes_from_file('MOTO.txt', self.get_default_moto_jokes()) self.general_jokes = self.load_jokes_from_file('GENERAL.txt', self.get_default_general_jokes()) logger.info(f"Загружено анекдотов: ГАИ - {len(self.gai_jokes)}, МОТО - {len(self.moto_jokes)}, ОБЩИЕ - {len(self.general_jokes)}") def load_jokes_from_file(self, filename, default_jokes): try: if os.path.exists(filename): with open(filename, 'r', encoding='utf-8') as file: jokes = [line.strip() for line in file if line.strip() and not line.startswith('#')] if jokes: logger.info(f"Загружено {len(jokes)} анекдотов из {filename}") return jokes else: logger.warning(f"Файл {filename} пустой, используются анекдоты по умолчанию") return default_jokes else: logger.warning(f"Файл {filename} не найден, создан пустой файл") with open(filename, 'w', encoding='utf-8') as file: file.write("# Добавляйте анекдоты по одному на строку\n") file.write("# Пустые строки и строки начинающиеся с # игнорируются\n") return default_jokes except Exception as e: logger.error(f"Ошибка загрузки анекдотов из {filename}: {e}") return default_jokes def get_default_gai_jokes(self): return [ "Останавливает гаишник машину: - Ваши права! - А за что? - А вы на красный свет проехали! - Да чтоб вы знали, у меня зрение 100%! - Хорошо, тогда проедьте еще раз...", "Сотрудник ГАИ останавливает водителя: - Вы знаете, что у вас задний фонарь не работает? - Да что вы! Я даже не знал, что выехал!", ] def get_default_moto_jokes(self): return [ "Объявление: 'Продам мотоцикл. Не бит, не крашен. Просто папа женился, и мама сказала, что или он, или я.'", "Почему мотоциклисты не боятся дождя? Потому что они и так уже мокрые от слез счастья, когда едут.", ] def get_default_general_jokes(self): return [ "Программист ставит чайник с водой на плиту, чтобы попить чаю. Ждет-ждет, не закипает. Посмотрел - а он забыл его включить.", "Почему программисты путают Хэллоуин и Рождество? Потому что Oct 31 == Dec 25.", ] def reload_jokes(self): self.gai_jokes = self.load_jokes_from_file('GAI.txt', self.get_default_gai_jokes()) self.moto_jokes = self.load_jokes_from_file('MOTO.txt', self.get_default_moto_jokes()) self.general_jokes = self.load_jokes_from_file('GENERAL.txt', self.get_default_general_jokes()) return True def get_joke_from_rzhunemogu(self, ctype=1): url = f"http://rzhunemogu.ru/RandJSON.aspx?CType={ctype}" try: response = requests.get(url, timeout=10) response.encoding = 'windows-1251' raw_text = response.text if raw_text.startswith('\r\n'): raw_text = raw_text[2:] match = re.search(r'"content":"(.+?)"', raw_text) if match: joke = match.group(1) joke = joke.replace('\\n', '\n').replace('\\r', '').replace('\\"', '"') return joke else: if '"content":"' in raw_text: joke = raw_text.split('"content":"')[1].split('"')[0] joke = joke.replace('\\n', '\n').replace('\\r', '').replace('\\"', '"') return joke else: return "Не удалось распарсить анекдот с сайта" except requests.exceptions.Timeout: logger.error("Таймаут при получении анекдота с rzhunemogu") return "Сайт с анекдотами временно недоступен. Попробуйте позже." except requests.exceptions.ConnectionError: logger.error("Ошибка соединения с rzhunemogu") return "Нет соединения с сайтом анекдотов. Проверьте интернет." except Exception as e: logger.error(f"Ошибка при парсинге анекдота с rzhunemogu: {e}") return "Произошла ошибка при получении анекдота. Попробуйте еще раз." def get_gai_joke(self): return random.choice(self.gai_jokes) if self.gai_jokes else "Пока нет анекдотов про ГАИ" def get_moto_joke(self): return random.choice(self.moto_jokes) if self.moto_jokes else "Пока нет анекдотов про мотоциклы" def get_general_joke(self): return random.choice(self.general_jokes) if self.general_jokes else "Пока нет общих анекдотов" joke_gen = JokeGenerator() def is_admin(user_id): return user_id in ADMIN_IDS def send_to_channel(joke, joke_type="анекдот"): try: bot.send_message( chat_id=CHANNEL_ID, message_thread_id=TOPIC_ID, text=f"😂 {joke_type}:\n\n{joke}" ) return True except Exception as e: logger.error(f"Ошибка отправки в канал: {e}") return False @bot.message_handler(commands=['start', 'help']) def send_welcome(message): welcome_text = f""" 🤖 Привет! Я бот для анекдотов! 📋 Личные команды: /anekdot - случайный анекдот /anekdot_GAI - анекдот про ГАИ /anekdot_MOTO - анекдот про мотоциклы /random - случайный анекдот с сайта /site_joke [тип] - анекдот с сайта по типу 📢 Команды для канала: /send_gai - отправить анекдот про ГАИ в канал /send_moto - отправить анекдот про мотоциклы в канал /send_general - отправить общий анекдот в канал /send_random - отправить анекдот с сайта в канал /send_mixed - случайный анекдот в канал 📊 Команды управления: /reload_jokes - перезагрузить анекдоты /joke_stats - статистика анекдотов 🌐 Типы анекдотов с сайта: 1-случайные, 2-Вовочка, 3-Штирлиц, 4-поручик Ржевский 5-Чебурашка, 6-детские, 11-семьи, 12-работа 13-алкоголь, 14-политика, 16-студенты, 18-армия """ bot.reply_to(message, welcome_text) @bot.message_handler(commands=['anekdot']) def send_anekdot(message): try: if random.choice([True, False]): joke = joke_gen.get_general_joke() else: joke = joke_gen.get_joke_from_rzhunemogu(1) bot.reply_to(message, f"😂 Анекдот:\n\n{joke}") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "Произошла ошибка.") @bot.message_handler(commands=['anekdot_GAI']) def send_anekdot_gai(message): try: joke = joke_gen.get_gai_joke() bot.reply_to(message, f"🚓 Анекдот про ГАИ:\n\n{joke}") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "Произошла ошибка.") @bot.message_handler(commands=['anekdot_MOTO']) def send_anekdot_moto(message): try: joke = joke_gen.get_moto_joke() bot.reply_to(message, f"🏍️ Анекдот про мотоциклы:\n\n{joke}") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "Произошла ошибка.") @bot.message_handler(commands=['random']) def send_random(message): try: ctype = random.choice([1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 16, 18]) joke = joke_gen.get_joke_from_rzhunemogu(ctype) bot.reply_to(message, f"🎲 Случайный анекдот:\n\n{joke}") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "Произошла ошибка.") @bot.message_handler(commands=['site_joke']) def send_site_joke(message): try: parts = message.text.split() if len(parts) > 1: try: ctype = int(parts[1]) valid_types = [1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 16, 18] if ctype not in valid_types: ctype = 1 except ValueError: ctype = 1 else: ctype = 1 type_names = { 1: "случайные", 2: "про Вовочку", 3: "про Штирлица", 4: "про поручика Ржевского", 5: "про Чебурашку", 6: "детские", 11: "про семьи", 12: "про работу", 13: "про алкоголь", 14: "про политику", 16: "про студентов", 18: "про армию" } type_name = type_names.get(ctype, "случайные") joke = joke_gen.get_joke_from_rzhunemogu(ctype) bot.reply_to(message, f"🌐 Анекдот ({type_name}):\n\n{joke}") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "Ошибка. Формат: /site_joke [тип]") @bot.message_handler(commands=['send_gai']) def send_gai_to_channel(message): if not is_admin(message.from_user.id): bot.reply_to(message, "❌ Только для администраторов!") return try: joke = joke_gen.get_gai_joke() if send_to_channel(joke, "Анекдот про ГАИ 🚓"): bot.reply_to(message, "✅ Отправлен в канал!") else: bot.reply_to(message, "❌ Ошибка отправки") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "❌ Ошибка") @bot.message_handler(commands=['send_moto']) def send_moto_to_channel(message): if not is_admin(message.from_user.id): bot.reply_to(message, "❌ Только для администраторов!") return try: joke = joke_gen.get_moto_joke() if send_to_channel(joke, "Анекдот про мотоциклы 🏍️"): bot.reply_to(message, "✅ Отправлен в канал!") else: bot.reply_to(message, "❌ Ошибка отправки") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "❌ Ошибка") @bot.message_handler(commands=['send_general']) def send_general_to_channel(message): if not is_admin(message.from_user.id): bot.reply_to(message, "❌ Только для администраторов!") return try: joke = joke_gen.get_general_joke() if send_to_channel(joke, "Анекдот 😂"): bot.reply_to(message, "✅ Отправлен в канал!") else: bot.reply_to(message, "❌ Ошибка отправки") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "❌ Ошибка") @bot.message_handler(commands=['send_random']) def send_random_to_channel(message): if not is_admin(message.from_user.id): bot.reply_to(message, "❌ Только для администраторов!") return try: ctype = random.choice([1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 16, 18]) joke = joke_gen.get_joke_from_rzhunemogu(ctype) if send_to_channel(joke, "Случайный анекдот 🎲"): bot.reply_to(message, "✅ Отправлен в канал!") else: bot.reply_to(message, "❌ Ошибка отправки") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "❌ Ошибка") @bot.message_handler(commands=['send_mixed']) def send_mixed_to_channel(message): if not is_admin(message.from_user.id): bot.reply_to(message, "❌ Только для администраторов!") return try: choice = random.choice(['gai', 'moto', 'general', 'random']) if choice == 'gai': joke = joke_gen.get_gai_joke() joke_type = "Анекдот про ГАИ 🚓" elif choice == 'moto': joke = joke_gen.get_moto_joke() joke_type = "Анекдот про мотоциклы 🏍️" elif choice == 'general': joke = joke_gen.get_general_joke() joke_type = "Анекдот 😂" else: ctype = random.choice([1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 16, 18]) joke = joke_gen.get_joke_from_rzhunemogu(ctype) joke_type = "Случайный анекдот 🎲" if send_to_channel(joke, joke_type): bot.reply_to(message, f"✅ Отправлен в канал!") else: bot.reply_to(message, "❌ Ошибка отправки") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "❌ Ошибка") @bot.message_handler(commands=['reload_jokes']) def reload_jokes(message): if not is_admin(message.from_user.id): bot.reply_to(message, "❌ Только для администраторов!") return try: joke_gen.reload_jokes() bot.reply_to(message, "✅ Анекдоты перезагружены!") except Exception as e: logger.error(f"Ошибка: {e}") bot.reply_to(message, "❌ Ошибка") @bot.message_handler(commands=['joke_stats']) def joke_stats(message): stats_text = f""" 📊 Статистика анекдотов: 🚓 ГАИ: {len(joke_gen.gai_jokes)} 🏍️ МОТО: {len(joke_gen.moto_jokes)} 😂 ОБЩИЕ: {len(joke_gen.general_jokes)} 📁 Всего: {len(joke_gen.gai_jokes) + len(joke_gen.moto_jokes) + len(joke_gen.general_jokes)} 📍 Канал: {CHANNEL_ID} 📂 Раздел ID: {TOPIC_ID} """ bot.reply_to(message, stats_text) if __name__ == "__main__": logger.info("Запускаем бота...") try: bot_info = bot.get_me() logger.info(f"Бот @{bot_info.username} запущен!") bot.polling(none_stop=True) except Exception as e: logger.error(f"Ошибка запуска: {e}")