# -*- coding: utf-8 -*- import time import uuid import hashlib import base64 import requests # # 必填,请参考"开发准备"获取如下数据,替换为实际值 # url = 'https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1' # APP接入地址(在控制台"应用管理"页面获取)+接口访问URI # app_key = "3h499M186sTF8046f9J9I28J1L9m" # APP_Key # app_secret = "TMCaZWxoMbuW55l27zdxoDfsiKAH" # APP_Secret # sender = "1069368924410005073" # 国内短信签名通道号或国际/港澳台短信通道号 # template_id = "527eb7a7b95f4466834347adbde6d53e" # 模板ID # # 条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 # # 国际/港澳台短信不用关注该参数 # signature = "华为云短信测试" # 签名名称 # # 选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 # statusCallBack = "" class PhoneMsgSend: def __init__(self, url, app_key, app_secret, sender, template_id, signature, status_call_back=""): self.url = url self.app_key = app_key self.app_secret = app_secret self.sender = sender self.template_id = template_id self.signature = signature self.status_call_back = status_call_back def build_WSSE_header(self): now = time.strftime('%Y-%m-%dT%H:%M:%SZ') nonce = str(uuid.uuid4()).replace('-', '') digest = hashlib.sha256((nonce + now + self.app_secret).encode()).hexdigest() digest_base64 = base64.b64encode(digest.encode()).decode() return 'UsernameToken Username="{}",PasswordDigest="{}",Nonce="{}",Created="{}"'.format(self.app_key, digest_base64, nonce, now) def send_phone_code(self, phone, code): # 请求Headers header = {'Authorization': 'WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE': self.build_WSSE_header()} # 请求Body form_data = {'from': self.sender, 'to': "+86" + phone, 'templateId': self.template_id, 'templateParas': f'["{code}"]', 'statusCallback': self.status_call_back, 'signature': self.signature # 使用国内短信通用模板时,必须填写签名名称 } # 为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 r = requests.post(self.url, data=form_data, headers=header, verify=False) return r