LINE Webhook

최근 Line Bot을 사용하는 케이스가 종종 발생하였고 최근 API 사용법도 바뀌었다. 먼저 라인 봇을 활용하여 메시지를 보내거나 받거나 하기 위해서는 Webhook 기능을 꼭 이용해야 합니다. 왜냐하면 메시지를 보내기 위해서는 상대편의 아이디를 알아야 하는데 이 아이디를 알아내려면 Webhook 기능을 사용할 수 밖에 없기 때문이다.
Webhook은 생성한 계정을 팔로우 하거나 언팔로우 할 때, 그리고 대화방에 초대를 받거나 그룹에 초대 되었을 때 등 특정 이벤트가 발생하였을 때 호출할 Callback URL 말하는 것입니다.
Webhook이 호출 될 때에는 발생된 이벤트와 관련된 정보가 같이 전달 되며 해당 정보에는 사용자의 아이디나 메시지, 시간 등이 포함되어 있습니다. 그래서 이 정보를 저장하고 있다가 메시지를 보낼때 읽어와서 사용하면 됩니다.

LINE Webhook 설정

1. Webhook URL 입력

LINE developers 페이지에서 Basic information 메뉴를 클릭하면 [QR Code] 아래에 [Webhook URL] 이라고 있습니다. 해당 폼에 Webhook 정보를 전달 받을 페이지의 주소를 입력 합니다.


2. Webhook 사용 체크

LINE@MANAGER 페이지에서 Webhook 사용을 "허용" 해야 합니다. 해당 설정은 [계정 설정] => [Bot 설정] 에 있으며 "Webhook 사용", "Bot의 그룹 대화 참여 허용" 기능을 "허용" 으로 설정합니다.


Webhook 코드 작성하기

Webhook 코드를 작성하기 위해서는 Channel Secret 값이 필요하지만 필수는 아닙니다. 하지만 사용하면 보안상 좋겠죠.
코드 스타일은 개인적으로 다 다르기 때문에 제가 짠 코드는 참고만 하시기 바랍니다. 설명은 코드의 주석으로 대신 하겠습니다.

events) && count($JSON->events) == 1) {
    $JSON = $JSON->events[0];

    /* 위에서 정의한 타입만 처리 */
    if (in_array($JSON->type, $type)) {
        /* 저장할 파일이 존재 하지 않으면 생성 */
        if (!file_exists($filename)) {
            $linebot = new stdClass();
            $linebot->Users = array();
            $linebot->Room = '';

            $fp = fopen($filename, 'w');

            fwrite($fp, json_encode($linebot));

            fclose($fp);
        }
        /* 생성된 파일을 읽어와서 수정한다. */
        $contents = file_get_contents($filename);
        $contents = json_decode($contents);

        if ($JSON->type == 'follow' || $JSON->type == 'unfollow') {
            /* 팔로우/언팔로우 한 사용자의 아이디를 가져온다. */
            if ($JSON->source->type == 'user') {
                $userId = $JSON->source->userId;
            }

            if (isset($userId) && !empty($userId)) {
                if ($JSON->type == 'unfollow') {
                    /* Unfollow 할 경우에 해당 사용자를 기존 파일 내용에서 제거 한다. */
                    if (in_array($userId, $contents->Users)) {
                        unset($contents->Users[array_search($userId, $contents->Users)]);
                    }
                } else {
                    /* Follow 할 경우에 해당 사용자를 기존 파일 내용에 추가 한다. */
                    if (!in_array($userId, $contents->Users)) {
                        $contents->Users[] = $userId;
                    }
                }
            }
        }

        /* Group 에 초대 되었을 때 */
        if ($JSON->type == 'join') {
            /* 기존 파일 내용을 수정한다. */
            if ($JSON->source->type == 'group') {
                $contents->Room = $JSON->source->groupId;
            }
        }

        /* Group 에서 나갔을 때 */
        if ($JSON->type == 'leave') {
            /* 기존 파일 내용을 수정한다. */
            if ($JSON->source->type == 'group') {
                $contents->Room = '';
            }
        }
        /* 수정된 내용을 파일에 덮어쓴다. */
        $fp = fopen($filename, 'w');

        fwrite($fp, json_encode($contents));

        fclose($fp);
    }
}
?>

Webhook 을 통해서 저장된 파일의 내용

{"Users":["Uce6a55f848530fcf52cdb365705b32f3", "Uce6a55f848530fcf52cdb365705b32f2"],"Room":""}

위 JSON 값을 보시면 아시겠지만 사용자는 배열로 기록 하지만 그룹 방의 경우 가장 최신 그룹만 기록하게 하였습니다. 이제 해당 파일을 가지고 사용자에게 또는 그룹방에 메시지나 사진 등을 보내면 되겠습니다. 실제 라인에 보내는 예제는 PHP, Python 으로 작성하여 올리겠습니다.