← 返回 Skills 市场
axel5o5

EdStem

作者 axel browne · GitHub ↗ · v1.1.0
cross-platform ⚠ suspicious
759
总下载
0
收藏
0
当前安装
3
版本数
在 OpenClaw 中安装
/install edstem
功能描述
Fetch, sync, and organize EdStem discussion threads for any course or institution. Use when checking for new EdStem posts, syncing course discussion forums,...
使用说明 (SKILL.md)

EdStem

Fetch and organize EdStem discussion threads from any course or institution with automatic staff/student differentiation.

Quick Start

Fetch recent threads for any course:

cd /home/axel/.openclaw/workspace/skills/edstem/scripts
python3 fetch-edstem.py \x3Ccourse_id> [output_dir] [--course-name "Course Name"]

Examples:

# Fetch to default directory (./edstem-\x3Ccourse_id>)
python3 fetch-edstem.py 92041

# Fetch to specific directory
python3 fetch-edstem.py 92041 ./machine-learning

# Specify course name for clearer output
python3 fetch-edstem.py 92041 --course-name "Machine Learning"

# Combine directory and course name
python3 fetch-edstem.py 92041 ./ml-course --course-name "Machine Learning"

# Fetch more threads (default is 10)
python3 fetch-edstem.py 92041 --limit 25

Finding Your Course ID

To find your EdStem course ID:

  1. Log into EdStem and navigate to your course
  2. Look at the URL: https://edstem.org/us/courses/\x3Ccourse_id>/
  3. The number in the URL is your course ID

Alternatively, use the API to list your courses:

curl -H "Authorization: Bearer YOUR_TOKEN" https://us.edstem.org/api/user | jq '.courses[] | {id: .course.id, name: .course.name}'

What Gets Fetched

For each course:

  • threads.json - Full thread list with metadata
  • thread-XXX.md - Individual threads formatted as markdown
    • Thread title, category, timestamps
    • Original post content
    • All answers and comments
    • [STAFF] or [STUDENT] tags on every post

Features

  • Institution-agnostic: Works with any school using EdStem
  • Staff differentiation: Clearly marks instructor/TA posts vs student posts
  • Structured output: Markdown format for easy reading and searching
  • API-based: Uses EdStem's official API (no scraping)
  • Flexible output: Choose your own output directory and organization scheme

Authentication

The skill uses a bearer token stored in the Python script. To use with your own account:

  1. Log into EdStem in your browser
  2. Open Developer Tools → Network tab
  3. Reload any EdStem page
  4. Find an API request and copy the Authorization: Bearer ... token
  5. Update ED_TOKEN in scripts/fetch-edstem.py

Current token location: Line 20 in scripts/fetch-edstem.py

If API calls fail (401 Unauthorized), your token likely expired and needs refresh.

Scripts

fetch-edstem.py (recommended)

Full-featured Python script with markdown formatting and staff/student differentiation.

Usage:

python3 scripts/fetch-edstem.py \x3Ccourse_id> [output_dir] [options]

Options:

  • output_dir - Where to save threads (default: ./edstem-\x3Ccourse_id>)
  • --course-name NAME - Display name for the course
  • --limit N - Number of threads to fetch (default: 10)

Features:

  • Fetches thread metadata and full details
  • Full markdown formatting with answers and comments
  • Automatic staff role detection
  • JSON cache of thread list
  • Auto-creates output directory

fetch-edstem.sh (lightweight alternative)

Bash/curl version for raw JSON fetching without dependencies.

Usage:

bash scripts/fetch-edstem.sh \x3Ccourse_id> [output_dir]

Outputs:

  • Raw JSON files for each thread
  • Requires manual formatting or post-processing

Common Workflows

Check for new posts

python3 scripts/fetch-edstem.py 92041 ~/courses/ml-spring-2025

Sync multiple courses

# Create a simple sync script
for course in "92041:machine-learning" "94832:advanced-rl"; do
    IFS=':' read -r id name \x3C\x3C\x3C "$course"
    python3 scripts/fetch-edstem.py $id ~/courses/$name --course-name "$name"
done

Review recent activity

After fetching, check the markdown files:

