Загрузка...

Script Guys, please, please do not receive notifications on the bot

Thread in Python created by GUYI Jul 4, 2025. 152 views

  1. GUYI
    GUYI Topic starter Jul 4, 2025 3 May 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. Дора
    Дора Jul 4, 2025 Дешевые звезды https://lolz.live/threads/8705237/ 2551 Nov 25, 2020
    а дай тег бота
     
    1. God_likeGL Layer 1
      :senko: Дора, молиться будешь?)
    2. Дора
  3. Архистратиг
    Архистратиг Jul 4, 2025 аниме малышка продается - https://lolz.live/threads/7421153/ 16,588 Jul 26, 2020
    У тебя в коде отсутствует отправка сообщений полностью
    job_quene просто существует, но нет никаких критериев, он не понимает кому и что отправлять
     
    1. View previous comments (1)
    2. GUYI Topic starter
      Архистратиг, Да если бы я мог. Я попросил человека написать этого бота он сделал а как отправку уведумов сделать не знает. А дорого будет доделать?
    3. Апатия
      GUYI, за бесплатно такое напишут за отзыв, в раздел бесплатной разработки зайди
    4. GUYI Topic starter
      Апатия, Буду очень благодарен. Что от меня требуется?
    5. View the next comments (3)
  4. Aisan
    Aisan Jul 4, 2025 Ничего не продаю и не создаю. Не пишите мне 15,754 Aug 26, 2020
    Спасибо за токен епта
     
    1. GUYI Topic starter
      Aisan, Пожалуйста дарю
Loading...
Top