使用Python和Twilio SMS跟踪GitHub拉取请求

版权声明:派森带你学python,欢迎加群:923414804与群主一起学习 https://blog.csdn.net/weixin_44369414/article/details/85931528

编辑说明

本文位于CodeProject的赞助商的产品展示部分。这些文章旨在为您提供我们认为有用且对开发人员有价值的产品和服务的信息。

如果您正在与其他开发人员一起在GitHub中开展紧急项目,通过SMS立即收到通知非常方便。但是,没有开箱即用的SMS选项!所以我说,“ 够了就够了 ;我会开始自己的通知系统!”

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

入门

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

隐藏   复制代码

<span style="color:#111111"><span style="color:#000000">pip3 install virtualenv==<span style="color:#000080">15</span>.<span style="color:#000080">1</span>.<span style="color:#000080">0</span>
python3 -m venv ghpull
cd ghpull
source ./bin/activate</span></span>

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

隐藏   复制代码

<span style="color:#111111"><span style="color:#000000">pip3 install PyGithub==<span style="color:#000080">1</span>.<span style="color:#000080">39</span>
pip3 install twilio==<span style="color:#000080">6</span>.<span style="color:#000080">10</span>.<span style="color:#000080">0</span></span></span>

使用Twilio和GitHub进行身份验证

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

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

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

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

隐藏   复制代码

