mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-27 16:04:21 +00:00
feat: add support for slack
This commit is contained in:
+14
-10
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user