공유해 요약봇은 이렇게 동작해요

채널에 메시지가 올라오면 Discord Gateway가 봇에게 MESSAGE_CREATE 이벤트를 보내요. 봇은 그 메시지에서 URL을 정규식으로 추출해요.

URL이 감지되면, 봇은 해당 링크에 HTTP 요청을 보내서 HTML을 가져와요. 받아온 HTML에서 <script>, <style>, <nav> 같은 불필요한 태그를 제거하고, <main>이나 <article> 영역의 텍스트만 뽑아내요. YouTube 링크의 경우에는 HTML 대신 자막 데이터를 가져와요.

이렇게 추출한 텍스트를 Claude API(claude-haiku-4-5 모델)에 보내서 2~3문장 요약과 키워드를 생성해요. 그 결과를 Discord 스레드로 만들어서 원본 메시지에 자동으로 달아줘요. 스레드 제목은 링크의 og:title 메타 태그에서 가져와요.

전체 흐름을 정리하면: 메시지 감지 -> URL 추출 -> 웹페이지 크롤링/텍스트 추출 -> Claude API 요약 -> 스레드 생성 및 결과 게시

(주간 랭킹 스크린샷 보여주며)

그리고 일주일에 한 번, 반응 좋았던 링크 TOP 3를 자동으로 정리해줘요. 좋은 링크가 타임라인에 묻히지 않고 다시 떠올라요.

주간 랭킹은 이렇게 동작해요

/ranking_weekly 슬래시 커맨드를 실행하면, 봇이 해당 채널의 최근 7일간 메시지를 Discord API를 통해 100개씩 페이지네이션으로 전부 불러와요.

불러온 메시지 중 URL이 포함된 것들을 필터링하고, 각 메시지에 달린 리액션 수를 합산해서 상위 3개를 뽑아요. 동시에 스레드가 달린 메시지들 중 댓글 수 기준으로도 상위 3개를 뽑아요. 이 결과를 Embed 메시지로 정리해서 보여줘요.

음성 요약봇은 이렇게 동작해요

(동작 방식 다이어그램 보여주며)

텍스트 채널의 링크만 요약하는 것에서 더 나아가, 음성 채널의 대화도 요약할 수 있어요.

/요약시작 커맨드를 실행하면 봇이 음성 채널에 접속해요. 내부적으로는 Discord Voice Gateway에 WebSocket 연결을 수립하고, UDP 소켓으로 음성 데이터를 수신해요. 이때 Discord가 요구하는 DAVE(Discord Audio & Video Encryption) 프로토콜로 암호화된 통신을 해요.

음성 채널에서 누군가 말하면, Discord가 해당 유저의 음성을 Opus 코덱으로 인코딩해서 봇에게 전송해요. 봇은 이 Opus 패킷을 PCM(원본 오디오) 데이터로 디코딩하고, 여러 사람이 동시에 말하면 각각의 PCM 데이터를 샘플 단위로 합산해서 하나의 오디오 스트림으로 믹싱해요.

이 믹싱된 오디오를 60ms 간격으로 임시 파일에 계속 기록하고, 파일이 20MB에 도달하면 자동으로 새 파일로 전환해요.

/요약끝 커맨드를 실행하면 녹음을 중단하고, 저장된 PCM 파일에 WAV 헤더를 붙여서 OpenAI Whisper API에 전송해요. Whisper가 음성을 텍스트로 변환(STT)하면, 그 텍스트를 다시 Claude API에 보내서 회의 요약과 키워드를 생성하고 채널에 게시해요.

전체 흐름을 정리하면: 음성채널 접속 -> Opus 수신/PCM 디코딩 -> 다중 사용자 오디오 믹싱 -> PCM 파일 저장 -> WAV 변환 -> Whisper STT -> Claude 요약 -> 채널에 결과 게시