발송 대기열과 발송 시각
아침 단어·뉴스 같은 루틴 발송, 방 번호로 방 식별
서버에 발송 대기열을 두고 폰이 가져가 방에 올린 뒤 결과를 회신하는 구조를 만들어, 정해진 시각에 내 방에 안내를 보냅니다.
예상 소요 시간 약 50분
이 강은 방에 먼저 말을 거는 기능이에요. 반드시 12강의 원칙(내 방, 동의, 낮은 횟수, 광고 표시)을 먼저 읽고 와요. 처음에는 시험 방에서만 해요.
질문에 답하는 것과 구조가 달라요
답하는 것은 방 알림이 있어서 가능해요. 정해진 시각에 먼저 올리는 것은 알림이 없는데 어떻게 그 방에 보내느냐가 핵심이에요. 폰의 시간표는 절전이나 멈춤으로 믿을 수 없어서, 서버가 시각·문구·방을 관리하는 대기열을 두고 폰이 주기적으로 "보낼 게 있어요?"하고 물어요(폴링).
내가(또는 스크립트가) 대기열에 등록
→ 폰이 주기적으로 확인해서 하나 받음(잠시 임대)
→ 방에 전송
→ 성공·실패를 서버에 회신(ack)
→ 서버가 sent / 재시도 / failed 로 기록
- 같은 key는 한 번만 만들어요(같은 날·같은 방 중복 방지).
- 배달은 몇 번까지만 다시 시도하고, 예정 시각에서 한참 지나면 만료해요. 아침 안내를 점심에 보내지 않기 위해서예요.
- 회신(ack)이 있어야 "보냈다"고 알아요. 폰이 보냈다고 믿는 것과 서버가 아는 것을 맞추는 장치예요.
- 폰 쪽에도 안전장치를 둬요. 허용한 방이 아니면 거부, 하루 전송 건수 제한, 전송 사이 간격, 글자 수 제한.
방을 어떻게 알아볼까요
예전 방식의 알림은 방 이름이 아니라 보낸 사람 이름이 방 이름 자리에 올 수 있어서 방 이름으로 방을 찾기 어려워요. 해결 방법은 두 가지예요.
- 방 번호(채널 ID)로 보내기(권장): 메신저봇R의 API 2 방식 봇은 방마다 다른 고유 번호를 줘요. 번호는 폰이 재시작돼도 그대로예요. 설정에 "내가 부르는 별칭 → 방 번호"를 적어 두면 돼요. 이 기능이 되는 앱 버전은 메신저봇R 공개 문서에서 확인해요.
- 답장 통로 등록(대체): 그 방에서 한 번 봇을 불러 답장 통로를 기억시켜요. 폰이 재시작되면 사라져서 다시 등록해야 해요.
메신저봇R API 2 봇으로 방의 고유 번호를 확인하는 작은 진단 스크립트를 만들어줘. 방마다 번호와 그룹방 여부만 폰 화면이나 로그에 보여주고, 메시지 본문은 어디에도 기록하지 마. 방 번호는 설정의
별칭: 번호목록에 내가 직접 적을 거야.
따라하기 1: 대기열 API
발송 대기열 API를 만들어줘. 관리용 토큰으로
{room 별칭, text, sendAt, key}를 등록하고, 폰용 토큰으로 가장 오래된 보낼 것 하나를 받아 가고(임대), 결과를 회신해. 시각 표기에 시간대가 없으면 한국 시간으로 봐. 같은 key는 중복 생성하지 마. 개인정보 패턴이 있는 글, 글자 수 초과는 거절해. 두 토큰은 환경변수로 읽고 서로 다른 값이어야 해. 예약 상태를 한눈에 보는 건수 조회도 만들어줘.
따라하기 2: 루틴 만들기
아침 단어, 오늘의 한 줄, 새 소식 같은 정해진 글을 하루 한 번 보내는 것이 기본 루틴이에요.
매일 정해진 시각에 대기열에 오늘의 글을 등록하는 스크립트를 만들어줘. 글은 내가 미리 쓴
routine/posts.md에서 날짜 순으로 하나씩 가져와. 같은 날·같은 방은 key로 중복을 막고, 목록이 비었거나 오늘 글이 없으면 보내지 말고 건너뛴 이유만 기록해. 내가 확인한 글만 쓰게 하고, 처음 며칠은 등록만 하고 실제 전송은 내 확인 후에만 하게 해줘.
긴 글은 한 번에 보내면 카톡이 접어서 보여 줄 수 있어요. 말풍선 몇 개로 나누고 사이에 짧은 간격을 둬요. 중간에 실패하면 이미 보낸 개수를 기록해 재시도 때 중복 전송을 막아요. 그날 새 글이 준비되지 않았으면 오래된 글을 보내지 말고 건너뛰는 편이 신뢰를 지켜요.
발송 시각을 방에서 바꾸기(선택)
방장이 방에서 @도우미 발송시간 8시 30분처럼 말하면 시각이 바뀌게 만들 수 있어요. 조회는 누구나, 변경은 방장만 하게 해요. 다만 방장 확인이 보이는 이름에 의존하면 프로필 이름을 같게 해서 흉내 낼 수 있어요. 방장 이름은 방에서 고유하게 유지하고, 중요한 변경은 서버 쪽에서도 확인해요.
폰 재시작과 대체 경로
- 폰을 재부팅하면 봇 전원이 꺼져 있는지부터 봐요. 방 알림을 지우지 않고, 필요하면 방에서 봇을 한 번 불러요.
- 예정 시각 뒤에도 보낸 건수가 늘지 않으면 폰이 멎은 것이에요. 그때는 내가 직접 같은 문구를 올리는 대체 경로를 정해 둬요. 자동화에 100%를 기대하지 않아요.
- 발송이 failed로 남는 대개의 이유는 그 방에서 알림을 받은 적이 없어 답장 통로가 없는 경우예요.
🧪 실습
- 시험 방의 방 번호를 확인해 설정에 별칭으로 적었다
- 대기열에 2분 뒤 시각의 시험 문구를 등록했고 방에 올라온 뒤 상태가 sent로 바뀐 것을 확인했다
- 같은 key를 두 번 등록해도 한 번만 만들어지는지 확인했다
- 발송 실패가 났을 때의 대체 경로(내가 직접 올리기)를 한 줄로 적었다
오늘의 체크리스트
- 대기열·폴링·회신 구조를 그림으로 설명할 수 있다
- 방 번호가 방 이름보다 안정적인 이유를 안다
- 처음에는 시험 방과 낮은 횟수로만 발송한다