Lsky Uploader
Overview
This skill wraps the Lsky Pro API used by your self-hosted image bed. It explains how to authenticate with personal tokens, how to call /upload, and provides a ready-to-run Python helper (scripts/uploadimage.py) that handles headers, multipart form-data, and prints the resulting URLs/Markdown snippets. See [references/apioverview.md](references/api_overview.md) for a condensed manual extracted from the official docs.
Quick Start
- Credentials
- Generate a personal token inside the Lsky dashboard and copy the raw token string (without the Bearer prefix). - Default base URL is https://lsky.xueguo.us/api/v1. Override via the env var LSKYBASEURL or the --base-url flag if your deployment differs. - Set the token in your shell (PowerShell: $env:LSKYTOKEN='1|xxxx', bash: export LSKYTOKEN=1|xxxx).
- Upload
- Run python scripts/uploadimage.py path/to/file.png. - Optional flags: --album-id, --strategy-id, --permission 0|1, --name custom-display-name. - The script prints the direct URL, Markdown snippet, delete URL, and the full JSON payload so you can update .lskyupload_cache.json.
- Use the links
- links.url is the canonical image URL, links.markdown can be pasted into blog Markdown, links.delete_url lets you remove the asset later. - If the script exits with Lsky API error: ..., inspect the message/HTTP status and cross-check rate limits or permissions.
Manual Steps (without script)
When custom logic is needed, follow these HTTP patterns (details in [references/apioverview.md](references/apioverview.md)):
- Upload
POST /upload: multipart form-data with file plus optional albumid, strategyid, permission, name.
- List images
GET /images?page=1&limit=50&order=latest: pagination response contains data.total and data.data[], each item exposing links, id, album_id, etc.
- Albums
GET /albums, POST /albums, DELETE /albums/:id: useful for separating assets per project.
- Delete an image
DELETE /images/:id: image IDs are available via the list endpoint or the upload response (data.image.id).
- Rate limiting: watch
X-RateLimit-Remaining and pause when it hits zero to avoid HTTP 429.
Script Reference
scripts/upload_image.py
- Dependency:
requests (install via pip install requests if missing).
- Environment variables:
- LSKYTOKEN (required unless you pass --token) - LSKYBASE_URL (defaults to https://lsky.xueguo.us/api/v1)
- 0 = success - Non-zero = invalid arguments or API errors (an explanatory message is printed)
For automation, capture stdout and parse the final JSON block:
python scripts/upload_image.py demo.png --token "$LSKY_TOKEN" \
--base-url https://lsky.xueguo.us/api/v1 > upload.json
Then feed into jq or PowerShell ConvertFrom-Json.
Troubleshooting
- 401 Unauthorized: token missing/expired or header omitted.
- 403 Forbidden: API disabled by the admin; adjust permissions server-side.
- 413 Payload too large: respect
allowsuffixes and maxsize configured in Lsky.
- 429 Too Many Requests: back off for ~60 seconds; inspect the rate-limit headers.
- Custom TLS/Proxy: if running behind an internal CA, call requests with
verify=False (not recommended) or install the CA cert on the machine.
Resources