[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에게 메세지가 전송이 되는 듯 한데 확인을 하지는 않았다.

편리

PHP와 MariaDB, jQuery 등을 사용해 게시판, 쇼핑몰 솔루션을 개발합니다. 그누보드5와 영카트5 개발에 참여 했습니다. Linux와 Nginx는 물론 WordPress, Git 등에도 관심이 많습니다. 자전거 타기 및 사진 촬영을 취미로 하고 있습니다.

카카오톡 플러스친구 채팅 : NCUBE.NET

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.