Найти - Пользователи
Полная версия: Telegram API sendDocument
Начало » Python для новичков » Telegram API sendDocument
1
stratum
Здравствуйте. Подскажите мне, что я делаю не так.
Нужен совет касающийся конкретно API TELEGRAM
Мне нужно отправить файл через TelegramBotApi

Вот мой код.
 token = 'TELEGRAM_BOT_TOKEN'
chat_id = 'TELEGRAM_BOT_CHAT_ID'
with open('document.zip', 'rb') as file:
    post_data = {'chat_id': chat_id,
                 'document': 'document.zip'}
    post_file = {'document.zip', file}
    requests.post(f'https://api.telegram.org/bot{token}/sendDocument')

Написано, что файл должен передаваться в multipart/form-data, но запрос такого вида почему-то не принимает телеграм.
Буду признателен вам за помощь.
py.user.next
stratum
Написано, что файл должен передаваться в multipart/form-data, но запрос такого вида почему-то не принимает телеграм.
Неправильно отправляешь запрос. Потренируйся на кошках отправлять POST-запросы. Telegram тут ни при чём.

Скачай netcat. С её помощью можешь сымитировать сервер, отправить на него запрос и прочитать, что в итоге отправляется. Так ты увидишь, что отправляешь вообще не то.
stratum
Уже решил проблему, спасибо за помощь.
 def send_request (doc):
    with open(doc, 'rb') as file:
        post_data = {'chat_id': chat_id}
        post_file = {'document': file}
        r = requests.post(f'https://api.telegram.org/bot{token}/sendDocument', data=post_data, files=post_file)
        print(r.text)
stratum
Может кто-нибудь продемонстрирует, как сделать тоже самое с помощью urllib ?
У телеграм Api - два обязательных параметра chat_id и document
Но не обязательно на примере Telegram API, меня больше интересует как отправить файл с помощью multipart/form-data используя urllib
py.user.next
stratum
Но не обязательно на примере Telegram API, меня больше интересует как отправить файл с помощью multipart/form-data используя urllib

Вот мы берём и отправляем на netcat через requests сначала
  
import requests
 
chat_id = 'chat'
with open('/tmp/file.txt', 'rb') as fin:
    post_data = {'chat_id': chat_id}
    post_file = {'document': fin}
    r = requests.post('http://localhost:12345', data=post_data, files=post_file)
    print(r.text)

Получаем результат
[guest@localhost tmp]$ nc -l 12345
POST / HTTP/1.1
Host: localhost:12345
User-Agent: python-requests/2.13.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 245
Content-Type: multipart/form-data; boundary=e235d26c4e1844d8a3157a67cc6cf940

--e235d26c4e1844d8a3157a67cc6cf940
Content-Disposition: form-data; name="chat_id"

chat
--e235d26c4e1844d8a3157a67cc6cf940
Content-Disposition: form-data; name="document"; filename="file.txt"

test

--e235d26c4e1844d8a3157a67cc6cf940--
^C
[guest@localhost tmp]$

Дальше то же самое надо вопроизвести через urllib. Для формирования запроса надо использовать urllib.request.Request(). Для отправки запроса надо использовать urllib.request.urlopen().

python.org. Request()
python.org. urlopen()
python.org. пример. Request + urlopen

Также в инете есть куча готовых вариантов для второго питона, из которых можно составить готовое решение побыстрее. Но суть такая: ты делаешь функцию, в которую подаёшь имя файла и содержимое этого файла, и она возвращает тебе готовый заполненный запрос (заголовки запроса и тело запроса) urllib.request.Request() . Потом ты этот запрос отправляешь уже на адрес. Сложного я ничего не увидел. Решения в инете слишком перегруженные, поэтому вслепую брать их не надо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB