Skip to content

Instantly share code, notes, and snippets.

@devStepsize
Last active August 7, 2023 09:28
Show Gist options
  • Save devStepsize/b1b795309a217d24566dcc0ad136f784 to your computer and use it in GitHub Desktop.
Save devStepsize/b1b795309a217d24566dcc0ad136f784 to your computer and use it in GitHub Desktop.
POST a JSON payload to a Slack Incoming Webhook using Python requests
'''
This is an example of how to send data to Slack webhooks in Python with the
requests module.
Detailed documentation of Slack Incoming Webhooks:
https://api.slack.com/incoming-webhooks
'''
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': "Sup! We're hacking shit together @HackSussex :spaghetti:"}
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)
)
@johannesber
Copy link

@guymorrell Using this approach, I get a notification that the sent content can't be displayed. If I open the Slack Channel, the provided text is shown without any formatting.

@guymorrell
Copy link

guymorrell commented Sep 25, 2019

@johannesber and @NandanSatheesh try putting the content directly into a separate json file then loading it into a variable as follows:

import slack
import json
import requests

with open("block.json", "rt") as block_f:
    data = json.load(block_f)

def post_to_slack(message):
    webhook_url = 'https://hooks.slack.com/services/MY/WEBHOOK/URL'
    slack_data = json.dumps({'blocks': message})
    response = requests.post(
        webhook_url, data=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)
        )

post_to_slack(data)

image

I've put this up here: https://github.com/guymorrell/slack-webhooks-blockkit

@johannesber
Copy link

@guymorrell now this works like a charm! Thanks for your help!

@SalSoloman
Copy link

SalSoloman commented Jan 8, 2020

Hi, is there away you can use the same method but posting in a thread instead of the channel on Slack?

@Udhay1316
Copy link

Hi @guymorrell I am trying to publish cucumber report (Cucumber.json) from Jenkins to slack using slak-notifier-plugin but I got the below error
java.lang.RuntimeException: Received HTTP Status code [400] while posting to slack
at org.jenkinsci.plugins.slacknotifier.SlackClient.postToSlack(SlackClient.java:62)
at org.jenkinsci.plugins.slacknotifier.SlackClient.postToSlack(SlackClient.java:54)
at org.jenkinsci.plugins.slacknotifier.SlackClient.postToSlack(SlackClient.java:41)
at org.jenkinsci.plugins.slacknotifier.CucumberSlackService.sendCucumberReportToSlack(CucumberSlackService.java:33)
at org.jenkinsci.plugins.slacknotifier.CucumberSlackPostBuildNotifier.perform(CucumberSlackPostBuildNotifier.java:67)
at hudson.tasks.BuildStepMonitor$2.perform(BuildStepMonitor.java:32)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:741)
at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:690)
at hudson.model.Build$BuildExecution.post2(Build.java:186)
at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:635)
at hudson.model.Run.execute(Run.java:1878)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:428)
Build step 'Send Cucumber Report to Slack' marked build as failure

I could not be able to send the json which is made with Block Kit too. Can you please help me here?

@guymorrell
Copy link

Hi @Udhay1316, can you post trivial messages to slack? See https://github.com/guymorrell/slack-post-oath

@MarijanGazica
Copy link

Digging the history up but this seems to not work as intended anymore.
What I get as a result is no_text when I try to post a message. If I add the text field, it ignores the blocks.
Have you seen this issue before?

@rafaelnpaiva
Copy link

Hi @guymorrell
A simple text worked fine , but I'm trying to send this payload :
{
"Title": "Resources in AWS ~> eng-sbx",
"icon_emoji": ":money:",
"Resource_Count": {
"CloudFormationStack": "259",
"CloudWatchLog Group": "4319",
"DynamoDBTable": "119",
"EC2Address": "7",
"EC2Instance": "34",
"EC2Security Group": "877",
"GlueDatabase": "14",
"LambdaFunction": "831",
"ECRRepository": "117",
"ECRImage": "6602",
"ELBLoad Balancer": "34",
"EMRCluster": "1",
"ElastiCacheCluster": "20",
"ElastiCacheReplication Group": "5",
"GlueCrawler": "10",
"KinesisStream": "24",
"EFSFile System": "9",
"EKSNode Group": "13",
"EKSCluster": "5",
"SageMakerApp": "7",
"SageMakerNotebook Instance": "2",
"RedshiftSnapshot": "2",
"RDSInstance": "18",
"RDSSnapshot": "3",
"EC2Snapshot": "40",
"EC2Volume": "224",
"S3Bucket": "123",
"IAMPolicy": "157",
"IAMRole": "359"
}
}

I keep having error 400 . Can you help me please ?

Traceback (most recent call last):
File "testing.py", line 183, in
print(test())
File "testing.py", line 179, in test
response = post_slack(result)
File "testing.py", line 160, in post_slack
raise ValueError(
ValueError: Request to slack returned an error 400, the response is:
missing_text_or_fallback_or_attachments

@aswinin22
Copy link

json={"text": data}

Amazing! Working like a charm!

@aronmarden
Copy link

@rafaelnpaiva - I have this problem also.

You need to use the block strucutre that Slack is expecting: (found here)

{
	"blocks": [
		{
			"type": "section",
			"text": {
				"type": "plain_text",
				"text": "This is a plain text section block.",
				"emoji": true
			}
		}
	]
}

I also need to send a simple JSON payload, and I really don't understand why there isn't a way to send our own key:value JSON block...I get that it won't nessasarily be pretty like Slack likes things to be... but sometimes we just need payloads.

@guymorrell do you have any ideas?

@eugenyuk
Copy link

eugenyuk commented Aug 7, 2023

Hi, this is working example:

import requests

def send_slack_notif():

    url = 'YOUR_SLACK_WEBHOOK_URL'
    payload = {
        "blocks": [
            {
			    "type": "section",
			    "text": {
				    "type": "plain_text",
				    "text": ":red_circle: This is a plain text section block.",
				    "emoji": True
			    }
	}
        ]
    }
    r = requests.post(url, json=payload)
    
send_slack_notif()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment