Skip to content

CHICPRO

  • Life Log
  • Cycling Log
  • Photo Log
    • Portrait
    • Landscape
    • Flower
    • Etc
  • Coding Log
  • Information

[PHP] Slack Incoming WebHooks를 이용한 메세지 전송

2017-11-02 by 편리

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

Post navigation

Previous Post:

[PHP] 그누보드5 게시글 등록 Slack 메세지 전송

Next Post:

[PHP] Slack WebHooks를 이용한 메세지 전송

Leave a Reply Cancel 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.

Recent Posts

  • php 배열 연산에서 + 와 array_merge 의 차이
  • pcntl_fork 를 이용한 다중 프로세스 실행
  • 아이폰 단축어를 이용하여 주중 공휴일엔 알람 울리지 않게 하기
  • 구글 캘린더 전체일정 재동기화
  • OpenLiteSpeed 웹서버에 HTTP 인증 적용
  • OpenLiteSpeed 웹어드민 도메인 연결
  • WireGuard를 이용한 VPN 환경 구축
  • Ubuntu 22.04 서버에 OpenLiteSpeed 웹서버 세팅
  • 맥 vim 세팅
  • 우분투 시스템 터미널쉘 zsh 로 변경

Recent Comments

  • 편리 on 업무관리용 그누보드 게시판 스킨
  • 임종섭 on 업무관리용 그누보드 게시판 스킨
  • 캐논 5D 펌웨어 | Dslr 펌웨어 업그레이드 방법 82 개의 베스트 답변 on 캐논 EOS 30D 펌웨어 Ver 1.0.6 , EOS 5D 펌웨어 Ver 1.1.1
  • Top 5 캐논 5D 펌웨어 Top 89 Best Answers on 캐논 EOS 30D 펌웨어 Ver 1.0.6 , EOS 5D 펌웨어 Ver 1.1.1
  • 편리 on 워드프레스 애니메이션 gif 파일을 mp4로 변환하여 출력하기
  • 임팀장 on 워드프레스 애니메이션 gif 파일을 mp4로 변환하여 출력하기
  • 편리 on Notepad++ NppFTP 플러그인 수동 설치
  • paul-j on Notepad++ NppFTP 플러그인 수동 설치
  • YS on Windows 10 iCloud 사진 저장 폴더 변경
  • 편리 on Docker를 이용한 Centos7 + httpd + php 5.4 개발환경 구축

Meta

  • Log in
  • Entries feed
  • Comments feed
  • WordPress.org
© 2025 CHICPRO | Built using WordPress and SuperbThemes