GitHub API 提供了获取按创建日期排序的加星标项目的功能。但是,我找不到获得这个日期的可能性。
响应中仅存在三个日期类型字段:
created_at: '2013-06-13T21:10:36Z',
updated_at: '2013-06-18T07:45:56Z',
pushed_at: '2013-06-17T16:52:44Z',
create_at
这里始终是存储库创建的日期,而不是星号。 updated_at
也没有提供正确的信息。
在 GitHub 网站上,如果您检查星星,数据会正确排序并呈现正确的时间跨度。但 API 似乎遗漏了该信息。
gist清楚地表明,数据返回“已排序”,但
created_at
是错误的。
这可以通过添加标头在 GitHub API v3 中完成:
Accept: application/vnd.github.v3.star+json
看这里:
绝对没有办法从 API 获取这些信息。获得它的最佳机会是查看存储库上的事件或为存储库添加星标的每个用户,这可能需要大量的解析,因为事件可能有数千个。这样做的 API 调用数量将是巨大的。
您需要使用“List stargazers”REST API 并将标头“
Accept: application/vnd.github.star+json
”添加到请求中。
来自 GitHub 文档:REST API - 列出观星者
列出已为存储库添加星标的人员。
该端点支持以下自定义媒体类型。有关详细信息,请参阅“媒体类型”。
:包括创建星星的时间戳。application/vnd.github.star+json
这是一个没有访问令牌的简单示例:
curl -L -s \
-H "Accept: application/vnd.github.star+json" \
https://api.github.com/repos/mikyll/SDL2-Controller-Tester/stargazers
此命令检索存储库首页的星星(最多 100 个)mikyll/SDL2-Controller-Tester。
如果您达到 GitHub API 速率限制,您可以使用授权标头 (
-H "Authorization: token <gh_token>"
) 将个人访问令牌添加到请求中。
要管理访问令牌,您可以访问此页面。
List stargazers API 根据页码检索星星,您可以使用查询参数进行自定义:
page
设置要获取结果的页码(默认1);per_page
设置每页结果数(最多 100);在处理具有大量星星的存储库时,要获取完整的星星历史记录,您必须发送多个请求。
以下 Bash 脚本 循环遍历所有页面(每个有效响应包含一个带有下一页链接的标头),并将更简单的 JSON 保存在文件中
star_history.json
:
#!/bin/bash
# GitHub repository details
OWNER="owner_name"
REPO="repository_name"
# GitHub personal access token for authentication (it provides higher rate limit)
TOKEN="github_token"
# Base URL for the GitHub API
URL="https://api.github.com/repos/${OWNER}/${REPO}/stargazers"
# Custom accept header to include starred_at timestamp
ACCEPT_HEADER="Accept: application/vnd.github.star+json"
# Authentication header (uncomment if using a token)
# AUTH_HEADER="Authorization: token ${TOKEN}"
# Initial page
PAGE=1
# Max results per page
PER_PAGE=100
# Loop through all pages of results
while true
do
# Make request to GitHub API
RESPONSE=$(curl -s -H "${ACCEPT_HEADER}" -H "${AUTH_HEADER}" "${URL}?page=${PAGE}&per_page=${PER_PAGE}")
# Check if the response is empty
if [ -z "${RESPONSE}" ] || [ "${RESPONSE}" == "[]" ] || [[ "${RESPONSE}" != *"starred_at"* ]]
then
break
fi
# Check if rate limit was hit
if [[ "${RESPONSE}" == *"API rate limit exceeded"* ]]
then
break
else
# Process the response
echo "${RESPONSE}"
# Increment the page number
((PAGE++))
fi
done | jq '[ .[] | { "username": .user.login, "timestamp": .starred_at } ]' > star_history.json