Загрузка...

Скрипт Парни помогите пожалуйста по боту не приходят уведомления

Тема в разделе Python создана пользователем GUYI 4 июл 2025. 145 просмотров

  1. GUYI
    GUYI Автор темы 4 июл 2025 3 16 май 2025
    Есть один очень простой бот Расписание молитв. Если кратко в админке создается список времени молитв на определенные даты
    [IMG]
    У Каждого запустившего бота вот такая менюшка
    [IMG]

    Проблема в том что включай уведомления что не включай они не приходят
    в логах вот так​
    [IMG]

    Весь Код бота​
    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()
    Так же при первом запуске создается бд ​
    [IMG]
    Вроде в нее расписания записываются но уведумы не идут. Есть кто добрый помогите пожалуйста​
     
  2. Дора
    Дора 4 июл 2025 Дешевые звезды https://lolz.live/threads/8705237/ 2551 25 ноя 2020
    а дай тег бота
     
    1. God_likeGL Layer 1
      :senko: Дора, молиться будешь?)
    2. Дора
  3. Архистратиг
    Архистратиг 4 июл 2025 продаюсь как дешевая шлюха - https://lolz.live/threads/7421153/ 16 548 26 июл 2020
    У тебя в коде отсутствует отправка сообщений полностью
    job_quene просто существует, но нет никаких критериев, он не понимает кому и что отправлять
     
    1. Апатия
      GUYI, я откуда знаю, зайди в раздел да напиши тому кто занимается подобным
    2. GUYI Автор темы
      Апатия, Тьфу блин я не так прочел подумал ты напишешь
    3. Апатия
  4. Aisan
    Aisan 4 июл 2025 Ничего не продаю и не создаю. Не пишите мне 15 755 26 авг 2020
    Спасибо за токен епта
     
    4 июл 2025 Изменено
    1. GUYI Автор темы
      Aisan, Пожалуйста дарю
Загрузка...
Top