slack webhook에 curl하면 힘든 이야기

시작



Slack API를 사용하여 메시지 보내기 - Qiita
이 기사를 읽고 슬랙의 한 채널에 메시지를 보내고 싶었습니다.
webhook을 사용하여 curl로 두드려 json을 던져 POST 요청을 보냅니다.

web 앱이라면 json을 동적으로 생성하여 던지면 좋기 때문에 여유가 있습니다.
(이 때는 아직 작업의 어려움을 모른다...)

상황



해석의 일보를 markdown으로 만들어, 그것을 slack에 날려서 일보로 하려고 생각한 것입니다.

환경


  • OS: Windows10
  • console: Git bash

  • 서장: 기사 재현



    slack의 webhook과 위의 qiita 기사를 참고하여 첫 번째 명령을 작성합니다.
    slack의 예라고 이런 느낌.

    slack-example
    $ curl -X POST \
      --data-urlencode 'payload={"channel": "#chemspec-iot"
      , "username": "webhookbot"
      , "text": "This is posted to #chemspec-iot and comes from a bot named webhookbot."
      , "icon_emoji": ":ghost:"}'  \ 
    https://hooks.slack.com/services/{TOKEN}
    

    Qiita 기사 (위와 동일) 그럼, 이런 느낌.

    qiita-article-example
    $ curl -X POST \
      -d @message.json  \ 
    https://hooks.slack.com/services/{TOKEN}
    

    message.json
    payload={
          "username": "webhook"
        , "channel": "@sshojiro"
        , "text": "see more detail about `webhook` in http://qiita.com/rubytomato@github/items/6558bfdb37d982891c09#incoming-webhooks \n this message is sent via `curl`"
        , "icon_emoji": ":ghost:"
    }
    

    결과는 여기 :



    여기까지 좋고 기뻐합니다.

    2장: 고절 몇 시간



    아래의 markdown을 위와 같은 curl command로 slack의 채널에 표시하고 싶다는 것이 목표입니다. 아래의 markdown은 일보 등을 상정하고 있습니다.

    notes/2016-12-21.md
    # 2016/12/21 \n
    ## TODO \n
    - *bold* \n
    - _Italy_ \n
    - ~stank~ \n
    - aaaa
    

    그래서 고뇌하면서 만든 것이 다음 스크립트.$1.md 에서 $1.json 를 만든 후 curl에서 POST request합니다. 그런 다음 만든 임시 파일 $1.json를 삭제했습니다.

    send_msg.sh
    send_msg () {
      val=`cat notes/$1.md`
      echo 'payload={
          "username": "webhook"
        , "channel": "#chemspec-iot"
        , "text": "'"$val"'"}' > notes/$1.json
      curl -X POST \
        -d @notes/$1.json \
        https://hooks.slack.com/services/{TOKEN} # web-hook url
      rm notes/$1.json
    }
    send_msg $1
    

    종장: 완료



    이것을 실행해 보았습니다.
    $ ./send_msg.sh 2016-12-21
    

    무사히 슬랙 채널로 보낼 수있었습니다. 죄송합니다.



    결언



    slack의 webhook에 POST request를 보내, shell 경유로 *.md 의 내용을 자신에게 보내는 channel에 표시할 수 있었습니다.
    이렇게 하면 목록화된 일보를 표시할 수 있습니다.

    과제로서, 개행 문자를 넣지 않으면 slack상에서는 1행으로 나와 버립니다. 다른 기사에서 이것에 대응하고 싶습니다.

    추가



    2016/12/21



    코멘트란대로, @manji-0씨로부터 코멘트 받았습니다.
    val=`cat notes/$1.md`
    

    의 장소를,
    val=`cat notes/$1.md | sed -e 's/$/ \\n/g'`
    

    와 같이 수정하면, markdown중의 \n 가 불필요하게 됩니다.

    2020/05/26



    Windows의 curl을 두드릴 때(Windows에서 MATLAB을 이용하는 경우 등)는 문자열 따옴표를 붙이는 방법이 다르므로 주의가 필요합니다.
    또한 slack 측이 나타내는 샘플 코드도 Windows 명령 프롬프트에는 통하지 않습니다.
    예를 들어 MATLAB에서 slack을 두드리는 경우에는 다음과 같은 코드를 작성하는 것이 좋습니다.
    function slack(msg)
    if~exist('msg','var'),msg = 'Hello World!'; end
    secret = 'SLACK_SECRET';
    cmd    = ['curl -X POST -H "Content-type: application/json"' ...
              ' --data "{'...
              '\"text\":\"' msg '\", ' ...
              '\"username\": \"@webhook\", '...
              '\"channel\": \"@sshojiro\", '...
              '\"icon_emoji\": \":ghost:\"  '...
              '}" https://hooks.slack.com/services/' secret];
    [status, cURL_out] = system(cmd);
    if status ~= 0, error(cURL_out); end 
    

    Windows에서 curl로 slack webhook을 두드리는 기사

    좋은 웹페이지 즐겨찾기