前言
之前用一篇文章介绍了如何利用构造数据包的方式获取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集群情况,进行智慧运维的方法。
欢迎关注我的公众号“闪客未来”解锁更多内容