效果展示
需求
1. 针对异常问题进行飞书群机器人通告
2. 要求颜色标注清晰,肉眼视觉效果好
3. 格式可阅读性强
开发
1. 明确飞书机器人地址
# 测试
WEBHOOK = "https://open.larksuite.com/open-apis/bot/v2/hook/111111111111111111111111"
2. 确定排版模版
参数:通知标题、规则描述、内容
def report(title, rule, content):
title = title
data_alert = {
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": True
},
"header": {
"template": "red",
"title": {
"tag": "plain_text",
"content": title
}
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": "<font color='green'>{}</font>".format(rule)
}
},
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": content
}
}
]
}
}
return data_alert
3. 如果内容太长需要分割通知
def split_text_by_bytes(text: str, max_bytes=25600, chunk_prefix="") -> list[str]:
"""
按字节数分割文本,确保不截断多字节字符
:param text: 原始文本
:param max_bytes: 单块最大字节数(默认25KB)
:param chunk_prefix: 分块前缀(如"[Part 1/3] ")
:return: 分割后的文本块列表
"""
chunks = []
current_chunk = []
current_size = 0
prefix_bytes = len(chunk_prefix.encode('utf-8')) # 前缀占用字节数
# 遍历每个字符动态计算字节
for char in text:
char_bytes = char.encode('utf-8')
char_size = len(char_bytes)
# 检查当前字符是否会导致超限(需预留前缀空间)
if current_size + char_size + (prefix_bytes if not current_chunk else 0) > max_bytes:
# 生成当前块(添加前缀)
chunk = chunk_prefix + ''.join(current_chunk) if chunk_prefix else ''.join(current_chunk)
chunks.append(chunk)
# 重置缓冲区
current_chunk = [char]
current_size = char_size
else:
current_chunk.append(char)
current_size += char_size
# 处理最后一个块
if current_chunk:
chunk = chunk_prefix + ''.join(current_chunk) if chunk_prefix else ''.join(current_chunk)
chunks.append(chunk)
return chunks
def send_split_messages(original_text: str, max_bytes = 25600):
max_bytes_per_chunk = max_bytes # 25KB
chunk_prefix_template = "[Part {}/{}] " # 分块标记模板
# 首次计算总块数(动态调整避免末尾空块)
temp_chunks = split_text_by_bytes(original_text, max_bytes_per_chunk)
total_chunks = len(temp_chunks)
# 实际分割时添加动态前缀
final_chunks = split_text_by_bytes(
original_text,
max_bytes_per_chunk,
chunk_prefix=chunk_prefix_template.format("{}", total_chunks)
)
# 填充实际分块编号
for i in range(len(final_chunks)):
final_chunks[i] = final_chunks[i].replace("{}", str(i+1))
return final_chunks
4. 最终调用代码
messages = send_split_messages(message_content)
for message in messages:
response = requests.post(WEBHOOK, headers=HEADERS, data=json.dumps(report(title, judge_rule, message)))
# 检查响应
if response.status_code == 200:
print("通告发送成功!", response.text)
else:
print(f"发送失败,状态码:{response.status_code},错误信息:{response.text}")