python实现监控阿里云账户余额功能


Posted in Python onDecember 16, 2019

背景

由于阿里云oss,cdn消耗钱的速度比较快,在不知道的情况下,服务就被停了,影响比较大。所以想做个监控。百度一下阿里云账户余额 api 还真有;于是开启了踩坑之路。

查阅资料创建accessKeyId和accessKeySecret

  • 官方文档(感觉并不细致) https://help.aliyun.com/document_detail/87997.html?spm=a2c6h.13066369.0.0.59e4581eaxXH1O
  • sdk https://developer.aliyun.com/sdk?spm=5176.12818093.resource-links.dsdk_platform.488716d022QXo0
  • 看了官方文档后还是有点懵逼,后面Google了这个关键字QueryAccountBalanceRequest才看到真正的样例代码https://developer.aliyun.com/ask/132002(感觉这块资料很少呀,aliyun-python-sdk-bssopenapi居然没写在sdk安装列表里面,在社区找到的)。
  • 创建accessKeyId,鼠标悬停到右上角

python实现监控阿里云账户余额功能
python实现监控阿里云账户余额功能

撸码阶段

要安装的依赖

sudo pip install aliyun-python-sdk-core  -i https://mirrors.aliyun.com/pypi/simple/
sudo pip install  aliyun-python-sdk-bssopenapi -i https://mirrors.aliyun.com/pypi/simple/

from aliyunsdkcore import client
from aliyunsdkbssopenapi.request.v20171214 import QueryAccountBalanceRequest
from aliyunsdkcore.profile import region_provider
# 检查账户余额
def check_account(name, accessKeyId, accessKeySecret, valve, notify_emails):
  region_provider.add_endpoint('BssOpenApi', 'cn-hangzhou', 'business.aliyuncs.com')
  clt = client.AcsClient(accessKeyId, accessKeySecret, 'cn-hangzhou')
  request = QueryAccountBalanceRequest.QueryAccountBalanceRequest()
  request.set_accept_format("JSON")
  result = clt.do_action_with_exception(request)
  print(result)

下面是我封装的检查账户余额,如果低于阀值就给要通知的人发邮件。 monitor_balance.py

# -*-coding: UTF-8 -*-
'''
监控阿里云账户余额
zhouzhongqing
2019年12月14日20:21:11
sudo pip install aliyun-python-sdk-core  -i https://mirrors.aliyun.com/pypi/simple/
sudo pip install  aliyun-python-sdk-bssopenapi -i https://mirrors.aliyun.com/pypi/simple/
https://developer.aliyun.com/ask/132002
'''
import os
import time
import sched
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from aliyunsdkcore import client
from aliyunsdkbssopenapi.request.v20171214 import QueryAccountBalanceRequest
from aliyunsdkcore.profile import region_provider
import json
from decimal import Decimal
# qq邮箱smtp服务器
host_server = 'smtp.qq.com'
# sender_qq为发件人的qq号码
sender_qq = '1030907690@qq.com'
# pwd为qq邮箱的授权码
pwd = 'xxxxxx'
# 发件人的邮箱
sender_qq_mail = '1030907690@qq.com'
# 第一个参数确定任务的时间,返回从某个特定的时间到现在经历的秒数
# 第二个参数以某种人为的方式衡量时间
schedule = sched.scheduler(time.time, time.sleep);
def send_mail(receiver, name, balance, valve):
  # 收件人邮箱
  # receiver = '1030907690@qq.com'
  # 邮件的正文内容
  mail_content = '您好,目前账户%s,余额为%s,低于阀值%s,请知悉!' % (name, balance, valve)
  # 邮件标题
  mail_title = '%s余额监控通知邮件' % (name)
  # ssl登录
  smtp = smtplib.SMTP_SSL(host_server)
  # set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
  smtp.set_debuglevel(0)
  smtp.ehlo(host_server)
  smtp.login(sender_qq, pwd)
  msg = MIMEText(mail_content, "plain", 'utf-8')
  msg["Subject"] = Header(mail_title, 'utf-8')
  msg["From"] = sender_qq_mail
  msg["To"] = receiver
  smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
  smtp.quit()
#解析配置
def parse_account():
  f = open("monitor.json")
  lines = f.read()
  data = json.loads(lines)
  f.close()
  return data
