使用github API时如何指定user agent?

问题描述 投票:0回答:1

我想获取 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 社区

询问
r httr
1个回答
3
投票

正如@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

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

我在原来的帖子中没有说,但是这个 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}

	
© www.soinside.com 2019 - 2024. All rights reserved.