Facebook Bot附件处理:获取文件名/MIME类型及正确下载方法
Facebook公共主页Bot媒体附件获取与下载方案
1. 获取附件文件名与MIME类型的方法
- MIME类型:Webhook推送的原始结构中,
message.attachment.type字段仅返回附件大类(如示例中的image),无法获取精确MIME类型(如image/jpeg、image/png)。精确MIME值需要在请求附件资源时,从响应头的Content-Type字段中读取。 - 文件名:Webhook推送结构默认不携带用户上传的原始文件名,可通过两种方式获取:
- 请求附件资源时,从响应头的
Content-Disposition字段中解析filename对应的参数值 - 若需要获取用户上传时的原始文件名,需先调用Meta消息接口查询附件完整元数据,返回结果中会包含原始文件名字段
- 请求附件资源时,从响应头的
2. fbsbx域名附件正确下载方法(解决文件损坏问题)
直接下载文件损坏的核心原因是:请求CDN资源时未携带合法鉴权参数,被Facebook拦截返回了HTML格式的错误提示页,将错误页内容作为媒体文件存储就会出现损坏无法打开的问题。
按以下步骤操作即可正常下载:
- 拼接鉴权参数:不要直接请求payload中返回的原始URL,需要在URL末尾拼接
access_token参数,参数值为你在Meta开发者平台获取的、对应公共主页的长期有效访问令牌,拼接格式示例:https://lookaside.fbsbx.com/ig_messaging_cdn/?asset_id=xxx&signature=xxx&access_token=你的主页长期访问令牌 - 设置合法请求头:请求时不要使用脚本默认的UA标识(如Python requests默认的
python-requests/x.x.x),需要添加常规浏览器的User-Agent头,示例值:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 - 响应校验:拿到响应后先检查响应头的
Content-Type值,如果返回值为text/html,说明鉴权失败,请检查访问令牌是否有效、是否拥有该消息的读取权限;如果返回值为对应媒体类型(如image/*、video/*),再进行后续存储操作 - 正确存储文件:读取响应的二进制流直接写入本地文件即可,不要对二进制内容做UTF-8等编码转换,避免文件内容被篡改。
注意:payload中返回的fbsbx链接为临时有效链接,有效期通常为2-4小时,收到消息推送后请及时下载,链接过期后需要重新调用接口获取新的资源地址。
内容的提问来源于stack exchange,提问作者W-illian
相关产品推荐
相关产品推荐

