Twilio技能使用说明
2026-03-28
新闻来源:网淘吧
围观:15
电脑广告
手机广告
Twilio
通过托管的OAuth认证访问Twilio API。发送短信、拨打电话、管理电话号码,并操作Twilio资源。
快速开始
# List all accounts
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/twilio/2010-04-01/Accounts.json')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
基础URL
https://gateway.maton.ai/twilio/2010-04-01/Accounts/{AccountSid}/{resource}.json
网关将请求代理至api.twilio.com并自动注入您的OAuth令牌。
重要提示:大多数Twilio端点都需要在路径中包含您的账户SID。您可以从/Accounts.json端点获取您的账户SID。
认证
所有请求都需要在Authorization标头中包含Maton API密钥:
Authorization: Bearer $MATON_API_KEY
环境变量:将您的API密钥设置为MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
获取您的API密钥
连接管理
请在以下网址管理您的Twilio OAuth连接https://ctrl.maton.ai。
列出连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=twilio&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
创建连接
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'twilio'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
获取连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
响应:
{
"connection": {
"connection_id": "ebe566b1-3eaf-4926-bc92-0d8d47445f12",
"status": "ACTIVE",
"creation_time": "2026-02-09T23:18:44.243582Z",
"last_updated_time": "2026-02-09T23:19:55.176687Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "twilio",
"metadata": {}
}
}
在浏览器中打开返回的网址以完成OAuth授权。
删除连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
指定连接
如果您有多个Twilio连接,请使用Maton-Connection请求头指定要使用的连接:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/twilio/2010-04-01/Accounts.json')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', 'ebe566b1-3eaf-4926-bc92-0d8d47445f12')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
如果省略,网关将使用默认(最早创建的)活动连接。
API参考
账户
列出账户
GET /twilio/2010-04-01/Accounts.json
响应:
{
"accounts": [
{
"sid": "ACf5d980cd4b3f7604a464afaec191fc60",
"friendly_name": "My first Twilio account",
"status": "active",
"date_created": "Mon, 09 Feb 2026 20:19:55 +0000",
"date_updated": "Mon, 09 Feb 2026 20:20:05 +0000"
}
]
}
获取账户
GET /twilio/2010-04-01/Accounts/{AccountSid}.json
消息(短信/彩信)
列出消息
GET /twilio/2010-04-01/Accounts/{AccountSid}/Messages.json
查询参数:
每页条数- 每页结果数量(默认:50)收件人- 按收件人电话号码筛选发件人- 按发件人电话号码筛选发送日期- 按发送日期筛选
响应:
{
"messages": [
{
"sid": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"body": "Hello!",
"from": "+15551234567",
"to": "+15559876543",
"status": "delivered",
"date_sent": "Mon, 09 Feb 2026 21:00:00 +0000"
}
],
"page": 0,
"page_size": 50
}
获取消息
GET /twilio/2010-04-01/Accounts/{AccountSid}/Messages/{MessageSid}.json
发送消息
POST /twilio/2010-04-01/Accounts/{AccountSid}/Messages.json
Content-Type: application/x-www-form-urlencoded
To=+15559876543&From=+15551234567&Body=Hello%20from%20Twilio!
必需参数:
收件人- 收件人电话号码(E.164格式)发件人- Twilio电话号码或消息服务SID正文- 消息文本(最多1600个字符)
可选参数:
消息服务SID- 用于消息路由,可替代“发件人”参数媒体网址- 用于发送(彩信)的媒体文件URL状态回调- 用于状态更新的Webhook URL
响应:
{
"sid": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"body": "Hello from Twilio!",
"from": "+15551234567",
"to": "+15559876543",
"status": "queued",
"date_created": "Mon, 09 Feb 2026 21:00:00 +0000"
}
更新消息(编辑)
POST /twilio/2010-04-01/Accounts/{AccountSid}/Messages/{MessageSid}.json
Content-Type: application/x-www-form-urlencoded
Body=
将Body设置为空字符串可编辑消息内容。
删除消息
DELETE /twilio/2010-04-01/Accounts/{AccountSid}/Messages/{MessageSid}.json
成功时返回204 No Content。
通话(语音)
列出通话
GET /twilio/2010-04-01/Accounts/{AccountSid}/Calls.json
查询参数:
页面大小- 每页结果数状态- 按状态筛选(排队中、响铃中、进行中、已完成等)收件方- 按接收方筛选发件方- 按呼叫方筛选
响应:
{
"calls": [
{
"sid": "CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"from": "+15551234567",
"to": "+15559876543",
"status": "completed",
"duration": "60",
"direction": "outbound-api"
}
],
"page": 0,
"page_size": 50
}
获取通话
GET /twilio/2010-04-01/Accounts/{AccountSid}/Calls/{CallSid}.json
发起通话
POST /twilio/2010-04-01/Accounts/{AccountSid}/Calls.json
Content-Type: application/x-www-form-urlencoded
To=+15559876543&From=+15551234567&Url=https://example.com/twiml
必填参数:
致- 接收方电话号码来自- Twilio电话号码网址- TwiML应用程序URL
可选参数:
状态回调- 用于通话状态更新的Webhook URL状态回调事件- 要接收的事件(已发起、振铃中、已接听、已完成)超时- 等待接听的秒数(默认:60)录音- 设置为true以录制通话
更新通话
POST /twilio/2010-04-01/Accounts/{AccountSid}/Calls/{CallSid}.json
Content-Type: application/x-www-form-urlencoded
Status=completed
使用状态=已完成来结束进行中的通话。
删除通话
DELETE /twilio/2010-04-01/Accounts/{AccountSid}/Calls/{CallSid}.json
电话号码
列出呼入电话号码
GET /twilio/2010-04-01/Accounts/{AccountSid}/IncomingPhoneNumbers.json
响应:
{
"incoming_phone_numbers": [
{
"sid": "PNxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"phone_number": "+15551234567",
"friendly_name": "My Number",
"capabilities": {
"voice": true,
"sms": true,
"mms": true
}
}
]
}
获取电话号码
GET /twilio/2010-04-01/Accounts/{AccountSid}/IncomingPhoneNumbers/{PhoneNumberSid}.json
更新电话号码
POST /twilio/2010-04-01/Accounts/{AccountSid}/IncomingPhoneNumbers/{PhoneNumberSid}.json
Content-Type: application/x-www-form-urlencoded
FriendlyName=Updated%20Name&VoiceUrl=https://example.com/voice
删除电话号码
DELETE /twilio/2010-04-01/Accounts/{AccountSid}/IncomingPhoneNumbers/{PhoneNumberSid}.json
应用
列出应用
GET /twilio/2010-04-01/Accounts/{AccountSid}/Applications.json
响应:
{
"applications": [
{
"sid": "APxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"friendly_name": "My App",
"voice_url": "https://example.com/voice",
"sms_url": "https://example.com/sms"
}
]
}
获取应用
GET /twilio/2010-04-01/Accounts/{AccountSid}/Applications/{ApplicationSid}.json
创建应用
POST /twilio/2010-04-01/Accounts/{AccountSid}/Applications.json
Content-Type: application/x-www-form-urlencoded
FriendlyName=My%20App&VoiceUrl=https://example.com/voice
响应:
{
"sid": "APxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"friendly_name": "My App",
"voice_url": "https://example.com/voice",
"date_created": "Tue, 10 Feb 2026 00:20:15 +0000"
}
更新应用
POST /twilio/2010-04-01/Accounts/{AccountSid}/Applications/{ApplicationSid}.json
Content-Type: application/x-www-form-urlencoded
FriendlyName=Updated%20App%20Name
删除应用
DELETE /twilio/2010-04-01/Accounts/{AccountSid}/Applications/{ApplicationSid}.json
成功时返回204 No Content。
队列
列出队列
GET /twilio/2010-04-01/Accounts/{AccountSid}/Queues.json
响应:
{
"queues": [
{
"sid": "QUxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"friendly_name": "Support Queue",
"current_size": 0,
"max_size": 1000,
"average_wait_time": 0
}
]
}
创建队列
POST /twilio/2010-04-01/Accounts/{AccountSid}/Queues.json
Content-Type: application/x-www-form-urlencoded
FriendlyName=Support%20Queue&MaxSize=100
更新队列
POST /twilio/2010-04-01/Accounts/{AccountSid}/Queues/{QueueSid}.json
Content-Type: application/x-www-form-urlencoded
FriendlyName=Updated%20Queue%20Name
删除队列
DELETE /twilio/2010-04-01/Accounts/{AccountSid}/Queues/{QueueSid}.json
地址
列出地址
GET /twilio/2010-04-01/Accounts/{AccountSid}/Addresses.json
创建地址
POST /twilio/2010-04-01/Accounts/{AccountSid}/Addresses.json
Content-Type: application/x-www-form-urlencoded
FriendlyName=Office&Street=123%20Main%20St&City=San%20Francisco&Region=CA&PostalCode=94105&IsoCountry=US&CustomerName=Acme%20Inc
使用记录
列出使用记录
GET /twilio/2010-04-01/Accounts/{AccountSid}/Usage/Records.json
查询参数:
类别- 按使用类别筛选(通话、短信等)起始日期- 起始日期(年-月-日)结束日期- 结束日期(年-月-日)
响应:
{
"usage_records": [
{
"category": "sms",
"description": "SMS Messages",
"count": "100",
"price": "0.75",
"start_date": "2026-02-01",
"end_date": "2026-02-28"
}
]
}
分页
Twilio使用基于页面的分页:
GET /twilio/2010-04-01/Accounts/{AccountSid}/Messages.json?PageSize=50&Page=0
参数:
页面大小- 每页结果数(默认:50)页码- 页码(从0开始)
响应包含:
{
"messages": [...],
"page": 0,
"page_size": 50,
"first_page_uri": "/2010-04-01/Accounts/{AccountSid}/Messages.json?PageSize=50&Page=0",
"next_page_uri": "/2010-04-01/Accounts/{AccountSid}/Messages.json?PageSize=50&Page=1",
"previous_page_uri": null
}
使用next_page_uri来获取下一页结果。
代码示例
JavaScript
const response = await fetch(
'https://gateway.maton.ai/twilio/2010-04-01/Accounts.json',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
const accountSid = data.accounts[0].sid;
console.log(`Account SID: ${accountSid}`);
Python
import os
import requests
# Get account SID
response = requests.get(
'https://gateway.maton.ai/twilio/2010-04-01/Accounts.json',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
account_sid = response.json()['accounts'][0]['sid']
print(f"Account SID: {account_sid}")
Python(发送短信)
import os
import requests
account_sid = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
response = requests.post(
f'https://gateway.maton.ai/twilio/2010-04-01/Accounts/{account_sid}/Messages.json',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/x-www-form-urlencoded'
},
data={
'To': '+15559876543',
'From': '+15551234567',
'Body': 'Hello from Python!'
}
)
message = response.json()
print(f"Message SID: {message['sid']}")
print(f"Status: {message['status']}")
Python(拨打电话)
import os
import requests
account_sid = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
response = requests.post(
f'https://gateway.maton.ai/twilio/2010-04-01/Accounts/{account_sid}/Calls.json',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/x-www-form-urlencoded'
},
data={
'To': '+15559876543',
'From': '+15551234567',
'Url': 'https://demo.twilio.com/docs/voice.xml'
}
)
call = response.json()
print(f"Call SID: {call['sid']}")
print(f"Status: {call['status']}")
注意事项
- 所有端点都需要
/2010-04-01/API版本前缀 - 大多数端点都要求在路径中包含您的账户SID
- 请求体使用
application/x-www-form-urlencoded格式(而非JSON) - 电话号码必须采用E.164格式(例如+15551234567)
- SID是唯一的标识符:
- 账户SID以
AC - 开头
消息SID以SM(短信)或MM - (彩信)开头
通话SID以 - CA
开头 - 电话号码SID以
PN - 开头
应用SID以
- 账户SID以
- AP
- 开头
- 重要提示:当将curl输出通过管道传递给
jq或其他命令时,在某些shell环境中,环境变量如$MATON_API_KEY可能无法正确展开
错误处理
| 状态码 | 含义 |
|---|---|
| 400 | 缺少Twilio连接或请求格式错误 |
| 401 | Maton API密钥无效或缺失 |
| 404 | 资源未找到 |
| 429 | 请求频率受限 |
| 4xx/5xx | 来自Twilio API的透传错误 |
Twilio错误响应包括:
{
"code": 20404,
"message": "The requested resource was not found",
"more_info": "https://www.twilio.com/docs/errors/20404",
"status": 404
}
故障排除:API密钥无效
当您收到"API密钥无效"错误时,在断定存在问题之前,请务必遵循以下步骤:
- 检查
MATON_API_KEY环境变量已设置:
echo $MATON_API_KEY
- 通过列出连接来验证API密钥是否有效:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
资源
文章底部电脑广告
手机广告位-内容正文底部


微信扫一扫,打赏作者吧~