Перед тем как начать работу с ботом, вам понадобится создать бота через `@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 могут ограничить получение сообщений от ботов, если они не инициировали чат с вашим ботом.