跳到内容

如何在 Python 中使用 GitHub API:完整指南

GitHub API 为自动化工作流程、与 GitHub 集成、管理项目和分析数据开辟了一个令人兴奋的可能性世界。作为 Python 开发人员,我们可以充分利用 API 来提高生产力并创建有用的工具。

在这份全面的分步指南中,您将学习如何通过 Python 使用 GitHub API。

为什么将 GitHub API 与 Python 结合使用?

在进入代码之前,让我们看看为什么将 GitHub API 与 Python 结合使用如此强大:

  • 自动化工作流程 – 通过编写脚本来创建问题、打开和合并 PR、发布二进制文件等,消除重复性任务。

  • 提高生产力 – 将自定义工具集成到您的开发环境中以改进工作流程。

  • 管理专案 – 以编程方式管理跨存储库的问题、标签、里程碑。

  • 分析数据 – 从超过 96 万个存储库中挖掘有趣的指标和见解。

  • 集成和扩展 GitHub – 创建自定义 Web 应用程序、可视化、CLI 工具、机器人等!

API 开辟了许多创造性的方法来提高生产力并构建出色的开发人员工具和体验。

GitHub API 概述

GitHub API 提供 RESTful 端点来访问 GitHub 数据和服务。你可以:

  • 管理存储库、要点、问题、拉取请求
  • 与 Git 数据交互 – 提交、分支、标签
  • 检索用户配置文件、组织、团队
  • 搜索代码、问题、存储库、用户
  • 访问元数据、问题、PR、文件、提交
  • 分析社区趋势、项目分叉

更多!

API 使用 JSON 来序列化数据并使用 OAuth 进行身份验证。所有请求都必须通过 HTTPS 发出。

要使用 API,您只需:

  1. 创建 GitHub 帐户
  2. 生成个人访问令牌 用于身份验证
  3. 发出 API 请求并处理响应

现在让我们通过 Python 示例来看看这一点!

发出 GitHub API 请求

蟒蛇的 requests 库可以轻松地与 Web API 进行交互。让我们获取一些 GitHub 用户数据:

import requests

username = "defunkt"
response = requests.get(f"https://api.github.com/users/{username}")

print(response.json())

这会打印如下信息:

{
  "login": "defunkt",
  "id": 2,
  "node_id": "MDQ6VXNlcjI=",
  "avatar_url": "https://avatars.githubusercontent.com/u/2?v=4",
  "gravatar_id": "",
  "url": "https://api.github.com/users/defunkt",
  "html_url": "https://github.com/defunkt",

  //...
}

我们可以通过这种方式访问​​任何未经身份验证的 API 路由。要访问私有数据,我们需要传递一个 认证令牌.

创建 GitHub 个人访问令牌

生成令牌:

  1. 在MyCAD中点击 软件更新 设置 > 开发者设置 > 个人访问令牌
  2. 点击 生成新令牌
  3. 给它一个描述,如“我的 Python 脚本”
  4. 选择您想要的范围/权限
  5. 点击 生成代币

请务必复制令牌 - 您以后无法再次检索它!

常见范围包括:

  • repo – 访问私有存储库
  • admin:org – 管理组织
  • notifications – 访问通知
  • user – 对个人资料信息的读/写访问

让我们使用我们的令牌来创建一个新的存储库:

import requests

token = "ghp_123abcMyToken"

data = {"name": "My New Repo"}

response = requests.post(
  "https://api.github.com/user/repos", 
  json=data,
  headers={"Authorization": f"token {token}"}
)

print(response.status_code) # 201 = Success!

该令牌对我们进行身份验证以创建私有存储库。

您还可以使用 GitHub 应用程序 其具有范围访问权限并且不会像用户令牌一样过期。应用程序必须由用户/组织安装才能获得访问权限。

使用 GitHub 存储库

API 的主要部分涉及管理存储库。让我们看一下一些常见的存储库任务。

获取存储库

要获取存储库的元数据:

response = requests.get("https://api.github.com/repos/pandas-dev/pandas")
repo_info = response.json()

print(repo_info[‘description‘]) 
# Powerful data structures for data analysis, time series, statistics

我们可以访问描述、星级、克隆、贡献者、语言、版本、提交等信息!

列出存储库

列出用户或组织的存储库:

repos_url = "https://api.github.com/users/octocat/repos"
repos = requests.get(repos_url).json()

for repo in repos:
  print(repo[‘name‘]) # Prints names of each repo

创建存储库

我们还可以创建新的存储库:

