만족

[PHP] 텔레그램 봇 API로 서버 주요 알림 받아보기 본문

[PHP] 텔레그램 봇 API로 서버 주요 알림 받아보기

Backend/PHP Satisfaction 2021. 11. 6. 19:37

가령 새로운 문의사항이 있다거나, 서버의 컴퓨팅 자원 소모량이 갑자기 늘어날 때 

항상 모니터링을 하고 있는 것이 아니기 때문에 즉시 인지하기 어렵다.

 

그렇다고 별도의 알림 서버를 구축하자니 시간과 비용이 만만치 않은데,

텔레그램에서 지원하는 봇 API 를 사용하면 간단히 구현할 수 있다.

 

https://telegram.org/

 

텔레그램 – 새로운 메시징의 시대

빠르고. 안전하며. 강력함

telegram.org

먼저 텔레그램 계정을 생성하고, 앱을 다운로드받는다.

 

Bot 생성

BotFather를 검색하고 우측에 파란색 체크 아이콘이 이있는 봇(맨 위)을 선택한다.

 

start또는 시작 버튼을 누르면 다음과 같은 채팅이 표시된다.

 

/newbot을 입력하면 두 종류의 봇 이름을 결정하게 된다.

 

첫 번째 봇 이름은 메신저에서 표시되는 이름이고,

두 번째 봇 이름은 봇의 ID라고 보면 되겠다.

(게임 닉네임과, 로그인 아이디를 생각하면 되겠다)

 

단 두 번째 봇 이름은 반드시 bot으로 끝나야 한다는 규칙이 있다.

 

나의 경우 첫 번째 이름은 test-bot,

두 번째 이름은 t_esttest_bot 으로 했다.

 

성공적으로 마치면 이 봇에서 사용할 수 있는 고유한 TOKEN이 발급되는데,

이 값이 있으면 모든 동작을 할 수 있기 때문에 절대 외부로 노출되지 않도록 한다.

 

BotFather를 검색할 때와 마찬가지로 방금 만든 봇의 이름으로 검색하면 찾을 수 있다.

 

처음엔 아무런 동작도 하지 않는다.

 

서버에서 봇에 메시지 전송 명령 보내기

https://core.telegram.org/bots/api#message

 

Telegram Bot API

The Bot API is an HTTP-based interface created for developers keen on building bots for Telegram. To learn how to create…

core.telegram.org

전체 API는 위와 같다.

 

https://api.telegram.org/bot[API_KEY]/[METHOD]

 

url 서식은 위와 같으며, 특정 유저(이 경우 내가 되겠다)에게 메시지를 보낼 것이다.

 

API키의 경우 아까 BotFather가 붉은색 글씨로 알려준 값을 넣으면 된다.

 

메시지를 보내려면 "수신자 id"와 "보낼 내용"을 알아야 한다.

 

먼저 대상 봇에 아무 메시지나 보낸다.

 

그리고 나서 getUpdates라는 Method를 이용해 해당 봇의 업데이트 내역을 가져온다.

https://api.telegram.org/bot2119068188:AAEk0PS4iuEpDjcLpmgHPuSeB-ARyo1mLSo/getUpdates
(GET; 사실 다른거써도 상관은없다)

API키는 반드시 본인의 키로 변경해야 한다

 

{
    "ok": true,
    "result": [
        {
            "update_id": 508352566,
            "message": {
                "message_id": 3,
                "from": {
                    "id": 123456,
                    "is_bot": false,
                    "first_name": "ㅇㅇ",
                    "last_name": "ㅇㅇ",
                    "username": "aaataata",
                    "language_code": "ko"
                },
                "chat": {
                    "id": 123456,
                    "first_name": "ㅇㅇ",
                    "last_name": "ㅇㅇ",
                    "username": "aaataata",
                    "type": "private"
                },
                "date": 1636193748,
                "text": "asdfasfasfdas"
            }
        }
    ]
}

아마 위와 같은 형태로 응답이 왔을 것이다.

 

message.from.id가 해당 유저의 id값이다.

(이 경우 123456)

 

이제 메시지를 보내기 위해 sendMessage Method를 사용할 것이다.

 

