폰 사진, 아직도 카톡으로 옮기세요? 텔레그램에 던지면 컴퓨터 폴더에 저장되게 만드는 법 (클로드 구독 외 0원)
먼저 결론부터 말씀드리면, 텔레그램에서 내 봇을 하나 만들고, 컴퓨터에 받는 프로그램을 켜 두면 끝이에요.
폰에서 봇에게 사진·링크·메모를 보내면 컴퓨터의 텔레그램자료 \ 날짜 폴더에 알아서 저장돼요. 그다음 클로드에게 "오늘 받은 자료 정리해줘" 한 마디면 읽고 정리까지 해 줘요.
이렇게 돼요

폰에서 보낸 사진과 메모가 날짜 폴더에 이렇게 쌓여요

"오늘 받은 자료 정리해줘" 한 마디면 AI 직원이 읽고 주제별로 정리해요
준비물
| 준비물 | 설명 |
|---|---|
| 텔레그램 앱 (폰) | 무료예요. 봇 만들기도 무료예요. |
| 윈도우 컴퓨터 | 받는 프로그램이 돌아갈 컴퓨터예요. 관리자 권한은 필요 없어요. |
| 컴퓨터용 클로드 | 받는 프로그램 파일을 대신 만들어 주고, 받은 자료를 정리해 줘요. Pro 이상 요금제가 필요해요. 아직 없다면 LEVEL 4에서 설치해요. |
LEVEL 1. 텔레그램에서 BotFather 찾기
텔레그램 맨 위 검색 칸에 BotFather라고 치세요. 봇을 만들어 주는 텔레그램 공식 계정이에요.

① 이름 옆에 파란 체크가 있는 BotFather를 누르세요
LEVEL 2. 시작 → /newbot
대화방 아래 시작(START)을 누르면 할 수 있는 명령어 목록이 나와요. 맨 위의 /newbot(새 봇 만들기)을 누르세요.

② /newbot 을 누르세요 (화면은 컴퓨터로 연 텔레그램 웹이에요. 폰 앱도 명령어는 똑같아요)
LEVEL 3. 봇 이름 → 봇 아이디 → 봇 비밀번호(토큰)
BotFather가 영어로 두 가지를 물어봐요.
- 봇 이름을 물어보면 아무 이름이나 보내세요. 예: 내 자료함
- 봇 아이디를 물어보면 영어로 보내세요. 끝이 꼭 bot으로 끝나야 해요. 예: my_photo_box_bot (이미 누가 쓰고 있으면 다른 걸로 다시 보내라고 해요)

③ /newbot → ④ 봇 이름 → ⑤ 봇 아이디 → ⑥ "Done!" 아래 긴 글자가 봇 비밀번호(토큰)예요
토큰을 길게 눌러 복사해 두세요. LEVEL 6에서 한 번 붙여 넣어요.
LEVEL 4. 컴퓨터에 폴더 만들고 클로드 열기
바탕화면에 폴더를 하나 만들고 이름을 텔레그램자료받기라고 붙이세요. 폴더를 열고 위쪽 주소창에 cmd라고 치고 엔터, 검은 창이 열리면 claude라고 치고 엔터.
처음 한 번 "이 폴더 믿을래요?"(Do you trust the files in this folder?)가 나오면 아래 화살표로 Yes를 고르고 엔터.
LEVEL 5. 복사용 문장 붙여 넣기 → 클로드가 받는 프로그램을 만들어 줘요
아래 검은 상자 안의 글을 처음부터 끝까지 전부 드래그해서 복사(Ctrl+C)하고, 클로드 창에 붙여 넣고(Ctrl+V) 엔터. 맨 위 부탁 문장부터 맨 아래 코드 끝까지 한 번에 넣으면 돼요.
그리고 같은 폴더에 "텔레그램 자료 받기.cmd" 파일도 만들어 줘. 내용은 이 두 줄이야.
@echo off
powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -File "%~dp0telegram-receiver.ps1"
# 텔레그램 자료 받기 (공개용)
# 내 텔레그램 봇으로 보낸 사진·파일·메모·링크를 이 파일이 있는 폴더의 "텔레그램자료\날짜" 폴더에 저장합니다.
# 봇 비밀번호(토큰)는 처음 한 번만 붙여 넣으면 이 컴퓨터, 이 윈도우 계정에서만 풀 수 있게 암호화해서 보관합니다.
# 처음 연결할 때 화면에 나오는 "연결-코드"를 봇에게 보내면, 그 뒤로는 내 메시지만 저장합니다.
$ErrorActionPreference = 'Stop'
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$script:Base = $PSScriptRoot
$script:Store = Join-Path $Base '텔레그램자료'
$script:StateDir = Join-Path $Base '.telegram-local'
$script:StateFile = Join-Path $StateDir 'state.json'
$script:Token = ''
function Safe-Name([string]$Name) {
$clean = ($Name -replace '[<>:"/\\|?*\x00-\x1f]', '_').Trim().TrimEnd('.')
if (!$clean) { $clean = 'file' }
if ($clean.Length -gt 100) { $clean = $clean.Substring(0,100) }
return $clean
}
function Save-State {
$temp = "$StateFile.tmp"
$script:State | ConvertTo-Json | Set-Content -LiteralPath $temp -Encoding UTF8
Move-Item -LiteralPath $temp -Destination $StateFile -Force
}
function Bot-Call([string]$Method, $Body) {
$uri = 'https://api.telegram.org/bot' + $script:Token + '/' + $Method
$response = Invoke-RestMethod -Uri $uri -Method Post -ContentType 'application/json; charset=utf-8' -Body ([Text.Encoding]::UTF8.GetBytes(($Body | ConvertTo-Json -Depth 12))) -TimeoutSec 65
if (!$response.ok) { throw 'Telegram API failure' }
return $response.result
}
function Download-File([string]$Url, [string]$Target, [long]$ExpectedBytes) {
for ($attempt = 1; $attempt -le 5; $attempt++) {
try {
Invoke-WebRequest -Uri $Url -OutFile $Target -UseBasicParsing -TimeoutSec 120
if ($ExpectedBytes -gt 0 -and (Get-Item -LiteralPath $Target).Length -ne $ExpectedBytes) { throw 'size mismatch' }
return
} catch {
if ($attempt -eq 5) { throw '파일 내려받기 실패' }
Start-Sleep -Seconds 2
}
}
}
function Save-Message($Message) {
$date = [DateTimeOffset]::FromUnixTimeSeconds([long]$Message.date).LocalDateTime
$dir = Join-Path $Store $date.ToString('yyyy-MM-dd')
New-Item -ItemType Directory -Path $dir -Force | Out-Null
$prefix = $date.ToString('HHmmss') + '_' + $Message.message_id
$note = Join-Path $dir ($prefix + '_메모.txt')
$body = @('수신 시각: ' + $date.ToString('yyyy-MM-dd HH:mm:ss'), [string]$Message.text, [string]$Message.caption)
foreach ($entity in @($Message.entities) + @($Message.caption_entities)) {
if ($entity.url) { $body += [string]$entity.url }
}
$media = $null
$name = 'file'
if ($Message.photo) { $media = $Message.photo[-1]; $name = '사진.jpg' }
foreach ($kind in @('document','video','audio','voice','animation','video_note','sticker')) {
if ($Message.$kind) {
$media = $Message.$kind
$name = $media.file_name
if (!$name) { $name = $kind }
break
}
}
if ($media) {
if ($media.file_size -gt 20MB) {
$body += '파일 저장 실패: 텔레그램 봇은 20MB까지만 받을 수 있어요. 작은 파일로 다시 보내 주세요.'
Write-Host '20MB를 넘는 파일은 저장하지 못했습니다.' -ForegroundColor Yellow
} else {
$file = Bot-Call 'getFile' @{file_id=$media.file_id}
if (!$file.file_path) { throw 'File path missing' }
if ($name -notmatch '\.') { $name += [IO.Path]::GetExtension($file.file_path) }
$target = Join-Path $dir ($prefix + '_' + (Safe-Name $name))
$partial = $target + '.partial'
Download-File ('https://api.telegram.org/file/bot' + $script:Token + '/' + $file.file_path) $partial $media.file_size
Move-Item -LiteralPath $partial -Destination $target -Force
$body += '저장 파일: ' + [IO.Path]::GetFileName($target)
}
}
if (!$media -and !$Message.text -and !$Message.caption) { $body += '이 메시지 형식은 저장을 지원하지 않습니다.' }
$body | Set-Content -LiteralPath $note -Encoding UTF8
Write-Host ('저장 완료: ' + $dir + '\' + $prefix) -ForegroundColor Green
}
function Start-Receiver {
New-Item -ItemType Directory -Path $StateDir,$Store -Force | Out-Null
# 같은 프로그램이 두 번 켜져서 같은 메시지를 두 번 저장하지 않게 막습니다.
try { $script:Lock = [IO.File]::Open((Join-Path $StateDir 'receiver.lock'), 'OpenOrCreate', 'ReadWrite', 'None') }
catch { Write-Host '이미 자료 받기 프로그램이 실행 중입니다.'; return }
try {
Write-Host '=== 텔레그램 자료함 ===' -ForegroundColor Cyan
$secretFile = Join-Path $StateDir 'token.dpapi'
if (Test-Path -LiteralPath $secretFile) {
$secret = (Get-Content -LiteralPath $secretFile -Raw).Trim() | ConvertTo-SecureString
} else {
Write-Host 'BotFather가 준 토큰을 복사한 뒤 아래에 붙여넣고 Enter를 누르세요.'
Write-Host '입력한 글자는 보이지 않거나 별표로 표시됩니다.'
$secret = Read-Host '봇 비밀번호(토큰)' -AsSecureString
}
$ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($secret)
try { $script:Token = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr).Trim() }
finally { [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr) }
try { $me = Bot-Call 'getMe' @{} }
catch { Write-Host '연결 실패: 인터넷과 토큰을 확인해주세요. 토큰 자체나 오류 전문을 다른 사람에게 보내지 마세요.' -ForegroundColor Yellow; return }
$secret | ConvertFrom-SecureString | Set-Content -LiteralPath $secretFile -Encoding ASCII
Write-Host ('연결한 봇: @' + $me.username)
if (Test-Path -LiteralPath $StateFile) { $script:State = Get-Content -LiteralPath $StateFile -Raw -Encoding UTF8 | ConvertFrom-Json }
else { $script:State = [pscustomobject]@{owner=0L;offset=0L} }
$pair = '연결-' + ([Guid]::NewGuid().ToString('N').Substring(0,12))
if (!$script:State.owner) {
Write-Host '텔레그램에서 위 봇의 채팅방을 열고 아래 글자를 그대로 보내세요.'
Write-Host $pair -ForegroundColor Yellow
Write-Host '이 과정을 통해 본인의 메시지만 저장하도록 연결합니다.'
}
Write-Host ('저장 위치: ' + $Store)
Write-Host '이 창을 켜두세요. 닫으면 자료 받기가 중지됩니다. 중지: Ctrl+C'
while ($true) {
try {
$updates = @(Bot-Call 'getUpdates' @{offset=$script:State.offset;timeout=30;allowed_updates=@('message')})
foreach ($update in $updates) {
if (!$update) { continue }
$msg = $update.message
if ($msg -and $msg.chat.type -eq 'private') {
if (!$script:State.owner -and $msg.text -ceq $pair) {
$script:State.owner = [long]$msg.from.id
Write-Host '본인 확인 완료! 이제 사진이나 링크를 보내세요.' -ForegroundColor Green
} elseif ($script:State.owner -eq $msg.from.id -and $script:State.owner -ne 0) {
Save-Message $msg
}
}
$script:State.offset = [long]$update.update_id + 1
Save-State
}
} catch {
Write-Host '받기 또는 저장에 실패했습니다. 10초 뒤 다시 시도합니다. 인터넷, 저장 공간, 중복 실행을 확인해주세요.' -ForegroundColor Yellow
Start-Sleep -Seconds 10
}
}
} finally {
$script:Token = ''
if ($script:Lock) { $script:Lock.Dispose() }
}
}
try { Start-Receiver }
catch { Write-Host '실행하지 못했습니다. 이 창의 안내 문구만 알려주세요. 토큰은 보내지 마세요.' -ForegroundColor Yellow }
Read-Host '종료하려면 Enter' | Out-Null
클로드가 폴더에 telegram-receiver.ps1과 텔레그램 자료 받기.cmd 두 파일을 만들어 줘요. 만들기 전에 "해도 될까요?"라고 물으면 읽어 보고 "예"를 누르세요.
LEVEL 6. "텔레그램 자료 받기" 더블클릭 → 토큰 붙여 넣기
폴더에 생긴 텔레그램 자료 받기.cmd를 더블클릭하면 검은 창이 떠요. LEVEL 3에서 복사한 토큰을 마우스 오른쪽 클릭(또는 Ctrl+V)으로 붙여 넣고 엔터.

