path
Jin's Lab
코드로 실험하고 기록하는 개발 일지 · J.Lab

Jin's Lab

코드로 실험하고 기록하는 개발 일지. 커리어와 삶의 방향을 탐색하며 기록하는 공간입니다

API Automation

Blogger 퍼머링크 자동화, API 제약을 깨고 영문 슬러그 만드는 법

J.Lab ·
목차

    최근 블로그 포스팅 과정을 자동화하면서 재미있는 도전을 시작했다. 하지만 구글 Blogger를 자동화 시스템에 연동하는 과정에서 꽤나 골치 아픈 장벽에 가로막히고 말았다. Blogger API의 제약 조건 때문에 정성껏 작성한 포스트들의 URL 주소가 엉망이 되는 현상이 발생했기 때문이다.

    Blogger API가 가로막은 퍼머링크의 벽

    Blogger API의 posts.insert 메소드를 사용해보면 알겠지만, 생성되는 포스팅 리소스의 url 필드는 철저하게 읽기 전용으로 설정되어 있다. 게다가 검색설명 필드는 API가 제공하는 리소스 구조에 아예 존재하지도 않는다. 우리가 API를 통해 제어할 수 있는 메타데이터 영역은 오직 발행일뿐이다.

    이런 상황에서 한글 제목을 가진 글을 API로 그냥 발행하면 블로그 주소 뒤에 'blog-post.html' 같은 무작위의 지저분한 URL이 자동으로 생성된다. 게다가 이 퍼머링크는 한 번 첫 발행이 완료되고 나면 API를 통해서는 절대 바꿀 수 없도록 영구적으로 고정되어 버린다.

    슬러그 생성 시점을 노린 2단계 역발상 트릭

    개발자가 여러 모니터 앞에서 API와 데이터 흐름을 조정하며 작업을 자동화하는 아이소메트릭 일러스트레이션

    이 제약을 해결하기 위해 Blogger 시스템이 주소를 생성하는 내부 메커니즘을 유심히 관찰했다. 재미있게도 Blogger는 오직 '첫 발행 시점의 제목'만을 기준으로 영문 슬러그를 자동 생성하며, 이후에 제목을 변경하더라도 이미 생성된 URL은 변하지 않고 유지되는 성질이 있었다.

    이 특성을 역이용해 기발한 우회로를 설계했다. 첫 단계로 API를 통해 최초 글을 등록할 때, 제목 필드에 우리가 원하는 깔끔한 영문 문구를 임시로 넣어 발행했다. 이렇게 하면 Blogger 시스템이 해당 영문 제목을 바탕으로 예쁜 영문 슬러그를 먼저 생성해 준다.

    그다음 두 번째 단계로 posts.patch 메소드를 곧바로 호출하여 제목 부분만 실제 사용해야 하는 한글 제목으로 교체했다. 결과적으로 주소창에는 깔끔한 영문 퍼머링크가 성공적으로 안착하고, 블로그 본문과 목록에는 멋진 한글 제목이 완벽하게 노출되는 효과를 얻었다.

    Code_JinsLab.gs 실전 적용과 관찰 과제

    톱니바퀴 시스템과 웹 주소창이 연결되어 URL 자동화를 직관적으로 표현한 테크 스타일의 아이소메트릭 일러스트레이션

    이 우회 프로세스를 내 자동화 스크립트인 Code_JinsLab.gs 파일에 곧바로 구현하여 선적용했다. 만약 수집 대상 글에 별도의 영어 퍼머링크용 문구가 할당되어 있지 않다면, 에러를 내는 대신 기존의 디폴트 방식으로 자동 처리되도록 안전한 폴백 로직을 함께 설계해 두었다.

    최근에는 이미지를 보완하여 다시 발행하는 재발행 경로 역시 이 영문 슬러그 획득 프로세스를 똑같이 타도록 완벽히 구조를 연결했다. 덕분에 글의 등록 경로에 상관없이 일관되게 깔끔한 영문 URL 주소를 확보할 수 있게 되었다.

    다만 이 방식을 운영하며 한 가지 주의 깊게 관찰해야 할 현상이 있다. Blogger의 자동 슬러그 생성 알고리즘은 영문 글자 수 기준으로 대략 40자 부근에서 뒷부분이 잘리는 경향이 있다. 따라서 임시로 던져주는 영문 문구가 불필요하게 너무 길어지지 않도록 간결하게 유지하는 조율이 필요하다.

    검색설명 제약과 구글 스니펫의 무한 신뢰

    돋보기가 유기적 검색 결과 스니펫을 가리키고 있는 모습을 표현한 깔끔한 테크 스타일의 아이소메트릭 일러스트레이션

    마지막까지 API로 해결할 수 없었던 검색설명 필드는 과감하게 생각을 전환해 해결했다. API 리소스에 필드 자체가 존재하지 않기 때문에 수동 개입 없이는 입력이 불가능한 영역이었다.

    결국 이 부분은 구글의 검색엔진 자동 스니펫 기술에 온전히 위임하기로 결정했다. 어차피 검색엔진 최적화 관점에서 메타 디스크립션은 직접적인 랭킹 요소가 아니다. 구글 검색 봇은 본문에서 검색어와 가장 일치하는 매끄러운 단락을 스스로 추출해 스니펫으로 보여주므로 본문 퀄리티를 높이는 데 집중하는 것이 훨씬 효율적이다.

    결론: API의 경계를 파악하고 우회하는 즐거움

    이번 삽질을 통해 공식 API가 완벽하게 지원하지 않는 기능이라도 동작 원리와 생성 타이밍을 거꾸로 뒤집어 생각하면 얼마든지 돌파구를 마련할 수 있다는 것을 배웠다. 무작정 막힌 벽 앞에서 좌절하지 않고 시스템의 메커니즘을 집요하게 파고든 덕분이다.

    Blogger 퍼머링크 자동화의 한계를 극복하고 깔끔한 주소를 확보한 덕분에 블로그 운영 효율이 배로 늘었다. 나와 비슷한 문제로 골머리를 앓던 다른 개발자들에게도 이 역발상 트릭이 훌륭한 해결책이 되기를 희망한다.

    API Automation Blogger API Blogger SEO Google Apps Script Search Engine Optimization URL Slug
    ← 이전 글
    최근 게시물
    다음 글 →
    이전 게시물
    ≡ 글 목록으로
    소개
    path
    J.Lab

    커리어와 삶의 방향을 탐색하며
    기록하는 공간입니다

    카테고리
    403 Forbidden Error 1 AdSense 1 AdSense Bot Detection 1 AI Automation 1 AI Image Generation 1 ai-automation 2 AI-Prompting 1 AIBlogAutomation 1 AICodeLog 1 AIContentGeneration 1 AIImageGeneration 1 AIWritingErrors 1 API Automation 2 API Retry Design 1 api-automation 1 API-Deprecation 1 api-error 1 api-fallback 1 api-retry-strategy 1 api-troubleshooting 1 APIDebugging 1 APIError 1 APIErrorHandling 1 APIIntegration 1 APITokenRenewal 1 AppsScript 1 appsScriptAutomation 1 AutomatedBlogging 1 automation 1 Automation 2 AutomationTroubleshooting 1 Backoff Algorithm 1 Base64Encoding 1 BatchProcessing 1 blog-automation 1 blog-customization 1 blog-migration 3 Blog-Sorting 1 blog-strategy 1 blog-theme-customization 1 blog-workflow 1 blogautomation 1 BlogAutomation 2 Blogger 4 Blogger API 2 Blogger Automation 1 Blogger SEO 1 blogger-api 3 blogger-automation 1 blogger-error-400 1 blogger-labels 1 blogger-seo 1 blogger-tips 1 Blogger-Tips 1 BloggerAPI 3 BloggerBypath 1 BloggerCustomization 2 BloggerFavicon 1 BloggerTemplate 1 BloggerTemplateEditing 1 BloggerTheme 1 BloggerThemeCustomization 1 BloggerXMLStructure 1 Blogging-Automation 1 BloggingTools 1 BlogQuality 1 BlogSpot 1 BWidgetBIncludable 1 CardClickHandler 1 CDATA 1 clamping-text 1 Code Integration 1 codelog 1 CodeLog 1 codeRefactoring 1 contentsequencing 1 cost-reduction 1 CSSOverlay 1 data-parsing 1 DatabaseDesign 1 DataRecovery 1 DateInjection 1 Debugging 2 dev-journey 1 DeveloperJourney 2 DevJourney 1 display-none-seo 1 dom-manipulation 1 dynamic-menu 1 Error-Handling 1 ErrorHandling 1 Execution Timeout 1 ExecutionLimit 1 exponential-backoff 1 FactChecking 1 FaviconEmbedding 1 Feed-API 1 filesystem 1 Flat Illustration 1 FluxModel 1 FreeAIImage 1 FrontEndDev 1 FrontendTips 1 GAS Blogger API 1 gas-automation 1 gas-optimization 1 gas-trigger 1 GASTimeout 1 gasTriggerManagement 1 GCP Project Linkage 1 Gemini 1 Gemini API 1 gemini-api 1 GeminiAPI 1 GeminiPrompt 1 GeminiPromptEngineering 1 GmailRestrictions 1 Google Apps Script 7 Google Discover 1 google-apps-script 3 Google-Apps-Script 1 google-blogger 1 googleAppsScript 1 GoogleAppsScript 6 googlesapps-script 1 hero-image 1 HTMLWidgetBlogger 1 http-429 1 HuggingFace 1 HuggingFaceAPI 1 ico-generator 1 Image Optimization 1 image-automation 1 image-optimization 1 In-App Browser 1 invalid-argument 1 javascript 3 JavaScript 2 javascript-automation 1 javascript-toc 1 jlab-codelog 1 JLabDevLog 1 json-schema 1 label-length-limit 1 linux 1 meta-description 1 Negative Prompt 1 notion-api 1 notion-database 1 notion-gas-integration 1 NotionAPI 1 NotionAutomation 1 notionintegration 1 NotionIntegration 1 OAuth Scope 1 pagination 1 payload-validation 1 permalink-management 1 PersonaDesign 1 pil-image-processing 1 Pinterest 1 Pollinations 1 Pollinations Flux 1 pollinations-api 1 PollinationsAI 1 PositionAbsolute 1 Prompt Design 1 Prompt Engineering 1 prompt-engineering 1 Prompt-Engineering 1 PromptEngineering 1 publishorder 1 python-favicon 1 queue-stuck 1 RandomDelay 1 rate-limiting 1 Refactoring 1 rfc3339 2 Robots Meta Tag 1 RSS Feed 1 scriptNotFound 1 Search Engine Optimization 2 Search-Engine-Optimization 1 SEO Tips 1 seo-optimization 4 SEO-Optimization 1 seriesmanagement 1 SidebarLinks 1 SNSMarketing 1 SVGIcon 1 table-of-contents 1 TechJournal 1 Template 1 ThreadsAPI 1 tistory-migration 1 transparent-favicon 1 triggerCleanup 1 Troubleshooting 1 unzip 1 URL Slug 1 vanilla-js 1 Web Development 1 Web Publishing 2 Web Security 1 web-development 1 Web-Development 1 web-development-tips 1 web-performance 1 web-scraping 1 WebAccessibility 1 WebDevelopment 3 WebDevelopmentTips 1 WebDevJourney 1 windows 1 WorkflowAutomation 1 XMLParser 1 XMLSpecialCharacters 1 XMLTheme 1 zip 1
    인기 글
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    GAS에서 Blogger API 403 오류 완전 정복 — appsscript.json 스코프와 GCP 프로젝트 연결
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Google Apps Script 실행 시간 6분 제한 — Gmail 계정 함정과 랜덤 딜레이 설계
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    Blogger 테마 XML 직접 뜯어봤더니 알게 된 것들
    다른 블로그
    IssueLog
    IssueLog
    issuelog.jinbytes.com
    KidStory
    KidStory
    kidstory.jinbytes.com
    IT Story
    IT Story
    jinbytes.com
    © Jin's Lab · J.Lab · All Rights Reserved
    jinbytes.com · Powered by Blogger