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编写生成树状结构的文件目录的脚本的教程
May 04 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
python 系统调用的实例详解
Jul 11 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
Python如何生成树形图案
Jan 03 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
numpy实现合并多维矩阵、list的扩展方法
May 08 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
python获取栅格点和面值的实现
Mar 10 Python
python开根号实例讲解
Aug 30 Python
Python远程linux执行命令实现
Nov 11 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 动态多文件上传
2009/01/18 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
深入apache host的配置详解
2013/06/09 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
Javascript 学习书 推荐
2009/06/13 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
python写入中英文字符串到文件的方法
2015/05/06 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
laravel使用redis队列实例讲解
2021/03/23 PHP
大学校园生活自我鉴定
2014/01/13 职场文书
工作表现评语
2014/01/19 职场文书
运动会入场式解说词
2014/02/18 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
大学生党员自我批评思想汇报
2014/10/10 职场文书
升职感谢信
2015/01/22 职场文书
python编写函数注意事项总结
2021/03/29 Python
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技
在python中读取和写入CSV文件详情
2022/06/28 Python
JavaScript实现九宫格拖拽效果
2022/06/28 Javascript