Я использую Bot Framework v4 SDK.Я пытаюсь загрузить картинку, которую я загружаю в Microsoft Teams через бота, во временный каталог, а затем использую эту картинку.Я мотивирован сделать это, потому что мне нужно сделать фотографию, которую пользователь присоединяет к чату, затем поместить эту фотографию в документ и вернуть документ обратно пользователю.Это работает, когда я запускаю его на эмуляторе, но я получаю ошибки, когда бот находится в командах.
Я запрашиваю у пользователя фотографию через AttachmentPrompt:
return await stepContext.PromptAsync(
"imagePrompt",
new PromptOptions
{
Prompt = MessageFactory.Text("Please attach a picture."),
});
Захватите вложениеfrom stepContext.Result:
List<Attachment> contextAttachmentResult = (List<Attachment>)stepContext.Result;
Определите, где находится файл
var remoteFileUrl = contextAttachmentResult[0].ContentUrl;
Установите путь для временного каталога системы
var tempImagePath = Path.Combine(Path.GetTempPath(), contextAttachmentResult[0].Name);
И попытайтесьзагрузить файл, используя WebClient
using (var webClient = new WebClient())
{
webClient.Headers.Add("User-Agent", "Other");
webClient.Headers.Add("Authorization", userProfile.Token);
webClient.DownloadFile(remoteFileUrl, tempImagePath);
}
Я пытался вставить токен, полученный от OAuthPrompt
, но я все равно получаю 403. 403 происходит правильно, когда я пытаюсь загрузить его,Причина, по которой я считаю, что это проблема SharePoint, заключается в том, что если я распечатываю remoteFileUrl
, я получаю https://company-my.sharepoint.com/personal/my_name/Documents/Microsoft Teams Chat Files/someImage.png
Начало трассировки стека:
System.Net.WebException: The remote server returned an error: (403) FORBIDDEN. at System.Net.HttpWebRequest.GetResponse() at System.Net.WebClient.GetWebResponse(WebRequest request) at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream) at System.Net.WebClient.DownloadFile(Uri address, String fileName)
Редактировать: согласно комментарию Мика, я пытался использовать ConnectorClient
таким образом (и пробовал два разных способа его загрузки):
using (var connectorClient = new ConnectorClient(new Uri(stepContext.Context.Activity.ServiceUrl, MYAPPID, MYAPPPASSWORD)))
{
var token = await (connectorClient.Credentials as MicrosoftAppCredentials).GetTokenAsync();
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(contextAttachmentResult[0].ContentType));
var byteArray = await httpClient.GetByteArrayAsync(remoteFileUrl);
}
using (var webClient = new WebClient())
{
webClient.Headers.Add("User-Agent", "Other");
webClient.Headers.Add("Authorization", token);
webClient.DownloadFile(remoteFileUrl, siteReviewFile1ImagePath);
}
}
, но я получаю 401, хотя яя настроил мой соединитель для использования appId и appPwd System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized). at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode() at System.Net.Http.HttpClient.d__30.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at IBIBot.Dialogs.SiteReviewSpace.SiteReviewDialog.<>c__DisplayClass4_0.<<-ctor>b__2>d.MoveNext() in
Я все еще не понимаю, как получить эту загрузку