运维自动化--Python推送QQ消息

自动化推送QQ消息(包含文本消息、图片、文件、@)

    • 项目介绍
    • 开发环境
    • 代码展示
    • 功能展示

项目介绍

DevOps 、AIOps 这几年可谓是高频词汇,不断重复出现在IT大众眼前。

DevOps是一种软件开发方法,涉及软件在整个开发生命周期中的持续开发,持续测试,持续集成,持续部署和持续监控。

AIOps(Artificial Intelligence for IT Operations ),即智能运维,是将人工智能的能力与运维相结合,通过机器学习的方法来提升运维效率。
简单来说就是AI + 运维数据 + 自动化处理类似于AI + Devops

虽然觉着目前大多数公司都做不到AIOps甚至是DevOps都没有落实到位,但是通过了解这些概念学习到了不少知识,自动化确实是未来运维发展方向,将重复的、机械性的工作自动化,不仅可以提高工作效率、减少出错率、提高员工满意度,也可以大大的缩减公司成本

所以闲暇时间就做了一个小项目,开发语言是python,起初用的qqbot(这个库是Github上某大神写的)做了一个智能交互机器人(调用小i API接口),可以对QQ消息分析后并进行自动回复(并且可以处理日常系统运维问题),可以将一些信息定时发送的QQ或群提醒客户,例如业务信息、UAP中间监控告警信息等等,但是由于今年1月份鹅厂宣布不再提供Web qq服务后,GG。

最后只好利用了win32、seleinum、等一些模块,通过抓取句柄的方式进行QQ消息的推送。(单项推送,不具备交互功能)

这是一些学习相关的文档(部分是Devops所需),跟大家分享一下,网上也有很多帖子CSDN、Github社区都有。
(1)Zabbix (2)Prometheus (3)Grafana (4)K8s (5)Ansiable (6)Elastic (7)Jenkins (8)Python、ML、DM…

1.Zabbix监控官方文档,目前官网最新版本4.2
https://www.zabbix.com/manuals

2.Prometheus开源云监控官方文档,是CNCF上第二大开源项目,未来应该是云监控主流,目前最新版本2.12
https://prometheus.io/docs/introduction/overview/

3.Grafana开源数据可视化工具官方文档,目前支持大概30 data source,例如Graphite、InfluxDB 、Prometheus 、Elasticsearch、PostgreSQL、Myslq、Oracle
https://grafana.com/docs/

4.K8s是CNCF基于容器云Docker的第一大开源项目,有兴趣的可以看看,中文的文档
https://www.kubernetes.org.cn/k8s

5.Ansiable一个自动化运维工具,功能:系统安装(物理机、虚拟机) --> 程序包安装、配置、服务启动 --> 批量操作 --> 程序发布 --> 监控,这些都可以实现自动化一键部署
https://docs.ansible.com/ansible/latest/index.html

6.Elstic分布式多用户搜索引擎,基于Lucene,并提供RESTful web接口,可以对集群服务日志做收集分析,目前Save这边有几台集群,用作收集EDI集群服务日志
https://www.elastic.co/guide/index.html

7.Jenkins开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件, 这个可能更多和开发有关,有兴趣的可以看看了解下
https://jenkins.io/zh/doc/

8.Automate the boring stuff with python 一个python自动化的文档,将python语法结构
https://automatetheboringstuff.com/#toc

9.Kaggle数据挖掘、分析竞赛平台,冠军有奖金不过比较难
https://www.kaggle.com

10.Machine Learning文档,一个大神的学习笔记,很实用
https://createmomo.github.io/2018/01/23/Super-Machine-Learning-Revision-Notes/#tableofcontents

11.TensorFlow 用于研究和生产的开源机器学习库,目前应用场景:图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用,是目前最热门的机器学习框架
https://tensorflow.google.cn/tutorials/?hl=zh_cn

12.Apache 上相关的项目中文文档,大部分是ML书籍文档
https://docs.apachecn.org/bookmarks

13.The community for data mining
https://www.kdd.org

就分享这么多吧,欢迎交流。

