커맨드 라인에서 LINE에 메시지를 보낼 수 있는 LINE Notify

들어가며

LINE Notify 개발을 담당하고 있는 Watanabe입니다. 개발자를 대상으로 LINE Notify를 사용하여 커맨드 라인에서 메시지를 보내는 방법을 소개하겠습니다.

기존에는 시스템적으로 LINE에 메시지를 보내려면 Bot API Trial 또는 Business Connect를 사용해야 했습니다. 이 기능들은 Messaging API에 의해서 개선되었지만, Messaging API는 기능이 뛰어난 반면 API 호출을 하려면 다소 고도의 구현이 필요합니다.

LINE Notify에서는 기능을 메시지 송신으로 한정하여 매우 짧은 단계를 통해 LINE에 메시지를 보낼 수 있는 API를 준비했습니다.

curl을 사용하여 메시지 보내기

LINE Notify로 발행할 수 있는 ‘personal access token’을 사용하여 API의 엔드포인트에 HTTP POST 리퀘스트를 보내기만 하면 메시지를 보낼 수 있습니다. HTTP 리퀘스트가 가능하다면 어떤 방법이든 사용할 수 있는데, 여기에서는 커맨드 라인에서 사용할 수 있는 HTTP 클라이언트인 curl을 사용해 보겠습니다.

personal access token 발행하기

LINE Notify의 My page(LINE ID 로그인 필요)에 접속하면 Generate token 버튼이 있습니다. 이 버튼을 클릭하면 token명과 그 token을 사용했을 때 메시지를 보낼 대상을 선택하는 화면이 나옵니다.

token명은 알기 쉬운 명칭을 임의로 입력해 둡니다. 메시지를 보낼 대상으로 1:1을 선택하면 LINE Notify 공식 계정과의 대화방에 메시지가 송신됩니다. 대화방을 선택하면 해당 대화방으로 LINE Notify 공식 계정이 메시지를 보내며, 메시지를 보낼 대상은 token별로 변경 가능합니다. 대화방마다 별도로 메시지를 보내고 싶은 경우에는 각각 token을 발행할 수 있습니다.

여기에서 발행한 access token은 한 번만 표시되기 때문에 메모해 두는 것을 권장합니다. 만약 access token을 잊어버렸다면 삭제하고 다시 발행합니다.

알림 보내기

획득한 personal access token으로 LINE에 메시지를 보내 보겠습니다. curl 명령어를 아래와 같이 호출하면 메시지를 송신할 수 있습니다. [access_token] 부분에 personal access token을 입력하세요.

curl -X POST -H 'Authorization: Bearer [access_token]' -F 'message=foobar' https://  
notify-api.line.me/api/notify
  • -X는 리퀘스트 메서드 지정
  • -H는 리퀘스트 헤더 지정
  • -F는 form data 송신

URL은 LINE Notify 알림용 엔드포인트입니다.
이와 같이 아주 간단하게 알림을 보낼 수 있습니다.

응용 예

curl을 사용해서 쉽게 메시지를 보낼 수 있다는 점은 이해가 되셨겠지요. 그럼 몇 가지 응용 예를 소개하겠습니다.

예 1: Jenkins의 빌드 결과 보내기

Jenkins의 빌드 결과를 LINE에 보내는 예입니다. 이왕 보여 드리는 김에 Jenkins2.0부터 정식으로 도입된 Jenkinsfile를 사용해 보겠습니다.
아래와 같은 스펙으로 만들어 보겠습니다.

1.Jenkins의 빌드 결과를 아래의 형식으로 보냅니다.

Build {branch}, result is {result}.
{buildUrl}

2.또, 만약 빌드 결과가 실패일 경우에는 문이 비웃는 이미지를 보내 보겠습니다(실제로 이런 이미지를 보내지는 맙시다! 이번 예시는 어디까지나 장난입니다).

아주 심플한 Jenkinsfile이기는 하지만 이렇게 작성하면 실현 가능합니다(이번에 보여 드리는 예는 Java project를 가정한 것이라서 Gradle로 빌드와 테스트를 진행했습니다).

#!groovy
  
node {
    try {
        stage 'Checkout'
            checkout scm
      
        stage 'Build and test'
            sh './gradlew clean check'
            currentBuild.result = 'SUCCESS'
    } catch (err) {
        currentBuild.result = 'FAILURE'
    }
  
    stage 'Notify'
        notifyLINE('YOUR_LINE_NOTIFY_TOKEN', currentBuild.result)
}
  
def notifyLINE(token, result) {
    def isFailure = result == 'FAILURE'
      
    def url = 'https://notify-api.line.me/api/notify'
    def message = "Build ${env.BRANCH_NAME}, result is ${result}. \n${env.BUILD_URL}"
    def imageThumbnail = isFailure ? 'FAILED_IMAGE_THUMBNAIL' : ''
    def imageFullsize = isFailure ? 'FAILED_IMAGE_FULLSIZE' : ''
      
    sh "curl ${url} -H 'Authorization: Bearer ${token}' -F 'message=${message}'   
    -F 'imageThumbnail=${imageThumbnail}' -F 'imageFullsize=${imageFullsize}'"
}

이렇게 해서 빌드에 성공하면 아래와 같은 메시지가 옵니다.

만약 실패하면 아래와 같은 메시지가 옵니다.

아주 쉽게 실현되었습니다.

예2: sl 명령어로 해 보기

sl 명령어란 ls를 실수로 sl라고 오타를 냈을 때 작업을 강제적으로 차단하여 오타를 정정하게 하는 취지의 명령어입니다. 그 이름대로 이 명령어는 실행하면 터미널에 SL(Steam Locomotive, 증기기관차)이 지나갑니다.

LINE Notify를 사용하여 LINE에 SL을 달리게 해 보겠습니다. 예를 들어 아래와 같은 쉘 스크립트 파일을 지정된 디렉터리에 sl이라는 이름으로 저장해 두면, LINE Notify를 경유하여 LINE에 SL을 지나가게 할 수 있습니다(실제로는 access token과 이미지의 URL을 제대로 설정해야 합니다. 또한, zsh에서 실행할 것을 가정하여 .zsh_history에서 실행했습니다).

#!/bin/sh
 
ACCESS_TOKEN=...
 
COUNT=$(echo $(perl -lan -e 's/^.+;| .+//g and /^sl$/ and print' ~/.zsh_history | wc -l))
 
for n in 1   4   8; do
    echo "Choo choo"
    curl -s -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "SL 
    coming through (Total: $COUNT)" -F "imageThumbnail=https://url-to-sl/$n.jpg" -F   
    "imageFullsize=https://url-to-sl/$n.jpg" https://notify-api.line.me/api/notify >  
    /dev/null
    sleep 1
done 

실행하면 아래와 같이 보입니다.

아주 쉽게 실현되었습니다.

서비스로 등록해 보기

이 글을 읽는 분 중에는 편리한 웹 서비스의 개발을 담당하고 있는 개발자도 계시겠지요. LINE Notify에서는 웹 서비스 제공자를 위해 OAuth를 사용한 연계 API도 제공하고 있습니다. 이 API를 사용하면 임의의 유저의 LINE에 알림을 보내는 서비스를 쉽게 구현할 수 있습니다.

자세한 사항은 API 문서(LINE ID 로그인 필요)를 참조해 주시기 바랍니다.

마치며

이상으로 LINE Notify를 사용하여 LINE에 메시지를 송신하는 방법을 소개했습니다. 아주 쉽게 사용할 수 있으니 적극 활용해 주시기 바랍니다.

Related Post