Telegram bot на Python. Как отправить сообщение пользователю когда наступит определенная дата
по идее он должен после того как пользователь напишет боту команду /nap запустить отслеживание дня матча и когда день матча совпадёт с реальной датой то бот напишет об этом пользователю. Не понимаю как все правильно записать. Функция match_date выполняет сравнение даты с реальным временем.
def match_date(): url = 'https://www.sports.ru/zenit/calendar/' page = requests.get(url) # записываем в переменную page html код страницы clear_date = [] # объявили несколько списков parse_page = [] soup = BeautifulSoup(page.text, "html.parser") #парсим страницу в формате хтмл parse_page = soup.findAll('td', class_="name-td alLeft bordR") #вычленяем их хтмл кода страницы нужный нам участок с играми зенита for data in parse_page: clear_date.append(data.text) clear_date.remove('Дата') #print(filteredNews) for data in clear_date: data2 = data.strip('\n') data2 = data2[:10] data3 = dt.datetime.strptime(data2, '%d.%m.%Y') # даты спарсеные с сайта current_date = str(date.today()) current_date2 = current_date.split("-") current_date2.reverse() current_date3 = ".".join(current_date2) current_date4 = dt.datetime.strptime(current_date3, '%d.%m.%Y') # дата текущего дня в верном формате if current_date4 == current_date4: return True else: return False
а функция Napominalka по идее должна отправить пользователю сообщение что сегодня день матча. Функцию прилагаю.
def napominalka(): url = 'https://www.sports.ru/zenit/calendar/' page = requests.get(url) # записываем в переменную page html код страницы filteredNews = [] # объявили несколько списков allNews = [] new_games = [] old_games = [] new_games.clear() #очистить список, т.к. в него вроде как много говна с предыдущих прогонов записывается soup = BeautifulSoup(page.text, "html.parser") #парсим страницу в формате хтмл allNews = soup.findAll('td', class_="name-td alLeft bordR") #вычленяем их хтмл кода страницы нужный нам участок с играми зенита for data in allNews: filteredNews.append(data.text) filteredNews.remove('Дата') #print(filteredNews) for data in filteredNews: n = str() data2 = data.strip('\n') time = data2[11:16] data2 = data2[:10] data3 = dt.datetime.strptime(data2, '%d.%m.%Y') # даты спарсеные с сайта current_date = str(date.today()) current_date2 = current_date.split("-") current_date2.reverse() current_date3 = ".".join(current_date2) current_date4 = dt.datetime.strptime(current_date3, '%d.%m.%Y') # дата текущего дня в верном формате if data3 < current_date4: old_games.append(f'Зенит играл: ') else: new_games.append(f' в ') if current_date4 == current_date4: n = f'Зенит играет сегодня ' else: n = f'Зенит играет не сегодня' return n
И вот не могу понять как все это увязать чтобы бот следил за датой и в нужный день посылал пользователю сообщение что сегодня день матча. P.S. я нубас с кодинге, конструктивную критику по коду с удовольствием принимаю, но в приоритете конечно решить вопрос.
Как отправить сообщение от имени бота telegram python?
Как можно отправить сообщение пользователям, зная их chat id. И можно ли вообще?
Что-то типо уведомления о изменениях в боте и т.п. (т.е. не пользователь что-то пишет боту и он отвечает, а сам бот уже пишет пользователю).
- Вопрос задан более трёх лет назад
- 42925 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 4
Телеграм-гик
Если они когда-нибудь начинали диалог с ботом и до сих не останавливали его. Подозреваю, что ты используешь библиотеку pyTelegramBotApi, запусти код с bot.send_message(здесь id получателя, 'текст')
Ответ написан более трёх лет назад
Нравится 3 1 комментарий
а как сделать так, чтобы я от лица администратора сам написал сообщение боту, а оно разослалось тем, кто на него подписан? Имея их id в бд
Данил К. @Danya_Violet
При отправке боту команды /start, бот ответит "Привет"
Библиотека pyTelegramBotApi
@bot.message_handler(commands=['start']) def cmd_start(message): bot.send_message(message.from_user.id, 'Привет')
https://api.telegram.org/botTOKEN/sendMessage?chat_id=CHAT_ID&text=TEXT
Ответ написан более трёх лет назад
Нравится 2 13 комментариев
Данил К. @Danya_Violet
saund901, в конце ответа есть ссылка, с помощью которой можно отправить пользователю сообщение, зная его чат айди
AlexSn2020 @AlexSn2020
Подскажите, а как настроить отправку ботом сообщения мне, к примеру каждые 5 мин. Напрмер, 'бот работает'
Данил К. @Danya_Violet
from threading import Timer class RepeatTimer(Timer): def run(self): while not self.finished.wait(self.interval): self.function(*self.args, **self.kwargs) def notify(): bot.send_message(id, 'живой я, живой') # id (int) if __name__ == '__main__': RepeatTimer(300, notify).start() # время в секундах, название функции (! не сама функция)
Данил Куба, еще что-то надо добавить здесь?
Данил Куба, у меня есть БД, а как я отправляю на несколько id?
Данил К. @Danya_Violet
О чем вы? Предоставьте пример кода или ссылку на ваш вопрос
Данил Куба, У меня есть база данных, где собраны id номера пользователей, я пробовал делать через коды, которые вы отправили выше, но оказалось, что туда можно отправить только одного человека, а теперь как я могу отправить все id номера в базе данных?
Данил К. @Danya_Violet
Сделайте select нужных значений из БД, после с помощью цикла отправьте
Данил Куба, спасибо за ответ, я новичок. Я вас полюбому не понял)
Данил Куба, есть у вас примеры?
Данил К. @Danya_Violet
Допустим у вас есть такая таблица:
CREATE TABLE "users" ( "name" TEXT, "tlgrm_id" INTEGER )
import sqlite3 db = 'test.db' # выбрать все id из БД (без условий) def select_id(): conn = sqlite3.connect(db) ids = conn.execute('SELECT tlgrm_id FROM users').fetchall() if ids is None: conn.close() return None else: return ids # отправить сообщение каждому выбранному id for i in select_id(): bot.send_message(i[0], 'текст сообщения')
Отправка сообщений пользователям с бота в Telegram
Если вы читаете данную статью, значит, скорей за все имеете свой бот в телеграмме. Соответственно расписывать и объяснять как создать бота я здесь не буду. (Возможно в будущем создам отдельную статью по этому поводу, но какой в этом смысл, ведь в гугле их пруд пруди).
Надеюсь вы используете библиотеку python-telegram-bot . Если это не так, увы, эта статья не для вас…хотя…вы попробуйте, возможно у вас тоже будет работать данный пример (либо сделаете по аналогии).
Для отправки сообщений создадим новую функцию и назовем её send_message , передадим параметры bot и job .
Далее нам нужно получить chat_id пользователей. (Надеюсь вы подключили к своему боту базу данных, либо записываете в файл chat_id от всех пользователей которые когда-либо пользовались вашим ботом). После чего используя метод sendMessage указываем параметры chat_id пользователя и отправляемый текст text.
В итоге у нас должно получиться:
from telegram.ext import Updater, messagequeue as mq @mq.queuedmessage def send_message(bot, job): for user in get_subscribed(db): text = 'Это тестовое сообщение' bot.sendMessage(chat_id=user['chat_id'], text=text)
И так, что же мы здесь написали, давайте разберемся:
@mq.queuedmessage — Указываем, что сообщения будут отправлены не сразу все, а в порядке очереди, так как телеграмм ограничивает отправку сообщений в секунду. Если не ошибаюсь, не больше 30 сообщений в секунду. for user in get_subscribed(db) Получаем список пользователей с базы данных, get_subscribed и прохожусь по каждому пользователю циклом вытягивая его chat_id
Пол дела сделано, осталось отправить сообщение. Для этого переходим в главную функцию main() (или как она у вас там называется)
mybot = Updater(settings.API_KEY) # Указываем токен бота mybot.bot._msg_queue = mq.MessageQueue() # Указываем, что будем работать с декораторам очереди mybot.bot._is_messages_queued_default = True # Включаем декоратор очереди mybot.job_queue.run_repeating(send_message, interval=60) # Ставим задачу отправлять сообщение каждые 60 секунд. Бот будет делать это пока вы не уберете эту строку с кода.
Что бы один раз отправить сообщение я обычно делаю следующее — ставлю интервал в 10 минут, жду пока сообщения отправляться, останавливаю бота и комментирую эту строку, затем снова запускаю бота. Можно конечно сделать это через Условие, на подобии:
send = True If send: mybot.job_queue.run_repeating(send_message, interval=60) send = False
Но, кому как удобно.
Описание всех методов есть в API от телеграмма
Отправка сообщений в Telegram при помощи Python
Представьте, что вы запустили какую-то программу, на выполнение которой требуется некоторое время, и хотите вздремнуть или что-то в этом роде. Вам нужен простой скрипт, который отправит вам сообщение, когда ваша программа закончит работу.
Реализовать функцию отправки сообщения в Telegram при помощи Python довольно просто. План действий:
- Создать Telegram-бота с помощью BotFather от Telegram
- Получить идентификатор чата
- Послать сообщение Telegram с помощью Python
Создание Telegram-бота
- Откройте приложение Telegram и найдите BotFather. Это встроенный бот Telegram, который помогает создавать пользовательские боты.
- Введите /newbot , чтобы создать нового бота.
- Дайте своему боту имя и уникальный username
- Скопируйте токен вашего нового бота Telegram
Примечание: не загружайте свой токен в интернет, так как любой пользователь с вашим токеном имеет полный контроль над вашим Telegram-ботом.
Получение идентификатора чата
В Telegram каждый чат имеет ID. Нам он нужен, чтобы отправлять в наш чат сообщения.
Отправьте своему Telegram-боту любое сообщение. После этого запустите скрипт Python, чтобы найти ID вашего чата:
import requests TOKEN = "Сюда вставьте свой токен" url = f"https://api.telegram.org/bot/getUpdates" print(requests.get(url).json())
Примечание редакции Pythonist: если у вас не установлена библиотека requests , нужно сперва ее установить:
$ python -m pip install requests
Этот скрипт вызывает функцию getUpdates , которая как бы проверяет наличие новых сообщений. Мы можем найти ID нашего чата из возвращаемого JSON (на иллюстрации выделен красным цветом).
Примечание: если вы не отправите сообщение своему Telegram-боту, результаты могут быть пустыми.
Найдя идентификатор чата, скопируйте его.
Отправка сообщения Telegram с помощью Python
Скопируйте и вставьте в следующий скрипт Python токен вашего Telegram-бота и ID чата из предыдущих двух шагов. Также напишите собственное сообщение.
import requests TOKEN = "Сюда вставьте свой токен" chat_id = "Сюда вставьте ID чата" message = "Здесь напишите свое сообщение" url = f"https://api.telegram.org/bot/sendMessage?chat_id=&text=" print(requests.get(url).json()) # Эта строка отсылает сообщение
Запустите скрипт и проверьте свой Telegram!