{"record":{"id":"124c4598c8bd92b5","repo":"jackwener/OpenCLI","slug":"tiktok-studio-item-list-returned-an-unreadable-res","errorCode":null,"errorMessage":"TikTok Studio item_list returned an unreadable response","messagePattern":"TikTok Studio item_list returned an unreadable response","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/tiktok/creator-videos.js","lineNumber":191,"sourceCode":"    return {\n        video_id: videoId,\n        title: String(item.desc ?? item.title ?? '').replace(/\\s+/g, ' ').trim(),\n        date: formatDate(item.post_time ?? item.create_time ?? item.schedule_time),\n        views: normalizeNumber(item.play_count),\n        likes: normalizeNumber(item.like_count),\n        comments: normalizeNumber(item.comment_count),\n        saves: normalizeNumber(item.favorite_count),\n        shares: normalizeNumber(item.share_count),\n        url,\n    };\n}\n\nasync function fetchCreatorVideosPage(page, cursor, size) {\n    const result = await page.evaluate(buildFetchItemListScript(buildItemListRequest(cursor, size))).catch((error) => {\n        throw new CommandExecutionError(`Failed to fetch TikTok Studio item_list: ${getErrorMessage(error)}`);\n    });\n    if (!result || typeof result !== 'object') {\n        throw new CommandExecutionError('TikTok Studio item_list returned an unreadable response');\n    }\n    if (result.networkError) {\n        throw new CommandExecutionError(`TikTok Studio item_list network failure: ${result.networkError}`);\n    }\n    if (result.status === 401 || result.status === 403) {\n        throw new AuthRequiredError('www.tiktok.com', `TikTok Studio item_list requires login (HTTP ${result.status})`);\n    }\n    if (!result.ok) {\n        const detail = result.parseError\n            ? `invalid JSON (${result.parseError})`\n            : `HTTP ${result.status || 0}${result.statusText ? ` ${result.statusText}` : ''}`;\n        throw new CommandExecutionError(`TikTok Studio item_list failed: ${detail}`, result.text ? `Response preview: ${result.text}` : undefined);\n    }\n    const payload = unwrapPayload(result.data);\n    assertApiSuccess(payload);\n    return payload;\n}\n","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/tiktok/creator-videos.js#L173-L209","documentation":"The in-page fetch script is supposed to always return an object describing the HTTP outcome. When page.evaluate resolves with null/undefined or a non-object (e.g. serialization stripped the value, or an unexpected return shape), the library throws this CommandExecutionError instead of crashing later on property access.","triggerScenarios":"result is null/undefined or typeof result !== 'object' after page.evaluate resolves — typically when the injected script returns undefined or the browser serializes the result to nothing.","commonSituations":"A TikTok frontend update replaced the global fetch override path, the evaluate script was truncated by a CSP/script error, or a newer browser returns undefined for blocked requests instead of the structured object.","solutions":["Log the raw result from page.evaluate to see what the browser actually returned","Verify you are on www.tiktok.com (Studio) and the page finished loading before evaluating","Update this CLI library — TikTok DOM/API changes may need a patched fetch script","If persistent, dump the page HTML/screenshot and report the TikTok response shape"],"exampleFix":"// before\nconst result = await page.evaluate(script);\nif (!result || typeof result !== 'object') throw new Error('unreadable');\n// after\nconst result = await page.evaluate(script);\nconsole.debug('item_list raw result:', result);\nif (!result || typeof result !== 'object') throw new Error('unreadable: ' + JSON.stringify(result));","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"function isReadableItemResult(v) { return v !== null && typeof v === 'object'; }","tryCatchPattern":"try {\n  rows = await listCreatorVideos(page, opts);\n} catch (e) {\n  if (/unreadable response/.test(e.message)) {\n    console.error('item_list returned:', typeof result); // debug shape, then update library\n  }\n  throw e;\n}","preventionTips":["Log raw evaluate results when debugging TikTok response-shape issues","Update the library promptly when TikTok changes frontend behavior","Verify the page is on www.tiktok.com and fully loaded before fetching"],"tags":["tiktok","serialization","response-shape","command-execution"],"backgroundTag":"unexpected-response-shape","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}