Как сделать рассылку в телеграм боте python
Перейти к содержимому

Как сделать рассылку в телеграм боте python

  • автор:

Как сделать рассылку в телеграм боте?

Суть вопроса.. Как сделать или можно ли это вообще сделать’ Рассылку определенному пользователю или пользователям к примеру (1, 2, 3) людям ? Код Aiogram для рассылки всем пользователям которые есть в БД:

@dp.message_handler(content_types=['text'], text='Рассылка') async def spam(message: Message): if message.from_user.id == ADMIN: await admin.send.set() await message.answer('Напиши текст рассылки') else: await message.answer('Вы не являетесь админом') @dp.message_handler(state=admin.send) async def start_spam(message: Message, state: FSMContext): if message.text == 'Назад': await message.answer('Главное меню') await state.finish() else: cur = conn.cursor() cur.execute(f'''SELECT user_id FROM users''') spam_base = cur.fetchall() print(spam_base) for z in range(len(spam_base)): print(spam_base[z][0]) for z in range(len(spam_base)): await bot.send_message(spam_base[z][0], message.text) await message.answer('Рассылка завершена') await state.finish()

Буду благодарен за ответ.

  • Вопрос задан более года назад
  • 513 просмотров

Как написать рассылку для Telegram бота на Telebot Python

Задача: написать рассылку для бота с запросом ввести текст перед рассылкой и задержками для избежания бана от Telegram, но не совсем понимаю как правильно это сделать. Текущий код рассылки, который совсем не устаивает:

elif call.data == 'send': cursor.execute('SELECT id FROM login_id') result = cursor.fetchall() msg = 'текст рассылки' time.sleep(1) for x in result: bot.send_message(x[0], str(msg)) 

Отслеживать
задан 26 мар 2022 в 23:12
Alex Shark Alex Shark
21 1 1 серебряный знак 4 4 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Для создания рассылки сохраняйте user_id в БД, после чего методом send_message отправляйте само сообщение-рассылку. Вот неплохое видел на этот счёт: ссылка

Если я Вас правильно понял, то Вам нужно осуществить некую задержку перед отправкой сообщения. Вы можете это сделать таким способом: Проверяете всех user_id входящих сообщений на наличие в вашей БД рассылки. Если да, то далее отправляете выше указанным метод сообщение.

Также советую прикреплять ваш код полностью или комментировать саму суть проблемы.

Отслеживать
ответ дан 26 мар 2022 в 23:28
thelonelyangel thelonelyangel
126 2 2 бронзовых знака

Немного непонятно, как сделать, чтобы у админа бот запрашивал текст рассылки перед её началом. Не могли бы вы помочь подсказав код? Видео смотрел ещё до вопроса и делал похожую рассылку, но там нет запроса текста перед рассылкой. Да и вместо БД используется текстовый файл 🙂

27 мар 2022 в 7:16

Если Вам надо получить текст для рассылки у админа, то просто проверяйте user_id на id админа, если это его, то берите текст сообщения и вызывайте функцию рассылки с этим текстом.

Как сделать рассылку через телеграм бот надежной и простой

Image

Вы когда-нибудь задумывались о том, как сделать рассылку через бот максимально простой и надежной? Если да, то этот видеоурок точно для вас!

В нем мы покажем, как использовать базу данных для рассылки сообщений через вашего бота, что является самым простым и эффективным решением. Вы можете быть уверены, что ни одно ваше сообщение не потеряется благодаря этому методу.

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

В ходе урока мы будем использовать aiogram, чтобы написать простое, стабильное и надежное решение для рассылки сообщений через бота. Вы сможете легко повторить этот процесс в своих проектах и сэкономить уйму времени и усилий.

Не упустите возможность узнать больше о том, как сделать рассылку через бот максимально простой и эффективной. Смотрите наш видеоурок, ставьте лайки, подписывайтесь на канал и делитесь с друзьями!

Как создать Telegram-бота для мониторинга погоды на Python

