Как отправить сообщение для всех "chat_id", которые есть в БД (SQLite3) ? pyTelegramBotAPI

Суть в том, что сейчас нужно для каждого пользователя каждый раз писать его chat_id (который берется из базы данных), а нужно чтобы chat_id автоматически подтягивался из неё. Ниже предоставил отрывок кода, в котором и содержится проблема.

import telebot
import sqlite3 as sl
from telebot import types
import threading
import time
import schedule
import datetime
from datetime import datetime, timezone, timedelta

bot = telebot.TeleBot('TOKEN')

#Вот тут нужно, чтобы бот отправлял сообщение не только этим трём юзерам, а всем юзерам, чей chat_id записан в БД

def notification_365_days():#Напоминалка воскресение и среду
    bot.send_message(chat_id=***********, text="Подготовьте инкассацию!") #1 коллега
    bot.send_message(chat_id=**********, text="Подготовьте инкассацию!") #Я
    bot.send_message(chat_id=**********, text="Подготовьте инкассацию!") #2 коллега


def schedule_func():
    schedule.every().wednesday.at('23:00').do(notification_365_days)
    schedule.every().tuesday.at('23:00').do(notification_365_days)

    while True:
        schedule.run_pending()
        time.sleep(1)

thread = threading.Thread(target=schedule_func)
thread.start()

con = sl.connect('reports.db')
# открываем файл
with con:
    # получаем количество таблиц с нужным нам именем
    data = con.execute("select count(*) from sqlite_master where type='table' and name='reports'")
    for row in data:
        # если таких таблиц нет
        if row[0] == 0:
            # создаём таблицу для отчётов
            with con:
                con.execute("""
                    CREATE TABLE reports (
                        datetime VARCHAR(40) PRIMARY KEY,
                        date VARCHAR(20),
                        id VARCHAR(200),
                        name VARCHAR(200),
                        text VARCHAR(500)
                    );
                """)

# обрабатываем входящий отчёт пользователя
@bot.message_handler(content_types=['text'])
def func(message):
    # подключаемся к базе
    con = sl.connect('reports.db')
    # подготавливаем запрос
    sql = 'INSERT INTO reports (datetime, date, id, name, text) values(?, ?, ?, ?, ?)'
    # получаем дату и время
    now = datetime.now(timezone.utc)
    # и просто дату
    date = now.date()
    # формируем данные для запроса
    data = [
        (str(now), str(date), str(message.from_user.id), str(message.from_user.username), str(message.text[:500]))
    ]
    # добавляем с помощью запроса данные
    with con:
        con.executemany(sql, data)
    # отправляем пользователю сообщение о том, что отчёт принят
    bot.send_message(message.from_user.id, 'Принято, спасибо!', parse_mode='Markdown')

bot.polling(none_stop=True)

Ответы (1 шт):

Автор решения: Алексей Сундеев
def send_message_to_all_users(text):
    # Подключаемся к базе данных
    con = sl.connect('reports.db')
    
    # Извлекаем все chat_id из таблицы
    with con:
        result = con.execute("SELECT DISTINCT id FROM reports")  # DISTINCT, чтобы не было дублирования
        chat_ids = [row[0] for row in result]  # Собираем все chat_id в список

    # Отправляем сообщение каждому chat_id
    for chat_id in chat_ids:
        try:
            bot.send_message(chat_id, text)
        except Exception as e:
            print(f"Ошибка при отправке сообщения пользователю {chat_id}: {e}")

# Пример использования:
send_message_to_all_users("Это сообщение для всех пользователей!")

В этом примере: Извлекаем все уникальные id из таблицы reports. Перебираем все chat_id и отправляем каждому сообщение.

→ Ссылка