You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言调用Twitter API v2实现next_token自动分页

Twitter v2 API 推文计数自动分页R脚本实现

需求背景

  • 需统计指定账号(示例为POTUS)2017-2022年的累计发布推文数量
  • 现有脚本仅能拉取单页结果(日度粒度下最长覆盖31天数据),手动添加next_token翻页效率极低
  • 基于R语言实现自动翻页逻辑,无需手动操作即可拉取全时段数据

初始问题代码

library(httr)

bearer_token = ""

headers = c(
  `Authorization` = sprintf('Bearer %s', bearer_token)
)

params = list(
  `query` = 'from:POTUS',
  `start_time` = '2017-01-01T00:00:00Z',
  `end_time` = '2022-01-01T00:00:00Z',
  `granularity` = day
)

response <- httr::GET(url = 'https://api.twitter.com/2/tweets/counts/all', httr::add_headers(.headers=headers), query = params)

body <-
  content(
    response,
    as = 'parsed',
    type = 'application/json',
    simplifyDataFrame = TRUE
  )


View(body$data)
sum(body$data$tweet_count)

注:初始代码存在两处明显问题:一是granularity参数值day未加引号,运行时会触发对象不存在报错;二是未处理分页逻辑,查询跨度超过1个月的时段会出现数据缺失。

自动分页实现代码

实现逻辑:每次请求后检查返回体meta字段中是否存在next_token,若存在则将其作为pagination_token参数传入下一次请求,直到无next_token时终止循环,过程中自动拼接所有分页的结果,同时添加请求延时避免触发接口速率限制。

library(httr)

# 替换为你自己的Twitter开发者账号Bearer Token
bearer_token = ""

headers = c(
  `Authorization` = sprintf('Bearer %s', bearer_token)
)

# 自定义查询参数
params = list(
  `query` = 'from:POTUS',
  `start_time` = '2017-01-01T00:00:00Z',
  `end_time` = '2022-01-01T00:00:00Z',
  `granularity` = "day" # 修正原代码未加引号的bug
)

# 初始化结果存储列表
all_counts <- list()

repeat{
  # 发送请求
  response <- httr::GET(
    url = 'https://api.twitter.com/2/tweets/counts/all', 
    httr::add_headers(.headers=headers), 
    query = params
  )
  
  # 错误状态提示
  if(http_status(response)$category != "Success"){
    stop(paste0("请求出错,状态码:", status_code(response), ",错误信息:", content(response)$detail))
  }
  
  body <- content(
    response,
    as = 'parsed',
    type = 'application/json',
    simplifyDataFrame = TRUE
  )
  
  # 将当前页结果存入列表
  all_counts[[length(all_counts) + 1]] <- body$data
  
  # 判断是否存在下一页
  if(!is.null(body$meta$next_token)){
    # 更新翻页参数
    params$pagination_token <- body$meta$next_token
    # 加1秒延时,避免触发速率限制
    Sys.sleep(1)
  }else{
    # 无下一页时退出循环
    break
  }
}

# 合并所有分页结果
final_data <- do.call(rbind, all_counts)

# 查看每日计数明细
View(final_data)
# 计算指定时段总推文数
total_tweets <- sum(final_data$tweet_count)
print(paste0("指定时段累计推文数:", total_tweets))

使用说明

  • 首次使用需将bearer_token变量替换为自己账号的有效Bearer Token
  • 可根据需求修改查询参数:
    • query:支持Twitter v2全量搜索规则,比如更换统计账号直接修改from:后的账号名即可
    • start_time/end_time:需传入UTC时区的ISO格式时间,结尾必须带Z标识
    • granularity:支持minute/hour/day三个可选值,对应不同的统计时间粒度
  • 脚本运行过程中会自动处理分页,无需手动干预,运行完成后可直接查看明细数据和总计数结果

内容的提问来源于stack exchange,提问作者Steven-f

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:24:57