agentleFS
eunu-hyudeveunu-hyudev/threads-writing-skills/threads-web-publish/SKILL.md

threads-web-publish

Skill1 starsChanged 4 months agoMITView on GitHub

Threads(스레드) 웹을 브라우저 자동화로 조작해 글을 올리거나 예약·수정할 때 쓰는 실전 절차. '스레드에 올려줘', '예약 발행해줘', '예약한 글 어디 있어?', '사진 첨부해줘', 'alt 텍스트 넣어줘', '자답글 체인으로 묶어줘', '올린 글 수정해줘' 같은 요청이면 반드시 이 스킬을 쓸 것. 예약 글을 다시 찾는 경로, 클립보드 사진 첨부, 다중 이미지 크롭 함정, alt 입력, 인라인 Enter 즉시 게시 사고, 한글 입력 오타 방지까지 이미 값을 치르고 알아낸 것들이라 모르면 글이 유실되거나 잘린다. 브라우저를 직접 몰지 않고 문안만 쓰는 경우에는 필요 없다.

The file

Files
SKILL.md

Threads 웹 발행 운영

Threads 웹은 브라우저 자동화로 다루기에 함정이 많다. 아래는 전부 실제로 한 번씩 사고를 내고 알아낸 것들이다. 순서대로 따라가면 같은 값을 다시 치르지 않는다.

전제: Chrome 로그인 세션에 붙는 브라우저 도구(claude-in-chrome MCP 등)로 조작한다. 공식 API는 예약 발행을 지원하지 않으므로(§8) 예약이 필요하면 웹을 쓴다.


1. 본문 입력 — 인라인 Enter는 즉시 게시다

가장 비싼 함정부터. 인라인 답글창에서 Enter는 줄바꿈이 아니라 발행이다. 줄바꿈이 섞인 문자열을 그대로 타이핑하면 첫 줄만 올라가고 나머지는 사라진다.

  • 여러 줄은 확장(⤢) 창이나 수정 창에서 쓴다. 거기서는 Enter가 줄바꿈으로 동작한다.
  • 인라인 창을 꼭 써야 하면 줄바꿈을 Shift+Enter로 넣는다.

여러 줄을 넣을 때는 브라우저 도구의 type 액션으로 줄바꿈을 포함해 통째로 입력한다. 모달 작성창에서는 Enter가 줄바꿈이라 이게 가장 확실하다.

execCommand로는 줄바꿈이 들어가지 않는다 — 2026-07-27 실측:

  • document.execCommand('insertText', false, '...\n...') → \n이 통째로 무시되고 한 문단으로 뭉친다. 글자는 다 들어가는데 줄 구조만 사라져서, 확인 없이 게시하면 문단 없는 벽 글이 올라간다.
  • document.execCommand('insertLineBreak')를 줄 사이에 끼워도 → 역시 줄바꿈이 안 생기고, 커서가 튀어 문장 순서까지 뒤섞였다.

한 줄짜리 텍스트를 넣거나, 이미 있는 오타를 Range 선택 후 바꿔치기할 때는 insertText가 여전히 가장 안전하다(Lexical 에디터라 DOM 직접 주입은 저장 시점에 날아간다). 즉 줄바꿈이 없으면 insertText, 있으면 type.

작성창을 먼저 클릭해 포커스를 준다. 그리고 클릭 직후 바로 타이핑하면 앞 글자가 잘린다 — 실제로 같은 이 통째로 날아간 적이 있다. 입력 후 첫 줄을 눈으로 확인할 것.

한글은 리터럴로 넘긴다. 도구 인자에 \uXXXX 이스케이프로 넘기면 코드포인트를 틀려 오타가 난다(블로그→바로그, 간격→간겁). 게시 전에 전문을 검증하고, 오타는 TreeWalker로 텍스트 노드를 찾아 Range 선택 후 insertText로 교체한다.

