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
相关产品推荐
相关产品推荐