废话扯多了,完整项目,欢迎访问:https://github.com/walkeradmin/Pub

开发环境

部署 描述
开发语言 python
SDK版本 3.6↑
涉及模块 cx_Oracle、pymysql、win32、ctypes、pythoncom、logformat、requests、schedule、openpyxl、selenium、Pilow
运行环境 windows server 2016

代码展示

文本、文件推送
文本消息直接复制到剪切板就可以了
文件需要用到pythoncom处理。这里参考https://www.programcreek.com/python/example/63206/pythoncom.TYMED_HGLOBAL

import win32gui
import win32api
from win32.lib import win32con
import win32clipboard as w
import time
from threading import Lock
import traceback
import ctypes
from ctypes import wintypes
import pythoncom
mutex = Lock()


def send(send_mess, group_name):
    try:
        mutex.acquire()
        # TXGuiFoundation
        win = win32gui.FindWindow(None, group_name)	# 群组名称 or 人名
        w.OpenClipboard()
        w.EmptyClipboard()
        if type(send_mess) == str:
        	# 文本消息
            w.SetClipboardData(win32con.CF_UNICODETEXT, send_mess)	# 需要发送的消息
            w.CloseClipboard()
            # time wait pywintypes.error: (1418, 'GetClipboardData',线程没有打开的剪贴板)
            time.sleep(1)
            win32gui.SendMessage(win, 770, 0, 0)
            win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
        elif type(send_mess) == bytes:
        	# 文件消息
            w.SetClipboardData(w.CF_HDROP, send_mess)
            time.sleep(1)
            win32api.PostMessage(win, win32con.WM_PASTE, 0, 0)
            time.sleep(1)
            win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
            mutex.release()
    except Exception as e:
        print(str(e))
        print(traceback.format_exc())


class DROP(ctypes.Structure):
    _fields_ = (('pFiles', wintypes.DWORD),
                ('pt',     wintypes.POINT),
                ('fNC',    wintypes.BOOL),
                ('fWide',  wintypes.BOOL))


def clip_files(file_list, group_name):
    try:
        offset = ctypes.sizeof(DROP)
        length = sum(len(p) + 1 for p in file_list) + 1
        size = offset + length * ctypes.sizeof(ctypes.c_wchar)
        buf = (ctypes.c_char * size)()
        df = DROP.from_buffer(buf)
        df.pFiles, df.fWide = offset, True
        for path in file_list:
            array_t = ctypes.c_wchar * (len(path) + 1)
            path_buf = array_t.from_buffer(buf, offset)
            path_buf.value = path
            offset += ctypes.sizeof(path_buf)
        stg = pythoncom.STGMEDIUM()
        stg.set(pythoncom.TYMED_HGLOBAL, buf)
        send(stg, group_name)
    except Exception as e:
        print(str(e))
        print(traceback.format_exc())


clip_files("xx.txt", name)	

截图发送

win32api.keybd_event(0x91, 0, 0, 0)  # 0x91 --> win key
win32api.keybd_event(0x2C, 0, 0, 0)  # 0x2C --> PRINT SCREEN key
win32api.keybd_event(0x91, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(0x2C, 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(1)
win32gui.SendMessage(win, 770, 0, 0)
win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

如果需要@指定人,SendMessaage时候睡一下就可以了

win = win32gui.FindWindow(None, group_name)	# 群组名称 or 人名
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, str(mess))	# 需要发送的消息
w.CloseClipboard()
time.sleep(1)
win32gui.SendMessage(handle, 770, 0, 0)
if result.startswith('@'):
	# 睡1s模拟人工@方式
    time.sleep(1)
    win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
    time.sleep(1)
    win32gui.SendMessage(win, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

功能展示

  1. 消息推送
    运维自动化--Python推送QQ消息_第1张图片
  2. 文件推送 TXT文本业务数据
    运维自动化--Python推送QQ消息_第2张图片
  3. 文件推送 EXCEL业务数据
    运维自动化--Python推送QQ消息_第3张图片
  4. 图片推送 监控信息

你可能感兴趣的:(devops,python)