{"record":{"id":"19b585a122672982","repo":"DIYgod/RSSHub","slug":"skeb-followings-rss-is-disabled-due-to-the-lack-of-19b585","errorCode":null,"errorMessage":"Skeb followings RSS is disabled due to the lack of relevant config","messagePattern":"Skeb followings RSS is disabled due to the lack of relevant config","errorType":"error_code","errorClass":"ConfigNotFoundError","httpStatus":503,"severity":"error","filePath":"lib/routes/skeb/friend-works.ts","lineNumber":44,"sourceCode":"    },\n    name: 'Friend Works',\n    maintainers: ['SnowAgar25'],\n    handler,\n    radar: [\n        {\n            title: 'Friend Works',\n            source: ['skeb.jp/:username'],\n            target: '/friend_works/:username',\n        },\n    ],\n    description: \"Get the latest requests for the specified user's followings 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 followings RSS is disabled due to the lack of relevant config');\n    }\n\n    const items = await getFollowingsItems(username, 'friend_works');\n\n    return {\n        title: `Skeb - ${username} - フォロー中のクライアントの新着リクエスト`,\n        link: `https://skeb.jp/${username}`,\n        item: items as DataItem[],\n    };\n}\n","sourceCodeStart":26,"sourceCodeEnd":55,"githubUrl":"https://github.com/DIYgod/RSSHub/blob/bed535e0879dc71c5aff6f1e7bd1ac21ede40115/lib/routes/skeb/friend-works.ts#L26-L55","documentation":"Same Skeb auth gate, applied to the friend-works route: requires `config.skeb.bearerToken` to fetch the latest requests from a user's followed clients. Throws before `getFollowingsItems(username, 'friend_works')`.","triggerScenarios":"A request to /friend_works/:username on an instance without the Skeb bearer token configured.","commonSituations":"Default deploy; expired token; public instance without Skeb credentials.","solutions":["Set `SKEB_BEARER_TOKEN` in the environment and restart.","Validate the token against the Skeb API directly.","Rotate the token on expiry."],"exampleFix":"// before\n# SKEB_BEARER_TOKEN unset\n\n// after\nSKEB_BEARER_TOKEN=<your bearer token>","handlingStrategy":"validation","validationCode":"if (!config.skeb?.bearerToken) {\n    return ctx.body('Skeb route requires SKEB_BEARER_TOKEN.', 503);\n}","typeGuard":"const hasSkebToken = (c: typeof config): boolean => Boolean(c.skeb?.bearerToken);","tryCatchPattern":null,"preventionTips":["Centralize the Skeb auth check so all three routes behave consistently.","Rotate the token on a schedule.","Alert when the token nears expiry."],"tags":["config-missing","auth-token","artist-platform"],"backgroundTag":null,"analyzedSha":"bed535e0879dc71c5aff6f1e7bd1ac21ede40115","analyzedAt":"2026-08-12T19:29:35.364Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}