Install
openclaw skills install dropbox-liteUpload, download, and manage files in Dropbox with automatic OAuth token refresh.
openclaw skills install dropbox-liteUpload, download, list, and search files in Dropbox. Supports automatic token refresh.
| Variable | Required | Description |
|---|---|---|
DROPBOX_APP_KEY | ✅ Yes | Your Dropbox app key |
DROPBOX_APP_SECRET | ✅ Yes | Your Dropbox app secret |
DROPBOX_REFRESH_TOKEN | ✅ Yes | OAuth refresh token (long-lived) |
DROPBOX_ACCESS_TOKEN | Optional | Short-lived access token (auto-refreshed) |
Store in ~/.config/atlas/dropbox.env:
DROPBOX_APP_KEY=your_app_key
DROPBOX_APP_SECRET=your_app_secret
DROPBOX_REFRESH_TOKEN=xxx...
DROPBOX_ACCESS_TOKEN=sl.u.xxx...
In the app settings under "Permissions", enable:
files.metadata.readfiles.metadata.writefiles.content.readfiles.content.writeaccount_info.readClick "Submit" to save.
Generate the authorization URL:
import urllib.parse
APP_KEY = "your_app_key"
params = {
"client_id": APP_KEY,
"response_type": "code",
"token_access_type": "offline" # This gets you a refresh token!
}
auth_url = "https://www.dropbox.com/oauth2/authorize?" + urllib.parse.urlencode(params)
print(auth_url)
Give the URL to the user. They will:
curl -X POST "https://api.dropboxapi.com/oauth2/token" \
-d "code=AUTHORIZATION_CODE" \
-d "grant_type=authorization_code" \
-d "client_id=APP_KEY" \
-d "client_secret=APP_SECRET"
Response includes:
access_token — Short-lived (~4 hours)refresh_token — Long-lived (never expires unless revoked)# Account info
dropbox.py account
# List folder
dropbox.py ls "/path/to/folder"
# Search files
dropbox.py search "query"
# Download file
dropbox.py download "/path/to/file.pdf"
# Upload file
dropbox.py upload local_file.pdf "/Dropbox/path/remote_file.pdf"
The script automatically handles token refresh:
dropbox.env with the new access token| Token | Lifetime | Storage |
|---|---|---|
| Access Token | ~4 hours | Updated automatically |
| Refresh Token | Never expires* | Keep secure, don't share |
*Refresh tokens only expire if explicitly revoked or app access is removed.
401 Unauthorized on refresh:
403 Forbidden:
Path errors:
/ and are case-insensitive