使用 Python 和 Bottle 回复短信

Python 应用程序可以使用网络 API 轻松发送短信。使用 Bottle 框架构建的网络应用程序还可以通过处理入站 HTTP POST 网络挂钩来回复传入的文本消息。在本文中,我们将快速介绍如何设置 Bottle 网络应用程序来处理 HTTP POST 请求形式的 SMS 数据。

我们需要的工具

本教程适用于 Python 2 或 3,尽管社区建议新应用程序使用 Python 3。在您的系统上安装这两个 Python 版本之一以用于本演练。我们还需要:

  • pip 和 virtualenv 来处理应用程序依赖性
  • Bottle web 框架
  • 当我们的 Bottle 应用程序在我们的本地开发环境中运行时,用于本地主机隧道的 Ngrok
  • 免费的 Twilio 帐户以使用他们的 SMS Web API
  • 开源 Twilio Python 帮助程序库,版本 5.7.0 或更早

如果您在配置开发环境方面需要帮助,请查看有关如何在 Ubuntu 16.04 LTS 上设置 Python 3、Bottle 和 Gunicorn 的指南。

应用依赖安装

我们的应用程序将使用帮助程序代码库来回复入站短信。Bottle 和帮助程序库可从 PyPI 安装到虚拟环境中。打开您的终端并使用 virtualenv 命令创建一个新的 virtualenv:

virtualenv replysms

调用 virtualenv 的 activate 脚本,使其成为“活动的”Python 安装。请注意,您需要在每个要使用此 virtualenv 的终端窗口中执行此操作。

source replysms/bin/activate

激活 virtualenv 后命令提示符将发生变化:

使用 pip 命令将 Bottle 和 Twilio Python 包安装到您的虚拟环境中。

pip install bottle twilio==5.7.0

我们已经安装了所需的依赖项,因此现在在激活 virtualenv 的情况下运行的 Python 代码将能够使用这些包。是时候构建我们​​的 Bottle 网络应用程序并回复收到的短信了。

编写我们的 Bottle 应用程序

Bottle 网络应用程序将有两条路线。一条路线将允许我们测试该应用程序是否正在运行。另一个路由将处理和响应来自 Twilio 的传入 HTTP POST 请求。在您要存储此 Python 项目的目录中创建一个名为 app.py 的新文件。

在新的app.py文件中写入如下代码。还有一个 GitHub Gist,其中包含您可以复制和粘贴的代码。

from bottle import (post, request, response, route, run, )
from twilio import twiml


@route('/')
def check_app():
    # returns a simple string stating the app is working
    return "It works!"


@post('/twilio')
def inbound_sms():
    twiml_response = twiml.Response()
    # grab message from the request. could also get the "To" and 
    # "From" phone numbers as well from parameters with those names
    inbound_message = request.forms.get("Body")
    # we can now use the incoming message text in our Python application
    if inbound_message == "Hello":
        twiml_response.message("Hello from Bottle right back at you!")
    else:
        twiml_response.message("Hi! Not quite sure what you meant, but okay.")
    # we return back the mimetype because Twilio needs an XML response
    response.content_type = "application/xml"
    return str(twiml_response)


if __name__ == '__main__':
    run(host='127.0.0.1', port=5000, debug=True, reloader=True)

# 开头的行是注释,解释它们下面的代码行在做什么。 Bottle Web 应用程序使用 @route@post 装饰器定义 URL 路由,具体取决于路由应处理的 HTTP 请求类型。

确保您的虚拟环境仍然处于活动状态,以便应用程序可以使用我们之前安装的 Bottle 和 Twilio 代码库。通过使用 python app.py 运行应用程序来尝试一下。

打开网络浏览器并转到 localhost:5000(或 127.0.0.1:5000)。我们应该看到“它有效!”在屏幕上。

在 Ubuntu 上本地运行的 Bottle 应用程序。

但是,我们在本地开发环境中运行的 Web 应用程序存在问题。除非创建本地主机隧道,否则 Twilio 无法将 HTTP POST 请求发送到 Web 应用程序服务器。

Ngrok 本地主机隧道

Ngrok 是一种本地主机隧道工具,可将您的本地开发环境桥接到外部 URL。下载并安装适合您的操作系统的 Ngrok 版本。

我们可以在本地运行 Ngrok 并公开在端口 5000 上运行的 Bottle 应用程序。在 Ngrok 可执行文件所在的目录中运行此命令。

./ngrok http 5000

Ngrok 已启动并运行以用作本地主机隧道。

太棒了,现在我们可以使用转发 URL,这样 Twilio 就可以在有入站短信时向我们的应用程序发送 POST 请求。将文本框中的 URL 替换为您自己的转发 URL,就像我在此屏幕截图中所做的那样。

将 ngrok 转发 URL 粘贴到 Twilio webhook 配置文本框中。

现在我们只需要一个 Twilio 电话号码,它会在有入站短信时向我们的应用程序发送 POST 请求。

获取电话号码

我们的 Bottle Web 应用程序的路由可以响应传入的 POST 请求,但我们需要使用 Twilio 获得一个电话号码,将入站 SMS 数据转换为 POST 请求。在您的网络浏览器中,转到 Twilio 网站并注册一个免费帐户。如果您已经拥有一个,也可以登录现有的 Twilio 帐户。

Twilio 注册屏幕。

Twilio 试用帐户允许您向您自己经过验证的电话号码发送和接收短信。要向任何电话号码发送和回复短信,您需要升级您的帐户。试用帐户非常适合在您的应用程序上线之前进行初始开发。

注册后,您会收到一个免费的 Twilio 电话号码。我们可以通过设置响应 webhook 配置该电话号码以将 SMS 信息转发到我们的 web 应用程序。

转到管理电话号码屏幕,然后单击您要配置的用于回复短信的电话号码。

向下滚动并查找“消息”标题。更改“A Message Comes in”文本框以输入 ngrok 转发 URL 加上“/twilio”路由,如下面的屏幕截图所示。

将 ngrok 转发 URL 粘贴到 Twilio webhook 配置文本框中。

单击“保存”按钮使我们的更改生效。

我们的应用程序已准备就绪 – 是时候试试我们的电话号码了!向您的电话号码发送“你好”或任何您想要的文字。这是我的 iPhone 上的结果。

iPhone 上短信回复的示例屏幕截图。

简洁的 Bottle 网络应用程序是构建更复杂程序(例如选择您自己的冒险演示或 SMS Slack 机器人)的良好开端。

下一步是什么?

太棒了,我们的 Bottle 应用程序现在可以回复入站 SMS 文本消息!

有问题吗?通过 Twitter@fullstackpython 或@mattmakai 与我联系。我也在 GitHub 上,用户名是 mattmakai。

看到这篇文章有什么问题了吗?在 GitHub 上创建此页面的源代码并提交拉取请求。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