data = {
  "name": "My New Repo",
  "description": "This is my cool new repo",
  "private": False
}

response = requests.post(
  "https://api.github.com/user/repos", 
  json=data,
  headers={"Authorization": "token {token}"}
) 

删除存储库

要删除存储库:

requests.delete(‘https://api.github.com/repos/octocat/Hello-World‘, 
                headers={"Authorization": "token {token}"})

这使您可以完全控制以编程方式管理存储库。

请注意: 为了安全起见,所有 API 请求都必须使用 HTTPS 发出。

处理存储库中的问题

Issues API 允许管理问题和拉取请求。你可以:

  • 列出/创建/编辑/关闭/重新打开问题
  • 锁定对话、合并 PR
  • 提交和编辑评论
  • 添加标签、受让人、里程碑

例如,要从存储库获取问题:

response = requests.get(‘https://api.github.com/repos/octocat/hello-world/issues‘)
issues = response.json()

for issue in issues:
  print(issue[‘title‘]) # Prints each issue title

这允许您将问题管理集成到外部工具和工作流程中。

使用 Git 数据

Git Data API 提供直接与 Git 存储库交互的端点。你可以:

  • 管理分支和标签
  • 读取/写入 blob 数据
  • 检索提交、引用、树
  • 比较提交、引用、文件

例如,要从存储库获取提交:

commits_url = "https://api.github.com/repos/pandas-dev/pandas/commits"
commits = requests.get(commits_url).json()

for commit in commits:
  print(commit[‘sha‘]) # Print commit SHAs
  print(commit[‘commit‘][‘message‘]) # Print messages

这提供了以编程方式管理 Git 存储库的完整访问权限。

搜索存储库和代码

GitHub 的搜索 API 允许查询超过 96 万个公共存储库中的几乎所有内容。

例如,要查找与数据科学相关的 Python 项目:

import requests

query = "language:python data science in:readme"
response = requests.get("https://api.github.com/search/repositories", 
                        params={"q": query})

results = response.json()[‘items‘]
for result in results:
  print(result[‘name‘]) # Prints names of matching repos 

搜索查询语法支持布尔运算符、过滤器、上下文选择等来制定有针对性的搜索。

一些例子:

  • org:facebook language:python stars:>5000 – Facebook 组织中拥有超过 5 颗星的 Python 存储库
  • filename:requirements.txt django – 包含 Django 的requirements.txt 的仓库
  • user:defunkt location:san francisco – 如果位置是 SF,则查找 defunkt 的存储库

搜索 API 开辟了许多创造性的方法来从 GitHub 的开放数据中挖掘有趣的数据集和见解。

使用 GitHub 的 GraphQL API

除了 REST API 之外,GitHub 还提供 GraphQL API 以实现更灵活的查询。

GraphQL 允许您在嵌套 JSON 结构中精确指定所需的数据。您可以在一个请求中查询多个链接实体。

例如,在这里我们查询用户的个人资料数据及其存储库名称:

import requests 

query = """
query {
  user(login:"defunkt") {
    name
    repositories(first:10) {
      nodes { 
        name 
      }
    }
  }
}
"""

response = requests.post(‘https://api.github.com/graphql‘, json={‘query‘: query})
print(response.json())

这可以形成您需要的准确响应。这 GraphQL 浏览器 帮助交互式地构建查询。

将 GitHub API 集成到应用程序中

现在您已经了解了基础知识,让我们看看使用 GitHub API 构建应用程序。

OAuth应用程序授权

对于网络应用程序,请使用 GitHub OAuth 用于授权而不是硬编码令牌。这允许用户撤销访问权限。

  1. 注册新的 OAuth 应用程序
  2. 使用 Client ID 和 Secret 进行授权
  3. 重定向用户以请求 GitHub 访问权限

现在您的应用程序可以代表用户进行 API 调用。

发出经过身份验证的请求

授权后,使用访问令牌进行调用:

access_token = "abc123xxddff" # OAuth token 

response = requests.get(
  "https://api.github.com/user/repos",
  headers={"Authorization": f"token {access_token}"}
)

print(response.json()) # Print user‘s private repos

这使您可以根据用户的权限访问私有数据。

速率限制

GitHub API 对请求有速率限制。监控您的应用程序的状态:

response = requests.get("https://api.github.com/users/octocat") 

print(response.headers[‘X-RateLimit-Limit‘]) # 5000
print(response.headers[‘X-RateLimit-Remaining‘]) # 4999

随着时间的推移分散请求并缓存数据以避免限制。

优雅地处理错误

始终检查状态代码并正确处理错误:

response = requests.get(‘https://api.github.com/invalid/url‘)

if response.status_code == 404:
  print("Resource not found!") 
elif response.status_code == 403:
  print("You do not have access!")
else:
  print("An error occurred.")

这可以确保您的应用程序在生产中保持稳定。

通过遵循 API 最佳实践,您可以为开发人员构建强大的集成和工具。

构建 GitHub 仪表板应用程序

让我们将通过构建一个 Web 应用程序来使用 Flask 查看 GitHub 个人资料和存储库所学到的知识结合起来:

# app.py

from flask import Flask
import requests
from github import Github # pyGithub library

app = Flask(__name__)

@app.route("/")
def dashboard():
  # Use access token for API requests
  github = Github("access_token123xxdd")

  # Fetch user profile info
  user = github.get_user()

  # Fetch list of repos
  repos = user.get_repos() 

  # Pass info to template
  return render_template("dashboard.html", user=user, repos=repos)

if __name__ == "__main__":
  app.run(debug=True)

我们使用 pyGithub 来简化一些 API 交互。主页将呈现 dashboard.html 模板:

<!-- dashboard.html -->

<h3>GitHub Dashboard for {{user.name}}</h3>

<img src="{{user.avatar_url}}" style="width:64px">

<h4>Your Repositories</h4>

<ul>
  {% for repo in repos %}
  <li>{{repo.name}}</li>
  {% endfor %}
</ul>

这展示了如何构建一个应用程序来为登录用户显示 GitHub 数据!

将 API 集成到您自己的应用程序和工具中的可能性是无限的。

使用 GitHub API 的最佳实践

以下是一些最佳实践,可确保您使用 GitHub API 的应用程序高性能、安全且健壮:

  • 认证 – 使用令牌或 OAuth,避免发送原始用户名/密码。
  • HTTPS – 始终使用 HTTPS 端点来保护数据。
  • 速率限制 – 分散请求并缓存数据以避免限制。
  • 分页 – 使用页面参数迭代结果集。
  • 错误处理 – 优雅地处理 4xx 和 5xx 错误。
  • 测试 – 彻底测试 API 调用,使用模拟进行迭代。
  • 配套文档 – 仔细阅读文档,它们为每个端点提供了代码示例。

遵循 API 最佳实践可以防止可避免的错误并确保应用程序可靠。

其他值得探索的 GitHub API 功能

我们仅触及了 GitHub API 功能的皮毛。以下是一些其他值得查看的很酷的功能:

  • GitHub 操作 API – 通过使用 API 触发操作来自动化工作流程
  • GitHub页面 – 以编程方式管理页面站点
  • 要点 – 管理代码片段、配置和模板
  • 组织 – 管理组织团队、成员和权限
  • Git 数据库 – 直接访问 Git 对象数据,例如 blob 和树
  • GitHub 市场 API – 管理 GitHub Marketplace 中列出的应用程序
  • GitHub 讨论 API – 建立社区论坛和问答集成

API 功能随着 GitHub 添加新功能而扩展,因此请密切关注新端点。

将 GitHub 的 API 与替代方案进行比较

对于使用其他平台的开发人员来说,GitHub 的 API 与 GitLab、BitBucket、Azure DevOps 等竞争对手相比如何?

总体而言,GitHub 的 API 功能在以下方面脱颖而出:

  • 采用 – 迄今为止最大的用户群和社区
  • 配套文档 – 非常详尽的文档和示例
  • REST + GraphQL – REST 和 GraphQL 端点的灵活性
  • 搜索功能 – 跨所有公共数据的强大索引搜索
  • 生态系统 – 庞大的应用程序、工具和集成生态系统
  • 代码分析 – 代码扫描、linting 和质量分析功能

由于其规模和多年的发展,GitHub 在 API 功能方面显然处于领先地位。 GitLab 和 BitBucket 等其他提供商正在扩展 API 功能以进行竞争。但目前 GitHub 仍然是用于以编程方式与 Git 存储库交互的功能最齐全的 API。

后续步骤和资源

我希望本指南能够全面概述如何通过 Python 使用 GitHub API!

以下是进一步学习的一些后续步骤和资源:

GitHub API 为构建开发人员工具、自动化工作流程、管理项目和分析数据开辟了一个充满可能性的世界。我希望您能受到启发,为社区创造一些有价值的东西!

编码愉快!

加入谈话

您的电邮地址不会被公开。 必填带 *