@@ -14,7 +14,7 @@ def __init__(self, webhook_url=None):
1414 self .default_webhook_url = webhook_url or os .environ .get ('WECOM_WEBHOOK_URL' , '' )
1515 self .enabled = os .environ .get ('WECOM_ENABLED' , '0' ) == '1'
1616
17- def _get_webhook_url (self , project_name = None ):
17+ def _get_webhook_url (self , project_name = None , url_base = None ):
1818 """
1919 获取项目对应的 Webhook URL
2020 :param project_name: 项目名称
@@ -27,11 +27,19 @@ def _get_webhook_url(self, project_name=None):
2727 return self .default_webhook_url
2828 else :
2929 raise ValueError ("未提供项目名称,且未设置默认的企业微信 Webhook URL。" )
30-
30+
3131 # 遍历所有环境变量(忽略大小写),找到项目对应的 Webhook URL
3232 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 ()} "
3341 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 :
3543 return env_value # 找到匹配项,直接返回
3644
3745 # 如果未找到匹配的环境变量,降级使用全局的 Webhook URL
@@ -60,7 +68,7 @@ def format_markdown_content(self, content, title=None):
6068 formatted_content += content
6169 return formatted_content
6270
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 ):
6472 """
6573 发送企业微信消息
6674 :param content: 消息内容
@@ -73,7 +81,7 @@ def send_message(self, content, msg_type='text', title=None, is_at_all=False, pr
7381 return
7482
7583 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 )
7785 if msg_type == 'markdown' :
7886 formatted_content = self .format_markdown_content (content , title )
7987 data = {
@@ -99,6 +107,31 @@ def send_message(self, content, msg_type='text', title=None, is_at_all=False, pr
99107
100108 if response .status_code != 200 :
101109 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+
102135 return
103136
104137 result = response .json ()
0 commit comments