获取 403(禁止),Microsoft Bot 正在尝试进行 Web 客户端 - 下载数据调用

Posted

技术标签:

【中文标题】获取 403(禁止),Microsoft Bot 正在尝试进行 Web 客户端 - 下载数据调用【英文标题】:Getting 403 (Forbidden), Microsoft Bot is trying to make a Web Client - download data call 【发布时间】:2017-01-10 11:35:30 【问题描述】:

我正在尝试使用 Microsoft BotFramework 创建一个机器人

我面临的问题是当机器人代码试图通过 Facebook Messenger/Skype/Slack 等任何渠道下载数据(用户上传到机器人的图像)时。要下载的代码是通过创建 WebClient 并通过传递附件 URL 进行 DownloadData 调用。

我可以浏览上传的图片 URL。此外,如果我编写控制台应用程序而不是 Bot 应用程序,则通过 Web 客户端下载数据的代码可以正常工作。

c#代码sn-p

WebClient wc = new WebClient(); 
byte[] bytes = wc.DownloadData(imageUrl); // This line gives 403 error

请提出这个问题的解决方案。

【问题讨论】:

下载数据工作正常,但是当通过 messenger 上传任何图像时 [it] 如果正在下载相同的图像,则会给出 HTTP 403 错误 - 如何上传相同的文件并同时下载? 用户将任何附件(比如图片)上传到机器人频道,然后为了处理同一张图片,机器人代码尝试从上传的 URL 下载数据。当 bot 尝试下载数据时出现 Http 403。 对于 Skype 需要添加 DefaultRequestHeaders.Authorization as ("Bearer", token) , DefaultRequestHeaders.Accept as "application/octet-stream" 对于任何其他频道:添加 DefaultRequestHeaders.Accept 作为内容类型跨度> 【参考方案1】:

这是该问题的完整解决方案:

    private async Task<IEnumerable<byte[]>> GetAttachmentsAsByteArrayAsync(Activity activity)
    
        var attachments = activity?.Attachments?
        .Where(attachment => attachment.ContentUrl != null)
        .Select(c => Tuple.Create(c.ContentType, c.ContentUrl));
        if (attachments != null && attachments.Any())
        
            var contentBytes = new List<byte[]>();
            using (var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl)))
            
                var token = await (connectorClient.Credentials as MicrosoftAppCredentials).GetTokenAsync();
                foreach (var content in attachments)
                
                    var uri = new Uri(content.Item2);
                    using (var httpClient = new HttpClient())
                    
                        if (uri.Host.EndsWith("skype.com") && uri.Scheme == "https")
                        
                            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
                            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));
                        
                        else
                        
                            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(content.Item1));
                        
                        contentBytes.Add(await httpClient.GetByteArrayAsync(uri));
                    
                
            
            return contentBytes;
        
        return null;
    

【讨论】:

【参考方案2】:

https://github.com/Microsoft/BotBuilder/issues/662#issuecomment-232223965

你的意思是这个修复?这对你有用吗?

【讨论】:

【参考方案3】:

我正在使用带有 Node.js 的 BotFramework 并收到相同的错误。 最后我找到了一个解决方法。我在 ChatConnector.js 的下面几行评论了它现在对我来说工作正常。

if (isEmulator && decoded_1.payload.appid != this.settings.appId) 
       logger.error('ChatConnector: receive - invalid token. Requested by unexpected app ID.');
       res.status(403);
        res.end();
         return;
    

if (isEmulator && decoded_1.payload.appid != this.settings.appId) logger.error('ChatConnector: 接收 - 无效令牌。由意外的应用 ID 请求。'); res.status(403); 重发(); 返回;

【讨论】:

以上是关于获取 403(禁止),Microsoft Bot 正在尝试进行 Web 客户端 - 下载数据调用的主要内容,如果未能解决你的问题,请参考以下文章

错误 - 403 禁止 - Microsoft-Azure-Application-Gateway/v2

如何允许获取请求 - 403 禁止错误

为 Google 课堂获取课程列表时出现 403 禁止错误

获取 403(禁止)React + Django

获取 403:禁止访问:当用户意外关闭登录会话时,访问被拒绝

尝试使用 Azure 通知中心批量发送时出现 403 禁止