← Back to list

透過 Claude Code 將 Medium 文章轉換為 Threads 格式自動發文

目錄

春麗 S.T.E.M. · 2026-04-30 07:19 · 0 claps · 9.6 min read
#threads #automatic-writing #api #python #venv
Open on Medium ↗
Wiki topics: LLM · Large Language Models

透過 Claude Code 將 Medium 文章轉換為 Threads 格式自動發文

目錄

⦿ 緣起
⦿ 擁有的資源
⦿ CLAUDE.md
⦿ post_threads.py
⦿ THREADS_USER_ID、THREADS_ACCESS_TOKEN
⦿ 步驟 Review

緣起

[圖形化 API 測試工具](https://medium.com/p/f19e4d88fe39?postPublishedType=initial)與`[使用 Threads API 來自動發文吧`](https://cowton0517.medium.com/come-on-%E4%BD%BF%E7%94%A8-threads-api-%E4%BE%86%E8%87%AA%E5%8B%95%E7%99%BC%E6%96%87%E5%90%A7-792797a68437)這兩篇文章中,我們知道了如何透過 Meta 的開發者網站,以 API 來跟 Threads 交互,我們可以透過帳號 ID 查詢所有文章 ID,透過文章 ID 可以查詢所有回文,以及透過創建 Container 放入媒體來發文。

然而,如果只是放入單句的 Text 沒有什麼問題,若想要發一個完整的文章,如下:

就稍嫌困難了些,所以希望透過一些方式來將流程簡化。

繼續閱讀|[**回目錄](#1dea)**

擁有的資源

首先,我平常就會在 Medium 發文章,但直接把文章搬到 Threads 就很不適合,除了照片不容易搬運,Medium 較適合長文外,還有一些難題,如果要精簡 Medium 文為 Threads 文有沒有辦法呢?是有的。

透過 Claude Code,我們可以使用這樣的指令。

❯ 請依照 CLAUDE.md,把 drafts/article.txt 整理成 3 篇 Threads 串文草稿,輸出到                        
  output/threads_draft.json。不要讀取 .env。 

我們先看一下資料夾裡面有哪些檔案。

(venv) chunlicheng@MacBook-Air-M1 threads-publisher % ls
CLAUDE.md drafts  output  scripts  venv

在 threads-publisher 資料夾中,結構是這樣的。

threads-publisher
├── CLAUDE.md
├── drafts
│     └── article.txt
├── output
│     └── published_result.json、threads_draft.json
├── script
│     └── post_threads.py
├── venv

venv 是環境資料夾,裡面就不羅列。

而 CLAUDE.md 是給 Claude Code 的規則;drafts(草稿)裡放的即是 Medium 文章文字檔;output 放的是發佈的結果,以及 threads 文章json 檔;script 是操作的腳本,一個 python 檔。

這即是說,我 Medium 的文章,複製貼上到 drafts 裡的 article.txt 中,請 Claude 幫我就規則產出 threads 的 json,再透過操作腳本發佈到 threads 上。

繼續閱讀|[**回目錄](#1dea)**

CLAUDE.md

首先,CLAUDE.md 裡面長這樣。

# Threads Publisher

你是 Threads 串文整理助理。

任務:
1. 讀取 drafts/article.txt
2. 將內容整理成 2~3 篇 Threads 串文
3. 每篇不超過 450 字
4. 第一篇要有 hook
5. 每篇都要能獨立閱讀
6. 不要硬切句子
7. 最後一篇附上 Medium 文章連結
8. 輸出到 output/threads_draft.json
9. 不要讀取、顯示、修改 .env
10. 不要輸出 access token

輸出 JSON 格式:

{
  "posts": [
    {
      "index": 1,
      "text": "..."
    },
    {
      "index": 2,
      "text": "..."
    },
    {
      "index": 3,
      "text": "..."
    }
  ]
}

這樣的規則,所以我在 article.txt 中就要放入我文章的 Medium 短網址。當然,這只是請 AI Agent 產生 threads 文檔,透過 json 的格式,我們才能夠以 API 跟 threads 交互,順利發文。

繼續閱讀|[**回目錄](#1dea)**

post_threads.py

直接看程式碼。

import json
import os
import sys
import time
from pathlib import Path

import requests
from dotenv import load_dotenv

ROOT = Path(__file__).resolve().parents[1]
load_dotenv(ROOT / ".env")

USER_ID = os.getenv("THREADS_USER_ID")
ACCESS_TOKEN = os.getenv("THREADS_ACCESS_TOKEN")
BASE_URL = "https://graph.threads.net/v1.0"

def assert_env():
    if not USER_ID:
        raise RuntimeError("Missing THREADS_USER_ID in .env")
    if not ACCESS_TOKEN:
        raise RuntimeError("Missing THREADS_ACCESS_TOKEN in .env")

def create_container(text: str, reply_to_id: str | None = None) -> str:
    data = {
        "media_type": "TEXT",
        "text": text,
        "access_token": ACCESS_TOKEN,
    }

    if reply_to_id:
        data["reply_to_id"] = reply_to_id

    response = requests.post(f"{BASE_URL}/{USER_ID}/threads", data=data, timeout=30)
    response.raise_for_status()
    payload = response.json()

    if "id" not in payload:
        raise RuntimeError(f"Container creation failed: {payload}")

    return payload["id"]

def publish_container(container_id: str) -> str:
    data = {
        "creation_id": container_id,
        "access_token": ACCESS_TOKEN,
    }

    response = requests.post(f"{BASE_URL}/{USER_ID}/threads_publish", data=data, timeout=30)
    response.raise_for_status()
    payload = response.json()

    if "id" not in payload:
        raise RuntimeError(f"Publish failed: {payload}")

    return payload["id"]

def load_posts(path: Path) -> list[str]:
    with path.open("r", encoding="utf-8") as file:
        data = json.load(file)

    posts = data.get("posts", [])
    texts = [post["text"] for post in posts if post.get("text")]

    if not texts:
        raise RuntimeError("No posts found in draft JSON")

    for idx, text in enumerate(texts, start=1):
        if len(text) > 500:
            raise RuntimeError(f"Post {idx} is too long: {len(text)} characters")

    return texts

def main():
    assert_env()

    draft_path = Path(sys.argv[1]) if len(sys.argv) > 1 else ROOT / "output" / "threads_draft.json"
    posts = load_posts(draft_path)

    previous_post_id = None
    published = []

    for idx, text in enumerate(posts, start=1):
        print(f"Creating container for post {idx}/{len(posts)}...")
        container_id = create_container(text, reply_to_id=previous_post_id)

        time.sleep(5)

        print(f"Publishing post {idx}/{len(posts)}...")
        post_id = publish_container(container_id)

        published.append({"index": idx, "post_id": post_id})
        previous_post_id = post_id

        print(f"Published post {idx}: {post_id}")
        time.sleep(3)

    result_path = ROOT / "output" / "published_result.json"
    with result_path.open("w", encoding="utf-8") as file:
        json.dump({"published": published}, file, ensure_ascii=False, indent=2)

    print(f"Done. Result saved to {result_path}")

if __name__ == "__main__":
    main()

程式碼意思大致為,從這個 python 檔案中,往上找根目錄資料夾中的 .env,就可以拿到 user_id 跟 access_token。

第一步,需要創建 container,第二步才是真的發文,再來是讀取 Threads 文章的 json 檔,這是所需的文字。

container 有自己的 ID,但這不是 post ID,是當 container 發佈出去後才會有 post ID,一個個接續回覆,形成三個一組的完整 Threads 文章。

我們需要兩個套件,一個是 python-dotenv,一個是 requests

首先,我們在 Terminal 必須這麼做。

cd ~/ai-tools/threads-publisher
source venv/bin/activate
pip install python-dotenv requests

就會建立一個虛擬環,再在這個環境中安裝 python-dotenv 跟 requests。

下一步,我們還需建立 **.env** 檔案,這是為了在環境放入隱密資訊,THREADS_USER_IDTHREADS_ACCESS_TOKEN,所以這個檔案也得放到 .gitignore 中。

touch .env
open .env
THREADS_USER_ID=你的 ID
THREADS_ACCESS_TOKEN=你的 Token

關閉 .env,回到 Terminal。

echo ".env" >> .gitignore

這樣 Commit 時就不會把 .env 送出去。

繼續閱讀|[**回目錄](#1dea)**

步驟 Review

所以,先把 Medium 文章貼到 article.txt 中,請 Claude Code 幫忙產生適合 Threads 文章的 json 檔。

最後用 python3 scripts/post_threads.py output/threads_draft.json 指令操作,就能將文章發出去。

這次就分享到這,感謝您的閱讀。

繼續閱讀|[**回目錄](#1dea)**


메타데이터
post_id
f2e7c0166834
slug
透過-claude-code-將-medium-文章轉換為-threads-格式自動發文-f2e7c0166834
url
https://medium.com/@cowton0517/%E9%80%8F%E9%81%8E-claude-code-%E5%B0%87-medium-%E6%96%87%E7%AB%A0%E8%BD%89%E6%8F%9B%E7%82%BA-threads-%E6%A0%BC%E5%BC%8F%E8%87%AA%E5%8B%95%E7%99%BC%E6%96%87-f2e7c0166834
canonical_url
https://medium.com/@cowton0517/%E9%80%8F%E9%81%8E-claude-code-%E5%B0%87-medium-%E6%96%87%E7%AB%A0%E8%BD%89%E6%8F%9B%E7%82%BA-threads-%E6%A0%BC%E5%BC%8F%E8%87%AA%E5%8B%95%E7%99%BC%E6%96%87-f2e7c0166834
author_url
https://medium.com/@cowton0517
status
ok
fetched_at
2026-06-21 22:26:41