用Python和Twilio发送预定的短信

615 阅读8分钟

Twilio的宗旨是为通信提供动力--而且是方便快捷的。我们的可编程信息服务已经提供了很长时间,但直到现在,将信息安排在未来某个时间发送,还需要开发者使用他们自己的调度解决方案。

幸运的是,现在这已成为过去!有了消息调度,你可以通过一个API调用来发送你预定的短信,而无需使用自定义调度器。

在本教程中,你将学习如何在Python中发送预定短信通知。

教程要求

  • Python 3.6或更新版本。如果你的操作系统没有提供Python解释器,你可以去python.org下载一个安装程序。
  • 一个Twilio账户。如果你是Twilio的新手,请点击这里,现在就可以创建一个免费账户,当你升级到付费账户时,可以获得10美元的积分。你可以查看免费Twilio账户的功能和限制
  • 一部能够接收短信和/或WhatsApp信息的智能手机,以测试该项目。

购买一个Twilio手机号码

如果你还没有这样做,你的第一个任务是购买一个Twilio电话号码来发送短信。

登录Twilio控制台,选择电话号码,然后点击 "购买号码 "按钮来购买一个Twilio号码。注意,如果你有一个免费账户,你将使用你的试用信用来购买。

在 "购买号码 "页面,选择你的国家,并在 "功能 "栏中勾选短信。如果你想申请一个你所在地区的号码,你可以在 "号码 "栏中输入你的区号。

Buy a Twilio phone number

点击 "搜索 "按钮,看看有哪些号码可用,然后从结果中点击 "购买 "你喜欢的号码。在你确认你的购买后,点击 "关闭 "按钮。

配置信息服务

目前,预定信息只能从信息服务中发送,所以下一步是配置一个信息服务,并将你的Twilio电话号码添加到其中。

仍然在控制台中,找到 "Messaging "产品,点击它的服务选项。然后点击 "创建消息服务 "按钮。

在创建过程的第一页,为该服务输入一个友好的名字,如 "约会",并在 "选择你想使用消息服务的内容 "下拉菜单中选择 "通知我的用户"。

Create messaging service page 1

点击 "创建消息服务 "按钮,进入第二步。

在配置的这一部分,你必须把发件人电话号码添加到服务使用的发件人池中。点击 "添加发件人 "按钮,添加你在前一部分获得的Twilio电话号码。

Create messaging service part 2

在 "发件人类型 "下拉菜单中选择电话号码,然后点击 "继续"。

在你想作为发件人的电话号码旁边添加一个复选标记,然后点击 "添加电话号码"。

Add senders to messaging service

点击 "第3步:设置整合 "按钮,进入下一步。你不必改变本页的任何设置,只需点击 "第4步:添加合规信息"。

要完成信息服务的配置,请点击 "完成信息服务设置"。现在您可以选择发送一条测试信息。

Messaging service setup complete

测试你的信息服务是否能够发送信息是一个好主意,所以继续点击 "尝试发送信息"。

在 "发往电话号码 "下拉菜单中,选择你的个人号码,这个号码应该是在你的Twilio账户中注册和验证的。在 "来自信息服务SID "中,选择你刚刚创建的信息服务。在 "正文 "中输入一些自己要发送的文本。

Send test SMS

点击 "发送测试短信 "按钮,并确保你的手机收到短信。

Python项目设置

在本节中,你将设置一个全新的Python项目。为了使事情井井有条,打开终端或命令提示符,找到一个合适的地方,并创建一个新的目录,你将要创建的项目就在这个目录中。

mkdir python-scheduled-sms
cd python-scheduled-sms

创建一个虚拟环境

按照Python的最佳实践,你现在要创建一个虚拟环境,在那里安装本项目所需的Python包。

如果你使用的是 Unix 或 Mac OS 系统,打开一个终端,输入以下命令。

python3 -m venv venv
source venv/bin/activate

如果你在Windows上学习本教程,在命令提示符窗口中输入以下命令。

python -m venv venv
venv\Scripts\activate

激活了虚拟环境,你就可以安装Python的Twilio辅助库了。

pip install twilio

为了用Twilio发送短信,Python应用程序需要访问你的Twilio账户凭证来进行验证。此外,它还需要与你刚刚创建的消息服务相关的SID。

定义这些配置值的最方便的方法是为它们设置环境变量。在bash或zsh会话中,你可以按以下方式配置这些设置。

export TWILIO_ACCOUNT_SID=xxxxxxxxx
export TWILIO_AUTH_TOKEN=xxxxxxxxx
export TWILIO_MESSAGING_SERVICE_SID=xxxxxxxxx

