구글 챗으로 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를 호출하고 그 결과를 반환합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/** * 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를 호출합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
/** * 지정된 이메일 주소로 직접 메시지(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는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * Google Chat API를 사용하여 특정 공간에 메시지를 보냅니다. * * @param {string} parentSpace - 메시지를 보낼 공간의 식별자. * @param {string} msg - 전송할 메시지 내용. */ function sendMSG(parentSpace, msg) { Logger.log(`===== 메시지 발송 시작: ${<strong>[</strong>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에서 확인해서 추가적인 정보도 메시지로 만들 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 파일에 다음과 같이 권한을 추가합니다.
1 2 3 4 5 6 7 8 9 |
"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번 정도 울릴 쯤에 알림이 오니, 엄청 빠른 것은 아닙니다. 수신자, 발신자 번호로 전처리 해서 더 많은 정보를 구글 챗에 표시하는 경우에는 시간이 조금 더 걸릴 수 있습니다.