Install
openclaw skills install deviantart-postPost artwork, journals, and status updates to a user's DeviantArt account through the official DeviantArt API using OAuth 2.1 Authorization Code with PKCE, S...
openclaw skills install deviantart-postUse the official API, not browser automation.
client_id and redirect URI.~/.openclaw/deviantart-app-credentials.json, or override the path with DEVIANTART_APP_CREDENTIALS.scripts/deviantart_auth.py.Default paths:
~/.openclaw/deviantart-app-credentials.json~/.openclaw/deviantart-token.jsonOptional overrides:
DEVIANTART_APP_CREDENTIALSDEVIANTART_TOKEN_PATHCredentials file shape:
{
"client_id": "12345",
"redirect_uri": "http://127.0.0.1:8765/callback",
"scopes": ["stash", "publish"]
}
Add user.manage when journals or statuses are needed.
Authenticate:
python .\skills\deviantart-post\scripts\deviantart_auth.py
Post artwork:
python .\skills\deviantart-post\scripts\deviantart_post_art.py --file "C:\path\to\image.png" --title "My title" --tags tag_one tag_two --artist-comments "Optional description" --is-mature false
Or use the PowerShell wrapper:
powershell -ExecutionPolicy Bypass -File .\skills\deviantart-post\scripts\deviantart_post.ps1 -File "C:\path\to\image.png" -Title "My title" -Tags tag_one,tag_two -IsMature false
Create a journal:
python .\skills\deviantart-post\scripts\deviantart_post_journal.py --title "My journal" --body "Body text" --is-mature false
Or use the PowerShell wrapper:
powershell -ExecutionPolicy Bypass -File .\skills\deviantart-post\scripts\deviantart_post_journal.ps1 -Title "My journal" -Body "Body text" -IsMature false
Post a status:
python .\skills\deviantart-post\scripts\deviantart_post_status.py --body "Hello from OpenClaw"
Or use the PowerShell wrapper:
powershell -ExecutionPolicy Bypass -File .\skills\deviantart-post\scripts\deviantart_post_status.ps1 -Body "Hello from OpenClaw"
stash/submit may return an error body even with HTTP 200. Always inspect the JSON body.--dry-run when the user wants a preview before uploading.--gallery-name; if multiple folders have the same name, require a UUID instead.Read references/api-notes.md and check: