Как связать бот Telegram с Amazon S3? - PullRequest
0 голосов
/ 16 февраля 2020

У меня бот-телеграмма с минимальным количеством функций. Теперь задача - загрузить файлы от пользователей в telegram-chat и отправить на S3.

Я использую Heroku на сервере. Но мне нужно место, где я могу хранить свои файлы (S3)

Вот код bot.py

import config
import telebot
import checking
import s3upload

bot = telebot.TeleBot(config.TOKEN)

@bot.message_handler(content_types=['photo'])
def download_photo(message):
    bot.send_message(message.chat.id, 'please wait')
    image_file_path = save_image_from_message(message)
    s3upload.image_upload(image_file_path)
    bot.send_message(message.chat_id, image_file_path)


def get_image_id_from_message(message):
    # there are multiple array of images, check the biggest
    return message.photo[len(message.photo) - 1].file_id


def get_image_path(message):
    image_id = get_image_id_from_message(message)
    file_path = bot.get_file(image_id).file_path
    print(file_path)
    return file_path;

И поэтому я использую другой код python, где подключаюсь на S3 (s3upload.py)

import boto3
import config
from botocore.client import Config

# S3 Connect
s3_bucket = boto3.resource(
    's3',
    aws_access_key_id=config.AWS_ACCESS_KEY_USER_2,
    aws_secret_access_key=config.AWS_SECRET_KEY_USER_2,
    config=Config(signature_version='s3v4')
)

def image_upload(my_file):
    data = open(my_file, 'rb')
    s3_bucket.Bucket(config.S3_BUCKET_NAME).put_object(Key=my_file, Body=data, ACL='public-read')
    print("done")

Проблема - python Не удается найти файл (FileIsNotFound). Помогите, пожалуйста, понять: 1. Как правильно подключиться к S3? 2. Как я могу использовать файлы (изображения) из telegram-bot?

1 Ответ

0 голосов
/ 16 февраля 2020

Редактировать: Извините, я неправильно понял, что происходило, когда я впервые прочитал это.

Вместо использования put_object я бы использовал upload_file, , прочитайте описание . Также см. сообщение о разнице.

Также относительно функции, вы можете попробовать что-то вроде

def image_upload(my_file):
  file_key = s3_file_name
  s3_bucket.meta.client.upload_file(my_file, mybucket, file_key)

На мой исходный пункт, убедитесь, что ваш пользователь IAM имеет адекватные привилегии. Похоже, что если вы можете сделать это, используя aws s3 .. локально, то вам следует подойти к go.

...