[PHP] Slack Incoming WebHooks를 이용한 메세지 전송
하~ 또 Slack 이고 알림이다. 자꾸 이러면 안되는데.. 어떻게 하다보니 계속 이렇게 하고 있다. 근데.. 다 쓸 일이 있으니까.. 이전 [PHP] Slack 채널로 메세지 전송 포스트에서 레거시 토큰을 이용해 메세지를 채널로 전송했는데 이번에는 토큰을 사용하지 않고 WebHook을 이용해 채널로 메세지를 전송하는 방법이다. 토큰의 경우 정보가 유출 됐을 때 심각한(?) 문제를 초래할 수도 있기 때문에 WebHook을 이용하는 방법이 나을 것 같다. 아래는 해당 기능을 처리하는 코드이다.
<?php
/*
https://api.slack.com/incoming-webhooks
https://www.webpagefx.com/tools/emoji-cheat-sheet/
*/
class SlackIncomingWebHook
{
private $webHookUrl;
private $channel;
private $userName;
private $message;
private $iconEmoji;
private $iconUrl;
public function __construct($webHookUrl='', $userName='') {
$this->webHookUrl = $webHookUrl;
$this->userName = $userName;
$this->iconEmoji = '';
$this->iconUrl = '';
}
public function setWebHookUrl($webHookUrl) {
$this->webHookUrl = $webHookUrl;
}
public function setChannel($channel) {
$this->channel = $channel;
}
public function setUserName($userName) {
$this->userName = $userName;
}
public function setMessage($message, $len=0, $suffix='…') {
$_message = strip_tags(trim($message));
if($len > 0) {
$arrStr = preg_split("//u", $_message, -1, PREG_SPLIT_NO_EMPTY);
$strLen = count($arrStr);
if ($strLen >= $len) {
$sliceStr = array_slice($arrStr, 0, $len);
$str = join('', $sliceStr);
$_message = $str . ($strLen > $len ? $suffix : '');
} else {
$_message = join('', $arrStr);
}
}
$this->message = $_message;
}
private function setProtocol($url) {
if(!$url)
return $url;
if (!preg_match('#^(http|https|ftp|telnet|news|mms)\://#i', $url))
$url = 'http://' . $url;
return $url;
}
public function setLink($url='', $title='') {
$url = trim($url);
$title = trim($title);
if($url) {
$url = str_replace(array('<', '>'), '', $url);
$_message = $this->message;
$_message .= "\n<" . $this->setProtocol($url);
if($title) {
$title = str_replace(array('<', '>'), '', $title);
$_message .= '|'.$title;
}
$_message .= '>';
}
$this->message = $_message;
}
public function setIconEmoji($iconEmoji) {
$iconEmoji = strip_tags(trim($iconEmoji));
if($iconEmoji)
$this->iconEmoji = $iconEmoji;
}
public function setIconUrl($iconUrl) {
$iconUrl = strip_tags(trim($iconUrl));
if($iconUrl)
$this->iconUrl = $iconUrl;
}
public function send() {
if($this->webHookUrl) {
$postData = array(
'channel' => $this->channel,
'username' => $this->userName,
'icon_emoji' => $this->iconEmoji,
'icon_url' => $this->iconUrl,
'text' => $this->message
);
$ch = curl_init($this->webHookUrl);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, 'payload='.json_encode($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
return $result;
} else {
return 'WebHook URL Error';
}
}
}
$slack = new SlackIncomingWebHook();
$slack->setWebHookUrl('https://hooks.slack.com/services/xxxx/xxxxx');
$slack->setChannel('#general');
$slack->setUserName('Message Bot');
//$slack->setIconEmoji(':loudspeaker:');
$slack->setIconUrl('https://a.slack-edge.com/41b0a/img/plugins/app/service_36.png');
$slack->setMessage('Slack 메세지 전송 테스트');
$slack->setLink('https://yc5.codepub.net', '클릭>');
$result = $slack->send();
print_r($result);
?>
Slack Incoming WebHooks : https://api.slack.com/incoming-webhooks
WebHook App : https://my.slack.com/services/new/incoming-webhook/
채널로 메세지를 전송할 WebHook App을 생성한 후 위 코드 중 $slack->setWebHookUrl(‘https://hooks.slack.com/services/xxxx/xxxxx’); 를 수정한다. Slack 채널로 메세지를 전송할 때 Icon 을 설정할 수 있는데 Emoji 또는 이미지 Url을 직접 지정할 수 있다. 둘 다 설정된 경우 Emoji를 출력하는 듯 하다. $slack->setChannel(‘#general’); 에서 WebHook을 설정한 채널이 아닌 다른 채널명을 입력하면 해당 채널로 메세지가 전송된다. #general 대신 @user명 이렇게 하면 해당 user에게 메세지가 전송이 되는 듯 한데 확인을 하지는 않았다.