私は、PythonのボットフレームワークSDKを使用して、簡単なMSチームボットを構築しようとしています。エミュレータを使用してローカルに私のボットをテストする場合、すべてが正常に動作します。私はここで、従来のポータルを使用してボット登録https://dev.botframework.com/bots私はAzureのサブスクリプションを作成しないように。
私は、ボットにアプリケーションIDとアプリケーションの秘密を追加して、メッセージングエンドポイントのHTTPS URLを取得する(HTTPプロキシの統合で)API Gatewayを使用してEC2のマシンに展開しました。
展開すると、コードはDEVのフレームワークページのテスト機能の両方からとチームの実際の展開のアプリからのメッセージを受信して解析することができます。メッセージに応答しようとしたときしかし、私は、不正なエラーメッセージが表示されます。
ここでは、スタックトレースは次のとおりです。
[on_turn_error] unhandled error: Operation returned an invalid status code 'Unauthorized'
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/bot_adapter.py", line 103, in run_pipeline
context, callback
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/middleware_set.py", line 69, in receive_activity_with_status
return await self.receive_activity_internal(context, callback)
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/middleware_set.py", line 79, in receive_activity_internal
return await callback(context)
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/activity_handler.py", line 28, in on_turn
await self.on_message_activity(turn_context)
File "/home/ec2-user/bot/bot.py", line 24, in on_message_activity
return await turn_context.send_activity(response)
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/turn_context.py", line 165, in send_activity
result = await self.send_activities([activity_or_text])
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/turn_context.py", line 198, in send_activities
return await self._emit(self._on_send_activities, output, logic())
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/turn_context.py", line 276, in _emit
return await logic
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/turn_context.py", line 193, in logic
responses = await self.adapter.send_activities(self, output)
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/bot_framework_adapter.py", line 444, in send_activities
raise error
File "/usr/local/lib/python3.7/site-packages/botbuilder/core/bot_framework_adapter.py", line 431, in send_activities
activity.conversation.id, activity.reply_to_id, activity
File "/usr/local/lib/python3.7/site-packages/botframework/connector/aio/operations_async/_conversations_operations_async.py", line 533, in reply_to_activity
raise models.ErrorResponseException(self._deserialize, response)
botbuilder.schema._models_py3.ErrorResponseException: Operation returned an invalid status code 'Unauthorized'
マイアプリのコードは次のとおりです。
CONFIG = DefaultConfig()
SETTINGS = BotFrameworkAdapterSettings(CONFIG.APP_ID, CONFIG.APP_PASSWORD,
CONFIG.APP_AUTH_TENANT, CONFIG.APP_OAUTH_ENDPOINT)
ADAPTER = BotFrameworkAdapter(SETTINGS)
# Catch-all for errors.
async def on_error(context: TurnContext, error: Exception):
print(f"\n [on_turn_error] unhandled error: {error}", file=sys.stderr)
traceback.print_exc()
# Send a message to the user
await context.send_activity("The bot encountered an error or bug.")
await context.send_activity("To continue to run this bot, please fix the bot source code.")
# Send a trace activity if we're talking to the Bot Framework Emulator
if context.activity.channel_id == "emulator":
# Create a trace activity that contains the error object
trace_activity = Activity(
label="TurnError",
name="on_turn_error Trace",
timestamp=datetime.utcnow(),
type=ActivityTypes.trace,
value=f"{error}",
value_type="https://www.botframework.com/schemas/error",
)
# Send a trace activity, which will be displayed in Bot Framework Emulator
await context.send_activity(trace_activity)
ADAPTER.on_turn_error = on_error
APP_ID = SETTINGS.app_id
dynamodb = boto3.resource("dynamodb")
CONVERSATION_REFERENCES = dynamodb.Table("ConversationReferences")
# Create the Bot
BOT = MyBot(CONVERSATION_REFERENCES)
# Listen for incoming requests on /api/messages
async def messages(req):
print(f"Message Received - {str(datetime.now())}")
json_request = await req.json()
print(f"Request Body: {json_request}")
activity = Activity().deserialize(json_request)
print("Request successfully deserialized")
auth_header = req.headers["Authorization"] if "Authorization" in req.headers else ""
try:
print("Sending activity to adapter")
response = await ADAPTER.process_activity(activity, auth_header, BOT.on_turn)
if response:
return Response(status=response.status, text=response.body)
return Response(status=201)
except Exception as exception:
raise exception
async def health(req):
return Response(status=200, text="Working")
APP = web.Application(middlewares=[aiohttp_error_middleware])
APP.router.add_post("/api/messages", messages)
APP.router.add_get("/health", health)
if __name__ == "__main__":
web.run_app(APP)
そして、私のボットコードは次のとおりです。
class MyBot(ActivityHandler):
def __init__(self, conversation_references):
self.conversation_references = conversation_references
async def on_message_activity(self, turn_context: TurnContext):
print("Message received by bot adapter")
# The next two lines also cause an unauthorized error. I commented them out to try and simplify
# team_details = await teams.TeamsInfo.get_members(turn_context)
# user = team_details[1].email
user = "[email protected]"
conversation = self.conversation_references.get_item(Key={"user": user})
if "Item" in conversation:
response = "You are already registered"
else:
conversation = TurnContext.get_conversation_reference(turn_context.activity)
item = {"user": user, "conversation": conversation.as_dict()}
self.conversation_references.put_item(Item=item)
response = "You have been successfully registered!"
return await turn_context.send_activity(response)
アップデート:ローカルでテストするとき、私はエミュレータにアプリケーションIDとパスワードを追加しませんでした。「|ライブチャット会話XXXXXXにコマンドを:400:ボットのマイクロソフトのApp IDまたはMicrosoftアプリケーションのパスワードが正しくありません。 『/オープンINSPECT』投稿は中にエラーが発生しました」:私が行うと、デバッグモードで私は、次のエラーメッセージが表示されます
私は手動でこれらの資格情報を使用してアクセストークンを取得するには、登録ページからトークンエンドポイントを使用していたとして、100%必ずIDとパスワードは、しかし、正しいと思います。それは私がエミュレータを使用して、そうすることはできませんしながら、コードにし、エンドポイントを使用して手動で私は、ディレクトリ(テナント)IDを指定することができるという事実に関係することができます。
もう一つの奇妙な点は、それが実際に私は確信して400応答でもどこから来ているじゃないので、私のローカルエンドポイントへの要求を行うように見えるしませんエミュレータ応答を返すというときということです。
あなたは説明するように、あなたはマルチテナントAADアプリの資格情報を使用していることを確認する必要がありますここに。