bugfix
This commit is contained in:
parent
5035535ac0
commit
14c85ca342
60
README.md
60
README.md
@ -5,12 +5,72 @@
|
|||||||
## 接收消息类型
|
## 接收消息类型
|
||||||
|
|
||||||
* TextMessage
|
* TextMessage
|
||||||
|
{
|
||||||
|
'ToUserName': '',
|
||||||
|
'FromUserName': '',
|
||||||
|
'CreateTime': '',
|
||||||
|
'MsgType': 'text',
|
||||||
|
'Content': 'hret',
|
||||||
|
'MsgId': '25376371128450301'
|
||||||
|
}
|
||||||
* ImageMessage
|
* ImageMessage
|
||||||
|
{
|
||||||
|
'ToUserName': '',
|
||||||
|
'FromUserName': '',
|
||||||
|
'CreateTime': '',
|
||||||
|
'MsgType': 'image',
|
||||||
|
'PicUrl': '可直接使用的图像url',
|
||||||
|
'MsgId': '25376358150108245',
|
||||||
|
'MediaId': 'utihMtnTma-qbcPMfc7zQlAAhT'
|
||||||
|
}
|
||||||
|
|
||||||
* VoiceMessage
|
* VoiceMessage
|
||||||
|
数据内容:
|
||||||
|
{
|
||||||
|
'ToUserName': '微信服务号id',
|
||||||
|
'FromUserName': '用户的openid',
|
||||||
|
'CreateTime': '消息时间',
|
||||||
|
'MsgType': 'voice',
|
||||||
|
'MediaId': '媒体id,用此可以转可下载的url',
|
||||||
|
'Format': 'amr',
|
||||||
|
'MsgId': '7612907756399362048',
|
||||||
|
'Recognition': None, # 识别结果
|
||||||
|
'MediaId16K': '16K音质的mediaid'
|
||||||
|
}
|
||||||
* VideoMessage
|
* VideoMessage
|
||||||
|
{
|
||||||
|
'ToUserName': '',
|
||||||
|
'FromUserName': '',
|
||||||
|
'CreateTime': '',
|
||||||
|
'MsgType': 'video',
|
||||||
|
'MediaId': '',
|
||||||
|
'ThumbMediaId': '',
|
||||||
|
'MsgId': '817'}
|
||||||
* LocationMessage
|
* LocationMessage
|
||||||
|
{
|
||||||
|
'ToUserName': '',
|
||||||
|
'FromUserName': '',
|
||||||
|
'CreateTime': '',
|
||||||
|
'MsgType': 'location',
|
||||||
|
'Location_X': '',
|
||||||
|
'Location_Y': '',
|
||||||
|
'Scale': '15',
|
||||||
|
'Label': '',
|
||||||
|
'MsgId': ''
|
||||||
|
}
|
||||||
* LinkMessage
|
* LinkMessage
|
||||||
* EventMessage
|
* 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()
|
config = getConfig()
|
||||||
if msg.MsgType in ['video', 'voice', 'image']:
|
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()
|
msg.subscribe_id = getID()
|
||||||
|
# 文本测试, 已通过
|
||||||
|
"""
|
||||||
rzt_dic = DictObject(**{
|
rzt_dic = DictObject(**{
|
||||||
'msgtype':'text',
|
'msgtype':'text',
|
||||||
'content': '收到'
|
'content': '收到'
|
||||||
})
|
})
|
||||||
|
"""
|
||||||
|
fs = FileStorage()
|
||||||
|
rzt_dic = DictObject(**{
|
||||||
|
"msgtype": "video",
|
||||||
|
"media_file": fs.realPath('/UiEi7hKqAmU1-jqQEVhZe/5/171/99/17/vidu-1.mp4')
|
||||||
|
})
|
||||||
return rzt_dic
|
return rzt_dic
|
||||||
await zmq_publish(config.woa_handler_id, json.dumps(msg, ensure_ascii=False))
|
await zmq_publish(config.woa_handler_id, json.dumps(msg, ensure_ascii=False))
|
||||||
result = await zmq_subcribe(msg.subscribe_id)
|
result = await zmq_subcribe(msg.subscribe_id)
|
||||||
|
|||||||
32
woa/reply.py
32
woa/reply.py
@ -28,7 +28,7 @@ class ReplyBuilder:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def text(msg: Dict[str, Any], content: str) -> str:
|
def text(msg: Dict[str, Any], content: str, create_time=None) -> str:
|
||||||
"""
|
"""
|
||||||
构造文本回复
|
构造文本回复
|
||||||
:param msg: 原始接收消息字典
|
:param msg: 原始接收消息字典
|
||||||
@ -36,14 +36,14 @@ class ReplyBuilder:
|
|||||||
"""
|
"""
|
||||||
to_user = msg.get('FromUserName')
|
to_user = msg.get('FromUserName')
|
||||||
from_user = msg.get('ToUserName')
|
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 = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'text')
|
||||||
xml += f"<Content><![CDATA[{content}]]></Content>\n</xml>"
|
xml += f"<Content><![CDATA[{content}]]></Content>\n</xml>"
|
||||||
return xml
|
return xml
|
||||||
|
|
||||||
@staticmethod
|
@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: 原始接收消息字典
|
:param msg: 原始接收消息字典
|
||||||
@ -51,7 +51,7 @@ class ReplyBuilder:
|
|||||||
"""
|
"""
|
||||||
to_user = msg.get('FromUserName')
|
to_user = msg.get('FromUserName')
|
||||||
from_user = msg.get('ToUserName')
|
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 = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'image')
|
||||||
xml += f"""<Image>
|
xml += f"""<Image>
|
||||||
@ -61,7 +61,7 @@ class ReplyBuilder:
|
|||||||
return xml
|
return xml
|
||||||
|
|
||||||
@staticmethod
|
@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: 原始接收消息字典
|
:param msg: 原始接收消息字典
|
||||||
@ -69,7 +69,7 @@ class ReplyBuilder:
|
|||||||
"""
|
"""
|
||||||
to_user = msg.get('FromUserName')
|
to_user = msg.get('FromUserName')
|
||||||
from_user = msg.get('ToUserName')
|
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 = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'voice')
|
||||||
xml += f"""<Voice>
|
xml += f"""<Voice>
|
||||||
@ -79,7 +79,7 @@ class ReplyBuilder:
|
|||||||
return xml
|
return xml
|
||||||
|
|
||||||
@staticmethod
|
@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: 原始接收消息字典
|
:param msg: 原始接收消息字典
|
||||||
@ -89,7 +89,7 @@ class ReplyBuilder:
|
|||||||
"""
|
"""
|
||||||
to_user = msg.get('FromUserName')
|
to_user = msg.get('FromUserName')
|
||||||
from_user = msg.get('ToUserName')
|
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 = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'video')
|
||||||
xml += f"""<Video>
|
xml += f"""<Video>
|
||||||
@ -101,7 +101,7 @@ class ReplyBuilder:
|
|||||||
return xml
|
return xml
|
||||||
|
|
||||||
@staticmethod
|
@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: 原始接收消息字典
|
:param msg: 原始接收消息字典
|
||||||
@ -113,7 +113,7 @@ class ReplyBuilder:
|
|||||||
"""
|
"""
|
||||||
to_user = msg.get('FromUserName')
|
to_user = msg.get('FromUserName')
|
||||||
from_user = msg.get('ToUserName')
|
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 = ReplyBuilder._get_base_xml(to_user, from_user, create_time, 'music')
|
||||||
xml += f"""<Music>
|
xml += f"""<Music>
|
||||||
@ -127,7 +127,7 @@ class ReplyBuilder:
|
|||||||
return xml
|
return xml
|
||||||
|
|
||||||
@staticmethod
|
@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 篇)
|
构造图文消息回复 (支持 1-8 篇)
|
||||||
:param msg: 原始接收消息字典
|
:param msg: 原始接收消息字典
|
||||||
@ -135,7 +135,7 @@ class ReplyBuilder:
|
|||||||
"""
|
"""
|
||||||
to_user = msg.get('FromUserName')
|
to_user = msg.get('FromUserName')
|
||||||
from_user = msg.get('ToUserName')
|
from_user = msg.get('ToUserName')
|
||||||
create_time = int(time.time())
|
create_time = create_time or int(time.time())
|
||||||
|
|
||||||
if not articles:
|
if not articles:
|
||||||
# 如果没有文章,返回空字符串或默认文本,避免生成非法 XML
|
# 如果没有文章,返回空字符串或默认文本,避免生成非法 XML
|
||||||
@ -166,7 +166,7 @@ class ReplyBuilder:
|
|||||||
return xml
|
return xml
|
||||||
|
|
||||||
@staticmethod
|
@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,
|
"image": image,
|
||||||
"url": url
|
"url": url
|
||||||
}
|
}
|
||||||
return ReplyBuilder.news(msg, [article])
|
return ReplyBuilder.news(msg, [article], create_time=create_time)
|
||||||
|
|
||||||
@staticmethod
|
@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')
|
to_user = msg.get('FromUserName')
|
||||||
from_user = msg.get('ToUserName')
|
from_user = msg.get('ToUserName')
|
||||||
create_time = int(time.time())
|
create_time = create_time or int(time.time())
|
||||||
|
|
||||||
# 这种类型的回复没有 Content 或其他节点,只有 MsgType
|
# 这种类型的回复没有 Content 或其他节点,只有 MsgType
|
||||||
xml = f"""<xml>
|
xml = f"""<xml>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user