feat: add support for slack

This commit is contained in:
wangcham
2025-03-30 22:24:53 -04:00
parent c0dbf6fd13
commit be1328cee9
4 changed files with 40 additions and 24 deletions
+14 -10
View File
@@ -17,24 +17,34 @@ class SlackClient():
self._message_handlers = { self._message_handlers = {
"example":[], "example":[],
} }
self.bot_user_id = None # avoid block self.bot_user_id = None # 避免机器人回复自己的消息
async def handle_callback_request(self): async def handle_callback_request(self):
try: try:
body = await request.get_data() body = await request.get_data()
data = json.loads(body) data = json.loads(body)
print("shoudao:") if 'type' in data:
print(data) if data['type'] == 'url_verification':
return data['challenge']
bot_user_id = data.get("event",{}).get("bot_id","") bot_user_id = data.get("event",{}).get("bot_id","")
if self.bot_user_id and bot_user_id == self.bot_user_id: if self.bot_user_id and bot_user_id == self.bot_user_id:
return jsonify({'status': 'ok'}) 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) event = SlackEvent.from_payload(data)
await self._handle_message(event) await self._handle_message(event)
return jsonify({'status': 'ok'}) 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: except Exception as e:
raise(e) raise(e)
@@ -66,10 +76,6 @@ class SlackClient():
) )
if self.bot_user_id is None and response.get("ok"): if self.bot_user_id is None and response.get("ok"):
self.bot_user_id = response["message"]["bot_id"] self.bot_user_id = response["message"]["bot_id"]
print("bot_id:")
print(self.bot_user_id)
print("fanhui:")
print(response)
return return
except Exception as e: except Exception as e:
raise e raise e
@@ -82,8 +88,6 @@ class SlackClient():
) )
if self.bot_user_id is None and response.get("ok"): if self.bot_user_id is None and response.get("ok"):
self.bot_user_id = response["message"]["bot_id"] self.bot_user_id = response["message"]["bot_id"]
print("bot_id:")
print(self.bot_user_id)
return return
except Exception as e: except Exception as e:
+4 -6
View File
@@ -16,11 +16,9 @@ class SlackEvent(dict):
for el in elements: for el in elements:
if el.get("type") == "text": if el.get("type") == "text":
return el.get("text", "") return el.get("text", "")
if self.get("event",{}).get("channel_type") == 'channel':
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"), "")
elements = self["event"]["blocks"][0]["elements"][0]["elements"] return message_text
text_result = next((el["text"] for el in elements if el["type"] == "text"), "")
return text_result
return "" return ""
@@ -49,7 +47,7 @@ class SlackEvent(dict):
files = self.get("event", {}).get("files", []) files = self.get("event", {}).get("files", [])
if files: if files:
return files[0].get("url_private", "") return files[0].get("url_private", "")
return "" return None
@property @property
+5 -6
View File
@@ -32,13 +32,13 @@ class SlackMessageConverter(adapter.MessageConverter):
return content_list return content_list
@staticmethod @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 = []
yiri_msg_list.append( yiri_msg_list.append(
platform_message.Source(id=message_id,time=datetime.datetime.now()) platform_message.Source(id=message_id,time=datetime.datetime.now())
) )
if pic_url is not None: 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( yiri_msg_list.append(
platform_message.Image(base64=base64_url) platform_message.Image(base64=base64_url)
) )
@@ -55,9 +55,9 @@ class SlackEventConverter(adapter.EventConverter):
return event.source_platform_object return event.source_platform_object
@staticmethod @staticmethod
async def target2yiri(event:SlackEvent): async def target2yiri(event:SlackEvent,bot:SlackClient):
yiri_chain = await SlackMessageConverter.target2yiri( 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': if event.type == 'channel':
@@ -138,7 +138,6 @@ class SlackAdapter(adapter.MessagePlatformAdapter):
for content in content_list: for content in content_list:
if slack_event.type == 'channel': if slack_event.type == 'channel':
print("fasong1")
await self.bot.send_message_to_channle( await self.bot.send_message_to_channle(
content['content'],slack_event.channel_id content['content'],slack_event.channel_id
) )
@@ -162,7 +161,7 @@ class SlackAdapter(adapter.MessagePlatformAdapter):
self.bot_account_id = "SlackBot" self.bot_account_id = "SlackBot"
try: try:
return await callback( return await callback(
await self.event_converter.target2yiri(event),self await self.event_converter.target2yiri(event,self.bot),self
) )
except: except:
traceback.print_exc() traceback.print_exc()
+17 -2
View File
@@ -215,5 +215,20 @@ async def extract_b64_and_format(image_base64_data: str) -> typing.Tuple[str, st
return base64_str, image_format return base64_str, image_format
async def get_slack_image_to_base64(pic_url:str): async def get_slack_image_to_base64(pic_url:str,bot_token:str):
pass """
将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)