Как отправлять изображения из telegram-бота?

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
Доброго времени суток, буду признателен за помощь.
Проблема следующая: необходимо сделать рассылку в виде изображения и текста для пользователей бота. Изображения первоначально должны отправляться боту, затем боту отправляется текст и следующим шагом будет рассылка этого блока ( изображение + текст ) пользователям бота.
Я смог реализовать только рассылку изображения, записанного в коде и любого отправляемого текста. Пример работающего кода прилагаю, telebot (pyTelegramBotAPI), Windows. Заранее спасибо за помощь.
Python:
@bot.callback_query_handler(func = lambda call: call.data == 'admin|send')
def admin_send(msg):
    Users.us(msg.from_user.id, 'admin|send')
    bot.send_message(msg.from_user.id, 'Отправьте картинку и прикрепите к ней текст.')

@bot.message_handler(func = lambda msg: Users.gs(msg.from_user.id) == 'admin|send')
def admin_send_text(msg):
    users = Users.query.all()
    bot.send_message(msg.from_user.id, 'Рассылка запущена.')
    for u in users:
        try:
            bot.send_photo(
                            u.id,
                            photo='https://bit.ly/3JRhuK1',
                            caption=msg.text, parse_mode='HTML'
                        )
        except:
            pass

    bot.send_message(msg.from_user.id, 'Рассылка выполнена.')
    Users.us(msg.from_user.id, '')
 

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
Готов оплатить за дописанный по моим требованиям код.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Изображения первоначально должны отправляться боту, затем боту отправляется текст и следующим шагом будет рассылка этого блока ( изображение + текст ) пользователям бота.
Вот пример (без сохранения изображения):
Python:
import telebot
from telebot import types

bot = telebot.TeleBot('TOKEN')

user_dict = {}  # {1234567890: {'photo': photo_id, 'caption': some_text}}


def start_keyboard():
    keyboard = types.InlineKeyboardMarkup()
    send = types.InlineKeyboardButton(text='send photo', callback_data='send')
    keyboard.add(send)
    return keyboard


@bot.message_handler(commands=['start'])
def main(message):
    bot.send_message(
        message.chat.id,
        'Выберите действие ⤵', reply_markup=start_keyboard()
    )


@bot.callback_query_handler(func=lambda call: call.data == 'send')
def admin_send(call):
    bot.send_message(call.from_user.id, 'Отправьте картинку.')
    bot.register_next_step_handler(call.message, photo_handler)


def photo_handler(message):
    try:
        # если изображение есть в словаре - заменяем его и убираем описание
        if user_dict.get(message.chat.id) is not None:
            user_dict[message.chat.id]['photo'] = message.photo[len(message.photo) - 1].file_id
            user_dict[message.chat.id]['caption'] = ''
        else:
            # если фото нет - создаем словарь и добавляем изображение
            user_dict[message.chat.id] = {'photo': '', 'caption': ''}
            user_dict[message.chat.id]['photo'] = message.photo[len(message.photo) - 1].file_id
    except Exception as e:
        bot.reply_to(message, e)
    else:
        bot.send_message(message.chat.id, 'Теперь введите текст к картинке')
        bot.register_next_step_handler(message, text_handler)


def text_handler(message):
    # добавляем описание изображения фото в словарь
    user_dict[message.chat.id]['caption'] = message.text
    bot.send_message(message.chat.id, 'Напишите "отправить" чтобы разослать картинку пользователям')
    bot.register_next_step_handler(message, send_to_users)


def send_to_users(message):
    if message.text.lower() == 'отправить':
        # здесь можно добавить отправку в цикле      
        bot.send_photo(
            message.chat.id,
            photo=user_dict[message.chat.id]['photo'],
            caption=user_dict[message.chat.id]['caption'],
            parse_mode='HTML'
        )
    else:
        bot.send_message(message.chat.id, 'Напишите "отправить" чтобы разослать картинку пользователям')
        bot.register_next_step_handler(message, send_to_users)


bot.polling(none_stop=True, interval=0)
 
Последнее редактирование:
  • Мне нравится
Реакции: rosvo

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
Вот пример (без сохранение изображения):
Python:
import telebot
from telebot import types

bot = telebot.TeleBot('TOKEN')

user_dict = {}  # {1234567890: {'photo': photo_id, 'caption': some_text}}


def start_keyboard():
    keyboard = types.InlineKeyboardMarkup()
    send = types.InlineKeyboardButton(text='send photo', callback_data='send')
    keyboard.add(send)
    return keyboard


@bot.message_handler(commands=['start'])
def main(message):
    bot.send_message(
        message.chat.id,
        'Выберите действие ⤵', reply_markup=start_keyboard()
    )


@bot.callback_query_handler(func=lambda call: call.data == 'send')
def admin_send(call):
    bot.send_message(call.from_user.id, 'Отправьте картинку.')
    bot.register_next_step_handler(call.message, photo_handler)


def photo_handler(message):
    try:
        # если изображение есть в словаре - заменяем его и убираем описание
        if user_dict.get(message.chat.id) is not None:
            user_dict[message.chat.id]['photo'] = message.photo[len(message.photo) - 1].file_id
            user_dict[message.chat.id]['caption'] = ''
        else:
            # если фото нет - создаем словарь и добавляем изображение
            user_dict[message.chat.id] = {'photo': '', 'caption': ''}
            user_dict[message.chat.id]['photo'] = message.photo[len(message.photo) - 1].file_id
    except Exception as e:
        bot.reply_to(message, e)
    else:
        bot.send_message(message.chat.id, 'Теперь введите текст к картинке')
        bot.register_next_step_handler(message, text_handler)


def text_handler(message):
    # добавляем описание изображения фото в словарь
    user_dict[message.chat.id]['caption'] = message.text
    bot.send_message(message.chat.id, 'Напишите "отправить" чтобы разослать картинку пользователям')
    bot.register_next_step_handler(message, send_to_users)


def send_to_users(message):
    if message.text.lower() == 'отправить':
        # здесь можно добавить отправку в цикле      
        bot.send_photo(
            message.chat.id,
            photo=user_dict[message.chat.id]['photo'],
            caption=user_dict[message.chat.id]['caption'],
            parse_mode='HTML'
        )
    else:
        bot.send_message(message.chat.id, 'Напишите "отправить" чтобы разослать картинку пользователям')
        bot.register_next_step_handler(message, send_to_users)


bot.polling(none_stop=True, interval=0)
Отлично, спасибо большое.:) Что должен Вам за работу?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Что должен Вам за работу?
Ничего. Это просто пример.
 
  • Мне нравится
Реакции: rosvo

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
Ничего. Это просто пример.
Еще раз Вам спасибо:)
 

Форум IT Специалистов