# 检查账户余额
def check_account(name, accessKeyId, accessKeySecret, valve, notify_emails):
  region_provider.add_endpoint('BssOpenApi', 'cn-hangzhou', 'business.aliyuncs.com')
  clt = client.AcsClient(accessKeyId, accessKeySecret, 'cn-hangzhou')
  request = QueryAccountBalanceRequest.QueryAccountBalanceRequest()
  request.set_accept_format("JSON")
  result = clt.do_action_with_exception(request)
  # print(result)
  res_json = json.loads(str(result, encoding="utf-8"))
  print(res_json)
  if res_json is not None and res_json["Code"] == "200":
    availableAmount = res_json["Data"]["AvailableAmount"]
    if Decimal(availableAmount) < Decimal(valve):
      print("%s低于阀值 " % name)
      notify_email_arr = notify_emails.split(",")
      for email in notify_email_arr:
        send_mail(email, name, availableAmount, valve)
def start_check():
  try:
    data = parse_account();
    for item in data:
      print("检查%s" % item["name"])
      check_account(item["name"], item["accessKeyId"], item['accessKeySecret'], item['valve'],
             item['notifyEmail'])
    # send_mail("1030907690@qq.com","恭喜你888","50","100")
  except Exception as e:
    print("program error %s " % e)
  finally:
    print("finally print!")
def perform_command(cmd, inc):
  # 安排inc秒后再次运行自己,即周期运行
  schedule.enter(inc, 0, perform_command, (cmd, inc));
  os.system(cmd);
  start_check();
def timming_exe(cmd, inc=60):
  # enter用来安排某事件的发生时间,从现在起第n秒开始启动
  schedule.enter(inc, 0, perform_command, (cmd, inc))
  # 持续运行,直到计划时间队列变成空为止
  schedule.run()
if __name__ == '__main__':
  print("start")
  print("show time after 60 seconds:");
  #timming_exe("echo %time%", 60); # 每间隔多少秒执行
  timming_exe("date", 60); # 每间隔多少秒执行
  print("end")
'''
AvailableAmount	String	可用额度
MybankCreditAmount	String	网商银行信用额度
AvailableCashAmount	String	现金余额
Currency	String	币种。取值范围:CNY:人民币,USD:美元,JPY:日元
CreditAmount	String	信控余额
'''
  • 还有个json文件配置monitor.json
  • 里面分别代表的是名称,发起邮件通知账户余额阀值,id,密钥,通知的邮箱(可以多个,逗号,分割)。
[{"name":"恭喜你888","valve": "100","accessKeyId":"xxx","accessKeySecret":"xxx","notifyEmail":1030907690@qq.com}]

运行效果

python实现监控阿里云账户余额功能
python实现监控阿里云账户余额功能

如果是正式环境部署的话可以用这个命令,可以后台运行,日志输出到 nohup.out:

nohup python -u monitor_balance.py > nohup.out 2>&1 &

 总结

以上所述是小编给大家介绍的python实现监控阿里云账户余额功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
跟老齐学Python之Import 模块
Oct 13 Python
10款最好的Web开发的 Python 框架
Mar 18 Python
Python编写一个优美的下载器
Apr 15 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
keras多显卡训练方式
Jun 10 Python
python实现录音功能(可随时停止录音)
Oct 26 Python
Python实现密码薄文件读写操作
Dec 16 #Python
如何基于Python实现电子邮件的发送
Dec 16 #Python
Python如何基于selenium实现自动登录博客园
Dec 16 #Python
Python正则表达式急速入门(小结)
Dec 16 #Python
如何基于Python制作有道翻译小工具
Dec 16 #Python
django框架单表操作之增删改实例分析
Dec 16 #Python
Python生成个性签名图片获取GUI过程解析
Dec 16 #Python
You might like
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
Python中关于使用模块的基础知识
2015/05/24 Python
Python中字典的setdefault()方法教程
2017/02/07 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
重阳节登山活动方案
2014/02/03 职场文书
网络研修随笔感言
2014/02/17 职场文书
施工安全标语
2014/06/07 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
建筑学专业自荐书
2014/07/09 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
创业计划书之便利店
2019/09/05 职场文书