@@ -14,7 +14,7 @@ def __init__(self, webhook_url=None):
14
14
self .default_webhook_url = webhook_url or os .environ .get ('WECOM_WEBHOOK_URL' , '' )
15
15
self .enabled = os .environ .get ('WECOM_ENABLED' , '0' ) == '1'
16
16
17
- def _get_webhook_url (self , project_name = None ):
17
+ def _get_webhook_url (self , project_name = None , url_base = None ):
18
18
"""
19
19
获取项目对应的 Webhook URL
20
20
:param project_name: 项目名称
@@ -27,11 +27,19 @@ def _get_webhook_url(self, project_name=None):
27
27
return self .default_webhook_url
28
28
else :
29
29
raise ValueError ("未提供项目名称,且未设置默认的企业微信 Webhook URL。" )
30
-
30
+
31
31
# 遍历所有环境变量(忽略大小写),找到项目对应的 Webhook URL
32
32
target_key = f"WECOM_WEBHOOK_URL_{ project_name .upper ()} "
33
+
34
+ # 仓库名称优先级高,先匹配
35
+ for env_key , env_value in os .environ .items ():
36
+ if env_key .upper () == target_key :
37
+ return env_value # 找到匹配项,直接返回
38
+
39
+ # url_base 优先级次之
40
+ target_key_url_base = f"WECOM_WEBHOOK_URL_{ url_base .upper ()} "
33
41
for env_key , env_value in os .environ .items ():
34
- if env_key .upper () == target_key :
42
+ if target_key_url_base != None and env_key .upper () == target_key_url_base :
35
43
return env_value # 找到匹配项,直接返回
36
44
37
45
# 如果未找到匹配的环境变量,降级使用全局的 Webhook URL
@@ -60,7 +68,7 @@ def format_markdown_content(self, content, title=None):
60
68
formatted_content += content
61
69
return formatted_content
62
70
63
- def send_message (self , content , msg_type = 'text' , title = None , is_at_all = False , project_name = None ):
71
+ def send_message (self , content , msg_type = 'text' , title = None , is_at_all = False , project_name = None , url_base = None ):
64
72
"""
65
73
发送企业微信消息
66
74
:param content: 消息内容
@@ -73,7 +81,7 @@ def send_message(self, content, msg_type='text', title=None, is_at_all=False, pr
73
81
return
74
82
75
83
try :
76
- post_url = self ._get_webhook_url (project_name = project_name )
84
+ post_url = self ._get_webhook_url (project_name = project_name , url_base = url_base )
77
85
if msg_type == 'markdown' :
78
86
formatted_content = self .format_markdown_content (content , title )
79
87
data = {
@@ -99,6 +107,31 @@ def send_message(self, content, msg_type='text', title=None, is_at_all=False, pr
99
107
100
108
if response .status_code != 200 :
101
109
logger .error (f"企业微信消息发送失败! webhook_url:{ post_url } , error_msg:{ response .text } " )
110
+
111
+ try :
112
+ data = json .loads (response .text )
113
+ errmsg = data .get ("errmsg" )
114
+ if errmsg and "markdown.content exceed max length" in errmsg :
115
+ # markdown渲染过长了,尝试text发送
116
+ data = {
117
+ "msgtype" : "text" ,
118
+ "text" : {
119
+ "content" : content ,
120
+ "mentioned_list" : ["@all" ] if is_at_all else []
121
+ }
122
+ }
123
+
124
+ response = requests .post (
125
+ url = post_url ,
126
+ json = data ,
127
+ headers = {'Content-Type' : 'application/json' }
128
+ )
129
+
130
+ except json .JSONDecodeError as e :
131
+ print (f"JSON 解析失败: { e } " )
132
+ except Exception as e :
133
+ logger .error (f"企业微信消息发送失败! " , e )
134
+
102
135
return
103
136
104
137
result = response .json ()
0 commit comments