Как написать рассылку для 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 админа, если это его, то берите текст сообщения и вызывайте функцию рассылки с этим текстом.
Как сделать рассылку юзерам телеграм-бота на python?
Пытаюсь делать первых ботов в Телеграм на Python. Использую библиотеку telebot (pyTelegramBotAPI).
Мне нужно разослать сообщение всем пользователям, которые запускали бота.
Я понял, мы сохраняем их id куда-то. Потом например циклом проходим по ним и посылаем каждому сообщение примерно так:
for user_id in users: bot.send_message(user_id, 'message')
Но я не могу понять — если у нас запущен опрос сервера телеграм с помощью bot.polling — скрипт ведь дальше не идет? Как мне одновременно со включенным bot.polling(none_stop=True) запустить цикл для рассылки сообщений пользователям?
Мне нужно запускать рассылку НЕ в ответ на определенное сообщение, а в определенное время. Получается, что ее не вызовешь через обработчик входящих сообщений. Мне нужно параллельно и обрабатывать входящие и делать рассылку в определенный час. Как это реализовать?
Заранее спасибо за ответы!
- Вопрос задан более года назад
- 1309 просмотров
Комментировать
Решения вопроса 1
Можно просто запустить другой скрипт, который создаст объект телебота с тем же токеном, но не будет использовать polling, а сразу вызовет send_message сколько нужно раз. Но надо не забывать про rate limit.
PS: Почему тут каждую неделю спрашивают про рассылку ботом по списку? Неужели нет более интересных учебных задач?
Ответ написан более года назад
Нравится 2 3 комментария

