使用 Python 和 Twilio SMS 跟踪 GitHub Pull Requests





0/5 (0投票)
在本教程中,我将指导您完成构建 GitHub 拉取请求通知系统开头的步骤。
如果您正在处理 GitHub 上一个紧急项目,并且与其他开发人员一起工作,那么通过 SMS 接收即时通知会很方便。但是,开箱即用的 SMS 选项却没有!所以我说,“是时候了;我将开始我自己的通知系统!”
在本教程中,我将指导您完成构建 GitHub 拉取请求通知系统开头的步骤。更具体地说,我们将使用 Python 中的 GitHub 和 Twilio API,在提交新的拉取请求时发送文本通知。
入门
首先,我们必须设置我们的环境。本指南是用 Python 3.6 编写的。如果您还没有,请下载Python和Pip。接下来,我们将安装 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)以获取更多!