QQ机器人:5分钟实现运维数据与监控报警的轻量级衔接

前言

之前用一篇文章介绍了如何利用构造数据包的方式获取ES中的索引数据并汇总出空间使用量: 纵横ELK:爬取Kibana数据实现资源监控(可看前一篇文章) 。

对于提取到的数据如何反馈给应用/用户呢?有些朋友第一个想到的可能是通过一个前端与用户进行交互,但是这种方式实现成本较高,而且如果用户不常打开这个界面很有可能出现通知不及时的情况。作为系统管理者可能还要面对风险评估和安全检查,徒增很多烦恼。

考虑到实时性的,最好的方式就是通过短信或运维群了。这篇文章介绍了一种用QQ机器人来实时反馈ES集群情况,进行智慧运维的方法。

事前准备

开始前你最好有一个专门的QQ号作为机器人的载体

然后,下载一个qq机器人框架,我使用的是基于mirai 以及 MiraiGo 开发的go-cqhttp( go-cqhttp 帮助中心 里面有开发文档)

windows推荐下载这个,linux我没试过可以自己看文档尝试

下载后解压得到三个文件

双击exe文件(一定要双击点开),出现如下窗口,一直点击确定就行了

然后会生成一个批处理文件(.bat)。双击,输入0。然后会自动生成config.yml

打开config.yml,输入QQ号和密码。不填写则是扫码登录

配置完后直接双击bat文件。首次登录需要用事先准备好的QQ扫描登录。等待一段时间出现如下窗口。一直出现上报错误的提示不用担心,是正常的情况

至此,QQ机器人的框架已经搭建好了

具体实现

接下来介绍如何使用框架

#发消息
def send_msg(resp_dict):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    ip = '127.0.0.1'
    client.connect((ip, 5700))

    msg_type = resp_dict['msg_type']  # 回复类型(群聊/私聊)
    number = resp_dict['number']  # 回复账号(群号/好友号)
    msg = resp_dict['msg']  # 要回复的消息

    # 将字符中的特殊字符进行url编码
    msg = msg.replace(" ", "%20")
    msg = msg.replace("\n", "%0a")

    if msg_type == 'group':
        payload = "GET /send_group_msg?group_id=" + str(
            number) + "&message=" + msg + " HTTP/1.1\r\nHost:" + ip + ":5700\r\nConnection: close\r\n\r\n"
    elif msg_type == 'private':
        payload = "GET /send_private_msg?user_id=" + str(
            number) + "&message=" + msg + " HTTP/1.1\r\nHost:" + ip + ":5700\r\nConnection: close\r\n\r\n"
    print("发送" + payload)
    client.send(payload.encode("utf-8"))
    client.close()
    return 0

#发送私聊消息
#resp_dict={'msg_type':'private','number':QQ号,'msg':'你好'}
#send_msg(resp_dict)

#发送群聊消息
#send_msg({'msg_type': 'group', 'number': 442189553, 'msg': '大家好'})

#发表情
#send_msg({'msg_type': 'group', 'number': QQ群号, 'msg': '[CQ:shake]'})

#发窗口抖动
#send_msg({'msg_type': 'group', 'number': QQ群号, 'msg': '[CQ:shake]'}) 作者:proxy2024 https://www.bilibili.com/read/cv29914152/?spm_id_from=333.999.0.0 出处:bilibili

把这个代码写入名为send.py的文件,从另一个py文件引入,然后调用send_msg()函数即可实现脚本控制QQ发消息。

接收信息

把这个代码写入名为receive.py的文件,从另一个py文件引入,然后通过一个无限循环调用rev_msg()函数即可实现脚本接收QQ发消息。

#获取上报的事件

import socket
import json

ListenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ListenSocket.bind(('127.0.0.1', 5701))
ListenSocket.listen(100)

HttpResponseHeader = '''HTTP/1.1 200 OK\r\n
Content-Type: text/html\r\n\r\n
'''

def request_to_json(msg):
    for i in range(len(msg)):
        if msg[i]=="{" and msg[-1]=="\n":
            return json.loads(msg[i:])
    return None

#需要循环执行,返回值为json格式
def rev_msg():# json or None
    Client, Address = ListenSocket.accept()
    Request = Client.recv(1024).decode(encoding='utf-8')
    rev_json=request_to_json(Request)
    Client.sendall((HttpResponseHeader).encode(encoding='utf-8'))
    Client.close()
    return rev_json 作者:proxy2024 https://www.bilibili.com/read/cv29914152/?spm_id_from=333.999.0.0 出处:bilibili

把这个代码写入名为receive.py的文件,从另一个py文件引入,然后通过一个无限循环调用rev_msg()函数即可实现脚本接收QQ发消息。

轮询main函数

while True:
    rev = re.rev_msg()
    if rev["post_type"] == "message":
        #print(rev) #需要功能自己DIY
        if rev["message_type"] == "private": #私聊
            if rev['raw_message']=='在吗':
                qq = rev['sender']['user_id']
                send_msg({'msg_type':'private','number':qq,'msg':'我在'})
        elif rev["message_type"] == "group": #群聊
            group = rev['group_id']
            if "[CQ:at,qq=机器人的QQ号]" in rev["raw_message"]:
                if rev['raw_message'].split(' ')[1]=='在吗':
                    qq=rev['sender']['user_id']
                    send_msg({'msg_type':'group','number':group,'msg':'[CQ:poke,qq={}]'.format(qq)})
        else:
            continue
    else:  # rev["post_type"]=="meta_event":
        continue 作者:proxy2024 https://www.bilibili.com/read/cv29914152/?spm_id_from=333.999.0.0 出处:bilibili

在这段代码中写入自己的脚本,也可以不参考它的写法,因为rev = re.rev_msg() 已经获取到了Q群的数据,具体怎么使用就是自己的事情了。

最终实现

我设置了一个关键词XE,如果检测到就读取IP和索引名,然后返回计算结果。各个参数之间用;分隔,索引处支持*的写法,这是直接使用了ES的特性。

总结

之前用一篇文章介绍了如何利用构造数据包的方式获取ES中的索引数据并汇总出空间使用量。这篇文章介绍了一种用QQ机器人来实时反馈ES集群情况,进行智慧运维的方法。

欢迎关注我的公众号“闪客未来”解锁更多内容

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值