텔레그램으로 블로그에 글 올리기 1: 봇과 웹훅 준비
텔레그램 봇과 웹훅을 사용해 블로그 원고를 전달하는 구조와 준비 사항을 정리합니다.
텔레그램에서 Markdown 원고를 보내 블로그에 올리려면 메시지를 받아 처리할 봇과 프로그램이 필요합니다. DevBJ에서는 텔레그램 봇, Cloudflare Worker, GitHub 저장소를 연결해 원고를 직접 커밋하고 사이트를 배포합니다.
시리즈 목차
발행 흐름
전체 흐름은 다음과 같습니다.
- 작성자가 텔레그램 봇에 완성된 원고를 보냅니다.
- 텔레그램이 웹훅으로 메시지를 Worker에 전달합니다.
- Worker가 메시지와 원고 형식을 확인하고 GitHub에 저장합니다.
- GitHub Actions가 사이트를 빌드하고 배포합니다.
텔레그램이 직접 GitHub에 파일을 올리는 것은 아닙니다. Worker가 중간에서 요청을 확인하고 저장을 수행합니다.
봇 만들기
텔레그램의 BotFather에서 /newbot 명령으로 봇을 만들고 안내에 따라 이름과 사용자 이름을 정합니다. 생성 후 받은 봇 토큰은 Bot API에 접근하는 데 사용합니다.
토큰을 아는 사람은 봇을 조작할 수 있으므로 원고, 공개 저장소, 채팅이나 화면 공유에 넣지 않습니다. 외부에 노출됐다면 BotFather에서 토큰을 교체해야 합니다. 생성 절차는 Telegram 봇 안내를 참고하세요.
개인 채팅 ID 확인
봇과 개인 채팅을 시작하고 /start 또는 임시 메시지를 보낸 뒤 채팅 ID를 확인합니다. 새 봇에 웹훅을 아직 등록하지 않았다면 PowerShell에서 getUpdates를 사용할 수 있습니다.
$botToken = [System.Net.NetworkCredential]::new(
'', (Read-Host 'Telegram BOT_TOKEN' -AsSecureString)
).Password
$updates = Invoke-RestMethod -Method Post `
-Uri "https://api.telegram.org/bot$botToken/getUpdates"
$updates.result | ForEach-Object { $_.message.chat }
Remove-Variable botToken, updates -ErrorAction SilentlyContinue
출력된 개인 채팅의 id를 CHAT_ID로 사용합니다. API 응답이 비어 있으면 봇에 메시지를 보냈는지 확인하세요. 기존 웹훅이 활성화된 봇에서는 getUpdates를 사용할 수 없습니다. 기존 웹훅을 함부로 삭제하지 말고 기존 운영 설정에서 ID를 확인하거나 별도의 테스트 봇을 만듭니다.
요청 주소나 오류 출력에 토큰이 포함될 수 있고 응답에는 개인 정보가 있을 수 있습니다. 터미널 화면이나 출력 결과를 공유하지 않습니다.
웹훅과 채팅 ID
웹훅은 텔레그램이 새 메시지를 지정한 HTTPS 주소로 보내는 방식입니다. setWebhook을 호출할 때 비밀값을 함께 등록하면 텔레그램이 요청 헤더에 그 값을 보내므로 Worker에서 비교할 수 있습니다. 자세한 조건은 Telegram setWebhook 문서를 참고하세요.
웹훅 비밀값은 요청이 텔레그램 경로를 통해 왔는지 확인하는 데 쓰고, 채팅 ID는 어떤 채팅의 메시지를 처리할지 제한하는 데 씁니다. 두 값의 역할이 다르므로 둘 다 확인하는 편이 좋습니다.
그룹 채팅 ID를 허용하면 그룹 구성원의 메시지도 처리될 수 있습니다. 개인 발행용이라면 봇과의 개인 채팅을 사용하는 편이 안전합니다.
준비할 값
이 구성에서는 네 가지 값을 준비합니다.
BOT_TOKEN: 텔레그램 봇 토큰CHAT_ID: 원고를 보낼 개인 채팅 IDTELEGRAM_WEBHOOK_SECRET: 웹훅 요청을 확인할 비밀값GITHUB_TOKEN: 게시글 저장소에 쓸 수 있는 GitHub 토큰
봇 토큰과 GitHub 토큰, 웹훅 비밀값은 Cloudflare Worker의 Secret으로 설정하고 소스 코드에 적지 않습니다. 채팅 ID도 공개할 필요가 없다면 Secret으로 관리할 수 있습니다.
다음으로 Worker와 GitHub 연결에서 저장 경로와 코드를 준비합니다.