调用Twitter GraphQL API时出现fetch Invalid name错误排查
问题原因与修复方案
核心错误原因
你遇到的Invalid name错误是因为手动添加了HTTP/2伪头字段::path、:authority、:method、:scheme。这些字段是浏览器发起请求时自动生成的,不允许开发者手动设置,强行添加会触发头名称格式校验失败。
具体修复步骤
- 移除非法请求头:删掉所有以冒号开头的头字段,这些不需要手动配置,fetch会根据你传入的URL自动处理。
- 移除多余的Content-Type头:这是GET请求,没有请求体,设置
Content-Type: application/json完全多余,反而可能干扰请求。 - 清理Cookie字符串:你的Cookie值末尾带有换行符,可能导致解析异常,要去掉多余的换行。
- 优化URL构建逻辑:手动拼接JSON参数容易出现转义错误,建议先将参数对象转为JSON字符串,再用
encodeURIComponent编码后拼接,避免引号冲突。
修复后的代码
async function getData(username) { // 定义参数对象,更易维护 const variables = JSON.stringify({ screen_name: username, withSafetyModeUserFields: true }); const features = JSON.stringify({ hidden_profile_likes_enabled: true, hidden_profile_subscriptions_enabled: true, responsive_web_graphql_exclude_directive_enabled: true, verified_phone_label_enabled: true, subscriptions_verification_info_is_identity_verified_enabled: true, subscriptions_verification_info_verified_since_enabled: true, highlights_tweets_tab_ui_enabled: true, responsive_web_twitter_article_notes_tab_enabled: true, creator_subscriptions_tweet_preview_api_enabled: true, responsive_web_graphql_skip_user_profile_image_extensions_enabled: false, responsive_web_graphql_timeline_navigation_enabled: true }); const fieldToggles = JSON.stringify({ withAuxiliaryUserLabels: false }); // 编码参数后拼接URL const URL = `https://api.twitter.com/graphql/k5XapwcSikNsEsILW5FvgA/UserByScreenName?variables=${encodeURIComponent(variables)}&features=${encodeURIComponent(features)}&fieldToggles=${encodeURIComponent(fieldToggles)}`; const response = await fetch(URL, { method: "GET", mode: "cors", cache: "no-cache", credentials: "same-origin", headers: { "Authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA", "Cookie": "guest_id_marketing=v1:170955125343839663; guest_id_ads=v1:170955125343839663; guest_id=v1:170955125343839663; gt=1764611971050074353; _ga=GA1.2.251089784.1709551255; _gid=GA1.2.393957230.1709551255; personalization_id=\"v1_5jbQDTm8Tn2sQ/f9diPocA==\"", "Origin": "https://twitter.com", "Referer": "https://twitter.com", "X-Client-Transaction-Id": "I7fMTBcu/4HmKfngKEMY6kPjahaJoBRzqcr/bTYgBPINSk5CBpY1sDLiD3RBiJlAp0RotSI7wGYBtp0x28iZw/JR986wIg", "X-Guest-Token": "1764611971050074353" }, redirect: "follow", referrerPolicy: "strict-origin-when-cross-origin" }); return response.json(); } getData("sama").then((data) => { console.log(data); });
额外说明
- 你使用的Guest Token和Bearer Token都是未登录状态下的公开令牌,暂时可以正常使用,但Twitter可能随时更新令牌规则,后续如果出现401/403错误,需要重新从无痕窗口的请求中提取最新令牌。
- 同源环境下(在twitter.com页面控制台执行),
credentials: "same-origin"可以保留,确保Cookie自动携带,但你手动指定的Cookie如果和当前页面的Cookie冲突,可能引发问题,也可以尝试去掉手动设置的Cookie,让浏览器自动处理。
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

