mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 15:38:19 +08:00
feat(wechat): add retry mechanism for message requests
This commit is contained in:
@@ -66,7 +66,7 @@ class WeChat:
|
|||||||
"""
|
"""
|
||||||
获取状态
|
获取状态
|
||||||
"""
|
"""
|
||||||
return True if self.__get_access_token else False
|
return True if self.__get_access_token() else False
|
||||||
|
|
||||||
@retry(Exception, logger=logger)
|
@retry(Exception, logger=logger)
|
||||||
def __get_access_token(self, force=False):
|
def __get_access_token(self, force=False):
|
||||||
@@ -172,23 +172,17 @@ class WeChat:
|
|||||||
if not title:
|
if not title:
|
||||||
logger.error("消息标题不能为空")
|
logger.error("消息标题不能为空")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
message_url = self._send_msg_url.format(access_token=self.__get_access_token())
|
|
||||||
if text:
|
if text:
|
||||||
formatted_text = text.replace("\n\n", "\n")
|
formatted_text = text.replace("\n\n", "\n")
|
||||||
content = f"{title}\n{formatted_text}"
|
content = f"{title}\n{formatted_text}"
|
||||||
else:
|
else:
|
||||||
content = title
|
content = title
|
||||||
|
|
||||||
if link:
|
if link:
|
||||||
content = f"{content}\n点击查看:{link}"
|
content = f"{content}\n点击查看:{link}"
|
||||||
|
|
||||||
if not userid:
|
if not userid:
|
||||||
userid = "@all"
|
userid = "@all"
|
||||||
|
|
||||||
# 分块处理逻辑
|
# 分块处理逻辑
|
||||||
content_chunks = self.__split_content(content)
|
content_chunks = self.__split_content(content)
|
||||||
|
|
||||||
# 逐块发送消息
|
# 逐块发送消息
|
||||||
for chunk in content_chunks:
|
for chunk in content_chunks:
|
||||||
req_json = {
|
req_json = {
|
||||||
@@ -202,11 +196,13 @@ class WeChat:
|
|||||||
"enable_id_trans": 0,
|
"enable_id_trans": 0,
|
||||||
"enable_duplicate_check": 0
|
"enable_duplicate_check": 0
|
||||||
}
|
}
|
||||||
result = self.__post_request(message_url, req_json)
|
try:
|
||||||
if not result:
|
# 如果是超长消息,有一个发送失败就全部失败
|
||||||
logger.error(f"发送消息块失败: {chunk}")
|
if not self.__post_request(self._send_msg_url, req_json):
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"发送消息块失败:{e}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def __send_image_message(self, title: str, text: str, image_url: str,
|
def __send_image_message(self, title: str, text: str, image_url: str,
|
||||||
@@ -220,7 +216,6 @@ class WeChat:
|
|||||||
:param link: 跳转链接
|
:param link: 跳转链接
|
||||||
:return: 发送状态,错误信息
|
:return: 发送状态,错误信息
|
||||||
"""
|
"""
|
||||||
message_url = self._send_msg_url.format(access_token=self.__get_access_token())
|
|
||||||
if text:
|
if text:
|
||||||
text = text.replace("\n\n", "\n")
|
text = text.replace("\n\n", "\n")
|
||||||
if not userid:
|
if not userid:
|
||||||
@@ -240,7 +235,11 @@ class WeChat:
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self.__post_request(message_url, req_json)
|
try:
|
||||||
|
return self.__post_request(self._send_msg_url, req_json)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"发送图文消息失败:{e}")
|
||||||
|
return False
|
||||||
|
|
||||||
def send_msg(self, title: str, text: str = "", image: str = "",
|
def send_msg(self, title: str, text: str = "", image: str = "",
|
||||||
userid: str = None, link: str = None) -> Optional[bool]:
|
userid: str = None, link: str = None) -> Optional[bool]:
|
||||||
@@ -272,7 +271,6 @@ class WeChat:
|
|||||||
logger.error("获取微信access_token失败,请检查参数配置")
|
logger.error("获取微信access_token失败,请检查参数配置")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
message_url = self._send_msg_url.format(access_token=self.__get_access_token())
|
|
||||||
if not userid:
|
if not userid:
|
||||||
userid = "@all"
|
userid = "@all"
|
||||||
articles = []
|
articles = []
|
||||||
@@ -298,7 +296,11 @@ class WeChat:
|
|||||||
"articles": articles
|
"articles": articles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self.__post_request(message_url, req_json)
|
try:
|
||||||
|
return self.__post_request(self._send_msg_url, req_json)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"发送消息失败:{e}")
|
||||||
|
return False
|
||||||
|
|
||||||
def send_torrents_msg(self, torrents: List[Context],
|
def send_torrents_msg(self, torrents: List[Context],
|
||||||
userid: str = "", title: str = "", link: str = None) -> Optional[bool]:
|
userid: str = "", title: str = "", link: str = None) -> Optional[bool]:
|
||||||
@@ -314,7 +316,6 @@ class WeChat:
|
|||||||
self.__send_message(title=title, userid=userid, link=link)
|
self.__send_message(title=title, userid=userid, link=link)
|
||||||
|
|
||||||
# 发送列表
|
# 发送列表
|
||||||
message_url = self._send_msg_url.format(access_token=self.__get_access_token())
|
|
||||||
if not userid:
|
if not userid:
|
||||||
userid = "@all"
|
userid = "@all"
|
||||||
articles = []
|
articles = []
|
||||||
@@ -348,35 +349,41 @@ class WeChat:
|
|||||||
"articles": articles
|
"articles": articles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self.__post_request(message_url, req_json)
|
try:
|
||||||
|
return self.__post_request(self._send_msg_url, req_json)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"发送消息失败:{e}")
|
||||||
|
return False
|
||||||
|
|
||||||
def __post_request(self, message_url: str, req_json: dict) -> bool:
|
@retry(Exception, logger=logger)
|
||||||
|
def __post_request(self, url: str, req_json: dict) -> bool:
|
||||||
"""
|
"""
|
||||||
向微信发送请求
|
向微信发送请求
|
||||||
"""
|
"""
|
||||||
try:
|
url = url.format(access_token=self.__get_access_token())
|
||||||
res = RequestUtils(content_type="application/json").post(
|
res = RequestUtils(content_type="application/json").post(
|
||||||
message_url,
|
url=url,
|
||||||
data=json.dumps(req_json, ensure_ascii=False).encode("utf-8")
|
data=json.dumps(req_json, ensure_ascii=False).encode("utf-8")
|
||||||
)
|
)
|
||||||
if res and res.status_code == 200:
|
if res is None:
|
||||||
ret_json = res.json()
|
error_msg = "发送请求失败,未获取到返回信息"
|
||||||
if ret_json.get("errcode") == 0:
|
raise Exception(error_msg)
|
||||||
return True
|
if res.status_code != 200:
|
||||||
else:
|
error_msg = f"发送请求失败,错误码:{res.status_code},错误原因:{res.reason}"
|
||||||
if ret_json.get("errcode") == 42001:
|
raise Exception(error_msg)
|
||||||
self.__get_access_token(force=True)
|
|
||||||
logger.error(f"发送请求失败,错误信息:{ret_json.get('errmsg')}")
|
ret_json = res.json()
|
||||||
return False
|
if ret_json.get("errcode") == 0:
|
||||||
elif res is not None:
|
return True
|
||||||
logger.error(f"发送请求失败,错误码:{res.status_code},错误原因:{res.reason}")
|
else:
|
||||||
return False
|
if ret_json.get("errcode") == 42001:
|
||||||
|
self.__get_access_token(force=True)
|
||||||
|
error_msg = (f"access_token 已过期,尝试重新获取 access_token,"
|
||||||
|
f"errcode: {ret_json.get('errcode')}, errmsg: {ret_json.get('errmsg')}")
|
||||||
|
raise Exception(error_msg)
|
||||||
else:
|
else:
|
||||||
logger.error(f"发送请求失败,未获取到返回信息")
|
logger.error(f"发送请求失败,错误信息:{ret_json.get('errmsg')}")
|
||||||
return False
|
return False
|
||||||
except Exception as err:
|
|
||||||
logger.error(f"发送请求失败,错误信息:{str(err)}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
def create_menus(self, commands: Dict[str, dict]):
|
def create_menus(self, commands: Dict[str, dict]):
|
||||||
"""
|
"""
|
||||||
@@ -418,7 +425,7 @@ class WeChat:
|
|||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
# 请求URL
|
# 请求URL
|
||||||
req_url = self._create_menu_url.format(access_token=self.__get_access_token(), agentid=self._appid)
|
req_url = self._create_menu_url.format(access_token="{access_token}", agentid=self._appid)
|
||||||
|
|
||||||
# 对commands按category分组
|
# 对commands按category分组
|
||||||
category_dict = {}
|
category_dict = {}
|
||||||
@@ -447,9 +454,13 @@ class WeChat:
|
|||||||
|
|
||||||
if buttons:
|
if buttons:
|
||||||
# 发送请求
|
# 发送请求
|
||||||
self.__post_request(req_url, {
|
try:
|
||||||
"button": buttons[:3]
|
self.__post_request(req_url, {
|
||||||
})
|
"button": buttons[:3]
|
||||||
|
})
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"创建菜单失败:{e}")
|
||||||
|
return False
|
||||||
|
|
||||||
def delete_menus(self):
|
def delete_menus(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user