http2000 @http2000 Автор вопроса
Спасибо за ответ, если будут, я спрошу обязательно)
Подскажите пожалуйста, я нашел еще решение — с помощью модуля multiprocessing можно запускать одновременно и то и другое. Что лучше — ваш вариант или с модулем? Или модуль просто делает то же самое, что и вы сказали?
http2000, запуск отдельного скрипта это и есть запуск отдельного процесса, только вручную. Если задача состоит в том, чтобы иногда по наитию что-то всем послать или, например, посылать раз в сутки, то ручной запуск отдельного скрипта или запуск скрипта из планировщика — вполне себе нормальные решения, при этом очень простое в реализации. Если же хочется иметь всё в одном скрипте то никто не запрещает. Можно использовать модули multiprocessing, threading, schedule, ещё круче будет освоить asyncio (но придётся начать мыслить асинхронно и поменять телебот на асинхронную библиотеку — aiogram или pyrogram). Можно перейти на вебхуки и отказаться от поллинга (но тогда функионал основного цикла программы перейдёт в веб-серверный компонент используемой библиотеки, которой может быть flask, асинхронный aiohttp или что-то ещё).
Статья Автоматизированный сбор данных в чатах и рассылка для Telegram на Python
UPDATE.
Меня правильно поправили — спам в РФ запрещен . Но есть возможность проводить автоматизированный сбор данных. Поэтому перед использованием данного метода следует получить согласие «каждого субъекта на такие действия».
То же самое с рекламной рассылкой — стоит также получить согласие «каждого субъекта на такие действия».
Ссылка скрыта от гостей
Обычно в этом месте все пишут предысторию, но у меня она достаточно заурядная: недавно возникла необходимость сделать рассылку по телеграм(никакой чёрнухи :Р).
Сначала посмотрел готовые решения. Их действительно очень много, но либо не нравилось, либо не подходило по нуждам, либо я совсем терялся в коде.
Вот решил, наконец, проверить свои навыки после курса «
Ссылка скрыта от гостей
» и написать все сам.
Ссылка на готовый код с гитхаб в конце статьи.
У нас будет три основные части программы: коннектор клиента( как это назвать по-русски?? ), сбор участников чата и рассылка по пользователям.
Будем использовать библиотеку telethon. Документация по библиотеке —
Ссылка скрыта от гостей
Устанавливаем библиотеку telethon
pip3 install telethon
Импортируем необходимые модули:
import time import random from telethon.sync import TelegramClient from telethon.errors.rpcerrorlist import PeerFloodError, SessionPasswordNeededError
Далее необходимо получить App api_id и App api_hash. Для это заходим на my.telegram.org в раздел
Ссылка скрыта от гостей
Создаем app, копируем необходимое и создаем переменные:
phone = 'строка' api_id = число api_hash = 'строка'
С помощью следующих двух строчек мы подключаемся к Телеграм
client = TelegramClient(phone, api_id, api_hash) client.connect()
Но при первом подключении надо будет ввести одноразовый код, а если включена двухфакторная авторизация, то и дополнительный пароль.
Поэтому пишем такую конструцию, которая учитывает эти вопросы.
if not сlient.is_user_authorized(): #запрашиваем однаразовый код client.send_code_request(phone) try: client.sign_in(phone, input('Enter verification code: ')) #дополнительный пароль двухфакторной авторизации если необходимо except SessionPasswordNeededError: client.sign_in(password=input("Enter password: "))
В текущей директории создается файл *.session. Был момент, когда я долго разбирался как работает подключение и коннектился огромное количество раз, и Телеграм забанил меня на несколько суток. Если такое случится, нужно удалить это файл сессии и приконнектиться заново.
Получаем список чатов:
chats = [dialog for dialog in client.get_dialogs() if dialog.is_group and dialog.is_channel] print('From which chat you want to parse members:') #выводим список чатов для выбора [print(str(chats.index(i) + 1) + ' - ' + i.title) for i in chats]
.get_dialogs – получить все диалоги
.is_group — проверка является ли диалог групповым чатом/megagroup-чатом
.is_channel – то же самое для каналов.
То есть вместе два этих условия дают спарсить групповые чаты от каналов(пабликов). Отдельно .is_channel можно спарсить участников канала, только если имеются админские права.
Дальше берем в переменную выбор пользователя.
your_choice = input(‘Your choice is: ‘)
Собираем пользователей если у них имеется юзернейм
!Можно спарсить только тех, у кого юзернейм не закрыт!
users = [user.username for user in self.client.get_participants(your_choice ) if user.username]
Можно также спарсить такие параметры как:
id, bot(False or True), scam(False or True), fake(False or True), access_hash, first_name, last_name, phone, и status(когда в последний раз был онлайн)
Далее можно добавить опцию выбора: сохранить или спамить по списку. А можно и не добавлять. Взрослые люди все-таки, сами можете выбрать есть мороженное на завтрак или в обед.
delay = random.randint(15, 40)
- Оптимальная пауза при рассылке от 10 сек.
- На рассылку без ссылки — 40 сообщений.
- На рассылку со ссылкой — 10 сообщений.
message = ['Hello!', 'Ola!', 'Ni Hao!'] #сделаю рассылку на первые 40 юзеров из списка for user in users[:39]: print("Sending Message to: ", user) try: #отправляем сообщение client.send_message(user, random.choice(message)) #Возможно словить Flood Error, поэтому лучше сразу прекратить спам и разорвать связь except PeerFloodError: print("[!] Got Flood Error from telegram. \n[!] Try later.") self.client.disconnect() break except Exception as e: print("[!] Error:", e, "\n Trying to continue. ") continue else: if user != users[:39]: print(f"Waiting seconds") time.sleep(delay) print('\nEnd of the program')
Вот и все!
В программу можно добавить красивую заставку, менюшку, colorama, а также обработчики исключений и больше выбора(сохранить, не сохранить, продолжить, сменить аккаунт и тд).
Это уже по Вашему усмотрению.
Ссылка на GitHub:
GitHub — StripedBear/TeleSpam: Chat member parser and spammer for Telegram
Chat member parser and spammer for Telegram. Contribute to StripedBear/TeleSpam development by creating an account on GitHub.
Последнее редактирование модератором: 04.05.2022
StripedBear
Active member
Green Team
- Сообщения 32
- Реакции 22
DragonSov
Codeby Team
Red Team
03.12.2019 71 95
Привет. У тебя на самой первой картинке водяной знак от какого-то фотостока. Картинки для статей должны быть под лицензией Creative Commons (разрешены для использования без упоминания автора). В целом статья нормальная, только ты не очень правильно используешь list comprehension (генератор списка). Да и название статьи противоречит законам РФ, нужно сменить на что-то более «безобидное»
Последнее редактирование: 29.04.2022
StripedBear
Green Team
24.07.2021 32 22
Привет. У тебя на самой первой картинке водяной знак от какого-то фотостока. Картинки для статей должны быть под лицензией Creative Commons (разрешены для использования без упоминания автора). В целом статья нормальная, только ты не очень правильно используешь list comprehension (генератор списка). Да и название статьи противоречит законам РФ, нужно сменить на что-то более «безобидное»
Привет! Спасибо за поправки.
Где неправильно в list comprehension или что конкретно мне гуглить?
DragonSov
Codeby Team
Red Team
03.12.2019 71 95
Привет! Спасибо за поправки.
Где неправильно в list comprehension или что конкретно мне гуглить?
Вот смотри —
users = [] [users.append(user.username) for user in self.client.get_participants(your_choice ) if user.username]
У тебя по факту получается объявление пустого списка и цикл в 1 строку. Но в Python можно сразу в объявлении списка делать цикл в одну строку — list comprehension. И код у тебя будет таким:
users = [user.username for user in self.client.get_participants(your_choice ) if user.username]
Архонт
Green Team
03.12.2019 20 7
есть сомнения по поводу
if dialog.is_group and dialog.is_channel
разве может канал быть одновременно и группой?
StripedBear
Green Team
24.07.2021 32 22
есть сомнения по поводу
if dialog.is_group and dialog.is_channel
разве может канал быть одновременно и группой?
Методом проб и ошибок пришёл к выводу, что с этими условиями выводятся чаты, которые принадлежат каналам
neeagleism
New member
19.12.2021 2 0
Спасибо, интересная статья!
CbIH_AKTEPA
New member
01.06.2020 1 0
Спасибо за статью!
Можешь подсказать, где ты смотришь лимиты сообщений?
MLNK
Mod. Ethical Hacking
Red Team
23.01.2018 560 705
коннектор клиента( как это назвать по-русски?? ), сбор участников чата и рассылка по пользователям.
Клиентский коннектор, но лично мне больше нравиться прямой перевод — разъем клиента.)
вообще порой лучше не переводить термины. Connector — Grabber — Sender и всем всё понятно.
в итоге ты бота тестил? сколько сообщений смог разослать до бана?
StripedBear
Green Team
24.07.2021 32 22
Клиентский коннектор, но лично мне больше нравиться прямой перевод — разъем клиента.)
вообще порой лучше не переводить термины. Connector — Grabber — Sender и всем всё понятно.
в итоге ты бота тестил? сколько сообщений смог разослать до бана?
Да, успешно тестил. 38-40 сообщений в день с одного аккаунта отсылается. Да, немного, но для моей задачи отлично подошло. Пять аккаунтов за пять дней — 1000 сообщений.
Если flood error — удаляю сессию и откладываю аккаунт на день.
StripedBear
Green Team
24.07.2021 32 22
Спасибо за статью!
Можешь подсказать, где ты смотришь лимиты сообщений?
Лимиты и ограничения Telegram — Google Drive
docs.google.com
Ссылка скрыта от гостей
— раньше на этом форуме искал
NONAME23
New member
13.06.2022 2 0
Выдает ошибку , ругается на self. Версия telethon 1.24.0 , питон — 3.9.10 .
что только не пробовал — не робит.
File "C:\Users\Admin\Desktop\seller + parser\parserbot.py", line 23, in parse main(api_id,api_hash,phone) File "C:\Users\Admin\Desktop\seller + parser\parserbot.py", line 38, in main users = [user.username for user in self.client.get_participants(your_choice ) if user.username] NameError: name 'self' is not defined
StripedBear
Green Team
24.07.2021 32 22
Выдает ошибку , ругается на self. Версия telethon 1.24.0 , питон — 3.9.10 .
что только не пробовал — не робит.
File "C:\Users\Admin\Desktop\seller + parser\parserbot.py", line 23, in parse main(api_id,api_hash,phone) File "C:\Users\Admin\Desktop\seller + parser\parserbot.py", line 38, in main users = [user.username for user in self.client.get_participants(your_choice ) if user.username] NameError: name 'self' is not defined
покажите весь код, пожалуйста
NONAME23
New member
13.06.2022 2 0
Все данные (телефон и тд были указаны.)
покажите весь код, пожалуйста
import time import random from telethon.sync import TelegramClient from telethon.errors.rpcerrorlist import PeerFloodError, SessionPasswordNeededError phone = 'phone' api_id = id api_hash = 'hash' client = TelegramClient(phone, api_id, api_hash) client.connect() if not сlient.is_user_authorized(): client=Client(phone,api_id,api_hash) chats = [dialog for dialog in client.get_dialogs() if dialog.is_group and dialog.is_channel] print('From which chat you want to parse members:') #выводим список чатов для выбора [print(str(chats.index(i) + 1) + ' - ' + i.title) for i in chats] your_choice = input(‘Your choice is: ‘) users = [user.username for user in self.client.get_participants(your_choice ) if user.username] delay = random.randint(15, 40) message = ['Hello!', 'Ola!', 'Ni Hao!'] #сделаю рассылку на первые 40 юзеров из списка for user in users[:39]: print("Sending Message to: ", user) try: #отправляем сообщение client.send_message(user, random.choice(message)) #Возможно словить Flood Error, поэтому лучше сразу прекратить спам и разорвать связь except PeerFloodError: print("[!] Got Flood Error from telegram. \n[!] Try later.") self.client.disconnect() break except Exception as e: print("[!] Error:", e, "\n Trying to continue. ") continue else: if user != users[:39]: print(f"Waiting seconds") time.sleep(delay) print('\nEnd of the program')
StripedBear
Green Team
24.07.2021 32 22
Все данные (телефон и тд были указаны.)
import time import random from telethon.sync import TelegramClient from telethon.errors.rpcerrorlist import PeerFloodError, SessionPasswordNeededError phone = 'phone' api_id = id api_hash = 'hash' client = TelegramClient(phone, api_id, api_hash) client.connect() if not сlient.is_user_authorized(): client=Client(phone,api_id,api_hash) chats = [dialog for dialog in client.get_dialogs() if dialog.is_group and dialog.is_channel] print('From which chat you want to parse members:') #выводим список чатов для выбора [print(str(chats.index(i) + 1) + ' - ' + i.title) for i in chats] your_choice = input(‘Your choice is: ‘) users = [user.username for user in self.client.get_participants(your_choice ) if user.username] delay = random.randint(15, 40) message = ['Hello!', 'Ola!', 'Ni Hao!'] #сделаю рассылку на первые 40 юзеров из списка for user in users[:39]: print("Sending Message to: ", user) try: #отправляем сообщение client.send_message(user, random.choice(message)) #Возможно словить Flood Error, поэтому лучше сразу прекратить спам и разорвать связь except PeerFloodError: print("[!] Got Flood Error from telegram. \n[!] Try later.") self.client.disconnect() break except Exception as e: print("[!] Error:", e, "\n Trying to continue. ") continue else: if user != users[:39]: print(f"Waiting seconds") time.sleep(delay) print('\nEnd of the program')
Чат-боты в Telegram на Python и Aiogram: пишем первого бота
Большой гайд по работе с Aiogram на примере эхо‑бота — чат‑бота, который повторяет за пользователем его фразы. Весь код — внутри статьи.