В статье делимся пошаговой инструкцией, как написать Telegram-бота для получения данных о погоде и задеплоить его на виртуальный сервер.

Эта инструкция — часть курса «Как создавать Telegram-ботов».

Смотреть весь курс

Введение

Всем привет! Меня зовут Максим Плачковский, я автор канала PythonToday. Из этой статьи вы узнаете, как написать своего Telegram-бота для получения данных о погоде в любом городе нашей планеты. Мы детально рассмотрим работу с API, парсинг JSON и напишем бота на асинхронной библиотеке aiogram. А после — загрузим его на виртуальный сервер и запустим.

Подготовка API и рабочего окружения

Перед написанием кода нужно получить API-токены для работы с сервисом OpenWeather и Telegram-ботом, а также подготовить рабочее окружение.

Получаем токен OpenWeather

Начнем с самого простого: зарегистрируемся на официальном сайте и в разделе My API keys создадим токен.

После того, как вы создали API-ключ, дайте ему немного «отлежаться» — обычно это занимает 10-15 минут. Спустя это время можно общаться с OpenWeather с помощью сгенерированного токена.

Генерируем токен для Telegram-бота

Ключ для Telegram-бота можно получить у @BotFather, введя /newbot — команду для создания и регистрации нового бота. Во время настройки придумайте боту логин и название — например, Weather Bot. Есть также опциональные настройки: текст приветствия, изображение. Используйте, если хотите получить более уникального бота!

Импортируем необходимые библиотеки

Для работы нам понадобятся модули requests и aiogram — установим их.

pip install requests aiogram

После импортируем модули и классы в файл нашего пет-проекта.

import os import datetime import requests from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor bot = Bot(token='your_bot_token') dp = Dispatcher(bot)

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

Первое сообщение

Для начала проверим, что aiogram увидел бота и мы можем с ним взаимодействовать. Создадим простую асинхронную функцию start_command для ответа на команду /start . И добавляем метод start_polling для запуска бота.

import os import datetime import requests from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor bot = Bot(token='your_bot_token') dp = Dispatcher(bot) @dp.message.handler(commands=["start"]) async def start_command(message: types.Message): await message.reply("Привет! Напиши мне название города и я пришлю сводку погоды") if __name__ == "__main__": # С помощью метода executor.start_polling опрашиваем # Dispatcher: ожидаем команду /start executor.start_polling(dp)

Запускаем скрипт, заходим в Telegram и пишем команду /start — все работает: бот возвращает нужное сообщение.

Обрабатываем входные данные

Теперь добавим функцию, которая будет реагировать на текстовые сообщения с названиями городов. Она должна проверять их на корректность и выводить ошибку, если валидация не была пройдена.

@dp.message_handler() async def get_weather(message: types.Message): pass 

OpenWeather должен принимать название города через API и возвращать данные о погоде. Исходя из документации, кроме названия города запрос должен содержать API-токен.

Усовершенствуем запрос: в параметр q будем передавать город, добавим параметр lang=ru , чтобы API работал с кириллицей. А также используем units=metric для установки метрической системы:

http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=наш_токен

Теперь добавим блок try-except для обработки пользовательских запросов и создадим переменную для записи результатов OpenWeather, которые возвращает сервис в JSON-формате.

@dp.message_handler() async def get_weather(message: types.Message): try: response = requests.get( f"http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=your_token" ) data = response.json() except: await message.reply("Проверьте название города!")

Отправим запрос через браузер и посмотрим, какая температура, например, в Бангкоке.

В ответе получаем не только данные о температуре, но и облачность, давление, влажность, время заката, рассвета и другие величины.

Парсим JSON

Приступим к парсингу ответа OpenWeather в формате JSON: заберем данные о городе и температуре, влажности, давлении и скорости ветра.

city = data["name"] cur_temp = data["main"]["temp"] humidity = data["main"]["humidity"] pressure = data["main"]["pressure"] wind = data["wind"]["speed"]

