56 lines
2.7 KiB
Python
56 lines
2.7 KiB
Python
|
# -*- 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
|
||
|
|