-
-
Save alexstone/9319715 to your computer and use it in GitHub Desktop.
<?php | |
// (string) $message - message to be passed to Slack | |
// (string) $room - room in which to write the message, too | |
// (string) $icon - You can set up custom emoji icons to use with each message | |
public static function slack($message, $room = "engineering", $icon = ":longbox:") { | |
$room = ($room) ? $room : "engineering"; | |
$data = "payload=" . json_encode(array( | |
"channel" => "#{$room}", | |
"text" => $message, | |
"icon_emoji" => $icon | |
)); | |
// You can get your webhook endpoint from your Slack settings | |
$ch = curl_init("WEBHOOK ENDPOINT GOES HERE"); | |
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); | |
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
$result = curl_exec($ch); | |
curl_close($ch); | |
// Laravel-specific log writing method | |
// Log::info("Sent to Slack: " . $message, array('context' => 'Notifications')); | |
return $result; | |
} |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
you save my night yvonnel098
Thanks for this!
@pugwonk Hello - I'm having similar URL-encoding issues. I tried your suggestion of curl_setopt($ch, CURLOPT_POSTFIELDS, array('payload' => $data));
which let me pass just about any character through without causing the Slack invalid_payload
error - brilliant! :)
But the actual message came through to Slack in url-encoded form instead of readable text :( I think Slack have changed how they handle this since your post.
I'm doing $message = urlencode($message);
- if I don't then I can't get proper formatting in the Slack message (it displays \n
instead of actually putting in a line-break for example).
Has anyone else spotted anything like this?
Here's my code (roughly!):
$message = urlencode($message); // Contains things like 'This is the message to the channel:\n\nHere is the second line with some *bold text* hopefully!'
$channel = '#the-channel-to-post-to';
$data = 'payload=' . json_encode(array(
'channel' => $channel,
'text' => $message,
));
$url = 'MY_WEBHOOK_URL';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
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);
if ($result === false) {
echo 'Curl error: ' . curl_error($ch);
}
curl_close($ch);
Thanks :)
If it helps anyone, I got around most of the encoding problems by passing the parts of my $message
through this function:
function htmlReplace($string) {
// https://api.slack.com/docs/message-formatting#how_to_escape_characters
// Also use backslashes to escape double quotes/backslashes themselves,
// that would otherwise break the JSON.
// (deal with the slashes before the quotes otherwise the escaped quotes would be re-escaped!)
return str_replace(array('&', '<', '>', '\\', '"'), array('&', '<', '>', '\\\\', '\"'), $string);
}
Thank you
Thank you!
Top job exactly what I was looking for.
How are you able to set the channel? When I'm giving permission for my app to use the Incoming Webhook, I get a unique URL for every single Channel. I can send the channel all day long, but it's the URL that defines which channel it goes to. Is there a generic URL that I can't find? Or is there a permission I need to create that I am overlooking?
hello
i want to use slack rest api in curl to create a channel not with webhook but that is not working plz help me
Those this still work i am getting an error missing_text_or_fallback_or_attachments
thanks, it's help me so mush :)
in symfony nexylan / slack-bundle, we use "withIcon" to change the icon but here how to do it ?
Brilliant, thanks. emoji icons aren't working for me but, besides that, it's a very useful function!
Thanks a lot!