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

本文讲述了如何破除GitHubAPI的访问次数限制,包括介绍Github的基本功能,API接口的使用方法,访问限制的类别,以及通过多线程和使用多个认证令牌实现限制突破的实例。
摘要由CSDN通过智能技术生成

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 使用方法

  1. 创建一个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加了马赛克)。
    在这里插入图片描述

  2. 使用API Key发起API请求

    有了API Key后,就能够以最大限度地访问Github API了。本文给出一个使用Python语言访问Github API接口的实例。

    首先,确保已经安装了requests库:

    pip install requests
    

    然后,使用以下的Python代码。 以下代码给出了通过requests向Github API发送Get请求,获取指定Github用户名、用户ID与粉丝数的实现逻辑:

    import 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代码示例:

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凭证即可。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Dart语言支持调用GitHub API接口,可以使用GitHub的REST API来实现。要实现给GitHub上的项目打星,可以使用starEndpoint API来实现,具体的步骤如下: 1. 使用GitHub的OAuth2.0授权机制,获取访问令牌。 2. 使用令牌,调用starEndpoint API,传入需要给项目打星的项目信息。 3. 根据API返回的响应,检查是否给项目成功打星。 ### 回答2: 使用Dart调用GitHub APIGitHub上的项目打星可以通过以下步骤实现: 1. 首先,您需要在您的Dart项目中导入http包,使用它来发送HTTP请求并与GitHub API进行通信。 ```dart import 'package:http/http.dart' as http; ``` 2. 接下来,您需要设置GitHub API的请求头,以便进行身份验证。在GitHub上生成一个访问令牌,并将其作为请求头的Authorization字段。 ```dart String baseUrl = "https://api.github.com"; String token = "YOUR_GITHUB_ACCESS_TOKEN"; Map<String, String> headers = { "Accept": "application/vnd.github.v3+json", "Authorization": "token $token", }; ``` 3. 调用GitHub API中的“给存储库打星”接口,向存储库发送一个PUT请求。在请求中,您需要提供存储库的所有者名称和存储库名称。 ```dart String owner = "OWNER_NAME"; String repository = "REPOSITORY_NAME"; String url = "$baseUrl/user/starred/$owner/$repository"; http.Response response = await http.put(url, headers: headers); if (response.statusCode == 204) { print("成功为存储库打星!"); } else { print("无法为存储库打星:${response.reasonPhrase}"); } ``` 在上面的代码示例中,我们使用了await关键字,这意味着我们需要将代码放在一个异步函数内部。这样可以确保我们在等待从GitHub API获得的响应时,不会阻塞Dart的执行。 请注意,您需要将“OWNER_NAME”和“REPOSITORY_NAME”替换为实际的存储库所有者和存储库名称。 通过以上步骤,您可以使用Dart调用GitHub API实现给GitHub上的项目打星功能。 ### 回答3: 在使用Dart实现调用GitHub APIGitHub上的项目打星时,可以按照以下步骤进行: 第一步,确保已经在自己的Dart项目中引入了http包,可通过在`pubspec.yaml`文件中添加`http: ^0.12.0`依赖并运行`pub get`命令来安装。 第二步,导入http包和dart:convert包: ```dart import 'package:http/http.dart' as http; import 'dart:convert'; ``` 第三步,构建函数来调用GitHub API,为特定的GitHub项目打星: ```dart Future<void> starGitHubProject(String owner, String repo, String accessToken) async { final url = 'https://api.github.com/user/starred/$owner/$repo'; final response = await http.put( Uri.parse(url), headers: { 'Authorization': 'token $accessToken', 'Content-Length': '0', }, ); if(response.statusCode == 204){ print('成功给项目打星'); } else{ print('给项目打星失败:${response.statusCode}'); } } ``` 上述函数接收三个参数:`owner`表示GitHub项目的拥有者,`repo`表示GitHub项目的仓库名称,以及`accessToken`表示用户的访问令牌,用于进行身份认证。 最后,我们可以调用上述函数来给GitHub上的项目打星,例如: ```dart void main() async { final owner = '拥有者用户名'; final repo = '项目仓库名称'; final accessToken = '访问令牌'; await starGitHubProject(owner, repo, accessToken); } ``` 以上是使用Dart通过调用GitHub APIGitHub上的项目打星的简单示例代码。请注意,需要替换示例代码中的`owner`、`repo`和`accessToken`为自己合适的值才能正常运行。同时,为确保用户的访问安全,更推荐将访问令牌保存在安全的地方,而不直接硬编码在代码中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值