[Python] 파이썬으로 Slack에 문자 보내기 Computer Tip

최근에 회사에서 Slack을 도입해서 잘 사용하고 있습니다.
슬랙도 나온지 거의 삼년은 된 것 같습니다.
Trello 와 더불어 관심을 가지고 지켜보고만 있다가
최근에야 소통 도구로서 활용하고 있습니다.

돈을 주고 상용을 사용해도 되지만 인원이 많지 않을 경우 무료 버전을 이용해도 충분합니다. (업로드 되는 파일의 최대 크기가 5G 
정도라 하는 것을 빼고는 아직까지는...)

최근에 CI(Continuous Integration), CD(Continuous Development) 및 DevOps 등을 살펴보면서도 그렇고
결국은 각각의 시스템이 유기적으로 잘 결합되는 것이 제일 중요한데 최근 이런 시스템들을 보면
외부 연동이 핵심이 될 정도로 중요한 점으로 부곽되고 있습니다.

과거에는 개발자들이 서로 서로 회식을 하면서 또는 머리를 맞대고 회의를 하면서
이런 소통을 하였다면 이런 추세가 Jira, GitHub, GitLab 등등의 협업시스템과
Slack 등과 같은 소통시스템 등이 Jenkins 등과 같은 연합시스템 등을 통해서
또는 각각 시스템의 WebHook 과 같은 연동 방식을 통하여 사람과 사람의 워크플로우의
상당 부분을 자동화 하기 시작하였고 이것이 바로 DevOps라 할 수 있겠네요.

암튼 DevOps를 구축하면서 Slack의 "Incoming WebHook"을 이용하여 Python에서 무언가의
일을 한 다음 그 결과를 Slack에 연동해 보았습니다.

다음은 그 방법입니다.


1) Slack 등록 및 채널 만들기.

이 방법은 기존의 Slack에 등록하여 단순히 자신의 고유 팀 (URL)을 만들고
그 안에 특정 채팅방 (채널)을 만들어 다른 사람을 초대하는 방식입니다.
방의 특성을 Private 하게 두어 해당 인원만 그 내용을 볼 수 있게 하였습니다.
자세한 방법은 생략합니다.


2) 개발자 Token 받기

Slack의 "Tokens for Testing and Development" 라는 링크를 가셔서

"Create token"을 눌러 API 에서 사용할 Token 을 생성합니다.

그러면 위와 같이 xoxp-.... 토큰이 생성됩니다. 


일단 이 토큰만 있으면 다음과 같이 해당 사용자로 쉽게 내용을 보낼 수 있습니다.


    token = 'xoxp-141160062918-.....'
    slack = Slacker(token)
    slack.chat.post_message('@receiver', '파이썬에서 보내는 테스트', '@sender', as_user=True)



3) Incoming Webhook 생성하기

생각보다 이 링크를 찿아가는게 쉽지 않았습니다.

우선 저는 로컬 Mac용 Slack App을 이용하고 있는데 웹브라우저도 동일합니다.

슬랙의 상단 중앙에 있는 설정을 누르고 나오는 것에서 "Add an app or integration"을 선택하면,

위와 같이 나오는 데, 상단 오른편에 있는 "Build"를 누릅니다.

그 다음에는 "Make a Custom Integration"을 누릅니다.

그 다음 Incoming WebHooks 를 선택합니다.

여러 채널(채팅방) 중에서 자동으로 무언가를 보낼 것을 하나 지정하거나 생성합니다.

그러면 자동으로 Webhook URL 이 나옵니다. 이를 활용하면 됩니다. (상단에는 보안 때문에 내용은 지웠습니다)

위의 화면을 내려오면 위와 같이 curl 명령으로 직접 보낼 수 있는 예시를 보여줍니다. 뭐 HTTP 표준이므로 그냥 따르면 어느 API 가 되었던 어느 유틸이 되었던 공통이겠지요.
최근의 RESTfulAPI가 각광받는 이유도 바로 이런 쉬운 공통 방법 때문이 아닐까 싶습니다.

그리고 더 내려가서 디폴느 이모지 등을 통해서 아이콘을 변경할 수 있다고 하였는데 실제로 적용은 다른게 하였습니다.
암튼 아래의 "Save Settings"을 누르면 끝납니다.


4) Slacker 파이썬 모듈

Slack 문서 페이지에도 공식적으로 파이썬에서 슬랙연결에 사용하라고 언급되어 있는 Slacker 입니다.

$ pip install slacker

(VirtualEnv 환경이 아니라면 sudo pip install slacker 하십시오)
로 쉽게 설치 됩니다.

각설하고 간단한 sendslack.pysendslack.json 을 하나 만들었습니다.

token 에는 2에서 설명한 토큰 정보를 입력하시고,

"channels" 목록안에 있는 개별 채널의 name에는 연동되는 채널 명을 지정합니다.
"incoming_webhook_url" 에는 개별로 만들어 놓은 연동 webhook URL 입니다.

서로 다른 채널로 찾아서 보내기 위하여 위와 같이 설정 파일을 따로 분리시켰습니다.

아직 몇개 까지 가능할 지 모르겠으나 위와 같이 여러 개의 Incoming WebHook 이 잘 만들어져 있고 개별 위치에 보내고자 함입니다.

위에 sendslack.py 를 실행시켜 보면,

위와 같이 나오는데 다음과 같은 방법으로 보냅니다.

$ python sendslack.py -l "_imo_do5_release_" -t ":thumbsup: test4" -x "안녕하셔요? 저는 로봇입니다" -u "test bot4"

그러면 그 결과가,
위와 같이 잘 나옵니다.  ㅎㅎ

-f 파일을 그 내용으로 지정할 수 있는데 현재 메시지에 보내는 최대 내용이 4000 바이트라 나누어 올리도록 하였습니다. 파일 업로드를 시도하였으나 생각처럼 되지 않고, 또 5G 라는 제약사항 때문에 그냥 메시지로 나오도록 하였습니다. (메시지 자체는 제한이 없는 것 같으니...)

다음은 좀 더 위의 sendslack을 활용한 모습니다.

Jenkins가 GitLab에 있는 Git에 Push가 되어 있으면 이를 개별 Test를 수행하여 그 결과를 Slack에 보내주는 시나리오입니다.


DevOps가 드디어 우리 눈앞에...

어느분께는 도움이 되셨기를...





핑백

덧글

  • 2016/12/23 23:16 # 답글 비공개

    비공개 덧글입니다.
  • 2016/12/24 13:55 # 비공개

    비공개 답글입니다.
댓글 입력 영역

구글애드텍스트