我想获取 Github 存储库上的文件列表。我遵循了这个答案,但我注意到有时我会遇到 HTTP 403 错误。例如,如果我运行以下代码:
library(httr)
for (i in 1:10) {
req <- GET("https://api.github.com/repos/etiennebacher/tidytuesday/git/trees/master?recursive=1")
stop_for_status(req)
}
> Error: Forbidden (HTTP 403).
(请注意,我实际上不想运行此 GET 请求 10 次,这只是我发现模拟问题的最简单方法。)
在网上搜索了一下,我发现这个答案解释了 Github API 需要 GitHub 用户名或应用程序的名称作为请求的
User-Agent
标头值。
但是在
user_agent("<gh_username>")
中添加 GET()
不会改变任何东西。在这种情况下我应该如何指定用户代理?
也在 RStudio 社区
询问正如@MrFlick所评论的,这里的HTTP 403意味着超出了API速率限制。解决此问题的一种方法是在发出请求时进行身份验证,因为速率限制从每小时 60 个请求变为 5,000 个请求。使用 gh
包(及其同名函数)可以更轻松地做到这一点。这可以通过在
.token = <PAT>
中指定 <PAT>
(其中 gh()
是您的 GitHub 个人访问令牌)来在本地完成。要获取特定存储库中的文件列表,您可以将 gh()
的输出保存在 JSON 文件中,然后使用
jsonlite::fromJSON()
读取它。然后获取文件列表就很简单了。底线,这有效:
library(gh)
library(jsonlite)
tmp_file <- tempfile(fileext = ".json")
gh::gh("https://api.github.com/repos/etiennebacher/tidytuesday/git/trees/master?recursive=1", .destfile = tmp_file, .token = <PAT>)
jsonlite::fromJSON(tmp_file)$tree$path
我在原来的帖子中没有说,但是这个 GET 请求应该是在 Github 操作中发出的。由于您无法手动提供 PAT 作为令牌,因此您需要在
.yaml
文件中定义令牌,然后在
.R
文件中传递其值。test.R
library(gh)
library(jsonlite)
tmp_file <- tempfile(fileext = ".json")
gh::gh("https://api.github.com/repos/etiennebacher/tidytuesday/git/trees/master?recursive=1", .destfile = tmp_file, .token = github_token)
jsonlite::fromJSON(tmp_file)$tree$path
GitHub 行动:
on:
push:
branches: master
jobs:
build:
runs-on: macOS-latest
steps:
- uses: actions/checkout@v2
- uses: r-lib/actions/setup-r@master
- run: |
github_token <- "${{ secrets.GITHUB_TOKEN }}"
install.packages(c("gh", "jsonlite"))
source("test.R"),
shell: Rscript {0}