# L Message (エルメッセージ) 가이드 ## 개요 L Message (エルメッセージ, 약칭: エルメ)는 LINE 공식 계정을 자동화하고 강화하는 일본의 SaaS 도구입니다. LINE Messaging API를 통해 작동하며, 고급 마케팅 및 고객 관리 기능을 제공합니다. - **공식 사이트**: https://lme.jp/ - **매뉴얼**: https://lme.jp/manual/ ## 주요 기능 ### 1. 자동 응답 및 챗봇 - 키워드 자동 응답 - 시나리오 기반 대화 플로우 - AI 챗봇 기능 ### 2. 메시지 배신 - 세그먼트별 타겟 배신 - 스텝 메일 (단계별 자동 메시지) - 예약 배신 ### 3. 고객 관리 - 친구 정보 관리 - 태그 관리 - 설문조사 데이터 연동 - 고객 데이터 분석 ### 4. 예약 시스템 - 온라인 예약 관리 - 리마인더 자동 발송 ### 5. 폼 기능 - 설문조사 작성 - 진단 콘텐츠 - 분기 질문 ## API 연동 방식 L Message는 자체 API를 직접 제공하지 않고, **LINE Messaging API**를 통해 작동합니다. ### 연동 구조 ``` LINE 공식 계정 → LINE Messaging API → L Message 플랫폼 → 사용자 관리 화면 ``` ### 데이터 취득 방법 L Message에서 수집한 데이터를 외부 시스템에서 활용하려면: 1. **CSV 내보내기**: L Message 관리 화면에서 수동으로 CSV 파일 다운로드 2. **LINE Messaging API 직접 사용**: L Message를 거치지 않고 LINE API로 직접 데이터 조회 3. **Webhook 활용**: LINE Messaging API의 Webhook으로 이벤트 수신 ## LINE Messaging API 연동 설정 ### 1. LINE Developers 설정 L Message와 LINE 공식 계정을 연결하기 위한 준비: 1. **LINE Official Account Manager** 접속 2. 설정 > Messaging API 선택 3. **Messaging API 채널 생성** 4. **Channel ID** 및 **Channel Secret** 확인 5. **Channel Access Token** 발급 ### 2. L Message 연결 1. L Message 관리 화면 로그인 2. LINE 공식 계정 연결 메뉴 선택 3. Channel ID 입력 4. Channel Secret 입력 5. 연결 완료 ## Google Apps Script로 LINE Messaging API 사용 L Message 데이터를 Google Sheets로 가져오려면 LINE Messaging API를 직접 사용합니다. ### 1. API 설정 ```javascript // code.gs // Google Sheet에서 LINE API 정보 읽기 function getLineConfig() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('API_Config'); return { channelAccessToken: sheet.getRange('B10').getValue(), // LINE Channel Access Token baseUrl: 'https://api.line.me/v2' }; } ``` ### 2. 친구 프로필 조회 ```javascript // 특정 사용자의 프로필 조회 function getLineUserProfile(userId) { const config = getLineConfig(); const url = `${config.baseUrl}/bot/profile/${userId}`; const options = { method: 'GET', headers: { 'Authorization': `Bearer ${config.channelAccessToken}` }, muteHttpExceptions: true }; try { const response = UrlFetchApp.fetch(url, options); const statusCode = response.getResponseCode(); if (statusCode === 200) { const profile = JSON.parse(response.getContentText()); Logger.log('사용자 프로필: ' + JSON.stringify(profile)); return profile; } else { Logger.log('에러: ' + statusCode + ' - ' + response.getContentText()); return null; } } catch (error) { Logger.log('API 호출 실패: ' + error.toString()); return null; } } ``` ### 3. 메시지 발송 ```javascript // 푸시 메시지 발송 function sendLinePushMessage(userId, message) { const config = getLineConfig(); const url = 'https://api.line.me/v2/bot/message/push'; const payload = { to: userId, messages: [ { type: 'text', text: message } ] }; const options = { method: 'POST', headers: { 'Authorization': `Bearer ${config.channelAccessToken}`, 'Content-Type': 'application/json' }, payload: JSON.stringify(payload), muteHttpExceptions: true }; try { const response = UrlFetchApp.fetch(url, options); const statusCode = response.getResponseCode(); if (statusCode === 200) { Logger.log('메시지 발송 성공'); return true; } else { Logger.log('에러: ' + statusCode + ' - ' + response.getContentText()); return false; } } catch (error) { Logger.log('API 호출 실패: ' + error.toString()); return false; } } ``` ### 4. Webhook 이벤트 수신 ```javascript // LINE Webhook 이벤트 수신 function doPost(e) { try { const events = JSON.parse(e.postData.contents).events; events.forEach(event => { Logger.log('이벤트 타입: ' + event.type); switch(event.type) { case 'message': handleMessageEvent(event); break; case 'follow': handleFollowEvent(event); break; case 'unfollow': handleUnfollowEvent(event); break; } }); return ContentService.createTextOutput(JSON.stringify({status: 'ok'})) .setMimeType(ContentService.MimeType.JSON); } catch (error) { Logger.log('Webhook 처리 실패: ' + error.toString()); return ContentService.createTextOutput(JSON.stringify({error: error.toString()})) .setMimeType(ContentService.MimeType.JSON); } } // 메시지 이벤트 처리 function handleMessageEvent(event) { const userId = event.source.userId; const messageText = event.message.text; Logger.log(`사용자 ${userId}로부터 메시지: ${messageText}`); // Google Sheets에 저장 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('LineMessages'); sheet.appendRow([ new Date(), userId, messageText, event.message.type ]); } // 친구 추가 이벤트 처리 function handleFollowEvent(event) { const userId = event.source.userId; Logger.log(`새 친구 추가: ${userId}`); // 프로필 조회 const profile = getLineUserProfile(userId); // Google Sheets에 저장 if (profile) { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('LineFriends'); sheet.appendRow([ new Date(), userId, profile.displayName, profile.pictureUrl, 'active' ]); } } // 친구 차단 이벤트 처리 function handleUnfollowEvent(event) { const userId = event.source.userId; Logger.log(`친구 차단: ${userId}`); // Google Sheets에서 상태 업데이트 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('LineFriends'); const data = sheet.getDataRange().getValues(); for (let i = 1; i < data.length; i++) { if (data[i][1] === userId) { sheet.getRange(i + 1, 5).setValue('blocked'); break; } } } ``` ### 5. 리치 메뉴 관리 ```javascript // 리치 메뉴 생성 function createLineRichMenu() { const config = getLineConfig(); const url = 'https://api.line.me/v2/bot/richmenu'; const payload = { size: { width: 2500, height: 1686 }, selected: true, name: 'Main Menu', chatBarText: 'メニュー', areas: [ { bounds: { x: 0, y: 0, width: 1250, height: 843 }, action: { type: 'message', text: '予約する' } }, { bounds: { x: 1250, y: 0, width: 1250, height: 843 }, action: { type: 'uri', uri: 'https://example.com' } } ] }; const options = { method: 'POST', headers: { 'Authorization': `Bearer ${config.channelAccessToken}`, 'Content-Type': 'application/json' }, payload: JSON.stringify(payload), muteHttpExceptions: true }; try { const response = UrlFetchApp.fetch(url, options); const statusCode = response.getResponseCode(); if (statusCode === 200) { const result = JSON.parse(response.getContentText()); Logger.log('리치 메뉴 ID: ' + result.richMenuId); return result.richMenuId; } else { Logger.log('에러: ' + statusCode + ' - ' + response.getContentText()); return null; } } catch (error) { Logger.log('API 호출 실패: ' + error.toString()); return null; } } ``` ## L Message 데이터 CSV 내보내기 L Message 관리 화면에서 수동으로 데이터를 CSV로 내보낼 수 있습니다: 1. L Message 관리 화면 로그인 2. 친구 관리 또는 분석 메뉴 선택 3. CSV 내보내기 버튼 클릭 4. 다운로드한 CSV를 Google Sheets에 업로드 ### CSV 자동 업로드 스크립트 ```javascript // CSV 파일을 Google Drive에서 읽어 Sheet에 저장 function importLMessageCSV(fileId) { const file = DriveApp.getFileById(fileId); const csvData = Utilities.parseCsv(file.getBlob().getDataAsString()); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('LMessageData'); sheet.clear(); sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); Logger.log(`${csvData.length}행의 데이터를 가져왔습니다.`); } ``` ## 주의사항 1. **API 제한**: LINE Messaging API에는 월간 무료 메시지 한도가 있습니다 2. **L Message 플랜**: L Message는 유료 플랜에 따라 기능이 제한됩니다 3. **개인정보 보호**: 고객 데이터 처리 시 개인정보 보호법 준수 필요 4. **Webhook URL**: Google Apps Script의 웹 앱 URL을 LINE Developers에 등록 필요 5. **Rate Limit**: LINE API는 초당 요청 제한이 있습니다 ## L Message vs LINE Messaging API | 항목 | L Message | LINE Messaging API 직접 사용 | |------|-----------|----------------------------| | 난이도 | 쉬움 (GUI) | 어려움 (코딩 필요) | | 비용 | 월정액 플랜 | 메시지 종량제 | | 자동화 | 높음 | 직접 구현 필요 | | 커스터마이징 | 제한적 | 자유로움 | | 데이터 접근 | CSV 내보내기 | API로 실시간 조회 | ## 데이터 연동 추천 방식 Gemegg 프로젝트에서는 다음 방식을 추천합니다: 1. **L Message 플랫폼 활용**: 일상적인 고객 관리 및 메시지 발송 2. **LINE Messaging API**: Google Sheets로 실시간 데이터 동기화 3. **정기 CSV 내보내기**: 백업 및 장기 데이터 보관 ## 참고 링크 - L Message 공식 사이트: https://lme.jp/ - L Message 매뉴얼: https://lme.jp/manual/ - LINE Messaging API 문서: https://developers.line.biz/ja/docs/messaging-api/ - LINE Developers Console: https://developers.line.biz/console/