ls -lt ./edstem-92041/*.md | head
cat ./edstem-92041/thread-001.md

Search across threads

grep -r "gradient descent" ./edstem-92041/*.md

Output Structure

\x3Coutput_dir>/
├── threads.json              # Thread metadata
├── thread-001.md             # Individual threads
├── thread-002.md
└── ...

Each markdown file contains:

  • Thread metadata (number, title, category, timestamps)
  • Original post with author role
  • All answers (sorted, with role tags)
  • All comments (with role tags)

Integration Examples

With LLM agents

# Fetch threads and analyze with your agent
python3 fetch-edstem.py 92041 ./course-data
# Then: "Summarize the most common questions in ./course-data/"

Automated monitoring

# Add to cron for daily sync
0 9 * * * cd /path/to/skills/edstem/scripts && python3 fetch-edstem.py 92041 ~/courses/ml

Custom organization

# Organize by semester and institution
python3 fetch-edstem.py 92041 ~/school/stanford/2025-spring/cs229
python3 fetch-edstem.py 94832 ~/school/mit/2025-spring/6.7920

Troubleshooting

401 Unauthorized: Token expired. Re-authenticate and update ED_TOKEN in the script.

Course not found: Verify the course ID and that your account has access.

Empty threads: Check that the course has discussion posts and you're enrolled.

Rate limiting: EdStem may rate-limit API requests. Add delays between fetches if needed.

Contributing

This skill is open-source and institution-agnostic by design. Improvements welcome:

  • Better content parsing (EdStem uses XML-based document format)
  • Support for filtering by category or date range
  • Incremental sync (only fetch new threads)
  • Export to other formats (JSON, HTML, etc.)

Version History

  • 1.1.0 - Made institution-agnostic with flexible parameters
  • 1.0.0 - Initial release
安全使用建议
Don't run this as-is. Both scripts include a hardcoded EdStem bearer token — that is a secret and its presence is a red flag. Before installing or running: 1) Treat the included token as compromised; do not use it. 2) Replace the ED_TOKEN usage with a secure pattern (read token from an environment variable or a permissioned config file) and remove any hardcoded token from the code. 3) If you are the owner of the included token, rotate/revoke it immediately. 4) If you don't know who published this skill, prefer to fork or copy the scripts locally, remove the hardcoded token, and audit the code (and any leftover developer-specific paths like /home/axel) before running. 5) Consider running fetches with a least-privilege token and avoid storing tokens in repo files; add any local token file to .gitignore. These steps will reduce the risk of unauthorized access or accidental data exposure.
功能分析
Type: OpenClaw Skill Name: edstem Version: 1.1.0 The skill bundle is classified as suspicious due to the presence of a hardcoded EdStem API bearer token (`ED_TOKEN = "dptT0u.adkdSAKHoFQpttiLLmuxaJRqxekDmNMIxaYZgLUn"`) in both `scripts/fetch-edstem.sh` and `scripts/fetch-edstem.py`. While the documentation (SKILL.md, README.md, PUBLISHING.md) instructs users to replace this token with their own and acknowledges it as a security concern, its inclusion in a published skill bundle constitutes a critical vulnerability, potentially exposing the skill owner's EdStem account if the token is active. All network calls are directed to the legitimate EdStem API, and there is no evidence of malicious intent such as data exfiltration to unauthorized endpoints, persistence mechanisms, or prompt injection attempts designed to subvert the agent's core function beyond its stated purpose.
能力评估
Purpose & Capability
The name/description match the code and SKILL.md: both Python and bash scripts call EdStem's API to list and fetch threads, format output, and differentiate staff vs student. No unrelated services or binaries are requested.
Instruction Scope
Runtime instructions stay within the stated purpose (fetching EdStem threads). The SKILL.md instructs users how to obtain a Bearer token via browser DevTools and to insert it into the Python script (ED_TOKEN), which is functional but insecure. Quick-start examples include a developer-specific path (/home/axel/...), indicating leftover local configuration.
Install Mechanism
No install spec (instruction-only) and included scripts are run locally. There are no downloads or external installers. This minimizes installer risk, but the included code will execute on the user's system when run.
Credentials
The skill declares no required credentials, yet both scripts contain a hardcoded ED_TOKEN value (same token in fetch-edstem.py and fetch-edstem.sh). Embedding an active bearer token in distributed code is a major mismatch and a sensitive secret leak: it exposes whoever owns that token and may let anyone running the scripts access that account's EdStem data. The SKILL.md/README instructs editing the script to paste your token instead of using environment variables, which is poor practice and inconsistent with typical credential handling.
Persistence & Privilege
The skill does not request persistent/always-on privilege and does not modify other skills or global agent configuration. It suggests user-managed automation (cron), which is a user action and not an automatic permission escalation by the skill itself.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install edstem
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /edstem 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v1.1.0
Institution-agnostic: works with any school using EdStem, flexible output directories, auto course name detection
v1.0.1
Fixed publishing metadata
v1.0.0
Initial release: Fetch and organize EdStem discussion threads with staff/student differentiation for Columbia courses
元数据
Slug edstem
版本 1.1.0
许可证
累计安装 0
当前安装数 0
历史版本数 3
常见问题

EdStem 是什么?

Fetch, sync, and organize EdStem discussion threads for any course or institution. Use when checking for new EdStem posts, syncing course discussion forums,... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 759 次。

如何安装 EdStem?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install edstem」即可一键安装,无需额外配置。

EdStem 是免费的吗?

是的,EdStem 完全免费(开源免费),可自由下载、安装和使用。

EdStem 支持哪些平台?

EdStem 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 EdStem?

由 axel browne(@axel5o5)开发并维护,当前版本 v1.1.0。

💬 留言讨论