破除Github API接口的访问次数限制

打印 上一主题 下一主题

主题 803|帖子 803|积分 2409

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身份认证支持authtoken两种验证方式,其中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库:
    1. pip install requests
    复制代码
    然后,利用以下的Python代码。 以下代码给出了通过requests向Github API发送Get请求,获取指定Github用户名、用户ID与粉丝数的实现逻辑:
    1. import requests
    2. def get_github_user(username):
    3.     # 替换为上一步生成的有效token
    4.     access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
    5.     # 构建 API 请求的 URL
    6.     api_url = f"https://api.github.com/users/{username}"
    7.     # 构建请求头,包括认证信息
    8.     headers = {
    9.         "Authorization": f"Bearer {access_token}",
    10.         "Accept": "application/json"  # 指定响应数据格式为 JSON
    11.     }
    12.     # 发送 GET 请求
    13.     response = requests.get(api_url, headers=headers)
    14.     # 检查响应状态码
    15.     if response.status_code == 200:
    16.         # 解析 JSON 响应
    17.         user_data = response.json()
    18.         # 打印用户信息
    19.         print(f"GitHub 用户名: {user_data['login']}")
    20.         print(f"用户ID: {user_data['id']}")
    21.         print(f"粉丝数: {user_data['followers']}")
    22.     else:
    23.         print(f"请求失败,状态码: {response.status_code}")
    24.         print(f"错误信息: {response.text}")
    25. # 替换为你要查询的 GitHub 用户名
    26. 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代码示例:
  1. import requests
  2. import random
  3. from concurrent.futures import ThreadPoolExecutor
  4. def get_github_user(username):
  5.     access_token = random.choice(token_lst)
  6.     # 构建 API 请求的 URL
  7.     api_url = f"https://api.github.com/users/{username}"
  8.     # 构建请求头,包括认证信息
  9.     headers = {
  10.         "Authorization": f"Bearer {access_token}",
  11.         "Accept": "application/json"  # 指定响应数据格式为 JSON
  12.     }
  13.     # 发送 GET 请求
  14.     response = requests.get(api_url, headers=headers)
  15.     # 检查响应状态码
  16.     if response.status_code == 200:
  17.         # 解析 JSON 响应
  18.         user_data = response.json()
  19.         # 打印用户信息
  20.         print(f"GitHub 用户名: {user_data['login']}")
  21.         print(f"用户ID: {user_data['id']}")
  22.         print(f"粉丝数: {user_data['followers']}")
  23.     else:
  24.         print(f"请求失败,状态码: {response.status_code}")
  25.         print(f"错误信息: {response.text}")
  26. # 构建一个token列表, 代表多个Github用户的token凭证
  27. token_lst = [
  28.     'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  29.     'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  30. ]
  31. # 假设构建一个含有8888个用户名的列表
  32. username_lst = []
  33. for i in range(8888):
  34.     username_lst.append("YuDongPan")
  35. # 使用ThreadPoolExecutor创建线程池,控制并发数量
  36. with ThreadPoolExecutor(max_workers=10) as executor:
  37.     # 将每个用户名提交给线程池中的线程进行获取用户信息
  38.     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根据即可。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表