@Ross_F1

Почему Телеграм-бот не находит в БД sqlite3 подписчика чтобы удалить?

почему бот не может удалить подписчика из БД sqlite3. Вместо этого выполняет условие когда ID пользователя не найдено в БД и пишет в чат: "Вы не подписаны". Пробовал разные варианты кода, менял его структуру, но уже несколько дней ничего не получается. Буду очень признателен за любую помощь. Вот мой скрипт бота:
import telebot
from telebot import types
import sqlite3
from subscribers_db import SubscribersDB
import logging

# Токен Telegram-бота от BotFather
bot_token = 'token'

# Настройка логирования
logging.basicConfig(filename='bot.log', level=logging.INFO, format='%(asctime)s [%(levelname)s] - %(message)s')

# Создаем экземпляр бота
bot = telebot.TeleBot(bot_token)

# Создаем экземпляр базы данных подписчиков
subscribers_db = SubscribersDB('subscribers.db')

# Функция для получения списка подписчиков из базы данных
def get_subscribers():
    # Создаем лог-запись
    logging.info("Getting subscribers from the database.")

    conn = sqlite3.connect('subscribers.db')
    cursor = conn.cursor()

    cursor.execute('SELECT chat_id FROM subscribers')
    subscribers = [row[0] for row in cursor.fetchall()]

    conn.close()
    # Логируем завершение функции
    logging.info("Subscribers retrieved successfully.")
    return subscribers


# Обработчик команды /subscribe
@bot.message_handler(commands=['subscribe'])
def subscribe(message):
    chat_id = message.chat.id
    logging.info(f"User {chat_id} is about to be checked for subscription.")

    # Проверяем, есть ли уже запись с данным chat_id в базе данных
    if not subscribers_db.is_subscriber(chat_id):
        subscribers_db.add_subscriber(chat_id)
        bot.send_message(chat_id, "Вы успешно подписались на бота!")
    else:
        bot.send_message(chat_id, "Вы уже подписаны на бота.")

    if subscribers_db.is_subscriber(chat_id):
        logging.info(f"User {chat_id} is a subscriber.")
    else:
        logging.info(f"User {chat_id} is not a subscriber.")

# Обработчик команды /unsubscribe
@bot.message_handler(commands=['unsubscribe'])
def unsubscribe(message):
    chat_id = message.chat.id
    logging.info(f"User {chat_id} is about to be unsubscribed.")

    if subscribers_db.is_subscriber(chat_id):
        subscribers_db.remove_subscriber(chat_id)
        bot.send_message(chat_id, "Вы отписались.")
    else:
        bot.send_message(chat_id, "Вы не подписаны")

    logging.info(f"User {chat_id} has been unsubscribed.")

# Обработчик команды /stop
@bot.message_handler(commands=['stop'])
def stop(message):
    chat_id = message.chat.id
    if subscribers_db.is_subscriber(chat_id):
        subscribers_db.remove_subscriber(chat_id)
        bot.send_message(chat_id, "Вы отписались.")
    else:
        bot.send_message(chat_id, "Вы не подписаны.")

    logging.info(f"User {chat_id} has been unsubscribed.")

## Эту часть кода я размещал и перед обработчиками команд, но результат не изменился
# Добавление методов в класс SubscribersDB:
# Метод для добавления подписчика
def add_subscriber(self, chat_id):
    conn = sqlite3.connect(self.db_name, check_same_thread=False)
    cursor = conn.cursor()
    cursor.execute('INSERT OR IGNORE INTO subscribers (chat_id) VALUES (?)', (chat_id,))
    conn.commit()
    conn.close()

# Метод для удаления подписчика
def remove_subscriber(self, chat_id):
    cursor = self.conn.cursor()
    cursor.execute("DELETE FROM subscribers WHERE chat_id = ?", (chat_id,))
    self.conn.commit()

# Метод для проверки, является ли пользователь подписчиком
def is_subscriber(self, chat_id):
    cursor = self.conn.cursor()
    cursor.execute("SELECT * FROM subscribers WHERE chat_id = ?", (chat_id,))
    return cursor.fetchone() is not None

# Обработчик команды /start
@bot.message_handler(commands=['start'])
def send_welcome(message):
    chat_id = message.chat.id

    # Открываем базу данных и создаем курсор
    conn = sqlite3.connect('subscribers.db', check_same_thread=False,)
    cursor = conn.cursor()

    if not subscribers_db.is_subscriber(chat_id):
        # Добавляем пользователя в базу данных
        cursor.execute('INSERT OR IGNORE INTO subscribers (chat_id) VALUES (?)', (chat_id,))
        conn.commit()

    # Закрываем соединение
    conn.close()

    # Создаем клавиатуру с кнопками под полем для ввода текста
    markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True, one_time_keyboard=False)
    Reply_item1 = types.KeyboardButton(" ")
    Reply_item2 = types.KeyboardButton(" ")
    Reply_item3 = types.KeyboardButton(" ")
    Reply_item4 = types.KeyboardButton(" ")
    Reply_item5 = types.KeyboardButton(" ")
    Reply_item6 = types.KeyboardButton("⚙ Все действия")

    markup.row(Reply_item1, Reply_item2)
    markup.row(Reply_item3, Reply_item4)
    markup.row(Reply_item5)
    markup.row(Reply_item6)

# Отправляем приветственное сообщение с клавиатурой
    bot.send_message(message.chat.id,
        "<b>Приветствуем. Чтобы отписаться: «/stop» или «/unsubscribe»\nвсе действия /show\n",
        parse_mode='HTML', reply_markup=markup)

# далее идут кнопки бота и обработчик рассылки, описывать не буду

## это зачем-то в коде, возможно ненужное забыл удалить, но покажу уже всё как есть
# Создаем экземпляр базы данных
db = SubscribersDB('subscribers.db')

# Открываем базу данных в бинарном режиме
conn = sqlite3.connect('subscribers.db', check_same_thread=False)

# Запускаем бота
bot.polling()


Далее у меня есть ещё второй файл в папке проэкта для Определение класса SubscribersDB "subscribers_db.py"
import sqlite3

class SubscribersDB:
    def __init__(self, db_file):
        self.conn = sqlite3.connect(db_file)
        self.cursor = self.conn.cursor()
        self.create_table()

    def create_table(self):
        self.cursor.execute('''
            CREATE TABLE IF NOT EXISTS subscribers (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                chat_id INTEGER UNIQUE
            )
        ''')
        self.conn.commit()

    def get_subscribers(self):
        self.cursor.execute('SELECT chat_id FROM subscribers')
        subscribers = [row[0] for row in self.cursor.fetchall()]
        return subscribers

    def add_subscriber(self, chat_id):
        self.cursor.execute('INSERT OR IGNORE INTO subscribers (chat_id) VALUES (?)', (chat_id,))
        self.conn.commit()

    def remove_subscriber(self, chat_id):
        self.cursor.execute('DELETE FROM subscribers WHERE chat_id = ?', (chat_id,))
        self.conn.commit()

    def close(self):
        self.conn.close()

    def is_subscriber(self, chat_id):
        pass


Файл БД также в одной и той же папке проэкта "subscribers.db"
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 1
lllrikitikilll
@lllrikitikilll
В subscribers_db.py метод "is_subscriber(self, chat_id): pass" он возвращает None так как он ничего не делает, от того у тебя уходит в else "Вы не подписаны". Но это лишь догадка, на первый взгляд
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы