diff --git a/libs/slack_api/api.py b/libs/slack_api/api.py index b9e39b9f..5988e3e7 100644 --- a/libs/slack_api/api.py +++ b/libs/slack_api/api.py @@ -17,23 +17,33 @@ class SlackClient(): self._message_handlers = { "example":[], } - self.bot_user_id = None # avoid block + self.bot_user_id = None # 避免机器人回复自己的消息 async def handle_callback_request(self): try: body = await request.get_data() data = json.loads(body) - print("shoudao:") - print(data) + if 'type' in data: + if data['type'] == 'url_verification': + return data['challenge'] + bot_user_id = data.get("event",{}).get("bot_id","") if self.bot_user_id and bot_user_id == self.bot_user_id: return jsonify({'status': 'ok'}) - if data and data.get("event", {}).get("channel_type") in ["im", "channel"]: + # 处理私信 + if data and data.get("event", {}).get("channel_type") in ["im"]: event = SlackEvent.from_payload(data) await self._handle_message(event) return jsonify({'status': 'ok'}) + + #处理群聊 + if data.get("event",{}).get("type") == 'app_mention': + data.setdefault("event", {})["channel_type"] = "channel" + event = SlackEvent.from_payload(data) + await self._handle_message(event) + return jsonify({'status':'ok'}) except Exception as e: raise(e) @@ -66,10 +76,6 @@ class SlackClient(): ) if self.bot_user_id is None and response.get("ok"): self.bot_user_id = response["message"]["bot_id"] - print("bot_id:") - print(self.bot_user_id) - print("fanhui:") - print(response) return except Exception as e: raise e @@ -82,8 +88,6 @@ class SlackClient(): ) if self.bot_user_id is None and response.get("ok"): self.bot_user_id = response["message"]["bot_id"] - print("bot_id:") - print(self.bot_user_id) return except Exception as e: diff --git a/libs/slack_api/slackevent.py b/libs/slack_api/slackevent.py index 9eb7137d..63c949e0 100644 --- a/libs/slack_api/slackevent.py +++ b/libs/slack_api/slackevent.py @@ -16,11 +16,9 @@ class SlackEvent(dict): for el in elements: if el.get("type") == "text": return el.get("text", "") - - if self.get("event",{}).get("channel_type") == "channel": - elements = self["event"]["blocks"][0]["elements"][0]["elements"] - text_result = next((el["text"] for el in elements if el["type"] == "text"), "") - return text_result + if self.get("event",{}).get("channel_type") == 'channel': + message_text = next((el["text"] for block in self.get("event", {}).get("blocks", []) if block.get("type") == "rich_text" for element in block.get("elements", []) if element.get("type") == "rich_text_section" for el in element.get("elements", []) if el.get("type") == "text"), "") + return message_text return "" @@ -49,7 +47,7 @@ class SlackEvent(dict): files = self.get("event", {}).get("files", []) if files: return files[0].get("url_private", "") - return "" + return None @property diff --git a/pkg/platform/sources/slack.py b/pkg/platform/sources/slack.py index e4eafe17..8101e5c5 100644 --- a/pkg/platform/sources/slack.py +++ b/pkg/platform/sources/slack.py @@ -32,13 +32,13 @@ class SlackMessageConverter(adapter.MessageConverter): return content_list @staticmethod - async def target2yiri(message:str,message_id:str,pic_url:str): + async def target2yiri(message:str,message_id:str,pic_url:str,bot:SlackClient): yiri_msg_list = [] yiri_msg_list.append( platform_message.Source(id=message_id,time=datetime.datetime.now()) ) if pic_url is not None: - base64_url = await image.get_slack_image_to_base64(pic_url=pic_url) + base64_url = await image.get_slack_image_to_base64(pic_url=pic_url,bot_token=bot.bot_token) yiri_msg_list.append( platform_message.Image(base64=base64_url) ) @@ -55,9 +55,9 @@ class SlackEventConverter(adapter.EventConverter): return event.source_platform_object @staticmethod - async def target2yiri(event:SlackEvent): + async def target2yiri(event:SlackEvent,bot:SlackClient): yiri_chain = await SlackMessageConverter.target2yiri( - message=event.text,message_id=event.message_id,pic_url=event.pic_url + message=event.text,message_id=event.message_id,pic_url=event.pic_url,bot=bot ) if event.type == 'channel': @@ -138,7 +138,6 @@ class SlackAdapter(adapter.MessagePlatformAdapter): for content in content_list: if slack_event.type == 'channel': - print("fasong1") await self.bot.send_message_to_channle( content['content'],slack_event.channel_id ) @@ -162,7 +161,7 @@ class SlackAdapter(adapter.MessagePlatformAdapter): self.bot_account_id = "SlackBot" try: return await callback( - await self.event_converter.target2yiri(event),self + await self.event_converter.target2yiri(event,self.bot),self ) except: traceback.print_exc() diff --git a/pkg/utils/image.py b/pkg/utils/image.py index 2aedbfd7..6e499340 100644 --- a/pkg/utils/image.py +++ b/pkg/utils/image.py @@ -215,5 +215,20 @@ async def extract_b64_and_format(image_base64_data: str) -> typing.Tuple[str, st return base64_str, image_format -async def get_slack_image_to_base64(pic_url:str): - pass \ No newline at end of file +async def get_slack_image_to_base64(pic_url:str,bot_token:str): + """ + 将Slack图片转换为base64 + """ + +async def get_slack_image_to_base64(pic_url:str, bot_token:str): + headers = {"Authorization": f"Bearer {bot_token}"} + try: + async with aiohttp.ClientSession() as session: + async with session.get(pic_url, headers=headers) as resp: + image_data = await resp.read() + return base64.b64encode(image_data).decode('utf-8') + except Exception as e: + raise(e) + + +