Как сохранить файл, загруженный пользователем в Slack

#slack #slack-api

Вопрос:

Я использую Slack Bolt Python SDK для сбора файлов, загруженных пользователем. Когда пользователь загружает файл в приложение slack bot, бот распознает событие, и полученное тело выглядит следующим образом:

 {'token': 'xxxxxxxxxxxx',
 'team_id': 'Ttttttttt',
 'enterprise_id': 'Eeeeee',
 'api_app_id': 'Aaaaaaaa',
 'event': {'type': 'message', 
           'text': '', 
           'files': [{'id': 'Fffffff', 
                      ......
                      'mode': 'snippet', 
                      'is_external': False, 
                      'external_type': '', 
                      'is_public': False, 
                      'public_url_shared': False, 
                      'display_as_bot': False, 'username': '', 
                      'url_private': 'https://url/file.xlsx', 
                      'url_private_download': 'https://url2/file.xlsx', 
                      'permalink': 'https://url3/file.xlsx', 
                      'permalink_public': 'https://url3', 
                      ......
 

Учитывая возвращенное значение, как я могу получить файл и сохранить его? Я пробовал что-то вроде

 file_path = body['event']['files'][0]['url_private_download']
urllib.request.urlretrieve (file_path, "./temple.xlsx")
 

Но сохраненный файл не в формате xlsx, а в формате html. Кто-нибудь может сказать мне, как правильно сохранить файл? Заранее спасибо.

Ответ №1:

Вы должны указать заголовок авторизации при отправке запроса на загрузку файла:

 Authorization: Bearer A_VALID_TOKEN
 

A_VALID_TOKEN-это токен OAuth, который имеет files.read область действия.

Вы можете прочитать больше здесь: https://api.slack.com/types/file#auth

Похоже, что html-файл, который вы получаете, является просто ответом по умолчанию от Slack, когда не предоставляется токен аутентификации.