Каким образом можно запросить у пользователя фотографию через телебот и сохранить её в переменной?

Как отправить это изображение другим, имея только их идентификаторы?
  • 4 января 2024 г. 10:30
Ответы на вопрос 2
Перед тем как начать работу с ботом, вам понадобится создать бота через `@BotFather` в Telegram и получить токен для доступа к HTTP API.

Для запроса фотографии у пользователя в боте, написанном на Python с использованием библиотеки `python-telegram-bot`, можно использовать функциональность ConversationHandler, который позволяет организовать диалог с пользователем. Ниже представлен пример кода, который реализует такой сценарий:

```python
from telegram import Update, ForceReply
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, ConversationHandler, CallbackContext

# Определите состояния для ConversationHandler
PHOTO = 0

def start(update: Update, context: CallbackContext) -> int:
    user = update.message.from_user
    update.message.reply_text(
        "Привет! Отправьте мне фотографию, и я сохраню её.",
        reply_markup=ForceReply(selective=True),
    )

    # Переходим к этапу PHOTO
    return PHOTO

def photo(update: Update, context: CallbackContext) -> int:
    user = update.message.from_user
    photo_file = update.message.photo[-1].get_file()
    # Сохраняем объект файла фотографии в контексте бота
    context.user_data['photo'] = photo_file

    update.message.reply_text("Отлично! Фотография сохранена. Можете отправить ещё или /cancel чтобы отменить.")

    return ConversationHandler.END

def main() -> None:
    # Инициализируйте Updater с токеном вашего бота
    updater = Updater("YOUR_TOKEN_HERE")
    
    # Получим диспетчер для регистрации обработчиков
    dispatcher = updater.dispatcher

    # Настройте обработчик разговоров с состояниями PHOTO
    conv_handler = ConversationHandler(
        entry_points=[CommandHandler('start', start)],
        states={
            PHOTO: [MessageHandler(Filters.photo, photo)],
        },
        fallbacks=[CommandHandler('cancel', cancel)],
    )

    dispatcher.add_handler(conv_handler)

    # Начните цикл опроса
    updater.start_polling()
    
    updater.idle()

def cancel(update: Update, context: CallbackContext) -> int:
    update.message.reply_text("Операция отменена.")
    return ConversationHandler.END

if __name__ == '__main__':
    main()
```

Чтобы отправить сохранённое изображение другому пользователю по идентификатору, можно использовать метод `send_photo`. Важно, что у бота должно быть разрешение на отправку сообщений этому пользователю (например, пользователь уже начал беседу с ботом):

```python
def forward_photo(update: Update, context: CallbackContext) -> None:
    target_user_id = 'TARGET_USER_ID'
    # Предполагается, что фото уже сохранено в context.user_data['photo'] как показано выше в handler photo
    photo_file = context.user_data['photo']
    # Вместо file_id можно передать объект input_file, если фото находится локально
    # или используйте photo_file.download(custom_path) для скачивания, а затем отправки
    context.bot.send_photo(chat_id=target_user_id, photo=photo_file.file_id)
```

В этом коде `TARGET_USER_ID` должен быть заменён на идентификатор пользователя, которому вы хотите отправить фотографию.

Обратите внимание, что пользователи Telegram могут ограничить получение сообщений от ботов, если они не инициировали чат с вашим ботом.
import telebot
import pandas as pd

TOKEN = '972378863:AAEq29oLt61234sdfsdf3pQ1tXRpzmM'
bot = telebot.TeleBot(TOKEN)


@bot.message_handler(content_types=['photo'])
def handle_photo(message):
    file_id = message.photo[-1].file_id
    
    for chat_id in chats_ids:
        bot.send_photo(chat_id, file_id)

@bot.message_handler(content_types=['document'])
def handle_document(message):
    file_id = message.document.file_id
    
    for chat_id in chats_ids:
         bot.send_document(chat_id, file_id)


file_data = pd.read_excel('./tgid.xlsx')

# Читаем id из колонки chat_id
chats_ids = file_data['chat_id'].tolist()

bot.polling()
Похожие вопросы