使用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")
并没有改变任何东西。在这种情况下我应该如何指定用户代理?
上询问
正如@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}
我想获取 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 次,这只是我发现模拟问题的最简单方法。)
在线搜索了一下,我发现 User-Agent
header 请求的值。
但是在 GET()
中添加 user_agent("etiennebacher")
并没有改变任何东西。在这种情况下我应该如何指定用户代理?
正如@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}