用Python调用华为云API接口发短信
【摘要】 用Python调用华为云API接口实现发短信,当然能给调用发短信接口前提条件是通过企业实名认证,而且有一个通过审核的短信签名,话不多说,showcode
#!/usr/bin/python3
'''
功 能:对华为云常用API接口进行封装
版权信息: 华为技术有限公司,版权所有(C) 2018-2019
作 者:qshujun
修改记录:2018/02/28 v1.0
'''
import os
import time
import json
from HttpRequest import HttpRequests
class HWCloud():
def __init__(self, domain_name, username, password, region_id):
self.domain_name = domain_name
self.username = username
self.password = password
self.region_id = region_id
self.token_file = "token"
self.iam_endpoint = "https://iam.{region_id}.myhuaweicloud.com"
self.iam_token_uri = "/v3/auth/tokens"
self.smn_endpoint = "https://smn.{region_id}.myhuaweicloud.com"
self.sms_publish_uri = "/v2/{project_id}/notifications/sms"
self.headers = {"content-type": "application/json"}
self.project_id = ""
self.proxies = None
self.get_iam_token()
def get_iam_token(self):
'''
以用户名、密码从IAN换取token并加入headers
:return:
'''
# 先尝试从本地文件读取尚在有效期内的token
if os.path.isfile(self.token_file):
try:
f = open(self.token_file)
token_str = f.read()
f.close()
token_info = json.loads(token_str)
if token_info["expires_at"] > time.time():
self.headers["X-Auth-Token"] = token_info["token"]
self.project_id = token_info["project_id"]
return True
except:
pass
iam_token_url = self.iam_endpoint.format(region_id=self.region_id) + self.iam_token_uri
data = {
"auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"name": self.username,
"password": self.password,
"domain": {
"name": self.domain_name
}
}
}
},
"scope": {
"project": {
"name": self.region_id
}
}
}
}
auth_timestamp = time.time()
req = HttpRequests(iam_token_url, data=json.dumps(data), type="POST", headers = self.headers, proxies=self.proxies)
print(req.get_text())
if req.get_code() == 201 and "X-Subject-Token" in req.get_headers():
self.headers["X-Auth-Token"] = req.get_headers()["X-Subject-Token"]
req_text = json.loads(req.get_text())
self.project_id = req_text["token"]["project"]["id"]
issued_at = req_text["token"]["issued_at"]
expires_at = req_text["token"]["expires_at"]
expires_timestamp = auth_timestamp + time.mktime(time.strptime(expires_at, "%Y-%m-%dT%H:%M:%S.%fZ")) - time.mktime(time.strptime(issued_at, "%Y-%m-%dT%H:%M:%S.%fZ"))
token_info = {
"token": req.get_headers()["X-Subject-Token"],
"project_id": self.project_id,
"expires_at": expires_timestamp
}
f = open(self.token_file,'w')
f.write(json.dumps(token_info))
f.close()
return True
else:
print("Get IAM token failed, http code: % s, % s" % (str(req.get_code()), req.get_text()))
return False
def sendSms(self, sign_id, endpoint, message):
'''
:param sign_id: 短信签名
:param endpoint: 手机号码
:param message: 短信消息
:return:
'''
sms_publish_url = self.smn_endpoint.format(region_id=self.region_id) + self.sms_publish_uri.format(project_id=self.project_id)
data = {
"endpoint": endpoint,
"message": message,
"sign_id": sign_id
}
req = HttpRequests(sms_publish_url, data=json.dumps(data), type="POST", headers=self.headers, proxies=self.proxies)
if req.get_code() == 200:
return True
else:
print("Send SMS failed, http code: % s, % s" % (str(req.get_code()), req.get_text()))
return False
if __name__ == '__main__':
client = HWCloud('domain_name','username','Password','cn-north-1')
client.sendSms('dddabcde*********************66','181xxxxx110','hello')
依赖的外部HttpRequests类
#!/usr/bin/python
# coding: utf-8
import requests
class HttpRequests():
'''
对requests库封装的GET、POST、PUT等方法调用类
'''
def __init__(self, url, data=None, type='GET', cookie=None, headers=None, proxies=None):
self.url = url
self.data = data
self.type = type
self.cookie = cookie
self.headers = headers
self.proxies = proxies
self.send_request()
def send_request(self):
'''
setup a request
'''
if self.url == None or self.url == '':
raise 'The url should not empty!'
if self.type == 'POST':
self.req = requests.post(self.url, data=self.data, headers=self.headers, proxies=self.proxies)
elif self.type == 'GET':
if self.data == None:
self.req = requests.get(self.url, headers=self.headers, proxies=self.proxies)
else:
self.req = requests.get(self.url, params=self.data, headers=self.headers, proxies=self.proxies)
elif self.type == 'PUT':
self.req = requests.put(self.url, data=self.data, headers=self.headers, proxies=self.proxies)
else:
self.req = None
raise 'The http request type NOT support now!'
def get_code(self):
try:
return self.req.status_code
except:
raise 'get code fail'
def get_url(self):
try:
return self.req.url
except:
raise 'get url fail'
def get_text(self):
try:
return self.req.text
except:
raise 'get text fail'
def get_headers(self):
try:
return self.req.headers
except:
raise 'get headers fail'
def get_cookie(self):
headers = self.get_headers()
if 'set-cookie' in headers:
return headers['set-cookie']
else:
return None
用Python调用华为云API接口发短信的更多相关文章
- #PHP# 华为云 API 方式发送短信
使用给华为云 消息 服务 API 方式发送短信 代码来自华为云,已通过测试 <?php /** * 华为云发送短信示例代码 * 本段代码需要使用自己的配置信息才能正常运行,出配置信息外,不需要改 ...
- 谁说程序员不懂浪漫?用Python每天自动给女朋友免费发短信
前言 之前发过一篇文章,用 Python 制作的给父母天气预报提醒的小工具天气变冷了,给父母制作一个天气提醒小助手,这篇文章我同步到博客上之后,有读者在评论区留言,对于部分微信没有网页版接口,导致无法 ...
- 利用阿里大于接口发短信(Delphi版)
阿里大于是阿里通信旗下产品,融合了三大运营商的通信能力,提供包括短信.语音.流量直充.私密专线.店铺手机号等个性化服务.每条四分五,价钱还算公道,经老农测试,响应速度非常快,基本上是秒到.官方文档提供 ...
- Python 调用阿里云 API 收集 ECS 数据
#!/usr/bin/env python # coding: utf-8 # author: Wang XiaoQiang ''' 功能介绍: 1.调用阿里云API,收集所有区域 ECS 信息 2. ...
- PHP控制阿里云短信API接口实现短信群发功能
阿里云短信支持先使用后支付的原则,价格为4分半1条. 通过SDK可以与网站功能的绑定,实现响应的短信发送功能 现已统一合并升级为:消息服务. 消息服务 阿里云消息服务(Message Service, ...
- ios-王云鹤 调用ios系统功能---------------打电话、发短信、发邮件
--------------------------------------菜鸟总结,欢迎读者雅正------------------------------------------------- 先 ...
- 用那啥 那啥来着Django来发送Email,结合腾讯云,批量发短信给用户!
你们好,我是来ZB的! 这篇博客是用来发送邮件的,用的是Django框架,很好用.遗憾的是我当时用的阿里云,把腾讯QQ的端口给……给屏蔽了,啊啊啊啊,多么痛的领悟呀.后来用的163网易的邮箱.可以了! ...
- 注册登录页面修订-Python使用redis-手机验证接口-发送短信验证
登录页面修订 views.Login.vue <template> <div class="login box"> <img src="@/ ...
- 使用飞信api接口实现短信发送(只能发送好友)
找了很久才找到一个能用的飞信API接口(http://quanapi.sinaapp.com/fetion.php?u=飞信登录手机号&p=飞信登录密码&to=接收飞信的手机号& ...
随机推荐
- NOIP模拟 5
考试的时候相当浮躁,而且脑子并不工作 T1看了几眼,觉得没思路,先skip T2一打眼,满足条件的最大值,二分!(然后就死了,根本没想有没有单调性) T3找了半天规律,一开始自己手模的K3都过不了样例 ...
- Android常见内存泄露
前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary.MAT等工具来检 ...
- 关于Python中的yield的理解
生成器:yield表达式构成的函数就是生成器:每一个生成器都是一个迭代器(但是迭代器不一定是生成器).return就是迭代器: yield的功能类似于return,不同之处在于它返回的是生成器. 什么 ...
- Spring中常用的注解及作用
@Component(value) 配置类,当使用该注解时,SpringIOC会将这个类自动扫描成一个bean实例 不写的时候,默认是类名,且首字母小写 @ComponentScan 默认是代表进行扫 ...
- google在nature上发表的关于量子计算机的论文(Quantum supremacy using a programmable superconducting processor 译)— 附论文
Google 2019年10月23号发表在Nature(<自然><科学>及<细胞>杂志都是国际顶级期刊,貌似在上面发文两篇,就可以评院士了)上,关于量子计算(基于 ...
- 【algo&ds】0.数据结构和算法入门
解决问题方法的效率,跟数据的组织方式有关 解决问题方法的效率,跟空间的利用效率有关 解决问题方法的效率,跟算法的巧妙程度有关 什么是数据结构 数据对象在计算机中的组织方式 逻辑结构 物理存储结构 数据 ...
- redhat、centos7系列破解密码
redhat或者centos7,破解密码: 1.开机出现引导菜单时按下e键 2.找到linux16行,在其后追加 rd.break 参数 console=tty0 3.启动到特定的模式,由于更改密码需 ...
- [内部类] java笔记之内部类
1.内部类的分类 2.成员内部类的定义格式 3.一旦使用了内部类,那么生成的class文件长啥样? 其中Body是外部类,Heart是Body的内部类,所以中间有个美元符号$,所以给类进行命名时,不要 ...
- yum 配置文件 以及 语法
yum的配置文件 #vi /etc/yum.conf [main] cachedir=/var/cache/yum/$basearch/$releasever keepcache= debugleve ...
- 构建 DNS 主从复制服务器
一.主节点配置 1.yum install bind -y 安装 DNS 服务 2.vim /etc/named.conf 编辑 DNS 的配置文件 3.named-checkconf 检查配置文件 ...