Невозможно публиковать изображения в канале Slack через веб-хуки, использующие запросы Python.

Я пытаюсь опубликовать изображение на канале Slack, используя веб-хуки. Эта базовая настройка позволила мне опубликовать текст на канале, но я не смог опубликовать изображение. Вот мой код:

def posting():
    import requests
    import json

    url = 'https://webhook'
    image = {'media': open('trial.jpg', 'rb')}
    r = requests.post(url, files=image)
    r.json

Когда я публикую текст, на канале появляется веб-бот и публикует его. Нужна ли мне дополнительная аутентификация для публикации? Или дело в том, что у Slack есть собственный API для загрузки, и он хочет, чтобы я прошел через это? Или что-то у ботов нет прав на размещение изображений?

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


person Peter Komistra    schedule 17.05.2016    source источник
comment
Я не уверен, как вы выбрали эту полезную нагрузку, но, возможно, прочитайте api.slack.com/incoming-webhooks для ожидаемых входных данных? (Я думаю, вы хотите отправлять JSON с элементом attachments.)   -  person user94559    schedule 17.05.2016
comment
Я взглянул на неактивные API, и оказалось, что для вложений они всегда ожидают URL. Я бы предпочел просто загрузить файл из каталога. Библиотека запросов создает впечатление, что это возможно, но я недостаточно привык к кодированию, чтобы знать, когда я бьюсь головой о стену, чтобы следовать своему первоначальному плану, вместо того, чтобы просто изменить настройки для работы с документацией впереди. меня. Это один из тех случаев?   -  person Peter Komistra    schedule 17.05.2016
comment
Я так думаю. Я почти уверен (согласно документации), что входящие веб-перехватчики не имеют опции, позволяющей загружать файл, поэтому вам нужно поместить файл в другое место и прикрепить его через URL-адрес.   -  person user94559    schedule 18.05.2016


Ответы (1)


Вы можете сделать это через Slack API, используя их метод files.upload: https://api.slack.com/methods/files.upload

Для правильной работы вам понадобится токен авторизации API. Вы можете настроить тестовый токен или следовать инструкциям по регистрации своей программы, чтобы получить долгосрочный: https://api.slack.com/web#basics

Кроме того, «медиа» не является правильным ключом json для загрузки файлов:
http://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file

Вот пример использования запросов на отправку изображения на канал. Используйте '@username', если вы хотите, чтобы изображение досталось определенному пользователю. Я включил тип контента и заголовок, но он должен работать и без них. Это напечатает ответ от Slack.

import requests

def post_image(filename, token, channels):
    f = {'file': (filename, open(filename, 'rb'), 'image/png', {'Expires':'0'})}
    response = requests.post(url='https://slack.com/api/files.upload', data=
       {'token': token, 'channels': channels, 'media': f}, 
       headers={'Accept': 'application/json'}, files=f)
    return response.text

print post_image(filename='path/to/file.png', token='xxxxx-xxxxxxxxx-xxxx',
    channels ='#general')
person Robert May    schedule 17.07.2016