Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 18, 2019 22:16:10

stratum
Зарегистрирован: 2019-04-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Telegram API sendDocument

Здравствуйте. Подскажите мне, что я делаю не так.
Нужен совет касающийся конкретно 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, но запрос такого вида почему-то не принимает телеграм.
Буду признателен вам за помощь.

Офлайн

#2 Сен. 19, 2019 02:12:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Telegram API sendDocument

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

Скачай netcat. С её помощью можешь сымитировать сервер, отправить на него запрос и прочитать, что в итоге отправляется. Так ты увидишь, что отправляешь вообще не то.



Отредактировано py.user.next (Сен. 19, 2019 02:13:14)

Офлайн

#3 Сен. 19, 2019 09:59:07

stratum
Зарегистрирован: 2019-04-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Telegram API sendDocument

Уже решил проблему, спасибо за помощь.

 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)

Офлайн

#4 Сен. 19, 2019 10:01:34

stratum
Зарегистрирован: 2019-04-30
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Telegram API sendDocument

Может кто-нибудь продемонстрирует, как сделать тоже самое с помощью urllib ?
У телеграм Api - два обязательных параметра chat_id и document
Но не обязательно на примере Telegram API, меня больше интересует как отправить файл с помощью multipart/form-data используя urllib

Офлайн

#5 Сен. 19, 2019 12:27:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Telegram API sendDocument

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() . Потом ты этот запрос отправляешь уже на адрес. Сложного я ничего не увидел. Решения в инете слишком перегруженные, поэтому вслепую брать их не надо.



Отредактировано py.user.next (Сен. 19, 2019 12:36:16)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version