구글 챗으로 LG U+ 센트릭스 전화 알림 받는 방법 3/3
1. 연재기사 소개
이 연재기사에서는 LG U+ IMS 센트릭스 기업 인터넷 전화로 전화가 올 때에, 구글 챗으로 알림을 보내는 방법을 소개합니다.
고객 응대를 위해서 기업 인터넷 전화를 사용하는 경우, 전화가 올 때에 고객이 우리 DB에 이미 있는 고객인지 또는 신규 고객인지 구글 챗을 통해 알 수 있다면 좋지 않을까요? LG U+ IMS 센트릭스 기업 인터넷 전화의 Open API를 활용하면 여러 가지 편의 기능들을 구현할 수 있습니다. 기사에서 필요한 부분을 확인해보세요.
이번 포스트는 3번째, 마지막 포스트로 구글 챗을 보내는 스크립트를 소개합니다.
구글 챗으로 LG U+ 센트릭스 전화 알림 받기 1/3
구글 챗으로 LG U+ 센트릭스 전화 알림 받기 2/3
구글 챗으로 LG U+ 센트릭스 전화 알림 받기 3/3
2. 구글 챗 DM 원리 살펴보기
구글 챗에서 DM을 보내는 것은 개인 대 개인으로 가능합니다.
챗봇처럼 시스템에서 보낼 수가 없습니다. 그래서 메시지를 보내는 개인이 필요합니다.
이 포스트에서는 스크립트를 작성한 사람의 이메일을 사용해서 인증하고 보내도록 구성합니다.
구글 챗에서 DM은 상대방의 이메일 주소를 알아야 보낼 수 있습니다.
상대방의 이메일 주소를 알면, 그것으로 상대방과의 채팅방 고유번호 (여기서는 parentSpace라고 부름)를 알아내야 합니다. parentSpace를 알아낸 다음에 해당 정보로 메시지를 보냅니다.
요약하면 다음과 같은 2단계입니다.
- 이메일로 parentSpace를 알아낸다.
- parantSpace로 메시지를 보낸다.
이를 위해서 4개의 스크립트를 작성합니다.
1. chat API의 url을 호출하는 공통의 스크립트: callChatAPI
2. createDM: parentSpace를 알아내고, sendMSG를 호출
3. sendMSG: 주어진 parentSpace와 메시지로 채팅방에 메시지를 전달
4. sendChatMessage: doPost에서 호출하는 스크립트입니다.
이 포스트에서는 수신자 전화번호로 구글 챗의 이메일 주소를 확인하는 과정은 생략합니다.
구글 워크스페이스를 사용해서 조직관리를 하고 있는 경우에는 전화번호와 구글 이메일을 데이터베이스화해두고, 전화가 왔을 때 수신자의 전화번호를 기준으로 구글 이메일을 찾는 로직을 구현하면 됩니다. sendChatMessage에서 이러한 전처리 작업을 할 수 있습니다.
3. 구글 챗 DM 발송 스크립트 생성
먼저 chat API를 호출할 공통의 스크립트를 작성합니다.
이는 parentSpace를 알아낼 때에도 사용하고, DM을 실제로 보낼 때에도 사용하기 위해 사용합니다.
주어진 apiUrl과 method, payloadObj를 사용해서 chat API를 호출하고 그 결과를 반환합니다.
/**
* Google Chat API에 HTTP 요청을 보내는 범용 함수입니다. 지정된 URL과 메서드,
* 페이로드를 사용하여 API 호출을 수행하고 응답을 반환합니다.
*
* @param {string} apiUrl - 호출할 API의 URL.
* @param {string} method - HTTP 요청 방식 (예: 'GET', 'POST').
* @param {Object} [payloadObj=null] - 요청에 포함될 페이로드 객체.
* 기본값은 null입니다.
* @returns {Object|null} API 응답 객체 또는 오류 발생 시 null.
*/
function callChatAPI(apiUrl, method, payloadObj = null) {
Logger.log(===== chat API 호출 시작: ${[apiUrl, method, JSON.stringify(payloadObj)]})
const options = {
method: method,
headers: {
"Authorization": 'Bearer ' + ScriptApp.getOAuthToken(),
"Content-Type": 'application/json'
},
muteHttpExceptions: true
};
if (payloadObj) {
options['payload'] = JSON.stringify(payloadObj)
}
try {
const response = UrlFetchApp.fetch(apiUrl, options)
const rescode = response.getResponseCode();
const resBody = JSON.parse(response.getContentText())
if (rescode == 200) {
Logger.log(Fetch 성공: ${JSON.stringify(resBody, null, 2)})
return resBody
} else {
Logger.log(Fetch 오류 발생: ${rescode}, ${JSON.stringify(resBody, null, 2)})
return null
}
} catch (e) {
Logger.log(오류 발생: ${e.stack})
return null
} finally {
Logger.log(===== chat API 호출 종료)
}
}
이번에는 parentSpace를 알아내고, DM을 sendMSG를 호출하는 createDM 스크립트입니다.
이메일과 메시지를 매개변수로 받습니다. 이메일로 parentSpace를 알아내고, parentSpace의 name을 사용해서 sendMSG를 호출합니다.
/**
* 지정된 이메일 주소로 직접 메시지(DM)를 보내는 함수입니다. 먼저 사용자의 공간을 설정하고,
* 해당 공간으로 메시지를 전송합니다.
*
* @param {string} email - 메시지를 받을 사용자의 이메일 주소.
* @param {string} msg - 보낼 메시지 내용.
*/
function createDM(email, msg) {
Logger.log(===== DM 발송 시작: ${[email, msg]})
Logger.log('먼저 이메일의 스페이스 정보를 불러옵니다.')
// Fetch 매개변수 정의
const apiUrl = 'https://chat.googleapis.com/v1/spaces:setup'
const method = 'POST'
const payloadObj = {
space: {
spaceType: "DIRECT_MESSAGE"
},
"memberships": [
{
"member": {
"type": "HUMAN",
"name": users/${email}
}
}
]
}
try {
const response = callChatAPI(apiUrl, method, payloadObj)
if (response) {
const parentSpace = response.name
sendMSG(parentSpace, msg)
} else {
throw new Error(오류 발생: ${email}의 parentSpace가 발견되지 않았습니다. 삭제된 이메일 같습니다.)
}
} catch (e) {
Logger.log(오류 발생: ${e.stack})
} finally {
Logger.log(===== DM 발송 종료)
}
}
sendMSG는 다음과 같습니다.
/**
* Google Chat API를 사용하여 특정 공간에 메시지를 보냅니다.
*
* @param {string} parentSpace - 메시지를 보낼 공간의 식별자.
* @param {string} msg - 전송할 메시지 내용.
*/
function sendMSG(parentSpace, msg) {
Logger.log(===== 메시지 발송 시작: ${[parentSpace, msg]})
const apiUrl = https://chat.googleapis.com/v1/${parentSpace}/messages
const method = 'POST'
const payloadObj = {
"text": msg
}
callChatAPI(apiUrl, method, payloadObj)
Logger.log(===== 메시지 발송 종료 )
}
이제 createDM을 호출하는 sendChatMessage 스크립트입니다.
email 에는 이메일 주소는 넣습니다. 테스트를 위해서 조직의 워크스페이스를 사용하는 사용자를 넣습니다.
💡이 부분에서 수신자 전화번호와 워크스페이스 이메일 데이터베이스를 활용해서 누구에게 전화가 왔는지 체크할 수도 있고, 발신자 전화번호를 고객 DB에서 확인해서 추가적인 정보도 메시지로 만들 수 있습니다.
function sendChatMessage(data) {
Logger.log(===== 구글 챗 발송 시작: ${JSON.stringify(data)})
const { sender, receiver, kind, inner_num, message } = data
const email = '이메일 주소'
try {
const msg = ※ ${sender}님의 전화입니다. ☎️
createDM(email, msg)
} catch (e) {
Logger.log(오류 발생: ${e.stack})
} finally {
Logger.log(===== 구글 챗 발송 종료)
}
}
이제 chat API를 호출하기 위한 권한을 설정해줍니다. 예전에는 oauthscope가 묵시적으로도 잘 동작했었는데, 24년 7월 정도부터는 명시적으로 해주어야 정상적으로 동작합니다. 그렇지 않으면 권한 부족으로 메시지가 발송되지 않습니다.
설정에서 appsscript.json 파일을 표시하도록 설정합니다.

