AlistGo/alist · error
MediaFire action token failed: %s
Error message
MediaFire action token failed: %s
What it means
The dedicated action-token endpoint /user/get_action_token.php returned Result != Success. The session_token in d.SessionToken was rejected or the token type requested is not granted. Action tokens authorize mutation endpoints (upload, delete); this error blocks every upload-path operation that starts with getActionToken.
Source
Thrown at drivers/mediafire/util.go:529
if d.actionToken != "" {
return d.actionToken, nil
}
data := map[string]string{
"type": "upload",
"lifespan": "1440",
"response_format": "json",
"session_token": d.SessionToken,
}
var resp MediafireActionTokenResponse
_, err := d.postForm("/user/get_action_token.php", data, &resp)
if err != nil {
return "", err
}
if resp.Response.Result != "Success" {
return "", fmt.Errorf("MediaFire action token failed: %s", resp.Response.Result)
}
return resp.Response.ActionToken, nil
}
func (d *Mediafire) pollUpload(ctx context.Context, key string) (*MediafirePollResponse, error) {
actionToken, err := d.getActionToken(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get action token: %w", err)
}
//fmt.Printf("Debug Key: %+v\n", key)
query := map[string]string{
"key": key,
"response_format": "json",
"session_token": actionToken, /* d.SessionToken */View on GitHub (pinned to 843d9dc814)
Solutions
- Re-run login to obtain a fresh session token, then retry the action token request
- Verify d.SessionToken is non-empty before the call and that Init succeeded
- If re-login also fails, re-validate email/password (or app credentials) entirely
- Persist and reuse action tokens within their requested 1440-minute lifespan to reduce token churn
Example fix
// before
if resp.Response.Result != "Success" {
return "", fmt.Errorf("MediaFire action token failed: %s", resp.Response.Result)
}
// after
if resp.Response.Result != "Success" {
// session is likely stale; force re-login on next operation
d.SessionToken = ""
return "", fmt.Errorf("MediaFire action token failed: %s", resp.Response.Result)
} Defensive patterns
Strategy: retry
Validate before calling
if d.SessionToken == "" {
return errors.New("cannot get action token: no session; login first")
} Try / catch
// On action-token result failure, re-login once then retry
if _, err := d.getActionToken(ctx); err != nil {
if strings.Contains(err.Error(), "action token failed") {
if d.relogin() == nil {
return d.getActionToken(ctx)
}
}
return err
} Prevention
- Invalidate d.SessionToken when this fires so the next call re-logs in
- Persist session with a timestamp and refresh before expiry
- Avoid multiple logins for one account across processes
When it happens
Trigger: Session token expired (MediaFire sessions have a limited lifespan and are invalidated by re-login elsewhere); session_token missing or empty because Init/login never completed; requesting an action token type the app is not entitled to; account locked or password changed.
Common situations: Driver instance held for a long time (daemon process) without re-login; credentials rotated outside the app; concurrent logins with the same account invalidating older sessions; misconfigured stored credentials where the session token was never persisted.
Related errors
- failed to get action token: %w
- expected *os.File, got %T
- no download links found
- MediaFire upload check failed: %s
- failed to read response body: %v
AI-assisted analysis of AlistGo/alist@843d9dc814 (2026-08-15).
Data as JSON: /api/errors/b5abf2dd68664122.
Report an issue: GitHub.