해시태그를 치면 주제 태그 자동완성 팝업이 뜬다. 전체 문자열을 하나의 태그로 만들려 하므로 Escape로 닫아야 일반 텍스트로 남는다. 이미 만들어진 해시태그 토큰은 부분 교체가 덧붙는 식으로 깨지므로(#장에인#장애인), 오타 토큰 뒤에 캐럿을 놓고 글자 수만큼 BackSpace로 지운다.

Cmd+A는 편집 영역 안을 클릭한 뒤에 눌러야 한다. 사진이나 여백을 클릭한 상태면 페이지 전체가 선택된다.

내용 검증

const e = document.querySelectorAll('div[contenteditable="true"]');
const n = s => s.replace(/\n/g,'').replace(/ /g,' ').trim().length;
Array.from(e).map((el,i) => `${i+1}=${n(el.innerText)}자`).join(' / ')

글자 수는 줄바꿈 제외로 센다. 줄바꿈을 늘려도 길이 계산에 영향이 없다.


2. 자답글은 스레드에 추가로 묶는다

여러 편으로 나눌 글은 확장 창의 스레드에 추가 버튼으로 칸을 늘려 한 번에 게시한다. 따로따로 올리면 체인이 아니라 형제 답글로 흩어져 순서가 뒤섞인다.

한 번에 게시되므로 "자답글을 본문 직후에 올린다"는 조건도 자동으로 충족된다. 3일 늦게 단 자답글은 조회가 거의 안 붙는다.


3. 사진 첨부 — 클립보드가 유일한 경로

에이전트가 파일 업로드 도구로 직접 올리는 건 거부된다(세션에 공유된 파일만 허용). 프로젝트 폴더도, 스크래치패드도 안 된다. macOS에서는 클립보드로 우회한다:

osascript -e 'set the clipboard to (read (POSIX file "/절대/경로/파일.png") as «class PNGf»)'

그 뒤 작성창 텍스트 영역을 클릭하고 Cmd+V.

  • webp는 Threads가 안 받는다. sips -s format png 원본.webp --out 결과.png로 변환한다.
  • 폰 스크린샷은 맥에 파일이 없다. 메신저로 옮기면 확장자가 .webp로 오는 경우가 많다.

4. 다중 이미지는 세로 타일로 센터 크롭된다

사진이 2장 이상이면 캐러셀로 묶이며 세로 타일 기준으로 잘린다.

  • 가로로 납작한 이미지(예: 472×54 메뉴바 크롭)는 쓰지 말 것. 핵심 숫자가 전부 잘리고 가운데 파편만 확대된다.
  • 비교용 2장은 비슷한 세로 비율끼리 묶어야 둘 다 읽힌다(786×1204 + 802×1252 조합은 정상).
  • 납작한 이미지를 꼭 써야 하면 단독 1장으로 올리거나 정사각형으로 패딩한다.

5. alt 텍스트

사진 위에 마우스를 올리면 좌하단에 ···이 뜬다 → 대체 텍스트 추가 → 입력 → 완료.

  • 사진이 여러 장이면 각 사진마다 따로 넣는다.
  • 예약 저장 후 다시 열면 이미지 src가 blob:에서 https://scontent-...로 바뀐다. blob:만 세는 검증 스크립트는 0을 반환한다 — 첨부가 사라진 게 아니다.
Array.from(document.querySelectorAll('div[role="dialog"] img'))
  .filter(i => i.width > 100)
  .map(i => `${i.width}x${i.height} alt=${(i.alt||'').length}자`)

6. 예약 발행

작성창 우측 상단 ··· → 예약... → 달력에서 날짜 클릭 → 하단 시간 입력(15 : 00 형식, 시·분 각각 삼중클릭 후 타이핑) → 완료.

설정되면 상단에 수요일 오후 7:00 GMT+9에 게시 예정 배너가 뜨고, 하단 버튼이 게시 → **예약**으로 바뀐다. 게시물 옵션은 답글 권한 설정이라 예약과 무관하다.

인용글은 예약이 안 된다. 인용 작성창에는 ···에 AI 레이블 추가만 있고 시계 아이콘이 없다. 인용글을 특정 시각에 올려야 하면 그 시각에 게시 동작을 실행하는 예약 작업을 따로 걸고, 문안은 파일로 남긴다.


예약 글 수정 (2026-07-27 실측)

임시 저장본에서 예약 글을 열면 편집 모드이고, 여기서 자답글 추가와 시각 변경이 둘 다 된다.

  • 자답글 추가: 맨 아래 스레드에 추가 → 입력. 칸 번호가 2/3 3/3으로 늘어나는 것으로 확인
  • 시각 변경: ··· → 예약... → 분 부분 삼중클릭 후 타이핑 → 완료
  • 마지막에 **업데이트**를 눌러야 반영된다. 누르지 않고 창을 닫으면 확인창이 뜨고, 거기서 취소하면 작성창이 유지된다

예약 시각 직전에도 수정이 먹힌다(발행 3분 전에 자답글 추가 + 10분 미루기 성공).

7. 예약한 글을 다시 찾기

프로필에서 새 글 작성창을 열고 임시 저장본 버튼(작성창 우측 상단 문서 아이콘)을 누른다. 예약 글이 그 목록에 있고, 클릭하면 편집 모드로 열린다. 하단 버튼이 게시가 아니라 **업데이트**면 편집 모드가 맞다.

여기에 없는 곳(전부 확인해본 헛수고):

  • 왼쪽 사이드바 더 보기 → 디자인/설정/좋아요/보관함/문제 신고/로그아웃뿐
  • 프로필 우측 상단 ··· → 열로 추가뿐
  • 프로필 피드 → 예약 글은 표시되지 않음
  • https://www.threads.com/settings/scheduled_posts → 404

작성창이 예약 글을 물고 있으면 다른 곳을 클릭할 때 예약된 게시물을 업데이트하시겠어요? 확인창이 뜬다. 더 고칠 예정이면 **취소**를 눌러 작성창을 유지한다. 업데이트를 누르면 그 시점 내용으로 확정되고 창이 닫힌다.


8. API로는 예약이 안 된다

Threads 공식 API에 예약 발행 기능이 없다. API로 하려면 스케줄러(launchd 등)를 직접 만들어야 하므로, 일반 글은 웹의 예약을 쓰는 쪽이 확실하다.


9. 잘못 올렸을 때

15분 안에 수정으로 복구한다 (점 3개 → 수정 → 완료). 삭제하지 않는다 — 삭제하면 그때까지 붙은 노출과 반응이 같이 사라지고, 같은 글을 다시 올려도 알고리즘이 처음부터 다시 시작한다.


발행 전 점검

  • 확장 창에서 썼는가 (인라인 Enter로 반쪽만 올라가지 않았는가)
  • 전문을 innerText로 검증했는가 (한글 오타, 잘린 앞 글자)
  • 자답글을 스레드에 추가로 묶었는가
  • 사진마다 alt를 넣었는가
  • 다중 이미지의 세로 비율이 비슷한가
  • 해시태그가 본문 마지막에 단독으로 있는가 (자답글에는 0개)
  • 예약이라면 배너와 예약 버튼을 눈으로 확인했는가

줄바꿈·문단 규칙은 threads-linebreak 스킬을 쓴다.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.