技能详情(站内镜像,无评论)
作者:axel browne @axel5o5
许可证:MIT-0
MIT-0 ·免费使用、修改和重新分发。无需归因。
版本:v1.1.0
统计:⭐ 0 · 538 · 0 current installs · 0 all-time installs
⭐ 0
安装量(当前) 0
🛡 VirusTotal :可疑 · OpenClaw :可疑
Package:axel5o5/edstem
安全扫描(ClawHub)
- VirusTotal :可疑
- OpenClaw :可疑
OpenClaw 评估
The skill generally does what it claims, but both included scripts contain a hardcoded EdStem bearer token and the package's declared requirements do not match the credential handling — this is a security/integrity concern you should resolve before use.
目的
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.
说明范围
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.
安装机制
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.
证书
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 e…
持久
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.
安装(复制给龙虾 AI)
将下方整段复制到龙虾中文库对话中,由龙虾按 SKILL.md 完成安装。
请把本段交给龙虾中文库(龙虾 AI)执行:为本机安装 OpenClaw 技能「EdStem」。简介:Fetch, sync, and organize EdStem discussion threads for any course or instituti…。
请 fetch 以下地址读取 SKILL.md 并按文档完成安装:https://raw.githubusercontent.com/openclaw/skills/refs/heads/main/skills/axel5o5/edstem/SKILL.md
(来源:yingzhi8.cn 技能库)
SKILL.md
---
name: edstem
description: Fetch, sync, and organize EdStem discussion threads for any course or institution. Use when checking for new EdStem posts, syncing course discussion forums, reviewing student/staff questions and answers, or when the user asks to check EdStem, review course discussions, or stay updated on class forums.
---
# 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:
```bash
cd /home/axel/.openclaw/workspace/skills/edstem/scripts
python3 fetch-edstem.py <course_id> [output_dir] [--course-name "Course Name"]
```
**Examples:**
```bash
# Fetch to default directory (./edstem-<course_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/<course_id>/`
3. The number in the URL is your course ID
Alternatively, use the API to list your courses:
```bash
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:**
```bash
python3 scripts/fetch-edstem.py <course_id> [output_dir] [options]
```
**Options:**
- `output_dir` - Where to save threads (default: `./edstem-<course_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
bash scripts/fetch-edstem.sh <course_id> [output_dir]
```
**Outputs:**
- Raw JSON files for each thread
- Requires manual formatting or post-processing
## Common Workflows
### Check for new posts
```bash
python3 scripts/fetch-edstem.py 92041 ~/courses/ml-spring-2025
```
### Sync multiple courses
```bash
# Create a simple sync script
for course in "92041:machine-learning" "94832:advanced-rl"; do
IFS=':' read -r id name <<< "$course"
python3 scripts/fetch-edstem.py $id ~/courses/$name --course-name "$name"
done
```
### Review recent activity
After fetching, check the markdown files:
```bash
ls -lt ./edstem-92041/*.md | head
cat ./edstem-92041/thread-001.md
```
### Search across threads
```bash
grep -r "gradient descent" ./edstem-92041/*.md
```
## Output Structure
```
<output_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
```bash
# 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
```bash
# Add to cron for daily sync
0 9 * * * cd /path/to/skills/edstem/scripts && python3 fetch-edstem.py 92041 ~/courses/ml
```
### Custom organization
```bash
# 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