使用R的httr、jsonlite、dplyr抓取Twitter报Invalid Request错如何解决
问题排查思路
- 首先排查
readline函数使用错误:readline()的入参是交互提示语而非默认值,你写的readline('BenDuBose')运行时如果没有手动输入内容直接回车,handle变量会是空字符串,导致请求的username参数为空,触发接口参数校验失败。 - 其次排查接口参数匹配问题:你调用的是用户信息查询接口
/2/users/by,不支持attachments.media_keys这个扩展参数,该参数仅适用于推文查询类接口,参数不匹配也会触发校验错误。 - 最后校验身份凭证:确认系统环境变量
BEARER_TOKEN已正确配置,无空值、拼写错误或权限过期问题。
可行解决方案
1. 修复当前用户查询代码
如果你仅需要验证接口连通性查询用户信息,可使用以下修正后代码:
library(httr) library(jsonlite) library(dplyr) # 校验并获取凭证 bearer_token <- Sys.getenv("BEARER_TOKEN") if (bearer_token == "") stop("请先配置BEARER_TOKEN环境变量") headers <- c('Authorization' = sprintf('Bearer %s', bearer_token)) # 直接赋值用户名,无需交互输入 handle <- "BenDuBose" url_handle <- sprintf('https://api.twitter.com/2/users/by?username=%s', handle) response <- httr::GET( url = url_handle, httr::add_headers(.headers = headers) ) # 解析返回内容 user_info <- fromJSON(content(response, as = "text")) print(user_info)
2. 实现核心需求:抓取指定用户/推文的图片
场景1:根据已有推文ID批量获取媒体链接
如果你已经整理好推文ID列表,直接调用推文查询接口即可获取对应的媒体资源地址:
# 你的推文ID列表,示例值可替换为你的实际数据 tweet_ids <- c("1692345678901234567", "1692345678901234568") params <- list( 'ids' = paste(tweet_ids, collapse = ","), 'expansions' = 'attachments.media_keys', 'media.fields' = 'url,preview_image_url' ) response <- httr::GET( url = "https://api.twitter.com/2/tweets", httr::add_headers(.headers = headers), query = params ) result <- fromJSON(content(response, as = "text")) # 提取媒体图片链接 media_urls <- result$includes$media$url
场景2:查询指定用户的带图推文
如果需要先获取用户发布的带图推文,再提取图片,使用以下代码:
# 先获取用户ID(用之前查询到的user_info里的id值也可以) user_id <- user_info$data$id params <- list( 'max_results' = 100, 'expansions' = 'attachments.media_keys', 'media.fields' = 'url,preview_image_url', 'tweet.fields' = 'created_at' ) response <- httr::GET( url = sprintf("https://api.twitter.com/2/users/%s/tweets", user_id), httr::add_headers(.headers = headers), query = params ) result <- fromJSON(content(response, as = "text")) # 提取媒体图片链接 user_media_urls <- result$includes$media$url
内容的提问来源于stack exchange,提问作者David M
相关产品推荐
相关产品推荐