Иллюстрация: Polina Vari для Skillbox Media

Антон Яценко
Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.
Компании используют чат-ботов в Telegram для разных задач: рассылают новости о текущих акциях, принимают платежи или даже организуют службы технической поддержки. Обычные пользователи тоже применяют их для своих бытовых нужд — ведут учёт личных финансов или оформляют посты в социальных сетях.
Благодаря этой статье вы научитесь с нуля создавать чат-ботов с помощью Python и библиотеки Aiogram. Мы напишем эхо-бота, который отвечает на сообщения пользователя точно такими же сообщениями. Это первая часть урока по Aiogram — во второй части мы добавим боту кнопки и новые фичи.
Содержание
- Библиотеки для создания бота
- Краткое описание Aiogram
- Создаём эхо-бота
- Шаг 1. Устанавливаем Python
- Шаг 2. Создаём виртуальное окружение
- Шаг 3. Создаём бота
- Шаг 4. Подключаем Aiogram
- Шаг 5. Пишем код для эхо-бота
- Шаг 6. Запускаем бота и проверяем работу
- Что дальше?
Библиотеки для создания бота
Для создания телеграм-ботов на Python существует несколько десятков библиотек. Они различаются популярностью, размером комьюнити и функциональностью. Рассмотрим самые популярные.
Aiogram. Современная библиотека, набирающая популярность: многие чат-боты написаны на ней. В этой и последующих статьях цикла мы будем работать именно с Aiogram. Библиотека реализует асинхронное выполнение кода, что позволяет не останавливать работу бота в ожидании ответа пользователя. Кроме того, у Aiogram есть подробная документация и большое русскоязычное комьюнити.
Python-telegram-bot. Одна из первых библиотек для создания ботов. Отличается от Aiogram синхронным подходом к работе, то есть при ожидании ответа от пользователя выполнение кода останавливается.
TeleBot. Библиотека для создания простых ботов, позволяющая работать с асинхронным и синхронным подходом на выбор. Подходит для небольших проектов. Подробнее можно узнать в документации.
Что нужно знать об Aiogram перед написанием кода
Перед тем как приступить к написанию нашего бота, остановимся подробнее на одной технической особенности Aiogram.
Как уже было сказано ранее, одно из главных достоинств библиотеки — полная асинхронность. Она использует синтаксис async/await, который позволяет программе выполнять несколько задач одновременно и эффективно управлять потоком выполнения.
Вот простой пример функции, использующей механизм async/await:
Другой плюс Aiogram — в большом наборе инструментов и хуков, которые можно использовать для добавления дополнительных функций и настроек бота. Библиотека обеспечивает полный доступ ко всем возможностям Telegram API, включая отправку и получение сообщений, управление клавиатурой, обработку медиафайлов (фотографий, видео, документов) и многое другое.
Вот несколько полезных источников, которые помогут разобраться в библиотеке и следить за её обновлениями:
- официальная документация,
- репозиторий библиотеки на GitHub,
- русскоязычный телеграм-чат, посвящённый Aiogram,
- англоязычный чат, посвящённый Aiogram,
- канал с новостями библиотеки,
- тестовый бот на основе Aiogram.
Создаём эхо-бота
Переходим к созданию телеграм-бота. Потренируемся на простом примере — создадим эхо-бота, который отвечает на сообщения пользователя его же словами.
Для этого нам необходимо:
- установить Python и настроить виртуальное окружение;
- зарегистрировать бота в специальном телеграм-канале @BotFather;
- установить библиотеку Aiogram;
- написать код эхо-бота, связав его по API с Telegram.
Шаг 1
Устанавливаем Python
На macOS или Linux. Python установлен в эти операционные системы изначально. Чтобы проверить его наличие, откройте терминал и введите команду:

