fix(dingtalk): group and person id not distinguished

This commit is contained in:
Junyan Qin
2025-03-02 17:35:06 +08:00
parent a198b6da0b
commit bc8c346e68
3 changed files with 28 additions and 20 deletions

View File

@@ -1,4 +1,5 @@
import base64
import json
import time
from typing import Callable
import dingtalk_stream
@@ -156,6 +157,7 @@ class DingTalkClient:
async def get_message(self,incoming_message:dingtalk_stream.chatbot.ChatbotMessage):
try:
# print(json.dumps(incoming_message.to_dict(), indent=4, ensure_ascii=False))
message_data = {
"IncomingMessage":incoming_message,
}
@@ -188,9 +190,9 @@ class DingTalkClient:
message_data['Type'] = 'audio'
# 删掉开头的@消息
if 'Content' in message_data and message_data["Content"].startswith("@"+self.robot_name):
message_data["Content"] = message_data["Content"][len("@"+self.robot_name):]
copy_message_data = message_data.copy()
del copy_message_data['IncomingMessage']
# print("message_data:", json.dumps(copy_message_data, indent=4, ensure_ascii=False))
except Exception:
traceback.print_exc()

View File

@@ -1,4 +1,5 @@
from typing import Dict, Any, Optional
import dingtalk_stream
class DingTalkEvent(dict):
@staticmethod
@@ -15,7 +16,7 @@ class DingTalkEvent(dict):
return self.get("Content","")
@property
def incoming_message(self):
def incoming_message(self) -> Optional["dingtalk_stream.chatbot.ChatbotMessage"]:
return self.get("IncomingMessage")
@property
@@ -65,4 +66,4 @@ class DingTalkEvent(dict):
Returns:
str: 字符串表示。
"""
return f"<WecomEvent {super().__repr__()}>"
return f"<DingTalkEvent {super().__repr__()}>"

View File

@@ -28,14 +28,19 @@ class DingTalkMessageConverter(adapter.MessageConverter):
return msg.text
@staticmethod
async def target2yiri(event:DingTalkEvent):
async def target2yiri(event:DingTalkEvent, bot_name:str):
yiri_msg_list = []
yiri_msg_list.append(
platform_message.Source(id = '0',time=datetime.datetime.now())
platform_message.Source(id = event.incoming_message.message_id,time=datetime.datetime.now())
)
for atUser in event.incoming_message.at_users:
if atUser.dingtalk_id == event.incoming_message.chatbot_user_id:
yiri_msg_list.append(platform_message.At(target=bot_name))
if event.content:
yiri_msg_list.append(platform_message.Plain(text=event.content))
text_content = event.content.replace("@"+bot_name, '')
yiri_msg_list.append(platform_message.Plain(text=text_content))
if event.picture:
yiri_msg_list.append(platform_message.Image(base64=event.picture))
if event.audio:
@@ -56,18 +61,19 @@ class DingTalkEventConverter(adapter.EventConverter):
@staticmethod
async def target2yiri(
event:DingTalkEvent
event:DingTalkEvent,
bot_name:str
):
message_chain = await DingTalkMessageConverter.target2yiri(event)
message_chain = await DingTalkMessageConverter.target2yiri(event, bot_name)
if event.conversation == 'FriendMessage':
return platform_events.FriendMessage(
sender=platform_entities.Friend(
id= 0,
nickname ='nickname',
id=event.incoming_message.sender_id,
nickname = event.incoming_message.sender_nick,
remark=""
),
message_chain = message_chain,
@@ -75,14 +81,13 @@ class DingTalkEventConverter(adapter.EventConverter):
source_platform_object=event,
)
elif event.conversation == 'GroupMessage':
message_chain.insert(0, platform_message.At(target="justbot"))
sender = platform_entities.GroupMember(
id = 111,
member_name="name",
id = event.incoming_message.sender_id,
member_name=event.incoming_message.sender_nick,
permission= 'MEMBER',
group = platform_entities.Group(
id = 111,
name = 'MEMBER',
id = event.incoming_message.conversation_id,
name = event.incoming_message.conversation_title,
permission=platform_entities.Permission.Member
),
special_title='',
@@ -119,6 +124,8 @@ class DingTalkAdapter(adapter.MessagePlatformAdapter):
missing_keys = [key for key in required_keys if key not in config]
if missing_keys:
raise ParamNotEnoughError("钉钉缺少相关配置项,请查看文档或联系管理员")
self.bot_account_id = self.config["robot_name"]
self.bot = DingTalkClient(
client_id=config["client_id"],
@@ -155,10 +162,9 @@ class DingTalkAdapter(adapter.MessagePlatformAdapter):
],
):
async def on_message(event: DingTalkEvent):
self.bot_account_id = 'justbot'
try:
return await callback(
await self.event_converter.target2yiri(event), self
await self.event_converter.target2yiri(event, self.config["robot_name"]), self
)
except:
traceback.print_exc()
@@ -169,7 +175,6 @@ class DingTalkAdapter(adapter.MessagePlatformAdapter):
self.bot.on_message("GroupMessage")(on_message)
async def run_async(self):
self.ap.logger.debug(f'钉钉机器人启动')
await self.bot.start()
async def kill(self) -> bool: