Не могу отправить фото с помощью бота в телеграмме, с помощью post запроса

Решил не расписывать все слова а сразу показать кодом:

@api_view(['POST', 'GET'])
def send_post_request_telegram_bot(request):
if request.method == 'POST':

    data = JSONParser().parse(request)

    response = requests.post(
        url='https://api.telegram.org/bot{0}/{1}'.format('мой токен', 'SendMessage'),
        data={'chat_id': -538035856, 'text': data["name"]}
    ).json()

    response = requests.post(
        url='https://api.telegram.org/bot{0}/{1}'.format('мой токен', 'SendPhoto'),
        data={'chat_id': -538035856, 'text': data["photo"]} !!!
    )
    return Response({'data': 'data', 'status': 'OK'})

if request.method == 'GET':
    return render(request, 'news/request_to_telegram_bot.html')

Проблема в том что я не знаю как в строке !!! засунуть фото, в доке написано вот так: Разместите файл с использованием multipart/form-data обычным способом, которым файлы загружаются через браузер. Максимальный размер фотографий-10 МБ, других файлов-50 МБ. но я не понимаю как это сделать помогите пожалуйста

Правка, спустя несколько часов разбирательств получилось такое дело:

@api_view(['POST', 'GET'])
def send_post_request_telegram_bot(request):
    if request.method == 'POST':
        response = requests.post(
        url='https://api.telegram.org/bot{0}/{1}'.format('xxx',
                                                         'SendMessage'),
        data={'chat_id': -538035856, 'text': request.POST["name"]}
    ).json()



    response = requests.post(
        url='https://api.telegram.org/bot{0}/{1}'.format('xxx',
                                                         'SendPhoto'),
        data={'chat_id': -538035856, 'text': request.FILES}
    ).json()
    print(request.FILES)

    response = requests.post(
        url='https://api.telegram.org/bot{0}/{1}'.format('xxx`введите сюда код`',
                                                         'SendMessage'),
        data={'chat_id': -538035856, 'text': request.POST["msg"]}
    ).json()

    return Response({'data': 'data', 'status': 'OK'})

` Теперь просто отправляется name и msg но photo которое я точно с помощью postman отправляю не прилетает, оно в реквесте есть я проверял принтом введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения


Ответы (1 шт):

Автор решения: DeNRuDi

Если вы заглянете в официальную документацию Telegram к методу sendPhoto, то увидите, что передать нужно ключ не text, а photo. Вы же в своем коде указываете только text. Плюс, чтобы отправить изображение, потребуется использовать аргумент files, в который требуется передать словарь с ключом photo, и значением - байты или объект буферизированных байтов изображения. Используйте, также конструкцию with-as, чтобы автоматически закрывать открытое изображение.

Пример:

import requests

token = 'token'
with open('Test.png', 'rb') as file:
    print(file)  # <_io.BufferedReader name='Test.png'>
    r = requests.post(f'https://api.telegram.org/bot{token}/sendPhoto',
                      data={'chat_id': 123456789},
                      files={"photo": file})
print(r.json())

Если же вы хотите отправлять file_id изображения, которые уже есть на сервере Telegram, то можно обойтись и без аргумента files:

import requests

token = 'token'
r = requests.post(f'https://api.telegram.org/bot{token}/sendPhoto',
                  data={'chat_id': 123456789,
                        "photo": 'Ваш file_id изображения'})
print(r.json())
→ Ссылка