jackwener/OpenCLI · error · CommandExecutionError

Failed to fetch Douyin comments for video ${awemeId}: ${erro

Error message

Failed to fetch Douyin comments for video ${awemeId}: ${error instanceof Error ? error.message : String(error)}

What it means

A CommandExecutionError wrapping any non-CliError failure raised while fetching top comments for a video during douyin user-videos. fetchTopComments rethrows CliError subclasses untouched, but converts unexpected exceptions (browser page errors, API failures, timeouts) into a single message prefixed with the awemeId so batch processing can surface which video failed.

Source

Thrown at clis/douyin/user-videos.js:53

    return Math.min(DEFAULT_COMMENT_LIMIT, Math.max(1, Math.round(numeric)));
}
async function mapInBatches(items, concurrency, mapper) {
    const results = [];
    for (let index = 0; index < items.length; index += concurrency) {
        const chunk = items.slice(index, index + concurrency);
        results.push(...(await Promise.all(chunk.map(mapper))));
    }
    return results;
}
async function fetchTopComments(page, awemeId, count) {
    try {
        return await fetchDouyinComments(page, awemeId, count);
    }
    catch (error) {
        if (error instanceof CliError) {
            throw error;
        }
        throw new CommandExecutionError(`Failed to fetch Douyin comments for video ${awemeId}: ${error instanceof Error ? error.message : String(error)}`);
    }
}
cli({
    site: 'douyin',
    name: 'user-videos',
    access: 'read',
    description: '获取指定用户的视频列表(含下载地址和热门评论)',
    domain: 'www.douyin.com',
    strategy: Strategy.COOKIE,
    args: [
        { name: 'sec_uid', type: 'string', required: true, positional: true, help: '用户 sec_uid(个人主页 URL 末尾部分,也可直接传整条主页 URL)' },
        { name: 'limit', type: 'int', default: 20, help: '获取数量(最大 20)' },
        { name: 'with_comments', type: 'bool', default: true, help: '包含热门评论(默认: true)' },
        { name: 'comment_limit', type: 'int', default: 10, help: '每个视频获取多少条评论(最大 10)' },
    ],
    columns: ['index', 'aweme_id', 'title', 'duration', 'digg_count', 'play_url', 'top_comments'],
    func: async (page, kwargs) => {
        const secUid = normalizeSecUid(kwargs.sec_uid);

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Read the wrapped error.message (appended after the awemeId) to find the underlying cause.
  2. Re-run the command with --with-comments disabled (or --comment-limit lowered) to confirm the videos themselves still list fine.
  3. Reduce --comment-limit / concurrency pressure and retry after a pause if rate limited.
  4. Refresh the Douyin session (re-run auth) if the underlying message suggests auth or empty responses.
  5. If persistent, update the CLI package — the comment fetcher may lag a Douyin DOM change.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const { videos } = await run('douyin user-videos', { sec_uid, with_comments: true });
} catch (e) {
  if (e.name === 'CommandExecutionError' && /comments for video/.test(e.message)) {
    console.warn(`comment fetch failed (${e.message}); retrying without comments`);
    return run('douyin user-videos', { sec_uid, with_comments: false });
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling `douyin user-videos --with-comments` when fetchDouyinComments throws a non-CliError for one of the video's awemeIds — e.g. the comment popup never loads, the page DOM changed, or the browser tab crashed mid-batch.

Common situations: Douyin DOM/API change breaking the comment scraper; rate limiting or a network hiccup while mapInBatches hits videos concurrently; expired login state causing comment requests to return error pages instead of data.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/901d1644bd0c3877. Report an issue: GitHub.