Как отправить сообщение для всех "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 и отправляем каждому сообщение.