https://api.telegram.org/bot2119068188:AAEk0PS4iuEpDjcLpmgHPuSeB-ARyo1mLSo/sendMessage
(POST; 사실 다른거써도 상관은없다)

API키는 반드시 본인의 키로 변경해야 한다

다음과 같이 url을 구성하고, 바디에 수신자 정보와 보낼 메시지를 입력한다.

{
	"chat_id": "123456",
	"text": "테스트 메시지입니다"
}

전송하게 되면 123456이라는 유저에게 "테스트 메시지입니다" 라는 메시지가 보내진다.

 

성공적으로 테스트되었다.

 

이제 코드로 구현해보자.

 

PHP에서 Telegram Bot API 호출하기

HTTP API 호출을 위해 CURL 을 사용할 것이다.

 

<?php

//curl.php

class HTTPResponse {
    public $code;
    public $response;
    public $url;
    public $info;
    public $raw;

    public function __construct($ch) {
        $temp = curl_exec($ch);

        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);

        // $header = substr($data, 0, $headerSize);
        $this->response = substr($temp, $headerSize);
        $this->code     = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $this->url      = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
        $this->info     = curl_getinfo($ch);
        $this->raw      = $temp;

        curl_close($ch);
    }
    public function printInfo() {
        var_dump($this->info);
        // echo $this->code;
        // echo $this->url;
        // echo $this->response;
        // echo $this->info;
    }
}
class Curl {
    /**
     * @description Make HTTP-POST call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function post($url, $query, $header = array('Accept: application/json', 'Content-Type: application/json')) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_FAILONERROR, true);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($query));
        //echo curl_errno($ch);
        return new HTTPResponse($ch);
    }
}
?>

기존에 작성한 CURL 코드가 있거나, 위 코드가 맘에 안드는 경우 따로 만들어 쓰면 된다.

 

아무튼 위 코드는 CURL로 POST 요청을 보내기 위한 클래스이다.

 

<?php

//telegram.php

include_once "curl.php";

class Telegram {
    private static $telegram_token    = '2119068188:AAEk0PS4iuEpDjcLpmgHPuSeB-ARyo1mLSo';
    private static $telegram_admin_id = '123456';
    public static function sendMessage($msg, $receiver = '123456') {
        $body     = array('chat_id' => $receiver, 'text' => $msg );
        $response = Curl::post('https://api.telegram.org/bot' . Telegram::$telegram_token . '/sendMessage', $body);
        
        return $response;
    }
}
?>

이 코드는 텔레그램 봇을 이용해 메시지를 보낼 수 있게 해 주는 클래스이다.

 

현재는 메시지 전송밖에 필요하지 않지만, 미래에 더 다양한 기능을 구현할 것이기 때문에 일단 클래스로 해 두었다.

 

개념은 위와 동일하고, 클래스 단위로 기능을 캡슐화했을 뿐이다.

 

이제 새로운 문의사항이 등록될 때 마다 메시지를 보내도록 할 것이다.

 

가령 문의사항을 등록하는 URL이 /reports.php라면 해당 url을 담당하는 코드로 이동해 아래와 같이 추가한다.

 

// 새로운 문의사항이 생성될 때 호출되는 함수
$report_body= $_POST['report_body'];

include_once "telegram.php";

//Telegram::sendMessage... 가 성공적으로 끝나면 봇이 메시지를 발송한다.
$telegram_result= Telegram::sendMessage("!!새로운 문의사항이 있습니다\n\n내용: " . $report_body);

//메시지 발송 성공/실패여부 체크
if($telegram_result->$code == 200){
	//메시지 발송 성공
}else{
	//메시지 발송 실패
}

//응답 반환
//...

 

이제 해당 url을 직접 호출해서 메시지가 잘 보내지는지 확인한다.

 

 

잘 작동한다.

 

메시지가 보내지지 않아요

아마 if($telegram_result->$code== 200)에서 else부분으로 빠졌을 것이다.

 

그럴 경우 $telegram_result->printInfo()를 사용해서 응답 메시지를 살펴보자.

 

해결방법이 오류 메시지에 나와 있을 것이다.

 

위에서 사용한 API 키는 현재 삭제했으므로, 직접 만들어서 쓰길 바란다.



Comments