OpenWeather возвращает время рассвета и заката в формате unix timestamp. Извлечем эти данные и преобразуем в секунды.

# получаем время рассвета и преобразуем его в читабельный формат sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) # то же самое проделаем со временем заката sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"])

Зная время рассвета и заката, мы можем вернуть пользователю продолжительность дня. В результате получается следующее:

@dp.message_handler() async def get_weather(message: types.Message): try: response = requests.get( f"http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=your_token" ) data = response.json() city = data["name"] cur_temp = data["main"]["temp"] humidity = data["main"]["humidity"] pressure = data["main"]["pressure"] wind = data["wind"]["speed"] sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) # продолжительность дня length_of_the_day = datetime.datetime.fromtimestamp(data["sys"]["sunset"]) - datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) except: await message.reply("Проверьте название города!")

Декорируем сообщения

Разнообразим текст сообщений — будем выводить разные эмодзи в зависимости от погоды.

У словаря, который мы ранее спарсили, есть ключ main — он хранит описание погоды. На его основе мы можем создать свою коллекцию с эмодзи под разные ситуации.

code_to_smile =

Также напишем условие, чтобы в случае специфической погоды, для которой эмодзи не предусмотрен, программа не ломалась, а выводила специальное сообщение.

# получаем значение погоды weather_description = data["weather"][0]["main"] if weather_description in code_to_smile: wd = code_to_smile[weather_description] else: # если эмодзи для погоды нет, выводим другое сообщение wd = "Посмотри в окно, я не понимаю, что там за погода. "

Возвращаем данные пользователю

Данные собрали — время отдать их пользователю. Сформируем строки с датой и временем, погодой, влажностью и другими данными. Главное — учесть формат данных. Например, OpenWeather возвращает значение давления в гектопаскалях. Так, если вы хотите отдавать пользователю данные в миллиметрах ртутного столба, значение нужно разделить на 1.33 и округлить в большую сторону.

await message.reply(f""\n f"Погода в городе: \nТемпература: °C \n" f"Влажность: %\nДавление: мм.рт.ст\nВетер: м/с \n" f"Восход солнца: \nЗакат солнца: \nПродолжительность дня: \n" f"Хорошего дня!" )

Супер — бот работает и возвращает данные в удобочитаемом формате!

Деплой бота

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

Облачные серверы с гибкой производительностью ядра vCPU

Бота лучше перенести в облако. Поскольку затраты процессора на работу с простым Open Weather API минимальны, будет достаточно виртуального сервера с 1 vCPU и 1 ГБ оперативной памяти. С учетом выделенного IP-адреса такая конфигурация выйдет примерно в 30 ₽/день.

Для начала зарегистрируемся в панели управления и создадим новый сервер в разделе Облачная платформа. Затем настроим его.

Далее подключимся к серверу по SSH, создадим виртуальное окружение для бота и загрузим его удобным способом.

Последним шагом нужно создать .service-файл, который будет автоматически поднимать бота в случае перезагрузки сервера.

Запускаем командой: systemctl enable tg_bot.service

Проверяем статус: systemctl status tg_bot.service

И перезапускаем .service-файл: systemctl restart tg_bot.service

Все готово: бот стабильно работает на сервере и автоматически поднимается в случае перезагрузки.

Заключение

Следуя инструкции, каждый может создать бота для мониторинга погоды. А использование виртуальной машины из линейки Shared Line позволит избежать капитальных затрат. Платите только за потребленные ботом мощности по модели pay-as-you-go, а также экономьте на неполной загрузке ядра.

Автор: Максим Плачковский, создатель канала PythonToday

Как подключить платежную систему с Payments к Telegram

Как разработать веб-приложение (интернет-магазин) в Telegram

Зарегистрируйтесь в панели управления

И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.

Читайте также:

Инструкция

Как создать веб-приложение на базе Telegram Mini Apps

Инструкция

Что делает команда chmod и как ее использовать в Linux

Инструкция

Как разработать gRCP-сервис на Go

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

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