Загрузка изображения, загруженного на бот из Sharepoint, возвращает 403 ЗАПРЕЩЕНО - PullRequest
0 голосов
/ 07 февраля 2019

Я использую 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

Я все еще не понимаю, как получить эту загрузку

1 Ответ

0 голосов
/ 28 февраля 2019

Это решается не использованием Attachment.ContentUrl, а взамен Attachment.Content.DownloadUrl.Downloadurl - это предварительно авторизованная загрузка, поэтому не требуется никаких носителей или заголовков авторизации.Мой код выглядел примерно так:

var remoteFileUrl = ((JObject)contextAttachmentResult[0].Content)["downloadUrl"].ToString();
using (var webClient = new WebClient())
{
    webClient.DownloadFile(remoteFileUrl, someFileLocationPath);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...