【问题标题】:Send file attachment to Facebook messenger API in C#在 C# 中将文件附件发送到 Facebook Messenger API
【发布时间】:2020-02-12 09:44:04
【问题描述】:

我查看了https://developers.facebook.com/docs/messenger-platform/send-messages/#file 的信使文档,试图弄清楚如何发送本地附件。但是,当我使用 httpclient 进行尝试时,我收到一条错误消息,指出消息正文不能为空,必须提供有效的附件或消息。下面是我的代码

string fileType = ImageExtensions.Contains(Path.GetExtension(url).ToUpper()) ? "image" : "file";

var multipartContent = new MultipartFormDataContent();

var content = new StringContent($"{{\"attachment\":{{\"type\":\"{fileType}\", \"payload\":{{\"is_reusable\"=true}}}}");

multipartContent.Add(new StringContent($"{{\"id\":\"{long.Parse(recipient)}\"}}"), "recipient");
multipartContent.Add(new StringContent($"{{\"attachment\":{{\"type\":\"{fileType}\", \"payload\":{{\"is_reusable\"=true}}}}"), "message");

var file1 = File.ReadAllBytes(url);
var file2 = new ByteArrayContent(file1);

file2.Headers.Add("Content-Type", GetMimeType(Path.GetExtension(url)));

multipartContent.Add(file2,"filedata", Path.GetFileName(url));
request.Content = multipartContent;

文件类型为image,mime类型为image/jpeg。当我检查 File.exists 时,我知道 url 存在

【问题讨论】:

    标签: c# facebook-messenger


    【解决方案1】:

    如果您偶然发现这一点并且您正在使用 Nuget 的 FacebookClient。这就是我最终设法使用 vb.net 将文件上传到消息 api 的方式。

    Dim Client = New FacebookClient(GetPageAccessToken(PageID))
    Dim TmpParams As New Dictionary(Of String, Object)
    
    TmpParams.Add("recipient", "{""id"":""RECIPIENT_ID""}")
    TmpParams.Add("message", "{""attachment"":{""type"":""image"", ""payload"":{""url"":"""", ""is_reusable"":false}}}")
    TmpParams.Add("messaging_type", "RESPONSE")
    
    Dim Med As New FacebookMediaObject()
    Med.FileName = YourFile.FileName
    Med.ContentType = YourFile.ContentType
    Med.SetValue(YourFile.InputStream.ToBytes())
    
    TmpParams.Add(YourFile.FileName, Med)
    
    Client.Post("me/messages", TmpParams)
    

    使用字典(字符串、对象),手动添加接收者、消息、消息类型和文件字节的参数。

    【讨论】:

      【解决方案2】:

      欢迎来到 Stack Overflow!

      从提供的代码示例中很难找出问题所在,因为它不能单独运行。

      也就是说,我首先要验证您通过 url 使用的图像是否以您期望的格式存在。如果你从网址下载.jpeg,你能在你的机器上打开它吗?假设它结构良好,我会尝试找出是否是 HttpClient 格式错误 - 或者您提供给 Facebook API 的值是否有问题。

      您可以通过创建一个简单的 C# Web API 项目来完成此操作,该项目在特定路由上侦听分段上传。请参阅 this answer for some sample code 了解如何执行此操作。

      假设您能够在本地客户端和接受 multipart/form-data 标头的本地端点之间发送有问题的 .jpeg,那么问题一定是您如何使用 Facebook API 本身。

      在您的示例中,我没有看到您在任何地方使用 content 变量的值。这是故意的吗?

      如果缺少的变量是一个红鲱鱼,那么您可以尝试按照以下方式运行一些东西(确保根据需要为您遇到问题的变量交换值):

      using (var httpClient = new HttpClient())
      using (var formDataContent = new MultipartFormDataContent()) 
      {
          // Read the file in from a local path first to verify that the image
          // exists in the format you're expecting.
          var fileStream = File.OpenRead("/some/path/image.jpeg");
          using (var streamContent = new StreamContent(fileStream)) 
          {
              // Don't actually call `.Result` you should await this, but for ease of
              // demonstration.
              var imageContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);
              imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
      
              formDataContent.Add(imageContent, "image", "your-file-name-here");
              formDataContent.Add(new StringContent ($"{{\"id\":\"{long.Parse("your-recipient-here")}\"}}"), "recipient");
              formDataContent.Add(new StringContent($"{{\"attachment\":{{\"type\":\"{"image"}\", \"payload\":{{\"is_reusable\"=true}}}}"), "message");
      
              // Again don't call `.Result` - await it.
              var response = httpClient.PostAsync("https://some-url-here.com", formDataContent).Result;
          }    
      }
      

      如果您运行上述程序,您是否仍然收到空消息正文错误?

      【讨论】:

      • 谢谢您的回复。我并不是说永远不要使用 content 变量。当我尝试创建 c# web api 项目时,我收到一条错误消息“无法从传输连接读取数据:现有连接被远程主机强制关闭。”我认为这更多地是指我没有正确创建 api 的事实。
      • 我也尝试过转换您发布的代码,但我仍然收到完全相同的错误消息。
      • 不用担心。我创建了一个sample application,它可以在本地为我测试*.jpeg 文件的POST。如果您克隆它,并更新MockMessenger.Client 项目的Program.cs 文件以在@​​987654333@ 方法中包含您的图像请求,您是否看到它在磁盘上按预期创建并无一例外地发布?我现在将仔细阅读 FB 文档 - 我可能只是在您使用 API 时遗漏了一些明显的东西。
      • 我收到一条错误消息,提示读取 mime 多方正文部分时出错,内部异常为超出最大请求长度。我的文件是否太大而无法上传?
      • 啊!很高兴知道。磁盘上文件的大小是多少?默认情况下,IIS 将每个请求限制为几 MB。不过,您可以在 web.config 文件中对此进行修改 - 请查看 this answer。仅供参考,Facebook Send API 每个文件上传的硬限制为 25MB - 根据this doc page
      猜你喜欢
      • 2016-08-08
      • 2017-03-30
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      相关资源
      最近更新 更多