如果你是在Windows上学习本教程,在你的命令提示窗口中使用set ,而不是export

你需要将所有的xxxxxxxxx 占位符替换为适用于你的账户的正确值。前两个变量是你的Twilio "账户SID "和你的 "Auth Token"。你可以在Twilio控制台主页面的仪表板上的 "账户信息 "下找到它们。

Twilio credentials in the Console

TWILIO_MESSAGING_SERVICE_SID 变量是分配给Messaging Service的SID 。你可以在Twilio Console的Messaging Services页面中找到它。这个标识符以字母MG 开始。

用Python发送一个预定的短信

现在你已经准备好开始编写Python应用程序的代码了。

在你的文本编辑器或IDE中打开一个名为scheduled_sms.py的新文件,在其中输入这段代码。

from datetime import datetime, timedelta
import os
from twilio.rest import Client

# create a Twilio client
account_sid = os.environ['TWILIO_ACCOUNT_SID']
auth_token = os.environ['TWILIO_AUTH_TOKEN']
client = Client(account_sid, auth_token)

# schedule message to be sent 61 minutes after current time
send_when = datetime.utcnow() + timedelta(minutes=61)

# send the SMS
messaging_service_sid = os.environ['TWILIO_MESSAGING_SERVICE_SID']
message = client.messages.create(
    from_=messaging_service_sid,
    to='+1xxxxxxxxxx',  # ← your phone number here
    body='Friendly reminder that you have an appointment with us next week.',
    schedule_type='fixed',
    send_at=send_when.isoformat() + 'Z',
)

print(message.sid)

这个简短的应用程序创建了一个Twilio客户端对象的实例,并用来自你先前配置的环境变量的账户SID和Auth Token值来初始化它。

send_when 变量被设置为一个datetime 对象,它代表了短信应该被发送的时间。消息调度功能目前要求这个时间是提前1小时以上,少于7天。由于这只是一个练习,我把发送时间设置为61分钟以后,以尽快得到短信。

client.messages.create() 是用来创建和安排短信的。这个函数接受标准的from_,tobody 参数,分别定义短信的发送人、接收人和正文。这些参数对即时发送和计划发送都是一样的。注意,from_ 以下划线结尾,因为from 是Python中的一个保留关键字。

对于from_ 参数,使用短信服务的SID 。对于to ,输入E.164格式的个人电话号码。body 参数可以是你想给自己发送的任何东西。

剩下的两个参数用来告诉Twilio这个短信应该在以后的时间发送。schedule_type 参数配置了你想使用的调度类型。在我写这篇文章的时候,这个参数的唯一允许值是字符串’fixed’send_at 参数配置了应该发送消息的时间。这个参数必须以ISO 8601格式给出。在Python中,可以使用datetime.isoformat() 方法来获得所需的格式,但需要注意的是,默认情况下,Python中的datetime 对象没有与之相关的时区。在结尾处添加的Z 指定了UTC时区。如果你使用的datetime 对象是有时区意识的,那么不要附加Z 。如果你使用的datetime 对象是没有时区意识的,但它们不是UTC,那么根据ISO 8601规范,附加适当的时区代码。

应用程序会打印分配给预定信息的sid 值。这是一个标识符,如果你需要,你可以用它来取消信息

准备好尝试这个了吗?

确保你已经为client.messages.create 调用的to 参数输入了你自己的电话号码,然后在项目的根目录下运行Python脚本,如下所示。

python scheduled_sms.py

你应该看到一个打印到终端的代码,以字母SM 开始。这就是你的信息的标识符。如果你看到这个代码,那么你就知道消息被成功调度了。

现在你必须等待61分钟才能在你的手机上收到这条短信!在此期间,你可以在Twilio控制台的可编程信息日志部分查看该信息,在该部分下,信息的状态将显示为 "预定",直到发送时间。

Programmable Messaging Logs before delivery

当一小时过去,你的短信被送达时,信息的状态将变为 "已送达"。你也能看到你的Twilio电话号码作为发件人。

Programmable Messaging Logs after delivery

接下来的步骤

祝贺你学会了如何用Python发送预定的短信!有许多关于调度短信的资源,你可能想回顾一下以了解更多。

我很想看看你用Twilio和消息调度建立了什么!

*Miguel Grinberg*是Twilio的技术内容首席软件工程师。请通过以下方式联系他 *mgrinberg [at] twilio [dot] com*如果你有一个很酷的项目想在这个博客上分享,请联系他。