This commit is contained in:
yumoqing 2026-03-03 16:09:57 +08:00
parent 5035535ac0
commit 14c85ca342
3 changed files with 85 additions and 17 deletions

View File

@ -5,12 +5,72 @@
## 接收消息类型
* TextMessage
{
'ToUserName': '',
'FromUserName': '',
'CreateTime': '',
'MsgType': 'text',
'Content': 'hret',
'MsgId': '25376371128450301'
}
* ImageMessage
{
'ToUserName': '',
'FromUserName': '',
'CreateTime': '',
'MsgType': 'image',
'PicUrl': '可直接使用的图像url',
'MsgId': '25376358150108245',
'MediaId': 'utihMtnTma-qbcPMfc7zQlAAhT'
}
* VoiceMessage
数据内容:
{
'ToUserName': '微信服务号id',
'FromUserName': '用户的openid',
'CreateTime': '消息时间',
'MsgType': 'voice',
'MediaId': '媒体id用此可以转可下载的url',
'Format': 'amr',
'MsgId': '7612907756399362048',
'Recognition': None, # 识别结果
'MediaId16K': '16K音质的mediaid'
}
* VideoMessage
{
'ToUserName': '',
'FromUserName': '',
'CreateTime': '',
'MsgType': 'video',
'MediaId': '',
'ThumbMediaId': '',
'MsgId': '817'}
* LocationMessage
{
'ToUserName': '',
'FromUserName': '',
'CreateTime': '',
'MsgType': 'location',
'Location_X': '',
'Location_Y': '',
'Scale': '15',
'Label': '',
'MsgId': ''
}
* LinkMessage
* EventMessage
1 自定义菜单
{
'ToUserName': '',
'FromUserName': '',
'CreateTime': '',
'MsgType': 'event',
'Event': 'VIEW',
'EventKey': '点击菜单对应的URL',
'MenuId': ''
}
2 关注
发送给消息处理程序的结构:
{

View File

@ -156,12 +156,20 @@ class WOAHandler:
"""
config = getConfig()
if msg.MsgType in ['video', 'voice', 'image']:
msg.media_url = self.media_manager.get_media_url(msg.media_id)
msg.media_url = await self.media_manager.get_media_url(msg.MediaId)
msg.subscribe_id = getID()
# 文本测试, 已通过
"""
rzt_dic = DictObject(**{
'msgtype':'text',
'content': '收到'
})
"""
fs = FileStorage()
rzt_dic = DictObject(**{
"msgtype": "video",
"media_file": fs.realPath('/UiEi7hKqAmU1-jqQEVhZe/5/171/99/17/vidu-1.mp4')
})
return rzt_dic
await zmq_publish(config.woa_handler_id, json.dumps(msg, ensure_ascii=False))
result = await zmq_subcribe(msg.subscribe_id)

View File

@ -28,7 +28,7 @@ class ReplyBuilder:
"""
@staticmethod
def text(msg: Dict[str, Any], content: str) -> str:
def text(msg: Dict[str, Any], content: str, create_time=None) -> str:
"""
构造文本回复
:param msg: 原始接收消息字典
@ -36,14 +36,14 @@ class ReplyBuilder:
"""
to_user = msg.get('FromUserName')
from_user = msg.get('ToUserName')
create_time = int(time.time())
create_time = create_time or int(time.time())
xml = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'text')
xml += f"<Content><![CDATA[{content}]]></Content>\n</xml>"
return xml
@staticmethod
def image(msg: Dict[str, Any], media_id: str) -> str:
def image(msg: Dict[str, Any], media_id: str, create_time=None) -> str:
"""
构造图片回复
:param msg: 原始接收消息字典
@ -51,7 +51,7 @@ class ReplyBuilder:
"""
to_user = msg.get('FromUserName')
from_user = msg.get('ToUserName')
create_time = int(time.time())
create_time = create_time or int(time.time())
xml = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'image')
xml += f"""<Image>
@ -61,7 +61,7 @@ class ReplyBuilder:
return xml
@staticmethod
def voice(msg: Dict[str, Any], media_id: str) -> str:
def voice(msg: Dict[str, Any], media_id: str, create_time=None) -> str:
"""
构造语音回复
:param msg: 原始接收消息字典
@ -69,7 +69,7 @@ class ReplyBuilder:
"""
to_user = msg.get('FromUserName')
from_user = msg.get('ToUserName')
create_time = int(time.time())
create_time = create_time or int(time.time())
xml = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'voice')
xml += f"""<Voice>
@ -79,7 +79,7 @@ class ReplyBuilder:
return xml
@staticmethod
def video(msg: Dict[str, Any], media_id: str, title: str = "", description: str = "") -> str:
def video(msg: Dict[str, Any], media_id: str, title: str = "", description: str = "", create_time=None) -> str:
"""
构造视频回复
:param msg: 原始接收消息字典
@ -89,7 +89,7 @@ class ReplyBuilder:
"""
to_user = msg.get('FromUserName')
from_user = msg.get('ToUserName')
create_time = int(time.time())
create_time = create_time or int(time.time())
xml = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'video')
xml += f"""<Video>
@ -101,7 +101,7 @@ class ReplyBuilder:
return xml
@staticmethod
def music(msg: Dict[str, Any], title: str, description: str, music_url: str, hq_music_url: str, thumb_media_id: str) -> str:
def music(msg: Dict[str, Any], title: str, description: str, music_url: str, hq_music_url: str, thumb_media_id: str, create_time=None) -> str:
"""
构造音乐回复
:param msg: 原始接收消息字典
@ -113,7 +113,7 @@ class ReplyBuilder:
"""
to_user = msg.get('FromUserName')
from_user = msg.get('ToUserName')
create_time = int(time.time())
create_time = create_time or int(time.time())
xml = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'music')
xml += f"""<Music>
@ -127,7 +127,7 @@ class ReplyBuilder:
return xml
@staticmethod
def news(msg: Dict[str, Any], articles: List[Dict[str, str]]) -> str:
def news(msg: Dict[str, Any], articles: List[Dict[str, str]], create_time=None) -> str:
"""
构造图文消息回复 (支持 1-8 )
:param msg: 原始接收消息字典
@ -135,7 +135,7 @@ class ReplyBuilder:
"""
to_user = msg.get('FromUserName')
from_user = msg.get('ToUserName')
create_time = int(time.time())
create_time = create_time or int(time.time())
if not articles:
# 如果没有文章,返回空字符串或默认文本,避免生成非法 XML
@ -166,7 +166,7 @@ class ReplyBuilder:
return xml
@staticmethod
def single_article(msg: Dict[str, Any], title: str, description: str, image: str, url: str) -> str:
def single_article(msg: Dict[str, Any], create_time=None, title: str, description: str, image: str, url: str) -> str:
"""
快捷方法构造单篇图文消息
"""
@ -176,10 +176,10 @@ class ReplyBuilder:
"image": image,
"url": url
}
return ReplyBuilder.news(msg, [article])
return ReplyBuilder.news(msg, [article], create_time=create_time)
@staticmethod
def transfer_customer_service(msg: Dict[str, Any]) -> str:
def transfer_customer_service(msg: Dict[str, Any], create_time=None) -> str:
"""
构造转发客服消息指令
用途当机器人无法回答时将此消息返回给微信用户消息会进入客服队列
@ -188,7 +188,7 @@ class ReplyBuilder:
"""
to_user = msg.get('FromUserName')
from_user = msg.get('ToUserName')
create_time = int(time.time())
create_time = create_time or int(time.time())
# 这种类型的回复没有 Content 或其他节点,只有 MsgType
xml = f"""<xml>