Last active
November 14, 2020 07:21
-
-
Save dylan4224/4115ae475bca8a58794493e5e52c8823 to your computer and use it in GitHub Desktop.
阿里云短信的 Python sdk 简直无法直视:1)居然直接提供下载链接,而不能 pip install;2)不支持 Python 3;3)Python 写出了 Java 的感觉。。。以下是 Python 3 的一个简化版本,由同事提供,我做了简单调整。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
import base64 | |
import datetime | |
import hmac | |
import json | |
import urllib | |
import uuid | |
import requests | |
def quote(text): | |
return urllib.parse.quote(text, safe='~') | |
def stringify(**kwargs): | |
pairs = [] | |
for k, v in sorted(kwargs.items()): | |
pairs.append('{}={}'.format(k, v)) | |
return '&'.join(pairs) | |
def canonicalize(**kwargs): | |
pairs = [] | |
for k, v in sorted(kwargs.items()): | |
pair = '{}={}'.format(quote(k), quote(v)) | |
pairs.append(pair) | |
return quote('&'.join(pairs)) | |
def sign(text, secret): | |
text = text.encode('utf-8') | |
key = (secret + '&').encode('utf-8') | |
digest = hmac.new(key, text, 'sha1').digest() | |
signture = quote(base64.b64encode(digest)) | |
return signture | |
class AliSMS(object): | |
_defaults = [ | |
('action', 'SendSms'), | |
('format', 'JSON'), | |
('region_id', 'cn-hangzhou'), | |
('signature_method', 'HMAC-SHA1'), | |
('signature_version', '1.0'), | |
('sms_version', '2017-05-25'), | |
('domain', 'https://dysmsapi.aliyuncs.com'), | |
] | |
def __init__(self, app_key, app_secret, sign_name, **settings): | |
for k, v in self._defaults: | |
setattr(self, k, settings.get(k, v)) | |
self.app_key = app_key | |
self.app_secret = app_secret | |
self.sign_name = sign_name | |
def send(self, phone, template_code, template_params): | |
body = self._create_body(phone, template_code, template_params) | |
headers = { | |
'content-type': 'application/x-www-form-urlencoded', | |
} | |
res = requests.post(self.domain, data=body, headers=headers) | |
return res | |
def _create_body(self, phone, template_code, template_params): | |
params = self._create_params(phone, template_code, template_params) | |
text = 'POST&%2F&' + canonicalize(**params) | |
signture = sign(text, self.app_secret) | |
body = 'Signature={}&{}'.format(signture, stringify(**params)) | |
return body.encode('utf-8') | |
def _create_params(self, phone, template_code, template_params): | |
return { | |
'AccessKeyId': self.app_key, | |
'Action': self.action, | |
'Format': self.format, | |
'PhoneNumbers': phone, | |
'RegionId': self.region_id, | |
'SignName': self.sign_name, | |
'SignatureMethod': self.signature_method, | |
'SignatureNonce': str(uuid.uuid4()), | |
'SignatureVersion': self.signature_version, | |
'TemplateCode': template_code, | |
'TemplateParam': json.dumps(template_params), | |
'Timestamp': datetime.datetime.utcnow().isoformat("T"), | |
'Version': self.sms_version, | |
} | |
if __name__ == '__main__': | |
app_key = 'your_app_key' | |
app_secret = 'your_app_secret' | |
sign_name = 'your_sign_name' | |
template_code = 'your_template_code:SMS_123456789' | |
template_params = { | |
'code': 'your_code' | |
} | |
sms = AliSMS(app_key, app_secret, sign_name) | |
resp = sms.send('the_phone_number', template_code, template_params) | |
print(resp.status_code, resp.json()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
感谢代码,阿里云的sdk真的不忍直视