88from ehforwarderbot import MsgType , Chat
99from ehforwarderbot .chat import ChatMember
1010from ehforwarderbot .message import Substitutions , Message , LinkAttribute , LocationAttribute
11+ from ehforwarderbot .types import MessageID
12+
13+ QUOTE_DIVIDER = " - - - - - - - - - - - - - - - "
14+
15+ def qutoed_text (qutoed_text : str , text : str , prefix : str = "" ) -> str :
16+ if QUOTE_DIVIDER in qutoed_text :
17+ qutoed_text = qutoed_text .split (QUOTE_DIVIDER )[- 1 ]
18+ return f"「{ prefix } { qutoed_text } 」\n { QUOTE_DIVIDER } \n { text } "
1119
1220def efb_text_simple_wrapper (text : str , ats : Union [Mapping [Tuple [int , int ], Union [Chat , ChatMember ]], None ] = None ) -> Message :
1321 """
@@ -138,7 +146,7 @@ def efb_mp_post_wrapper(item: etree.Element, show_name: str = None) -> Message:
138146 text = f'{ title } \n - - - - - - - - - - - - - - - \n { digest } ' if digest else str (title ),
139147 )
140148
141- def efb_share_link_wrapper (text : str ) -> Message :
149+ def efb_share_link_wrapper (message : dict , chat ) -> Message :
142150 """
143151 处理msgType49消息 - 复合xml, xml 中 //appmsg/type 指示具体消息类型.
144152 /msg/appmsg/type
@@ -164,10 +172,11 @@ def efb_share_link_wrapper(text: str) -> Message:
164172 //appmsg/type = 74 : 文件 (收到文件的第一个提示)
165173 //appmsg/type = 87 : 群公告
166174 //appmsg/type = 2000 : 转账
167- :param text : The content of the message
175+ :param message : The message
168176 :return: EFB Message
169177 """
170178
179+ text : str = message ['message' ]
171180 xml = etree .fromstring (text )
172181 result_text = ""
173182 try :
@@ -383,19 +392,43 @@ def efb_share_link_wrapper(text: str) -> Message:
383392 elif type == 57 : # 引用(回复)消息
384393 msg = xml .xpath ('/msg/appmsg/title/text()' )[0 ]
385394 refer_msgType = int (xml .xpath ('/msg/appmsg/refermsg/type/text()' )[0 ]) # 被引用消息类型
395+ e = xml .xpath ('/msg/appmsg/refermsg/svrid/text()' ) # 被引用消息 id
396+ refer_svrid = len (e ) > 0 and e [0 ] or None
386397 # refer_fromusr = xml.xpath('/msg/appmsg/refermsg/fromusr/text()')[0] # 被引用消息所在房间
387- # refer_fromusr = xml.xpath('/msg/appmsg/refermsg/chatusr/text()')[0] # 被引用消息发送人微信号
388- refer_displayname = xml .xpath ('/msg/appmsg/refermsg/displayname/text()' )[0 ] # 被引用消息发送人微信名称
389- if refer_msgType == 1 : # 被引用的消息是文本
390- refer_content = xml .xpath ('/msg/appmsg/refermsg/content/text()' )[0 ] # 被引用消息内容
391- result_text += f"「{ refer_displayname } : { refer_content } 」\n - - - - - - - - - - - - - - - \n { msg } "
392- else : # 被引用的消息非文本,提示不支持
393- result_text += f"「{ refer_displayname } : 系统消息: 被引用的消息不是文本,暂不支持展示」\n - - - - - - - - - - - - - - - \n { msg } "
398+ e = xml .xpath ('/msg/appmsg/refermsg/chatusr/text()' ) # 被引用消息发送人微信号
399+ refer_chatusr = len (e ) > 0 and e [0 ] or None
400+ e = xml .xpath ('/msg/appmsg/refermsg/displayname/text()' ) # 被引用消息发送人微信名称
401+ refer_displayname = len (e ) > 0 and e [0 ] or refer_chatusr
394402 efb_msg = Message (
395403 type = MsgType .Text ,
396- text = result_text ,
404+ text = msg ,
397405 vendor_specific = { "is_refer" : True }
398406 )
407+ prefix = ""
408+ if refer_displayname is not None :
409+ prefix = f"{ refer_displayname } :"
410+ if refer_svrid is None or refer_chatusr == message ["self" ]:
411+ if refer_msgType == 1 : # 被引用的消息是文本
412+ refer_content = xml .xpath ('/msg/appmsg/refermsg/content/text()' )[0 ] # 被引用消息内容
413+ result_text = qutoed_text (refer_content , msg , prefix )
414+ elif refer_msgType == 49 : # 被引用的消息也是引用消息
415+ try :
416+ refer_msg_content = xml .xpath ('/msg/appmsg/refermsg/content/text()' )[0 ] # 被引用消息引用的消息
417+ refer_msg_xml = etree .fromstring (refer_msg_content )
418+ type = int (refer_msg_xml .xpath ('/msg/appmsg/type/text()' )[0 ])
419+ if type == 57 :
420+ refer_msg_text = refer_msg_xml .xpath ('/msg/appmsg/title/text()' )[0 ]
421+ result_text = qutoed_text (refer_msg_text , msg , prefix )
422+ except Exception as e :
423+ print_exc ()
424+ else : # 被引用的消息非文本,提示不支持
425+ result_text = qutoed_text (" 系统消息: 被引用的消息不是文本,暂不支持展示" , msg , prefix )
426+ efb_msg .text = result_text
427+ else :
428+ efb_msg .target = Message (
429+ uid = MessageID (refer_svrid ),
430+ chat = chat ,
431+ )
399432 elif type == 63 : # 直播(微信视频号分享)
400433 title = xml .xpath ('/msg/appmsg/title/text()' )[0 ]
401434 url = xml .xpath ('/msg/appmsg/url/text()' )[0 ]
@@ -634,4 +667,4 @@ def efb_other_wrapper(text: str) -> Union[Message, None]:
634667 if efb_msg :
635668 return efb_msg
636669 else :
637- return None
670+ return None
0 commit comments