Есть один очень простой бот Расписание молитв. Если кратко в админке создается список времени молитв на определенные даты У Каждого запустившего бота вот такая менюшка Проблема в том что включай уведомления что не включай они не приходят в логах вот так **** Весь Код бота Код import sqlite3 import logging import calendar from datetime import datetime, timedelta from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ( Application, CommandHandler, CallbackQueryHandler, MessageHandler, ContextTypes, filters, ConversationHandler, JobQueue ) ADMIN_PASSWORD = "1234" DB_NAME = "prayer_times.db" TOKEN = "7895727879:AAHj1qxdsPJq-0gTwIZlw9cS4EOwN5Uz7vk" DATE, FAJR, SUNRISE, ASR, MAGHRIB, ISHA, CONFIRM, ADD_MORE = range(8) logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) RUSSIAN_MONTHS = { 1: "Январь", 2: "Февраль", 3: "Март", 4: "Апрель", 5: "Май", 6: "Июнь", 7: "Июль", 8: "Август", 9: "Сентябрь", 10: "Октябрь", 11: "Ноябрь", 12: "Декабрь" } def init_db(): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS schedule (date TEXT PRIMARY KEY, fajr TEXT, sunrise TEXT, asr TEXT, maghrib TEXT, isha TEXT)''') c.execute('''CREATE TABLE IF NOT EXISTS notifications (user_id INTEGER PRIMARY KEY, enabled BOOLEAN)''') c.execute('''CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT, username TEXT, joined_date TEXT)''') conn.commit() conn.close() def save_user(user): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute('''INSERT OR IGNORE INTO users (user_id, first_name, last_name, username, joined_date) VALUES (?, ?, ?, ?, ?)''', (user.id, user.first_name, user.last_name, user.username, datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) conn.commit() conn.close() def get_user_count(): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute("SELECT COUNT(*) FROM users") count = c.fetchone()[0] conn.close() return count def save_to_db(date, times): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute('''REPLACE INTO schedule VALUES (?, ?, ?, ?, ?, ?)''', (date, times['fajr'], times['sunrise'], times['asr'], times['maghrib'], times['isha'])) conn.commit() conn.close() def load_from_db(date): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute("SELECT * FROM schedule WHERE date=?", (date,)) result = c.fetchone() conn.close() if result: return { 'date': result[0], 'fajr': result[1], 'sunrise': result[2], 'asr': result[3], 'maghrib': result[4], 'isha': result[5] } return None def get_notification_status(user_id): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute("SELECT enabled FROM notifications WHERE user_id=?", (user_id,)) result = c.fetchone() conn.close() return result[0] if result else False def set_notification_status(user_id, enabled): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute('''REPLACE INTO notifications VALUES (?, ?)''', (user_id, enabled)) conn.commit() conn.close() def generate_schedule(times): return ( f" Фаджр: {times['fajr']}\n" f" Восход: {times['sunrise']}\n" f" Зухр: 12:05\n" f" Аср: {times['asr']}\n" f" Магриб: {times['maghrib']}\n" f" Иша: {times['isha']}" ) def main_menu_keyboard(user_id=None): if user_id and get_notification_status(user_id): notify_btn = InlineKeyboardButton(" Выключить уведомления", callback_data='notify_off') else: notify_btn = InlineKeyboardButton(" Включить уведомления", callback_data='notify_on') return InlineKeyboardMarkup([ [InlineKeyboardButton(" Сегодня", callback_data='today')], [InlineKeyboardButton(" Завтра", callback_data='tomorrow')], [InlineKeyboardButton(" На месяц", callback_data='month')], [notify_btn], ]) def back_button(user_id=None): return InlineKeyboardMarkup([ [InlineKeyboardButton(" Назад", callback_data='back')] ]) def generate_calendar(): today = datetime.now() year = today.year month = today.month cal = calendar.monthcalendar(year, month) keyboard = [] month_name = RUSSIAN_MONTHS[month] keyboard.append([InlineKeyboardButton(f" {month_name} {year}", callback_data='ignore')]) week_days = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"] keyboard.append([InlineKeyboardButton(day, callback_data='ignore') for day in week_days]) for week in cal: row = [] for day in week: if day == 0: row.append(InlineKeyboardButton(" ", callback_data='ignore')) else: date_str = f"{year}-{month:02d}-{day:02d}" row.append(InlineKeyboardButton(str(day), callback_data=f"date_{date_str}")) keyboard.append(row) keyboard.append([InlineKeyboardButton(" Назад", callback_data='back')]) return InlineKeyboardMarkup(keyboard) def add_more_keyboard(): return InlineKeyboardMarkup([ [ InlineKeyboardButton(" Да", callback_data='add_more_yes'), InlineKeyboardButton(" Нет", callback_data='add_more_no') ] ]) async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): user = update.effective_user save_user(user) await show_main_menu(update, context) async def stat_command(update: Update, context: ContextTypes.DEFAULT_TYPE): user_count = get_user_count() await update.message.reply_text(f" Количество пользователей в боте: {user_count}") async def show_main_menu(update: Update, context: ContextTypes.DEFAULT_TYPE): user_id = update.effective_user.id text = " Расписание молитв:" if update.callback_query: await update.callback_query.edit_message_text(text, reply_markup=main_menu_keyboard(user_id)) else: await update.message.reply_text(text, reply_markup=main_menu_keyboard(user_id)) async def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query await query.answer() user_id = query.from_user.id if query.data == 'today': date_str = datetime.now().strftime("%Y-%m-%d") await show_schedule(query, date_str, user_id) elif query.data == 'tomorrow': date_str = (datetime.now() + timedelta(days=1)).strftime("%Y-%m-%d") await show_schedule(query, date_str, user_id) elif query.data == 'month': await query.edit_message_text(" Выберите дату:", reply_markup=generate_calendar()) elif query.data == 'back': await show_main_menu(update, context) elif query.data.startswith('date_'): date_str = query.data.split('_')[1] await show_schedule(query, date_str, user_id) elif query.data == 'admin': await query.edit_message_text(" Введите пароль админа:") elif query.data in ['notify_on', 'notify_off']: enabled = query.data == 'notify_on' set_notification_status(user_id, enabled) status = "включены" if enabled else "выключены" await query.edit_message_text( f" Уведомления {status}!\n\n Главное меню:", reply_markup=main_menu_keyboard(user_id) ) async def show_schedule(query, date_str, user_id): times = load_from_db(date_str) if times: schedule_text = generate_schedule(times) await query.edit_message_text( f" Расписание на {date_str}:\n\n{schedule_text}", reply_markup=back_button(user_id) ) else: await query.edit_message_text( f" Расписание на {date_str} не найдено", reply_markup=back_button(user_id) ) async def admin_login(update: Update, context: ContextTypes.DEFAULT_TYPE): await update.message.reply_text(" Введите пароль админа:") async def admin_auth(update: Update, context: ContextTypes.DEFAULT_TYPE): if update.message.text == ADMIN_PASSWORD: context.user_data['admin'] = True await update.message.reply_text( " Добро пожаловать в админ-панель!\n\n" " Введите дату в формате ГГГГ-ММ-ДД:" ) return DATE else: await update.message.reply_text(" Неверный пароль!") return ConversationHandler.END async def admin_date(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['date'] = update.message.text await update.message.reply_text(" Введите время Фаджр (формат ЧЧ:ММ):") return FAJR async def admin_fajr(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['fajr'] = update.message.text await update.message.reply_text(" Введите время Восхода (формат ЧЧ:ММ):") return SUNRISE async def admin_sunrise(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['sunrise'] = update.message.text await update.message.reply_text(" Введите время Аср (формат ЧЧ:ММ):") return ASR async def admin_asr(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['asr'] = update.message.text await update.message.reply_text(" Введите время Магриб (формат ЧЧ:ММ):") return MAGHRIB async def admin_maghrib(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['maghrib'] = update.message.text await update.message.reply_text(" Введите время Иша (формат ЧЧ:ММ):") return ISHA async def admin_isha(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['isha'] = update.message.text date = context.user_data['date'] times = { 'fajr': context.user_data['fajr'], 'sunrise': context.user_data['sunrise'], 'asr': context.user_data['asr'], 'maghrib': context.user_data['maghrib'], 'isha': context.user_data['isha'] } save_to_db(date, times) schedule_text = generate_schedule(times) await update.message.reply_text( f" Расписание на {date} сохранено:\n\n{schedule_text}\n\n" "Добавить еще одно расписание?", reply_markup=add_more_keyboard() ) return ADD_MORE async def admin_add_more(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query await query.answer() if query.data == 'add_more_yes': await query.edit_message_text(" Введите дату в формате ГГГГ-ММ-ДД:") return DATE else: await query.edit_message_text( " Работа завершена!\n\n Главное меню:", reply_markup=main_menu_keyboard(query.from_user.id) ) return ConversationHandler.END async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE): user_id = update.effective_user.id await update.message.reply_text( " Действие отменено.\n\n Главное меню:", reply_markup=main_menu_keyboard(user_id) ) return ConversationHandler.END async def send_notifications(context: ContextTypes.DEFAULT_TYPE): job = context.job today = datetime.now().strftime("%Y-%m-%d") times = load_from_db(today) if not times: return schedule_text = generate_schedule(times) await context.bot.send_message( job.chat_id, f" Расписание на сегодня:\n\n{schedule_text}" ) def main(): init_db() application = Application.builder().token(TOKEN).build() job_queue = application.job_queue application.add_handler(CommandHandler("start", start)) application.add_handler(CommandHandler("stat", stat_command)) application.add_handler(CallbackQueryHandler( button_handler, pattern='^(today|tomorrow|month|back|admin|date_.*|notify_on|notify_off|ignore)$' )) conv_handler = ConversationHandler( entry_points=[MessageHandler(filters.TEXT & ~filters.COMMAND, admin_auth)], states={ DATE: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_date)], FAJR: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_fajr)], SUNRISE: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_sunrise)], ASR: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_asr)], MAGHRIB: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_maghrib)], ISHA: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_isha)], ADD_MORE: [CallbackQueryHandler(admin_add_more, pattern='^add_more_(yes|no)$')] }, fallbacks=[CommandHandler('cancel', cancel)] ) application.add_handler(conv_handler) application.add_handler(CommandHandler("admin", admin_login)) application.run_polling() if __name__ == "__main__": main() Python import sqlite3 import logging import calendar from datetime import datetime, timedelta from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ( Application, CommandHandler, CallbackQueryHandler, MessageHandler, ContextTypes, filters, ConversationHandler, JobQueue ) ADMIN_PASSWORD = "1234" DB_NAME = "prayer_times.db" TOKEN = "7895727879:AAHj1qxdsPJq-0gTwIZlw9cS4EOwN5Uz7vk" DATE, FAJR, SUNRISE, ASR, MAGHRIB, ISHA, CONFIRM, ADD_MORE = range(8) logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) RUSSIAN_MONTHS = { 1: "Январь", 2: "Февраль", 3: "Март", 4: "Апрель", 5: "Май", 6: "Июнь", 7: "Июль", 8: "Август", 9: "Сентябрь", 10: "Октябрь", 11: "Ноябрь", 12: "Декабрь" } def init_db(): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS schedule (date TEXT PRIMARY KEY, fajr TEXT, sunrise TEXT, asr TEXT, maghrib TEXT, isha TEXT)''') c.execute('''CREATE TABLE IF NOT EXISTS notifications (user_id INTEGER PRIMARY KEY, enabled BOOLEAN)''') c.execute('''CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT, username TEXT, joined_date TEXT)''') conn.commit() conn.close() def save_user(user): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute('''INSERT OR IGNORE INTO users (user_id, first_name, last_name, username, joined_date) VALUES (?, ?, ?, ?, ?)''', (user.id, user.first_name, user.last_name, user.username, datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) conn.commit() conn.close() def get_user_count(): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute("SELECT COUNT(*) FROM users") count = c.fetchone()[0] conn.close() return count def save_to_db(date, times): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute('''REPLACE INTO schedule VALUES (?, ?, ?, ?, ?, ?)''', (date, times['fajr'], times['sunrise'], times['asr'], times['maghrib'], times['isha'])) conn.commit() conn.close() def load_from_db(date): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute("SELECT * FROM schedule WHERE date=?", (date,)) result = c.fetchone() conn.close() if result: return { 'date': result[0], 'fajr': result[1], 'sunrise': result[2], 'asr': result[3], 'maghrib': result[4], 'isha': result[5] } return None def get_notification_status(user_id): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute("SELECT enabled FROM notifications WHERE user_id=?", (user_id,)) result = c.fetchone() conn.close() return result[0] if result else False def set_notification_status(user_id, enabled): conn = sqlite3.connect(DB_NAME) c = conn.cursor() c.execute('''REPLACE INTO notifications VALUES (?, ?)''', (user_id, enabled)) conn.commit() conn.close() def generate_schedule(times): return ( f" Фаджр: {times['fajr']}\n" f" Восход: {times['sunrise']}\n" f" Зухр: 12:05\n" f" Аср: {times['asr']}\n" f" Магриб: {times['maghrib']}\n" f" Иша: {times['isha']}" ) def main_menu_keyboard(user_id=None): if user_id and get_notification_status(user_id): notify_btn = InlineKeyboardButton(" Выключить уведомления", callback_data='notify_off') else: notify_btn = InlineKeyboardButton(" Включить уведомления", callback_data='notify_on') return InlineKeyboardMarkup([ [InlineKeyboardButton(" Сегодня", callback_data='today')], [InlineKeyboardButton(" Завтра", callback_data='tomorrow')], [InlineKeyboardButton(" На месяц", callback_data='month')], [notify_btn], ]) def back_button(user_id=None): return InlineKeyboardMarkup([ [InlineKeyboardButton(" Назад", callback_data='back')] ]) def generate_calendar(): today = datetime.now() year = today.year month = today.month cal = calendar.monthcalendar(year, month) keyboard = [] month_name = RUSSIAN_MONTHS[month] keyboard.append([InlineKeyboardButton(f" {month_name} {year}", callback_data='ignore')]) week_days = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"] keyboard.append([InlineKeyboardButton(day, callback_data='ignore') for day in week_days]) for week in cal: row = [] for day in week: if day == 0: row.append(InlineKeyboardButton(" ", callback_data='ignore')) else: date_str = f"{year}-{month:02d}-{day:02d}" row.append(InlineKeyboardButton(str(day), callback_data=f"date_{date_str}")) keyboard.append(row) keyboard.append([InlineKeyboardButton(" Назад", callback_data='back')]) return InlineKeyboardMarkup(keyboard) def add_more_keyboard(): return InlineKeyboardMarkup([ [ InlineKeyboardButton(" Да", callback_data='add_more_yes'), InlineKeyboardButton(" Нет", callback_data='add_more_no') ] ]) async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): user = update.effective_user save_user(user) await show_main_menu(update, context) async def stat_command(update: Update, context: ContextTypes.DEFAULT_TYPE): user_count = get_user_count() await update.message.reply_text(f" Количество пользователей в боте: {user_count}") async def show_main_menu(update: Update, context: ContextTypes.DEFAULT_TYPE): user_id = update.effective_user.id text = " Расписание молитв:" if update.callback_query: await update.callback_query.edit_message_text(text, reply_markup=main_menu_keyboard(user_id)) else: await update.message.reply_text(text, reply_markup=main_menu_keyboard(user_id)) async def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query await query.answer() user_id = query.from_user.id if query.data == 'today': date_str = datetime.now().strftime("%Y-%m-%d") await show_schedule(query, date_str, user_id) elif query.data == 'tomorrow': date_str = (datetime.now() + timedelta(days=1)).strftime("%Y-%m-%d") await show_schedule(query, date_str, user_id) elif query.data == 'month': await query.edit_message_text(" Выберите дату:", reply_markup=generate_calendar()) elif query.data == 'back': await show_main_menu(update, context) elif query.data.startswith('date_'): date_str = query.data.split('_')[1] await show_schedule(query, date_str, user_id) elif query.data == 'admin': await query.edit_message_text(" Введите пароль админа:") elif query.data in ['notify_on', 'notify_off']: enabled = query.data == 'notify_on' set_notification_status(user_id, enabled) status = "включены" if enabled else "выключены" await query.edit_message_text( f" Уведомления {status}!\n\n Главное меню:", reply_markup=main_menu_keyboard(user_id) ) async def show_schedule(query, date_str, user_id): times = load_from_db(date_str) if times: schedule_text = generate_schedule(times) await query.edit_message_text( f" Расписание на {date_str}:\n\n{schedule_text}", reply_markup=back_button(user_id) ) else: await query.edit_message_text( f" Расписание на {date_str} не найдено", reply_markup=back_button(user_id) ) async def admin_login(update: Update, context: ContextTypes.DEFAULT_TYPE): await update.message.reply_text(" Введите пароль админа:") async def admin_auth(update: Update, context: ContextTypes.DEFAULT_TYPE): if update.message.text == ADMIN_PASSWORD: context.user_data['admin'] = True await update.message.reply_text( " Добро пожаловать в админ-панель!\n\n" " Введите дату в формате ГГГГ-ММ-ДД:" ) return DATE else: await update.message.reply_text(" Неверный пароль!") return ConversationHandler.END async def admin_date(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['date'] = update.message.text await update.message.reply_text(" Введите время Фаджр (формат ЧЧ:ММ):") return FAJR async def admin_fajr(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['fajr'] = update.message.text await update.message.reply_text(" Введите время Восхода (формат ЧЧ:ММ):") return SUNRISE async def admin_sunrise(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['sunrise'] = update.message.text await update.message.reply_text(" Введите время Аср (формат ЧЧ:ММ):") return ASR async def admin_asr(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['asr'] = update.message.text await update.message.reply_text(" Введите время Магриб (формат ЧЧ:ММ):") return MAGHRIB async def admin_maghrib(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['maghrib'] = update.message.text await update.message.reply_text(" Введите время Иша (формат ЧЧ:ММ):") return ISHA async def admin_isha(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['isha'] = update.message.text date = context.user_data['date'] times = { 'fajr': context.user_data['fajr'], 'sunrise': context.user_data['sunrise'], 'asr': context.user_data['asr'], 'maghrib': context.user_data['maghrib'], 'isha': context.user_data['isha'] } save_to_db(date, times) schedule_text = generate_schedule(times) await update.message.reply_text( f" Расписание на {date} сохранено:\n\n{schedule_text}\n\n" "Добавить еще одно расписание?", reply_markup=add_more_keyboard() ) return ADD_MORE async def admin_add_more(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query await query.answer() if query.data == 'add_more_yes': await query.edit_message_text(" Введите дату в формате ГГГГ-ММ-ДД:") return DATE else: await query.edit_message_text( " Работа завершена!\n\n Главное меню:", reply_markup=main_menu_keyboard(query.from_user.id) ) return ConversationHandler.END async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE): user_id = update.effective_user.id await update.message.reply_text( " Действие отменено.\n\n Главное меню:", reply_markup=main_menu_keyboard(user_id) ) return ConversationHandler.END async def send_notifications(context: ContextTypes.DEFAULT_TYPE): job = context.job today = datetime.now().strftime("%Y-%m-%d") times = load_from_db(today) if not times: return schedule_text = generate_schedule(times) await context.bot.send_message( job.chat_id, f" Расписание на сегодня:\n\n{schedule_text}" ) def main(): init_db() application = Application.builder().token(TOKEN).build() job_queue = application.job_queue application.add_handler(CommandHandler("start", start)) application.add_handler(CommandHandler("stat", stat_command)) application.add_handler(CallbackQueryHandler( button_handler, pattern='^(today|tomorrow|month|back|admin|date_.*|notify_on|notify_off|ignore)$' )) conv_handler = ConversationHandler( entry_points=[MessageHandler(filters.TEXT & ~filters.COMMAND, admin_auth)], states={ DATE: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_date)], FAJR: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_fajr)], SUNRISE: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_sunrise)], ASR: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_asr)], MAGHRIB: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_maghrib)], ISHA: [MessageHandler(filters.TEXT & ~filters.COMMAND, admin_isha)], ADD_MORE: [CallbackQueryHandler(admin_add_more, pattern='^add_more_(yes|no)$')] }, fallbacks=[CommandHandler('cancel', cancel)] ) application.add_handler(conv_handler) application.add_handler(CommandHandler("admin", admin_login)) application.run_polling() if __name__ == "__main__": main() Так же при первом запуске создается бд Фото Вроде в нее расписания записываются но уведумы не идут. Есть кто добрый помогите пожалуйста
У тебя в коде отсутствует отправка сообщений полностью job_quene просто существует, но нет никаких критериев, он не понимает кому и что отправлять