Я предлагаю использовать python-telegram-bot
для этого, если вы еще этого не сделали. Вики великолепна и не использует Flask.
. Вы можете избежать сохранения файла на диск и сохранить его в памяти, используя BytesIO
. Функция для обработки сообщения может выглядеть следующим образом:
from io import BytesIO
def photo(update: Update, context: CallbackContext):
file = context.bot.get_file(update.message.photo[-1].file_id)
f = BytesIO(file.download_as_bytearray())
# f is now a file object you can do something with
result = somefunction(f)
response = 'I procsseed that and the result was %s' % (result,)
context.bot.send_message(chat_id=update.message.chat_id, text=response)
Затем добавьте обработчик в диспетчер. Обратите внимание, что с помощью Filters.photo
только сообщения, являющиеся фотографиями, дойдут до этого обработчика:
photo_handler = MessageHandler(Filters.photo, photo)
dispatcher.add_handler(photo_handler)
Это поддерживает последнюю версию (v12) API.
Вы также можете использовать wi sh чтобы взглянуть на сценарий, который я собрал: tg_client.py . Это часть большого репо, который выполняет обработку изображений через библиотеку Yolov3
. Также реализована поддержка блокировки связи с ботом вплоть до вашего собственного идентификатора пользователя телеграммы (дополнительную информацию см. На моей вики-странице ).
Вероятно, вы можете изменить это для своих собственных нужд, заменив функцию upload
на что-то, что вызывает ваш собственный скрипт обработки.
EDIT : I Мне кажется, я частично неправильно понял ваш вопрос, поэтому я отвечу на эту часть:
, используя cv2.imread(telegram_image.jpeg, 1)
, прежде чем выполнять какую-либо обработку и запускать на нем мою модель. Есть ли способ сделать это, не загружая файл изображения с бота телеграммы?
Я обработал это в своем коде благодаря этому ответу , который предлагает использование cv2.imdecode
вместо cv2.imread
.
Так что somefunction
выше, может обработать это как:
def somefunction(input_stream):
image = cv2.imdecode(numpy.fromstring(input_stream, numpy.uint8), 1)
# image is now what cv2.imread('filename.jpg',1) would have returned.
# rest of your code.
return 'the result of the processing'
Это позволяет избежать записи файла на диск, так как все это обрабатывается в памяти.