2017-02-03 6 views
0

Я пытаюсь реализовать скрипт python, который установит webhook с помощью метода телеграммы бота api setWebhook. Как поясняется here после создания самозаверяющего сертификата мы можем добиться с этой командой завитка:Как превратить команду curl в эквивалент python?

curl -F "url=https://<YOURDOMAIN.EXAMPLE>/<WEBHOOKLOCATION>" \ 
-F "[email protected]<YOURCERTIFICATE>.pem" https://api.telegram.org/bot<YOURTOKEN>/setWebhook 

Вызов этим локон команда установить webhook без каких-либо проблем и я получаю обновление через него.

Но теперь Я пытаюсь достичь этого с помощью скрипта python, поэтому я мог бы просто вызвать его с помощью некоторых аргументов командной строки, чтобы он установил для меня webhook, узнал об этом или удалил его. То, что я написал до сих пор это:

files = { 
     'file': ('certificate', open(configuration.CERTFILE, 'rb')) 
    } 

headers = {'Content-Type': 'multipart/form-data'} 

data = { 
     'url': configuration.WEBHOOK_URL, 
    } 

url = configuration.API % 'setWebhook' 
rp = requests.post(url, headers=headers, data=data, files=files) 

print('result of setWebhook: ', rp.status_code) 

Код статуса ответ является400 Bad Request. Я думаю, что я посылаю запрос не так.

Любые идеи о что не так с моим requests запрос на телеграмму бота api?

ответ

0

Удаления headers параметров и переименовании ключа параметра files сделал трюк. Итак, теперь мой код выглядит так:

files = { 
    'certificate': ('certificate', open(configuration.CERTFILE, 'rb')) 
} 

data = { 
    'url': configuration.WEBHOOK_URL, 
} 

url = configuration.API % 'setWebhook' 
rp = requests.post(url, data=data, files=files) 

и он работает по назначению. Спасибо, геи!

1

Точный запрос локона принимает два параметра файла -F может быть преобразован в python-requests в

import requests 

files = { 
    'url': 'https://<YOURDOMAIN.EXAMPLE>/<WEBHOOKLOCATION>', 
    'certificate': open('<YOURCERTIFICATE>.pem', 'rb') 
} 

requests.get('https://api.telegram.org/bot<YOURTOKEN>/setWebhook', files=files) 
+0

'curl -h' говорит, что' -F' * Указывает HTTP-данные по multipart POST * и 'url' не является файлом. В любом случае я пробовал код, который вы предоставили, но без каких-либо успехов. – sehrob