На Windows требуется установка Python. Сделать это проще всего по нашей инструкции.
Шаг 2
Создаём виртуальное окружение
После установки и проверки Python требуется установить виртуальное окружение с помощью virtualenv. Это специальный инструмент, который позволяет изолировать друг от друга проекты в разработке, независимо устанавливая для них библиотеки и пакеты. Удобно, когда вы работаете над разными приложениями одновременно.
virtualenv устанавливается через терминал:

Открываем его, жмём кнопку «Запустить» и вводим команду /newbot:

Теперь напишем название и юзернейм для нашего бота. Назовём его echo_skillbox_bot (теперь это имя занято, так что вам надо будет придумать своё). В ответ придёт наш токен, который мы будем использовать для подключения к API Telegram.

Этот токен мы сохраняем — он потребуется нам в будущем.
Шаг 4
Подключаем Aiogram
Для установки Aiogram воспользуемся менеджером пакетов PIP. Вводим в терминал:

Находим нашего бота в Telegram по имени @echo_skillbox_bot и запускаем его, нажав на кнопку Начать. В ответ на это или на команду /start нам придёт приветственное сообщение:

Попробуем написать что-то:

Как мы видим — всё работает. Бот возвращает нам наши сообщения.
Что дальше?
Расширять функциональность бота, указывая для разных команд пользователя разные ответы. Например, добавить раздел помощи, который будет появляться по команде /help. Или настроить запуск кода на виртуальном сервере, чтобы бот работал независимо от вашего компьютера.
Во второй части статьи мы добавим к нашему боту кнопки и новые возможности. Так что обязательно заходите и читайте 🙂
Больше интересного про код в нашем телеграм-канале. Подписывайтесь!
Читайте также:
- С# для новичков: развеиваем мифы и пишем простого чат-бота
- «Я удивился, когда написал код, а он заработал»: как живёт начинающий Python-разработчик
- Учимся верстать: что такое CSS