Bot Framework v4 - 在 Blob 中保存对话引用并在新版本发布后重新使用它们
Bot Framework v4 - Saving conversation references in Blob and reusing them after a new release
我想将对话引用保存到 blob 文件或 SQL 数据库,以便我可以下载此文件并检索对话引用,然后向用户发送主动消息。我知道有一个示例允许我将对话引用保存在字典中,但显然该字典在部署新版本的机器人后被删除,因此我无法再向用户发送消息。所以我想把这个字典保存在一个 blob 文件中,以便恢复它而不丢失对话引用。但是这种做法行不通。
我执行以下操作来保存字典。
a = pickle.dumps(conversation_reference_dict)
blob_client.upload_blob(a, blob_type="BlockBlob", overwrite = True)
但我认为这种做法为我节省了一本这样的字典:[id_client:conversation_reference 对象的地址],这显然不是我想要的,因为在未来部署之后这个地址将不再有任何意义。
在 python 中有人有任何关于执行此操作的提示吗?
非常感谢
更新
经测试,代码正确保存在字典中。但是,当我尝试在更新机器人源代码后执行以下代码片段时出现问题。
# Send a message to all conversation members.
# This uses the shared Dictionary that the Bot adds conversation references to.
async def _send_proactive_message():
for conversation_reference in CONVERSATION_REFERENCES_STORED.values():
await ADAPTER.continue_conversation(
conversation_reference,
lambda turn_context: turn_context.send_activity("proactive hello"),
APP_ID,
)
适配器方法无法继续与用户对话,就好像它不再找到他们一样。有没有办法更新保存在 blob 中的对话引用,以便在发布后机器人可以继续挂起的对话?
更新二
我想在这种情况下工作:
- 我的机器人正在测试团队频道的用户,该机器人是在 Azure 上发布的,由于缺乏权限,我无法通过内部应用程序部分访问团队。
- 该机器人使用主动消息并将必要的对话引用保存到 blob 中的文件中。
- 我想在 bot 中引入一个新功能,所以我执行了一个新版本,我希望 bot 能够继续主动向用户发送消息,因为我将对话引用保存到一个未被访问的文件中此版本。
最后一点没有发生,主动消息不再发送,有什么办法可以继续发送这些消息吗?我假设在新的 bot 版本中创建了新的 id/url 并且它们与保存在文件中的旧的 id/url 不匹配因此调用通过对话引用发送主动消息的方法将失败或以其他方式不被执行。有谁知道哪些字段不匹配?我可以向 post-release bot 发送消息并“修改”blob 上的整个字典以便这些 urls/ids 匹配吗?
我举个例子说明我的意思:我知道在发布后 id1 被修改,所以我在发布后例如通过 azure 中的测试部分联系机器人,这个联系触发调用保存在 azure 上的文件的方法它滚动所有内容并用新的 id1 替换旧的 id1,以便可以安全地继续发送主动消息。这是可能的情况吗?你能帮帮我吗?
更新三
我似乎通过添加这行代码解决了我的问题:
AppCredentials.trust_service_url(conversation_reference.service_url)
之前:
await ADAPTER.continue_conversation(
conversation_reference,
lambda turn_context: turn_context.send_activity("proactive hello"),
APP_ID,
)
导致此最终代码:
# Send a message to all conversation members.
# This uses the shared Dictionary that the Bot adds conversation references to.
async def _send_proactive_message():
for conversation_reference in CONVERSATION_REFERENCES_STORED.values():
AppCredentials.trust_service_url(conversation_reference.service_url)
await ADAPTER.continue_conversation(
conversation_reference,
lambda turn_context: turn_context.send_activity("proactive hello"),
APP_ID,
)
我不确定为什么将其从文档中删除,但您始终需要信任服务 URL 才能在 Teams 中发送主动消息,如以下答案中所述:
编辑:这显然不再适用于所有语言,因此您可能不必在 Python 中执行更长的时间
我想将对话引用保存到 blob 文件或 SQL 数据库,以便我可以下载此文件并检索对话引用,然后向用户发送主动消息。我知道有一个示例允许我将对话引用保存在字典中,但显然该字典在部署新版本的机器人后被删除,因此我无法再向用户发送消息。所以我想把这个字典保存在一个 blob 文件中,以便恢复它而不丢失对话引用。但是这种做法行不通。
我执行以下操作来保存字典。
a = pickle.dumps(conversation_reference_dict)
blob_client.upload_blob(a, blob_type="BlockBlob", overwrite = True)
但我认为这种做法为我节省了一本这样的字典:[id_client:conversation_reference 对象的地址],这显然不是我想要的,因为在未来部署之后这个地址将不再有任何意义。
在 python 中有人有任何关于执行此操作的提示吗? 非常感谢
更新
经测试,代码正确保存在字典中。但是,当我尝试在更新机器人源代码后执行以下代码片段时出现问题。
# Send a message to all conversation members.
# This uses the shared Dictionary that the Bot adds conversation references to.
async def _send_proactive_message():
for conversation_reference in CONVERSATION_REFERENCES_STORED.values():
await ADAPTER.continue_conversation(
conversation_reference,
lambda turn_context: turn_context.send_activity("proactive hello"),
APP_ID,
)
适配器方法无法继续与用户对话,就好像它不再找到他们一样。有没有办法更新保存在 blob 中的对话引用,以便在发布后机器人可以继续挂起的对话?
更新二
我想在这种情况下工作:
- 我的机器人正在测试团队频道的用户,该机器人是在 Azure 上发布的,由于缺乏权限,我无法通过内部应用程序部分访问团队。
- 该机器人使用主动消息并将必要的对话引用保存到 blob 中的文件中。
- 我想在 bot 中引入一个新功能,所以我执行了一个新版本,我希望 bot 能够继续主动向用户发送消息,因为我将对话引用保存到一个未被访问的文件中此版本。
最后一点没有发生,主动消息不再发送,有什么办法可以继续发送这些消息吗?我假设在新的 bot 版本中创建了新的 id/url 并且它们与保存在文件中的旧的 id/url 不匹配因此调用通过对话引用发送主动消息的方法将失败或以其他方式不被执行。有谁知道哪些字段不匹配?我可以向 post-release bot 发送消息并“修改”blob 上的整个字典以便这些 urls/ids 匹配吗? 我举个例子说明我的意思:我知道在发布后 id1 被修改,所以我在发布后例如通过 azure 中的测试部分联系机器人,这个联系触发调用保存在 azure 上的文件的方法它滚动所有内容并用新的 id1 替换旧的 id1,以便可以安全地继续发送主动消息。这是可能的情况吗?你能帮帮我吗?
更新三
我似乎通过添加这行代码解决了我的问题:
AppCredentials.trust_service_url(conversation_reference.service_url)
之前:
await ADAPTER.continue_conversation(
conversation_reference,
lambda turn_context: turn_context.send_activity("proactive hello"),
APP_ID,
)
导致此最终代码:
# Send a message to all conversation members.
# This uses the shared Dictionary that the Bot adds conversation references to.
async def _send_proactive_message():
for conversation_reference in CONVERSATION_REFERENCES_STORED.values():
AppCredentials.trust_service_url(conversation_reference.service_url)
await ADAPTER.continue_conversation(
conversation_reference,
lambda turn_context: turn_context.send_activity("proactive hello"),
APP_ID,
)
我不确定为什么将其从文档中删除,但您始终需要信任服务 URL 才能在 Teams 中发送主动消息,如以下答案中所述:
编辑:这显然不再适用于所有语言,因此您可能不必在 Python 中执行更长的时间