{"record":{"id":"9e95e6a075949468","repo":"DIYgod/RSSHub","slug":"skeb-works-rss-is-disabled-due-to-the-lack-of-a-h","errorCode":null,"errorMessage":"Skeb works RSS is disabled due to the lack of <a href=\"https://docs.rsshub.app/deploy/config#route-specific-configurations\">relevant config</a>","messagePattern":"Skeb works RSS is disabled due to the lack of <a href=\"https://docs\\.rsshub\\.app/deploy/config#route-specific-configurations\">relevant config</a>","errorType":"exception","errorClass":"ConfigNotFoundError","httpStatus":503,"severity":"error","filePath":"lib/routes/skeb/works.ts","lineNumber":47,"sourceCode":"    },\n    name: 'Creator Works',\n    maintainers: ['SnowAgar25'],\n    handler,\n    radar: [\n        {\n            title: 'Creator Works',\n            source: ['skeb.jp/:username'],\n            target: '/works/:username',\n        },\n    ],\n    description: 'Get the latest works of a specific creator on Skeb',\n};\n\nasync function handler(ctx): Promise<Data> {\n    const username = ctx.req.param('username');\n\n    if (!config.skeb || !config.skeb.bearerToken) {\n        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>');\n    }\n\n    const url = `${baseUrl}/api/users/${username.replace('@', '')}/works`;\n\n    await ensureRequestKey(url);\n\n    const items = await cache.tryGet(url, async () => {\n        const data = await ofetch(url, {\n            retry: 0,\n            method: 'GET',\n            query: { role: 'creator', sort: 'date', offset: '0' },\n            headers: {\n                'User-Agent': config.ua,\n                Cookie: `request_key=${await cache.get('skeb:request_key')}`,\n                Authorization: `Bearer ${config.skeb.bearerToken}`,\n            },\n        });\n","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/DIYgod/RSSHub/blob/bed535e0879dc71c5aff6f1e7bd1ac21ede40115/lib/routes/skeb/works.ts#L29-L65","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Set SKEB_BEARER_TOKEN in your RSSHub environment: log into skeb.jp, open F12 console, run localStorage.getItem('token'), and copy the value.","If the token expired, repeat the extraction process and update the env var, then restart RSSHub.","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."],"exampleFix":"# before\n# (SKEB_BEARER_TOKEN not set)\n\n# after (.env)\nSKEB_BEARER_TOKEN=eyJhbGciOi...your-token-here...","handlingStrategy":"validation","validationCode":"if (!config.skeb?.bearerToken) {\n    throw new ConfigNotFoundError('Skeb works RSS requires SKEB_BEARER_TOKEN. Set it in your environment.');\n}","typeGuard":"function hasSkebConfig(cfg: typeof config): cfg is typeof config & { skeb: { bearerToken: string } } {\n    return !!cfg.skeb && typeof cfg.skeb.bearerToken === 'string' && cfg.skeb.bearerToken.length > 0;\n}","tryCatchPattern":null,"preventionTips":["Set SKEB_BEARER_TOKEN as part of your initial RSSHub deployment checklist.","Document the token extraction process (localStorage.getItem('token')) prominently in the route description.","Set up monitoring to alert when the token expires and starts failing."],"tags":["config","authentication","skeb","env-vars"],"backgroundTag":null,"analyzedSha":"bed535e0879dc71c5aff6f1e7bd1ac21ede40115","analyzedAt":"2026-08-12T19:29:35.364Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}