Python SDK调用示例

更新时间:
复制为 MD 格式

阿里云官方提供的 Python 语言 SDK,用于便捷、安全地调用阿里云短信发送、模板管理、签名管理等核心 API。该 SDK 基于阿里云 OpenAPI 规范构建,封装了认证、请求签名、HTTP 通信、错误处理等底层逻辑,使开发者能够专注于业务逻辑,快速集成短信能力。

安装

系统要求

  • Python 版本:3.7 及以上。

  • 操作系统:Windows / macOS / Linux(无特殊限制)。

  • 其他依赖:alibabacloud_tea_openapi(核心运行时)、alibabacloud_tea_util(工具库)、urllib3(HTTP 客户端)。

使用 pip 安装

pip install alibabacloud_dysmsapi20170525

验证安装

import alibabacloud_dysmsapi20170525

# 输出SDK具体版本号代表安装成功
print("SDK Version:", alibabacloud_dysmsapi20170525.__version__)

认证配置

步骤一:创建RAM用户并完成授权

重要

阿里云主账号拥有较高权限,建议您通过RAM用户进行API调用和日常运维。有关RAM用户的更多信息,请参见RAM用户概览

  • 创建RAM用户:访问创建RAM用户,完成相关名称设置,并选择访问方式使用永久 AccessKey 访问,单击确定后即可完成RAM用户的创建。请及时保存AccessKey信息。

  • RAM用户授权:访问RAM用户列表,找到您所创建的RAM用户,单击操作列的添加权限。在权限策略文本搜索框中输入AliyunDysmsFullAccess后选中此策略,单击确认新增授权,即可完成授权操作。

    说明
    • AliyunDysmsFullAccess管理短信服务的权限。

    • AliyunDysmsReadOnlyAccess:只读访问短信服务的权限。

    • 如果您需要新建自定义权限,请参见授权信息

步骤二:获取访问凭证

请配置环境变量,通过环境变量读取访问密钥(AccessKey)。环境变量配置方法,请参见Linux、macOSWindows系统配置环境变量

说明
  • 为避免在代码中硬编码AccessKey而造成泄露,请通过配置环境变量的方式,来获取AccessKey。

  • 本文代码示例以环境变量名ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET为例,进行后续操作。

步骤三:配置环境变量

环境变量方式最安全、最灵活,避免凭证硬编码,且易于在 CI/CD 流水线中注入。

设置环境变量:

export ALIBABA_CLOUD_ACCESS_KEY_ID='LTAI5tQZJYvKpXqF8yVzHmNfGxXxXx'
export ALIBABA_CLOUD_ACCESS_KEY_SECRET='ZxXxXxXxXxXxXxXxXxXxXxXxXxXxXx'

在代码中使用:

import os

from alibabacloud_dysmsapi20170525.client import Client
from alibabacloud_tea_openapi import models as open_api_models

config = open_api_models.Config(
    # 必填,您的 AccessKey ID,
    access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
    # 必填,您的 AccessKey Secret,
    access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# 凭证将自动从环境变量读取
client = Client(config)

安全最佳实践

  • 使用环境变量或密钥管理服务存储凭证。

  • 定期轮换访问密钥。

  • 遵循最小权限原则,为RAM用户分配最小必要权限。

  • 不要在日志中打印凭证信息。

  • 在生产环境中使用RAM角色而非主账号凭证。

快速开始

代码示例

使用SDK调用发送短信API的代码示例如下,请根据注释完成参数填写。

# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import os
import sys

from typing import List

from alibabacloud_dysmsapi20170525.client import Client as Dysmsapi20170525Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dysmsapi20170525 import models as dysmsapi_20170525_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient


def create_client(
    access_key_id: str,
    access_key_secret: str,
) -> Dysmsapi20170525Client:
    """
    使用AK&SK初始化账号Client
    @param access_key_id:
    @param access_key_secret:
    @return: Client
    @throws Exception
    """
    config = open_api_models.Config(
        # 必填,您的 AccessKey ID,
        access_key_id=access_key_id,
        # 必填,您的 AccessKey Secret,
        access_key_secret=access_key_secret
    )
    # 访问的域名
    config.endpoint = f'dysmsapi.aliyuncs.com'
    return Dysmsapi20170525Client(config)


def main(
    args: List[str],
) -> None:
    # 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    # 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全。
    # 以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式。
    # 更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
    client = create_client(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'])
    send_sms_request = dysmsapi_20170525_models.SendSmsRequest(
        phone_numbers='1520000****',
        sign_name='阿里云短信测试',
        template_code='SMS_15495****',
        template_param='{"code":"1234"}'
    )
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        client.send_sms_with_options(send_sms_request, runtime)
    except Exception as error:
        # 如有需要,请打印 error
        UtilClient.assert_as_string(error.message)


async def main_async(
    args: List[str],
) -> None:
    # 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    client = create_client(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'])
    send_sms_request = dysmsapi_20170525_models.SendSmsRequest(
        phone_numbers='1520000****',
        sign_name='阿里云短信测试',
        template_code='SMS_15495****',
        template_param='{"code":"1234"}'
    )
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        await client.send_sms_with_options_async(send_sms_request, runtime)
    except Exception as error:
        # 如有需要,请打印 error
        UtilClient.assert_as_string(error.message)


if __name__ == '__main__':
    main(sys.argv[1:])

下载示例代码

也可以下载示例代码,直接运行。

  1. 访问SendSms

  2. 在左侧的参数配置页签,填写需要的参数信息,填写示例如下:

  • PhoneNumbers 参数输入示例值: 139****0000。

  • SignName 参数输入示例值:阿里云短信测试。

  • TemplateCode 参数输入示例值:SMS_15495****。

  • TemplateParams 参数输入示例值:{"code":"1234"}

最佳实践总结

性能优化

  • 启用连接池:SDK 默认使用 urllib3 连接池,确保 max_idle_conns 配置合理(默认 50),避免频繁建立 TCP 连接。

  • 批量操作:对于大量用户,优先使用 phone_numbers 字段进行批量发送(单次最多 100 个),而非循环调用。

  • 异步非阻塞:在高并发场景下,可结合 asyncioaiohttp(需自行封装)实现真正的异步调用。

安全建议

  • HTTPS 强制:始终使用 https:// 开头的 endpoint,禁止降级到 HTTP。

  • 输入验证:严格校验 phone_numbers(正则匹配)、template_param(JSON 解析)、sign_name(白名单)等所有用户输入。

  • 日志脱敏:在日志中打印 phone_numbers 时,应进行掩码处理(如 138****0000)。

资源管理

  • 客户端复用Client 实例是线程安全的,应在整个应用生命周期内全局复用,避免频繁创建销毁。

  • 及时关闭:虽然 SDK 未提供显式的 close() 方法,但其底层 HTTP 客户端会在程序退出时自动清理资源。

常见问题

相关文档

  • 调用OpenAPI:

    SDK是最易于集成,且支持度最好的OpenAPI调用方式。本文以Java语言SDK调用OpenAPI,其他语言SDK的用法类似,更多信息请参见短信服务SDK