破除Github API接口的访问次数限制
- 1、Github介绍
- [2、Github API接口](#2、Github API接口)
-
- [2.1 介绍](#2.1 介绍)
- [2.2 使用方法](#2.2 使用方法)
- [3、Github API访问限制](#3、Github API访问限制)
-
- [3.1 访问限制原因](#3.1 访问限制原因)
- [3.2 访问限制类别](#3.2 访问限制类别)
- [4、Github API访问限制破除](#4、Github API访问限制破除)
-
- [4.1 限制破除原理](#4.1 限制破除原理)
- [4.2 限制破除示例](#4.2 限制破除示例)
1、Github介绍
Github,是一个面向开源及私有软件项目的托管平台,也是全球最早且最大的项目代码托管平台 ,在无数代码人心中有着不可撼动的地位。Github只支持使用Git作为唯一的版本库控制托管,故名为Github。得助于Git强大的项目组织管理功能,全球范围内无数的企业用户也被吸引使用Github完成团队项目的协助工作。
截止2023年11月17日,Github在全球已有超过1亿的开发者用户(大多数来自于美国、中国、印度),超过90%的财富100强企业也选择使用Github。所有个人开发者用户与企业用户共同在Github上完成了约4.2亿个项目(包含2.84亿个开源项目)以及共计45亿次的开源贡献。
2、Github API接口
2.1 介绍
在 GitHub 汇聚了庞大的开源项目数据基础之上,该平台为开发者和研究者提供了丰富的研究素材。为了更好地协助 GitHub 用户访问和有效组织这些数据,GitHub 提供了公开的 API(Application Programming Interface) 接口,用以调用其平台资源。通过Github API,Github平台上公开的海量的数据得以轻松获取,这对爬虫、搜索、推荐系统与代码漏洞检测等方面的研究带来的极大的便利与促进作用。
GitHub API采用RESTful风格的设计,允许开发者通过 HTTP 请求访问 GitHub 上的各种资源,如仓库(Repositories)、用户(Users)、问题(Issues)、分支(Branches)等。通过 GitHub API,用户能够实现从查看存储库信息到管理问题, 以及提交、合并请求等各种操作。
2.2 使用方法
-
创建一个Github账户,并获取认证信息。
大多数 GitHub API 操作都需要进行身份验证,我们可以申请API Key (或者称为token凭证)进行身份验证 。生成 API Key的步骤可以在 GitHub 平台里的个人设置中完成。
进入个人设置页面后,点击左侧侧边栏的
Developers Settings
选项 ,配置Github API Key。
Github身份认证支持auth 与token 两种验证方式,其中auth为授权码认证方式,其原理可参考这篇博客:第三方登陆auth(github),token为凭证认证方式,我们这里通过token方式进行认证。
先点击左边侧栏的
Token(classic)
, 然后点击右边弹出页面的Generate new token
按钮,生成一个新的token。
之后设置token名称(Note) 、到期时间(Expiration) 、可访问的权限范围(Select scopes) ,然后点击
Generate token
生成即可。
下图中token即为绿色标注的区域(由于隐私性,本文生成的token加了马赛克)。
-
使用API Key发起API请求。
有了API Key后,就能够以最大限度地访问Github API了。本文给出一个使用Python语言访问Github API接口的实例。
首先,确保已经安装了requests库:
pythonpip install requests
然后,使用以下的Python代码。 以下代码给出了通过requests向Github API发送Get请求,获取指定Github用户名、用户ID与粉丝数的实现逻辑:
pythonimport requests def get_github_user(username): # 替换为上一步生成的有效token access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxx" # 构建 API 请求的 URL api_url = f"https://api.github.com/users/{username}" # 构建请求头,包括认证信息 headers = { "Authorization": f"Bearer {access_token}", "Accept": "application/json" # 指定响应数据格式为 JSON } # 发送 GET 请求 response = requests.get(api_url, headers=headers) # 检查响应状态码 if response.status_code == 200: # 解析 JSON 响应 user_data = response.json() # 打印用户信息 print(f"GitHub 用户名: {user_data['login']}") print(f"用户ID: {user_data['id']}") print(f"粉丝数: {user_data['followers']}") else: print(f"请求失败,状态码: {response.status_code}") print(f"错误信息: {response.text}") # 替换为你要查询的 GitHub 用户名 get_github_user("YuDongPan")
运行后将得到以下结果:
3、Github API访问限制
3.1 访问限制原因
在Github REST API Documentation中,详细介绍了Github API的使用方式、使用规范、使用案例与应用场景。此外,文档中还谈及了GitHub将限制用户在特定时间内可以发出的REST API请求的数量。此限制有助于防止滥用和拒绝服务攻击,并确保API对所有用户仍然可用。
3.2 访问限制类别
通常,Github根据身份验证方法计算REST API的主要速率限制,如下所述:
-
未认证用户 (unauthenticated users) :
如果仅提取公共数据,则可以发出未经身份验证的API请求。未经身份验证的API请求与发起者的IP地址相关联,而不是与发出请求的用户或应用程序相关联。
未经身份验证的请求的主要速率限制为每小时60个请求。
-
认证用户 (authenticated users) :
认证用户可以使用个人访问令牌来发出API请求。此外,认证用户可以授权GitHub应用程序或OAuth应用程序,然后它们可以代表认证用户发出API请求。
普通情况下,认证用户每小时5000次请求的速率限制 。GitHub企业云组织拥有的GitHub应用程序请求的速率限制更高,为每小时15000个请求。同样,如果认证用户是GitHub Enterprise Cloud组织的成员,则由GitHub企业云组织拥有或批准的OAuth应用程序代表您提出的请求的速率限制更高,为每小时15000个请求。
-
Github APP安装 (Github APP installation) :
使用安装访问token进行身份验证的GitHub应用程序使用安装的最低速率限制,即每小时5000个请求。如果安装在GitHub企业云组织上,则安装的速率限制为每小时15000个请求。对于不在GitHub企业云组织上的安装,安装速率限制将随着用户和存储库的数量而变化。具有20个以上存储库的安装每小时会收到另外50个请求。在一个拥有20个以上用户的组织中安装,每个用户每小时还会收到50个请求。速率限制不能超过每小时12500个请求。
GitHub应用程序用户访问token的主要速率限制由经过身份验证的用户的主要速率限值决定。此速率限制与另一个GitHub应用程序或OAuth应用程序代表该用户发出的任何请求以及该用户使用个人访问令牌发出的任何要求相结合。
4、Github API访问限制破除
4.1 限制破除原理
从Github API的访问限制类别中可以看出,未经认证的用户每小时可访问的次数最少,为60次;经认证的用户每小时可访问次数为5000次;作为Github企业云组织的应用程序每小时的访问次数则可以高达15000次。
考虑到大部分开发者并非Github企业云组织成员,故按照官方标准一个普通开发者经身份认证后最高可达到5000次/小时的访问速率。
但是,值得注意的是,一个开发者经身份认证后每小时可以访问5000次API接口,并不意味着一个应用程序的整个运行周期内就只能使用一个开发者的认证信息!!!
因此,如果我们在应用程序里头同时穿插使用多个开发者的身份认证信息(如token认证),即可完美破除Github API的访问限制
。
从而,破除Github API访问限制的关键,转化为了计算我们的应用程序每个小时需访问多少次Github API接口,对应于我们需要为应用程序准备多少个Github用户身份认证信息(token)。
例如,倘若我们开发的应用程序是一个爬虫程序,用于爬取Github的用户信息。爬虫程序在使用了多线程后,每小时需要访问13865次的Github
API接口,那么我们则需要准备 ⌈ 13865 ÷ 5000 ⌉ \lceil 13865÷5000 \rceil ⌈13865÷5000⌉=3个Github用户的token凭证。
4.2 限制破除示例
根据这一逻辑,我们给出以下的Python代码示例:
python
import requests
import random
from concurrent.futures import ThreadPoolExecutor
def get_github_user(username):
access_token = random.choice(token_lst)
# 构建 API 请求的 URL
api_url = f"https://api.github.com/users/{username}"
# 构建请求头,包括认证信息
headers = {
"Authorization": f"Bearer {access_token}",
"Accept": "application/json" # 指定响应数据格式为 JSON
}
# 发送 GET 请求
response = requests.get(api_url, headers=headers)
# 检查响应状态码
if response.status_code == 200:
# 解析 JSON 响应
user_data = response.json()
# 打印用户信息
print(f"GitHub 用户名: {user_data['login']}")
print(f"用户ID: {user_data['id']}")
print(f"粉丝数: {user_data['followers']}")
else:
print(f"请求失败,状态码: {response.status_code}")
print(f"错误信息: {response.text}")
# 构建一个token列表, 代表多个Github用户的token凭证
token_lst = [
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
]
# 假设构建一个含有8888个用户名的列表
username_lst = []
for i in range(8888):
username_lst.append("YuDongPan")
# 使用ThreadPoolExecutor创建线程池,控制并发数量
with ThreadPoolExecutor(max_workers=10) as executor:
# 将每个用户名提交给线程池中的线程进行获取用户信息
executor.map(get_github_user, username_lst)
在这个示例中,我们试图通过多线程机制在短时间内(一小时内)完成8888条Github API请求,获取指定Github用户名、用户ID与粉丝数。由于单个Github用户每个小时在使用token凭证后可访问5000次API,那么我们需要准备 ⌈ 8888 ÷ 5000 ⌉ \lceil 8888÷5000 \rceil ⌈8888÷5000⌉=2个Github用户的token凭证,装入token列表中。
在每次访问Github API接口时,我们通过random.choice()函数随机中token列表中选取一个Github用户的token凭证即可。