我正在使用 Meta Messenger API 以编程方式向 Messenger 发送消息(https://developers.facebook.com/docs/messenger-platform/reference/send-api/ 和 https://developers.facebook。 com/docs/messenger-platform/reference/attachment-upload-api)并且很好。我可以发送带有或不带有附件的消息。
我的问题是针对带有附件的邮件。我能够成功使用 API,但无法设置附件的文件名(如果附件的类型为
file
)。
如何设置附件的文件名,以便收件人(Messenger 用户)可以在消息线程中看到它?现在看来 API 会自动从附件的 URL 中检索它。我使用的是 Azure Blob 存储,文件存储为 GUID,真实文件名存储在
Content-Despotision
文件名字段中。
以下是调用示例供参考。
https://graph.facebook.com/v16.0/{fb.PageId}/messages?recipient={{'id':'{psid}'}}&messaging_type=RESPONSE&message={{'attachment':{{'type':'file','payload':{{'url':'{HttpUtility.UrlEncode(blobClient.Uri.ToString() + token)}','is_reusable':true" + "}}}" + $"&access_token={fb.PageToken}";
根据我的经验,payload url 的最后一部分用作文件名。显然,facebook API 需要文件系统形式的 url(就像 Apache httpd 所做的那样),例如:
https://example.com/files/folder/file.png
。
此处,
file.png
将用作附件名称。如果您的下载 API 的名称不同,例如 .../resourceId/download
,您可以调整路由以接受 .../resourceId/download/{optionalFileName}
并像以前一样处理请求。 Facebook API 将捕获最后一部分并用作文件名。
Spring 控制器中的示例:
@GetMapping(value = {
"/resources/{id}/download",
"/resources/{id}/download/{fileNameForFbApi}"
}, produces = "application/octet-stream")
public ResponseEntity<StreamingResponseBody> downloadFile(
@PathVariable long id,
@PathVariable(required = false) String fileNameForFbApi
) {
// ... process the request using only id
}