@Misteri12

Рассылка сообщений с помощью библиотеки pyTelegramBotAPI?

Всем Доброго дня помогите пожалуйста питаюсь сделать своего первого бота и не могу разобраться с рассылкой сообщения. ID Пользователей вношу в txt файл. Кто то поставил бот в бан и все рушиться. Нашел что нужно применить try Но не понимаю куда його применить.
@bot.message_handler(commands=['start'])
def start(message):
id = (str(message.from_user.id) + "\n")

file = open("users.txt", "r")
fileReaded = file.read()
file.close()

if id in fileReaded:
print("Пользователь по етому id уже зарегестрирован!")
for i in fileReaded:
try:
bot.send_message(i, "Користувач заблокував бота")
except:
pass

else:
file = open("users.txt", "a")
file.write(str(message.from_user.id) + "\n")
file.close()
665040946b7c4823436291.png
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Если не понимаешь, Как применять try-except - откладываешь бота и практикуешься с try-except, пока не поймешь. Вообще боты - это НЕ просто, и я настоятельно советую отложить бота, пока не ознакомишься с языком получше.

Ты не привёл полный стек-трейс ошибки. Его нужно приводить, и не скриншотом, а обернуть тегом <code>. Кнопка </> в редакторе в помощь.
То же самое нужно сделать с кодом - иначе вопрос могут снести как не соответствующий правилам сайта.
На вопрос с нечитаемым кодом получить полезный ответ удаётся не всегда, так что это в твоих же интересах.

Когда приведёшь полный stack trace ошибки (это набор строк вида "File путь_к_файлу, line номер_строки, in имя_функции" - найди в нём те блоки, которые упоминают файлы из твоего проекта. Они подскажут, в какой части кода возникает ошибка.

Но можно догадаться, если просто рассуждать логически. Ошибка возникает из-за того, что ты отправляешь сообщение пользователю, который заблокировал твоего бота. Значит, ловить ошибку нужно в районе вызова метода бота, который выполняет отправку сообщения, т.е. send_message(). Так что ты вроде правильно идентифицировал строку. Если ошибка всё равно возникает, убедись, что ты запускаешь тот же код, который привёл тут.

Но except: pass - это плохая практика в большинстве случаев. От того, что ты игнорируешь ошибку, она не исчезает. Ты по-хорошему должен удалить id этого пользователя из списка id подписчиков.

И да, ты отвратительно работаешь со списком id. Это в принципе работает, но это очень неудобно. Ты это почувствуешь, как только попытаешься хранить какую-либо информацию кроме id пользователя.
Ответ написан
@RaiTer228
Если надо, то есть на aiogram

import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command, Text
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import InputMediaPhoto, InputMediaVideo
from aiogram.utils import executor

# Токен вашего бота
API_TOKEN = "YOUR_BOT_TOKEN"

# ID админа
ADMIN_ID = 123456789

# Имя файла с пользователями
USERS_FILE = "users.txt"

# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot, storage=MemoryStorage())

# Состояния для FSM
class SendMessage(StatesGroup):
    text = State()
    media = State()

# Обработчик команды /start
@dp.message_handler(Command("start"))
async def send_welcome(message: types.Message):
    await message.reply("Привет! Я бот для рассылки. Используйте команду /send для отправки сообщения.")

# Обработчик команды /send
@dp.message_handler(Command("send"))
async def send_message(message: types.Message):
    if message.from_user.id == ADMIN_ID:
        await message.reply("Введите текст для рассылки:")
        await SendMessage.text.set()
    else:
        await message.reply("У вас нет прав для отправки сообщений.")

# Обработчик ввода текста
@dp.message_handler(state=SendMessage.text)
async def process_text(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data["text"] = message.text
        await message.reply("Отправить картинку? (Да/Нет)")
        await SendMessage.media.set()

# Обработчик выбора медиа
@dp.message_handler(Text(equals=["Да", "Нет"]), state=SendMessage.media)
async def process_media(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        if message.text == "Да":
            await message.reply("Отправьте картинку:")
            await SendMessage.next()
        else:
            # Отправка текста без картинки
            await send_message_to_users(data["text"])
            await state.finish()

# Обработчик отправки картинки
@dp.message_handler(content_types=types.ContentType.PHOTO, state=SendMessage.media)
async def process_photo(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        # Получение ID картинки
        photo_id = message.photo[-1].file_id
        # Отправка текста и картинки
        await send_message_to_users(data["text"], photo_id)
        await state.finish()

# Функция для отправки сообщения пользователям
async def send_message_to_users(text: str, media_id: str = None):
    with open(USERS_FILE, "r") as f:
        users = f.read().splitlines()
    for user_id in users:
        try:
            if media_id:
                # Отправка картинки
                await bot.send_photo(int(user_id), photo=media_id, caption=text)
            else:
                # Отправка только текста
                await bot.send_message(int(user_id), text=text)
        except Exception as e:
            print(f"Ошибка при отправке сообщения пользователю {user_id}: {e}")

# Запуск бота
if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)


Этот код я использую в своем боте,отправка картинки не работает(может работает,но не отправляет)

При команде "/start" код записывает id аккаунта в txt файл(но если больше информации надо(имя и тд) то лучше использовать SQL)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы