Как отправить сообщение пользователю telegram bot python
Перейти к содержимому

Как отправить сообщение пользователю telegram bot python

  • автор:

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

Данил К. @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

Данил К. @Danya_Violet

saund901, в конце ответа есть ссылка, с помощью которой можно отправить пользователю сообщение, зная его чат айди

AlexSn2020 @AlexSn2020

Подскажите, а как настроить отправку ботом сообщения мне, к примеру каждые 5 мин. Напрмер, 'бот работает'

Danya_Violet

Данил К. @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

Данил К. @Danya_Violet
О чем вы? Предоставьте пример кода или ссылку на ваш вопрос

Данил Куба, У меня есть база данных, где собраны id номера пользователей, я пробовал делать через коды, которые вы отправили выше, но оказалось, что туда можно отправить только одного человека, а теперь как я могу отправить все id номера в базе данных?

Danya_Violet

Данил К. @Danya_Violet
Сделайте select нужных значений из БД, после с помощью цикла отправьте
Данил Куба, спасибо за ответ, я новичок. Я вас полюбому не понял)
Данил Куба, есть у вас примеры?

Danya_Violet

Данил К. @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

Woman and phone

Если вы читаете данную статью, значит, скорей за все имеете свой бот в телеграмме. Соответственно расписывать и объяснять как создать бота я здесь не буду. (Возможно в будущем создам отдельную статью по этому поводу, но какой в этом смысл, ведь в гугле их пруд пруди).

Надеюсь вы используете библиотеку 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 довольно просто. План действий:

  1. Создать Telegram-бота с помощью BotFather от Telegram
  2. Получить идентификатор чата
  3. Послать сообщение Telegram с помощью Python

Создание Telegram-бота

  1. Откройте приложение Telegram и найдите BotFather. Это встроенный бот Telegram, который помогает создавать пользовательские боты.
  2. Введите /newbot , чтобы создать нового бота.
  3. Дайте своему боту имя и уникальный username
  4. Скопируйте токен вашего нового бота 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!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *