안녕하세요. まさきん입니다.
스마트폰으로 오는 알림에 ‘Claude에게 넘기기’ 버튼을 달아 두었습니다. 누르면 그 내용으로 Claude 채팅이 열리는 구조예요. 그런데 일본어로 된 긴 글은 URL 안에 다 들어가지 않았습니다. 오늘은 그 우회책으로 전문을 Notion에 옮긴 이야기를 적어 두려고 합니다.
※글 게시 시점의 정보입니다. 최신 조건은 공식 사이트에서 확인해 주세요.
- 일본어는 URL 인코딩을 거치면 한 글자당 약 9자로 불어납니다.
- 제 환경에서는 2,000 안팎을 기준으로 삼고, 긴 안내문은 짧게 줄여서 통과시켰습니다.
- 긴 글은 Notion에 전문을 두고, 버튼에는 페이지 ID와 앞부분만 싣고 있습니다.
- claude.ai/new?q= 웹 버전은 공식 문서에서 확인하지 못했습니다.
- 데스크톱 버전은 claude://claude.ai/new?q= 가 공식 도움말에 나와 있습니다.
알림을 읽기만 하고 끝나 버렸다
우리 집에서는 집안의 정기 리포트나 장애 알림을 Telegram으로 받고 있습니다. 자동화 결과가 스마트폰으로 줄줄이 도착하는 형태죠. 예전에 매일 밤 카드 사용 내역을 AI에게 점검시키는 구조도 쓴 적이 있습니다.
다만 알림은 읽고 나면 그걸로 끝나기 쉬웠습니다. ‘이거 어떡하지’ 싶어도 Claude를 열어서 붙여 넣는 게 살짝 귀찮거든요. 그래서 알림 자체에 상담 창구를 달기로 했습니다.
버튼의 구조
알림에는 ‘🤖 Claude에게 넘기기’라는 버튼이 붙어 있습니다. 내용물은 claude.ai/new?q=<요청문> 이라는 URL입니다. 누르면 요청문이 입력된 상태로 Claude 채팅이 열립니다.
버튼에는 Telegram의 InlineKeyboardButton을 쓰고 있습니다. 공식 Bot API에 따르면 url 칸에는 ‘HTTP 또는 tg:// URL’을 지정할 수 있습니다. 한편 눌렀을 때 봇으로 보내는 callback_data는 1~64바이트 제한이 있습니다. 이번에는 URL을 여는 것뿐이라 url 칸만으로 충분합니다.
| 항목 | 공식 사양 | 제 사용 방식 |
|---|---|---|
| text | 버튼에 표시되는 문자 | 🤖 Claude에게 넘기기 |
| url | HTTP 또는 tg:// URL | claude.ai/new?q=… |
| callback_data | 1~64바이트 | 사용하지 않음 |
| 알림 본문 | 1~4096자 | 리포트나 장애 내용 |
일본어는 한 글자가 9자로 불어난다
여기서 첫 번째 벽에 부딪혔습니다. 일본어를 URL에 넣으면 글자 수가 확 늘어납니다.
URL에 쓸 수 있는 문자는 정해져 있습니다. 그 밖의 문자는 퍼센트 인코딩이라는 형태로 바꿉니다. RFC 3986에서는 1바이트를 ‘%’와 16진수 두 자리, 총 3자로 나타내도록 정하고 있습니다.
일본어 문자는 UTF-8에서 보통 3바이트입니다. RFC 3629의 표에서도 이 범위는 3바이트 배열로 되어 있습니다. 3바이트가 각각 3자가 되니 한 글자에 약 9자입니다. 한국어도 마찬가지인데, 예를 들어 ‘가’는 %EA%B0%80 이 됩니다.
| 문자 종류 | UTF-8 바이트 수 | 인코딩 후 글자 수 |
|---|---|---|
| 반각 영숫자 | 1바이트 | 1자(그대로) |
| 히라가나·한자 대부분 | 3바이트 | 약 9자 |
| 일부 기호 | 1~3바이트 | 3~9자 |
구조를 알고 나니 과연 그렇구나 싶었습니다. 일본어 200자면 URL은 2,000자 가까이 된다는 계산입니다.
처음 안내문만으로 2,000을 넘었다
처음에는 요청문 앞에 조금 긴 안내문을 붙였습니다. ‘이건 집의 자동 알림입니다’ 같은 머리말이죠. 그런데 그 안내문만으로 인코딩 후 2,000을 넘어 버렸습니다.
그래서 안내문을 확 줄여서 통과시켰습니다. 그렇다 해도 본문이 길면 또 같은 문제에 부딪힙니다. 여기서 다른 보관 장소가 필요하다고 느꼈습니다.
URL 길이에 일률적인 상한은 없다
그럼 URL에는 몇 자까지 들어갈까요. 찾아보니 일률적인 상한은 없는 것 같습니다.
HTTP 사양인 RFC 9110에서는 최소 8,000옥텟의 URI를 지원하도록 권장합니다. 다만 이건 하한에 대한 권장입니다. 상한을 정한 것은 아닙니다. 너무 길면 서버가 ‘414 URI Too Long’을 돌려주기도 합니다.
브라우저나 앱, 중간에 거치는 서비스마다 처리할 수 있는 길이가 다릅니다. 그래서 제 환경에서는 2,000 안팎을 기준으로 삼았습니다. 이 숫자가 어디서나 통한다는 보장은 아닙니다.
+와 %가 깨졌다
또 하나, 은근히 애먹은 게 기호입니다. ?q= 에 넘기는 문장에서 ‘+’와 ‘%’가 깨졌습니다. 제대로 인코딩해도 표시되는 문장이 망가진 거예요.
URL 세계에는 ‘+’를 공백으로 읽는 관습이 있습니다. WHATWG의 URL 표준에도 폼 형식을 해석할 때 ‘+’를 공백으로 바꾸는 절차가 있습니다. 어디서 깨지는지는 여기서 단정하지 않겠습니다.
대책은 단순하게 했습니다. 보내기 전에 ‘+’와 ‘%’를 전각 ‘+’ ‘%’로 바꿉니다. 사람이 읽는 요청문이라 전각이어도 곤란한 경우는 적을 거라 생각합니다.
긴 글은 Notion으로 옮겼다
본론인 우회책입니다. 긴 글은 URL에 넣지 않기로 했습니다.
대신 Notion의 ‘Claude 인계’라는 데이터베이스에 전문을 씁니다. 버튼 URL에는 그 페이지 ID와 앞부분만 싣습니다. Claude 쪽은 그 ID로 Notion 페이지를 읽으러 갑니다.
| 비교 항목 | 짧은 글 | 긴 글 |
|---|---|---|
| URL에 싣는 것 | 요청문 그 자체 | 페이지 ID와 앞부분 |
| 전문 보관 위치 | URL 안 | Notion 페이지 |
| Claude의 동작 | 그대로 읽음 | Notion을 읽으러 감 |
| 동작 확인 | 보내서 확인함 | 보내서 확인함 |
짧은 글도 긴 글도 실제로 보내서 동작하는 것을 확인했습니다.
Notion API로 할 수 있는 것
Notion 공식 API에서는 데이터베이스 아래에 페이지를 만들 수 있습니다. 기존 페이지나 데이터 소스를 부모로 지정하는 방식입니다.
읽는 쪽에서는 페이지 ID를 지정해 페이지 정보를 가져올 수 있습니다. 다만 페이지 본문은 창구가 따로 있습니다. ‘블록의 자식 요소 가져오기’ API로 읽는다고 공식 문서에 적혀 있습니다.
제한도 하나 신경 써야 합니다. 공식 요청 제한에 따르면 리치 텍스트 하나의 내용은 2,000자까지입니다. 긴 글을 블록 하나에 몰아넣기보다 나눠서 쓰는 편이 무난할지도 모릅니다.
Claude 쪽에서 읽으려면 Notion 커넥터를 연결해 두어야 합니다. 커넥터는 Claude가 외부 서비스의 데이터에 접근하는 구조입니다. 권한은 연결한 사람의 것을 그대로 이어받는다고 공식 도움말에 적혀 있습니다.
처리 흐름
제 구조를 흐름으로 나열하면 이렇습니다.
- 알림 스크립트가 알림 본문과 요청문을 준비한다.
- 요청문의 ‘+’와 ‘%’를 전각으로 바꾼다.
- 인코딩 후 길이가 기준 이내인지 확인한다.
- 짧으면 그대로 ?q= 에 넣어 버튼을 만든다.
- 길면 Notion 인계 DB에 전문을 쓴다.
- 페이지 ID와 앞부분만 ?q= 에 넣어 버튼을 만든다.
- Telegram으로 알림과 버튼을 보낸다.
의사 코드로 쓰면 대략 이런 형태입니다.
문장 = 요청문의 ‘+’ ‘%’를 전각으로 치환
if 인코딩 후 길이 <= 기준:
q = 문장
else:
ID = Notion 인계 DB에 전문을 저장
q = "Notion 페이지 " + ID + " 를 읽어 줘. 앞부분: " + 문장의 앞부분
버튼URL = "https://claude.ai/new?q=" + 인코딩(q)
버튼 만들기는 별도 스크립트로 분리했다
처음에는 알림 전송 스크립트 안에서 URL을 조립했습니다. 그런데 치환이나 길이 판정이 늘어나면서 코드가 한눈에 안 들어오게 됐어요.
그래서 버튼 URL을 만드는 처리를 작은 별도 스크립트로 떼어 냈습니다. 알림을 보내는 쪽은 완성된 URL을 받기만 합니다. 알림 종류가 늘어도 같은 부품을 돌려 쓸 수 있습니다.
자동화 뒷이야기는 Cloudflare Workers 무료 플랜의 Cron 상한 글에도 썼습니다. 작게 나눠 두면 나중에 고칠 때 편하죠.
Mac 데스크톱 앱에서의 차이
Mac용 Claude 데스크톱 앱에서도 시험해 봤습니다. claude://new?q= 로는 앱이 실행되기만 했습니다. 문장은 전달되지 않았어요.
반면 claude://claude.ai/new?q= 로는 문장이 전달됐습니다. 공식 도움말에도 이 형태의 서식이 나와 있습니다. 도움말에는 q의 문장이 약 14,000자에서 잘린다고도 적혀 있습니다. 모든 값은 URL 인코딩이 필요하다는 내용도 있습니다.
참고로 Telegram 버튼의 url 칸은 공식적으로 HTTP 또는 tg:// URL입니다. claude:// 를 버튼에 직접 넣는 사용법과는 별개의 이야기로 봐 주세요.
웹 버전의 claude.ai/new?q= 는 공식 문서에서 확인하지 못했습니다. 지금은 동작하지만 앞으로 바뀔 수도 있습니다. 데스크톱 버전의 claude:// 는 공식 도움말에 서식이 나와 있습니다.
스마트폰 한 대로 집안일을 돌린다면 통신비도 한번 점검해 두고 싶은 부분입니다. 알림이나 AI와의 대화가 늘수록 스마트폰은 생활의 창구가 되니까요.
흔한 실수·함정
이 구조는 ‘알림을 읽기만 하고 흘려보내는 사람’에게 맞는다고 생각합니다. ‘자동화 결과를 AI와 상의하고 싶은 사람’에게도 어울릴지 모릅니다. 한편 걸려 넘어지기 쉬운 부분도 몇 가지 있었습니다.
- 안내문을 너무 길게 써서 본문이 들어가지 않게 된다
- 글자 수로만 세다가 인코딩 후 길이를 놓친다
- ‘+’나 ‘%’가 깨져서 요청의 의미가 바뀐다
- 버튼 URL에 토큰이나 개인 ID를 섞어 버린다
- 인계 페이지가 계속 쌓여서 정리가 따라가지 못한다
특히 토큰 건은 조심하고 싶은 부분입니다. URL은 방문 기록이나 공유를 통해 남의 눈에 띄기 쉽습니다. 인계용 페이지 ID만 싣는 편이 안심되지 않을까요.
인계 페이지 정리는 저도 아직 진행 중입니다. 7일이 지나면 자동으로 보관 처리하는 기능은 아직 구현하지 않았습니다. 규칙을 정해도 지켜지지 않는 이야기는 164건의 작업을 세어 본 글에서도 썼습니다. 구조로 정리하는 것까지가 숙제일까요.
시작하기 전에 확인할 것
- 알림에 쓰는 서비스에서 URL 버튼을 쓸 수 있는가
- 요청문의 인코딩 후 길이를 세는 구조가 있는가
- 플러스와 퍼센트 기호의 처리 방식을 정했는가
- 긴 글을 옮길 곳(Notion 등)을 준비했는가
- Claude에 Notion 커넥터를 연결했는가
- URL에 토큰이나 개인 ID를 넣지 않았는가
- 인계 페이지를 정리하는 규칙이 있는가
자주 묻는 질문
Q. 왜 일본어는 URL이 길어지나요?
일본어 문자 대부분은 UTF-8에서 3바이트가 됩니다. URL에서는 1바이트를 ‘%XX’ 3자로 나타냅니다. 그래서 한 글자당 약 9자로 불어납니다.
Q. URL에는 몇 자까지 넣을 수 있나요?
일률적인 상한은 없는 것 같습니다. HTTP 사양에서는 8,000옥텟 이상을 지원하도록 권장합니다. 다만 실제 상한은 브라우저나 서비스마다 다릅니다. 제 환경에서는 2,000 안팎을 기준으로 삼았습니다.
Q. claude.ai/new?q= 는 공식 기능인가요?
웹 버전은 공식 문서에서 확인하지 못했습니다. 지금은 동작하지만 앞으로 바뀔 수도 있습니다. 데스크톱 버전의 claude://claude.ai/new?q= 는 공식 도움말에 나와 있습니다.
Q. ‘+’나 ‘%’는 왜 깨지나요?
URL에서는 ‘+’를 공백으로 읽는 관습이 있습니다. 다만 제 환경에서 어디서 깨졌는지는 단정하지 않았습니다. 대책으로 보내기 전에 전각으로 바꾸고 있습니다.
Q. Telegram 버튼에 긴 데이터를 담을 수는 없나요?
callback_data는 1~64바이트 제한이 있습니다. 긴 문장을 담는 용도에는 맞지 않습니다. 그래서 전문은 Notion에 두는 방식으로 했습니다.
Q. Notion에 둔 전문을 Claude는 어떻게 읽나요?
Claude에 Notion 커넥터를 연결해 둡니다. URL에 실은 페이지 ID를 단서로 Claude가 페이지를 읽으러 갑니다. 짧은 글과 긴 글 모두 실제로 동작하는 것을 확인했습니다.
Q. 인계 페이지가 쌓이지 않나요?
쌓입니다. 7일이 지나면 자동으로 보관 처리하는 기능은 아직 만들지 못했습니다. 현재 남은 과제 중 하나입니다.
참고한 공식 정보
- Telegram Bot API(InlineKeyboardButton·sendMessage)
- RFC 3986(URI 구문·퍼센트 인코딩)
- RFC 3629(UTF-8)
- RFC 9110(HTTP 사양·URI 길이·414)
- WHATWG URL Standard(폼 형식 해석)
- Open Claude Desktop with a link(Claude Help Center)
- Open the Claude mobile app with a link(Claude Help Center)
- Use connectors to extend Claude’s capabilities(Claude Help Center)
- Notion connector(Claude)
- Create a page(Notion API)
- Retrieve a page(Notion API)
- Retrieve block children(Notion API)
- Request limits(Notion API)
정리
알림에 ‘Claude에게 넘기기’ 버튼을 달면 상담까지의 거리가 확 줄어듭니다. 다만 일본어는 URL 안에서 약 9배로 불어납니다. 짧은 글은 그대로, 긴 글은 Notion으로 옮기는 방식에 정착했습니다.
남은 숙제는 인계 페이지 정리입니다. 알림을 읽고 흘려보내기 쉽다면 버튼 하나를 더해 보는 건 어떨까요.
누르면 라쿠텐 로그인 페이지가 열립니다. 로그인하면 캠페인 내용이 표시됩니다.
이 글에는 제휴 광고가 포함되어 있습니다. 이 사이트의 링크를 통해 상품·서비스에 신청하시면 제휴사로부터 보상을 받을 수 있습니다. 또한 운영자는 라쿠텐 그룹 소속 직원으로, 사원 추천 프로그램을 통해 보상을 받는 경우가 있습니다. 기사 내용과 평가는 광고 유무와 관계없이 운영자의 실제 경험과 조사를 바탕으로 작성했지만, 위 관계를 이해하신 후 읽어 주시기 바랍니다. 자세한 내용은 면책조항·제휴 링크 안내를 참고해 주세요. 면책조항·제휴 링크 안내
이 글에는 기계 번역이 포함되어 있습니다. 정확한 조건은 라쿠텐 모바일 공식 사이트의 다국어 페이지에서 확인해 주세요.
라쿠텐 모바일의 통신 지역·전파 상황이 궁금하신 분은, 공식 전파 개선·조사 요청 양식 을 통해 문의하실 수 있습니다.