Skip to content

Instantly share code, notes, and snippets.

@nadar
Last active June 5, 2024 17:05
Show Gist options
  • Save nadar/68a347d2d1de586e4393 to your computer and use it in GitHub Desktop.
Save nadar/68a347d2d1de586e4393 to your computer and use it in GitHub Desktop.
Post a message to a slack channel with PHP
<?php
/**
* Send a Message to a Slack Channel.
*
* In order to get the API Token visit:
*
* 1.) Create an APP -> https://api.slack.com/apps/
* 2.) See menu entry "Install App"
* 3.) Use the "Bot User OAuth Token"
*
* The token will look something like this `xoxb-2100000415-0000000000-0000000000-ab1ab1`.
*
* @param string $message The message to post into a channel.
* @param string $channel The name of the channel prefixed with #, example #foobar
* @return boolean
*/
function slack($message, $channel)
{
$ch = curl_init("https://slack.com/api/chat.postMessage");
$data = http_build_query([
"token" => "YOUR_API_TOKEN",
"channel" => $channel, //"#mychannel",
"text" => $message, //"Hello, Foo-Bar channel message.",
"username" => "MySlackBot",
]);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
// Example message will post "Hello world" into the random channel
slack('Hello world', '#random');
@carefine
Copy link

carefine commented May 1, 2018

@jtuei If a file is pure PHP code, it is preferable to omit the PHP closing tag at the end of the file. This prevents accidental whitespace or new lines being added after the PHP closing tag, which may cause unwanted effects because PHP will start output buffering when there is no intention from the programmer to send any output at that point in the script.

@nicgordon
Copy link

This didn't work for me until I set CURLOPT_SSL_VERIFYPEER to true. Just thought I'd leave this here in case it helps anyone else.

@nadar
Copy link
Author

nadar commented Jun 17, 2018

Thanks for the mention @nicgordon, if someone wants to read more about CURLOPT_SSL_VERIFYPEER => https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html

Copy link

ghost commented Sep 30, 2018

Thank you. Really Interesting.

@jameshwartlopez
Copy link

Is there a way to make this function can handle new line?

@jameshwartlopez
Copy link

Fix it using PHP_EOL. Thanks for this simple and working function that does not include a lot of other codes.

@MantasVaitkunas
Copy link

I did get invalid_payload response. Issue was with $data, I had to pass it as json:

    function slack($message, $channel)
    {
        $url = getenv('SLACK_WEBHOOK_URL');
        $ch = curl_init($url);
        $data = [
            'channel' => $channel,
            'text' => $message,
            'username' => 'SlackBot',
        ];
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_THROW_ON_ERROR, 512));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

        $result = curl_exec($ch);
        curl_close($ch);

        return $result;
    }

@Zhigalin
Copy link

Legacy tokens creation disabled...

@eugenefvdm
Copy link

Yeah from:

https://api.slack.com/legacy/custom-integrations/legacy-tokens

Legacy token management
Tokens may no longer be created, but you can re-issue existing tokens here.

I needed a simple test so now have to look for another PHP example...

@nadar
Copy link
Author

nadar commented Nov 10, 2021

The code still works but you have to use Bot User OAuth Token which requires to:

1.) Create an APP -> https://api.slack.com/apps/
2.) See menu entry "Install App"
3.) Use the "Bot User OAuth Token"

@Niek
Copy link

Niek commented Apr 12, 2024

The file_get_contents() version:

function slack($message, $channel)
{
  $url = "https://slack.com/api/chat.postMessage";

  $data = http_build_query([
    "token" => getenv('SLACK_BOT_TOKEN'), // the "Bot User OAuth Token" value
    "channel" => $channel,
    "text" => $message,
    "username" => "NotificationBot",
  ]);

  $context = stream_context_create([
    'http' => [
      'method'  => 'POST',
      'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
      'content' => $data,
      'ignore_errors' => true // This is useful to get the content of the response even if the status code is not 200
    ]
  ]);

  $result = file_get_contents($url, false, $context);

  return $result;
}

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