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

Jin's Lab

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

APITokenRenewal

Threads API 자동 발행과 토큰 만료 걱정 없는 무중단 갱신 설계법

J.Lab ·
목차

    최근 외부 유입 채널을 다각화하기 위해 총 6개의 SNS 채널을 운영하고 있다. 그중 스레드는 원래 내 우선순위에서 3순위 정도에 머물러 있었다. 하지만 텍스트 기반 플랫폼 특성상 개발 관련 콘텐츠를 공유하기에 아주 적합하다는 판단이 들었고, 제대로 외부유입을 만들어보기 위해 자동화 작업을 시작했다.

    처음에는 관리 효율을 위해 기존 서드파티 툴이나 반자동 방식을 고민하기도 했다. 하지만 플랫폼에 종속되기 싫었고 불필요한 비용을 줄이고 싶어 결국 서드파티 방식을 모두 기각하고 메타의 공식 Threads API를 직접 연동하는 완전 자동화 방식을 선택했다.

    메타 Threads 공식 API 연동과 데이터 전송 과정을 시각화한 깔끔한 네이비 블루 및 실버 톤의 아이소메트릭 일러스트

    서드파티 대신 공식 Threads API 자동 발행을 선택한 이유

    스레드는 다른 플랫폼처럼 단순히 RSS만 연결해 두면 끝나는 편리한 자동화 방식을 지원하지 않는다. 결국 메타의 공식 API를 직접 호출하는 방식이 필수적이었다. 이를 위해 Google Apps Script 환경에서 작동하는 Threads_자동발행.gs 파일을 새로 작성했다.

    공식 API를 연동할 때 주의해야 할 점은 스레드의 독특한 발행 메커니즘이다. 스레드에 글을 올리려면 먼저 콘텐츠를 담을 컨테이너를 생성한 뒤, 약 30초의 대기 시간을 거쳐 실제 발행을 요청하는 2단계 발행 구조를 거쳐야 한다. API 호출 한 번으로 끝나지 않는 이 구조를 코드로 구현하느라 초반에 꽤나 애를 먹었다.

    다행히 Apps Script의 대기 함수를 활용해 컨테이너 생성 후 안전하게 대기했다가 미디어를 발행하는 로직을 완성했다. 이로써 외부 서비스의 도움 없이 내 환경에서 직접 스레드로 콘텐츠를 보낼 수 있는 SNS API 연동의 뼈대를 갖추게 되었다.

    API 보안 토큰의 60일 만료 기간과 자동 갱신 주기를 시각화한 스케줄러 일러스트

    60일의 덫, 장기 토큰 만료를 극복하는 자동 갱신 설계

    API 연동을 하면서 가장 골치 아픈 부분은 단연 인증 토큰 만료 문제였다. 스레드 API는 보안상 60일의 유효 기간을 가진 장기 토큰을 사용한다. 만약 이 토큰을 제때 갱신해주지 않으면 60일 뒤에 잘 작동하던 자동 발행 파이프라인이 아무런 경고도 없이 조용히 끊겨버리는 대참사가 발생한다.

    매번 캘린더에 적어두고 수동으로 토큰을 갱신하는 방식은 언젠가 반드시 까먹을 실패 패턴이었다. 그래서 장기 토큰 교환 및 갱신 함수를 완전히 독립된 모듈로 분리하여 설계했다. 그리고 Apps Script 시간 트리거 기능을 활용해 45일 주기로 토큰을 알아서 갱신하도록 자동 갱신 로직을 구현했다.

    이렇게 설계해 두면 유효 기간이 보름이나 남은 시점에 매번 새로운 60일짜리 토큰으로 교체되므로 무중단 시스템을 유지할 수 있다. 이러한 단기 및 장기 토큰 갱신과 자동 갱신 설계 패턴은 비단 스레드뿐만 아니라 카카오나 네이버 등 다른 SNS API 연동 시에도 그대로 재사용할 수 있는 귀중한 기술적 자산이 되었다.

    단순 원본 링크를 매력적인 스레드용 훅 문장으로 변환하는 가공 과정을 보여주는 일러스트

    도달률 저하를 막기 위한 훅 문장 재가공

    자동 발행 코드가 다 완성되었다고 해서 바로 발행할 수 있는 것은 아니었다. 스레드 알고리즘 특성상 성의 없이 원문 링크만 띡 던지는 포스트는 단순 재게시로 취급되어 사용자 피드에 노출되는 도달률이 급격히 줄어드는 리스크가 존재했다.

    이를 방지하기 위해 발행할 원본 데이터에서 제목과 핵심 키워드를 추출해 매력적인 숏폼 형태의 훅 문장으로 재가공하는 buildThreadsHook_() 함수를 따로 만들었다. 링크만 공유하는 대신 독자의 시선을 사로잡을 수 있는 짧은 도입부를 먼저 배치하고 링크를 덧붙이는 구조다.

    이렇게 콘텐츠 가공 로직까지 분리해 두니 API 자동 발행의 기계적인 느낌을 지우고 유기적인 도달을 유도할 수 있는 준비를 마칠 수 있었다. 사소해 보이지만 자동화 파이프라인에서 실제 트래픽 성과를 가르는 핵심적인 한 끗 차이라고 생각한다.

    이제 코드는 모두 완벽하게 준비되었다. 남은 단계는 진경이가 메타 개발자 앱 등록을 마치고 Threads Tester 승인을 받은 뒤, 최종적으로 계정 소유자만 수행할 수 있는 OAuth 인증 절차를 완료하는 것이다. 실제 연동이 시작되기 전까지 계정 소유자의 승인 대기 상태이지만, 이번 삽질을 통해 탄탄한 API 갱신 아키텍처를 손에 넣은 것 같아 매우 뿌듯하다.

    APITokenRenewal Automation GoogleAppsScript SNSMarketing ThreadsAPI
    ← 이전 글
    최근 게시물
    다음 글 →
    이전 게시물
    ≡ 글 목록으로
    소개
    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