65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Python 和 Twilio SMS 跟踪 GitHub Pull Requests

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2018 年 9 月 28 日

CPOL
viewsIcon

8192

在本教程中,我将指导您完成构建 GitHub 拉取请求通知系统开头的步骤。

如果您正在处理 GitHub 上一个紧急项目,并且与其他开发人员一起工作,那么通过 SMS 接收即时通知会很方便。但是,开箱即用的 SMS 选项却没有!所以我说,“是时候了;我将开始我自己的通知系统!”

在本教程中,我将指导您完成构建 GitHub 拉取请求通知系统开头的步骤。更具体地说,我们将使用 Python 中的 GitHub 和 Twilio API,在提交新的拉取请求时发送文本通知。

入门

首先,我们必须设置我们的环境。本指南是用 Python 3.6 编写的。如果您还没有,请下载PythonPip。接下来,我们将安装 virtualenv 以创建和激活您的虚拟环境,方法是在命令行中输入以下命令

pip3 install virtualenv==15.1.0
python3 -m venv ghpull
cd ghpull
source ./bin/activate

接下来,您需要通过在项目目录的命令行中安装本教程中将使用的几个包

pip3 install PyGithub==1.39
pip3 install twilio==6.10.0

使用 Twilio 和 GitHub 进行身份验证

由于我们将使用 GitHub 和 Twilio 的 API,如果您还没有,请在此处和此处设置免费帐户。

一旦您有了 GitHub 帐户,您就需要通过选择设置 > 开发者设置 > 个人访问令牌 > 生成新令牌来检索您的 API 密钥。对于范围,请选择“repo”下的所有内容。您的令牌将在下一个屏幕上显示。

一旦您获得了 API 密钥,我们就可以继续编码了。对于这项任务,我们将采用面向对象的方法,所以我们将首先在一个名为 github_notifier.py 的文件中创建一个名为“PullNotifs”的类。我选择了一个类名来反映我正在接收通知的 GitHub 组织名称,但您可以随意选择自己的名称。

在构造函数中,我们将使用之前设置的密钥对 GitHub 和 Twilio 进行身份验证。这对本练习的其余部分很重要,因此请确保您正确执行此操作。您可以在此处找到代码

import github
from twilio.rest import Client
class PullNotifs:
def __init__(self):
        self.git_client = github.Github("username", "key-here")
        self.twilio_client = Client('account-sid', 'auth-token')

在我们继续之前,让我们快速回顾一下 GitHub API 的结构。您之前经过身份验证的 GitHub 客户端 self.git_client 与您的 GitHub 帐户相关联。在我的情况下,这是“lesley2958”,您可以使用函数 git_client.get_user() 检索它。

从您的 GitHub 帐户中,我们需要与该帐户相关的所有仓库。并且从这些仓库中,我们将需要收集每个仓库的所有拉取请求。在构造函数中,我们将为所有仓库的拉取请求初始化一个空列表,并为其关联的计数初始化一个空字典。这将帮助我们跟踪是否提交了新的拉取请求。

class PullNotifs:
					def __init__(self):
        self.git_client = github.Github("username", "key-here")
        self.twilio_client = Client('account-sid', 'auth-token')
        self.pulls = []
        self.pull_counts = {}

收集拉取请求

现在构造函数已设置好,我们可以开始构建方法来完成此操作。之前,我描述了 GitHub API 的结构以及如何检索拉取请求,但让我们在名为 get_all_repos() 的函数中实际构建此方法。

在此函数中,我们首先初始化一个变量 count 为 0,它跟踪构造函数中初始化的列表中的每个仓库的索引。接下来,我们使用 self.git_client.get_user().get_repos() 遍历我们的每个仓库,并将每个仓库的拉取请求追加到 pulls 列表中。同时,我们将仓库的索引初始化为 pull_counts 字典中的数字 0。

    def get_all_repos(self):
        count = 0
        for i in self.git_client.get_user().get_repos():
            self.pulls.append(i.get_pulls('all'))
            self.pull_counts[count] = 0
            count += 1

我们在 get_all_repos() 中创建了仓库索引到值 0 的键值对,因为我们没有计算拉取请求数量的方法。可惜的是,GitHub API 目前不支持返回拉取请求数量的属性。

为了解决这个问题,我们将不得不遍历每个仓库的拉取请求集,并使用另一个 count 变量来计算它们。我们将在一个单独的函数 set_pull_counts 中执行此操作,以免事情变得过于混乱。

def set_pull_counts(self):
        count = 0 
        for repo in self.pulls:
            for j in repo:
                self.pull_counts[count] = self.pull_counts[count] + 1
            count += 1

既然我们有了收集仓库及其拉取请求数量的函数,我们就需要一种方法来检查是否提交了新的拉取请求。由于我们现在保持相当简单,我们只会检查是否提交了新的拉取请求,因此我们的返回值将是一个简单的 True 或 False。

