chuangliangProject/chuangliangTool/send_task_to_feishu.py

262 lines
9.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import requests
import json
import datetime
from typing import Dict, Any
from chuangliangProject.magic_cat.task_client_magic import MagicTaskQuery
def quick_send_task_update(task_id: int, webhook_url: str):
"""快速发送任务更新到飞书 - 修复版"""
try:
# 获取任务数据
task_query = MagicTaskQuery(task_id)
result = task_query.get_task_info()
print(f"原始结果类型: {type(result)}")
print(f"原始结果内容: {result}")
# 处理结果数据 - 根据实际类型进行调整
if isinstance(result, str):
# 如果是字符串尝试解析为JSON
try:
result_data = json.loads(result)
except:
result_data = {"raw_data": result}
elif hasattr(result, '__dict__'):
# 如果是对象,转换为字典
result_data = result.__dict__
elif isinstance(result, dict):
# 如果是字典,直接使用
result_data = result
else:
# 其他类型,转换为字符串
result_data = {"data": str(result)}
# 构建飞书消息 - 修复msg_type错误
message = {
"msg_type": "text", # 确保有这个字段
"content": {
"text": f"任务查询报告 - 任务ID: {task_id}\n"
f"查询时间: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"
f"原始数据: {json.dumps(result_data, ensure_ascii=False, indent=2)}"
}
}
# 发送请求
headers = {'Content-Type': 'application/json'}
response = requests.post(webhook_url, headers=headers, data=json.dumps(message))
# 检查响应
if response.status_code == 200:
feishu_response = response.json()
if feishu_response.get('code') == 0:
print("✓ 消息发送成功")
return True
else:
print(f"✗ 飞书API返回错误: {feishu_response}")
return False
else:
print(f"✗ HTTP请求失败: {response.status_code}")
return False
except Exception as e:
print(f"✗ 执行过程中发生错误: {str(e)}")
return False
# 更安全的版本,处理各种数据类型
def safe_send_task_update(task_id: int, webhook_url: str, bug: str = None):
"""安全版本,处理各种数据类型"""
try:
# 获取任务数据
task_query = MagicTaskQuery(task_id)
raw_result = task_query.get_task_info()
# 安全地提取数据
task_param = "N/A"
result_data = "N/A"
task_info = "N/A"
material_detail = "N/A"
# 根据不同类型安全访问
if isinstance(raw_result, dict):
task_param = raw_result.get('task_param', 'N/A')
result_data = raw_result.get('result_data', raw_result)
task_info = raw_result.get('task_info', 'N/A')
material_detail = raw_result.get('material_detail', 'N/A')
elif hasattr(raw_result, 'task_param'):
task_param = getattr(raw_result, 'task_param', 'N/A')
result_data = getattr(raw_result, 'result_data', str(raw_result))
task_info = getattr(raw_result, 'task_info', 'N/A')
material_detail = getattr(raw_result, 'material_detail', 'N/A')
else:
# 如果是其他类型,直接转换为字符串
result_data = str(raw_result)
# 构建更友好的消息格式
message = {
"msg_type": "interactive",
"card": {
"header": {
"title": {
"tag": "plain_text",
"content": f"BUG - {bug or '看bug表'}"
},
"template": "red"
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": f"**任务ID:** {task_id} | **查询时间:** {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')} | **状态:** {task_info.get('status', 'N/A')}"
}
},
{
"tag": "hr"
},
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": "**请求参数**"
}
},
{
"tag": "div",
"text": {
"tag": "plain_text",
"content": json.dumps(task_param, ensure_ascii=False)
}
},
{
"tag": "hr"
},
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": "**响应结果**"
}
},
{
"tag": "div",
"text": {
"tag": "plain_text",
"content": json.dumps(result_data, ensure_ascii=False)
}
},
{
"tag": "hr"
},
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": "**素材数据**"
}
},
{
"tag": "div",
"text": {
"tag": "plain_text",
"content": json.dumps(material_detail, ensure_ascii=False)
}
}
]
}
}
# 发送请求
headers = {'Content-Type': 'application/json'}
response = requests.post(webhook_url, headers=headers, data=json.dumps(message))
# 检查响应
if response.status_code == 200:
feishu_response = response.json()
if feishu_response.get('code') == 0:
print("✓ 消息发送成功")
return True
else:
print(f"✗ 飞书API返回错误: {feishu_response}")
# 如果是消息格式问题,尝试使用文本格式
return fallback_text_send(task_id, raw_result, webhook_url)
else:
print(f"✗ HTTP请求失败: {response.status_code}")
return False
except Exception as e:
print(f"✗ 执行过程中发生错误: {str(e)}")
return False
def fallback_text_send(task_id: int, result, webhook_url: str):
"""备用方案:使用纯文本格式发送"""
try:
message = {
"msg_type": "text",
"content": {
"text": f"任务ID: {task_id}\n结果: {str(result)[:500]}..." # 限制长度
}
}
headers = {'Content-Type': 'application/json'}
response = requests.post(webhook_url, headers=headers, data=json.dumps(message))
if response.status_code == 200:
feishu_response = response.json()
if feishu_response.get('code') == 0:
print("✓ 备用文本消息发送成功")
return True
return False
except:
return False
# 调试函数:查看数据结构
def debug_task_data(task_id: int):
"""调试函数,查看任务数据的结构"""
try:
task_query = MagicTaskQuery(task_id)
result = task_query.get_task_info()
print("=== 调试信息 ===")
print(f"数据类型: {type(result)}")
print(f"数据内容: {result}")
if hasattr(result, '__dict__'):
print("对象属性:")
for key, value in result.__dict__.items():
print(f" {key}: {value}")
if isinstance(result, dict):
print("字典键值:")
for key, value in result.items():
print(f" {key}: {value}")
return result
except Exception as e:
print(f"调试失败: {str(e)}")
return None
# 使用示例
if __name__ == "__main__":
# 请替换为您的实际webhook链接
WEBHOOK_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/c0a6dfdf-0a4b-4293-b997-a3eabd2597cf"
TASK_ID = 33945388
BUG = "画中画字段缺失"
# WEBHOOK_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/3317c0db-c30c-4386-97dd-e8d5d427b611" # 魔剪测试群
# 先调试查看数据结构
# print("=== 调试数据结构 ===")
# debug_task_data(TASK_ID)
print("\n=== 发送消息 ===")
# 使用安全版本发送
success = safe_send_task_update(TASK_ID, WEBHOOK_URL, BUG)
if not success:
print("尝试使用简单文本格式...")
success = quick_send_task_update(TASK_ID, WEBHOOK_URL)