Как отправлять изображения из telegram-бота?
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.
rosvo
Новичок
Доброго времени суток, буду признателен за помощь.
Проблема следующая: необходимо сделать рассылку в виде изображения и текста для пользователей бота. Изображения первоначально должны отправляться боту, затем боту отправляется текст и следующим шагом будет рассылка этого блока ( изображение + текст ) пользователям бота.
Я смог реализовать только рассылку изображения, записанного в коде и любого отправляемого текста. Пример работающего кода прилагаю, telebot (pyTelegramBotAPI), Windows. Заранее спасибо за помощь.
@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
Новичок
stud_55
Модератор
Изображения первоначально должны отправляться боту, затем боту отправляется текст и следующим шагом будет рассылка этого блока ( изображение + текст ) пользователям бота.
import telebot from telebot import types bot = telebot.TeleBot('TOKEN') user_dict = <> # > 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] = 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)
Как сделать, чтобы телеграм-бот отправлял фото(python)?
Я начинающий программист python, научился отвечать на сообщения в телеграм-боте, но как отправить в ответ на сообщение фотографию, не могу понять. В интернете искал, мало информации нормальной. Жду адекватного ответа. Спасибо!
Простой 3 комментария
Для начала давайте сделаем так, вы удалите скриншот кода и скопируете код в специальный тег для кода.
Может python, не ?
Пожалуйста вот ссылка на код который показывает как это делать https://pypi.org/project/pyTelegramBotAPI/0.2.9/ 🙂
Лайфхак:
После перехода на страницу нажимаем ctrl + f и вписываем в окно поиска send_photo и получаем следующее :
Или в вашем случае для начала нужно будет сделать так:
КОД:
import telebot from requests import get bot = telebot.TeleBot("TOKEN") @bot.message_handler(commands=["start"]) def start(message): bot.send_message(message.chat.id, "ТЕСТ") bot.send_photo(message.chat.id, get("https://i0.wampi.ru/2019/11/12/image.png").content) bot.polling()
На всё про всё минут 7 понадобилось мне и 2 ссылки которые доступны по первому же запросу в гугл.
(2 ссылку указать не могу потому что видёт на ‘запрещённый сайт’ 🙂 )
Вопросы ?
Создаем бота в Telegram
В этом статье я покажу как создать Telegram бота с помощью Python, поскольку не нашел хорошей русскоязычной статьи по этой теме.
Создание бота
Бот создается с помощью BotFather через Telegram. После команды /newbot надо просто следовать инструкции.
В конце мы получаем токен для управления ботом и работы с Telegram API.
pyTelegramBotApi
Ссылки на документации всех библиотек будут в конце.
Создадим простого бота, отвечающего на команду /start , с помощью этой библиотеки:
import telebot bot = telebot.TeleBot('1408700689:AAGVqcqscWWK7DnuNHahd0w1eNklfjPEVxE') @bot.message_handler(commands=['start']) def start(message): bot.send_message(message.chat.id, 'It works!') bot.polling()
pyTelegramBotApi является просто обёрткой для всего Telegram Bot API, но здесь разберутся только основные составляющие.
Взаимодействие с ботом происходит через переменную bot (токен надо вставить свой).
Декоратор @message_handler реагирует на входящие сообщение.
Message – это объект из Bot API, содержащий в себе информацию о сообщении. Полезные поля:
message.chat.id – идентификатор чата
message.from.id – идентификатор пользователя
message.text – текст сообщения
Функция send_message принимает идентификатор чата (берем его из сообщения) и текст для отправки.
Примеры функций
Отправка изображений
Можно отправлять фото из локального хранилища, но удобнее это делать по ссылке. Код аналогичен предыдущему:
@bot.message_handler(commands=['start']) def start(message): bot.send_photo(message.chat.id, photo=photo_url, caption='It works!')
Замена клавиатуры
У ботов есть функция замены стандартной клавиатуры на кнопочную. Для этого у всех функций есть опциональный аргумент reply_markup:
from telebot import types @bot.message_handler(commands=['start']) def start(message): markup = types.ReplyKeyboardMarkup() buttonA = types.KeyboardButton('A') buttonB = types.KeyboardButton('B') buttonC = types.KeyboardButton('C') markup.row(buttonA, buttonB) markup.row(buttonC) bot.send_message(message.chat.id, 'It works!', reply_markup=markup)
ReplyKeyboardMarkup – и есть та самая клавиатура. Метод row() создает ряд (максимум 12) из кнопок, передаваемых в качестве аргумента.
Также есть особенная клавиатура types.ReplyMarkupRemove(), которая меняет клавиатуру на стандартную.
Клавиатура для сообщений
Можно создавать клавиатуру для отдельного сообщения. Передавать его нужно так же в аргумент reply_markup:
from telebot import types @bot.message_handler(commands=['start']) def start(message): markup = types.InlineKeyboardMarkup() buttonA = types.InlineKeyboardButton('A', callback_data='a') buttonB = types.InlineKeyboardButton('B', callback_data='b') buttonC = types.InlineKeyboardButton('C', callback_data='c') markup.row(buttonA, buttonB) markup.row(buttonC) bot.send_message(message.chat.id, 'It works!', reply_markup=markup)
У кнопок есть несколько режимов, в зависимости от второго аргумента. Подробнее можно прочитать в официальной документации, но я остановлюсь только на callback_data.
При нажатии на такую кнопку боту придет отдельный CallbackQuery, который нужно обрабатывать подобно сообщению:
@bot.callback_query_handler(func=lambda call: True) def handle(call): bot.send_message(call.message.chat.id, 'Data: <>'.format(str(call.data))) bot.answer_callback_query(call.id)
Для обработки обязательно указать аргумент func для «отсеивания» Callback запросов.
После обработки каждого запроса нужно выполнить команду answer_callback_query, чтобы Telegram понял, что запрос обработан. В поле callback.data хранится информация из callback_data нажатой кнопки.
Изменение сообщений
У ботов есть функция изменения своих сообщений (можно использовать, чтобы сделать перелистывание страниц, например). Для этого нужно воспользоваться методом edit_message_text (edit_message_caption для картинок):
@bot.callback_query_handler(lambda call: True) def handle(call): bot.send_message(chat_id=call.message.chat.id, message_id=call.message.id, text='It works!') bot.answer_callback_query(call.id)
Смысл аргументов понятен из их названия.
Flask
Если запустить бота, то через какое-то время он упадет с ошибкой Connection to api.telegram.org timed out. Чтобы это исправить нужно использовать вебхук:
from flask import Flask, request import telebot token = '1408700689:AAGVqcqscWWK7DnuNHahd0w1eNklfjPEVxE' bot = telebot.TeleBot(token) app = Flask(__name__) @bot.message_handler(commands=['start']) def start(message): bot.send_message(message.chat.id, 'It works!') @app.route("/" + token, methods=['POST']) def getMessage(): bot.process_new_updates([telebot.types.Update.de_json(request.stream.read().decode("utf-8"))]) return "!", 200 bot.remove_webhook() bot.set_webhook('https://test.com/' + token) app.run()
Этот код при запуске сначала удалит вебхук, если такой был, и установит его на желаемый. Все запросы, которые приходят в функцию getMessage будут направляться в bot с помощью метода process_new_updates. Этот код уже можно использовать для запуска, например, на Heroku.
P.S. Чтобы работать с длинными диалогами, я хранил для каждого пользователя в базе данных его текущее состояние.