【问题标题】:Example script to Send SMS via AWS SNS using boto使用 boto 通过 AWS SNS 发送 SMS 的示例脚本
【发布时间】:2019-11-20 22:52:59
【问题描述】:

如何使用 boto(或其他 python|perl 库)通过 AWS SNS 直接向手机号码发送短信?

约束:

  • 不使用 AWS Lambda 函数
  • 不使用SNS主题直接订阅手机号码

我的用例:使用 AWS SNS 从 Nagios 发送 SMS 警报,使用 AWS SMS 作为端点协议。

【问题讨论】:

  • 您不需要 lambda 或 SNS 主题,文档中有一个示例,它是用 Java 编写的,但很容易翻译。

标签: python perl sms amazon-sns boto3


【解决方案1】:

这是使用 boto3 通过 SNS 直接发布到电话号码的代码。如果您收到有关 PhoneNumber 参数的错误,则需要升级您的版本 boto。请务必记住,SNS 目前支持直接发布到电话号码 (PhoneNumber) 或推送通知端点 (targetArn)。另请注意,TopicArn、PhoneNumber 和 TargetArn 都是互斥的,因此每次发布只能指定其中之一。

import boto3

sns_client = boto3.client('sns')

response = sns_client.publish(
    PhoneNumber='+12065551212', 
    Message='This is a test SMS message',
    #TopicArn='string', (Optional - can't be used with PhoneNumer)
    #TargetArn='string', (Optional - can't be used with PhoneNumer)
    #Subject='string', (Optional - not used with PhoneNumer)
    #MessageStructure='string' (Optional)
)

print(response)

【讨论】:

  • 嗨丹尼斯,我尝试了您的代码,但最终出现以下错误:raise error_class(parsed_response, operation_name) botocore.exceptions.ClientError:调用发布操作时发生错误(OptInRequired):AWS访问密钥 ID 需要订阅服务
  • 我知道我错过了一些权限,但我已经为此用户添加了 SN​​SFull 访问权限。除此之外还有什么需要做的吗?
  • @dennis-aws 我试过这个方法。我将 HttpStatus 设为 200,但在手机上没有收到任何短信。有什么建议吗?
【解决方案2】:

只需在必填字段中替换即可。

import boto3
# Create an SNS client
client = boto3.client(
    "sns",
    aws_access_key_id="your_access_key_id",
    aws_secret_access_key="you_secret_access_key",
    region_name="us-east-1"
)

# Send your sms message.
client.publish(
    PhoneNumber="your_phone_number",
    Message="Hello World!"
)

要发送给多个联系人,请参考here

【讨论】:

    【解决方案3】:

    下面的脚本对我有用,只需替换脚本中定义为常量的必需参数。下面的脚本还处理群发短信到多个收件人

    import json
    import boto3
    import os
    
    
    ACCESS_KEY = <your key>
    ACCESS_SECRET = <your secret>
    AWS_REGION = <your region>
    
    RECIPIENT_NUMBERS = [<recipient number list>]
    SENDER_ID = <sender_id>
    MESSAGE = <your message>
    
    sns = boto3.client('sns', aws_access_key_id=ACCESS_KEY,
                   aws_secret_access_key=ACCESS_SECRET,
                   region_name=AWS_REGION)
    for number in RECIPIENT_NUMBERS:
        response = sns.publish(
            PhoneNumber=number,
            Message=MESSAGE,
            MessageAttributes={
                'AWS.SNS.SMS.SenderID': {'DataType': 'String',
                                     'StringValue': SENDER_ID},
                'AWS.SNS.SMS.SMSType': {'DataType': 'String',
                                    'StringValue': 'Promotional'}
            }
        )
        print(response)
    

    【讨论】:

      【解决方案4】:
      #!/usr/bin/python
      #sns to sms notification script.
      import datetime
      import boto3
      import sys
      body=[]
      log_file="/var/log/sns2sms.log"
      logf=open(log_file,"a")
      mobile_number=str(sys.argv[1])
      subject=str(sys.argv[2])
      body.append(subject)
      for line in sys.stdin:
       body.append(line)
       message_body="\n".join(body)
       now = str(datetime.datetime.now())
       log_string=now+" "+mobile_number+" "+message_body+" "
      client = boto3.client('sns')
      client.publish(
       PhoneNumber = mobile_number,
       Message = message_body
      )
      logf.write(log_string)
      logf.write("\n")
      logf.close()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        相关资源
        最近更新 更多