⑦ 여기에 토큰을 붙여 넣고 엔터. 붙여 넣어도 글자가 안 보이거나 별표(*)로 나오는 게 정상이에요
LEVEL 7. 봇에게 "연결-코드" 보내기 (본인 확인)
토큰이 맞으면 검은 창에 연결-로 시작하는 노란 글자가 나와요. 폰 텔레그램에서 LEVEL 3에서 만든 내 봇을 검색해 들어가서, 시작을 누르고 그 글자를 그대로 보내세요.

⑧ 검은 창에 나온 "연결-…" 글자를 봇에게 그대로 보내세요
검은 창에 "본인 확인 완료! 이제 사진이나 링크를 보내세요."가 뜨면 연결 끝이에요. 이제부터는 나만 이 봇으로 저장할 수 있어요.
LEVEL 8. 사진·링크 던져 보기
이제 폰에서 봇에게 사진이든 링크든 메모든 그냥 보내세요. 사진 여러 장을 한 번에 보내도 돼요.

사진은 링크와 같이 보내도 돼요

링크 앞에 "에이아이", "집"처럼 한 단어를 붙여 두면 나중에 찾기 쉬워요

⑨ 검은 창에 초록색 "저장 완료"가 뜨면 컴퓨터에 들어온 거예요
LEVEL 9. 컴퓨터 폴더 확인
LEVEL 4에서 만든 폴더 안에 텔레그램자료 폴더가 생기고, 그 안에 날짜별 폴더가 만들어져요.

