DIYgod/RSSHub · error · ConfigNotFoundError

Skeb works RSS is disabled due to the lack of <a href="https

Error message

Skeb works RSS is disabled due to the lack of <a href="https://docs.rsshub.app/deploy/config#route-specific-configurations">relevant config</a>

What it means

Thrown as a ConfigNotFoundError when config.skeb is unset or config.skeb.bearerToken is missing. The Skeb works route (/skeb/works/:username) requires an authenticated bearer token to call the private /api/users/:username/works endpoint. ConfigNotFoundError is RSSHub's convention for routes that need operator-supplied configuration; it renders the message (including the HTML link) to the end user so they know what env var to set.

Source

Thrown at lib/routes/skeb/works.ts:47

    },
    name: 'Creator Works',
    maintainers: ['SnowAgar25'],
    handler,
    radar: [
        {
            title: 'Creator Works',
            source: ['skeb.jp/:username'],
            target: '/works/:username',
        },
    ],
    description: 'Get the latest works of a specific creator on Skeb',
};

async function handler(ctx): Promise<Data> {
    const username = ctx.req.param('username');

    if (!config.skeb || !config.skeb.bearerToken) {
        throw new ConfigNotFoundError('Skeb works RSS is disabled due to the lack of <a href="https://docs.rsshub.app/deploy/config#route-specific-configurations">relevant config</a>');
    }

    const url = `${baseUrl}/api/users/${username.replace('@', '')}/works`;

    await ensureRequestKey(url);

    const items = await cache.tryGet(url, async () => {
        const data = await ofetch(url, {
            retry: 0,
            method: 'GET',
            query: { role: 'creator', sort: 'date', offset: '0' },
            headers: {
                'User-Agent': config.ua,
                Cookie: `request_key=${await cache.get('skeb:request_key')}`,
                Authorization: `Bearer ${config.skeb.bearerToken}`,
            },
        });

View on GitHub (pinned to bed535e087)

Solutions

  1. Set SKEB_BEARER_TOKEN in your RSSHub environment: log into skeb.jp, open F12 console, run localStorage.getItem('token'), and copy the value.
  2. If the token expired, repeat the extraction process and update the env var, then restart RSSHub.
  3. If you cannot obtain a token (no Skeb account), use the public Skeb routes that do not require auth: /skeb/new_art_works, /skeb/search/:keyword.

Example fix

# before
# (SKEB_BEARER_TOKEN not set)

# after (.env)
SKEB_BEARER_TOKEN=eyJhbGciOi...your-token-here...
Defensive patterns

Strategy: validation

Validate before calling

if (!config.skeb?.bearerToken) {
    throw new ConfigNotFoundError('Skeb works RSS requires SKEB_BEARER_TOKEN. Set it in your environment.');
}

Type guard

function hasSkebConfig(cfg: typeof config): cfg is typeof config & { skeb: { bearerToken: string } } {
    return !!cfg.skeb && typeof cfg.skeb.bearerToken === 'string' && cfg.skeb.bearerToken.length > 0;
}

Prevention

When it happens

Trigger: The RSSHub instance operator has not set the SKEB_BEARER_TOKEN environment variable. The bearer token is obtained from the Skeb website via localStorage.getItem('token') in the browser developer console, as documented in the route's requireConfig description.

Common situations: Self-hosted RSSHub without configuring route-specific env vars; the bearer token expired (Skeb tokens have a limited lifetime); or the operator is using a public RSSHub instance that does not support this route.

Related errors


AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12). Data as JSON: /api/errors/9e95e6a075949468. Report an issue: GitHub.