<span style="color:#111111"><span style="color:#000000">import github
<span style="color:#339999">from</span> twilio.rest import Client
<span style="color:#0000ff">class</span> PullNotifs:
def __init__(self):
        self.git_client = github.Github(<span style="color:#800080">"</span><span style="color:#800080">username"</span>, <span style="color:#800080">"</span><span style="color:#800080">key-here"</span>)
        self.twilio_client = Client(<span style="color:#800080">'</span><span style="color:#800080">account-sid'</span>, <span style="color:#800080">'</span><span style="color:#800080">auth-token'</span>)</span></span>

在继续之前,让我们快速回顾一下GitHub API的结构。您之前验证过的GitHub客户端self.git_client与您的GitHub帐户相关联。在我的例子中,这是“ lesley2958 ”,您可以使用该功能检索它git_client.get_user()

从您的GitHub帐户,我们需要与之关联的所有回购。从这些回购,我们需要收集每个回购的所有拉动请求。在构造函数中,我们将为所有repo的pull请求初始化一个空列表,并为其关联计数初始化一个空字典。这将有助于我们跟踪是否已提交新的拉取请求。

隐藏   复制代码

<span style="color:#111111"><span style="color:#000000"><span style="color:#0000ff">class</span> PullNotifs:
					<span style="color:#0000ff">def</span> __init__(self):
        self.git_client = github.Github(<span style="color:#800080">"</span><span style="color:#800080">username"</span>, <span style="color:#800080">"</span><span style="color:#800080">key-here"</span>)
        self.twilio_client = Client(<span style="color:#800080">'</span><span style="color:#800080">account-sid'</span>, <span style="color:#800080">'</span><span style="color:#800080">auth-token'</span>)
        self.pulls = []
        self.pull_counts = {}</span></span>

收集拉请求

现在已经设置了构造函数,我们可以开始构建方法来实现这一目标。之前,我描述了GitHub API的结构以及如何检索pull请求,但实际上我们在一个名为的函数中构建了这个方法get_all_ repos()

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

隐藏   复制代码

<span style="color:#111111"><span style="color:#000000">def get_all_repos(self):
    count = <span style="color:#000080">0</span>
    <span style="color:#0000ff">for</span> i <span style="color:#0000ff">in</span> self.git_client.get_user().get_repos():
        self.pulls.append(i.get_pulls(<span style="color:#800080">'</span><span style="color:#800080">all'</span>))
        self.pull_counts[count] = <span style="color:#000080">0</span>
        count += <span style="color:#000080">1</span>
</span></span>

我们创建了repos的索引的键值对,其值为0 get_all_repos(),因为我们没有办法计算pull请求的数量。遗憾的是,GitHub API目前不支持返回拉取请求数的属性。

为了解决这个问题,我们必须遍历每个repo的一组pull请求,并用另一个count变量来计算它们。我们将在一个单独的函数中执行此操作set_pull_counts,因此事情不会太混乱。

隐藏   复制代码

<span style="color:#111111"><span style="color:#000000">def set_pull_counts(self):
        count = <span style="color:#000080">0</span> 
        <span style="color:#0000ff">for</span> repo <span style="color:#0000ff">in</span> self.pulls:
            <span style="color:#0000ff">for</span> j <span style="color:#0000ff">in</span> repo:
                self.pull_counts[count] = self.pull_counts[count] + <span style="color:#000080">1</span>
            count += <span style="color:#000080">1</span></span></span>

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

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

隐藏   复制代码

<span style="color:#111111"><span style="color:#000000">def check_counts(self):
     counts_check = {}
     count = <span style="color:#000080">0</span>
     <span style="color:#0000ff">for</span> pl <span style="color:#0000ff">in</span> self.git_client.get_user().get_repos():
         pl_repos = pl.get_pulls(<span style="color:#800080">'</span><span style="color:#800080">all'</span>)
         counts_check[count] = <span style="color:#000080">0</span>
         <span style="color:#0000ff">for</span> repo <span style="color:#0000ff">in</span> pl_repos:
             counts_check[count] = counts_check[count] + <span style="color:#000080">1</span>
         count += <span style="color:#000080">1</span>
     <span style="color:#0000ff">return</span> self.pull_counts == counts_check
</span></span>

最后,我们引入Twilio API进行通知。这将只用四行代码向您的号码发送短信。

隐藏   复制代码

<span style="color:#111111"><span style="color:#000000">def send_message(self):
        message = self.twilio_client.messages.create(
            to=<span style="color:#800080">"</span><span style="color:#800080">YOURNUMBER"</span>,  # write 1-555-666-7777 <span style="color:#0000ff">as</span> <span style="color:#800080">"</span><span style="color:#800080">15556667777"</span>
            from_=<span style="color:#800080">"</span><span style="color:#800080">TWILIONUMBER"</span>,
            body=<span style="color:#800080">"</span><span style="color:#800080">You have new pull requests for ADI Labs!"</span>)</span></span>

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

隐藏   收缩    复制代码

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

将它与__main__结合在一起

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

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

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

隐藏   复制代码

<span style="color:#111111"><span style="color:#000000"><span style="color:#0000ff">if</span> __name__ == <span style="color:#800080">"</span><span style="color:#800080">__main__"</span>:
    labs = PullNotifs()
    labs.get_all_repos()
    labs.set_pull_counts()
    <span style="color:#0000ff">while</span> True:
        <span style="color:#0000ff">if</span> not labs.check_counts():
            labs.send_message()
            labs.pull_counts = {}
            labs.get_all_repos()
            labs.set_pull_counts()</span></span>

在拉取请求上触发Twilio SMS

现在,让我们来测试一下。但首先,你需要一个回购来改变。如果您还没有回购测试版,请按照以下步骤进行首次回购。在GitHub上,您应该在右上角看到一个“+”符号:单击“新建存储库”选项以开始使用。

将显示询问详细信息的页面,您将被要求提供名称。为简单起见,您只需选择“test-repo”,但在单击绿色“创建存储库”按钮之前,请确保单击“使用README初始化此存储库”。

要发出拉取请求,您需要创建一个分支,您很快就可以进行编辑。要执行此操作,请单击“Branch:master”,然后您可以在其中命名,然后创建一个新分支,您可以将其命名为“test-branch”。

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

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

 

最后,您可以在最后一页再次单击“创建拉取请求”来确认您的拉取请求提交。最后一页应如下所示,无需采取任何行动。只需坐下来等待您的文字通过!

 

您的传入文本应如下所示:

收到通知文本后,您始终可以处理拉取请求!

已发送通知!

使用我们新创建的Python应用程序,我们可以不断跟踪我们的拉取请求,因为我们使用了GitHub和Twilio API。但由于这两个API都非常广泛,您可以扩展此应用程序以包含与您的GitHub帐户和附属关系相关的几乎任何内容的通知。或者,您可以自定义您的应用,以便在工作时间内向您发送通知,而不是通知可以随时发送通知 - 无论您希望收到通知,都可以使用这两个API。

猜你喜欢

转载自blog.csdn.net/weixin_44369414/article/details/85931528