⑩ 보낸 날짜 폴더를 여세요

⑪ 사진은 "시각_번호_사진.jpg", 글과 링크는 "시각_번호_메모.txt"로 저장돼요

⑫ 메모 파일에는 받은 시각과 보낸 글·링크가 그대로 들어 있어요
LEVEL 10. 클로드에게 "정리해줘"
날짜 폴더를 열고 주소창에 cmd → claude. 그리고 한 마디만 하세요.

⑬ 클로드가 링크를 직접 열어 보고 주제별로 정리해 줬어요 (실제로 1분 28초 걸렸어요)
"블로그 글로 써 줘", "카드뉴스로 만들어 줘"처럼 다음 일을 이어서 시킬 수도 있어요. 블로그 글 자동 업로드와 인스타 자동 업로드는 앞 글에 정리해 뒀어요.
(선택) 컴퓨터를 켜면 자동으로 켜지게
키보드 윈도우 키 + R → shell:startup 입력 → 엔터. 열린 폴더에 텔레그램 자료 받기.cmd의 바로 가기를 넣어 두면, 컴퓨터를 켤 때마다 받는 프로그램도 같이 켜져요. (바로 가기: 파일을 마우스 오른쪽 버튼으로 끌어다 놓고 "여기에 바로 가기 만들기")
막혔을 때 해결표
| 이럴 때 | 이렇게 하세요 |
|---|---|
| "연결 실패: 인터넷과 토큰을 확인해주세요" | 토큰을 다시 복사해서 붙여 넣으세요. 앞뒤에 빈칸이 들어가면 안 돼요. 토큰을 잃어버렸으면 BotFather에 /token을 보내면 다시 알려 줘요. |
| "이미 자료 받기 프로그램이 실행 중입니다" | 이미 다른 창에서 켜져 있어요. 작업 표시줄의 검은 창을 확인하세요. 두 개를 켜면 같은 사진이 두 번 저장될 수 있어서 막아 둔 거예요. |
| 봇이 아무 대답을 안 해요 | 정상이에요. 이 봇은 대답하지 않고 저장만 해요. 검은 창의 "저장 완료"와 폴더를 확인하세요. |
| 본인 확인 전에 보낸 사진이 없어요 | 본인 확인(LEVEL 7) 전에 온 메시지는 저장하지 않아요. 확인 끝난 뒤 다시 보내세요. |
| 사진 화질이 떨어져요 | 텔레그램은 "사진"으로 보내면 크기를 줄여서 보내요. 원본이 필요하면 클립 버튼 → 파일로 보내세요. |
| 영상이 저장이 안 돼요 | 텔레그램 봇은 20MB까지만 받을 수 있어요. 메모 파일에 "파일 저장 실패"가 적혀 있으면 더 작게 보내세요. |
| 검은 창이 바로 꺼져요 | telegram-receiver.ps1을 직접 누르지 말고 텔레그램 자료 받기.cmd를 더블클릭하세요. |
| 한글이 깨져서 나와요 | 클로드에게 "telegram-receiver.ps1을 UTF-8(BOM)으로 다시 저장해 줘"라고 하세요. |
솔직히 아쉬운 점
- 컴퓨터가 켜져 있고, 검은 창이 떠 있어야 받아요. 꺼져 있을 때 보낸 건 텔레그램이 잠깐 맡아 뒀다가 켜면 들어와요. 텔레그램 공식 문서 기준으로 최대 24시간까지만 맡아 줘요.
- 파일 하나에 20MB까지예요. 긴 영상은 안 돼요.
- "사진"으로 보내면 화질이 줄어요. 원본은 "파일"로 보내야 해요.
- 받는 프로그램 자체는 0원이지만, 정리를 시키는 컴퓨터용 클로드는 유료 요금제가 필요해요.
화면은 2026년 9월 29일 제 텔레그램과 컴퓨터에서 직접 캡처했어요. 봇 이름·아이디·토큰과 컴퓨터 경로는 가렸어요. 텔레그램 봇 한도(20MB, 24시간 보관)는 텔레그램 봇 공식 문서 기준이에요. 이 글은 AI 도우미로 초안을 만들고, 캡처와 내용은 제가 직접 확인했습니다.