Почему скрипт Python для отправки данных в веб-хук Slack не работает, когда переменная извлекается из строки?

Язык: Python 2.7

Всем здравствуйте. Я нашел действительно полезный скрипт здесь: Python to Slack Web Hook

который показывает, как отправлять сообщения на веб-хук Slack.

import json
import requests

# Set the webhook_url to the one provided by Slack when you create the webhook at https://my.slack.com/services/new/incoming-webhook/
webhook_url = 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
slack_data = {"text": "<https://alert-system.com/alerts/1234|Click here> for details!"}

response = requests.post(
    webhook_url, data=json.dumps(slack_data),
    headers={'Content-Type': 'application/json'}
)
if response.status_code != 200:
    raise ValueError(
        'Request to slack returned an error %s, the response is:\n%s'
        % (response.status_code, response.text)
    )

Он работает безупречно, когда я запускаю файл .py.

Теперь у меня есть файл с множеством строк сообщений, которые я хочу отправить в Slack. Я уже правильно отформатировал его в файле, без пробелов и т. Д. Это просто вопрос его захвата и передачи, поэтому slack_data = line1 и т. Д.

Итак, я изменяю файл примерно так:

with open('export.txt', 'r') as e:
    for line in e:

        slack_data = line

Теперь, если я сделаю print slack_data сразу после этого, информация вернется на экран точно так, как должна быть, так что я думаю, что это хорошо. Я еще не начал заставлять его работать для каждой строки, потому что он даже не работает в первой строке.

Я получаю недопустимую полезную нагрузку 400, когда запускаю ее.

РЕДАКТИРОВАТЬ: поддержка Slack сказала, что по какой-то причине в то, что они получали, были вставлены escape-символы.

"{\"text\": \"<https://alert-system.com/alerts/1234|Click here> for details!"}\n"

Любое направление или помощь приветствуется.

Спасибо!!


person Arkham Angel    schedule 02.09.2016    source источник


Ответы (3)


Поскольку у меня уже были данные, предварительно отформатированные в файле как JSON, нужно было просто удалить json.dumps из кода.

СТАРОЕ:

#response = requests.post(webhook_url, data=json.dumps(slack_data), headers={'Content-Type': 'application/json'})

НОВОЕ:

response = requests.post(webhook_url, data=slack_data, headers={'Content-Type': 'application/json'})

Как только я это сделал, все заработало как шарм.

person Arkham Angel    schedule 02.09.2016

Просто отпишусь, может кому поможет. Для меня сработал приведенный ниже фрагмент:

data = json.dumps(slack_data)
    response = requests.post(
        URL, json={"text": data},
        headers={'Content-Type': 'application/json'}
    )

Как указал @Geo, окончательная полезная нагрузка, которую мы собираемся отправить, должна содержать ключевое слово "text", иначе она не будет выполнена.

Кроме того, в методе публикации я должен заменить data= на json=, иначе он продолжает выдавать ошибку из-за недопустимой полезной нагрузки. с 400

person abhy    schedule 27.02.2018

Если вы измените код на этот:

with open('export.txt', 'r') as e:
    slack_data = e.read()

ты все еще получаешь 400?

person Geo    schedule 02.09.2016
comment
Я получаю ValueError: смешивание методов итерации и чтения приведет к потере данных. - person Arkham Angel; 02.09.2016
comment
Подождите, я понял это в операторе with / for.. позвольте мне взять это и попробовать - person Arkham Angel; 02.09.2016
comment
все еще получаю invalid_payload - person Arkham Angel; 02.09.2016
comment
вы отправляете slack_data как есть или вы отправляете его как slack_data = {"text": slack_data} ? Из вашего первого примера я предполагаю, что он ожидает dict. - person Geo; 02.09.2016
comment
Извините, только что увидел ваш комментарий. Предполагается, что это slack_data = {text: ‹alert-system.com/alerts/1234|Click здесь› для подробностей!} Вот как это в файле, и так я публикую, когда запускаю его вручную (и он работает, запуская его вручную). - person Arkham Angel; 02.09.2016
comment
Служба поддержки Slack сказала, что по какой-то причине в то, что они получали, были вставлены escape-символы. {\text\: \‹alert-system.com/alerts/1234|Click здесь› подробности!}\n - person Arkham Angel; 02.09.2016