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

  1. Re-run login to obtain a fresh session token, then retry the action token request
  2. Verify d.SessionToken is non-empty before the call and that Init succeeded
  3. If re-login also fails, re-validate email/password (or app credentials) entirely
  4. 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

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


AI-assisted analysis of AlistGo/alist@843d9dc814 (2026-08-15). Data as JSON: /api/errors/b5abf2dd68664122. Report an issue: GitHub.