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正则表达式如何进行字符串替换实例
Dec 28 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
Python中input与raw_input 之间的比较
Aug 20 Python
用于业余项目的8个优秀Python库
Sep 21 Python
Python 多维List创建的问题小结
Jan 18 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
Python3实现的旋转矩阵图像算法示例
Apr 03 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
Python猜数字算法题详解
Mar 01 Python
Python unittest discover批量执行代码实例
Sep 08 Python
Python模块常用四种安装方式
Oct 20 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 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
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
$()JS小技巧
2007/07/21 Javascript
Javascript 陷阱 window全局对象
2008/11/26 Javascript
javascript eval和JSON之间的联系
2009/12/31 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
从零学Python之hello world
2014/05/21 Python
Python写的贪吃蛇游戏例子
2014/06/16 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
python实现随机漫步算法
2018/08/27 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
PyTorch安装与基本使用详解
2020/08/31 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
中学生获奖感言
2014/02/04 职场文书
入党综合考察材料
2014/06/02 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
借款民事起诉状范文
2015/05/19 职场文书
2015迎新晚会开场白
2015/05/29 职场文书
党支部半年考察意见
2015/06/01 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
我收到了德劲DE1107
2022/04/05 无线电