使用 Python 和 Flask 响应短信

短消息服务 (SMS) 文本消息很容易从带有 Web 应用程序编程接口 (API) 的 Python 应用程序发送。Flask 应用程序还可以接收传入的文本消息并仅使用几行 Python 代码回复发件人。

我们需要的工具

本教程适用于 Python 2 和 3。确保您的系统上安装了这两个版本之一。

  • Python 2 或 3
  • pip 和 virtualenv 来处理应用程序依赖性
  • Flask micro web 框架
  • 一个免费的 Twilio 帐户来使用他们的 SMS web API
  • 开源 Twilio Python 帮助程序库
  • Ngrok,用于在我们的 Flask 应用程序在我们的本地开发环境中运行时通过本地主机隧道传输

如果您在安装 pip 和 virtualenv 时需要帮助,请查看如何在 Ubuntu 16.04 LTS 上设置 Python 3、Flask 和 Green Unicorn 指南中的前几个步骤,其中展示了如何为这些工具安装系统包。

安装我们的依赖

我们的代码将使用帮助程序库来更轻松地响应来自 Python 的文本消息。帮助库依赖项和 Flaskcode 库可以从 PyPI 安装到 virtualenv 中。在您的终端中使用以下命令生成一个新的虚拟环境。

virtualenv respondsms

激活虚拟环境。

source respondsms/bin/activate

在我们正确激活 virtualenv 后,命令提示符将更改为如下所示:

使用 pip 命令将 Flask 和 Twilio Python 帮助程序库安装到虚拟环境中。

pip install flask twilio==5.7.0

依赖项已安装,以便我们可以将其与我们的 Python 代码一起使用。现在我们可以编写我们的 Python 应用程序。

构建我们的 Flask Web 应用

我们的 Flask 应用程序将有两个路由:一个用于确保 Web 应用程序正在运行,另一个用于处理传入的 HTTP POST 请求。在您的主目录或您选择存储 Python 项目文件的位置创建一个名为 app.py 的新文件。

app.py 中编写以下代码。您还可以在更易于复制和粘贴的 GitHub Gistif 中查看此代码。

from flask import Flask, Response, request
from twilio import twiml


app = Flask(__name__)


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


@app.route("/twilio", methods=["POST"])
def inbound_sms():
    response = twiml.Response()
    # we get the SMS message from the request. we could also get the 
    # "To" and the "From" phone number as well
    inbound_message = request.form.get("Body")
    # we can now use the incoming message text in our Python application
    if inbound_message == "Hello":
        response.message("Hello back to you!")
    else:
        response.message("Hi! Not quite sure what you meant, but okay.")
    # we return back the mimetype because Twilio needs an XML response
    return Response(str(response), mimetype="application/xml"), 200


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

# 开头的行上的内联注释解释了它们下面的行的作用。 Flask 应用程序使用 @app.route 装饰器定义 URL 路由。我们的应用程序需要两条路线,因此我们定义了两个装饰器。

通过使用 python app.py 运行应用程序来尝试一下。如果您在运行该程序时遇到问题,请确保您的 virtualenv 仍然处于活动状态,以便该应用程序可以使用我们之前安装的 Flask 和 Twilio 代码库。

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

我们的应用程序在本地开发环境中运行时存在一个问题:除非我们使用本地主机隧道,否则我们的服务器无法接收 HTTP POST 请求。

使用 Ngrok 进行本地主机隧道

Ngrok 提供本地主机隧道,以便外部服务可以连接到在本地开发环境中运行的服务器。下载并安装 Ngrok。

我们现在可以在本地运行 Ngrok 并连接在端口 5000 上运行的 Flask 应用程序。在您提取 Ngrok 的目录中,运行此命令。

./ngrok http 5000

太棒了,现在我们可以使用该 Ngrok 转发 URL 从任何具有 Internet 连接的机器访问我们的应用程序。将网络浏览器中的 URL 替换为您自己的转发 URL,就像我在此屏幕截图中所做的那样。

我们只需要一个电话号码,它会通过 POST 请求访问我们的应用程序以响应短信。

获取我们的电话号码

我们可以使用我们的 Flask 应用程序的路由,根据传入的 SMS 消息响应传入的 Web API 请求到 Twilio 电话号码。转到 Twilio 网站并注册一个免费试用帐户以使用他们的 API。如果您已有 Twilio 帐户,请登录您现有的帐户。

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

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

转到管理电话号码屏幕,然后单击要配置以响应入站短信的电话号码。

向下滚动到页面底部附近并查找“消息”标题。修改“A Message Comes in”文本框,使其具有 youngrok 转发 URL 和“/twilio”路由,如屏幕截图所示。

现在按下底部的红色“保存”按钮使我们的更改生效。

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

这个简单的 Flask 应用程序是构建更复杂响应的良好开端,例如添加自然语言处理、构建 SMS Slack 机器人或编写支持 SMS 的 NES 游戏精灵。

下一步是什么?

太棒了,现在我们的 Flask 网络应用程序可以自动响应传入的 SMS 文本消息!认为像 SuperPhone 和 Remind 这样的整个业务都是基于与我们刚刚编写的代码非常相似的代码构建的,这是非常疯狂的。

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

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

赞(0) 打赏

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

支付宝扫一扫打赏

微信扫一扫打赏