그리고 해당 json 파일에 다음과 같이 권한을 추가합니다.
"oauthScopes": [
"https://www.googleapis.com/auth/chat.spaces.create",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/chat.spaces.readonly",
"https://www.googleapis.com/auth/chat.spaces",
"https://www.googleapis.com/auth/chat.messages",
"https://www.googleapis.com/auth/chat.memberships",
"https://www.googleapis.com/auth/chat.memberships.app"
]

이러한 코드들을 doPost가 들어있는 동일한 파일에 넣어주었다면, 올바로 동작시키기 위해서 배포를 한 번 더 해주어야 합니다. 배포를 하고 난 뒤에는 php 파일을 업데이트하고, FTP에 올려주는 작업을 잊지 마세요.
이제 다 되었습니다.
테스트 코드를 실행하거나, 직접 전화를 걸어보면 지정된 이메일로 구글 챗이 발송됩니다.

LG U+ IMS 센트릭스에서는 전화번호로 문자를 보내기, 전화 걸기와 같은 서비스로 API를 통해서 제공하고 있습니다. 문자와 전화는 서버 없이 할 수 있어서 훨씬 간단하게 개발할 수 있습니다. LG 유플러스의 기업용 전화를 사용하고 계시고, 구글 워크스페이스를 사용하신다면 구글 챗 알림을 사용해보시면 어떨까요?
참, 퍼포먼스가 궁금하실텐데 전화가 온 시점부터 구글 챗이 발송되기까지는 약 3-5초 정도 걸립니다. 전화벨이 3-4번 정도 울릴 쯤에 알림이 오니, 엄청 빠른 것은 아닙니다. 수신자, 발신자 번호로 전처리 해서 더 많은 정보를 구글 챗에 표시하는 경우에는 시간이 조금 더 걸릴 수 있습니다.