要做到这一点,首先我们检索一个更新后的 pulls 列表,否则我们将比较相同的两个对象。这就是为什么您会再次看到那些嵌套的函数调用,如下所示。接下来,我们创建一个本地计数字典以与构造函数中的字典进行比较。在同一个 check_counts() 函数中,我们检查这两个字典是否等效并返回一个布尔值。

   def check_counts(self):
        counts_check = {}
        count = 0 
        for pl in self.git_client.get_user().get_repos():
            pl_repos = pl.get_pulls('all')
            counts_check[count] = 0
            for repo in pl_repos:
                counts_check[count] = counts_check[count] + 1
            count += 1
        return self.pull_counts == counts_check

最后,我们引入 Twilio API 进行通知。这只需要四行代码就可以向您的号码发送短信。

def send_message(self):
        message = self.twilio_client.messages.create(
            to="YOURNUMBER",  # write 1-555-666-7777 as "15556667777"
            from_="TWILIONUMBER",
            body="You have new pull requests for ADI Labs!")

现在我们已经完成了代码库的所有部分,我们可以将它们全部放在一起

import github
from twilio.rest import Client
class PullNotifs:
def __init__(self):
        self.git_client = github.Github("username", "key-here")
        self.twilio_client = Client( "key-here",  "key-here")
        self.pulls = []
        self.pull_counts = {}
def get_all_repos(self):
        self.pulls = []
        count = 0
        for i in self.git_client.get_user().get_repos():
            self.pulls.append(i.get_pulls('all'))
            self.pull_counts[count] = 0
            count += 1
def set_pull_counts(self):
        count = 0 
        for repo in self.pulls:
            for j in repo:
                self.pull_counts[count] = self.pull_counts[count] + 1
            count += 1
def check_counts(self):
        counts_check = {}
        count = 0 
        for pl in self.git_client.get_user().get_repos():
            pl_repos = pl.get_pulls('all')
            counts_check[count] = 0
            for repo in pl_repos:
                counts_check[count] = counts_check[count] + 1
            count += 1
        return self.pull_counts == counts_check
def send_message(self):
        message = self.twilio_client.messages.create(
            to="+1XXXXXXXXXX",  # put numbers in +1XXXXXXXXXX format
            from_="+1XXXXXXXXXX",
            body="You have new pull requests for ADI Labs!")

使用 __main__ 将它们整合在一起

最后但同样重要的是,在同一个 github_notifier.py 文件中,我们将添加一个 main 来执行代码。

前三行代码初始化类并设置状态。从那里,我们设置一个循环来自动检查是否提交了新的拉取请求。

接下来,我写了一个 while True: 循环来向您展示它是如何工作的。如果发现拉取请求计数存在差异,我们将通过 Twilio 发送通知,并通过两次函数调用更新拉取请求和拉取请求的数量。

if __name__ == "__main__":
    labs = PullNotifs()
    labs.get_all_repos()
    labs.set_pull_counts()
    while True:
        if not labs.check_counts():
            labs.send_message()
            labs.pull_counts = {}
            labs.get_all_repos()
            labs.set_pull_counts()

在拉取请求时触发 Twilio SMS

现在,让我们来测试一下。但首先,您需要一个仓库来进行更改。如果您还没有要测试的仓库,请按照以下步骤创建您的第一个仓库。在 GitHub 上,您应该在右上角看到一个“+”号:单击“新建仓库”选项即可开始。

应该会弹出一个要求提供详细信息的页面,您需要在此处提供名称。为简单起见,您可以只选择“test-repo”,但请务必在单击绿色的“创建仓库”按钮之前单击“使用 README 初始化此仓库”。

要创建拉取请求,您需要创建一个 分支,您很快将在其中进行编辑。要做到这一点,请单击“分支:master”,然后您就可以命名并创建一个新分支,您可以将其命名为“test-branch”。

现在对您仓库中的文件进行任何更改。我建议制作一个 README.md 或添加一些小的东西,比如一个空格或一个换行符。然后转到分叉仓库的“拉取请求”选项卡,如下图所示。要提交拉取请求,请找到并单击绿色的“新建拉取请求”按钮。

您应该会被重定向到一个要求您比较更改的页面。单击“创建拉取请求”按钮以继续该过程。

 

最后,您可以通过单击此最后一个页面上的“创建拉取请求”来确认您的拉取请求提交。最终页面应该看起来像这样,无需采取任何措施。只需坐下来等待您的短信到来!

 

您收到的短信应该看起来像这样

收到通知短信后,您可以始终掌握拉取请求的最新情况!

通知已发送!

使用我们新创建的 Python 应用程序,我们可以持续跟踪我们的拉取请求,因为我们利用了 GitHub 和 Twilio API。但由于两个 API 都非常广泛,您可以扩展此应用程序以包含与您的 GitHub 帐户和关联相关的几乎任何内容的通知。或者,您可以将应用程序自定义为仅在工作时间内发送通知,而不是随时发送通知——无论您想要什么通知,都可以使用这两个 API 来实现。

如果您喜欢您在这里所做的,请查看我的 GitHub(@lesley2958)和Twitter(@lesleyclovesyou)以获取更多!

 

© . All rights reserved.