почему бот не может удалить подписчика из БД 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"