如何在WhatsApp API中下载发送给用户的媒体文件?

问题描述 投票:0回答:5

我目前正在为 WhatsApp 编写一个聊天机器人。 我使用 360dialog 平台,这使得可以使用 WhatsApp Business API

当客户端发送消息时,我在应用程序的日志中看到以下 JSON 对象:

{
    "messages": [
        {
            "from": "77773336633",
            "id": "ABGGd3c1cGY_Ago61ytHsZknvtLv",
            "image": {
                "id": "ffd23134-2dae-4fed-b5f8-0ce7867b6ddd",
                "mime_type": "image/jpeg",
                "sha256": "bd02100d961b5a1dbaae1dd645485ebbfeda77b44e82c015f1cf29b05654ccb9"
            },
            "timestamp": "1605703542",
            "type": "image"
        }
    ],
    "contacts": [
        {
            "profile": {
                "name": "Nurzhan Nogerbek"
            },
            "wa_id": "77773336633"
        }
    ]
}

我在文档中找不到有关如何下载此文件的任何信息。 就我而言,我想上传客户端发送到我的文件存储的图像文件。 请告诉我 WhatsApp API 中的哪个 URL 方法负责此机制?

P.S. 同时,我可以向客户发送文件。此信息可在官方文档中找到。

json whatsapp
5个回答
2
投票

这非常棘手,因为邮递员可以工作,但 C# 不适合我,我花了两天时间试图找到解决方案,最后做了以下代码,该代码在 C# 中工作:

using HttpClient _httpClient = new HttpClient();
Uri uri = new Uri(mediaUrl);
var fileName = $"{DateTime.Now.ToString("yyyyMMddhhmmss")}.jpeg";
string filePath = $"Files\\{fileName}";

// NOTE: to save bandwidth, request compressed content
_httpClient.DefaultRequestHeaders.AcceptEncoding.Clear();
_httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
_httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
_httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("br"));

// NOTE: accept all languages
_httpClient.DefaultRequestHeaders.AcceptLanguage.Clear();
_httpClient.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("*"));

// NOTE: accept all media types
_httpClient.DefaultRequestHeaders.Accept.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));

_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("image/jpeg"));

var productValue = new ProductInfoHeaderValue("ScraperBot", "1.0");
var commentValue = new ProductInfoHeaderValue("(+http://www.API.com/ScraperBot.html)");
_httpClient.DefaultRequestHeaders.UserAgent.Add(productValue);
_httpClient.DefaultRequestHeaders.UserAgent.Add(commentValue);

_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", {WhatsApp_Access_Token});
    
HttpResponseMessage response = await _httpClient.GetAsync(uri);
response.EnsureSuccessStatusCode();
var mediaType = response?.Content?.Headers?.ContentType?.MediaType ?? string.Empty;

var imageBytes = await response.Content.ReadAsByteArrayAsync();
using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
    fs.Write(imageBytes, 0, imageBytes.Length);
}

此处,{WhatsApp_Access_Token} 是您的 Whatsapp API 永久令牌。

如果您有任何问题或疑问,请在评论中给我留言。


1
投票

也许会有帮助,试试看吧:-

const URL = `https://lookaside.fbsbx.com/whatsapp_business/attachments/?mid=1104480873777230&ext=1662705250&hash=ATuMx352sLrhKUegbQZSC8oLl3J5Vy3Z49lO4HwTUKWRYQ`;
const FROM = `video`;

const config = {
  method: 'get',
  url: URL, //PASS THE URL HERE, WHICH YOU RECEIVED WITH THE HELP OF MEDIA ID
  headers: {
    'Authorization': `Bearer ${token}`
  },
  responseType: 'arraybuffer'
};
axios(config)
  .then(function (response) {
    const ext = response.headers['content-type'].split("/")[1];
    fs.writeFileSync(`${FROM}.${ext}`, response.data);
  })
  .catch(function (error) {
    console.log(error);
  });

1
投票

我看到了这个帖子,它终于帮助我找到了解决方案。以下是在 Whatsapp 消息中检索媒体 ID 的完整 C# 代码。没有代理的问题是 facebook 会回复一条消息,表示没有代理则不支持浏览器。

string whatsappBaseUrl = "https://graph.facebook.com/v15.0/";
string mediaId = "id you received in message";
string accesstoken =  "Your Whatsapp Access Token";
string agentHeader =  "WhatsApp/2.19.81 A";

_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accesstoken);
string url = $"{whatsappBaseUrl}{mediaId}";

var getMediaUrl = await _httpClient.GetAsync(url);

if (getMediaUrl.IsSuccessStatusCode)
{
    _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(agentHeader);
   
    var response = await _httpClient.GetByteArrayAsync(mediaUrl);
    Stream stream = new MemoryStream(response);
}



0
投票

官方文档在 https://developers.facebook.com/docs/whatsapp/api/media中有一个关于此的会话。

基本上,您必须发出 GET 请求才能下载媒体。

curl --request GET \
  --url https://waba.360dialog.io/v1/media/{media id} \
  --header 'D360-API-KEY: {your api token}'

0
投票

对于整个消息周期(接收请求、下载音频文件并使用 OpenAI 的 Whisper 进行转录),使用 Python:

定义文件检索、保存、转录功能:

def retrieve_text(media_id, audio_name = 'received_audio'):
    url = f"https://graph.facebook.com/v17.0/{media_id}/" # the media id obtained in the webhook
    headers = {'Authorization': f'Bearer {access_token}' } # enter your access token here

    response = requests.get(url, headers=headers) # get the message
    file_url = response.json()['url'] # get the file url
    response = requests.get(file_url, headers=headers) # get the file binary

    open(audio_name+'.ogg', 'wb').write(response.content) # save the received file
    audio_file = open(audio_name+'.ogg', "rb") # open the file
    transcript = openai.Audio.transcribe("whisper-1", audio_file) # transcribe with OpenAI API
    return transcript.text # return the transcription

然后,在您的 Webhook 中收到请求后:

incoming_msg = request.json
#messages = incoming_msg['entry'][0]['changes'][0]['value']['messages'][0]
media_id = message[0]['audio']['id']
retrieve_text(media_id)
© www.soinside.com 2019 - 2024. All rights reserved.