Я создаю бота Teams, используя пакет SDK Bot Framework для Python, интегрированный с FastAPI. Предполагается, что бот будет отправлять пользователям периодические обновления каждые 60 секунд после отправки первоначального сообщения. Однако у меня возникают проблемы с отправкой сообщений из-за ошибки access_token.
Когда я использую Turn_context в on_message_activity, бот отвечает правильно к первоначальному сообщению пользователя. Но при попытке отправлять периодические обновления за пределы on_message_activity я сталкиваюсь с ошибкой access_token.
Я знаю, что новый TurnContext необходимо создавать для каждого разговора, но я не знаю, как правильно это реализовать. Насколько мне известно, я выполнил необходимые действия, но бот по-прежнему не отправляет периодические сообщения. Код:
import asyncio
from botbuilder.core import ActivityHandler, TurnContext, MessageFactory, BotFrameworkAdapterSettings, BotFrameworkAdapter
from botbuilder.schema import Activity, ConversationReference
from botbuilder.core.teams import TeamsActivityHandler
from typing import Dict
from botframework.connector.auth import ClaimsIdentity, MicrosoftAppCredentials
from fastapi import APIRouter
import json
# Logging setup
# (Assuming a logger is properly configured)
import logging
logger = logging.getLogger(__name__)
# Bot settings
APP_ID = 'your-app-id-here'
APP_PASSWORD = 'your-app-password-here'
# Adapter configuration
CONFIGS = BotFrameworkAdapterSettings(APP_ID, APP_PASSWORD)
ADAPTER = BotFrameworkAdapter(CONFIGS)
# Router setup for FastAPI
router = APIRouter()
class NotifyBot(TeamsActivityHandler):
def __init__(self, adapter):
super().__init__()
self.adapter = adapter
self.conversation_references: Dict[str, ConversationReference] = {}
self.scheduled_tasks: Dict[str, asyncio.Task] = {}
logger.info("NotifyBot initialized")
async def on_message_activity(self, turn_context: TurnContext):
# Store conversation reference when user sends a message
self.add_conversation_reference(turn_context.activity)
# Extract the user ID from the incoming activity
user_id = turn_context.activity.from_property.id
# Send a response to acknowledge the user
await turn_context.send_activity("Thanks for messaging me. I'll start sending you updates now.")
# Start sending periodic messages if not already scheduled
if user_id not in self.scheduled_tasks:
logger.info(f"Scheduling periodic messages for user {user_id}")
self.scheduled_tasks[user_id] = asyncio.create_task(self.send_periodic_messages(user_id))
def add_conversation_reference(self, activity: Activity):
# Add or update the conversation reference for a user
conversation_reference = TurnContext.get_conversation_reference(activity)
self.conversation_references[conversation_reference.user.id] = conversation_reference
logger.info(f"Added conversation reference for user {conversation_reference.user.id}")
async def send_periodic_messages(self, user_id: str):
while True:
try:
# Send a message every 5 seconds
await asyncio.sleep(60)
await self.send_personal_message(user_id)
except asyncio.CancelledError:
logger.info(f"Cancelled periodic messages for user {user_id}")
break
except Exception as e:
logger.error(f"Error sending periodic message to user {user_id}: {str(e)}")
async def send_personal_message(self, user_id: str):
conversation_reference = self.conversation_references.get(user_id)
if conversation_reference:
try:
logger.info(f"Sending message to user {user_id}")
# Use continue_conversation to send the message
await self.adapter.continue_conversation(
bot_app_id=APP_ID,
reference=conversation_reference,
logic=lambda turn_context: asyncio.create_task(self.send_message_callback(turn_context, "Periodic update: hi!"))
)
except Exception as e:
logger.error(f"Error sending message to user {user_id}: {str(e)}")
else:
logger.error(f"No conversation reference found for user {user_id}")
async def send_message_callback(self, turn_context: TurnContext, message: str):
try:
await turn_context.send_activity(MessageFactory.text(message))
logger.info(f"Message sent to {turn_context.activity.from_property.id}")
except Exception as e:
logger.error(f"Error sending message: {str(e)}")
, но он не отправляет периодические сообщения каждые
60 секунд, как предполагалось.
При попытке отправить сообщение с помощью continue_conversation я получаюошибка access_token.
Я обеспокоен тем, что срок действия токена, использованного в исходном Turn_context,
истечет, и мне нужно создать новый Turn_context или правильно обрабатывать
токены, но я не знаю, как действовать.
Что я пробовал :
Проверено, что APP_ID и APP_PASSWORD установлены правильно.
Я создаю бота Teams, используя пакет SDK Bot Framework для Python, интегрированный с FastAPI. Предполагается, что бот будет отправлять пользователям периодические обновления каждые 60 секунд после отправки первоначального сообщения. Однако у меня возникают проблемы с отправкой сообщений из-за ошибки access_token. Когда я использую Turn_context в on_message_activity, бот отвечает правильно к первоначальному сообщению пользователя. Но при попытке отправлять периодические обновления за пределы on_message_activity я сталкиваюсь с ошибкой access_token. Я знаю, что новый TurnContext необходимо создавать для каждого разговора, но я не знаю, как правильно это реализовать. Насколько мне известно, я выполнил необходимые действия, но бот по-прежнему не отправляет периодические сообщения. [b]Код:[/b][code]import asyncio from botbuilder.core import ActivityHandler, TurnContext, MessageFactory, BotFrameworkAdapterSettings, BotFrameworkAdapter from botbuilder.schema import Activity, ConversationReference from botbuilder.core.teams import TeamsActivityHandler from typing import Dict from botframework.connector.auth import ClaimsIdentity, MicrosoftAppCredentials from fastapi import APIRouter import json
# Logging setup # (Assuming a logger is properly configured) import logging logger = logging.getLogger(__name__)
async def on_message_activity(self, turn_context: TurnContext): # Store conversation reference when user sends a message self.add_conversation_reference(turn_context.activity)
# Extract the user ID from the incoming activity user_id = turn_context.activity.from_property.id
# Send a response to acknowledge the user await turn_context.send_activity("Thanks for messaging me. I'll start sending you updates now.")
# Start sending periodic messages if not already scheduled if user_id not in self.scheduled_tasks: logger.info(f"Scheduling periodic messages for user {user_id}") self.scheduled_tasks[user_id] = asyncio.create_task(self.send_periodic_messages(user_id))
def add_conversation_reference(self, activity: Activity): # Add or update the conversation reference for a user conversation_reference = TurnContext.get_conversation_reference(activity) self.conversation_references[conversation_reference.user.id] = conversation_reference logger.info(f"Added conversation reference for user {conversation_reference.user.id}")
async def send_periodic_messages(self, user_id: str): while True: try: # Send a message every 5 seconds await asyncio.sleep(60) await self.send_personal_message(user_id) except asyncio.CancelledError: logger.info(f"Cancelled periodic messages for user {user_id}") break except Exception as e: logger.error(f"Error sending periodic message to user {user_id}: {str(e)}")
if conversation_reference: try: logger.info(f"Sending message to user {user_id}")
# Use continue_conversation to send the message await self.adapter.continue_conversation( bot_app_id=APP_ID, reference=conversation_reference, logic=lambda turn_context: asyncio.create_task(self.send_message_callback(turn_context, "Periodic update: hi!")) )
except Exception as e: logger.error(f"Error sending message to user {user_id}: {str(e)}") else: logger.error(f"No conversation reference found for user {user_id}")
async def send_message_callback(self, turn_context: TurnContext, message: str): try: await turn_context.send_activity(MessageFactory.text(message)) logger.info(f"Message sent to {turn_context.activity.from_property.id}") except Exception as e: logger.error(f"Error sending message: {str(e)}") [/code] [b]Проблемы, с которыми я столкнулся:[/b] [list] [*]Бот успешно отвечает на исходное сообщение в [code]on_message_activity[/code], но он не отправляет периодические сообщения каждые 60 секунд, как предполагалось. [*]При попытке отправить сообщение с помощью continue_conversation я получаюошибка access_token. [*]Я обеспокоен тем, что срок действия токена, использованного в исходном Turn_context, истечет, и мне нужно создать новый Turn_context или правильно обрабатывать токены, но я не знаю, как действовать. [/list] [b]Что я пробовал :[/b] [list] [*]Проверено, что APP_ID и APP_PASSWORD установлены правильно. [*]Попытка получить новый токен доступа с помощью [code]MicrosoftAppCredentials[/code], но я не уверен, что реализую его правильно. [*]Просмотрена документация и примеры использования continue_conversation и ClaimsIdentity< /code>, но по-прежнему возникают проблемы. [/list] [b]Вопросы:[/b] [list] [*]Как правильно отправлять периодические сообщения пользователю каждые 5 секунд? [*]Как правильно обрабатывать access_token и ClaimsIdentity когда используется continue_conversation? [*]Нужно ли мне создавать новый TurnContext для каждого сообщения, и если да, как я могу Я так делаю? [/list] Будем очень признательны за любую помощь или рекомендации по решению этих проблем! < strong>Дополнительная информация: [list] [*]Я использую Bot Framework SDK для Python. [*] бот размещается с использованием FastAPI. [*]Цель состоит в том, чтобы бот периодически отправлял обновления пользователям после того, они инициируют разговор. [/list]
В репозитории BotBuilder-Samples имеется множество примеров ботов, которые можно использовать как асинхронные веб-приложения (с помощью aiohttp). Однако мне было интересно, можно ли просто создать что-то вроде сокет-соединения для бота?
Это возможно...
Я работаю над чат-ботом MS Teams, используя платформу Microsoft Bot Framework (узел JS). Я отрисовал адаптивную карту и хочу, чтобы при нажатии на кнопку появлялось модальное всплывающее окно с другой адаптивной картой или изображением. Может ли...
Я работаю над чат-ботом MS Teams, используя платформу Microsoft Bot Framework (узел JS). Я отрисовал адаптивную карту и хочу, чтобы при нажатии на кнопку появлялось модальное всплывающее окно с другой адаптивной картой или изображением. Может ли...
В настоящее время я разрабатываю Teams Bot с использованием пакета SDK Bot Framework v4 (C#) и не могу найти надежный способ его протестировать. Я не могу использовать Teams Toolkit, потому что большая часть операций автоматизирована, и...
У меня есть генеративный LLM, с которым я общаюсь через REST API. Я не использую какие-либо собственные объекты OpenAI или Azure для использования Enable_feedback_loop, доступного в AI Bot Framework.
Я просмотрел несколько видеороликов и настроек,...