>

Bot Framework v4 SDK를 사용하고 있습니다. 봇을 통해 Microsoft Teams에 업로드 한 사진을 임시 디렉토리에 다운로드 한 다음 해당 사진을 사용하려고합니다. 사용자가 채팅에 첨부 한 사진을 촬영 한 다음이 사진을 문서에 넣고 문서를 다시 사용자에게 돌려줘야하기 때문에이 작업을 수행하게되었습니다. 에뮬레이터에서 실행할 때 작동하지만 봇이 팀에 있으면 오류가 발생합니다.

첨부 파일 프롬프트를 통해 사용자에게 사진을 요구합니다 :

return await stepContext.PromptAsync(
    "imagePrompt",
    new PromptOptions
    {
        Prompt = MessageFactory.Text("Please attach a picture."),
    });

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)

편집 : Mick의 의견에 따라 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);
    }
}

그러나 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 를 사용하도록 커넥터를 설정했지만 401이 표시됩니다.

이 다운로드를 얻는 방법에 대해 여전히 혼란스러워


  • 답변 # 1

    이것은 Attachment.ContentUrl을 사용하지 않고 대신 Attachment.Content.DownloadUrl을 사용하여 해결됩니다. downloadurl은 사전 승인 된 다운로드이므로 베어러 또는 인증 헤더가 필요하지 않습니다. 내 코드는 다음과 같습니다.

    var remoteFileUrl = ((JObject)contextAttachmentResult[0].Content)["downloadUrl"].ToString();
    using (var webClient = new WebClient())
    {
        webClient.DownloadFile(remoteFileUrl, someFileLocationPath);
    }
    
    

  • 이전 element - 순수 JavaScript로 객체에 항목 추가
  • 다음 Excel에서 중복 계정 (1000 개 이상) 찾기