用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=接收飞信的手机号& ...
随机推荐
- [专题总结]AC自动机
其实前面的模板也不是1A,我在题库里提前做过,也不必在意罚时,刚开始我在做别的专题 裸模板我就不说了,各个博客讲解的很明白 void insert(string s){ ,len=s.size(); ...
- CSPS模拟 98
T1 待改 T2 这道题的爆炸充分说明我最近已经颓到一定境界了 考虑到总步数不可能超过n 直接枚举总步数,那么任意时刻对末态的影响就是确定的 T3 两遍最短路,一遍从-1的限制考虑求出允许的最早时间, ...
- NOIP模拟 9
%liu_runda Orz T1 随 矩阵快速幂结合概率期望 但n3无法承受 利用原根的性质,将乘法转化成加法 就变成循环矩阵n^2了 改题时苦b地卡了关:误把1当成原根的1次方,错误地认为矩阵的阶 ...
- js基础总结02--字符串操作
1.字符串中对单个字符位置的操作 indexOf(char); 从左往右查找,返回匹配到的第一个字符的位置,没有匹配则返回-1 lastiIndexOf(char); 从右往左查找,返回匹配到的第一个 ...
- python学习之【第十二篇】:Python中的迭代器
1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集合.文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭 ...
- beacon帧字段结构最全总结(一)——beacon基本结构
一.beacon帧主要结构 二.MAC header 1.Version:版本号,目前为止802.11只有一个版本,所以协议编号为0 2.Type:定义802.11帧类型,802.11帧分为管理帧( ...
- 实现 sqrt(x):二分查找法和牛顿法
最近忙里偷闲,每天刷一道 LeetCode 的简单题保持手感,发现简单题虽然很容易 AC,但若去了解其所有的解法,也可学习到不少新的知识点,扩展知识的广度. 创作本文的思路来源于:LeetCode P ...
- 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...
- mongodb基本命令,mongodb集群原理分析
mongodb基本命令,mongodb集群原理分析 集合: 1.集合没有固定数据格式. 2. 数据: 时间类型: Date() 当前时间(js时间) new Date() 格林尼治时间(object) ...
- nyoj 1112-求次数 (string, substr(begin, length), map, pair)
1112-求次数 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:8 难度:2 题目描述: 题意很简单,给一个数n 以及一个字符串str,区间[i,i+n-1] 为一个新 ...