텔레그램으로 블로그에 글 올리기 3: Worker와 웹훅 연결
Cloudflare Worker에 텔레그램 웹훅과 비밀 변수를 설정할 때 필요한 연결 순서와 확인 사항을 정리합니다.
텔레그램 메시지를 Cloudflare Worker로 전달하려면 Worker 주소를 봇의 웹훅으로 등록해야 합니다. 단순히 URL을 연결하는 데서 끝내지 말고 웹훅 비밀키와 허용할 채팅 ID도 함께 설정합니다.
시리즈 목차
Worker에 필요한 값
이번 구성에서는 다음 환경 변수를 사용합니다.
BOT_TOKEN: 텔레그램 봇 토큰CHAT_ID: 메시지를 허용할 개인 채팅 IDTELEGRAM_WEBHOOK_SECRET: 웹훅 요청을 확인할 비밀키GITHUB_TOKEN: 게시글 저장소에 파일을 커밋할 GitHub 토큰
봇 토큰, 웹훅 비밀키, GitHub 토큰은 Cloudflare Worker의 Secret으로 설정합니다. 토큰에는 필요한 저장소와 권한만 부여합니다. GitHub에 파일을 커밋하려면 해당 저장소의 Contents 쓰기 권한이 필요합니다.
Cloudflare 대시보드의 해당 Worker에서 Settings > Variables and Secrets로 이동해 값을 설정하고 배포합니다. CHAT_ID는 변수 또는 Secret으로 둘 수 있습니다. Cloudflare의 Secret은 Worker 코드에 직접 넣지 않고 env를 통해 읽습니다. 설정 방법은 Cloudflare Workers Secrets 문서를 참고하세요.
웹훅 비밀키 만들기
텔레그램 웹훅의 secret_token은 영문, 숫자, 밑줄, 하이픈으로 구성된 1~256자 값입니다. 충분히 긴 임의의 값을 만들고, 같은 값을 Cloudflare의 TELEGRAM_WEBHOOK_SECRET과 텔레그램 웹훅 설정에 사용합니다.
다음은 PowerShell에서 비밀키를 만드는 예입니다.
$bytes = New-Object byte[] 32
$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
try { $rng.GetBytes($bytes) } finally { $rng.Dispose() }
[Convert]::ToBase64String($bytes).TrimEnd('=').Replace('+', '-').Replace('/', '_')
출력된 값은 로컬에서만 복사해 사용하고 다른 사람에게 공유하지 않습니다.
웹훅 등록하기
먼저 같은 비밀키를 Worker에 설정하고 코드를 배포한 뒤 텔레그램의 setWebhook에 Worker의 HTTPS 주소와 비밀키를 등록합니다. 텔레그램은 이후 웹훅 요청에 X-Telegram-Bot-Api-Secret-Token 헤더를 포함합니다.
등록 예시는 다음과 같습니다. 주소는 실제 Worker 주소로 바꿉니다.
$botToken = [System.Net.NetworkCredential]::new(
'', (Read-Host 'Telegram BOT_TOKEN' -AsSecureString)
).Password
$webhookSecret = [System.Net.NetworkCredential]::new(
'', (Read-Host '웹훅 비밀키' -AsSecureString)
).Password
$body = @{
url = 'https://your-worker.example.workers.dev/'
secret_token = $webhookSecret
} | ConvertTo-Json
Invoke-RestMethod -Method Post `
-Uri "https://api.telegram.org/bot$botToken/setWebhook" `
-ContentType 'application/json' -Body $body
응답에서 ok가 True인지 확인합니다. 명령과 오류 출력에 토큰이 포함될 수 있으므로 화면이나 로그를 공유하지 않습니다.
웹훅을 교체하면 기존에 등록된 주소로는 메시지가 전달되지 않습니다. 운영 중인 봇이라면 기존 설정을 확인하고 변경하세요. 같은 PowerShell 세션에서 getWebhookInfo로 등록 주소와 마지막 오류를 확인한 뒤 변수를 지웁니다.
Invoke-RestMethod -Method Post `
-Uri "https://api.telegram.org/bot$botToken/getWebhookInfo"
Remove-Variable botToken, webhookSecret, body -ErrorAction SilentlyContinue
비민감한 짧은 메모를 개인 채팅으로 보내 저장 알림을 확인할 수 있습니다. 이 Worker의 메모도 공개 저장소에 커밋되므로 공개해도 되는 내용만 사용하세요. 완성 원고는 이슈를 거치지 않고 바로 발행됩니다.