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 深入理解yield
Sep 06 Python
python统计字符串中指定字符出现次数的方法
Apr 04 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
Jul 27 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
Dec 22 Python
Python字符串处理实现单词反转
Jun 14 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
pandas实现将dataframe满足某一条件的值选出
Jun 12 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 Python
Flask缓存静态文件的具体方法
Aug 02 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
python开发的自动化运维工具ansible详解
Aug 07 Python
python+pyhyper实现识别图片中的车牌号思路详解
Dec 24 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 class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
php中error与exception的区别及应用
2014/07/28 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
javascript 有用的脚本函数
2009/05/07 Javascript
checkbox 复选框不能为空
2009/07/11 Javascript
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
2017/03/15 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
python统计中文字符数量的两种方法
2019/01/31 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
css3 盒模型以及box-sizing属性全面了解
2016/09/20 HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
2015年司法局工作总结
2015/05/22 职场文书
辛亥革命观后感
2015/06/02 职场文书
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
深入理解pytorch库的dockerfile
2022/06/10 Python
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS