feat 微信自动注册菜单

This commit is contained in:
jxxghp 2023-09-05 10:58:19 +08:00
parent bb729bf976
commit 114788e3ed
2 changed files with 87 additions and 6 deletions

View File

@ -101,11 +101,17 @@ class WechatModule(_ModuleBase):
user_id == admin_user for admin_user in wechat_admins): user_id == admin_user for admin_user in wechat_admins):
self.wechat.send_msg(title="用户无权限执行菜单命令", userid=user_id) self.wechat.send_msg(title="用户无权限执行菜单命令", userid=user_id)
return None return None
# 根据Event执行命令
content = event
logger.info(f"收到微信事件userid={user_id}, event={content}")
elif msg_type == "text": elif msg_type == "text":
# 文本消息 # 文本消息
content = DomUtils.tag_value(root_node, "Content", default="") content = DomUtils.tag_value(root_node, "Content", default="")
if content:
logger.info(f"收到微信消息userid={user_id}, text={content}") logger.info(f"收到微信消息userid={user_id}, text={content}")
else:
return None
if content:
# 处理消息内容 # 处理消息内容
return CommingMessage(channel=MessageChannel.Wechat, return CommingMessage(channel=MessageChannel.Wechat,
userid=user_id, username=user_id, text=content) userid=user_id, username=user_id, text=content)
@ -145,3 +151,10 @@ class WechatModule(_ModuleBase):
:return: 成功或失败 :return: 成功或失败
""" """
return self.wechat.send_torrents_msg(title=message.title, torrents=torrents, userid=message.userid) return self.wechat.send_torrents_msg(title=message.title, torrents=torrents, userid=message.userid)
def register_commands(self, commands: dict):
"""
注册命令实现这个函数接收系统可用的命令菜单
:param commands: 命令字典
"""
self.wechat.create_menus(commands)

View File

@ -33,6 +33,8 @@ class WeChat(metaclass=Singleton):
_send_msg_url = f"{settings.WECHAT_PROXY}/cgi-bin/message/send?access_token=%s" _send_msg_url = f"{settings.WECHAT_PROXY}/cgi-bin/message/send?access_token=%s"
# 企业微信获取TokenURL # 企业微信获取TokenURL
_token_url = f"{settings.WECHAT_PROXY}/cgi-bin/gettoken?corpid=%s&corpsecret=%s" _token_url = f"{settings.WECHAT_PROXY}/cgi-bin/gettoken?corpid=%s&corpsecret=%s"
# 企业微信创新菜单URL
_create_menu_url = f"{settings.WECHAT_PROXY}/cgi-bin/menu/create?access_token=%s&agentid=%s"
def __init__(self): def __init__(self):
""" """
@ -69,6 +71,10 @@ class WeChat(metaclass=Singleton):
self._access_token = ret_json.get('access_token') self._access_token = ret_json.get('access_token')
self._expires_in = ret_json.get('expires_in') self._expires_in = ret_json.get('expires_in')
self._access_token_time = datetime.now() self._access_token_time = datetime.now()
elif res is not None:
logger.error(f"获取微信access_token失败错误码{res.status_code},错误原因:{res.reason}")
else:
logger.error(f"获取微信access_token失败未获取到返回信息")
except Exception as e: except Exception as e:
logger.error(f"获取微信access_token失败错误信息{e}") logger.error(f"获取微信access_token失败错误信息{e}")
return None return None
@ -255,14 +261,76 @@ class WeChat(metaclass=Singleton):
else: else:
if ret_json.get('errcode') == 42001: if ret_json.get('errcode') == 42001:
self.__get_access_token(force=True) self.__get_access_token(force=True)
logger.error(f"发送消息失败,错误信息:{ret_json.get('errmsg')}") logger.error(f"发送请求失败,错误信息:{ret_json.get('errmsg')}")
return False return False
elif res is not None: elif res is not None:
logger.error(f"发送消息失败,错误码:{res.status_code},错误原因:{res.reason}") logger.error(f"发送请求失败,错误码:{res.status_code},错误原因:{res.reason}")
return False return False
else: else:
logger.error(f"发送消息失败,未获取到返回信息") logger.error(f"发送请求失败,未获取到返回信息")
return False return False
except Exception as err: except Exception as err:
logger.error(f"发送消息失败,错误信息:{err}") logger.error(f"发送请求失败,错误信息:{err}")
return False return False
def create_menus(self, commands: dict):
"""
自动注册微信菜单
:param commands: 命令字典
命令字典
{
"/cookiecloud": {
"func": CookieCloudChain(self._db).remote_sync,
"description": "同步站点",
"data": {}
}
}
注册报文格式
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}
]
}
]
}
"""
# 请求URL
req_url = self._create_menu_url % (self.__get_access_token(), self._appid)
# 按钮
buttons = []
for key, value in commands.items():
buttons.append({
"type": "click",
"name": value.get("description"),
"key": key
})
if buttons:
# 请求参数
menus = {
"button": [
{
"name": "操作",
"sub_button": []
}
]
}
# 发送请求
self.__post_request(req_url, menus)