使用githubAPI时如何指定user agent?

How to specify user agent when using github API?

我想获取 Github 存储库中的文件列表。我关注了 this answer 但我注意到有时我会遇到 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 header 请求的值。

但是在 GET() 中添加 user_agent("etiennebacher") 并没有改变任何东西。在这种情况下我应该如何指定用户代理?

也在 RStudio Community

上询问

正如@MrFlick 评论的那样,此处的 HTTP 403 表示超出了 API 速率限制。解决此问题的一种方法是在发出请求时进行身份验证,因为速率限制为 from 60 to 5,000 requests per hour。使用包 gh(及其同名函数)更容易做到这一点。这可以通过在 gh().

中指定 .token = <PAT>(其中 <PAT> 是您的 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

奖励:如何在 Github 操作中进行身份验证

原来post里没说,但是这个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}