Threads 저장글을 자료 창고로 만들기 (2) — 저장 피드를 읽어내고, 로컬 AI로 분류하기
공식 API에 없는 저장 피드를 어떻게 읽어냈나. 화면이 아니라 데이터를 가로채고, gemma4로 분류하고, 미디어는 만료 전에 로컬로 받았다.
앞 글에서 적었듯, Threads의 "저장한 글"은 공식 API로 못 가져온다. 그래서 로그인된 브라우저가 저장 페이지를 그릴 때 오가는 데이터를 가로채는 방식으로 갔다. 이 글은 그 리버스 엔지니어링 과정이다.
화면이 아니라 "데이터"를 가로챈다
웹페이지를 긁는 흔한 방법은 화면의 HTML을 파싱하는 것이다. 하지만 그건 디자인이 조금만 바뀌어도 깨진다. 식당에 비유하면, 완성된 접시를 일일이 사진 찍는 대신 주방에 들어오는 주문서 자체를 받아 적는 쪽이 훨씬 튼튼하다.
그래서 먼저 작은 검증 스크립트로 threads.com/saved가 저장글을 불러올 때 내부적으로 주고받는 JSON 응답을 통째로 포착했다. 로그인 후 페이지를 스크롤하며 오가는 요청을 전부 기록해 보니, 답이 나왔다.
- 저장 피드 쿼리 이름:
BarcelonaSavedPageRefetchableQuery(Threads의 내부 코드명이 "Barcelona"다) - 데이터 경로:
saved_media.edges[].node.thread_items[].post - 페이지네이션:
page_info의 커서를 따라has_next_page=false가 될 때까지
함정도 하나 있었다. 가장 최근에 저장한 글들(첫 페이지)은 이 JSON이 아니라 문서 HTML 안에 미리 박혀서(SSR) 온다. 그래서 "JSON 가로채기"만 했으면 최근 21개를 통째로 놓칠 뻔했다. HTML 임베드 + JSON 가로채기를 둘 다 긁어 합쳐야 누락이 없었다.
로컬 AI(gemma4)가 분류한다
데이터를 모았으면 분류 차례다. 클라우드 API 대신 내 PC에서 도는 Ollama의 gemma4 모델에게 글마다 카테고리를 물었다. 비용 0, 키 불필요, 프라이버시도 안전.
239개 전부를 분류한 결과:
- AI소식 79 · 영상 57 · 공모전정보 43 · 기타 41 · git 19
경계가 모호한 글(예: AI 영상 툴 소식)은 가끔 흔들리지만, "자동 추천 + 수동 수정" 전제라 충분히 쓸 만하다.
이미지·영상은 로컬에 영구 보관
Threads의 미디어 URL은 시간이 지나면 만료되는 서명 링크다. "나중에 받지" 하면 링크가 죽어 못 받는다. 그래서 수집 시점에 바로 영상(59개)과 이미지(127개 글, 294개 파일)를 로컬에 받아뒀다. 덕분에 원본이 사라져도 창고 안에서는 멀쩡하다.

이미지를 클릭하면 위처럼 크게 띄우고 좌우로 넘겨볼 수 있다. 다음 글에서는 "혼자 쓰는 도구라도 완결성은 있어야 한다"는 피드백을 받아 다듬은 이야기를 적는다.