bugfix
This commit is contained in:
parent
5035535ac0
commit
14c85ca342
60
README.md
60
README.md
@ -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 关注
|
||||
|
||||
发送给消息处理程序的结构:
|
||||
{
|
||||
|
||||
10
woa/init.py
10
woa/init.py
@ -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)
|
||||
|
||||
32
woa/reply.py
32
woa/reply.py
@ -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>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user